The new pricing page is not as useful as before

Please bring back the prior "make your own quote" webpage.

I've posted this in the ideas portal:

On the Products & Modules tab, under the solution suites, there's a "Show All Modules" button.

Thank you Phil, yes I later noticed that button, I still think it was better organized and usable before, hahaha

I've heard similar feedback as well. I find the solution suits confusing (as an engineer I want to know what modules I'm getting, and the "solution suites" are an unuseful obfuscation layer to me), although I haven't looked at the new site yet..

Edit:
I've just had a better look at the new site, and it's really just the solution suites I don't like. I think the new "all modules" UI is better than before

I definitely don't like the solution suites, also the whole pricing thing is pretty useless to me due to USD... All I need is the module lists and a nice way to copy the selected BOM out of the site, which doesn't exist.

I used the chrome dev tools AI to produce a BOM - definitely should be available as a function though...

Run this on the Review Your Estimate page:

function generateBOM() {
    const categories = Array.from(document.querySelectorAll('.product-category'));
    const data = categories.map(cat => {
        const categoryName = cat.querySelector('.product-category-title')?.innerText.trim() || "Unknown Category";
        const items = Array.from(cat.querySelectorAll('.selected-product-info, .module-item, .product-item, .selection-row'))
            .map(item => {
                const name = item.querySelector('h3, .name, .title')?.innerText.trim() || item.innerText.split('\n')[0].trim();
                const description = item.querySelector('p, .description')?.innerText.trim() || "";
                const price = item.querySelector('.price, .cost')?.innerText.trim() || "";
                return { name, description, price };
            })
            .filter(item => item.name);
        return { categoryName, items };
    });

    let csv = "Category\tProduct/Module\tDescription\tPrice\n";
    data.forEach(cat => {
        cat.items.forEach(item => {
            csv += [
                `"${cat.categoryName.replace(/"/g, '""')}"`,
                `"${item.name.replace(/"/g, '""')}"`,
                `"${item.description.replace(/"/g, '""')}"`,
                `"${item.price.replace(/"/g, '""')}"`
            ].join("\t") + "\n";
        });
    });
    return csv;
}

function copyToClipboard(text) {
    const ta = document.createElement('textarea');
    ta.value = text;
    ta.style.cssText = 'position:fixed;top:0;left:0;opacity:0';
    document.body.appendChild(ta);
    ta.focus();
    ta.select();
    try {
        const ok = document.execCommand('copy');
        document.body.removeChild(ta);
        return ok ? "Copied" : "execCommand returned false";
    } catch (err) {
        document.body.removeChild(ta);
        return "Failed: " + err;
    }
}

copyToClipboard(generateBOM());

PS: Does this count as JS hacking? Should I be putting it in the JS Hacking topic?? :face_with_hand_over_mouth:

Chrome Extension:
ignition-pricing-bom-extension.zip (6.5 KB)

  1. Unzip
  2. Launch Chrome Extensions (chrome://extensions) in a Chrome browser
  3. Enable Developer Mode (top right)
  4. Click Load unpacked and select the unzipped folder

To use:

  1. Get to the Ignition Software Pricing & Editions | SCADA & IIoT page
  2. Click on the extension and click the button
  3. Have a laugh :face_with_hand_over_mouth:

So now you have to buy Historian as a suite (Core & SQL Historian), and they are not available individually as modules, good to know.

I like the new pricing page, but I wish cards were a bit smaller; It can barely fit one row of them at a time, and I have to do a lot of scrolling back & forth.

Yes, it needs a lot of scrolling, and there is a lot of space wasted.
I still think the previous version was so much better

IMO it seems like it's a push to:

  1. Raise low-end system pricing, while keeping high-end systems priced the about same.
  2. Start sidelining "legacy" modules (SFC, OPC COM, etc.)

I don't really mind it, though there should really be a Solution Suite that includes Vision.

What's "Vision"? :face_with_hand_over_mouth:

I think you mean:
Vision: (this was my first car model, a 1992 Holden Barina. I stalled it trying to start from stop on a hill intersection as it has a 10*kW (13 horses for the USians) engine :roll_eyes:. However, I could also push start it on my own, so I guess it wasn't all bad. It also had no power steering, so great for a shoulder workout)
*definitely not made up...


For reference, this is its engine:

Perspective:

So this is your current ride Nick? Bit of an upgrade... :rofl::+1: And I thought all Aussie blokes drive utes?

Not quite! I haven't won the lottery just yet.. I have smallish-mid sized 2015 SUV with roof racks and a trailer which serve the purpose (and more) of a ute, it's just a bit less manly.. :face_with_hand_over_mouth: Still a manual [transmission] (stick?) though, which is the most important thing!

I used to drive a lime green Lotus Elise when I played Need for Speed on my old Playstation 2 many years ago, hence the Elise above :rofl:

Uggh ~ I fell for the rage bait this time

False ~ More or less everything in Vision is easily accessible and endlessly modifiable, so you can easily make "the car" look and drive how ever you want, and you don't need claude level hacks to do it ~ lol

Except when you want to make "forms" collapse items that aren't visible, or you want to add a dict/list custom prop, or transform a binding, or style things nicely with a simple styling language, or... :face_with_tongue:

When I first started on perspective, I did miss the relatively easy extensible control of components though.. But with all of the other benefits that perspective provides, I struggle going back to Vision these days!

system.vision.transform

Simply store as a custom string property with system.util.jsonEncode and retrieve it with system.util.jsonDecode

In Vision, all custom properties trigger a property change event, so the pretransform property is simply stored in a custom prop, transformed on value change, and subsequently applied to whatever prop is destined to receive the value. True; it's not as convenient, but it's simple to implement, and it works the same way. :face_with_tongue:

Haha. Definitely ways to do things, I couldn't imagine using transform though to collapse form items though :face_with_crossed_out_eyes:
Styling is definitely severely hamstrung; colours can only be defined in rgb for one. If that's not a reason not to use it, then I don't know what is! :grin:

Sorry, but that's just not true

...and in scripting, it's as simple as:

Color.decode('hexValue')

Hex is still RGB, only more cryptic than decimal. HSL isn't supported natively. The UI shows it, but the value itself is stored in rgb