March 2026 (version 2.26.03.24)

reviewed: 24 March 2026

🚀 New Features

Password Protected Excel Support

Developers can now save and open Excel documents that are password protected:

// Open a password protected Excel document
set('doc', excel.openDoc([excel], [filepath], "SuperSecret123"))

// Save a document with a password
excel.saveAs([doc], [filepath], "TopSecret456")

This enables the systems to read and write password protected Excel files, allowing seamless consumption and generation of secured spreadsheets.


XML and JSON Casting

New XML functions allow seamless conversion between XML and JSON formats:

// Convert XML to JSON
set('json', xml.xml2json([xml]))

// Convert JSON to XML
set('xml', xml.json2xml([json]))

These functions enable the system to consume XML data as JSON and generate XML from JSON, simplifying integrations with systems that require either format.

JSON to XML Conversion Rules:

  • The root must be a JSON object (arrays or primitives are not allowed).
  • Each property represents an XML element.
  • Nested objects become nested XML elements.
  • Arrays become repeated XML elements with the same name.
  • Properties starting with @ become XML attributes.
  • #text properties become the element's inner text.
  • #cdata-section properties become inner CDATA sections.
  • Property names must be valid XML element names.

Example:

JSON Input:

{
  "books": {
    "book": [
      {
        "@id": "123",
        "name": { "#text": "Web Development Essentials" },
        "Author": "John Smith",
        "summary": { "#cdata-section": "Building web applications with modern tools." }
      }
    ]
  }
}

XML Output:

<books>
  <book id="123">
    <name>Web Development Essentials</name>
    <Author>John Smith</Author>
    <summary><![CDATA[Building web applications with modern tools.]]></summary>
  </book>
</books>

Chaining for XML to Property Bag (PB)

While native XML to PB support is not yet implemented, developers can chain these new functions to convert XML to a PB via JSON as a workaround:

// Convert XML to PB
set('pb', json.json2pb(xml.xml2json([xml])))

// Convert PB to XML
set('xml', xml.json2xml(json.pb2json([pb])))

CSV Enhancements

  • Set the character used to quote fields in CSV files:
set('csv', csv.open([path]))
csv.setQuote([csv], '"')
  • Resolved CSV error when rows exceed the number of defined headers.

Large Email Out Profile Passwords

The password field for email out profiles has been increased from 100 characters to NVARCHAR(MAX), allowing storage of larger passwords and future proofing. Running DDL on the Business Object is optional but recommended.


🔧 Updates

Document View URL Improvements

  • Filenames now appear consistently in document view URLs.
  • Correctly handles cases where the filename is null.
  • Fixed issues when passing a document by primary key (PK).

Tooltip Handling

  • Tooltips with no resolved label are now automatically excluded.
  • Fixed regression where disabled links did not display tooltips.

Runtime Version Formatting

  • Corrected runtime version display following the recent tooling update.
  • app.runtimeVersion() now also includes the Git commit hash for the version.
<
    version: "2.26.03.24+1349",
    major: 2,
    year: 2026,
    month: 3,
    day: 24,
    build: "1349",
    commit: "7d37089201a1e24ebf74e7ec100bda625b9e2943",
    when: #2026-03-24T13:49:00#
>

🐞 Fixes

Spreadsheet Handler

  • Fixed a null reference exception when disposing a spreadsheet that failed to open.

User Login

  • Fix for userAccessByIP not setting automatics before insert. Preventing maxLoginAttemptsBeforeWait from being used.