Version (Build)
12 (SW10055-12)

RELEASE NOTES FOR HIGHSTAGE VERSION 12

 


❗️ Critical Compatibility Information

This release contains several changes that are not backward compatible.

It is critical that you review the "Mandatory Changes and Customizations" section before upgrading. Necessary updates must be made to your Highstage installation to ensure a successful upgrade.

Please reach out if you have questions or need assistance with upgrading. You can find our contact details by visiting Contact - Highstage.

 

Introduction

Welcome to the release notes for Highstage Version 12 (Build SW10055-12)!

In this release, we’re excited to introduce fully redesigned solutions for Folder View and Export—along with many other improvements. Our goal is to provide functionality that is intuitive, flexible, and efficient, and we believe this release marks a significant step forward.

Visit our Highlights chapter if you just need a quick TLDR of the biggest changes that we are introducing. Are you going to upgrade, then please visit our chapter on mandatory changes beforehand for a seamless upgrade. We've also introduced great new technical experts to our team. They have valuable insights to share, and you can read more in Simon's personal "tech to tech" letter. If you just need the full overview, you can visit the change note chapter for a complete release overview.

⭐️ Thank you for being part of the journey!

 

Highlights

What’s in it for me? This release focuses primarily on enhancing the existing Highstage experience—making it easier to use, configure, and adapt to your needs.

 

Mandatory Changes & Customizations

This release includes several changes that are not backward compatible. As a result, upgrading to this version will alter the appearance and functionality of Highstage, and may lead to errors if required updates to settings, configurations, or customizations are not applied beforehand.

 

Export [ECO:23796]

The Export feature has been completely redesigned—this includes its appearance, functionality, and configuration options. As a result, existing export configurations are no longer supported and must be recreated using the new Export Profile configurations.

Resources: For detailed guidance on use, administration, and configuration, please refer to our Docs portal, where all necessary resources are available.

 

Managing versioning and folder structure on subtypes [ECO:22975]

Overview

We have moved some settings from .XML, which are now handled directly in Highstage on subtypes from the UI. Specifically, it is now possible for all subtypes to do the following:

This is an important step toward easier maintenance of Highstage, allowing settings to be managed directly from the interface instead of through complex code configurations: image-20250519114449285

 

Detailed summary of changes

 

Automated conversion when upgrading (Important)

To ensure that your Highstage installation retains the settings and configurations it had prior to the update - we will automatically execute a script that sets Revisions and StaticPath on each subtype, to match the configured XML settings in your Highstage installation that we are now making obsolete.

When you upgrade Highstage and execute the setup.aspx, we will execute ts/schema/update_subtypes_revision.aspx. If you've set revisions, majorrevisions, or staticpath in XML on any base- or subtype, these settings will now be copied to the subtype in the database, since the database controls them from now on.

If we find no XML configuration on a type, we simply apply the default setting on the subtype that is associated with its bastype. Default settings are:

Evidence and Verification

To give you a full overview of your settings and the changes we've made, we've generated a report for you. It includes a summary of your XML and database settings and explains the changes based on them: image-20250522111244166

 

What's next?

To make sure Highstage is set up correctly, please check all subtypes carefully and confirm that the Revisions and Staticpath settings are the way you want them before continuing work in the system.

Tip: You can find a list of all subtypes (as an administrator) by navigating to SYSTEM > Subtypes.

 

Unique Mail Identifiers [ECO:21587]

As Highstage continues to grow, so does our customer base. We've noticed that some Highstage installations are emailing each other, which can cause confusion when they share the same unique ID numbers. To address this, we're adding new configuration options to prevent emails from being incorrectly linked between installations.

Thus, after the update, your email subject tokens will change from something like [action:12345] to [COMPANY/action/12345] (if you’ve updated your email settings). This change makes sure emails are linked to the right objects when working across different Highstage environments.

Highstage docs: Details about mail subject tokens, available parameters, and general ingoing email setup can be found in our official Highstage docs.

 

 

New Export Feature – Design Decisions and Thoughts (a technical letter to our technical customers)

"For tech by tech" - Simon

We rarely talk technician to technician which I would like to change. The following is a dive into my thoughts and decisions during the design and implementation of the new export feature (BOM export).

I entered the company about a year ago and after a few smaller tasks, the export feature was on my table, the feature had several technical problems, and it was too slow. After three months of digging, it was clear that we had to rewrite. Some time later Oluf joined and was tasked with providing a frontend for the new export feature.

Over the cause of the development, I've had many talks with Oluf and the rest of the highstagers. The export feature released in V12 is a new implementation that contains none of the original export feature's code.

 

📝 Dynamic report generators

Export reports is an area where everyone wants their own implementation, so we've come up with a solution for that. By having an ASPX implement a C# interface we are able to hand over the reins to you as a customer, you can have any file as a export report if you can put the files content into a C# stream, the interface offers all data from the export for you to consume when you write the report content.

We ship four standard report formats:

As well as two ASPX showcases: ConsolidatedSupplierReport.aspx, excel file that consolidates on suppliers, so instead of listing child suppliers they are listed as columns after the parent’s own columns, as well as aggregate the quantities, for example a box created from six plates, where each plate requires four screws will aggregate to 24 screws in total. HighstageHelloWorld.aspx, a boilerplate report that just produces a txt file containing the root key.

I will suggest that if you want to make your own report, copy the HighstageHelloWorld.aspx and rename it, and replace its method content with your own implementation. The ConsolidatedSupplierReport.aspx gives you a teaser to what you could do. This is our most experimental feature, I hope you like it and I really want to hear your thoughts.

I imagine I will be doing a workshop or presentation on how to produce dynamic reports at next HUG (Highstage User Group) meetup.

 

🧱 Separation

The export feature is separated into several modules:

Each is where applicable built to be a self-contained module for reuse, which sets us up for faster development and maintenance in the future.

 

💬 Customer-Centric Error Messages

Highstage uses the "yellow screen of death" for any error from which the application cannot recover, and error messages are either system exceptions or hardcoded exception messages. Its not conductive for the operator understanding how to continue and is hard to change the message itself.

We have made a new module that separates out the error messages from the code, as well as transform the errors to JSON for the APIs (see below) and dump a note in the system log. We do not currently use this module outside of the new export, but we will in the future. It’s my hope that better error messages will help identify issues faster and will help the operator forward.

This approach also prepares us for more languages and to have different error messages for different users, e.g. a more techy error message for a superuser vs a more operation focused error message for a user. Also, it’s a blast to tell the business to write error messages 😄

 

🛡 Error-Aggressive

We leaned into an error-aggressive approach. Instead of silently failing or tolerating half-successful operations, we raise clear, hard errors when things go wrong. I believe this is useful as I can assume more about the state of the data structure by failing early. It will also give better error messages, speed up debugging and fewer strange secondary errors. The only deviation from the error-aggressive approach is that we silently skip columns with the column-attribute set to the empty string, I feel this is an error, but the rest of Highstage accepts this and it should be handled in an input sanitation step during config reset that we do not currently have. (Input sanitation is on my wish list)

 

🌐 Three New APIs

To deliver data to the frontend, we've introduced three APIs. They all respond in JSON, including when an error is encountered. The frontend handles all presentation of results or error. You are welcome and encouraged to use these APIs for your own purposes. I expect us to produce more APIs in the future.

The APIs are implemented as ASPXs which is not how we are going to implement APIs in the future, it was a trade-off made between what we currently have in the tech stack and us wanting to new things. I imagine that these APIs and future APIs will be implemented as web-sockets to make them tamper proof.

All APIs uphold read permissions and will not return information that the user is not allowed to see. There are no write operations, outside of writing the export zip file to the root object.

If you would like to try them out call them directly and they will respond with error messages on what input, you need to provide.


Created to support the export preview page, where the operator can choose options for the export before export execution.

If called directly it will respond with a JSON containing the data specified in the config that the user has permission to see.

URL parameterssample values
profile_namedefault
root_typedoc
root_obj_keyGD10083-1A

URL parameters required: root_type, string representing the basetype that owns the export configuration(s), for example "doc" or "part" root_object_key, string representing the root object for the export, for example "GD10083-1A"

Responds in JSON and gives a list of all available export profiles for that user. malformed export profiles will be silently skipped, to ensure that a single malformed export profile does not block all other export profiles only export profiles that the user has permission to use will be shown.

In addition to permissions check for the export itself, there is also a check for the reading permission of the root object, to prevent the API to be a security loophole, if there is no read privilege to the object an empty list will be returned.


The packer API accepts both GET and POST. Calling this API will write an export (BOM) zip file to the root objects folder.

POST input payload sample:


GET URL parameterssample values
profile_namedefault
root_typedoc
root_obj_keyGD10083-1A
archive_folder_structureflat
hash (optional)-652870161
destinationroot
node_blacklist (optional)2;3.1
file_blacklist (optional)ROOT¤archieve.zip;3.2¤GD10097-1A.txt
  

Alternative use of this API: If the operator put all files on the blacklist and includes the HighstageJson report in the config, the zip file will contain JSON file that is a full dump of the tree structure included the column data selected in the config.


 

🧑‍💻 A Modern Frontend

Oluf wrote the frontend in TypeScript instead of using ASPX. While this is not the technology we want for the frontend in the future it was an experiment into a more modern technology stack. This decision lets us leverage modern tooling, reusability, improve code clarity, and makes it easier to catch bugs early.

 

🧭 Conclusion

We've been able to speed up the export to the point where the calculation is almost exclusively read permission calculation and packing the zip archive file, while we cannot do more about the packing speed. The read permission calculation we can do a lot about but is outside the scope of this feature and we have had to get to a release.

As of writing this I am working on a prototype for faster read permission calculation, which look promising and will likely go into V13 as a full feature.

The benchmarks I have made on production data for producing the zip file gives us a x50-x60 performance increase.

I'm happy about our results, we have and will continue to focus on simplicity in usability and XML configuration, scalability, code separation and readability.

As always, your feedback is welcome. If you have questions, ideas, or concerns, don't hesitate to reach out. And if you want to take a closer look or test the feature ahead of release, let us know — we'd love your input. Hope to see you at next HUG.

Best regards, Simon Svane - "back office" developer simon.svane@highstage.dk

 

 

Change Notes

Below is the list of change order requests that have been addressed and resolved as part of this release.

indexIDDescriptionType
122975Ability to not use revisions on other basetypes then part and devicesECO
223558Data Import: Partial matchingECO
323795Consolidation of CoulmnFilterParser classes, methods and attributesECO
423886Precompile aspx on initialization for better experienceECO
523887Remove unnecesary casting on the reference tableECO
624011_delete="1" not workingECO
724063Foreign type causes error on search (Collection was modified after the enumerator was instantiated)ECO
825255Posibile fix for 'deadlock'/CPU 100% usage spikesECO
925318Windows policy to reduce/eliminate MS Office upload failed issueECO
1025366Size limitation in TS.Sql.ExecuteDataRow/Table methodsECO
1117027New Folder ViewECO
1220432Improve standard email notification templateECO
1320707Eventlog displays wrong entriesECO
1420855Wordcompare: wordcompare fails in chrome/edge when including comma (,) in the filenameECO
1520871RefineryECO
1621042Update Aspose ComponentsECO
1721043Cache issue Undo ChangeECO
1821061Pos/Posa/posi increase column size and change how pos its split between posi and posaECO
1921067Error when approving partsECO
2021160Structure compare: reports matching results on compared items with different references (different revisions)ECO
2121542Various UI Improvements for v.12ECO
2221587Mail: Introduce unique customer ID prefix for incoming mail communicationECO
2321737File content search offsets incorectly the search grid headersECO
2421877New delegate OnAfterReview, support for custom propagate changeECO
2522081Enforce field security in supporting toolsECO
2622172Reference section does not resolve correctly when the current form includes a different formECO
2722265Sections showcount shows wrong countECO
2822394Reference import: ensure the imported values are valid for the corresponding column and provide feedback to the user if the caseECO
2922421Matching rules for mail triggers related to included/excluded basetypes, should be more explicitECO
3023796Export (Remastered)ECO
3121559XML Inspector and highlight SQL and other XML'sECO
3221593Improved Gridexport (Packandgo)ECO