pgkiln 0.40.0 → 0.42.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.
- package/db/migrations/095_rest_catalogs.sql +59 -0
- package/db/migrations/096_developer_email.sql +15 -0
- package/db/migrations/097_generated_app_quality.sql +911 -0
- package/db/migrations/098_app_activity.sql +37 -0
- package/docs/apex-feature-parity.md +15 -12
- package/docs/guide/03-builder.md +103 -19
- package/docs/guide/04-pages-and-regions.md +37 -4
- package/docs/guide/09-reference.md +6 -2
- package/docs/guide/11-from-apex.md +1 -1
- package/docs/guide/12-development.md +19 -2
- package/docs/guide/14-globalization.md +7 -3
- package/docs/guide/17-mobile.md +1 -1
- package/docs/guide/19-rest-data-sources.md +39 -1
- package/examples/hr/hr_59_gantt_editing.sql +21 -0
- package/examples/hr/hr_60_tree_charts.sql +46 -0
- package/package.json +1 -1
- package/public/app.css +219 -33
- package/public/app.js +206 -0
- package/public/builder.css +31 -3
- package/public/builder.js +31 -0
- package/public/sw.js +5 -2
- package/src/app.ts +6 -0
- package/src/builder/appfromfile.ts +5 -4
- package/src/builder/appsheets.ts +23 -9
- package/src/builder/appwizard.ts +215 -70
- package/src/builder/blueprints.ts +2 -1
- package/src/builder/components.ts +1 -1
- package/src/builder/find-workspace.ts +120 -0
- package/src/builder/home.ts +4 -32
- package/src/builder/mail.ts +39 -0
- package/src/builder/newapp.ts +182 -5
- package/src/builder/region-settings.ts +19 -1
- package/src/builder/rest-catalogs.ts +424 -0
- package/src/builder/routes.ts +36 -34
- package/src/builder/shared.ts +2 -0
- package/src/builder/workspace-transfer.ts +136 -0
- package/src/i18n/ar.ts +15 -0
- package/src/i18n/cs.ts +15 -0
- package/src/i18n/da.ts +15 -0
- package/src/i18n/de.ts +15 -0
- package/src/i18n/el.ts +15 -0
- package/src/i18n/es.ts +15 -0
- package/src/i18n/fi.ts +15 -0
- package/src/i18n/fr.ts +15 -0
- package/src/i18n/he.ts +15 -0
- package/src/i18n/it.ts +15 -0
- package/src/i18n/ja.ts +15 -0
- package/src/i18n/ko.ts +15 -0
- package/src/i18n/nb.ts +15 -0
- package/src/i18n/pl.ts +15 -0
- package/src/i18n/pt.ts +15 -0
- package/src/i18n/ru.ts +15 -0
- package/src/i18n/sv.ts +15 -0
- package/src/i18n/tr.ts +15 -0
- package/src/i18n/uk.ts +15 -0
- package/src/i18n/zh.ts +15 -0
- package/src/i18n.ts +30 -0
- package/src/icons.ts +2 -1
- package/src/layout.ts +2 -2
- package/src/restcatalog.ts +605 -0
- package/src/runtime/charts.ts +304 -15
- package/src/runtime/data-reporter.ts +48 -16
- package/src/runtime/devbar.ts +35 -14
- package/src/runtime/engine.ts +7 -4
- package/src/runtime/gantt-move.ts +63 -0
- package/src/runtime/locale.ts +2 -2
- package/src/runtime/regions.ts +28 -2
- package/src/runtime/render.ts +18 -4
- package/src/runtime/report.ts +15 -9
- package/src/runtime/routes.ts +39 -0
- package/src/runtime/styles.ts +5 -2
- package/src/websources.ts +11 -3
- package/src/workspace-export.ts +240 -0
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
-- =====================================================================
|
|
2
|
+
-- 098: activity reporting for an application's administrators (sprint 73;
|
|
3
|
+
-- APEX: the Activity Reporting feature of the Create Application wizard)
|
|
4
|
+
--
|
|
5
|
+
-- meta.app_activity(days): the page views, sign-ins and errors of the
|
|
6
|
+
-- current application (meta.app_id()) in the last days (1 to 366), newest
|
|
7
|
+
-- first, at most 10,000 rows. Only for a signed-in user with the admin role
|
|
8
|
+
-- whose session belongs to that application; anyone else gets an error.
|
|
9
|
+
-- The client's IP address and the error details are left out.
|
|
10
|
+
--
|
|
11
|
+
-- The wizard's Activity page (page 9010, authorization ADMIN) reads it:
|
|
12
|
+
-- select * from meta.app_activity(30)
|
|
13
|
+
-- =====================================================================
|
|
14
|
+
create function meta.app_activity(p_days int default 30)
|
|
15
|
+
returns table (at timestamptz, username text, event text, page_no int, elapsed_ms int)
|
|
16
|
+
language plpgsql stable security definer set search_path = meta, pg_catalog as $$
|
|
17
|
+
declare
|
|
18
|
+
v_app int := meta.app_id();
|
|
19
|
+
v_session uuid := nullif(current_setting('pgkiln.session_id', true), '')::uuid;
|
|
20
|
+
begin
|
|
21
|
+
if v_app is null or v_session is null
|
|
22
|
+
or not exists (select 1 from meta.session s where s.id = v_session and s.app_id = v_app)
|
|
23
|
+
or not meta.has_role('admin') then
|
|
24
|
+
raise exception 'the activity of this application is for its administrators' using errcode = '42501';
|
|
25
|
+
end if;
|
|
26
|
+
return query
|
|
27
|
+
select l.at, l.username, l.event, l.page_no, l.elapsed_ms
|
|
28
|
+
from meta.activity_log l
|
|
29
|
+
where l.app_id = v_app
|
|
30
|
+
and l.at > now() - make_interval(days => least(greatest(coalesce(p_days, 30), 1), 366))
|
|
31
|
+
order by l.at desc
|
|
32
|
+
limit 10000;
|
|
33
|
+
end
|
|
34
|
+
$$;
|
|
35
|
+
revoke all on function meta.app_activity(int) from public;
|
|
36
|
+
grant execute on function meta.app_activity(int) to public;
|
|
37
|
+
comment on function meta.app_activity(int) is 'The current application''s activity (page views, sign-ins, errors) for its administrators (098).';
|
|
@@ -7,35 +7,36 @@ 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 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 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
|
|
|
14
14
|
| Area | ✅ | 🟡 | ❌ | ➖ | In short |
|
|
15
15
|
|---|---:|---:|---:|---:|---|
|
|
16
16
|
| App Builder and development | 20 | 0 | 0 | 0 | Page Designer with drag-and-drop and a code editor, wizards, search, where used, an Advisor, a CLI with one file per component, page locks and comments, supporting objects, working copies with a three-way merge, theme/library/boilerplate apps with subscriptions; App Builder AI (pages, SQL and table descriptions) |
|
|
17
|
-
| Regions | 23 | 0 | 0 | 0 | All everyday regions, a search region over search configurations and a URL region;
|
|
17
|
+
| Regions | 23 | 0 | 0 | 0 | All everyday regions, a search region over search configurations and a URL region; twenty-two chart types with drill-down; calendars with week/day/list views and drag and drop; faceted search, smart filters and a region display selector; interactive reports with breaks, aggregates, highlights, compute, group by, pivot, chart view and saved reports; interactive grids with single row, group by and chart views; maps (with vector tiles) and trees; template components; row ranges, lazy loading and region caching for large tables |
|
|
18
18
|
| Items | 13 | 0 | 0 | 0 | All common items, file upload (several files per item), rich text and Markdown editors, star rating, combobox, date range, QR code, password reveal, display image and geocoded address |
|
|
19
19
|
| Logic and processing | 17 | 0 | 0 | 1 | User preferences and application settings; all dynamic action events and actions, Ajax callbacks and an error handling function; Core APEX model complete with computations, conditional branches, build options and menu buttons, download, chain and workflow processes; JavaScript from static application files in dynamic actions; region, item, dynamic action and process plug-ins |
|
|
20
20
|
| Security | 22 | 0 | 0 | 0 | An editable login page and Forgot password; a session timeout warning; On par or stricter (CSP without `unsafe-inline`); OIDC, SAML and LDAP; header authentication behind a proxy; database accounts; custom authentication |
|
|
21
21
|
| User interface | 12 | 0 | 0 | 0 | Region templates incl. hero, inline dialog and drawer, wizard and carousel; Universal Theme-like and responsive; a Theme Roller with style variants and conditional, dynamic styles; about 1,700 icons with Font APEX-like modifiers |
|
|
22
22
|
| Globalization | 6 | 0 | 0 | 0 | One translated app like 26.1 with dynamic translations of table values; number format masks and automatic time zone; twenty-two built-in languages |
|
|
23
|
-
| Data and integration |
|
|
23
|
+
| Data and integration | 13 | 0 | 0 | 2 | REST source catalogs from OpenAPI documents; Generate DDL and schema comparison; `meta.data_export` and data export downloads (CSV, JSON, XML, HTML, Excel, PDF); e-mail through SMTP (password or OAuth2), Microsoft Graph, Amazon SES and HTTP APIs; REST APIs via PostgREST, REST data sources that write back and synchronise, web credentials with OAuth2 grants, CSV/XLSX/JSON/XML loading with saved definitions and unloading, SQL scripts and Quick SQL, report PDFs and document templates |
|
|
24
24
|
| Workflow, automation and AI | 6 | 0 | 0 | 0 | Scheduled automations with several actions and runs from SQL, approvals, a task list and workflows with parallel branches, versions and invoke-API steps; AI with Claude or OpenAI: *Generate text with AI*, an assistant region with tools, natural-language report filters and blueprints |
|
|
25
|
-
| Administration |
|
|
26
|
-
| **Total** | **
|
|
25
|
+
| Administration | 11 | 0 | 0 | 0 | An APEX-like sign-in with a workspace; a workspace's components exported and imported as one file; workspace message, environment banner and utilization; isolated workspaces with their own database logins and roles, and workspace administrators; application availability and Run only, automatic backups, user feedback; a developer toolbar with a session state viewer and debug per session; Top SQL per app; debug messages per request; an install/upgrade log |
|
|
26
|
+
| **Total** | **143** | **0** | **0** | **3** | 146 APEX features compared: 98% available, none partial or missing |
|
|
27
27
|
|
|
28
28
|
(Counts are of the rows in the tables below. A review on 2026-10-06 added 18 rows for APEX features that were
|
|
29
29
|
not compared before, one on 2026-10-12 added two more (property help, application availability), and one on
|
|
30
30
|
2026-10-13 compared the builder's screens with APEX 26.1 and added four (App Gallery, application groups, cross
|
|
31
|
-
application reports, Manage Service), so the share available dropped without anything being removed.
|
|
31
|
+
application reports, Manage Service), so the share available dropped without anything being removed. Sprint 67 added
|
|
32
|
+
two, REST source catalogs and the workspace export, with their features.)
|
|
32
33
|
|
|
33
34
|
## App Builder and development
|
|
34
35
|
|
|
35
36
|
| APEX | pgkiln | Notes |
|
|
36
37
|
|---|---|---|
|
|
37
38
|
| App Builder: create, edit, delete, run apps | ✅ | Builder at `/builder` |
|
|
38
|
-
| 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. **Missing:** blueprints (26.1) |
|
|
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) |
|
|
39
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 |
|
|
40
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 |
|
|
41
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 |
|
|
@@ -64,7 +65,7 @@ application reports, Manage Service), so the share available dropped without any
|
|
|
64
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
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 |
|
|
66
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)) |
|
|
67
|
-
| 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, 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. **
|
|
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) |
|
|
68
69
|
| Cards and metric cards (26.1 metric card template) | ✅ | Cards from SQL, with a KPI "metric" style |
|
|
69
70
|
| Calendar | ✅ | Month, week, day and list views (agenda list on phones); create on click (a checksummed link with the slot); drag and drop to move events through the developer's move SQL, run as the app's role (CSRF, a *who may drag* authorization, only events the user sees). Works without JavaScript; dragging adds on top ([chapter 4](guide/04-pages-and-regions.md#calendar)) |
|
|
70
71
|
| Faceted search | ✅ | Checkbox, range (predefined, or a custom from/to on numbers and dates), star rating and search facets with live counts that honour the other facets; exclude on checkbox facets (26.1). Values travel as query parameters, never as SQL text. (sprint 65) **Facet charts**: a bar or pie chart of a facet's counts, each mark filtering on its value |
|
|
@@ -165,7 +166,7 @@ application reports, Manage Service), so the share available dropped without any
|
|
|
165
166
|
| Icons (Font APEX 2.5) | ✅ | 136 line icons of pgkiln's own and (0.31) the **Lucide** set of about 1,600 more in the same line style, each served on its own; **modifiers** like Font APEX's (sizes, spin, rotate, flip, colours) and Font APEX names (`fa-users fa-lg`) where Lucide has the icon; a visual picker in the builder that searches all of them by name and search word ([chapter 9](guide/09-reference.md#icons)). Font APEX's own drawings are Oracle's, so icons look different and a few Font APEX names have no match |
|
|
166
167
|
| Accessibility | ✅ | Labels, keyboard, focus rings, reduced motion, table alternatives for charts, scrolling tables reachable from the keyboard; an automated WCAG 2.1 A/AA audit (axe-core) of every example page in light, dark and Iris and of the builder's main pages runs in CI with no violations allowed. Not a manual expert audit |
|
|
167
168
|
| Drawers, top/bottom dialogs (26.1) | ✅ | Modal pages open as a centred dialog or as a drawer from the left, right, top or bottom edge, in three sizes, sliding in (without animation for reduced motion); on phones full screen ([chapter 4](guide/04-pages-and-regions.md#dialogs-and-drawers)). Not yet: a footer slot for inline drawers |
|
|
168
|
-
| New "Iris" default style (26.1) | ✅ | Base style **Iris
|
|
169
|
+
| New "Iris" default style (26.1) | ✅ | Base style **Iris**, the default for new applications, light by default with the user's choice of dark: (sprint 72) like APEX 26's: a white body, a dark warm-grey header with an accent strip and a dark menu, 4 px corners, region headers with a rule, a dark primary button, a large page title; light and dark palettes checked for WCAG AA contrast. The earlier look stays as **Lavender** ([chapter 14](guide/14-globalization.md#base-styles-iris-lavender-and-standard)) |
|
|
169
170
|
| Progressive Web App (push notifications: 23.1) | ✅ | Per app: installable (manifest, icon, standalone), service worker, offline pages (opt-in, wiped at sign-in/out), **forms sent offline queued on the device and sent later** (files included, once only, under the same user), location, camera and barcode items. (0.31) **Push notifications**: users turn them on per device (My account, or the dynamic action `push_subscribe`); `meta.send_push(user, title, body, page, items)` and a `send_push` process queue them, sent after the commit, encrypted for the device (RFC 8291) and signed with the application's own VAPID key (RFC 8292, stored encrypted, never exported); links signed for the recipient; devices end at sign-out, a new password, deactivation or removed access ([chapter 17](guide/17-mobile.md#push-notifications)). No images or action buttons in notifications |
|
|
170
171
|
|
|
171
172
|
## Globalization
|
|
@@ -193,7 +194,8 @@ application reports, Manage Service), so the share available dropped without any
|
|
|
193
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
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 |
|
|
195
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) |
|
|
196
|
-
| 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. One source per report (offer a view to combine tables); no downloads from a reporter yet |
|
|
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 |
|
|
198
|
+
| REST Source Catalogs (Workspace Utilities) | ✅ | (sprint 67) Workspace utilities → **REST Source Catalogs**: a workspace's web services with a base URL and services, from an **OpenAPI 3 / Swagger 2.0** document (file, pasted or read from a URL on the allow-list), a catalog file or by hand: parameters (under the service's own names), row selector, typed columns and write-back operations from the response schemas and collection/item paths, with notes on what can't be used. An application's *REST data sources → From a REST source catalog* makes a data source from a service, with its own web credential ([chapter 19](guide/19-rest-data-sources.md#rest-source-catalogs)). **Missing:** YAML documents (convert to JSON), APEX's built-in catalogs (e.g. Oracle Fusion) |
|
|
197
199
|
| JSON sources, duality views (24.2) | ➖ | PostgreSQL `jsonb` works in any SQL region, form or grid source |
|
|
198
200
|
| Remote servers / database links | ➖ | `postgres_fdw` or `dblink` |
|
|
199
201
|
| E-mail: `APEX_MAIL`, the Send E-Mail process, e-mail templates | ✅ | (sprint 50) `meta.send_mail`, `meta.send_mail_template`, `meta.add_mail_attachment` and `meta.mail_status`, queued in the caller's transaction and sent by the server after the commit with retries; the **send_email** process; Shared Components → **E-mail templates** (`#NAME#` escaped in HTML, `#NAME!RAW#`; exported). Further than APEX (SMTP with a password only, through `UTL_SMTP`): **mail services** for SMTP with a password or **OAuth2** (XOAUTH2, e.g. Exchange Online after the end of basic authentication), **Microsoft 365 through Graph**, **Amazon SES**, **Resend, Postmark, SendGrid and Mailgun**, or log only; encrypted write-only secrets, allowed senders, a service, From address and daily limit per application, a mail log with retry and cancel ([chapter 6](guide/06-processing.md#sending-e-mail)). No bounce or delivery webhooks, no mail in workflows other than from SQL steps |
|
|
@@ -213,15 +215,16 @@ application reports, Manage Service), so the share available dropped without any
|
|
|
213
215
|
|
|
214
216
|
| APEX | pgkiln | Notes |
|
|
215
217
|
|---|---|---|
|
|
216
|
-
| Developer accounts, workspace sign-in | ✅ | (sprint 61) The builder's sign-in page like APEX's: workspace (optional; it becomes the current one, a wrong one answers like a wrong password), username, password with a Show button, *Remember workspace and username*, a link to Administration |
|
|
218
|
+
| Developer accounts, workspace sign-in | ✅ | (sprint 61) The builder's sign-in page like APEX's: workspace (optional; it becomes the current one, a wrong one answers like a wrong password), username, password with a Show button, *Remember workspace and username*, a link to Administration. (sprint 68) **Find my workspace**: developers' e-mail addresses, and a mail with their workspaces through the builder's mail service (the same answer for every address, limited per address and IP). **Missing:** the sign-in page's language links (the builder is in English only) |
|
|
217
219
|
| Workspace message, environment banner, workspace utilization, preferences and extension links (Manage Service) | ✅ | (sprint 61) An **Administration** menu in the icon rail; administrators and workspace administrators set a **workspace message** (on the App Builder home) and an **environment banner** (a coloured label on every builder page of the workspace), and see **workspace utilization** (applications, pages, page views, users, static files, schema storage) ([chapter 3](guide/03-builder.md#workspace-message-and-environment-banner)). (sprint 62) **Workspace preferences**: the SQL Workshop and the applications' RESTful services (REST modules) on or off per workspace; **extension links** in an Extensions menu of the rail ([chapter 3](guide/03-builder.md#workspace-preferences)). **Missing:** the account login controls of APEX's preferences (pgkiln's password policy and sign-in throttling are installation-wide) |
|
|
218
220
|
| Instance administration, install/upgrade logs (26.1) | ✅ | Versioned migrations (`npm run db:migrate`), every run logged; Workspace utilities → **Installation** (administrators): server version, install and upgrade runs with errors, applied migrations, and warnings for migrations the database misses or the server doesn't know ([chapter 3](guide/03-builder.md)). Workspace utilities → **Instance settings**: session length and sign-in throttling (stored in the database, over the environment variables) and an overview of the server's configuration without secrets; a server whose database lacks migrations says so (503) or applies them (`MIGRATE_ON_START`). Other settings stay environment variables |
|
|
219
221
|
| Debug messages | ✅ | Debug levels 1–9 per app; `meta.debug(level, text)` and `meta.debug_enabled(level)` from application SQL (APEX_DEBUG); timed entries per request (page steps, regions, processes, branches, errors, SQL notices); Activity → **Debug messages** viewer per page view with filters and the slowest step highlighted; retention 1–90 days; password item values are never recorded ([chapter 6](guide/06-processing.md)). (sprint 50) Debug for **one session** from the developer toolbar, the application staying out of debug. **Missing:** debug entries for background jobs and REST requests |
|
|
220
|
-
| Developer toolbar, session state viewer | ✅ | (sprint 50) Developers signed in to the builder see a toolbar on the pages of their applications in the same browser: App Builder, the application, **Edit page** (Page Designer), **Session** (the session state viewer: user, roles, session, language, time zone, debug level, this page's items, application items and other pages' items; passwords never shown; clear the page's items) **Quick edit** (sprint 59: click a region, item or button to open it in the Page Designer) and **Debug** for this session only. A separate random token (cookie path `/a`, HttpOnly) of a live builder session of a developer of the application's workspace ([chapter 3](guide/03-builder.md#developer-toolbar)). **
|
|
222
|
+
| Developer toolbar, session state viewer | ✅ | (sprint 50) Developers signed in to the builder see a toolbar on the pages of their applications in the same browser: App Builder, the application, **Edit page** (Page Designer), **Session** (the session state viewer: user, roles, session, language, time zone, debug level, this page's items, application items and other pages' items; passwords never shown; clear the page's items) **Quick edit** (sprint 59: click a region, item or button to open it in the Page Designer) and **Debug** for this session only. A separate random token (cookie path `/a`, HttpOnly) of a live builder session of a developer of the application's workspace ([chapter 3](guide/03-builder.md#developer-toolbar)). (sprint 72) A compact bar of icons with tooltips like APEX's, centred at the bottom, **Customize** (the Theme Roller) and **Info**, hidden to a slim tab when not used, docked at the bottom, top, left or right; the page keeps room for it |
|
|
221
223
|
| Feedback (users send feedback from a page, developers answer) | ✅ | (sprint 51) With *Users can send feedback* on, the navigation bar's **Feedback** link opens a page for a comment, idea or problem about the page (optional rating), with the user's earlier feedback and the developers' answers; developers read, filter, set a status and answer under Application → Feedback ([chapter 3](guide/03-builder.md#feedback)). No screenshots, no e-mail to developers |
|
|
222
224
|
| Automatic application backups, page groups | ✅ | (sprint 51) **Backups**: before every import that replaces an application (CLI, MCP, working copy merge, restore), daily when it changed, and by hand; the newest 25 (configurable) are kept; download and restore from the builder ([chapter 3](guide/03-builder.md#backups)); (sprint 62) Workspace utilities → **Manage backups** across the workspace's applications, with a backup of all of them at once. (sprint 58) **Page groups**: Shared Components → Page groups, a page's *Page group*, the page list by group with a filter ([chapter 3](guide/03-builder.md#page-groups)) |
|
|
223
225
|
| Application availability (Available, Developers only, Restricted access, Unavailable; build status *Run only*) | ✅ | (sprint 51) Available, available to developers only (a builder session in the same browser), restricted to named users, or unavailable with a message, for pages, file downloads, REST modules and PostgREST; build status **Run only** refuses builder changes as if the application were locked, while `pgkiln import --replace` still deploys. Installation settings: not exported, kept by an import ([chapter 3](guide/03-builder.md#availability-and-build-status)) |
|
|
224
226
|
| Monitoring (top SQL) | ✅ | Activity per app; Top SQL per app's database role from `pg_stat_statements` (sortable, resettable) |
|
|
227
|
+
| Workspace export and import (Workspace Utilities → Export) | ✅ | (sprint 67) Workspace utilities → **Export and import** (administrators and the workspace's administrators): settings (message, banner, preferences), developers and workspace administrators, application groups, extension links, REST source catalogs, SQL scripts, blueprints and data generators as one file; imported into the current workspace in one transaction, keeping or replacing components with the same name and never deleting ([chapter 3](guide/03-builder.md#export-and-import)). Applications are exported on their own; isolation, database roles and passwords never leave the installation |
|
|
225
228
|
| Workspaces (multi-tenant) | ✅ | Workspaces group applications and developers: the builder shows and opens only the applications of a developer's workspaces (administrators: all), a current workspace with a switcher, new and imported applications go into it, administrators add workspaces, choose their developers and move applications ([chapter 3](guide/03-builder.md#workspaces)). (sprint 60) **Isolated workspaces** are a tenant boundary: the applications run on a PostgreSQL login of the workspace's own and its developers' SQL Workshop on another, with row-level security on pgkiln's tables, so SQL that resets its role can't reach other workspaces' applications, data, sessions or accounts; **workspace database roles** (APEX: workspace schemas) assigned by administrators; **workspace administrators** who manage their workspace's developers; SQL scripts, blueprints and sample data per workspace ([isolated workspaces](guide/03-builder.md#isolated-workspaces)). **Missing:** user directories per workspace (accounts are installation-wide, visible to the workspaces whose applications they use), developers created by a workspace administrator |
|
|
226
229
|
|
|
227
230
|
## Different on purpose
|
package/docs/guide/03-builder.md
CHANGED
|
@@ -15,10 +15,20 @@ workspace and switch in your account menu. **Remember workspace and username** k
|
|
|
15
15
|
HttpOnly cookie for `/builder`, no password); signing in without the tick forgets them. *Administration* under the
|
|
16
16
|
form signs in and opens Workspace utilities.
|
|
17
17
|
|
|
18
|
+
**Find my workspace** under the form (APEX: Find My Workspace) asks for an e-mail address and mails the developer
|
|
19
|
+
accounts with that address their user name and the workspaces they belong to. It needs a mail service for the
|
|
20
|
+
builder: Workspace utilities → Mail services → **Builder mail** (a service and a From address among its senders);
|
|
21
|
+
without one the page says to ask an administrator. The page answers the same whether or not an account has the
|
|
22
|
+
address, the mail leaves after the answer, and it sends at most three mails an hour to an address and handles ten
|
|
23
|
+
requests an hour from an IP address. Developers set their own address on the Developers page (migration 096);
|
|
24
|
+
administrators set anyone's.
|
|
25
|
+
|
|
18
26
|
On the **Developers** page you can:
|
|
19
27
|
|
|
20
28
|
- change your own password (minimum 8 characters; other builder sessions of yours end);
|
|
21
|
-
-
|
|
29
|
+
- set your **e-mail address** (optional; *Find my workspace* sends your workspaces to it);
|
|
30
|
+
- as an **administrator**: add developer accounts (developers or administrators, with an e-mail address), change
|
|
31
|
+
their e-mail addresses, make a developer
|
|
22
32
|
an administrator or the other way round, and remove other developers (their sessions end
|
|
23
33
|
immediately).
|
|
24
34
|
|
|
@@ -92,6 +102,32 @@ Links), added on the workspace's page by administrators and the workspace's admi
|
|
|
92
102
|
`https://` URL, an optional description and an order. While the workspace is current an **Extensions** icon in the
|
|
93
103
|
rail opens them, each in a new tab (`rel="noopener noreferrer"`).
|
|
94
104
|
|
|
105
|
+
### Export and import
|
|
106
|
+
|
|
107
|
+
Workspace utilities → **Export and import** (`/builder/workspace-export`; APEX: Workspace Utilities → Export), for
|
|
108
|
+
administrators and the workspace's administrators: the current workspace's components as one JSON file (format
|
|
109
|
+
`pgkiln-workspace/1`), to copy them to another workspace or installation or keep them in version control next to the
|
|
110
|
+
applications' files. Choose what goes in:
|
|
111
|
+
|
|
112
|
+
| Component | In the file |
|
|
113
|
+
|---|---|
|
|
114
|
+
| Settings | Description, [workspace message, environment banner](#workspace-message-and-environment-banner) and [preferences](#workspace-preferences) |
|
|
115
|
+
| Developers | User names and who is a workspace administrator (never passwords) |
|
|
116
|
+
| Application groups | Names, descriptions and the aliases of their applications |
|
|
117
|
+
| Extension links | Label, URL, description, order |
|
|
118
|
+
| REST source catalogs | Every [catalog](19-rest-data-sources.md#rest-source-catalogs) with its services |
|
|
119
|
+
| SQL scripts, blueprints, data generators | The SQL Workshop's saved work |
|
|
120
|
+
|
|
121
|
+
Never in the file: the workspace's name, its [isolation](#isolated-workspaces) and database roles, passwords and
|
|
122
|
+
secrets, script runs and other history. **Applications are exported on their own** (an application's *Export*).
|
|
123
|
+
|
|
124
|
+
**Import** reads such a file into the current workspace, for the components you choose. Components with a name the
|
|
125
|
+
workspace already has are kept, or replaced with *Replace components with the same name*; nothing is deleted. A
|
|
126
|
+
developer is added only when this installation has a developer of that name (add them under *Developers* first); an
|
|
127
|
+
application group takes the workspace's applications with those aliases. The import is one transaction: a value the
|
|
128
|
+
installation refuses (an invalid URL, a catalog service that doesn't pass the checks) changes nothing, and the page
|
|
129
|
+
says what was added, kept and replaced.
|
|
130
|
+
|
|
95
131
|
### Workspace utilization
|
|
96
132
|
|
|
97
133
|
Administration menu → **Workspace utilization** (`/builder/workspaces/<id>/utilization`; APEX: Workspace
|
|
@@ -210,23 +246,33 @@ The list is `examples/gallery/gallery.json`; add your own starters there as blue
|
|
|
210
246
|
|
|
211
247
|
### Creating an application
|
|
212
248
|
|
|
213
|
-
**Create** (a tile, or `/builder/create`)
|
|
249
|
+
**Create** (a tile, or `/builder/create`) is one page, like APEX's Create Application wizard. Links at the top
|
|
250
|
+
start from a file, pasted data, a blueprint or the App Gallery instead. Then:
|
|
214
251
|
|
|
215
|
-
| Field | Meaning |
|
|
216
|
-
|
|
217
|
-
|
|
|
218
|
-
|
|
|
219
|
-
|
|
|
220
|
-
|
|
|
221
|
-
|
|
|
222
|
-
|
|
|
252
|
+
| Section | Field | Meaning |
|
|
253
|
+
|---|---|---|
|
|
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 |
|
|
255
|
+
| Application | Name | Display name, shown in the header. Proposed from the schema and selected when you click it, so typing replaces it |
|
|
256
|
+
| | Description, Icon | Shown on the home page's hero and the About page |
|
|
257
|
+
| 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 |
|
|
259
|
+
| 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` |
|
|
261
|
+
| | 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) |
|
|
263
|
+
| | Language | The application's primary language |
|
|
264
|
+
| 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)) |
|
|
223
265
|
|
|
224
266
|
Creating the app also:
|
|
225
267
|
|
|
226
268
|
- creates the database role `app_<alias>` with `SELECT/INSERT/UPDATE/DELETE` on all tables,
|
|
227
269
|
`USAGE` on sequences and `EXECUTE` on functions in the schema, plus **default privileges**,
|
|
228
270
|
so tables you create later (as the owner, e.g. in the SQL Workshop) are usable by the app straight away;
|
|
229
|
-
- creates page 1 *Home*, a navigation entry, and an authorization scheme `ADMIN` (role `admin`)
|
|
271
|
+
- creates page 1 *Home*, a navigation entry, and an authorization scheme `ADMIN` (role `admin`);
|
|
272
|
+
- shows a progress message while it works and then opens the new application's page in the builder,
|
|
273
|
+
with what was created (and anything left out) as a message.
|
|
274
|
+
|
|
275
|
+
Everything is created in one transaction: when a page can't be made, nothing is.
|
|
230
276
|
|
|
231
277
|
The parsing schema can't be `meta`, `information_schema` or a `pg_*` schema.
|
|
232
278
|
|
|
@@ -298,18 +344,50 @@ most 4 MB of text; upload larger data as a file.
|
|
|
298
344
|
|
|
299
345
|
### Creating an application from existing tables
|
|
300
346
|
|
|
301
|
-
**Create
|
|
302
|
-
`information_schema` and the `pg_*` schemas aren't offered)
|
|
303
|
-
|
|
347
|
+
**Create**, then a schema under *Data* (`/builder/create?schema=…`; pgkiln's `meta`,
|
|
348
|
+
`information_schema` and the `pg_*` schemas aren't offered): each table and view gets a page type
|
|
349
|
+
under *Pages* (above), or *No page*. The application gets that schema as its parsing schema and a role
|
|
304
350
|
`app_<alias>` with the grants of a blank application on the schema (so **all** tables of the schema,
|
|
305
|
-
not only the
|
|
306
|
-
|
|
307
|
-
key, a report page; a navigation entry each; and optionally a dashboard (a chart per table, as above;
|
|
351
|
+
not only the ones with pages). The pages are made with `meta.generate_page`, with a navigation entry
|
|
352
|
+
each; and optionally a dashboard (a chart per table, as above;
|
|
308
353
|
for existing tables the repeating values come from the planner statistics, so `ANALYZE` a table that
|
|
309
354
|
was never analyzed). Everything is created in one transaction. Foreign keys to tables in another
|
|
310
355
|
schema show in forms as select lists that the app's role may not be allowed to read: grant it, or
|
|
311
356
|
pick a schema that holds them all.
|
|
312
357
|
|
|
358
|
+
#### What the generated pages look like
|
|
359
|
+
|
|
360
|
+
The wizards (every *Create application* flow and the page wizards) make pages that read like APEX's:
|
|
361
|
+
|
|
362
|
+
- **Labels**: names become words. `snake_case` and `camelCase` are split, run-together words are
|
|
363
|
+
recognised (`hiredate` → *Hire Date*, `deptno` → *Department Number*) and common abbreviations are
|
|
364
|
+
expanded (`emp` → *Employee*, `dept` → *Department*, `sal` → *Salary*, `comm` → *Commission*, `mgr` →
|
|
365
|
+
*Manager*, `qty` → *Quantity*, `desc` → *Description*, `pct` → *Percent*, `crm` → *CRM*, `id` → *ID*).
|
|
366
|
+
A foreign key column drops its `_id`/`no` suffix (`deptno` → *Department*), and a column named after
|
|
367
|
+
the table's first letter drops it (`emp.ename` → *Name*). A short `COMMENT ON COLUMN` (one line, at
|
|
368
|
+
most 60 characters, no full stop) is the label; a longer one becomes the item's help text. A short
|
|
369
|
+
`COMMENT ON TABLE` names the pages.
|
|
370
|
+
- **Plural and singular**: report pages, cards and the navigation menu use the plural (*Employees*),
|
|
371
|
+
forms and dialog titles the singular (*Employee*).
|
|
372
|
+
- **Reports** show a foreign key's parent by its display column (a name, title or label, else its first
|
|
373
|
+
text column): *Manager* shows KING, *Department* shows SALES. The key itself stays in the query,
|
|
374
|
+
hidden, so filters can use it. A row starts with a pencil that opens the form.
|
|
375
|
+
- **Files**: a `bytea` column becomes one file upload item that also fills the columns that go with it
|
|
376
|
+
(`<col>_name`/`_filename`, `<col>_mime`/`_mime_type`, `<col>_size`, `<col>_updated`; or `filename`
|
|
377
|
+
and `mime_type` next to the only `bytea` column). Reports leave these columns out. Columns named like
|
|
378
|
+
*photo*, *image* or *logo* accept pictures only.
|
|
379
|
+
- **Numbers** get a format mask with group separators (and the scale's decimals for `numeric(p,s)`),
|
|
380
|
+
in reports and forms alike, in the application's language (*2,850.00*); keys get none.
|
|
381
|
+
- The **Dashboard** comes right after *Home* in the menu; its charts are titled *Employees by Manager*,
|
|
382
|
+
rows without a value are labelled *(none)*, and bar charts show the ten largest values (the rest is
|
|
383
|
+
one *Other* bar). Tables with row-level security are left out (the application's role may see none of
|
|
384
|
+
their rows); the result page says which.
|
|
385
|
+
- The **Home** page has a hero with the application's icon and name, and a card per page of the menu
|
|
386
|
+
(a list `HOME_PAGES`, Shared Components → Lists). A blank application gets the hero only.
|
|
387
|
+
- An **About** page (page 9000: the application's description, or the pages of its menu) in a **Help**
|
|
388
|
+
menu of the header's navigation bar (a list `NAVBAR`, the application's navigation bar list).
|
|
389
|
+
- New applications use the **Iris** base style in the **light** theme; users may switch to dark.
|
|
390
|
+
|
|
313
391
|
### Creating an application from a blueprint
|
|
314
392
|
|
|
315
393
|
**Create → From a blueprint** (`/builder/blueprints`; APEX 26.1: *Blueprints*, spec-driven
|
|
@@ -599,8 +677,12 @@ Chapters 4–7 describe every component type and property.
|
|
|
599
677
|
## Developer toolbar
|
|
600
678
|
|
|
601
679
|
While you are signed in to the builder, the pages of your applications show the **developer
|
|
602
|
-
toolbar**
|
|
603
|
-
|
|
680
|
+
toolbar** when you run them in the same browser (APEX: the Runtime Developer Toolbar): a compact bar
|
|
681
|
+
of icons, centred at the bottom, each with a tooltip. It isn't shown to anyone else, nor inside
|
|
682
|
+
dialogs. The page keeps room for it, so it never covers the menu's last entry or a report's pager.
|
|
683
|
+
After a few seconds without use it shrinks to a slim tab at the edge; point at it or Tab to it to
|
|
684
|
+
bring it back. **Settings** (the last icon) docks it at the bottom, top, left or right and turns the
|
|
685
|
+
hiding off (kept in your browser). It has:
|
|
604
686
|
|
|
605
687
|
| Entry | Does |
|
|
606
688
|
|---|---|
|
|
@@ -609,6 +691,8 @@ Toolbar). It isn't shown to anyone else, nor inside dialogs, and it can be folde
|
|
|
609
691
|
| **Edit page *n*** | This page in the Page Designer |
|
|
610
692
|
| **Quick edit** | (with JavaScript) Point at a region, item or button of the page (it is outlined) and click it: it opens selected in the Page Designer, in the builder's tab (APEX: Quick Edit). Click the button again or press Esc to stop |
|
|
611
693
|
| **Session** | The **session state viewer**: the user, roles, session id, language, time zone and debug level; the values of this page's items, the application items and the items of other pages in the session. A password item's value is never shown. *Clear the items of page n* empties this page's items in the session (APEX: Clear Cache) |
|
|
694
|
+
| **Customize** | The application's Theme Roller in the builder |
|
|
695
|
+
| **Info** | The application, the page, the user and the developer |
|
|
612
696
|
| **Debug** | Records [debug messages](06-processing.md#debug-messages) for **this session only**, at the chosen level, while the application itself stays out of debug (*Application (n)* when the application has a level of its own). *View debug* opens the recorded requests |
|
|
613
697
|
|
|
614
698
|
How it knows you: signing in to the builder gives the browser a second, separate random token for
|
|
@@ -137,7 +137,7 @@ database only checks the shape (at most 12 names of lower case letters, digits a
|
|
|
137
137
|
| [`report`](#report-interactive-report) | Read-only table from a SELECT, with search, filters, sorting, control break, aggregates, highlights, computed columns, group by, pivot and chart views, row selection, saved reports, paging and CSV/Excel/PDF download |
|
|
138
138
|
| [`grid`](#grid-interactive-grid) | Editable table on one database table, with aggregates, frozen, movable and resizable columns, saved grid reports, a row actions menu, master-detail, copy/paste of cells, and single row, group by and chart views |
|
|
139
139
|
| [`form`](#form) | Fields for one row of a table, with automatic fetch and save |
|
|
140
|
-
| [`chart`](#chart) | Bar, column, stacked, line, area, combo, scatter, bubble, donut, pie, gauge, funnel, radar, Gantt, pyramid, polar, range, box plot or
|
|
140
|
+
| [`chart`](#chart) | Bar, column, stacked, line, area, combo, scatter, bubble, donut, pie, gauge, funnel, radar, Gantt, pyramid, polar, range, box plot, stock, treemap, sunburst or timeline chart from a SELECT, with drill-down links |
|
|
141
141
|
| [`cards`](#cards) | Cards or KPI tiles from a SELECT |
|
|
142
142
|
| [`calendar`](#calendar) | Month, week, day and list views of dated rows, with create on click and drag and drop |
|
|
143
143
|
| [`facets`](#facets-faceted-search) | Checkbox, range and star filters with counts and a search field for a report |
|
|
@@ -506,11 +506,14 @@ Attributes:
|
|
|
506
506
|
|
|
507
507
|
| Key | Meaning |
|
|
508
508
|
|---|---|
|
|
509
|
-
| `kind` | `bar` (default), `column`, `stacked`, `line`, `area`, `combo`, `scatter`, `bubble`, `donut`, `pie`, `gauge`, `funnel`, `radar`, `gantt`, `pyramid`, `polar`, `range`, `boxplot` or `
|
|
509
|
+
| `kind` | `bar` (default), `column`, `stacked`, `line`, `area`, `combo`, `scatter`, `bubble`, `donut`, `pie`, `gauge`, `funnel`, `radar`, `gantt`, `pyramid`, `polar`, `range`, `boxplot`, `stock`, `treemap`, `sunburst` or `timeline` |
|
|
510
510
|
| `link` | Drill-down: `{"page": 2, "items": {"P2_DEPTNO": "#deptno#"}}` makes every data point a link (see below) |
|
|
511
511
|
| `gauge` | For `gauge`: `{"min": 0, "max": 120, "warning": 80, "critical": 100}` (all optional) |
|
|
512
512
|
| `format_mask` | A number format mask for the values in labels, tips and the data table, e.g. `"FML999G990"` (see [number formats](14-globalization.md#number-formats)) |
|
|
513
513
|
| `empty` | Text when there are no rows |
|
|
514
|
+
| `gantt_move` | For `gantt` with a `task_id` column: SQL that gives a task new dates, run with `:TASK_ID`, `:NEW_START` and `:NEW_END` ([below](#dragging-tasks-on-a-gantt-chart)) |
|
|
515
|
+
| `gantt_move_authz` | Who may drag: an authorization scheme, or `MUST_NOT_BE_PUBLIC_USER`; empty: everyone who sees the chart |
|
|
516
|
+
| `gantt_snap` | `day` or `hour`: the step of a drag; default days, or hours when a task has a time |
|
|
514
517
|
|
|
515
518
|
| Kind | Best for | Notes |
|
|
516
519
|
|---|---|---|
|
|
@@ -526,6 +529,9 @@ Attributes:
|
|
|
526
529
|
| `funnel` | stages of a process | the first series, in the query's order (sort it); each stage shows its share of the first stage |
|
|
527
530
|
| `radar` | several measures per series, side by side | **one axis per row** (3 to 12 rows), one polygon per series, all on one scale from zero |
|
|
528
531
|
| `gantt` | tasks over time | **label, start, end** (dates or timestamps; an empty end, or one equal to the start, is a milestone ◆), then optional columns **by name**: `progress` (0 to 100, the filled part of the bar), `task_id` and `depends_on` (the ids a task waits for: `3`, `3,4` or an array). A time axis in hours, days, weeks, months or years, a dashed line for now (in the session's time zone, like the timestamps the query returns), and elbow lines from the end of each predecessor to the start of the task. Rows without a start are left out |
|
|
532
|
+
| `treemap` | parts of a whole in a hierarchy | **label, value**, then optional columns **by name** `node_id` and `parent_id` (a node's parent; without `node_id` the label is the id). Rectangles sized by value (a node's own value plus its children's), squarified; the top level as coloured groups with their children inside. One root with children: its children are the top level. Cycles and unknown parents make roots |
|
|
533
|
+
| `sunburst` | the same, as rings | Like `treemap`: the top level as the inner ring, children outwards (up to four rings), the total in the centre and a legend of the top level |
|
|
534
|
+
| `timeline` | events and periods over time | **label, start, end** (an empty end is a point in time), and an optional column named `series`: a lane per series. Items that overlap in a lane get rows of their own |
|
|
529
535
|
| `pyramid` | levels of a hierarchy, or two groups compared per band | **one series**: a triangle cut into segments from the top (the first row) down, each segment's **area** in proportion to its value (≤ 8; more fold into "Other"). **Two series**: back-to-back bars (a population pyramid), the first series to the left, both on one scale; negative values count as their size |
|
|
530
536
|
| `polar` | values per period or direction (months, weekdays) | a polar area chart: **one equal sector per row** (up to 24) clockwise from 12 o'clock, the radius in proportion to the value on rings from zero; several series share a row's sector |
|
|
531
537
|
| `range` | a span per category (lowest and highest, from and to) | **low and high** columns (in either order): a floating column from one to the other; each further pair of columns is another range per row (up to four, with a legend). The axis doesn't have to start at zero |
|
|
@@ -613,6 +619,28 @@ A Gantt chart reads dates as their wall clock (a `timestamptz` in the session's
|
|
|
613
619
|
time only when it is not midnight, and has its own data table (label, start, end, progress,
|
|
614
620
|
dependencies). Its rows count toward the chart's row limit (`max_rows`, default 1000).
|
|
615
621
|
|
|
622
|
+
#### Dragging tasks on a Gantt chart
|
|
623
|
+
|
|
624
|
+
With `gantt_move` (builder: Chart settings → *Gantt: drag and drop*) and a `task_id` column, users who pass
|
|
625
|
+
`gantt_move_authz` change the plan on the chart itself (APEX: the Gantt chart's task dragging):
|
|
626
|
+
|
|
627
|
+
- **drag a task** to move it (start and end by the same number of days or hours);
|
|
628
|
+
- **drag the end of a bar** (its right edge) to make it longer or shorter; a milestone only moves;
|
|
629
|
+
- **with the keyboard**: focus a task, the arrow keys move it, Shift and the arrow keys change its end, Enter saves,
|
|
630
|
+
Escape cancels. A line under the chart says the new dates while you drag or press keys.
|
|
631
|
+
|
|
632
|
+
The server checks the dates (`YYYY-MM-DD`, or `YYYY-MM-DDTHH:MM` by the hour; the end not before the start) and that
|
|
633
|
+
the task is a row the chart's query shows this user, then runs the SQL as the application's database role (row level
|
|
634
|
+
security applies) and sends the chart back. A milestone gets the same start and end. A click without a drag still
|
|
635
|
+
follows the task's drill-down link. Example (HR example part 59):
|
|
636
|
+
|
|
637
|
+
```sql
|
|
638
|
+
update hr.project_task
|
|
639
|
+
set starts = :NEW_START::date,
|
|
640
|
+
ends = case when ends is null then null else :NEW_END::date end -- a milestone keeps no end
|
|
641
|
+
where id = :TASK_ID::int
|
|
642
|
+
```
|
|
643
|
+
|
|
616
644
|
Up to 8 series; two or more get a legend. When an axis has many labels, only some are shown, and in a
|
|
617
645
|
narrow chart (a region of a few columns, a phone) every other one of those. Every chart has hover/focus **tooltips** and a
|
|
618
646
|
**Data table** toggle (the accessible alternative). Colours come from a palette checked for
|
|
@@ -1060,8 +1088,11 @@ and dates, a [format mask](14-globalization.md). New sources offer all columns e
|
|
|
1060
1088
|
ones at first. A view that shows exactly what business users may see is often the best source;
|
|
1061
1089
|
the builder warns when the application's database role may not read it.
|
|
1062
1090
|
|
|
1063
|
-
**Users**
|
|
1064
|
-
|
|
1091
|
+
**Users** start on the region's **welcome page** (APEX 26.1: the Data Reporter's welcome page): a greeting, the data
|
|
1092
|
+
sources as cards (label, description, number of columns), their own reports with the latest changed first, and the
|
|
1093
|
+
reports others shared; with more than six reports (or a search term) a **search** over names and descriptions. A
|
|
1094
|
+
source's card opens a new report in the editor (a plain form: it works without JavaScript, and the URL of a result
|
|
1095
|
+
can be bookmarked or sent):
|
|
1065
1096
|
|
|
1066
1097
|
- **Columns** to show (all offered columns when none are ticked);
|
|
1067
1098
|
- up to five **filters** (column, operator, value; the operators of interactive report filters);
|
|
@@ -1098,6 +1129,8 @@ Attributes (written by the region's **Settings**):
|
|
|
1098
1129
|
| `sharing` | `true` | `false`: reports stay private |
|
|
1099
1130
|
| `share_authz` | | An authorization scheme: only users that pass it may share reports |
|
|
1100
1131
|
| `page_size` | `25` | Rows per page of a detail report (5 to 200) |
|
|
1132
|
+
| `welcome` | `true` | `false`: the compact start (a list of sources and *Start*) instead of the welcome page |
|
|
1133
|
+
| `welcome_title`, `welcome_text` | | The welcome page's greeting instead of pgkiln's (translated like other application texts) |
|
|
1101
1134
|
| `empty` | `No data found.` | Text when there are no rows |
|
|
1102
1135
|
|
|
1103
1136
|
The sources travel with the application export (they are the region's attributes); users'
|
|
@@ -274,11 +274,15 @@ Run these as the owner (in the SQL Workshop, `psql` or migrations):
|
|
|
274
274
|
|
|
275
275
|
| Function | Description |
|
|
276
276
|
|---|---|
|
|
277
|
-
| `meta.generate_crud(app, table, report_page, form_page, label default null, icon default 'table')` | Report page + modal form page + menu entry for a table |
|
|
277
|
+
| `meta.generate_crud(app, table, report_page, form_page, label default null, icon default 'table')` | Report page + modal form page + menu entry for a table, with the column names as labels (kept as it was for existing scripts; `meta.generate_page` *report_form* makes the labelled pages of the wizards) |
|
|
278
278
|
| `meta.generate_grid(app, table, page, label default null, icon default 'grid')` | Interactive grid page + menu entry |
|
|
279
279
|
| `meta.generate_page(app, kind, table, page, options default '{}')` | The create page wizards: `kind` is `form`, `cards`, `calendar`, `chart`, `map`, `facets`, `master_detail` (or `report_form`, `grid`). Options left out take the defaults of `meta.wizard_defaults`; JSON `null` means none. Returns the new page's id (below) |
|
|
280
280
|
| `meta.wizard_defaults(kind, table)` | The options a wizard proposes for a table, from the catalog |
|
|
281
281
|
| `meta.wizard_catalog(table)` | The columns as the wizards see them: kind (`text`, `number`, `date`, `timestamp`, `boolean`, `point`, `geometry`, `binary`, `other`), key, unique, foreign key and the parent's display column |
|
|
282
|
+
| `meta.wizard_label(name)`, `meta.wizard_table_label(table, plural default true)`, `meta.wizard_column_label(table, column)` | (097) The labels of the wizards: `hiredate` → *Hire Date*, `hr.emp` → *Employees* / *Employee*, `deptno` → *Department*; short comments win ([what the generated pages look like](03-builder.md#what-the-generated-pages-look-like)) |
|
|
283
|
+
| `meta.wizard_report(table, columns default null)` | (097) A report on a table as the wizards make it: `{"source", "hidden", "headings", "formats"}` (foreign keys joined to their parent's display column) |
|
|
284
|
+
| `meta.app_activity(days default 30)` | (098) The current application's page views, sign-ins and errors of the last days (1 to 366, at most 10,000 rows, no IP addresses), for a signed-in user with the `admin` role of that application; others get an error. The Activity page of the Create Application wizard reads it |
|
|
285
|
+
| `meta.wizard_files(table)` | (097) The `bytea` columns and the columns holding their file name, mime type, size and change time |
|
|
282
286
|
| `meta.export_app(alias)` | The application as JSON (`pgkiln/2` format) |
|
|
283
287
|
| `meta.import_app(json, alias default null)` | Import an export, optionally under a new alias; returns the new app id |
|
|
284
288
|
| `meta.hash_password(text)` | A bcrypt hash for `meta.app_user.password_hash` / `meta.developer.password_hash` |
|
|
@@ -293,7 +297,7 @@ Options of `meta.generate_page` (all optional; column names must be columns of t
|
|
|
293
297
|
|
|
294
298
|
| Kind | Options |
|
|
295
299
|
|---|---|
|
|
296
|
-
| all | `label` (page name and menu entry), `icon`, `nav` (add a navigation entry; default true, false for `form`) |
|
|
300
|
+
| all | `label` (page name and menu entry; default the table's plural label, singular for `form`), `form_label` (the title of a form page; default the singular label), `icon`, `nav` (add a navigation entry; default true, false for `form`) |
|
|
297
301
|
| `form` | `columns` (array), `mode` (`normal` or `modal`), `return_page` |
|
|
298
302
|
| `cards` | `title`, `subtitle`, `body`, `badge`, `form_page` |
|
|
299
303
|
| `calendar` | `start`, `end`, `title`, `drag` (boolean), `form_page` |
|
|
@@ -62,7 +62,7 @@ What's missing is listed in the [feature parity matrix](../apex-feature-parity.m
|
|
|
62
62
|
| Application date format mask | Settings → Globalization → Date format (Oracle-style masks) |
|
|
63
63
|
| Number format masks (`FML999G999G990D00`) on columns and items | `{"formats": {...}}` on report, grid and cards columns, `{"format_mask": "..."}` on charts and number/display items ([chapter 14](14-globalization.md#number-formats)) |
|
|
64
64
|
| Automatic Time Zone | Settings → Globalization → Time zone and Automatic time zone; My account → Time zone ([chapter 14](14-globalization.md#time-zones)) |
|
|
65
|
-
| Universal Theme's default style (26.1: *Iris*) | Base style *Iris* (the default for new applications) or *Standard* ([chapter 14](14-globalization.md#base-styles-iris-and-standard)) |
|
|
65
|
+
| Universal Theme's default style (26.1: *Iris*) | Base style *Iris* (the default for new applications), *Lavender* or *Standard* ([chapter 14](14-globalization.md#base-styles-iris-lavender-and-standard)) |
|
|
66
66
|
| Theme styles, *Enable End Users to Choose Theme Style* | Theme style (automatic/light/dark) and *Users may choose light or dark*; Theme Roller style variants with *Users may choose a style* ([chapter 14](14-globalization.md#style-variants-theme-roller)) |
|
|
67
67
|
| Template Options (regions, buttons) | *Template options* in the Page Designer: CSS classes from a fixed list ([chapter 4](04-pages-and-regions.md#template-options)) |
|
|
68
68
|
| ORDS | Not needed to serve apps; REST APIs with PostgREST, see [below](#ords-and-postgrest) |
|
|
@@ -26,6 +26,10 @@ src/
|
|
|
26
26
|
blueprint.ts blueprints (migration 063): checkBlueprint (names, types, references, pages, sample rows), tableOrder,
|
|
27
27
|
blueprintSql, buildBlueprint (tables, grants, rows, pages via meta.generate_page, menu), the AI draft schema
|
|
28
28
|
blueprint-from-app.ts (sprint 66) blueprintFromApp: an application's tables (catalog), pages and menu as a blueprint, notes; sample rows
|
|
29
|
+
restcatalog.ts (095) REST source catalogs: checks, fromOpenApi (OpenAPI 3 / Swagger 2 → services: parameters with "key",
|
|
30
|
+
rows and columns from the response schema, write-back from collection and item paths, notes), catalog
|
|
31
|
+
files, load/insert/replace, sourceFromService
|
|
32
|
+
workspace-export.ts (sprint 67) a workspace's components as a file (pgkiln-workspace/1) and importWorkspace (one transaction)
|
|
29
33
|
subscriptions.ts application types and subscriptions (migration 056): offers, subscribe, refresh, publish, in sync
|
|
30
34
|
workingcopy.ts working copies (migration 055): create, three-way compare per component (base, main, copy),
|
|
31
35
|
merge into the main application or refresh the copy, both through cli/replace.ts
|
|
@@ -112,7 +116,7 @@ src/
|
|
|
112
116
|
processes.ts download (file or zip from a query, safe headers), workflow processes, configuration checks of chains
|
|
113
117
|
logic.ts computations, branches (page, URL, function returning a URL, another application) and their conditions
|
|
114
118
|
render.ts page chrome (nav, breadcrumb), dynamic action JSON, theme (the page's nonce'd <style>, light/dark and style switches)
|
|
115
|
-
styles.ts base styles (BASE_STYLES: Iris, Standard; baseStyleOf → html data-style), Theme Roller style variants: fixed lists (fonts, sizes, corners), parseStyle/appStyles checks, the request's
|
|
119
|
+
styles.ts base styles (BASE_STYLES: Iris, Lavender, Standard; baseStyleOf → html data-style), Theme Roller style variants: fixed lists (fonts, sizes, corners), parseStyle/appStyles checks, the request's
|
|
116
120
|
style (user choice, default), themeCss() (only hex values and constants reach the CSS)
|
|
117
121
|
template-options.ts template options: the fixed CSS class list per region and button, templateClasses() (unknown values ignored)
|
|
118
122
|
regions.ts region shell + chart (drill-down links, gauge settings)/cards/dynamic dispatch with row limits, lazy placeholder and cache, buttons (menu buttons, badges)
|
|
@@ -120,7 +124,9 @@ src/
|
|
|
120
124
|
(report.ts: paging with row ranges and max_rows, keyset paging (keysetPlan, seekCondition, signed r<id>_k), pagerNav, streamed CSV/Excel downloads with a cursor;
|
|
121
125
|
items.ts: lovOptions, searchLov/lovLookup for popup LOVs, served by POST /a/:alias/:page/lov/:item/search in routes.ts)
|
|
122
126
|
region-cache.ts region caching (keys per scope, CSRF placeholder, invalidation on submit) and lazy regions (GET …/region/:id is in routes.ts)
|
|
123
|
-
|
|
127
|
+
gantt-move.ts (sprint 69) Gantt drag and drop: ganttEditable, targetTime, moveGanttTask (the task in the region's
|
|
128
|
+
query, gantt_move with :TASK_ID/:NEW_START/:NEW_END); the dragging itself is in app.js
|
|
129
|
+
charts.ts server-rendered charts (SVG and CSS classes): bar … radar, gauges, Gantt (time axis, dependencies), pyramid, polar, range, box plot (quantile, boxes), stock, (sprint 70) treemap and sunburst (buildTree, squarify), timeline, drill-down marks, data table
|
|
124
130
|
calendar.ts calendar region: month/week/day/list views, create links, drag and drop (moveEvent, moveCalendarEvent;
|
|
125
131
|
the route POST …/calendar/:id/move is in routes.ts)
|
|
126
132
|
links.ts page links with checksums; fillItems() fills #column# in link items
|
|
@@ -190,6 +196,11 @@ src/
|
|
|
190
196
|
backupTick() for the scheduler's daily backups of changed applications
|
|
191
197
|
workspace-backups.ts Workspace utilities → Manage backups (sprint 62): the backups of every application of the current
|
|
192
198
|
workspace, back them all up (only the changed ones by default)
|
|
199
|
+
rest-catalogs.ts Workspace utilities → REST Source Catalogs (095): list, import (file, pasted, URL), a catalog and its
|
|
200
|
+
services, download; catalogPicker and "from a catalog" for an application's REST data sources
|
|
201
|
+
workspace-transfer.ts Workspace utilities → Export and import (sprint 67, workspace administrators)
|
|
202
|
+
find-workspace.ts (096) Find my workspace: builderMail (Mail services → Builder mail), workspacesMail, the page (same answer
|
|
203
|
+
for every address, mail after the answer, limits per address and IP)
|
|
193
204
|
availability.ts Application → Availability (migration 083): status, message, users, build status (Run only is
|
|
194
205
|
enforced by locks.ts blockingLock); availabilityBadge() in the application header
|
|
195
206
|
feedback.ts Application → Feedback (migration 084): the setting, the list with filters, status and answers
|
|
@@ -314,6 +325,11 @@ test/
|
|
|
314
325
|
natural-language report filters, builder settings; against ai-script-mock.ts
|
|
315
326
|
blueprints.test.ts blueprints: checks and SQL, review then create (rows, pages, grants), one transaction, AI draft, save
|
|
316
327
|
blueprint-from-app.test.ts a blueprint of HR: checks clean, pages and menu, notes, a working copy with sample rows, workspaces
|
|
328
|
+
rest-catalogs.test.ts OpenAPI/Swagger reading, parameter keys, catalog files, the builder's pages, a data source from a service
|
|
329
|
+
workspace-transfer.test.ts a workspace's export, import into another workspace (added, kept, replaced, all or nothing), groups, access
|
|
330
|
+
tree-charts.test.ts treemap and sunburst (the hierarchy, cycles, squarify), timeline (lanes, rows, points and periods)
|
|
331
|
+
gantt-move.test.ts an editable Gantt's markup, the move route, dates, who may drag, the builder's settings
|
|
332
|
+
find-workspace.test.ts developers' addresses, builder mail, the workspaces mail, the same answer, limits
|
|
317
333
|
ai-builder.test.ts App Builder AI: the builder's service, SQL from a question, explain, describe tables, pages with AI
|
|
318
334
|
ai-script-mock.ts a scripted mock of Claude (SSE, tool_use with a thinking block) and OpenAI (tool calls), reply by reply
|
|
319
335
|
ai-mock.ts a local mock of the Claude Messages API (SSE stream) and OpenAI Chat Completions
|
|
@@ -323,6 +339,7 @@ test/
|
|
|
323
339
|
e2e/items.test.ts sprint 26 item types in a browser: editors, tags, stars, dates, reveal; without JavaScript
|
|
324
340
|
e2e/designer.test.ts page designer: panes per width, drag and drop, keyboard, Arrange buttons, builder theme
|
|
325
341
|
e2e/calendar.test.ts calendar drag and drop and create on click, view switching, chart drill-down
|
|
342
|
+
e2e/gantt.test.ts Gantt drag and drop: moving a task, its end, the keyboard, a click still drills down, the phone
|
|
326
343
|
e2e/globalization.test.ts the browser's time zone (sign-in, app.js), no-JavaScript fallback, a masked number item
|
|
327
344
|
e2e/grid.test.ts interactive grid in a browser: master-detail refresh, move/resize columns, row menu, copy/paste; without JavaScript
|
|
328
345
|
e2e/page-logic.test.ts dialog_closed refreshes a region without a reload, download process in a browser, dialog link without JavaScript
|