v1.7.18
Added 1
- New GRIST_ACTIVEDOC_TIMEOUT_SECONDS environment variable sets how long a document stays open after the last client disconnects
Changed 7
- Lookups and summary tables now use 30% less memory in the Python data engine
- Access rule memos now show only when relevant to the block being accessed, marked with a lock or lightbulb, and follow the same precedence as permissions
- Markdown cells cut off by max row height now show an ellipsis over a fade in the bottom right corner
- Custom widgets can now declare required columns in their manifest, not only in grist.ready(), and mapColumnNames() returns the record without the unmapped field instead of null
- Admin Panel Authentication and Sandboxing sections now present each option as a card with recommendations in the setup wizard
- Server edition (community or full) is now recorded in the home database as GRIST_SERVER_EDITION instead of in config.json, with one-time migration for existing installations
- jQuery updated to 3.7.1 and jQuery-UI moved from unmaintained components-jqueryui package to jquery-ui 1.14.2
Fixed 11
- A browser tab whose network dropped after laptop sleep now reopens the document instead of showing Error
- Documents with multi-line f-string formulas became unusable on Python 3.12 and later, reporting KeyError or missing attribute errors
- Renaming a table or column could break formulas depending on it, failing with AssertionError or leaving them silently not recalculating
- Grist could not open documents on Windows with the pyodide sandbox when Python packages failed to install
- Importing a file on Windows failed with a sandbox permission error on the temporary file under some path conditions
- Downloading a document at an old schema version failed with a SQLite error
- Renaming an attachment failed in any document with access rules
- A dialog appeared before taking keyboard focus, causing key presses to go to the previously focused element
- Hiding fields on a card widget threw JavaScript errors for some column types such as Choice List
- Detaching a summary table grouped by a RefList column produced TypeError cells
- Clearing sessions never worked on installs using Redis, leaving old logins in place after authentication changes
Security 1
- shell-quote updated to 1.10.0 to fix a denial of service vulnerability in parse (GHSA-395f-4hp3-45gv)
From Grist
What's Changed
Improvements
- Performance
- Lookups and summary tables now cost the Python data engine far less memory. Measured at 30% less on a large document (commit)
- Access rules
- A memo now shows only when it bears on the block you hit, either as the reason for it or as a remedy that would grant access, and is marked with a lock or a lightbulb accordingly. Memos follow the same precedence as permissions. Access itself is unchanged, only the explanation (#2479)
- UI/UX
- A Markdown cell cut off by a max row height now shows an ellipsis over a fade in its bottom right corner, as other cell types already did (#2502)
- Custom widgets
- A widget can declare the columns it needs in its manifest, not only in
grist.ready(). Whatgrist.ready()sends still wins when both are set.mapColumnNames()now returns the record without the unmapped field rather thannull, and thecolumnsoption is gone frommapColumnNames()andmapColumnNamesBack(). See the plugin API reference (commit)
- A widget can declare the columns it needs in its manifest, not only in
- Admin Panel
- The Authentication and Sandboxing sections now present each option as a card. In the setup wizard they lead with a recommendation and the Continue button stays disabled until you pick one; in the Admin Panel they show what the server is currently using and pre-select nothing. The OIDC and SAML cards are marked "Requires activation key", and clicking one opens a request for that key. Sandboxing keeps the option you picked, including "No sandboxing", and switching to "No auth" always asks for confirmation (commit)
- The edition (community or full) is now recorded in the home database rather than in
config.json, under the nameGRIST_SERVER_EDITION, with a one-time migration for existing installations.GRIST_FORCE_ENABLE_ENTERPRISEstill takes precedence (commit)
- Internal / infrastructure
- New
GRIST_ACTIVEDOC_TIMEOUT_SECONDSsets how long a document stays open after the last client disconnects. Contributed by @fflorent (#2505) - jQuery moves to 3.7.1, and jQuery-UI from the unmaintained
components-jqueryuipackage tojquery-ui1.14.2, so dependabot can keep it updated. Contributed by @fflorent (#2476) - Dependency bumps:
shell-quote1.10.0 (fixes a denial of service inparse, GHSA-395f-4hp3-45gv) (#2525),axios1.18.0 (#2472),undici6.28.0 (#2510),dompurify3.4.13 (#2516),engine.io6.6.7 (#2475),typeorm0.3.31 (#2484),morgan1.11.0 (#2460),js-yaml4.3.1 (#2519),tar7.5.21 (#2491),postcss8.5.25 (#2500),fast-uri3.1.5 (#2511),linkify-it5.0.2 (#2488),svgo3.3.4 (#2485),webpack-dev-server5.2.6 (#2486),websocket-driver0.7.5 (#2469)
- New
- Documentation
- The reference for
NOW()andTODAY()now explains when Grist recalculates them. See Function reference (commit)
- The reference for
Fixes
- A browser tab whose network dropped, such as after a laptop wakes from sleep, showed "Error" and asked for a reload. It now reopens the document. Reconnect attempts also back off against a server that accepts connections and immediately drops them (#2501)
- Documents containing a multi-line f-string formula became unusable on Python 3.12 and later, reporting
KeyErroror "'DocModel' object has no attribute 'tables'" for every action. That has affected the pyodide sandbox since v1.7.13, and source installs with a recent python3 (#2518) - Renaming a table or column could break the formulas that depend on it, either failing them with an AssertionError or leaving them silently no longer recalculating. Affects formulas returning a record or list of records into a column of type Any (#2540)
- Under some path conditions, Grist could not open a document on Windows with the pyodide sandbox, because none of the sandbox's Python packages installed. The failure is now reported where it happens, rather than later as a missing import (#2517)
- Under some path conditions, importing a file on Windows failed with a sandbox permission error on the temporary file (#2527)
- Downloading a document still at an old schema version failed with a SQLite error (#2541)
- Renaming an attachment failed in any document with access rules (#2514)
- A dialog appeared a moment before it took the keyboard focus, so a key pressed in between went to whatever was focused beforehand. Closing a dialog opened from another dialog now hands the focus straight back to the first one (#2522)
- Hiding fields on a card widget could throw JavaScript errors, for some column types such as Choice List (#2503)
- Detaching a summary table grouped by a RefList column produced TypeError cells throughout (commit)
- On a fresh install, applying getgrist.com authentication signed the admin out even when their only session came from the boot key (commit)
- Clearing sessions never worked on installs using Redis, so an authentication change left old logins in place (commit)
Update on OIDC/SAML support
As of this release, Grist Labs will no longer be officially supporting SSO via OIDC/SAML outside of the full edition of Grist. If you're already running OIDC or SAML on a self-hosted Grist installation configured before this change, it should continue to work. If you're relying on OIDC/SAML in production, absolutely reach out to us, we want full Grist to work for your organization.
Full Grist edition extensions
- MCP
- New
get_custom_widget_settingsandset_custom_widget_settingstools read and write a widget's access level and column mapping, andget_custom_widget_options/set_custom_widget_optionsread and write the widget's own options, merging on write so one key can change without dropping the rest. Tool inputs validate a mapped column's type the same way the creator panel does,doc_iderrors are more specific, andgrist_create_tabletakesskip_pageand reports the page it creates. The assistant's tool call limit went from 10 to 20 (commit)
- New
- OAuth apps
- Popup-based OAuth flows work again. The Cross-Origin-Opener-Policy header is still set on login pages, so a popup flow started by a signed-out user stumbles once there and succeeds on retry (commit)
- Grist Fleet
- A fleet comes up without a worker id or internal URL set on every server. Each server works out the URL its peers should reach it on from the network address it actually listens on, and takes its worker id from that.
GRIST_DOC_WORKER_ID,APP_DOC_INTERNAL_URL, andGRIST_ROUTER_URLstill override;APP_DOC_URLtogether withGRIST_FLEETis now refused at startup, and a server with no URL its peers can reach says so (commit)
- A fleet comes up without a worker id or internal URL set on every server. Each server works out the URL its peers should reach it on from the network address it actually listens on, and takes its worker id from that.
- Automations
- Trigger options no longer appear in Document Settings for documents that do not support them (commit)
Contributions
- Grist Labs: @berhalak, @dsagal, @georgegevoian, @paulfitz
- @fflorent: a
GRIST_ACTIVEDOC_TIMEOUT_SECONDSsetting for how long documents stay open (#2505), jQuery and jQuery-UI upgrade (#2476)
Translations
- Arif Budiman
- Grégoire Cutzach
- Kévin DUPOND
- Martin Gerken
- Vri
- Петр Артюхов
Full Changelog: https://github.com/gristlabs/grist-core/compare/v1.7.17...v1.7.18
Join our Discord Community if you'd like to get into development of Grist.