Skip to main content
Version: 7.0

What's new in version 7.0

This article describes how version 7.0 differs from versions 6.x: which capabilities it adds and what has to be taken into account when moving to it. Version 7.0 has not been released yet: the article describes the current state of the master branch and is extended along with it.

The full list of issues included in a release is in the changelog CHANGELOG.md, which is generated when the release is made, in the branch of its version. Changes that can break an application after an upgrade, together with the ways to restore the previous behavior, are described in MIGRATION.md.

Moving to version 7.0​

  • The client and the server are upgraded together: the API version has changed, and a client of version 6.x does not connect to a server of version 7.0.
  • The external API is disabled by default: the working parameter enableAPI is now 0 (it used to be 1), so /exec, /eval and HTTP calls of actions are refused until the API is enabled globally or for the roles that need it. A user with access to the System.interpreter form keeps access to the API. Which other calls are allowed and how to restore the previous behavior is described in MIGRATION.md.
  • Incorrect logic no longer goes unnoticed: an application that used to start may fail to start or fail at run time if another session or a user interaction runs inside a transaction (#1726), a property depends on itself, a top-level navigator folder has no WINDOW, or the CUSTOM of a window or a container is inconsistent. The error messages and the ways back for each case are given in MIGRATION.md.
  • Query results and plans may change: order-dependent aggregations and the order of independent global events have become deterministic, and the planner uses indexes more often (see Query planning and performance and MIGRATION.md).
  • Removed are the JKanban, FrappeGantt, Chart and Carousel bundled modules (#1739), the design properties showGroup, changeKeyPriority and changeMousePriority, and the working parameters that had no effect or had not changed for years (#1809–#1812, #1820).
  • Deprecated are USERFILTERS (FILTERS ... USER is used instead), NEWTHREAD ... CONNECTION and the DOCKED keyword when opening a form (WINDOW is used instead).
  • Custom Java code (INTERNAL actions, Spring beans) may need changes because of library upgrades: jdom 1 is replaced with jdom2 (the org.jdom package became org.jdom2), log4j 1.2 with reload4j, and Apache POI is upgraded from 4.1 to 5.5.

Language​

  • Action return values. The RETURN operator can return the value of an expression, TO writes the result of a call to a property, and actions can be used in expressions (#1561). HTTP actions pass the returned value in the response (#1562).
  • Dates and times. Arithmetic operators are defined for dates and times (#1570), and a loop can iterate over numeric ranges and date and time intervals (#1571). Iteration operators respect explicitly specified parameter classes (#1489).
  • Threads and executors. NEWTHREAD ... TO writes the result of a thread to a property, NEWEXECUTOR CLIENT executes actions on the client, including with a delay (DELAY) and periodically (PERIOD) (#1626, #1627), and waiting with NEWEXECUTOR ... WAIT can be limited in time.
  • The XML type. The XML built-in class is added; XML namespaces are determined by the EXTID of the form (#1584, #1585, #1591). JSON, JSONTEXT and XML values are displayed formatted.
  • New operators. Capture (SCREENSHOT) captures the current state of the user interface as an image or HTML markup (#1629), the selection operators (SELECT) report which rows and columns of an object group the user has selected, and INPUT MULTI lets the user choose several files (#1608).
  • Time formulas return a whole number of seconds of class LONG (#1785), currentYear() returns a value of class YEAR.

Forms​

  • Form extension, inheritance and composition (#1559) are described in the Form extension article.
  • Filters and sortings. FILTER(S) and ORDER(S) use one USER | FIXED notation (#1594). The ORDER, FILTER and FILTERGROUP operators change the sortings and filters of a form from an action, on the server (#1856, #1857). The ORDERS and FILTERS handlers fire only on a change made by the user (#1871).
  • Windows for forms. Windows of the FORMS kind and the AUTOSIZE window option are added (WINDOW); a form can be opened in a named window, and SHOW ... ACTIVATE activates a form that is already open instead of opening another one. ACTIVATE FORM and CLOSE FORM address open forms (#1842–#1844).
  • Opening and editing. SHOW and DIALOG accept an init action (#1588). The APPLY property option saves the changes right after editing (#1647). An action with an explicit SHOWIF is not hidden because it is implicitly inapplicable in the current state of the form, for example when the current object is NULL (#1613).
  • User form customizations. A broken customization no longer prevents the form from opening, and the administrator sees and resets the customizations of other users (#1765, #1766).
  • Export to Excel includes the FOOTER row (#1593).

Custom views and the client​

  • React views. React draws object groups, containers (DESIGN ... custom), the forms window and the log window (#1679, #1742, #1743). .jsx modules work without a separate build step and are processed by the React Compiler without Node (#1708, #1709); a full build is also available for src/main/web (#1678). Custom views support trees, sortings and user filters (#1672, #1859, #1860), and the Buckets primitive simplifies building pivot views (#1703). See How-to: Custom React form views.
  • Custom view controller. exec, eval, evalAction and change are available from JavaScript in custom views and in INTERNAL CLIENT (#1648); the CUSTOMS form block exposes properties and actions of the form to the controller (#1650, #1692). See How-to: Custom view controller API.
  • Tables. Rows and columns of a table can be selected, the selection copied, everything selected with Ctrl+A, and one value pasted into all selected columns (#1597). The sum and the count on the toolbar are calculated over the marked rows (#1712); the TOOLBARBOX container stays last in the BOX of the form, so the components a design adds are placed above the toolbar (#1764).
  • Modal dialogs. Esc closes only the topmost dialog, and the focus does not leave it (#1788–#1790).
  • Web agent. Through a local agent, the web client prints to the printers of the user's computer and writes files to it.
  • The desktop client shows HTML captions of forms and navigator elements (#1190) and runs on Java 24 and newer (#1815).

Server, integration and AI​

  • MCP server. An application can act as an MCP server (#1620) with a built-in OAuth 2.1 authorization server (#1621), through which AI clients access it. The File API lets external systems browse the server resources (#1639).
  • Horizontal database scaling with a master server and replica servers (#1458, #1518).
  • Checking logic without a database. The dryRun parameter checks the logic and finds cyclic property dependencies without connecting to the database (#1737, #1757). The check can report several errors at once (#1797, #1798), and logics.topModule accepts a list of modules (#1740).
  • Working parameters. Any working parameter can be set in .properties files, environment variables or with -Dsettings.* (#1814); all parameters are now described.
  • Other. INTERNAL actions are compiled from .java sources located in the resources (#1707). An exchange can be specified for RabbitMQ (#1768). IMPORT XML does not process external entities (#1728).

Query planning and performance​

  • Determinism. Order-dependent aggregations and row picks always give the same result (#1700). Global events with no dependency between them run in an order that follows from the logic and does not change from start to start (#1835).
  • Indexes. The planner uses indexes for ordered aggregations over columns that allow NULL (#1727) and when the session has unsaved changes (#1767), and takes into account an interval on any index field, not only on the first one (#1761). Pushing conditions down into aggregations has been reworked (#1699).
  • Resources. Inside a transaction, temporary tables are emptied with DELETE (#1792). Startup memory no longer grows with the number of dependency cycles (#1831), and parsing of modules and server startup are faster.