pgkiln 0.44.0 → 0.46.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (91) hide show
  1. package/db/migrations/102_app_computations.sql +345 -0
  2. package/db/migrations/103_shortcuts.sql +341 -0
  3. package/db/migrations/104_report_queries.sql +413 -0
  4. package/db/migrations/105_component_settings_groups.sql +367 -0
  5. package/db/migrations/106_form_designer.sql +102 -0
  6. package/db/migrations/107_app_version.sql +9 -0
  7. package/docs/apex-feature-parity.md +15 -12
  8. package/docs/guide/02-concepts.md +24 -0
  9. package/docs/guide/03-builder.md +69 -13
  10. package/docs/guide/04-pages-and-regions.md +84 -3
  11. package/docs/guide/05-items.md +14 -2
  12. package/docs/guide/06-processing.md +22 -0
  13. package/docs/guide/09-reference.md +14 -1
  14. package/docs/guide/11-from-apex.md +2 -1
  15. package/docs/guide/12-development.md +8 -2
  16. package/docs/guide/16-files.md +23 -0
  17. package/docs/guide/18-cli.md +4 -0
  18. package/examples/hr/hr_61_form_designer.sql +80 -0
  19. package/package.json +1 -1
  20. package/public/app.css +79 -2
  21. package/public/app.js +307 -35
  22. package/public/builder.css +21 -1
  23. package/public/builder.js +67 -0
  24. package/public/sw.js +2 -1
  25. package/src/app.ts +9 -1
  26. package/src/appfiles.ts +18 -2
  27. package/src/builder/advisor.ts +7 -2
  28. package/src/builder/appwizard.ts +22 -6
  29. package/src/builder/arrange.ts +33 -12
  30. package/src/builder/code-editor.ts +7 -2
  31. package/src/builder/components.ts +86 -4
  32. package/src/builder/designer.ts +44 -17
  33. package/src/builder/errors.ts +65 -0
  34. package/src/builder/form-designer.ts +229 -0
  35. package/src/builder/forms.ts +1 -1
  36. package/src/builder/locks.ts +6 -0
  37. package/src/builder/newapp.ts +2 -1
  38. package/src/builder/object-browser.ts +81 -18
  39. package/src/builder/region-help.ts +2 -0
  40. package/src/builder/region-settings.ts +2 -0
  41. package/src/builder/reporter.ts +1 -1
  42. package/src/builder/routes.ts +7 -5
  43. package/src/builder/search.ts +3 -3
  44. package/src/builder/shared.ts +41 -8
  45. package/src/builder/subscriptions.ts +30 -4
  46. package/src/builder/ui.ts +2 -0
  47. package/src/cli/replace.ts +16 -2
  48. package/src/i18n/ar.ts +62 -0
  49. package/src/i18n/cs.ts +62 -0
  50. package/src/i18n/da.ts +62 -0
  51. package/src/i18n/de.ts +62 -0
  52. package/src/i18n/el.ts +62 -0
  53. package/src/i18n/es.ts +62 -0
  54. package/src/i18n/fi.ts +62 -0
  55. package/src/i18n/fr.ts +62 -0
  56. package/src/i18n/he.ts +62 -0
  57. package/src/i18n/it.ts +62 -0
  58. package/src/i18n/ja.ts +62 -0
  59. package/src/i18n/ko.ts +62 -0
  60. package/src/i18n/nb.ts +62 -0
  61. package/src/i18n/pl.ts +62 -0
  62. package/src/i18n/pt.ts +62 -0
  63. package/src/i18n/ru.ts +62 -0
  64. package/src/i18n/sv.ts +62 -0
  65. package/src/i18n/tr.ts +62 -0
  66. package/src/i18n/uk.ts +62 -0
  67. package/src/i18n/zh.ts +62 -0
  68. package/src/i18n.ts +124 -0
  69. package/src/metadata.ts +18 -3
  70. package/src/runtime/component-settings.ts +42 -0
  71. package/src/runtime/context.ts +4 -0
  72. package/src/runtime/devbar.ts +1 -1
  73. package/src/runtime/documents.ts +29 -3
  74. package/src/runtime/engine.ts +2 -2
  75. package/src/runtime/facet-state.ts +10 -5
  76. package/src/runtime/facets.ts +29 -5
  77. package/src/runtime/form-designer.ts +676 -0
  78. package/src/runtime/grid.ts +36 -11
  79. package/src/runtime/items.ts +47 -32
  80. package/src/runtime/lists.ts +1 -1
  81. package/src/runtime/logic.ts +12 -7
  82. package/src/runtime/pdf.ts +2 -1
  83. package/src/runtime/regions.ts +8 -3
  84. package/src/runtime/render.ts +8 -3
  85. package/src/runtime/report.ts +4 -3
  86. package/src/runtime/routes.ts +7 -3
  87. package/src/runtime/shortcuts.ts +43 -0
  88. package/src/runtime/smart-filters.ts +2 -1
  89. package/src/runtime/tasks.ts +6 -3
  90. package/src/security.ts +2 -1
  91. package/src/subscriptions.ts +67 -0
@@ -7,7 +7,7 @@ open item and open an issue or pull request; see [CONTRIBUTING.md](../CONTRIBUTI
7
7
  Legend: ✅ available · 🟡 partial (see notes) · ❌ not yet · ➖ not planned (a deliberate choice,
8
8
  or better served by the PostgreSQL ecosystem; see the notes and [extensions](guide/15-extensions.md))
9
9
 
10
- Last reviewed: 2026-10-14 (sprint 79: generated dashboards with sums, donuts and lines, leaving out charts that say nothing; applications open in their own light or dark mode until the user chooses, per application; a user menu with Appearance and Sign in when signed out; the developer toolbar's App and Page texts and debug state; the report search's column scope in the magnifier; sprint 78: generated faceted search reports with one column per foreign key, the faceted search's total row count, Show all and Yes/No values, one search field, friendly headings and number formats in generated grids and master-detail pages, friendly names in the Create Application wizard's page list; sprint 77: the Page Designer's layout and tree by display position, button positions, the tree's context menu with Duplicate and Copy to other page, Show Common / Show All, Go to group and the Template Options dialog; display positions, button positions and side-column page templates at runtime; sprint 76: the interactive report's menus and pagination, date items in the date format; sprint 75: the SQL Workshop's Object Browser and tabs; sprint 74: the builder's information architecture: Shared Components grid, Settings tabs, application home search and tasks; sprint 73: the Create Application wizard on one page with page types and features; sprint 72: the runtime chrome compared with APEX 26.2's: the developer toolbar, the Iris look, the navigation bar's Help menu and Install button; sprint 71: generated applications compared with APEX 26.2's: labels, foreign key names in reports, file columns, format masks, the Home page and the dashboard; sprint 70: treemap, sunburst and timeline charts; sprint 69: dragging tasks on a Gantt chart; sprint 68: the Data Reporter's welcome page, Find my workspace; sprint 67: REST source catalogs from OpenAPI documents, a workspace's export and import (two rows added); sprint 66: a blueprint from an existing application; sprint 65: facet charts; sprint 64: approval vacation rules and expiration policies; sprint 63: range, box plot and stock charts; sprint 62: workspace preferences (SQL Workshop and RESTful services per workspace), extension links, Manage backups across applications, SQL Workshop utilities with object reports, About Database and a database monitor; sprint 61: the builder's screens compared with APEX 26.1: the workspace sign-in page, the Administration menu with workspace message, environment banner and utilization, the SQL Workshop home, the App Gallery, application groups and cross application reports (four rows added); sprint 60: isolated workspaces with their own database logins, row-level security on pgkiln's tables and workspace database roles, workspace administrators; sprint 59: the Page Designer's help pane, Quick edit from the developer toolbar; sprint 58: page groups; sprint 57: region templates hero, title bar, buttons container, inline dialog and drawer, wizard with wizard progress, the carousel; sprint 56: Generate DDL and Schema Comparison in the SQL Workshop, `pgkiln ddl` and `pgkiln compare`; sprint 55: an editable login page with a Login region and the Minimal page template, Forgot password through the application's mail service; sprint 54: interactive grid views, the single row view, group by and chart; sprint 53: application settings, user preferences and items kept per user, dynamic translations, `meta.data_export` and data export downloads, display image and geocoded address items; sprint 52: every dynamic action event and action, Ajax callbacks, an error handling function, the session timeout warning; sprint 51: checked imports, application backups, availability and Run only, feedback, type-specific attribute help; sprint 50: lost update detection, warn on unsaved changes, the URL and search regions with search configurations, the developer toolbar with a session state viewer, and e-mail through SMTP with OAuth2, Microsoft Graph, Amazon SES and HTTP APIs; import checks, application availability, property help and e-mail compared again; 2026-10-06: pgkiln 0.31.0, in progress: static application files and the Execute JavaScript dynamic action; region, item, dynamic action and process plug-ins; conditional and dynamic theme styles; XML and Excel in `meta.parse_data`, zips in SQL, `meta.v_boolean`; file items in S3-compatible object storage; map layers by the visible area and as vector tiles; a graphical query builder; tenants for workflows and tasks; application files as YAML and region static IDs; Lucide icons and icon modifiers; PWA push notifications; 0.30.0: 136 icons and an icon picker; an axe-core accessibility audit; cropping pictures; session sharing between applications; twenty-two built-in languages; 0.29.0: workspaces; the Iris base style; drawers; built-in template components including the metric card; Theme Roller dark-mode colours, live preview and template options on items and report columns; report selection across pages; instance settings; fourteen built-in languages; 0.28.0: AI with Claude and OpenAI; 0.27.0: Data Reporter; sample data generator; create application from several sheets, pasted data or existing tables; 0.26.0: working copies with a three-way merge; theme, library and boilerplate applications with subscriptions; 0.25.0: Gantt, pyramid and polar charts; map layers, clustering and server-side spatial filters; REST data sources that write back from forms and grids and synchronise into tables, OAuth2 password and refresh-token grants; debug messages per request and an install/upgrade log; `meta.web_request()` and `meta.parse_data()`; Theme Roller style variants and template options; 0.24.0: automations with several actions, error handling per row and runs from SQL; invoke-API workflow steps; Unload Data in the Data Workshop; create page wizards for cards, calendar, chart, map, faceted search, form and master-detail; create an application from a file; 0.23.0: interactive grid aggregates, frozen/moved/resized columns, layouts and saved grid reports, master-detail, row actions and copy/paste; download processes, execution chains in the background, workflow processes, branches to a function's URL or another app, the Dialog Closed event; number format masks, automatic time zone, runtime messages in German, French and Spanish; SQL scripts, Quick SQL, a query builder, XML loading and data load definitions; custom authentication, lists, page and application locks with developer comments, supporting objects; 0.22.0: keyset paging, report PDFs and REST collections streamed from a cursor, database-account authentication; 0.21.0: HTTP-header authentication behind a reverse proxy; 0.20.0: a popup list of values with server-side search; 0.19.0: row-range pagination, maximum row counts and row limits, lazy loading and caching of regions, streamed CSV/Excel downloads; 0.18.0: calendar week/day/list views with drag and drop, bubble/gauge/funnel/radar charts and drill-down, smart filters, a region display selector and more facet types, computations, conditional branches, build options, menu buttons, REST data sources and web credentials, rich text/Markdown, rating, combobox, date range and QR code items; 0.17.0: an App Builder home, workspace dashboard and utilities like APEX's; 0.16.0: a Page Designer with drag-and-drop layout, a code editor with autocomplete, template components and plug-ins, parallel branches and versions of workflows, the `pgkiln` command line with one file per component; 0.15.0: drop and paste files, heat maps, filtering a report by the map area; 0.14.0: stacked, combo, scatter and pie charts, several files per upload item; 0.13.0: map and tree regions; 0.12.0: REST modules in the builder; 0.11.0: workflows and Progressive Web Apps; 0.10.0: LDAP, SAML, "Keep me signed in", document templates, JSON loading, approvals and the task list; pgkiln installs no application, HR is an example).
10
+ Last reviewed: 2026-10-15 (sprint 90: Comment Out in the page designer, gallery labels in title case; sprint 89: the Object Browser's schema, one row of tabs, blank NULLs, Modify column; sprint 88: home cards with colour bands and round icons, the hero on the page background, a page footer with the version and Back to top; sprint 87: the Create Application wizard reloads the page list for a schema, RLS badges, the alias from the name; sprint 86: the page designer by page number, HTML error pages in the builder; sprint 85: the Form Designer, beyond APEX; sprint 84: the date picker, facet menus; sprint 83: Component Settings and Component Groups; sprint 82: Report Queries; sprint 81: Application Computations and Shortcuts in Shared Components; sprint 80: the master grid's first row selected when the page opens and after a search; grid cells as text with their format mask until edited, with cell navigation by arrow keys, Enter, F2 and Escape; sprint 79: generated dashboards with sums, donuts and lines, leaving out charts that say nothing; applications open in their own light or dark mode until the user chooses, per application; a user menu with Appearance and Sign in when signed out; the developer toolbar's App and Page texts and debug state; the report search's column scope in the magnifier; sprint 78: generated faceted search reports with one column per foreign key, the faceted search's total row count, Show all and Yes/No values, one search field, friendly headings and number formats in generated grids and master-detail pages, friendly names in the Create Application wizard's page list; sprint 77: the Page Designer's layout and tree by display position, button positions, the tree's context menu with Duplicate and Copy to other page, Show Common / Show All, Go to group and the Template Options dialog; display positions, button positions and side-column page templates at runtime; sprint 76: the interactive report's menus and pagination, date items in the date format; sprint 75: the SQL Workshop's Object Browser and tabs; sprint 74: the builder's information architecture: Shared Components grid, Settings tabs, application home search and tasks; sprint 73: the Create Application wizard on one page with page types and features; sprint 72: the runtime chrome compared with APEX 26.2's: the developer toolbar, the Iris look, the navigation bar's Help menu and Install button; sprint 71: generated applications compared with APEX 26.2's: labels, foreign key names in reports, file columns, format masks, the Home page and the dashboard; sprint 70: treemap, sunburst and timeline charts; sprint 69: dragging tasks on a Gantt chart; sprint 68: the Data Reporter's welcome page, Find my workspace; sprint 67: REST source catalogs from OpenAPI documents, a workspace's export and import (two rows added); sprint 66: a blueprint from an existing application; sprint 65: facet charts; sprint 64: approval vacation rules and expiration policies; sprint 63: range, box plot and stock charts; sprint 62: workspace preferences (SQL Workshop and RESTful services per workspace), extension links, Manage backups across applications, SQL Workshop utilities with object reports, About Database and a database monitor; sprint 61: the builder's screens compared with APEX 26.1: the workspace sign-in page, the Administration menu with workspace message, environment banner and utilization, the SQL Workshop home, the App Gallery, application groups and cross application reports (four rows added); sprint 60: isolated workspaces with their own database logins, row-level security on pgkiln's tables and workspace database roles, workspace administrators; sprint 59: the Page Designer's help pane, Quick edit from the developer toolbar; sprint 58: page groups; sprint 57: region templates hero, title bar, buttons container, inline dialog and drawer, wizard with wizard progress, the carousel; sprint 56: Generate DDL and Schema Comparison in the SQL Workshop, `pgkiln ddl` and `pgkiln compare`; sprint 55: an editable login page with a Login region and the Minimal page template, Forgot password through the application's mail service; sprint 54: interactive grid views, the single row view, group by and chart; sprint 53: application settings, user preferences and items kept per user, dynamic translations, `meta.data_export` and data export downloads, display image and geocoded address items; sprint 52: every dynamic action event and action, Ajax callbacks, an error handling function, the session timeout warning; sprint 51: checked imports, application backups, availability and Run only, feedback, type-specific attribute help; sprint 50: lost update detection, warn on unsaved changes, the URL and search regions with search configurations, the developer toolbar with a session state viewer, and e-mail through SMTP with OAuth2, Microsoft Graph, Amazon SES and HTTP APIs; import checks, application availability, property help and e-mail compared again; 2026-10-06: pgkiln 0.31.0, in progress: static application files and the Execute JavaScript dynamic action; region, item, dynamic action and process plug-ins; conditional and dynamic theme styles; XML and Excel in `meta.parse_data`, zips in SQL, `meta.v_boolean`; file items in S3-compatible object storage; map layers by the visible area and as vector tiles; a graphical query builder; tenants for workflows and tasks; application files as YAML and region static IDs; Lucide icons and icon modifiers; PWA push notifications; 0.30.0: 136 icons and an icon picker; an axe-core accessibility audit; cropping pictures; session sharing between applications; twenty-two built-in languages; 0.29.0: workspaces; the Iris base style; drawers; built-in template components including the metric card; Theme Roller dark-mode colours, live preview and template options on items and report columns; report selection across pages; instance settings; fourteen built-in languages; 0.28.0: AI with Claude and OpenAI; 0.27.0: Data Reporter; sample data generator; create application from several sheets, pasted data or existing tables; 0.26.0: working copies with a three-way merge; theme, library and boilerplate applications with subscriptions; 0.25.0: Gantt, pyramid and polar charts; map layers, clustering and server-side spatial filters; REST data sources that write back from forms and grids and synchronise into tables, OAuth2 password and refresh-token grants; debug messages per request and an install/upgrade log; `meta.web_request()` and `meta.parse_data()`; Theme Roller style variants and template options; 0.24.0: automations with several actions, error handling per row and runs from SQL; invoke-API workflow steps; Unload Data in the Data Workshop; create page wizards for cards, calendar, chart, map, faceted search, form and master-detail; create an application from a file; 0.23.0: interactive grid aggregates, frozen/moved/resized columns, layouts and saved grid reports, master-detail, row actions and copy/paste; download processes, execution chains in the background, workflow processes, branches to a function's URL or another app, the Dialog Closed event; number format masks, automatic time zone, runtime messages in German, French and Spanish; SQL scripts, Quick SQL, a query builder, XML loading and data load definitions; custom authentication, lists, page and application locks with developer comments, supporting objects; 0.22.0: keyset paging, report PDFs and REST collections streamed from a cursor, database-account authentication; 0.21.0: HTTP-header authentication behind a reverse proxy; 0.20.0: a popup list of values with server-side search; 0.19.0: row-range pagination, maximum row counts and row limits, lazy loading and caching of regions, streamed CSV/Excel downloads; 0.18.0: calendar week/day/list views with drag and drop, bubble/gauge/funnel/radar charts and drill-down, smart filters, a region display selector and more facet types, computations, conditional branches, build options, menu buttons, REST data sources and web credentials, rich text/Markdown, rating, combobox, date range and QR code items; 0.17.0: an App Builder home, workspace dashboard and utilities like APEX's; 0.16.0: a Page Designer with drag-and-drop layout, a code editor with autocomplete, template components and plug-ins, parallel branches and versions of workflows, the `pgkiln` command line with one file per component; 0.15.0: drop and paste files, heat maps, filtering a report by the map area; 0.14.0: stacked, combo, scatter and pie charts, several files per upload item; 0.13.0: map and tree regions; 0.12.0: REST modules in the builder; 0.11.0: workflows and Progressive Web Apps; 0.10.0: LDAP, SAML, "Keep me signed in", document templates, JSON loading, approvals and the task list; pgkiln installs no application, HR is an example).
11
11
 
12
12
  ## At a glance
13
13
 
@@ -38,7 +38,7 @@ two, REST source catalogs and the workspace export, with their features.)
38
38
  | App Builder: create, edit, delete, run apps | ✅ | Builder at `/builder` |
39
39
  | Create application wizard | ✅ | Blank app with its own database role and schema, started from a **boilerplate application** if wanted; **from a file**: CSV/TSV/XLSX/JSON/XML, where an Excel workbook with several sheets (or JSON with several arrays) becomes several tables, with a preview to include or leave out each sheet, edit table/column names, types and primary keys, and **foreign keys proposed** from matching columns; **from pasted data** (CSV/TSV text); **from existing tables** (pick the tables and views of a schema). Each gives a report and form per table, navigation and an optional dashboard (a chart per table), plus an optional faceted search for a single table, all created in one transaction. (sprint 73) **One page like APEX's**: name, icon and description, appearance (theme style, side or top menu, accent), a **page type per table** (interactive report with form, faceted search, cards, calendar, master detail, interactive grid, report, none; large tables proposed as a grid), **features** (About page, access control roles, activity reporting, feedback, theme style selection, PWA, push), settings (alias, authentication, first user, language) and a boilerplate under Advanced; a progress message, then straight to the new application. (sprint 71) The generated pages read like APEX's: human labels (abbreviations, run-together words, column and table comments), plural page and menu names with singular form titles, foreign keys shown by the parent's name in reports, `bytea` columns as one file item with their name/mime/size/updated columns, number format masks, a pencil per report row, the Dashboard after Home with *(none)* and top-N charts, and a Home page with a hero and a card per page. **Missing:** blueprints (26.1) |
40
40
  | Create page wizards | ✅ | Report and form, interactive grid, form, cards, calendar, chart, map, faceted search and master-detail (stacked grids) from any table or view, with defaults from the catalog (columns, key, dates, positions, foreign keys), an optional modal form page and a navigation entry; also from SQL (`meta.generate_page`). No side-by-side or drill-down master-detail, no wizard for smart filters or trees |
41
- | Page Designer | ✅ | IDE-style window (dark or light): component tree, a layout canvas with drag and drop (with keyboard and button alternatives) and a gallery of regions, items and buttons, a filterable property editor; undo/redo; panes become tabs on phones. Settings forms for report, grid, chart, cards, calendar, faceted search, smart filters, display selector, map, tree and template component regions. A code editor for SQL, PL/pgSQL, JSON and HTML with highlighting and autocomplete of tables, columns and `:ITEM` binds (no extra libraries). Drag and drop needs a mouse; on touch screens the Arrange buttons move components. (sprint 77) The layout draws the page template's display positions (banner, breadcrumb bar, left/right column, body, footer) as drop zones and a region's button positions; the rendering tree groups by position and has a context menu (create in or below, Duplicate, Copy to other page, expand/collapse all, delete); the property editor has Common / All, Go to group and a Template Options dialog; a page number in the toolbar. No nested regions (APEX's sub regions) and no Comment Out |
41
+ | Page Designer | ✅ | IDE-style window (dark or light): component tree, a layout canvas with drag and drop (with keyboard and button alternatives) and a gallery of regions, items and buttons, a filterable property editor; undo/redo; panes become tabs on phones. Settings forms for report, grid, chart, cards, calendar, faceted search, smart filters, display selector, map, tree and template component regions. A code editor for SQL, PL/pgSQL, JSON and HTML with highlighting and autocomplete of tables, columns and `:ITEM` binds (no extra libraries). Drag and drop needs a mouse; on touch screens the Arrange buttons move components. (sprint 77) The layout draws the page template's display positions (banner, breadcrumb bar, left/right column, body, footer) as drop zones and a region's button positions; the rendering tree groups by position and has a context menu (create in or below, Duplicate, Copy to other page, expand/collapse all, (sprint 90) Comment out with a COMMENTED_OUT build option, delete; no Create Sub Region: no nested regions); the property editor has Common / All, Go to group and a Template Options dialog; a page number in the toolbar. No nested regions (APEX's sub regions) and no Comment Out |
42
42
  | Shared components | ✅ | (sprint 74) A grid of ten groups with counts like APEX's, a searchable, sortable list per type with Create, and Settings-backed types linking to their Settings tab ([mapping below](#shared-components-apex-links-and-pgkiln)). Navigation menu, **lists** (static entries with nesting, badges, conditions, authorization and build options, or a query; for list regions, the navigation menu and the navigation bar), authorization schemes, build options, lists of values, application items and processes, access control, globalization, template components and plug-ins, web credentials, REST data sources, data load definitions, supporting objects |
43
43
  | Export / import | ✅ | `meta.export_app()` / `meta.import_app()`: portable JSON, also in the builder (new applications; `pgkiln import --replace` and the MCP `import_app` update one in place, live for every user at the commit). (sprint 51) **Checked imports**: `pgkiln import --check` (`--dry-run`, `--force`), the MCP import (by default) and the builder's import run the Advisor inside the import's transaction (SQL planned as the application's role: missing tables, columns, functions, types, grants; references) and refuse on errors, so nothing changes; APEX doesn't check. The version an import replaces is [backed up](guide/03-builder.md#backups) first ([chapter 18](guide/18-cli.md#checking-before-an-import)) |
44
44
  | APEXlang: human-readable, diffable app files; static IDs (26.1) | ✅ | `pgkiln export --format dir`: one JSON file per component with sorted keys, SQL and HTML in sibling files, references by static id instead of database ids; `pgkiln import --replace` updates an app in place, `pgkiln diff` compares ([chapter 18](guide/18-cli.md)). (0.31) **`--format text`**: the same files as YAML (a strict subset any YAML tool reads) with the SQL and templates inline, read back losslessly ([text files](guide/18-cli.md#text-files-apexlang)); regions have a stored **Static ID** (exported as their key, rendered as `data-static-id`), other components are named by their stored names. The syntax is YAML rather than APEXlang's own, so APEXlang files don't import |
@@ -62,7 +62,7 @@ two, REST source catalogs and the workspace export, with their features.)
62
62
  |---|---|---|
63
63
  | Classic report | ✅ | `report` with `interactive: false` |
64
64
  | Interactive report | ✅ | (sprint 76) An Actions menu of nine entries with dialogs, a column heading menu (sort, hide, control break, the column's values to filter by), a search in one column, hidden columns, pagination with the range, first/last and rows per page. Search, column filters, sort, rows per page, control break, aggregates (with subtotals), highlight, saved private and public reports, computed columns, group by, pivot, chart view, row selection into a page item, CSV, Excel (typed cells) and PDF download, print, reset, reflow on phones. a maximum row count (`max_rows`), natural-language control (*Ask in your own words*, 26.1) and row selection that stays across pages. Not possible: flashback queries (PostgreSQL has none; use an audit or temporal table) |
65
- | Interactive grid | ✅ | Inline edit, add and delete rows, lists of values, required columns, per-row errors, all-or-nothing save, signed row keys, search and paging; **aggregates** over the whole result (developer and user defined), **frozen columns**, column **reorder/resize/hide** (Actions → Columns, or drag and drop), per-user layouts and **saved grid reports** (private and public), **master-detail** (signed row selection, details refreshed in place), a **row actions menu** (edit, duplicate, delete, links) and **copy/paste** of cell ranges (tab-separated, spreadsheet compatible) ([chapter 4](guide/04-pages-and-regions.md)) |
65
+ | Interactive grid | ✅ | Inline edit, add and delete rows, lists of values, required columns, per-row errors, all-or-nothing save, signed row keys, search and paging; **aggregates** over the whole result (developer and user defined), **frozen columns**, column **reorder/resize/hide** (Actions → Columns, or drag and drop), per-user layouts and **saved grid reports** (private and public), **master-detail** (signed row selection, the first row selected on load and after a search, details refreshed in place), **navigation and edit mode** (cells as text with their format mask until clicked, Enter or F2; arrow keys between cells), a **row actions menu** (edit, duplicate, delete, links) and **copy/paste** of cell ranges (tab-separated, spreadsheet compatible) ([chapter 4](guide/04-pages-and-regions.md)) |
66
66
  | Interactive grid views: single row view, chart view, group by | ✅ | (sprint 54) **Single row view**: one row of the search as a form with first/previous/next/last and *Add row*, from the Actions or row actions menu, saved by the grid's own process with the same checks; **group by** and **chart** set up in the Actions menu over every row of the search, as for the interactive report; `views` limits them; Save comes back to the same search, page and view ([chapter 4](guide/04-pages-and-regions.md#grid-interactive-grid)). No pivot view on grids (the interactive report has one), no editing in the single row view of columns the grid doesn't show |
67
67
  | Form (automatic row processing) | ✅ | Fetch, insert, update, delete, in a page or a modal dialog. Detects rows deleted meanwhile. (sprint 50) **Lost update detection** (APEX: *Prevent Lost Updates* and *Lock Row*): the page carries a checksum of the row's form columns (`meta.row_version`, independent of time zone and date format, as the app's role); *Save* and *Delete* lock the row and refuse when it changed meanwhile; off per form with `{"lost_update": false}` ([chapter 4](guide/04-pages-and-regions.md#form)) |
68
68
  | Charts | ✅ | Bar, column, stacked, line, area, combination (columns + lines), scatter, bubble, donut, pie, gauge, funnel, radar, **Gantt** (start/end, progress, milestones, dependencies, a today line, a time axis from hours to years), **pyramid** (area-proportional segments, or two series back to back) and **polar** (polar area); (sprint 63) **range** (floating columns from low to high), **box plot** (from one value per row or five statistics) and **stock** (candlesticks from open, high, low and close); multi-series, tooltips, data table, (sprint 71) a value axis with gridlines on horizontal bars and top-N with an *Other* bar (`"top": 10`), palette checked for colour-vision deficiency; drill-down links on chart marks (checksummed, only to pages the user may open). Drawn on the server as SVG without inline styles. (sprint 69) **Gantt editing**: drag a task or its end, or the arrow keys, runs the region's SQL as the app's role. (sprint 70) **treemap** (squarified, two levels shown), **sunburst** (up to four rings) from `node_id` / `parent_id` columns, and **timeline** (lanes by a `series` column, points and periods, overlaps in rows). **Missing:** other Oracle JET types (e.g. picto, NBox, Sankey) |
@@ -110,7 +110,7 @@ two, REST source catalogs and the workspace export, with their features.)
110
110
  | Application items and processes | ✅ | `after_login`, `before_page` |
111
111
  | Validations | ✅ | Not null, SQL expression, regex, required items; `RAISE … USING COLUMN` in PL/pgSQL targets a field |
112
112
  | Conditions and authorization on components | ✅ | Pages, regions, items, buttons, processes, dynamic actions, navigation entries; re-checked on submit |
113
- | Computations | ✅ | Static, item, SQL query, SQL expression and PL/pgSQL function body; before header and after submit; with a condition, authorization and build option ([chapter 6](guide/06-processing.md#computations)) |
113
+ | Computations | ✅ | Static, item, SQL query, SQL expression and PL/pgSQL function body; before header and after submit; with a condition, authorization and build option ([chapter 6](guide/06-processing.md#computations)); **application computations** (sprint 81) for every page: after authentication, before header, after submit ([chapter 6](guide/06-processing.md#application-computations)) |
114
114
  | Page processes | ✅ | SQL / PL/pgSQL, form DML, grid DML, data loading (`data_load`), **invoke API** (a REST data source or URL, response values into items), **download** (a file from a query; several rows become one zip; on submit or on load), **execution chains** (child processes with their own conditions, nested, optionally run in the background with a status view), **workflow** (start, terminate, retry), **Generate text with AI** (text or structured output into items) |
115
115
  | Branches | ✅ | Before header and after processing, to a page (with items) or a URL inside the app, *When button pressed*, server-side conditions (SQL, exists, item null/equals, request); the button's target page stays the fallback ([chapter 6](guide/06-processing.md#branches)); a PL/pgSQL function returning a path in the app, and a page of another application (with signed items) |
116
116
  | Dynamic actions | ✅ | Show, hide, enable, disable, set value (SQL), execute SQL, refresh region or item, alert, submit, set focus, add/remove class, show success/error message and clear errors (26.1); the **Dialog Closed** event (per dialog page, with the dialog's message). **Execute JavaScript**: calls a function a static application file registered with `pgkiln.actions.register` (no inline code: the CSP stays strict) ([chapter 7](guide/07-dynamic-actions.md#execute-javascript)); dynamic action plug-ins |
@@ -176,7 +176,7 @@ two, REST source catalogs and the workspace export, with their features.)
176
176
  | Translated applications (26.1: text-message-based translation of one app) | ✅ | One app with translations, like 26.1; XLIFF 1.2 and CSV export/import, coverage per language |
177
177
  | Text messages (`APEX_LANG.MESSAGE`, `&APP_TEXT$…`) | ✅ | `meta.message()`, `&APP_TEXT$NAME.`, fallback to the base and primary language |
178
178
  | Language from browser, preference or session | ✅ | Browser, user preference or primary; `?lang=`; right-to-left languages |
179
- | Date and timestamp format masks | ✅ | Per app or per language; (sprint 76) date items show and read the application's date format (or their own) with a calendar button |
179
+ | Date and timestamp format masks | ✅ | Per app or per language; (sprint 76) date items show and read the application's date format (or their own) with a calendar button; (sprint 84) pgkiln's date picker (keyboard, week start, Today, Clear) for date items, date ranges, grid date cells and facet date ranges; timestamps keep the browser's field |
180
180
  | Dynamic translations (`APEX_LANG.LANG`: translated data values, e.g. list of values entries) | ✅ | (sprint 53) Shared Components → Dynamic translations; `meta.lang(text)` in a query returns the value in the session's language (base language fallback); exported with the application |
181
181
  | Number format masks, automatic time zone | ✅ | Oracle-style number masks (`999G999G990D00`, `FML…`, `0000`, `%`, `S`/`MI`/`PR`, `EEEE`, `X`, `RN`) on report, grid and cards columns, charts and number/display items, in the language's separators with the app's currency; Automatic Time Zone (browser, My account, app or database), `timestamptz` shown in it ([chapter 14](guide/14-globalization.md)) |
182
182
 
@@ -191,7 +191,7 @@ two, REST source catalogs and the workspace export, with their features.)
191
191
  | Data Workshop (load and unload) | ✅ | SQL Workshop → Load Data: CSV/TSV/XLSX/JSON into a new table (inferred types) or an existing one (append, merge, replace) with a per-row error report; `data_load` process for end users; **XML** (a repeating element, attributes and paths; DTDs refused) and saved **data load definitions** (mapping, transformations, format masks, defaults; used by Load Data and the process, exported with the app). **Unload Data**: a table or view (chosen columns, where, order) or a query to CSV (separator, enclosure, heading), JSON, XLSX or XML (element names), streamed with a cursor in a read-only transaction with a statement timeout ([chapter 16](guide/16-files.md)) |
192
192
  | Large downloads without buffering (ORDS streams) | ✅ | CSV and Excel downloads stream from a database cursor (1,000 rows at a time, a streaming Excel writer) up to `DOWNLOAD_MAX_ROWS` (default 1,000,000), so memory stays flat. Report PDFs read their rows from a cursor in batches of 500 (`PDF_MAX_ROWS`, default 5,000, at most 100,000); REST collection handlers stream a chunked JSON array from a cursor |
193
193
  | REST data sources, web credentials (26.1: OAuth refresh tokens, password flow) | ✅ | Shared Components → REST data sources: JSON endpoints with path, query, header and body parameters, a row selector, typed columns and a response cache feed reports, cards, charts, calendars, maps, trees, template components and shared lists of values as SQL over `rest`. **Write-back**: insert, update, delete and fetch operations (path and JSON body templates after the source's URL) used by forms and interactive grids. **Synchronisation** into a local table (merge on key columns with optional delete, replace, append) on demand, on a cron schedule or from SQL (`meta.request_rest_sync`), as the app's role, with a run log. Web credentials: basic, API-key header, bearer and OAuth2 client credentials, password and refresh-token grants (refresh tokens stored encrypted and rotated), secrets encrypted and write-only. Outgoing calls only to an allow-list of hosts, with SSRF checks ([chapter 19](guide/19-rest-data-sources.md)). **Missing:** XML/SOAP, the OAuth2 authorization code flow (consent in the browser) |
194
- | Printing, document generator (PDF) | ✅ | **Document templates**: a query (with JSON columns for lines) fills an HTML template with Mustache-style tags, drawn as PDF with a report layout; buttons and links download them. Report PDF with **report layouts** and a print stylesheet on every page. No Word/Excel templates or DOCX/XLSX output |
194
+ | Printing, document generator (PDF) | ✅ | **Document templates**: a query (with JSON columns for lines) fills an HTML template with Mustache-style tags, drawn as PDF with a report layout; buttons and links download them. (sprint 82) **Report queries**: a named query as PDF, Excel, CSV, JSON, XML or HTML. Report PDF with **report layouts** and a print stylesheet on every page. No Word/Excel templates or DOCX/XLSX output |
195
195
  | `APEX_DATA_EXPORT` (a query to CSV, XLSX, PDF, HTML or JSON from PL/SQL) | ✅ | (sprint 53) `meta.data_export(query, format, options)` returns CSV, JSON, XML or HTML as `bytea` with the caller's privileges; the download process's `{"export": …}` sends a query's rows as CSV, JSON, XML, HTML, Excel or PDF |
196
196
  | SQL Workshop utilities: schema comparison, generate DDL | ✅ | (sprint 56) SQL Workshop → **DDL**: a schema's objects (types, sequences, tables, functions, views, constraints, indexes, triggers, RLS and policies, comments, grants) from the catalog, in an order that runs, unqualified so it also creates them in another schema. **Compare**: two schemas by their DDL (only in one, different, with a diff) and a change script that makes the target like the source (tables column by column; drops commented out for review). Also `pgkiln ddl`, `pgkiln compare` and the MCP tools `generate_ddl`, `compare_schemas` ([chapter 3](guide/03-builder.md#sql-workshop)). Two schemas of the same database only (APEX: also within one workspace) |
197
197
  | Data Reporter: self-service reports for business users (26.1) | ✅ | A **Data Reporter** region ([chapter 4](guide/04-pages-and-regions.md#data_reporter-data-reporter)): the developer offers tables and views with chosen columns, labels and format masks; signed-in users pick columns, filter, group with totals (count, sum, average, minimum, maximum), sort and chart, and save reports privately or shared with the app's users. Runs as the app's role (grants and RLS apply); works without JavaScript and fits phones. (sprint 68) A **welcome page** like 26.1's: a greeting (the developer's own, or pgkiln's), the sources as cards that start a report, the user's reports latest first, shared ones, and a search. One source per report (offer a view to combine tables); no downloads from a reporter yet |
@@ -269,6 +269,9 @@ Small but real differences, for teams comparing the two:
269
269
  - An import can be checked before it commits (`pgkiln import --check`): SQL that names a missing
270
270
  table or column refuses the deployment instead of failing at run time.
271
271
  - E-mail through SMTP with OAuth2, Microsoft Graph, Amazon SES and HTTP APIs, not only SMTP with a password.
272
+ - (sprint 85) A **Form Designer** region ([chapter 4](guide/04-pages-and-regions.md#form_designer-form-designer)): the
273
+ application's administrators build and publish data entry forms in the running application, on the tables and
274
+ columns the developer offers, with grants, row level security and lost update detection applying.
272
275
 
273
276
  ## Roadmap (proposed priority)
274
277
 
@@ -312,22 +315,22 @@ Sources: [APEX 26.1 new features](https://docs.oracle.com/en/database/oracle/ape
312
315
  | APEX | pgkiln |
313
316
  |---|---|
314
317
  | Application Definition, Application Items, Application Processes, Application Settings, Build Options | The same names (Application Logic) |
315
- | Application Computations | ➖ Not planned: an application process *before every page* or an item's computation does it |
318
+ | Application Computations | The same name (Application Logic, sprint 81): after authentication, before header and after submit, before the page's own computations |
316
319
  | Authentication Schemes | Settings → Security: one authentication per application (its type and fields); several schemes to switch between are ➖ not planned |
317
320
  | Authorization Schemes, Access Control | The same names (Security) |
318
321
  | Security Attributes, Session State Protection | Settings → Security and Sign-in; session state protection is per page (Page Designer → *Protection*) |
319
322
  | Lists of Values, Lists, Email Templates, Supporting Objects, Subscriptions | The same names (Other Components) |
320
323
  | Navigation Menu, Navigation Bar List, Breadcrumbs, Search Configurations | The same names (Navigation and Search); breadcrumbs follow each page's breadcrumb parent |
321
- | Shortcuts | ➖ Not planned: application items and substitutions (`&ITEM.`) |
324
+ | Shortcuts | The same name (Other Components, sprint 81): text, HTML and PL/pgSQL function body; `"NAME"` in static content, help texts and confirm messages |
322
325
  | Themes, Templates, User Interface Attributes, Theme Roller | Themes and Theme Roller, Template Components, Settings → User Interface; page and region templates are a fixed list (➖ no template editor) |
323
- | Plug-ins, Component Settings | Plug-ins; component settings ➖ not planned |
324
- | Component Groups | Page Groups (pages); groups of other components ➖ not planned |
326
+ | Plug-ins, Component Settings | The same names (User Interface; component settings sprint 83): rows per page of reports, grids and popup lists of values, list of values rows, star rating stars |
327
+ | Component Groups | The same name (Other Components, sprint 83): a library application's lists of values, authorization schemes, build options, template components and lists, subscribed to at once; Page Groups for pages |
325
328
  | Progressive Web App | Settings → Progressive Web App |
326
329
  | Static Application Files, Static Workspace Files | Static Application Files; workspace files ➖ not planned |
327
- | Report Layouts, Report Queries | Report Layouts and Document Templates (a template with its own queries) |
330
+ | Report Layouts, Report Queries | The same names (Files and Reports, sprint 82): a report query is one query printed as PDF with a report layout, Excel, CSV, JSON, XML or HTML (`?doc=NAME`, document buttons); APEX's several queries for one layout: a document template's JSON columns |
328
331
  | REST Data Sources, Web Credentials, REST Enabled SQL, Data Load Definitions | The same names (Data Sources); REST Enabled SQL ➖ not planned (one database) |
329
332
  | Workflows, Task Definitions, Automations | The same names |
330
333
  | Text Messages, Translate, Dynamic Translations, Globalization Attributes | Translations and Text Messages, Dynamic Translations, Settings → Globalization |
331
- | Map Backgrounds | The installation's map tile server (`MAP_TILE_URL`) |
334
+ | Map Backgrounds | ➖ Not planned per application: the installation's map tile server (`MAP_TILE_URL`) is every map's background |
332
335
  | AI Attributes, AI Services, AI Agents | AI Services; AI agents ➖ not planned |
333
336
 
@@ -28,6 +28,10 @@ meta.app ─┬─ meta.page ─┬─ meta.region (reports, forms, grids
28
28
  ├─ meta.lov (shared lists of values)
29
29
  ├─ meta.app_item (application items)
30
30
  ├─ meta.app_process (application processes)
31
+ ├─ meta.app_computation (application computations)
32
+ ├─ meta.shortcut (shortcuts: "NAME" texts)
33
+ ├─ meta.report_query (report queries: ?doc=NAME files)
34
+ ├─ meta.component_group (component groups: subscribed at once)
31
35
  ├─ meta.build_option (build options: include / exclude switches)
32
36
  └─ meta.app_user (users of this application)
33
37
 
@@ -188,6 +192,26 @@ trailing dot) is replaced by the item's value, **HTML-escaped**:
188
192
  <p>Welcome back, <b>&AI_ENAME.</b>!</p>
189
193
  ```
190
194
 
195
+ ### Shortcuts: `"NAME"`
196
+
197
+ **Shared Components → Shortcuts** (APEX: Shortcuts, migration 103) are named texts an application
198
+ reuses. `"NAME"`, the shortcut's upper-case name in double quotes, is replaced by it in a static
199
+ region's content, an item's help text and a button's or menu entry's confirm message, before the
200
+ `&NAME.` substitutions (so a shortcut may contain them). A quoted word that is not the name of one
201
+ of the application's shortcuts stays as it is.
202
+
203
+ | `type` | Replaced by |
204
+ |---|---|
205
+ | `text` | The value, HTML-escaped in a static region |
206
+ | `html` | The value as HTML (in a help text or a confirm message, which are text, its tags show as text) |
207
+ | `function_body` | What the PL/pgSQL function body returns, run as the application's role once per request; an error shows on the page and leaves it empty |
208
+
209
+ ```html
210
+ <p>"SUPPORT_CONTACT"</p> <!-- a shortcut SUPPORT_CONTACT, type html -->
211
+ ```
212
+
213
+ A *Delete* button's confirm message `"DELETE_CONFIRM_MSG"` then reads the same on every page.
214
+
191
215
  ## The application's database role
192
216
 
193
217
  Each application has a `db_role`, the equivalent of APEX's *parsing schema*. Every request runs
@@ -199,6 +199,11 @@ Every builder page has the same frame, modelled on an IDE:
199
199
 
200
200
  On phones the rail gets narrower and the breadcrumb shows only the current page.
201
201
 
202
+ (sprint 86) An address under `/builder` that leads nowhere (a deleted application or page, a typo, an
203
+ application of a workspace you are not a member of) shows a **Page not found** page in the builder's
204
+ theme with a link to the App Builder home; a server error shows **Something went wrong** (the error
205
+ is in the server log, not on the page). Scripts get the plain answers they always got.
206
+
202
207
  ## App Builder home
203
208
 
204
209
  The home page is laid out like APEX's App Builder:
@@ -251,15 +256,15 @@ start from a file, pasted data, a blueprint or the App Gallery instead. Then:
251
256
 
252
257
  | Section | Field | Meaning |
253
258
  |---|---|---|
254
- | Data | Pages on the tables of | The parsing schema: an existing schema (*Show its tables* lists them under Pages), or a new, empty one named after the alias |
259
+ | Data | Pages on the tables of | The parsing schema: an existing schema, or a new, empty one named after the alias. (sprint 87) Choosing a schema lists its tables under Pages at once, with the name and alias proposed for it (unless you already typed them); without JavaScript, *Show its tables* does it |
255
260
  | Application | Name | Display name, shown in the header. Proposed from the schema and selected when you click it, so typing replaces it |
256
261
  | | Description, Icon | Shown on the home page's hero and the About page |
257
262
  | Appearance | Theme style, Navigation, Accent colour | Iris, Lavender or Standard; a side or top menu; an own accent colour |
258
- | Pages | a page type per table | *Interactive report with form*, *Faceted search*, *Cards*, *Calendar* (a table with a date column), *Master detail* (a table another table refers to), *Interactive grid*, *Report* or *No page*. Tables with a single-column primary key get a modal form with their report, faceted search, cards and calendar; views and tables without such a key can't have a form or a grid. Proposed: a report with form, an interactive grid for a table of more than 100,000 rows, a report for a view. *Dashboard*: a chart per table |
263
+ | Pages | a page type per table | *Interactive report with form*, *Faceted search*, *Cards*, *Calendar* (a table with a date column), *Master detail* (a table another table refers to), *Interactive grid*, *Report* or *No page*. Tables with a single-column primary key get a modal form with their report, faceted search, cards and calendar; views and tables without such a key can't have a form or a grid. Proposed: a report with form, an interactive grid for a table of more than 100,000 rows, a report for a view. (sprint 87) A table with [row level security](08-security.md) shows *RLS · n* (its number of policies), or *RLS, no policies* in red: the application's role would see no rows. *Dashboard*: a chart per table |
259
264
  | Features | | *About page* (in a Help menu), *Access control* (authorization schemes `CONTRIBUTOR` and `READER` next to `ADMIN`, for the roles admin, contributor and reader), *Activity reporting* (page 9010 for administrators: page views per day and the latest activity, from `meta.app_activity`), *Feedback*, *Theme style selection* (users may choose light or dark), *Install as an app* (PWA) and *Push notifications* (needs `PGKILN_SECRET_KEY`) |
260
- | Settings | Alias | Lowercase URL name: `inventory` gives `/a/inventory` |
265
+ | Settings | Alias | Lowercase URL name: `inventory` gives `/a/inventory`. (sprint 87) It follows the name as you type it (*Café Orders* → `cafe-orders`) until you change it yourself |
261
266
  | | Authentication | *App users* (a login page and a user list), *HTTP header* (a trusted reverse proxy names the user, see [chapter 8](08-security.md#http-header-authentication-reverse-proxy)), *Database accounts* (PostgreSQL login roles and their passwords, see [chapter 8](08-security.md#database-accounts-postgresql-roles)), *Custom* (your own PL/pgSQL function, see [chapter 8](08-security.md#custom-authentication-a-plpgsql-function)) or *None* (a public app) |
262
- | | First user / Password | The first user; they get the `admin` role. An existing account is reused (its password isn't changed) |
267
+ | | First user / Password | The first user; they get the `admin` role. An existing account is reused (its password isn't changed). (sprint 87) Hidden while Authentication is *None* |
263
268
  | | Language | The application's primary language |
264
269
  | Advanced | Start from | Shown when there are **boilerplate** applications (Settings → Application type): their pages, shared components and settings are copied into the new application, which keeps its own name, alias, role and authentication ([application types](#application-types-and-subscriptions)) |
265
270
 
@@ -268,7 +273,9 @@ Creating the app also:
268
273
  - creates the database role `app_<alias>` with `SELECT/INSERT/UPDATE/DELETE` on all tables,
269
274
  `USAGE` on sequences and `EXECUTE` on functions in the schema, plus **default privileges**,
270
275
  so tables you create later (as the owner, e.g. in the SQL Workshop) are usable by the app straight away;
271
- - creates page 1 *Home*, a navigation entry, and an authorization scheme `ADMIN` (role `admin`);
276
+ - creates page 1 *Home*, a navigation entry, and an authorization scheme `ADMIN` (role `admin`); (sprint 88) the home
277
+ page is a hero with the name and icon on the page background and a card per page, each with a colour band and its
278
+ icon in a round badge; the version is *Release 1.0*;
272
279
  - shows a progress message while it works and then opens the new application's page in the builder,
273
280
  with what was created (and anything left out) as a message.
274
281
 
@@ -539,6 +546,11 @@ its pages in four groups.
539
546
 
540
547
  ## The page designer
541
548
 
549
+ (sprint 86) A page's address in the page designer is its application's id and its number:
550
+ `/builder/apps/<app id>/pages/<page number>`, with `?c=region-<id>` (and so on) for the selected
551
+ component, so a link names the page you mean. The older `/builder/pages/<internal id>` still works:
552
+ a browser that opens it is sent to the page's number.
553
+
542
554
  The page designer has three panes, as in APEX's Page Designer. From 1024 pixels wide they sit
543
555
  side by side; on phones and portrait tablets they are tabs (**Tree**, **Layout**, **Properties**):
544
556
  choosing a component opens the Properties tab.
@@ -567,8 +579,12 @@ choosing a component opens the Properties tab.
567
579
  *Create dynamic action*, *Create region below*, **Duplicate** (a copy right after it; a region comes with its
568
580
  items and buttons, names get `_2`), **Copy to other page…** (to the end of a page of the same application; items
569
581
  named `P<n>_` get that page's number, a region's buttons and items come along, references in SQL are not changed),
570
- *Expand all below*, *Collapse all below* and *Delete*. The arrow keys move through the menu, Escape closes it.
571
- APEX's *Create Sub Region* (pgkiln has no nested regions) and *Comment Out* (use a build option) are not there.
582
+ *Expand all below*, *Collapse all below*, (sprint 90) **Comment out** and *Delete*. The arrow keys move through the
583
+ menu, Escape closes it. **Comment out** (APEX's) leaves a component (a region, item, button, dynamic action,
584
+ validation, process, computation or branch) out of the page without deleting it: it gets the
585
+ [build option](#shared-components) `COMMENTED_OUT`, made with the status *Exclude* when first needed, and is struck
586
+ through in the tree; **Uncomment** takes it off again (another build option of the component is left alone).
587
+ APEX's *Create Sub Region* is not there: pgkiln has no nested regions.
572
588
  - **Middle: the Layout**: the page template's display positions as labelled zones (Banner, Breadcrumb bar,
573
589
  the side column of a side-column template beside the Body, Footer), each with its regions on the 12-column
574
590
  grid, each region with its items and its buttons in their button positions, as they will be placed on the page; under it a **gallery** of region types, item types
@@ -692,6 +708,7 @@ out, other keys are kept, columns the query no longer returns stay listed so you
692
708
  | `ai_assistant` | The AI service (those the application may use), system prompt, welcome text, placeholder, error message, tool rounds per question, questions per conversation, public or not, and the context queries and tools as JSON (checked when saving: query shapes, parameter types, REST data sources and authorization schemes that exist) ([AI assistant](04-pages-and-regions.md#ai_assistant-ai-assistant)) |
693
709
  | `report` (also) | *Ask in your own words (AI)*: the AI service and placeholder of the [natural-language filters](04-pages-and-regions.md#natural-language-filters-ask-in-your-own-words) |
694
710
  | `data_reporter` | Data sources (a table or view each: static id, label, description, offered columns with labels and format masks), who may share reports, rows per page ([Data Reporter](04-pages-and-regions.md#data_reporter-data-reporter)) |
711
+ | `form_designer` | Who may design forms (an authorization scheme), data sources (a table or view each: static id, label, description, key column, may add / change / delete rows, offered columns with labels and lists of values), rows per page ([Form Designer](04-pages-and-regions.md#form_designer-form-designer)) |
695
712
 
696
713
  Links, lists of values and the facets' report are checked when saving: a form can only point to
697
714
  pages and shared lists of values of the same application, and to report regions on the same page.
@@ -867,6 +884,11 @@ is the earlier page: every component in one rail, with **Access control** next t
867
884
  | **Lists of values** | Reusable queries for select lists, referenced as `LOV:NAME` |
868
885
  | **Application items** | Session variables not on any page, set only by server-side code |
869
886
  | **Application processes** | Code that runs *after login* or *before every page* |
887
+ | **Component groups** | Sets of a library application's components that other applications subscribe to at once ([below](#component-groups)) |
888
+ | **Component settings** | Defaults of built-in component types: rows per page, list of values rows, stars ([below](#component-settings)) |
889
+ | **Report queries** | Named queries printed as PDF, Excel, CSV, JSON, XML or HTML with `?doc=NAME` ([chapter 16](16-files.md#report-queries)) |
890
+ | **Shortcuts** | Named texts: `"NAME"` in static content, help texts and confirm messages ([chapter 2](02-concepts.md#shortcuts-name)) |
891
+ | **Application computations** | Computations of (application) items for every page: at sign-in, before every page, after every submit ([chapter 6](06-processing.md#application-computations)) |
870
892
  | **REST modules** | REST endpoints (method, path, SQL) served by pgkiln, with an OpenAPI description ([chapter 13](13-rest-api.md#rest-modules-in-the-builder)) |
871
893
  | **Workflows** | Multi-step processes of tasks, SQL, web service calls (invoke API), decisions, waits and parallel branches, with versions and a diagram ([chapter 6](06-processing.md#workflows)) |
872
894
  | **Task definitions** | Approvals and action tasks: subject, owners, administrators, due date, the SQL that runs on completion ([chapter 6](06-processing.md#approvals-and-the-task-list)) |
@@ -907,6 +929,33 @@ log (`subscription`). A subscribed list of values that uses a REST data source n
907
929
  with the same name in the subscribing application. Subscriptions are links between the
908
930
  applications of this installation and are not exported (the type is).
909
931
 
932
+ #### Component groups
933
+
934
+ **Shared Components → Component Groups** (APEX: Component Groups, migration 105) names a set of a
935
+ theme or library application's components, as `kind:name`: `lov:JOBS, authz_scheme:MANAGER,
936
+ build_option:FEATURE_EXPORT, template_component:status_badge, list:SHORTCUTS`. Saving checks that
937
+ the application has each one (and keeps its name as the application spells it). Another
938
+ application of the same workspace subscribes to the whole group on its Subscriptions page
939
+ (*Subscribe to a component group*): each component is copied and subscribed as above, and a member
940
+ the library no longer has is skipped and named in the message. Groups are exported with the
941
+ application (`shared/component-groups/`).
942
+
943
+ ### Component settings
944
+
945
+ **Shared Components → Component Settings** (APEX: Component Settings, migration 105) are the
946
+ application's defaults for its built-in component types, used where a component sets nothing itself
947
+ (`meta.app.component_settings`, exported with the application):
948
+
949
+ | Setting | pgkiln's default | Bounds |
950
+ |---|---|---|
951
+ | Reports: rows per page (`report_rows`) | 15 | 1–1,000 |
952
+ | Interactive grids: rows per page (`grid_rows`) | 25 | 1–200 |
953
+ | Popup lists of values: rows per page (`popup_lov_rows`) | 25 | 1–100 |
954
+ | Lists of values: maximum rows (`lov_max_rows`) | 5,000 | 1–50,000 |
955
+ | Star ratings: stars (`rating_max`) | 5 | 3–10 |
956
+
957
+ A value out of its bounds (an edited export, say) is ignored: the default applies.
958
+
910
959
  ### Supporting objects
911
960
 
912
961
  APEX's *Supporting Objects*: SQL scripts that create, upgrade or remove what the application needs
@@ -979,7 +1028,9 @@ on Definition (`?tab=…` opens another). *Save settings* saves the first five t
979
1028
  you were on. The Security tab shows only the fields of the chosen authentication type (HTTP header, database
980
1029
  accounts or custom).
981
1030
 
982
- - **Application**: name, alias, home page.
1031
+ - **Application**: name, alias, home page, and (sprint 88) the **version** (APEX: Version, e.g. *Release 1.0*): shown
1032
+ at the bottom of the application's pages, next to *Back to top*. New applications start at *Release 1.0*; empty: no
1033
+ version in the footer.
983
1034
  - **Security**: authentication (*App users*, *HTTP header*, *Database accounts*, *Custom* or
984
1035
  *None*), the database role, and **debug mode** (shows full database errors to users; development
985
1036
  only). The state of the [debug messages](06-processing.md#debug-messages) is shown below it,
@@ -1209,17 +1260,22 @@ others (Quick SQL, Query Builder, Load and Unload Data, Sample Data, DDL, Compar
1209
1260
  statements are allowed; the result of the last one is shown (up to 500 rows). Press
1210
1261
  **Ctrl/Cmd + Enter** to run. The [code editor](#the-code-editor) suggests every schema, table,
1211
1262
  column and function the owner sees.
1212
- - **Object Browser** (APEX's): the **schema** in the header (the session's schema by default) and a tree with a
1263
+ - **Object Browser** (APEX's): the **schema** in the header and a tree with a
1213
1264
  folder per object type (tables, views, materialized views, indexes, sequences, types, functions, procedures,
1214
1265
  triggers) and a **filter** by name. pgkiln's own schemas (`meta`, `pgkiln_plugins`) and objects that belong to an
1215
1266
  extension show only with **Show system objects**. **Create** (and the tiles shown when nothing is selected) opens
1216
1267
  SQL Commands with a CREATE TABLE, VIEW, FUNCTION, SEQUENCE or INDEX statement to fill in. A table opens in tabs:
1217
- **Columns** (with comments; *Add*, *Rename* and *Drop column* write the ALTER TABLE statement into SQL Commands to
1218
- review and run: nothing changes until you press Run), **Data** (25 rows a page), **Indexes**, **Constraints**
1268
+ **Columns** (with comments; the toolbar's *Add*, *Modify* (type, nulls, default), *Rename* and *Drop column* write
1269
+ the ALTER TABLE statement into SQL Commands to review and run: nothing changes until you press Run), **Data** (25
1270
+ rows a page; NULL is a blank cell), **Indexes**, **Constraints**
1219
1271
  (primary key, foreign keys with the table they refer to, unique, check), **Triggers**, **Grants**, **Row level
1220
1272
  security** (on or off, the policies), **Dependencies** (views and foreign keys that use it, and what it uses),
1221
1273
  **Statistics** (rows, sizes, analyze and vacuum times) and **DDL**. A view has the same tabs where they apply; a
1222
- function or procedure shows its source, a trigger, index, sequence or type its definition.
1274
+ function or procedure shows its source, a trigger, index, sequence or type its definition. (sprint 89) The tabs stay
1275
+ on one row: Columns, Data, Indexes, Constraints and DDL (and the current one), the others under **More**. The
1276
+ schema shown is the one you chose last (remembered for the session), else the session's schema of SQL Commands,
1277
+ else the **parsing schema** of the application changed last in your workspace (the schema its database role
1278
+ uses).
1223
1279
  - **SQL Scripts**: saved scripts, shared by the developers of the workspace. Create one in the editor, upload a
1224
1280
  `.sql` file (UTF-8, up to 5 MB) or save one from Quick SQL; download it again as `.sql`. **Run**
1225
1281
  splits the script into statements at semicolons (outside strings, comments, quoted identifiers,
@@ -1325,7 +1381,7 @@ imports as empty. Import refuses other formats.
1325
1381
  | Section | Contents |
1326
1382
  |---|---|
1327
1383
  | `app` | the application's settings (name, alias, home page, authentication, theme, languages, …) |
1328
- | `authz_schemes`, `app_items`, `app_processes`, `lovs` | shared components |
1384
+ | `authz_schemes`, `app_items`, `app_processes`, `app_computations`, `shortcuts`, `report_queries`, `component_groups`, `lovs` | shared components |
1329
1385
  | `group_roles` | identity-provider group → role mappings |
1330
1386
  | `text_messages`, `translations` | globalization |
1331
1387
  | `report_layouts` | report layouts; the logo as base64 |
@@ -456,7 +456,9 @@ page). Regions with `"master": {"item": …}` are its details: they use the item
456
456
  select empno, ename, job, sal from hr.emp where deptno = :P27_DEPTNO::int
457
457
  ```
458
458
 
459
- and show *"Select a row above"* until a row is selected. With JavaScript the details are
459
+ and show *"Select a row above"* until a row is selected. As in APEX, the page opens with the
460
+ master's first row selected, and a search or filter that leaves the selected row out selects the
461
+ first row it shows (a region placed above its master still waits for a selection). With JavaScript the details are
460
462
  refreshed in place (`GET …/region/:id`, no page reload); without, the link reloads the page.
461
463
  The selection is a signed link (bound to the application, page, user, region and value), so a
462
464
  user can only select a row the server showed them; the item is not taken from the URL or a
@@ -480,6 +482,13 @@ on its new rows (and never lets users edit it); saving new rows without a select
480
482
  The developer's `hidden` columns can't be grouped, charted or shown in the single row view.
481
483
  After **Save** the grid comes back as it was: its search, page, sort and view.
482
484
 
485
+ **Navigation and edit mode** (APEX). With JavaScript an editable cell reads as text, with its
486
+ column's format mask (*2,850.00*) or the list's display value, until it is edited: click it, or
487
+ press Enter or F2 on it, or start typing (which replaces the value). On a cell the arrow keys move
488
+ to the next cell; while editing, Escape goes back to the cell and Enter moves to the cell below.
489
+ The control keeps the raw value; Tab moves through the controls as before. On a phone, where the
490
+ rows are cards, the fields show as fields.
491
+
483
492
  **Copy and paste.** Click a cell and Shift+click another to select a range; Ctrl+C copies it
484
493
  as tab-separated text (which spreadsheets paste as cells). Ctrl+V pastes such text (from a
485
494
  spreadsheet or another grid) from the focused cell on, adding rows when the grid allows inserts;
@@ -810,7 +819,9 @@ Counts take the search and all *other* facets into account. Three kinds of facet
810
819
 
811
820
  - **checkbox** (the default): the most frequent values of a column, each with a checkbox; after the seventh
812
821
  the rest sit under *Show all (n)* (open when one of them is chosen), and a boolean's values read *Yes* and
813
- *No*. With
822
+ *No*. Its ⋮ menu (APEX: the facet's menu) has *Clear* (when values are chosen) and *Sort by count* (the
823
+ default) or *Sort by name*; the order is a URL parameter (`r<report id>_fo_<column>=name`) that Apply and
824
+ Reset keep. With
814
825
  `"exclude": true` the facet gets an *Exclude the selected values* switch: the chosen values are
815
826
  then left out instead (rows where the column is empty stay).
816
827
  - **range**: a number or date column in ranges, as radio buttons ("Any", then each range). A
@@ -1118,7 +1129,7 @@ Attributes (the region's **Settings** in the page designer):
1118
1129
  | Key | Meaning |
1119
1130
  |---|---|
1120
1131
  | `list` | The list's name (upper case) |
1121
- | `template` | `links` (default: nested links), `badges` (a row of tiles with the badge as the value), `cards` (a card per entry with its description), `tabs` (the top-level entries as tabs) or `wizard_progress` (numbered steps: the entry of the current page is the current step, the ones before it are done and link back; APEX: Wizard Progress) |
1132
+ | `template` | `links` (default: nested links), `badges` (a row of tiles with the badge as the value), `cards` (a card per entry with its description; (sprint 88) a colour band and the icon in a round badge, in the chart palette's order), `tabs` (the top-level entries as tabs) or `wizard_progress` (numbered steps: the entry of the current page is the current step, the ones before it are done and link back; APEX: Wizard Progress) |
1122
1133
 
1123
1134
  The HR example's page 31 (Shortcuts) shows a static list with each template (with a badge from an
1124
1135
  item, child entries, a manager-only entry and one of an excluded build option) and a department
@@ -1189,6 +1200,76 @@ region when an application is replaced. The HR example's page 36 (*My reports*)
1189
1200
  (a view without the user name and photo columns) and leave requests (row level security: an
1190
1201
  employee sees only their own), with King's shared report *Salary by department*.
1191
1202
 
1203
+ ### `form_designer` (Form Designer)
1204
+
1205
+ A **Form Designer** region (sprint 85; pgkiln's own, APEX has no counterpart) lets the application's
1206
+ administrators build their own data entry forms in the running application, without a developer
1207
+ and without a new release. Like the [Data Reporter](#data_reporter-data-reporter), the developer
1208
+ decides *what* may be edited; the administrators decide *how* the forms look and who uses them.
1209
+
1210
+ **The developer** places the region (page designer gallery: *Form Designer*) and, in its
1211
+ **Settings**, chooses **who may design forms** (an [authorization scheme](08-security.md); without
1212
+ one nobody can) and adds **data sources**: a table or view each (pgkiln's own `meta` schema and the
1213
+ system schemas are never offered), with a static id, a label and a description. Per source:
1214
+
1215
+ - the **columns** forms may show and change, with a label and, for a select list or radio group,
1216
+ a **list of values**: a shared one of the application (`LOV:NAME`) or `STATIC:Display;value,…`
1217
+ (never SQL: designers can't write queries);
1218
+ - the **key column** that identifies a row (the primary key of a new table; choose one for a view),
1219
+ needed to change and delete rows;
1220
+ - what forms on it **may** do at most: **add**, **change** and **delete** rows.
1221
+
1222
+ A new source offers all its columns except binary and JSON ones, allows adding and (with a key)
1223
+ changing rows, never deleting. Untick generated keys and audit columns; the builder warns when the
1224
+ application's database role lacks a privilege a source needs.
1225
+
1226
+ **Designers** (users that pass the scheme) see *New form* and a *Design form* link under each
1227
+ form. The designer is a plain form (it works without JavaScript): a name, a description, what
1228
+ users may do (within what the source allows) and a row per offered column: *On the form*,
1229
+ *Order*, *Label*, *Help text*, *Required*, *Display* (a field by the column's type; a text area for
1230
+ text; a select list or radio group for a column with a list of values) and a *Default* for new
1231
+ rows, and *In the list* for the columns of the form's list of rows. A form is a **draft** until
1232
+ *Published* is ticked: only designers see drafts.
1233
+
1234
+ **Users** see the published forms as cards. A form with list columns opens on its rows (newest
1235
+ first, paged, `page_size`) with *Add* and an *Edit* link per row; a form without list columns
1236
+ only adds rows: it opens on an empty form, and after *Save* on the next empty one. Fields follow
1237
+ the column's type: a number field, the [date picker](05-items.md#the-date-picker) in the
1238
+ application's date format for dates, the browser's date and time field for timestamps, a
1239
+ checkbox for booleans.
1240
+
1241
+ How it stays safe:
1242
+
1243
+ - rows are read and written as the **application's database role**: grants and [row level
1244
+ security](08-security.md) apply (in the HR example an employee changes only their own meetings);
1245
+ - a form's definition is checked against the region's settings before it renders or saves: only
1246
+ offered columns that exist and can be read, displays the column's type allows, actions the
1247
+ source allows; anything else is dropped. Only the form's fields are written; identifiers are
1248
+ only the developer's schema, table and column names, always quoted; values and row keys are
1249
+ always parameters; a value of a list of values must be in the list;
1250
+ - **lost updates** are refused: a row changed since its form was opened is not overwritten (the
1251
+ user sees what they typed, with a message);
1252
+ - forms are stored in `meta.user_form`, reached by applications only through the view
1253
+ `meta.user_forms` (the forms of the application) and the functions `meta.save_user_form` /
1254
+ `meta.delete_user_form`; saving rows and forms needs the CSRF token and a region the user can
1255
+ see, designing also the region's authorization scheme. Every saved, changed or deleted row and
1256
+ form is in the activity log (event `form_designer`).
1257
+
1258
+ Attributes (written by the region's **Settings**):
1259
+
1260
+ | Key | Default | Meaning |
1261
+ |---|---|---|
1262
+ | `sources` | | `[{"id": "orders", "label": "Orders", "description": "…", "schema": "sales", "table": "orders", "key": "id", "columns": [{"name": "customer", "label": "Customer"}, {"name": "status", "lov": "LOV:ORDER_STATUS"}], "insert": true, "update": true, "delete": false}]` |
1263
+ | `design_authz` | | The authorization scheme designers pass; none: nobody designs |
1264
+ | `page_size` | `25` | Rows per page of a form's list (5 to 200) |
1265
+ | `empty` | `No data found.` | Text when a form's list has no rows |
1266
+
1267
+ The sources travel with the application export (they are the region's attributes); the forms are
1268
+ data of the installation, like Data Reporter reports: not exported, and they stay with their
1269
+ region when an application is replaced. The HR example's page 45 (*Forms*, under Administration)
1270
+ offers departments, meetings and employees (changing only) to administrators, with the published
1271
+ forms *Departments* and *Book a meeting*.
1272
+
1192
1273
  ### `ai_assistant` (AI assistant)
1193
1274
 
1194
1275
  An **AI assistant** region (APEX: AI Assistant, AI agents and tools) is a chat with an
@@ -11,7 +11,7 @@ page, optionally inside a region. Name them `P<page>_<NAME>` (uppercase letters,
11
11
  | `text` | text field | text |
12
12
  | `textarea` | multi-line text (always full width) | text |
13
13
  | `number` | number field (numeric keyboard on phones) | e.g. `1250.50` |
14
- | `date` | date picker: the browser's, or (sprint 76) with an application date format or a date format mask on the item a text field in that format with a calendar button; typed dates are read back in the format | `YYYY-MM-DD` |
14
+ | `date` | a text field in the item's date format mask, else the application's date format, else `YYYY-MM-DD`, with pgkiln's [date picker](#the-date-picker) (sprint 84; was the browser's); typed dates are read back in the format | `YYYY-MM-DD` |
15
15
  | `datetime` | date-time picker | `YYYY-MM-DDTHH:MM` |
16
16
  | `email`, `tel`, `url` | typed fields with the matching phone keyboard | text |
17
17
  | `password` | password field; never shown back, empty = unchanged | text |
@@ -31,7 +31,7 @@ page, optionally inside a region. Name them `P<page>_<NAME>` (uppercase letters,
31
31
  | `markdown` | Markdown textarea with a toolbar; shown formatted when read-only | the Markdown text |
32
32
  | `rating` | star rating (radio buttons drawn as stars) | `1` … `max` (default 5) |
33
33
  | `combobox` | free text with suggestions from the list of values; several values become tags | **colon-separated** values, e.g. `SQL:Sales` |
34
- | `daterange` | two date pickers, *From* and *To* | `from:to`, e.g. `2026-01-01:2026-06-30` |
34
+ | `daterange` | two date fields, *From* and *To*, in the date format with the date picker (the picker keeps *From* on or before *To*) | `from:to`, e.g. `2026-01-01:2026-06-30` |
35
35
  | `qrcode` | display only: the value as a QR code (SVG drawn on the server) | whatever was set |
36
36
  | `image` | display only: a picture from a URL in the value, or a BLOB from a query ([Display image](#display-image-and-geocoded-address)) | a URL, or nothing |
37
37
  | `address` | a text field with *Check address*: the installation's geocoder offers matching addresses ([Geocoded address](#display-image-and-geocoded-address)) | the address as text |
@@ -51,6 +51,18 @@ where hiredate between nullif(split_part(:P20_PERIOD, ':', 1), '')::date
51
51
  and coalesce(nullif(split_part(:P20_PERIOD, ':', 2), '')::date, 'infinity')
52
52
  ```
53
53
 
54
+
55
+ ### The date picker
56
+
57
+ (sprint 84; APEX: the date picker) A date item, a date range item, an interactive grid's date cell and a
58
+ faceted search's own date range and the task list's vacation rule are text in the date format: the item's date format mask, else the
59
+ application's date format (Settings → Globalization), else `YYYY-MM-DD`. The calendar button next to the
60
+ field (or Alt+↓ in it) opens a month of days under it: the chosen day marked, today outlined, the week
61
+ starting on the language's first day. Arrow keys move a day or a week, Page Up and Page Down a month
62
+ (with Shift a year), Home and End to the week's first and last day, Enter or Space choose, Escape
63
+ closes; *Today* and *Clear* below. Typed dates are read back in the format (and `YYYY-MM-DD` always
64
+ works), so the field works without JavaScript. Timestamp items and grid timestamp cells still use the
65
+ browser's date and time field.
54
66
  ## Properties
55
67
 
56
68
  | Property | Meaning |
@@ -503,6 +503,28 @@ savepoint. A failing computation before the page is shown leaves the item as it
503
503
  error on the page; after a submit it stops the submit (everything is rolled back) and shows the
504
504
  error, like a failing process.
505
505
 
506
+ ### Application computations
507
+
508
+ **Shared Components → Application Computations** (APEX: Application Computations) are
509
+ computations for every page of the application, with the same types, conditions, authorization
510
+ and build option as a page's (migration 102, `meta.app_computation`). Their `point`:
511
+
512
+ | `point` | When |
513
+ |---|---|
514
+ | `after_authentication` | Once, when a user signs in (after the application processes `after_login`) |
515
+ | `before_header` | Every page shown, before the page's own `before_header` computations |
516
+ | `after_submit` | Every page submitted, before the page's own `after_submit` computations (and the validations) |
517
+
518
+ They usually set **application items**, e.g. a user's sales region once at sign-in:
519
+
520
+ ```sql
521
+ select region from sales.rep where lower(username) = lower(:APP_USER) -- AI_REGION, sql_query, after_authentication
522
+ ```
523
+
524
+ An application computation of a page item runs on that item's page only (elsewhere it is skipped,
525
+ without the *unknown item* error a page's computation gives). A failing one behaves like a page
526
+ computation at the same point.
527
+
506
528
  ## Branches
507
529
 
508
530
  After a successful submit pgkiln redirects (POST-redirect-GET). **Branches** decide where to: the
@@ -387,6 +387,19 @@ runtime role, never exported) ([chapter 19](19-rest-data-sources.md#web-credenti
387
387
 
388
388
  **`app_process`**: `app_id`, `seq`, `name`, `point` (`after_login` / `before_page`), `code`, `authz`.
389
389
 
390
+ **`app_computation`** (102): `app_id`, `seq`, `item_name`, `point` (`after_authentication` / `before_header` /
391
+ `after_submit`), `type`, `expression`, `condition_type`, `condition_expr`, `condition_value`, `authz`, `build_option`,
392
+ `comments` ([chapter 6](06-processing.md#application-computations)).
393
+
394
+ **`shortcut`** (103): `app_id`, `name` (uppercase, unique per app), `type` (`text` / `html` / `function_body`), `value`,
395
+ `comments` ([chapter 2](02-concepts.md#shortcuts-name)).
396
+
397
+ **`report_query`** (104): `app_id`, `name` (uppercase, unique per app), `description`, `query`, `format` (`pdf` / `xlsx` /
398
+ `csv` / `json` / `xml` / `html`), `layout`, `file_name`, `title`, `authz`, `comments` ([chapter 16](16-files.md#report-queries)).
399
+
400
+ **`component_group`** (105): `app_id`, `name`, `description`, `members` (`text[]` of `kind:name`) ([chapter 3](03-builder.md#component-groups)).
401
+ `meta.app.component_settings` (105): `report_rows`, `grid_rows`, `popup_lov_rows`, `lov_max_rows`, `rating_max` ([chapter 3](03-builder.md#component-settings)).
402
+
390
403
  **`build_option`**: `app_id`, `name` (uppercase, unique per app), `status` (`include` / `exclude`),
391
404
  `description` ([chapter 6](06-processing.md#build-options)). `meta.build_option_on(app_id, ref)`
392
405
  tells whether a component with that `build_option` value is part of the application.
@@ -414,7 +427,7 @@ navigation entries and application processes have the same `build_option` column
414
427
  | Column | Description |
415
428
  |---|---|
416
429
  | `page_id`, `seq`, `title` | |
417
- | `type` | `report`, `grid`, `form`, `chart`, `cards`, `calendar`, `facets`, `smart_filters`, `display_selector`, `map`, `tree`, `template_component`, `list`, `data_reporter`, `ai_assistant`, `tasks`, `workflows`, `static`, `dynamic` |
430
+ | `type` | `report`, `grid`, `form`, `chart`, `cards`, `calendar`, `facets`, `smart_filters`, `display_selector`, `map`, `tree`, `template_component`, `list`, `data_reporter`, `form_designer`, `ai_assistant`, `tasks`, `workflows`, `static`, `dynamic` |
418
431
  | `source` | SELECT (or HTML for `static`) |
419
432
  | `table_name`, `pk_column` | For `form` and `grid` |
420
433
  | `pk_item` | For `form`: the item holding the key |
@@ -169,7 +169,8 @@ Tips:
169
169
  together.
170
170
  - **Errors are hidden by default**: unexpected errors show a reference number unless the app is in
171
171
  debug mode.
172
- - **Dates**: date items use ISO format (`2026-10-01`) and the browser's date picker; format masks
172
+ - **Dates**: date items, date ranges, grid date cells and facet ranges are text in the application's date format
173
+ (else ISO, `2026-10-01`) with pgkiln's date picker; format masks
173
174
  apply to report, grid and cards columns and to number and display items
174
175
  ([number formats](14-globalization.md#number-formats)).
175
176
  - **Modal pages** open over the calling page, and close and refresh it after a successful submit,