pgkiln 0.42.0 → 0.43.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 (52) hide show
  1. package/db/migrations/099_layout_positions.sql +29 -0
  2. package/docs/apex-feature-parity.md +34 -7
  3. package/docs/guide/03-builder.md +67 -13
  4. package/docs/guide/04-pages-and-regions.md +46 -3
  5. package/docs/guide/05-items.md +1 -1
  6. package/docs/guide/09-reference.md +4 -1
  7. package/docs/guide/12-development.md +2 -1
  8. package/package.json +1 -1
  9. package/public/app.css +58 -0
  10. package/public/app.js +183 -0
  11. package/public/builder.css +112 -0
  12. package/public/builder.js +280 -3
  13. package/src/builder/arrange.ts +133 -17
  14. package/src/builder/components.ts +28 -22
  15. package/src/builder/designer.ts +67 -18
  16. package/src/builder/forms.ts +4 -1
  17. package/src/builder/object-browser.ts +342 -0
  18. package/src/builder/pwa.ts +3 -3
  19. package/src/builder/routes.ts +85 -26
  20. package/src/builder/shared.ts +103 -1
  21. package/src/builder/sql.ts +13 -65
  22. package/src/builder/ui.ts +21 -6
  23. package/src/i18n/ar.ts +16 -0
  24. package/src/i18n/cs.ts +16 -0
  25. package/src/i18n/da.ts +16 -0
  26. package/src/i18n/de.ts +16 -0
  27. package/src/i18n/el.ts +16 -0
  28. package/src/i18n/es.ts +16 -0
  29. package/src/i18n/fi.ts +16 -0
  30. package/src/i18n/fr.ts +16 -0
  31. package/src/i18n/he.ts +16 -0
  32. package/src/i18n/it.ts +16 -0
  33. package/src/i18n/ja.ts +16 -0
  34. package/src/i18n/ko.ts +16 -0
  35. package/src/i18n/nb.ts +16 -0
  36. package/src/i18n/pl.ts +16 -0
  37. package/src/i18n/pt.ts +16 -0
  38. package/src/i18n/ru.ts +16 -0
  39. package/src/i18n/sv.ts +16 -0
  40. package/src/i18n/tr.ts +16 -0
  41. package/src/i18n/uk.ts +16 -0
  42. package/src/i18n/zh.ts +16 -0
  43. package/src/i18n.ts +32 -0
  44. package/src/metadata.ts +5 -1
  45. package/src/runtime/engine.ts +6 -0
  46. package/src/runtime/format.ts +52 -0
  47. package/src/runtime/items.ts +27 -0
  48. package/src/runtime/locale.ts +3 -0
  49. package/src/runtime/regions.ts +36 -2
  50. package/src/runtime/render.ts +20 -4
  51. package/src/runtime/report.ts +134 -79
  52. package/src/runtime/routes.ts +34 -3
@@ -0,0 +1,29 @@
1
+ -- =====================================================================
2
+ -- 099: display positions, button positions and side-column page templates
3
+ -- (sprint 77; APEX: a region's Layout → Position, a button's Layout →
4
+ -- Button Position, the Left / Right Side Column page templates)
5
+ --
6
+ -- meta.region.position: where the region shows on the page: banner (above
7
+ -- everything), breadcrumb (the bar under the title), left or right (the side
8
+ -- column of a side-column page template; on other pages in the body, in
9
+ -- sequence), body (the default) or footer (after the body). Null is body.
10
+ -- meta.button.slot: where a region's button shows: create, edit, change,
11
+ -- copy, help or up (the region's top bar), previous, close or delete (the
12
+ -- bottom bar, on the left), next (the bottom bar, on the right) or region
13
+ -- (with the region's other buttons, as before). Null is region.
14
+ -- meta.page.page_template: left_side_column and right_side_column too.
15
+ --
16
+ -- The columns are nullable (older exports and imports leave them null) and
17
+ -- travel with an application's export like its other columns.
18
+ -- =====================================================================
19
+ alter table meta.region add column position text
20
+ check (position in ('banner', 'breadcrumb', 'left', 'body', 'right', 'footer'));
21
+ comment on column meta.region.position is 'Where the region shows (099): banner, breadcrumb, left, body (null), right or footer.';
22
+
23
+ alter table meta.button add column slot text
24
+ check (slot in ('create', 'edit', 'change', 'copy', 'help', 'up', 'previous', 'close', 'delete', 'next', 'region'));
25
+ comment on column meta.button.slot is 'Where a region''s button shows (099): the top bar (create, edit, change, copy, help, up), the bottom bar (previous, close, delete; next on the right) or with the other buttons (region, null).';
26
+
27
+ alter table meta.page drop constraint page_page_template_check;
28
+ alter table meta.page add constraint page_page_template_check
29
+ check (page_template in ('standard', 'minimal', 'left_side_column', 'right_side_column'));
@@ -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 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-14 (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,8 +38,8 @@ 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 |
42
- | Shared components | ✅ | 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 |
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 |
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 |
45
45
  | Working copies, merge, team development | ✅ | **Working copies** of an application ([chapter 3](guide/03-builder.md#working-copies)): a second app on the same schema and data, compared three ways per component (settings, each shared component, page, region, item, …) with the main app as it was when copied; changes on one side merge, conflicts are chosen per component with a line diff; merge into the main app or refresh the copy, keeping users, sessions, saved reports, secrets and automation switches; locks respected. Conflicts are resolved per component, not per property |
@@ -61,7 +61,7 @@ two, REST source catalogs and the workspace export, with their features.)
61
61
  | APEX | pgkiln | Notes |
62
62
  |---|---|---|
63
63
  | Classic report | ✅ | `report` with `interactive: false` |
64
- | Interactive report | ✅ | 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) |
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
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)) |
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)) |
@@ -156,7 +156,7 @@ two, REST source catalogs and the workspace export, with their features.)
156
156
 
157
157
  | APEX | pgkiln | Notes |
158
158
  |---|---|---|
159
- | Universal Theme look and layout | ✅ | Header, side/top navigation, breadcrumbs, 12-column grid, region templates |
159
+ | Universal Theme look and layout | ✅ | Header, side/top navigation, breadcrumbs, 12-column grid, region templates. (sprint 77) Region display positions (banner, breadcrumb bar, left and right column, body, footer), the Left / Right Side Column page templates and button positions (create, edit, change, copy, help, up, previous, close, delete, next) ([chapter 4](guide/04-pages-and-regions.md#side-columns-and-display-positions)) |
160
160
  | Region templates (Carousel, Hero, Inline Dialog/Popup/Drawer, Wizard Container, Title Bar, Buttons Container, Login) | ✅ | Standard, plain and collapsible; (sprint 57) **hero**, **title bar**, **buttons container**, **inline dialog** and **inline drawer** (opened by the dynamic action *Open region* or a link to `#R<id>`), **wizard** with the list template **wizard progress**, and the **carousel** style of the display selector; dialog and drawer **pages**; the login page's **Login** region (sprint 55) ([chapter 4](guide/04-pages-and-regions.md#layout)). An inline popup (anchored to a button) is an inline dialog |
161
161
  | Warn on unsaved changes | ✅ | (sprint 50) A page attribute: the browser asks before the user leaves the page (links, redirect buttons, other forms, closing a dialog, closing or reloading the tab) while an item differs from the value it was shown with, also after a submit that failed; submitting doesn't ask; items opt out with `{"warn_unsaved": false}`; `pgkiln.isChanged()` (APEX: `apex.page.isChanged()`); on for the form pages the wizards make. The interactive grid keeps its own check ([chapter 4](guide/04-pages-and-regions.md#warn-on-unsaved-changes)). No per-button "do not check" |
162
162
  | Responsive: phone, tablet, desktop | ✅ | Tested at 390, 768, 1024 and 1440px on every change (`npm run test:e2e`) |
@@ -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 |
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 |
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
 
@@ -184,7 +184,7 @@ two, REST source catalogs and the workspace export, with their features.)
184
184
 
185
185
  | APEX | pgkiln | Notes |
186
186
  |---|---|---|
187
- | SQL Workshop: SQL commands, object browser | ✅ | (sprint 61) A **home page** like APEX's: tiles, recently created tables, your recent SQL commands and the workspace's recent scripts, and the session's **default schema** (first in the search path of SQL Commands and Scripts). The object browser shows columns, RLS policies, grants, data and function source. (sprint 62) **Utilities** like APEX's: the tools on one page, **Object Reports** (tables without a primary key, unindexed foreign keys, row-level security without policies or not enabled, PUBLIC grants, unused indexes, largest tables, missing comments), **About Database** and a **Database Monitor** of sessions and blocked queries for administrators. **Missing:** a recycle bin (PostgreSQL has none), user interface defaults (pgkiln's wizards read the catalog and comments) |
187
+ | SQL Workshop: SQL commands, object browser | ✅ | (sprint 61) A **home page** like APEX's: tiles, recently created tables, your recent SQL commands and the workspace's recent scripts, and the session's **default schema** (first in the search path of SQL Commands and Scripts). (sprint 75) The **Object Browser** like APEX's: a schema in the header, a tree by object type (tables, views, materialized views, indexes, sequences, types, functions, procedures, triggers) with a filter and a Create menu, system and extension objects hidden unless asked, and a table in tabs (columns with Add/Rename/Drop column writing the ALTER TABLE to review, data in pages, indexes, constraints, triggers, grants, row level security, dependencies, statistics, DDL); the tools as main tabs and a More menu. (sprint 62) **Utilities** like APEX's: the tools on one page, **Object Reports** (tables without a primary key, unindexed foreign keys, row-level security without policies or not enabled, PUBLIC grants, unused indexes, largest tables, missing comments), **About Database** and a **Database Monitor** of sessions and blocked queries for administrators. **Missing:** a recycle bin (PostgreSQL has none), user interface defaults (pgkiln's wizards read the catalog and comments) |
188
188
  | RESTful services (ORDS) | ✅ | [PostgREST](https://postgrest.org) next to pgkiln: `api` schema, the same RLS as the UI, per-app API role, tokens in the builder, a pre-request check, and **OAuth clients** (client credentials, like ORDS `oauth.create_client`) so tokens renew themselves |
189
189
  | REST handler editor, REST-enabled SQL | ✅ | **REST modules** in the builder: handlers (method, path with parameters, SQL as collection, item or statements, roles, public) served by pgkiln with bearer tokens and an OpenAPI description; plus PostgREST for schema-wide APIs. **Missing:** REST-enabled SQL (rarely desirable) |
190
190
  | SQL scripts, query builder, Quick SQL | ✅ | **SQL Scripts**: saved, upload/download, a result per statement, stop or continue on errors, optionally one transaction, run history. **Quick SQL** (a subset: tables, child tables, types, the main column directives, `/auditcols`, settings, views). A graphical **query builder**: tables as boxes on a canvas (dragged, placed where left), joins along foreign keys or drawn from column to column (inner or left), column functions with automatic `group by`, conditions, sort, open in SQL Commands; without JavaScript the same as forms ([chapter 3](guide/03-builder.md#sql-workshop)) |
@@ -304,3 +304,30 @@ report filters, App Builder AI and blueprints.
304
304
  Sources: [APEX 26.1 new features](https://docs.oracle.com/en/database/oracle/apex/26.1/htmrn/new-features.html),
305
305
  [What's new in APEX 24.2](https://apex.oracle.com/en/platform/features/whats-new-242/),
306
306
  [APEX_MAIL (APEX API reference)](https://docs.oracle.com/en/database/oracle/apex/24.2/aeapi/APEX_MAIL.html).
307
+
308
+ ## Shared Components: APEX links and pgkiln
309
+
310
+ (sprint 74) Every link of APEX 26.2's Shared Components page and where it is in pgkiln.
311
+
312
+ | APEX | pgkiln |
313
+ |---|---|
314
+ | 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 |
316
+ | Authentication Schemes | Settings → Security: one authentication per application (its type and fields); several schemes to switch between are ➖ not planned |
317
+ | Authorization Schemes, Access Control | The same names (Security) |
318
+ | Security Attributes, Session State Protection | Settings → Security and Sign-in; session state protection is per page (Page Designer → *Protection*) |
319
+ | Lists of Values, Lists, Email Templates, Supporting Objects, Subscriptions | The same names (Other Components) |
320
+ | 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.`) |
322
+ | 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 |
325
+ | Progressive Web App | Settings → Progressive Web App |
326
+ | 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) |
328
+ | REST Data Sources, Web Credentials, REST Enabled SQL, Data Load Definitions | The same names (Data Sources); REST Enabled SQL ➖ not planned (one database) |
329
+ | Workflows, Task Definitions, Automations | The same names |
330
+ | 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`) |
332
+ | AI Attributes, AI Services, AI Agents | AI Services; AI agents ➖ not planned |
333
+
@@ -462,6 +462,14 @@ they are **not** run until you choose to.
462
462
 
463
463
  ## App dashboard
464
464
 
465
+ (sprint 74) Above the pages: a **search** by page name or number (the rows filter while you type),
466
+ **Report** and **Icons** views, and **Create page** (the page wizards below). **Tasks** on the right: run the
467
+ application, create pages (also with AI), Shared Components, page groups, export, backups, supporting
468
+ objects, lock or delete the application.
469
+
470
+ The **default-password** warning shows on the App Builder home (and Developers) only; dismiss it with × until the
471
+ next sign-in. The avatar keeps a red dot until the password is changed.
472
+
465
473
  Open an application to see its pages, with region/item/dynamic-action/process counts,
466
474
  authorization and protection. The tabs under its name lead to **Shared Components**, **Activity**,
467
475
  **REST API**, **Settings**, **Search** and **Advisor**; **Export** and **Run** are on the right.
@@ -532,8 +540,11 @@ choosing a component opens the Properties tab.
532
540
 
533
541
  - **Left: the component tree**, with four tabs:
534
542
  - **Rendering**: the page, *Pre-Rendering* (branches, computations and processes that run
535
- before the page is shown), the
536
- **Regions** with their items and buttons, and page-level items and buttons;
543
+ before the page is shown), the regions by
544
+ [display position](04-pages-and-regions.md#side-columns-and-display-positions) (Banner, Breadcrumb bar,
545
+ Left column, Body, Right column, Footer: the page template's positions and any other that has regions)
546
+ with their items and buttons (by [button position](04-pages-and-regions.md#button-positions): *Buttons*,
547
+ *Buttons: Next*, …), and page-level items and buttons;
537
548
  - **Dynamic actions**, grouped by event (change, click, page load);
538
549
  - **Processing**: computations after submit, validations, processes and the branches (the
539
550
  [branch components](06-processing.md#branches) in sequence, then the buttons that go to
@@ -541,22 +552,36 @@ choosing a component opens the Properties tab.
541
552
  - **Shared components** the page can use (lists of values, authorization schemes, navigation,
542
553
  application items), linking to Shared Components.
543
554
 
544
- Icons show which components have an authorization scheme, a condition or a build option. Folders open and close
555
+ Icons show which components have an authorization scheme, a condition or a build option; type icons are coloured
556
+ by kind (regions, items, buttons, dynamic actions, processes). Folders open and close
545
557
  with a click; with the keyboard, the arrow keys walk the tree (Left / Right close and open a
546
558
  folder), Enter opens a component.
547
- - **Middle: the Layout**: the page's regions on the 12-column grid, each with its items and
548
- buttons, as they will be placed on the page; under it a **gallery** of region types, item types
559
+
560
+ **Right-click** a region, item or button in the Rendering tree (or press <kbd>Shift</kbd>+<kbd>F10</kbd> or the
561
+ menu key) for its menu (APEX: the tree's context menu): *Create page item*, *Create button* (in the region),
562
+ *Create dynamic action*, *Create region below*, **Duplicate** (a copy right after it; a region comes with its
563
+ items and buttons, names get `_2`), **Copy to other page…** (to the end of a page of the same application; items
564
+ named `P<n>_` get that page's number, a region's buttons and items come along, references in SQL are not changed),
565
+ *Expand all below*, *Collapse all below* and *Delete*. The arrow keys move through the menu, Escape closes it.
566
+ APEX's *Create Sub Region* (pgkiln has no nested regions) and *Comment Out* (use a build option) are not there.
567
+ - **Middle: the Layout**: the page template's display positions as labelled zones (Banner, Breadcrumb bar,
568
+ the side column of a side-column template beside the Body, Footer), each with its regions on the 12-column
569
+ 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
549
570
  and button actions. The middle pane also has a **Page search** tab (searches the application)
550
571
  a **Lock and comments** tab ([below](#page-locks-and-comments)) and a **Help** tab (layout keys and the substitution cheat sheet). Zoom in, zoom out and
551
572
  maximize (hides the side panes) are above the layout.
552
573
  - **Right: the property editor** for the selected component, grouped (Identification, Source,
553
574
  Layout, Security, …) with help text for each property. Type in **Filter** to show only the
554
575
  properties whose name contains the text (Escape clears it); click a group's name to fold it
555
- (remembered on this device). Under the properties, the **Help** pane (APEX: the Help tab) shows the
576
+ (remembered on this device). **Common** / **All** (APEX: Show Common / Show All) shows only the properties
577
+ most often set for regions, items and buttons, or all of them (remembered); **Go to group** jumps to a group
578
+ (opening the Attributes tab when the group is there). **Template options** open in a dialog from a button that
579
+ counts the chosen ones; they are saved with the other properties. Under the properties, the **Help** pane (APEX: the Help tab) shows the
556
580
  property that has the focus (or the pointer): its help, the name it is stored under in exports and
557
581
  application files, and a link to the guide section of the component's type.
558
582
 
559
- The toolbar has the page switcher (previous, a list of all pages, next), **Undo** / **Redo** of
583
+ The toolbar has the page switcher (previous, the page number: type or step to one and press Enter, a list of
584
+ all pages, next), **Undo** / **Redo** of
560
585
  layout changes, the **Create** menu (region, item, button, dynamic action, computation, validation,
561
586
  process, branch, or a new page), a **Utilities** menu (Advisor, search, shared components, all pages, export),
562
587
  **Save** (saves the property editor; it is highlighted when there are unsaved changes) and **Run**
@@ -586,7 +611,11 @@ region that no longer fits starts a new row.
586
611
 
587
612
  - **Drag a region** by its header to another place, or drag its right edge to make it wider or
588
613
  narrower.
589
- - **Drag an item or button** to another place in its region, to another region, or to *Page level*.
614
+ - **Drag a region into another position** (zone) to set its display position: e.g. a faceted search into
615
+ the *Left column* of a page with the Left side column template.
616
+ - **Drag an item or button** to another place in its region, to another region, or to *Page level*. While a
617
+ button is dragged, a region's empty [button positions](04-pages-and-regions.md#button-positions) (Create, Edit,
618
+ …, Previous, Next) show as drop targets; dropping it there sets its position.
590
619
  - **Drag an entry of the gallery** onto the layout to create that component there, with a working
591
620
  starting point (a sample query for reports, charts and cards; a name like `P5_NEW` for items);
592
621
  then set its properties on the right. Clicking a gallery entry instead opens the create form
@@ -597,7 +626,8 @@ region that no longer fits starts a new row.
597
626
  (move up, move down, narrower, wider, or move an item or button to another region); on phones and
598
627
  tablets this is the way to arrange things.
599
628
  - **Undo** and **Redo** in the toolbar take back the last 20 layout changes on this page (moving
600
- and resizing; creating a component starts a new history).
629
+ and resizing, display and button positions too; creating, duplicating or copying a component starts a new
630
+ history).
601
631
 
602
632
  Without JavaScript the panes are shown one under the other, every component is a link and the
603
633
  Arrange buttons still work.
@@ -813,7 +843,14 @@ exported.
813
843
 
814
844
  ## Shared components
815
845
 
816
- Components used by the whole application:
846
+ Components used by the whole application. **Shared Components** opens on a grid like APEX's: ten groups
847
+ (Application Logic, Security, Other Components, Navigation and Search, User Interface, Files and Reports,
848
+ Data Sources, Workflows and Automations, Globalization, Generative AI) with a link and a count per component
849
+ type. A type opens its list (`?type=…`): search by name (the rows filter while you type), sort by name,
850
+ **Create**, and a row opens its editor. The types pgkiln keeps in the application's Settings (authentication,
851
+ security attributes, navigation bar list, user interface attributes, PWA, globalization attributes) open the
852
+ right Settings tab. **Breadcrumbs** shows the pages by their breadcrumb parent. **Tree view** (`?view=tree`)
853
+ is the earlier page: every component in one rail, with **Access control** next to it.
817
854
 
818
855
  | Component | Purpose |
819
856
  |---|---|
@@ -929,6 +966,12 @@ register at the provider, and has a *Test discovery* button. See
929
966
 
930
967
  ## Settings
931
968
 
969
+ Settings has tabs (APEX: Edit Application Definition and Security Attributes): **Definition**, **Security**,
970
+ **Sign-in**, **User Interface**, **Globalization**, **Errors and Sessions** and **Progressive Web App**. It opens
971
+ on Definition (`?tab=…` opens another). *Save settings* saves the first five together and comes back to the tab
972
+ you were on. The Security tab shows only the fields of the chosen authentication type (HTTP header, database
973
+ accounts or custom).
974
+
932
975
  - **Application**: name, alias, home page.
933
976
  - **Security**: authentication (*App users*, *HTTP header*, *Database accounts*, *Custom* or
934
977
  *None*), the database role, and **debug mode** (shows full database errors to users; development
@@ -1152,13 +1195,24 @@ Commands; other developers' are never shown) and the workspace's **recent SQL sc
1152
1195
  session's **schema** (APEX: the default schema): it goes first in the search path of SQL Commands and SQL Scripts until
1153
1196
  you sign out. Tasks link to Quick SQL, blueprints, table descriptions, sample data and Generate DDL.
1154
1197
 
1198
+ (sprint 75) The tools are tabs: Home, Object Browser, SQL Commands, SQL Scripts and Utilities; **More** opens the
1199
+ others (Quick SQL, Query Builder, Load and Unload Data, Sample Data, DDL, Compare, AI), and the open one is a tab too.
1200
+
1155
1201
  - **SQL Commands** (`/builder/sql/commands`): run any SQL as the **owner connection**, not as an application role. Multiple
1156
1202
  statements are allowed; the result of the last one is shown (up to 500 rows). Press
1157
1203
  **Ctrl/Cmd + Enter** to run. The [code editor](#the-code-editor) suggests every schema, table,
1158
1204
  column and function the owner sees.
1159
- - **Object Browser**: tables, views and functions per schema. For a table you see columns, types
1160
- and defaults, **row level security policies**, **grants** and the first 25 rows; for a
1161
- function, its source.
1205
+ - **Object Browser** (APEX's): the **schema** in the header (the session's schema by default) and a tree with a
1206
+ folder per object type (tables, views, materialized views, indexes, sequences, types, functions, procedures,
1207
+ triggers) and a **filter** by name. pgkiln's own schemas (`meta`, `pgkiln_plugins`) and objects that belong to an
1208
+ extension show only with **Show system objects**. **Create** (and the tiles shown when nothing is selected) opens
1209
+ SQL Commands with a CREATE TABLE, VIEW, FUNCTION, SEQUENCE or INDEX statement to fill in. A table opens in tabs:
1210
+ **Columns** (with comments; *Add*, *Rename* and *Drop column* write the ALTER TABLE statement into SQL Commands to
1211
+ review and run: nothing changes until you press Run), **Data** (25 rows a page), **Indexes**, **Constraints**
1212
+ (primary key, foreign keys with the table they refer to, unique, check), **Triggers**, **Grants**, **Row level
1213
+ security** (on or off, the policies), **Dependencies** (views and foreign keys that use it, and what it uses),
1214
+ **Statistics** (rows, sizes, analyze and vacuum times) and **DDL**. A view has the same tabs where they apply; a
1215
+ function or procedure shows its source, a trigger, index, sequence or type its definition.
1162
1216
  - **SQL Scripts**: saved scripts, shared by the developers of the workspace. Create one in the editor, upload a
1163
1217
  `.sql` file (UTF-8, up to 5 MB) or save one from Quick SQL; download it again as `.sql`. **Run**
1164
1218
  splits the script into statements at semicolons (outside strings, comments, quoted identifiers,
@@ -40,6 +40,41 @@ template of the same name) shows the page without the header, the navigation men
40
40
  navigation bar: the title and the regions only, centred. The application's
41
41
  [login page](08-security.md#the-login-page) uses it and gets the sign-in page's backdrop.
42
42
 
43
+ ### Side columns and display positions
44
+
45
+ Like APEX's Universal Theme, a page has **display positions** and a region chooses one with its
46
+ **Position** (Page Designer → region → Layout; `position` in the files; APEX: Layout → Position):
47
+
48
+ | `position` | Where the region shows |
49
+ |---|---|
50
+ | `banner` | At the top of the page content, above everything else |
51
+ | `breadcrumb` | In the bar under the title (the place of APEX's Breadcrumb Bar) |
52
+ | `left`, `right` | In the side column of a page with page template *Left side column* or *Right side column* |
53
+ | `body` (or empty) | The page body, on the 12-column grid (the default) |
54
+ | `footer` | After the body |
55
+
56
+ The page templates **Left side column** and **Right side column** (Page Designer → Page → Appearance;
57
+ `page_template` `left_side_column` / `right_side_column`) put the regions of that position in a column
58
+ beside the body (14–18rem wide; under the body's start on screens under 900px). On a page without that
59
+ side column, `left` and `right` regions show in the body, in sequence. Regions keep their sequence within
60
+ a position, and a region its condition leaves out leaves no empty position behind. A faceted search in
61
+ the left column next to its report is the typical use.
62
+
63
+ ### Button positions
64
+
65
+ A region's button has a **Button position** (Page Designer → button → Layout; `slot` in the files; APEX:
66
+ Button Position):
67
+
68
+ | `slot` | Where the button shows |
69
+ |---|---|
70
+ | `create`, `edit`, `change`, `copy`, `help`, `up` | In the region's header, after the title |
71
+ | `previous`, `close`, `delete` | At the left end of the region's bottom bar |
72
+ | `next` | At the right end of the bottom bar |
73
+ | `region` (or empty) | With the region's other buttons, as before: the header of reports and charts, the bottom of forms and static content |
74
+
75
+ Positions apply to the `standard`, `collapsible` and `plain` templates; the other templates place every
76
+ button where they always do. Page-level buttons have no position.
77
+
43
78
  ### Dialogs and drawers
44
79
 
45
80
  A modal page (Page Designer → Page → Appearance: *Page mode* Modal dialog) opens over the page that linked to it.
@@ -187,9 +222,17 @@ select e.empno, e.ename, e.job, d.dname as department, e.sal
187
222
 
188
223
  Features for end users:
189
224
 
190
- - **Search** across all columns.
191
- - **Sort** by clicking a column heading (again for descending), or from the Actions menu.
192
- - **Actions menu**:
225
+ - **Search** across all columns, or in one column chosen in the list at the start of the search field
226
+ (Enter searches; *Go* too).
227
+ - **Column heading menu** (sprint 76; with JavaScript): clicking a heading opens a menu with *Sort ascending*,
228
+ *Sort descending*, *Hide column*, *Control break* and the column's **values** with their counts (with the current
229
+ search and filters; at most 200), with a box to narrow them; choosing a value filters the report on it. The sort
230
+ arrow of the sorted column sorts at once. Without JavaScript a heading sorts (again for descending).
231
+ - **Hidden columns**: hidden from the heading menu or *Actions → Columns*, shown as chips to bring them back.
232
+ - **Pagination**: *1–15 of 107*, first, previous, next and last page, and the **rows per page** list.
233
+ - **Actions menu** (sprint 76: a short menu like APEX's; each entry opens a dialog, or unfolds in place without
234
+ JavaScript): *Columns*, *Filter*, *Data* (sort, aggregate, compute, control break), *Format* (highlight, rows per
235
+ page), *Chart*, *Group by*, *Pivot*, *Report* (saved reports, reset) and *Download* (CSV, Excel, PDF, print):
193
236
  - **column filters** (`=`, `≠`, contains, does not contain, `>`, `≥`, `<`, `≤`, is empty, is
194
237
  not empty) and **sort**;
195
238
  - **control break**: group the rows by a column, with a heading row per group;
@@ -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 | `YYYY-MM-DD` |
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` |
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 |
@@ -423,6 +423,7 @@ navigation entries and application processes have the same `build_option` column
423
423
  | `config` | Attributes per type ([chapter 4](04-pages-and-regions.md)) |
424
424
  | `rest_source` | A REST data source the region reads; `source` is then SQL over `rest` ([chapter 19](19-rest-data-sources.md)) |
425
425
  | `template_options` | text[]: CSS classes from a fixed list ([template options](04-pages-and-regions.md#template-options)) |
426
+ | `position` | `banner`, `breadcrumb`, `left`, `body` (or null), `right`, `footer` ([display positions](04-pages-and-regions.md#side-columns-and-display-positions)) |
426
427
 
427
428
  **`item`**: `page_id`, `region_id`, `seq`, `name`, `label`, `type`, `lov`, `source_column`,
428
429
  `default_value`, `required`, `help`, `readonly_condition`, `authz`, `config` ([chapter 5](05-items.md)).
@@ -430,7 +431,9 @@ navigation entries and application processes have the same `build_option` column
430
431
  **`button`**: `page_id`, `region_id`, `seq`, `name`, `label`, `action` (`submit` / `redirect` / `da` /
431
432
  `document` / `menu`), `target_page`, `target_items` (jsonb), `condition`, `authz`, `hot`, `confirm`,
432
433
  `menu` (jsonb, for `menu`), `badge`, `badge_query` ([chapter 6](06-processing.md)), `template_options`
433
- (text[], [template options](04-pages-and-regions.md#template-options)).
434
+ (text[], [template options](04-pages-and-regions.md#template-options)), `slot` (a region button's
435
+ [button position](04-pages-and-regions.md#button-positions): `create`, `edit`, `change`, `copy`, `help`, `up`,
436
+ `previous`, `close`, `delete`, `next` or `region` / null).
434
437
 
435
438
  **`dynamic_action`**: `page_id`, `seq`, `name`, `event`, `trigger_element`, `condition_type`,
436
439
  `condition_value`, `action`, `affected_items`, `affected_region_id`, `code`, `items_to_submit`,
@@ -210,7 +210,8 @@ src/
210
210
  shared.ts Shared Components and access control
211
211
  designer.ts page designer: component tree (with computations and branches), layout canvas and gallery, property editor, toolbar
212
212
  arrange.ts page designer layout changes: move, column span, create from the gallery, undo / redo
213
- sql.ts SQL Workshop: SQL commands, object browser
213
+ sql.ts SQL Workshop: the home and SQL commands (templates and drafts to review)
214
+ object-browser.ts (sprint 75) the Object Browser: objects by type, system objects hidden, a table in tabs, column actions as SQL to review
214
215
  scripts.ts SQL Workshop → SQL Scripts: editor, upload/download, run, results per statement, run history
215
216
  quicksql.ts SQL Workshop → Quick SQL page (preview, save as script, run)
216
217
  querybuilder.ts SQL Workshop → Query Builder: catalog, joins by foreign key or drawn, functions/group by, buildQuery() from the URL; the canvas is in builder.js
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pgkiln",
3
- "version": "0.42.0",
3
+ "version": "0.43.0",
4
4
  "description": "Open source low-code, SQL-driven application builder for PostgreSQL, inspired by Oracle APEX",
5
5
  "keywords": [
6
6
  "postgresql",
package/public/app.css CHANGED
@@ -1885,3 +1885,61 @@ a.search-hit:hover, a.search-hit:focus-visible { background: var(--accent-soft);
1885
1885
  /* (sprint 59) Quick edit from the developer toolbar */
1886
1886
  .quick-edit .qe-target { outline: 2px dashed var(--accent); outline-offset: 2px; cursor: pointer; }
1887
1887
  .devbar-quick[aria-pressed="true"] { background: var(--accent); color: var(--accent-text); }
1888
+
1889
+ /* (sprint 76) the pager: rows per page; a Go button only without JavaScript */
1890
+ .pager-size { display: inline-flex; align-items: center; gap: 0.4rem; margin-left: auto; font-size: 0.85rem; }
1891
+ .pager-size select { min-height: 0; padding: 0.15rem 0.4rem; }
1892
+ .js .no-js-only { display: none; }
1893
+
1894
+ /* (sprint 76) the interactive report's Actions menu: one line per entry, submenus, forms in dialogs */
1895
+ .actions-menu .menu-panel { min-width: 15rem; padding: 0.3rem 0; }
1896
+ .ir-menu { list-style: none; margin: 0; padding: 0; }
1897
+ .ir-item > summary, .ir-link { display: flex; align-items: center; gap: 0.55rem; width: 100%; padding: 0.45rem 0.9rem; cursor: pointer; list-style: none; color: var(--text); text-decoration: none; background: none; border: 0; font: inherit; text-align: left; }
1898
+ .ir-item > summary::-webkit-details-marker { display: none; }
1899
+ .ir-item > summary:hover, .ir-link:hover, .ir-item[open] > summary { background: var(--surface-3); }
1900
+ .ir-item > summary .icon, .ir-link .icon { color: var(--muted); }
1901
+ .ir-more { margin-left: auto; color: var(--muted); }
1902
+ .ir-sub > .ir-menu { padding-left: 1.25rem; }
1903
+ .ir-body { padding: 0.5rem 0.9rem 0.75rem; display: grid; gap: 0.5rem; }
1904
+ .ir-body .menu-section { padding: 0; border: 0; }
1905
+ .ir-columns { border: 0; margin: 0; padding: 0; display: grid; gap: 0.2rem; max-height: 50vh; overflow: auto; }
1906
+ .ir-columns legend { font-weight: 600; margin-bottom: 0.3rem; }
1907
+ .ir-dialog { border: 1px solid var(--border); border-radius: var(--radius); background: var(--surface); color: var(--text); padding: 0; width: min(34rem, calc(100vw - 2rem)); box-shadow: 0 12px 32px rgb(0 0 0 / 25%); }
1908
+ .ir-dialog::backdrop { background: rgb(0 0 0 / 35%); }
1909
+ .ir-dialog-head { display: flex; align-items: center; justify-content: space-between; gap: 1rem; padding: 0.75rem 1rem; border-bottom: 1px solid var(--border); }
1910
+ .ir-dialog-head h2 { margin: 0; font-size: 1.05rem; }
1911
+ .ir-dialog .ir-body { padding: 1rem; }
1912
+ .ir-dialog .filter-row { min-width: 0; }
1913
+ /* the search field with its column list (APEX: the magnifier's column menu) */
1914
+ .search-field { display: flex; flex: 1; min-width: 0; border: 1px solid var(--border); border-radius: var(--radius); background: var(--surface); }
1915
+ .search-field:focus-within { outline: 2px solid var(--accent); outline-offset: 1px; }
1916
+ .search-field .search-scope { border: 0; border-right: 1px solid var(--border); border-radius: var(--radius) 0 0 var(--radius); max-width: 9rem; background: var(--surface-2); }
1917
+ .search-field input[type=search] { border: 0; flex: 1; min-width: 0; background: transparent; }
1918
+ .search-field input[type=search]:focus { outline: none; }
1919
+ /* a column heading's menu */
1920
+ .th-menu { z-index: 60; width: 17rem; padding: 0.4rem 0; display: grid; gap: 0.3rem; max-height: 70vh; overflow: auto; }
1921
+ .th-menu-actions { display: grid; }
1922
+ .th-menu-actions a, .th-menu-values a { display: flex; justify-content: space-between; gap: 0.5rem; padding: 0.35rem 0.9rem; color: var(--text); text-decoration: none; }
1923
+ .th-menu-actions a:hover, .th-menu-values a:hover, .th-menu a:focus-visible { background: var(--surface-3); }
1924
+ .th-menu input[type=search] { margin: 0.2rem 0.75rem; width: calc(100% - 1.5rem); }
1925
+ .th-menu-values { list-style: none; margin: 0; padding: 0; border-top: 1px solid var(--border); overflow-wrap: anywhere; }
1926
+ .th-menu-values li.muted { padding: 0.35rem 0.9rem; }
1927
+ .js th[data-col] > a { cursor: pointer; }
1928
+
1929
+ /* (sprint 76) a date item in the application's date format: the browser's picker on a hidden date field */
1930
+ .date-field { position: relative; }
1931
+ .date-native { position: absolute; right: 0; bottom: 0; width: 1px; height: 1px; opacity: 0; pointer-events: none; border: 0; padding: 0; }
1932
+
1933
+ /* (sprint 77) display positions: banner, breadcrumb bar, a side column, footer; button positions in a region */
1934
+ .t-pos-banner, .t-pos-breadcrumb { margin-bottom: 1rem; }
1935
+ .t-pos-breadcrumb { padding: 0.5rem 0; border-bottom: 1px solid var(--border); }
1936
+ .t-pos-footer { margin-top: 1rem; padding-top: 1rem; border-top: 1px solid var(--border); }
1937
+ .t-columns { display: grid; gap: 1.25rem; align-items: start; }
1938
+ .t-columns-left { grid-template-columns: minmax(14rem, 18rem) minmax(0, 1fr); }
1939
+ .t-columns-right { grid-template-columns: minmax(0, 1fr) minmax(14rem, 18rem); }
1940
+ .t-columns-right > .t-side { order: 2; }
1941
+ .t-side .t-regions, .t-side { min-width: 0; }
1942
+ .t-side .region { grid-column: 1 / -1; }
1943
+ @media (max-width: 900px) { .t-columns-left, .t-columns-right { grid-template-columns: 1fr; } .t-columns-right > .t-side { order: 0; } }
1944
+ .region-footer-split { display: flex; justify-content: space-between; gap: 0.5rem; flex-wrap: wrap; }
1945
+ .region-footer-split > div { display: flex; gap: 0.5rem; }