pgkiln 0.80.0 → 0.82.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/146_database_model_providers.sql +53 -0
- package/db/migrations/147_condition_types.sql +80 -0
- package/db/migrations/148_validation_types.sql +44 -0
- package/db/migrations/149_dynamic_action_events.sql +45 -0
- package/db/migrations/150_process_types.sql +23 -0
- package/db/migrations/151_item_types.sql +16 -0
- package/db/migrations/152_workflow_diagram_region.sql +10 -0
- package/docs/apex-feature-parity.md +12 -10
- package/docs/guide/02-concepts.md +3 -3
- package/docs/guide/03-builder.md +13 -3
- package/docs/guide/04-pages-and-regions.md +17 -3
- package/docs/guide/05-items.md +5 -0
- package/docs/guide/06-processing.md +104 -17
- package/docs/guide/07-dynamic-actions.md +16 -1
- package/docs/guide/11-from-apex.md +7 -0
- package/examples/hr/hr_79_condition_types.sql +17 -0
- package/package.json +1 -1
- package/public/app.css +12 -0
- package/public/app.js +157 -9
- package/src/ai/embeddings.ts +20 -7
- package/src/appfiles.ts +4 -4
- package/src/builder/advisor.ts +43 -7
- package/src/builder/code-editor.ts +14 -10
- package/src/builder/components.ts +51 -21
- package/src/builder/conditions.ts +64 -0
- package/src/builder/db-users.ts +124 -118
- package/src/builder/designer.ts +9 -1
- package/src/builder/home.ts +42 -40
- package/src/builder/i18n/de.ts +464 -0
- package/src/builder/i18n/en.ts +464 -0
- package/src/builder/i18n/es.ts +464 -0
- package/src/builder/i18n/fr.ts +464 -0
- package/src/builder/i18n/it.ts +464 -0
- package/src/builder/i18n/ja.ts +464 -0
- package/src/builder/i18n/ko.ts +464 -0
- package/src/builder/i18n/nl.ts +464 -0
- package/src/builder/i18n/pt.ts +464 -0
- package/src/builder/i18n/zh-cn.ts +464 -0
- package/src/builder/i18n/zh-tw.ts +464 -0
- package/src/builder/instance.ts +27 -23
- package/src/builder/ldap.ts +50 -47
- package/src/builder/mail-queue.ts +50 -45
- package/src/builder/network-access.ts +46 -43
- package/src/builder/region-help.ts +3 -1
- package/src/builder/region-settings.ts +30 -5
- package/src/builder/vector-column.ts +3 -3
- package/src/builder/vector-providers.ts +16 -5
- package/src/i18n/ar.ts +5 -0
- package/src/i18n/cs.ts +5 -0
- package/src/i18n/da.ts +5 -0
- package/src/i18n/de.ts +5 -0
- package/src/i18n/el.ts +5 -0
- package/src/i18n/es.ts +5 -0
- package/src/i18n/fi.ts +5 -0
- package/src/i18n/fr.ts +5 -0
- package/src/i18n/he.ts +5 -0
- package/src/i18n/it.ts +5 -0
- package/src/i18n/ja.ts +5 -0
- package/src/i18n/ko.ts +5 -0
- package/src/i18n/nb.ts +5 -0
- package/src/i18n/pl.ts +5 -0
- package/src/i18n/pt.ts +5 -0
- package/src/i18n/ru.ts +5 -0
- package/src/i18n/sv.ts +5 -0
- package/src/i18n/tr.ts +5 -0
- package/src/i18n/uk.ts +5 -0
- package/src/i18n/zh.ts +5 -0
- package/src/i18n.ts +10 -0
- package/src/metadata.ts +72 -9
- package/src/runtime/authz.ts +9 -5
- package/src/runtime/context.ts +4 -0
- package/src/runtime/da-styles.ts +37 -0
- package/src/runtime/documents.ts +3 -2
- package/src/runtime/engine.ts +95 -13
- package/src/runtime/items.ts +33 -0
- package/src/runtime/logic.ts +79 -8
- package/src/runtime/maps.ts +50 -4
- package/src/runtime/process-types.ts +139 -0
- package/src/runtime/processes.ts +2 -0
- package/src/runtime/regions.ts +4 -0
- package/src/runtime/render.ts +13 -2
- package/src/runtime/routes.ts +2 -2
- package/src/runtime/workflow-diagram.ts +45 -0
- package/src/vector.ts +3 -3
- package/src/workflow.ts +10 -2
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
-- Sprint 151 (AP-1 leftover; APEX: a Vector Provider with an ONNX model loaded in the database): vector providers of
|
|
2
|
+
-- type database_model. The model runs inside PostgreSQL, through an extension (engine), with no AI service:
|
|
3
|
+
--
|
|
4
|
+
-- {"name": "DOCS_E5", "type": "database_model", "engine": "pgml", "model": "intfloat/e5-small-v2", "dimensions": 384}
|
|
5
|
+
--
|
|
6
|
+
-- engine pgml (PostgresML): pgml.embed(model, text) runs the model (Hugging Face transformers, ONNX among them) in the
|
|
7
|
+
-- database server and returns real[]. Like a function provider, meta.embed() runs it as the caller (its grants
|
|
8
|
+
-- apply: the application's role needs USAGE on schema pgml), so vector columns are kept at once by their trigger,
|
|
9
|
+
-- searches embed the search text in the query, and a Retrieve tool needs no AI service. The model name is a
|
|
10
|
+
-- parameter, never SQL. Other engines can be added here (the list in src/ai/embeddings.ts names them).
|
|
11
|
+
|
|
12
|
+
create or replace function meta.embed(p_text text, p_provider text, p_app int default null) returns real[]
|
|
13
|
+
language plpgsql stable set search_path = meta, pg_catalog as $$
|
|
14
|
+
declare
|
|
15
|
+
v jsonb := meta.vector_provider(p_provider, p_app);
|
|
16
|
+
fn text;
|
|
17
|
+
r real[];
|
|
18
|
+
begin
|
|
19
|
+
if v is null then
|
|
20
|
+
raise exception 'meta.embed: there is no vector provider %', upper(p_provider);
|
|
21
|
+
end if;
|
|
22
|
+
if p_text is null then
|
|
23
|
+
return null;
|
|
24
|
+
end if;
|
|
25
|
+
if v->>'type' = 'database_model' then
|
|
26
|
+
-- (146) a model in the database
|
|
27
|
+
if v->>'engine' is distinct from 'pgml' then
|
|
28
|
+
raise exception 'meta.embed: vector provider % has engine %, which pgkiln doesn''t know (pgml)', v->>'name', coalesce(v->>'engine', '(none)');
|
|
29
|
+
end if;
|
|
30
|
+
if coalesce(v->>'model', '') !~ '^[A-Za-z0-9][A-Za-z0-9._:/@-]{0,199}$' then
|
|
31
|
+
raise exception 'meta.embed: the model of vector provider % is a model name', v->>'name';
|
|
32
|
+
end if;
|
|
33
|
+
if to_regprocedure('pgml.embed(text, text, jsonb)') is null then
|
|
34
|
+
raise exception 'meta.embed: vector provider % runs model % with PostgresML, which is not installed in this database (create extension pgml)', v->>'name', v->>'model'
|
|
35
|
+
using errcode = '42883';
|
|
36
|
+
end if;
|
|
37
|
+
execute 'select (pgml.embed($1, $2))::real[]' into r using v->>'model', p_text;
|
|
38
|
+
elsif v->>'type' = 'function' then
|
|
39
|
+
fn := v->>'function';
|
|
40
|
+
if fn !~ '^[A-Za-z_][A-Za-z0-9_]{0,62}\.[A-Za-z_][A-Za-z0-9_]{0,62}$' then
|
|
41
|
+
raise exception 'meta.embed: the function of vector provider % is schema.name', v->>'name';
|
|
42
|
+
end if;
|
|
43
|
+
execute format('select (%I.%I($1))::real[]', split_part(fn, '.', 1), split_part(fn, '.', 2)) into r using p_text;
|
|
44
|
+
else
|
|
45
|
+
raise exception 'meta.embed: vector provider % uses AI service %, which the pgkiln server calls: use it in a vector search configuration, a Retrieve tool or a vector column (Table Properties › Add vector column); in SQL only function and database model providers embed',
|
|
46
|
+
v->>'name', v->>'service';
|
|
47
|
+
end if;
|
|
48
|
+
if r is not null and cardinality(r) is distinct from (v->>'dimensions')::int then
|
|
49
|
+
raise exception 'meta.embed: vector provider % returned % dimensions, it has %', v->>'name', cardinality(r), v->>'dimensions';
|
|
50
|
+
end if;
|
|
51
|
+
return r;
|
|
52
|
+
end
|
|
53
|
+
$$;
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
-- Sprint 154 (CD-2; APEX: Server-side Condition): one catalogue of server-side condition types for every
|
|
2
|
+
-- component. Processes, computations, branches and application computations had eight types (migration 029);
|
|
3
|
+
-- regions, buttons, items, validations and dynamic actions only a SQL expression or nothing. Now all of them
|
|
4
|
+
-- choose from the same list (meta.condition_ok checks each type's expression and value):
|
|
5
|
+
--
|
|
6
|
+
-- sql, exists, not_exists, function_body expression: a boolean expression / a query / a PL/pgSQL body
|
|
7
|
+
-- item_null, item_not_null, item_zero, item_not_zero, item_null_or_zero, item_not_null_or_zero
|
|
8
|
+
-- expression: an item name
|
|
9
|
+
-- item_equals, item_not_equals expression: an item; value: the value
|
|
10
|
+
-- item_equals_item, item_not_equals_item expression: an item; value: the other item's name
|
|
11
|
+
-- item_in_list, item_not_in_list expression: an item; value: a colon-separated list (A:B:C)
|
|
12
|
+
-- request_in, request_not_in value: button names, comma separated
|
|
13
|
+
-- page_in, page_not_in value: page numbers, comma separated
|
|
14
|
+
-- page_is_dialog, page_is_not_dialog, user_signed_in, user_public, always, never
|
|
15
|
+
-- language_in, language_not_in value: language codes, comma separated (de, pt-br)
|
|
16
|
+
--
|
|
17
|
+
-- The simple types are decided by the server without a query; only sql, exists, not_exists and function_body run
|
|
18
|
+
-- SQL, as the application's role.
|
|
19
|
+
--
|
|
20
|
+
-- Regions and buttons keep their `condition` column as the expression: without a condition type it is SQL, as
|
|
21
|
+
-- before, so existing applications and exports keep working. Items and validations get condition_type /
|
|
22
|
+
-- condition_expr / condition_value like processes; dynamic actions get server_condition_type / _expr / _value
|
|
23
|
+
-- (their condition_type is the client-side condition).
|
|
24
|
+
|
|
25
|
+
create or replace function meta.condition_ok(p_type text, p_expr text, p_value text) returns boolean
|
|
26
|
+
language sql immutable set search_path = meta, pg_catalog as $$
|
|
27
|
+
select case
|
|
28
|
+
when p_type is null then true
|
|
29
|
+
when p_type in ('sql', 'exists', 'not_exists', 'function_body') then coalesce(trim(p_expr), '') <> ''
|
|
30
|
+
when p_type in ('item_null', 'item_not_null', 'item_zero', 'item_not_zero', 'item_null_or_zero', 'item_not_null_or_zero',
|
|
31
|
+
'item_equals', 'item_not_equals') then coalesce(p_expr, '') ~ '^[A-Z][A-Z0-9_]*$'
|
|
32
|
+
when p_type in ('item_equals_item', 'item_not_equals_item')
|
|
33
|
+
then coalesce(p_expr, '') ~ '^[A-Z][A-Z0-9_]*$' and coalesce(p_value, '') ~ '^ *[A-Z][A-Z0-9_]* *$'
|
|
34
|
+
when p_type in ('item_in_list', 'item_not_in_list')
|
|
35
|
+
then coalesce(p_expr, '') ~ '^[A-Z][A-Z0-9_]*$' and coalesce(p_value, '') <> '' and length(p_value) <= 4000
|
|
36
|
+
when p_type in ('request_in', 'request_not_in') then coalesce(p_value, '') ~ '^ *[A-Z][A-Z0-9_]* *(, *[A-Z][A-Z0-9_]* *)*$'
|
|
37
|
+
when p_type in ('page_in', 'page_not_in') then coalesce(p_value, '') ~ '^ *[0-9]{1,9} *(, *[0-9]{1,9} *)*$'
|
|
38
|
+
when p_type in ('language_in', 'language_not_in')
|
|
39
|
+
then coalesce(p_value, '') ~ '^ *[a-zA-Z]{2,3}(-[a-zA-Z0-9]{2,8})? *(, *[a-zA-Z]{2,3}(-[a-zA-Z0-9]{2,8})? *)*$'
|
|
40
|
+
when p_type in ('page_is_dialog', 'page_is_not_dialog', 'user_signed_in', 'user_public', 'always', 'never') then true
|
|
41
|
+
else false
|
|
42
|
+
end
|
|
43
|
+
$$;
|
|
44
|
+
|
|
45
|
+
-- the eight-value lists of 029, 039 and 102 give way to condition_ok, which knows every type
|
|
46
|
+
alter table meta.computation drop constraint computation_condition_type_check;
|
|
47
|
+
alter table meta.branch drop constraint branch_condition_type_check;
|
|
48
|
+
alter table meta.process drop constraint process_condition_type_check;
|
|
49
|
+
alter table meta.app_computation drop constraint app_computation_condition_type_check;
|
|
50
|
+
|
|
51
|
+
-- regions and buttons: `condition` is the expression (SQL when no type is set)
|
|
52
|
+
alter table meta.region
|
|
53
|
+
add column condition_type text,
|
|
54
|
+
add column condition_value text,
|
|
55
|
+
add constraint region_condition_ok check (meta.condition_ok(coalesce(condition_type, case when coalesce(trim(condition), '') <> '' then 'sql' end), condition, condition_value));
|
|
56
|
+
alter table meta.button
|
|
57
|
+
add column condition_type text,
|
|
58
|
+
add column condition_value text,
|
|
59
|
+
add constraint button_condition_ok check (meta.condition_ok(coalesce(condition_type, case when coalesce(trim(condition), '') <> '' then 'sql' end), condition, condition_value));
|
|
60
|
+
|
|
61
|
+
-- items (not rendered, not accepted on submit when false) and validations (skipped when false)
|
|
62
|
+
alter table meta.item
|
|
63
|
+
add column condition_type text,
|
|
64
|
+
add column condition_expr text,
|
|
65
|
+
add column condition_value text,
|
|
66
|
+
add constraint item_condition_ok check (meta.condition_ok(condition_type, condition_expr, condition_value));
|
|
67
|
+
alter table meta.validation
|
|
68
|
+
add column condition_type text,
|
|
69
|
+
add column condition_expr text,
|
|
70
|
+
add column condition_value text,
|
|
71
|
+
add constraint validation_condition_ok check (meta.condition_ok(condition_type, condition_expr, condition_value));
|
|
72
|
+
|
|
73
|
+
-- dynamic actions: a server-side condition decides whether the action is on the page at all
|
|
74
|
+
alter table meta.dynamic_action
|
|
75
|
+
add column server_condition_type text,
|
|
76
|
+
add column server_condition_expr text,
|
|
77
|
+
add column server_condition_value text,
|
|
78
|
+
add constraint dynamic_action_server_condition_ok check (meta.condition_ok(server_condition_type, server_condition_expr, server_condition_value));
|
|
79
|
+
|
|
80
|
+
comment on function meta.condition_ok(text, text, text) is 'Is a server-side condition well formed? The catalogue of condition types shared by every component (147).';
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
-- Sprint 155 (CD-1; APEX: Validation types): declarative validation types, an authorization scheme, Always execute and
|
|
2
|
+
-- an error display location. Validations had three types (not_null, sql, regex); now APEX's list:
|
|
3
|
+
--
|
|
4
|
+
-- sql expression: a boolean SQL expression that must be true (APEX: Expression)
|
|
5
|
+
-- exists / not_exists expression: a query that must return a row / no row (Rows returned / No rows returned)
|
|
6
|
+
-- function_body expression: a PL/pgSQL body returning boolean (Function Body returning Boolean)
|
|
7
|
+
-- function_error expression: a PL/pgSQL body returning the error text, or null when valid (… returning Error Text)
|
|
8
|
+
-- not_null, not_null_or_zero, not_zero, no_spaces, alphanumeric, numeric, valid_date, valid_timestamp
|
|
9
|
+
-- the associated item (Item is NOT NULL / NOT NULL or zero / NOT zero / contains no spaces /
|
|
10
|
+
-- is alphanumeric / is numeric / is a valid date / is a valid timestamp)
|
|
11
|
+
-- equals, not_equals the item's value is / isn't the expression (Item = Value / Item != Value)
|
|
12
|
+
-- in_list, not_in_list the item's value is / isn't one of the expression's values, colon separated (Item is (NOT) contained in Value)
|
|
13
|
+
-- chars_only, chars_any, chars_none
|
|
14
|
+
-- the item's value contains only / at least one of / none of the expression's characters
|
|
15
|
+
-- regex the item's value matches the expression (POSIX, checked in PostgreSQL)
|
|
16
|
+
--
|
|
17
|
+
-- Format checks pass an empty item (add not_null for a required one), as in APEX. display_location: where the error
|
|
18
|
+
-- shows: inline with the item and in the page's notification (inline_and_notification), inline only (null, as
|
|
19
|
+
-- before: the notification says "correct the errors below"), or in the notification only.
|
|
20
|
+
|
|
21
|
+
alter table meta.validation drop constraint validation_type_check;
|
|
22
|
+
alter table meta.validation
|
|
23
|
+
add constraint validation_type_check check (type in (
|
|
24
|
+
'sql', 'exists', 'not_exists', 'function_body', 'function_error',
|
|
25
|
+
'not_null', 'not_null_or_zero', 'not_zero', 'no_spaces', 'alphanumeric', 'numeric', 'valid_date', 'valid_timestamp',
|
|
26
|
+
'equals', 'not_equals', 'in_list', 'not_in_list', 'chars_only', 'chars_any', 'chars_none', 'regex')),
|
|
27
|
+
-- the types that test an item need one; the others need their expression (a value may be empty for equals)
|
|
28
|
+
add constraint validation_type_fields check (
|
|
29
|
+
(type in ('sql', 'exists', 'not_exists', 'function_body', 'function_error') and coalesce(trim(expression), '') <> '')
|
|
30
|
+
or (type in ('not_null', 'not_null_or_zero', 'not_zero', 'no_spaces', 'alphanumeric', 'numeric', 'valid_date', 'valid_timestamp', 'equals', 'not_equals')
|
|
31
|
+
and coalesce(item_name, '') ~ '^[A-Z][A-Z0-9_]*$')
|
|
32
|
+
or (type in ('in_list', 'not_in_list', 'chars_only', 'chars_any', 'chars_none', 'regex')
|
|
33
|
+
and coalesce(item_name, '') ~ '^[A-Z][A-Z0-9_]*$' and coalesce(expression, '') <> '')
|
|
34
|
+
-- (before 148 an sql validation could be saved without an expression: it passed; keep those rows valid)
|
|
35
|
+
or (type = 'sql' and expression is null)
|
|
36
|
+
or (type = 'regex' and item_name is null)
|
|
37
|
+
or (type = 'not_null' and item_name is null)
|
|
38
|
+
),
|
|
39
|
+
add column authz text,
|
|
40
|
+
add column always_execute boolean not null default false,
|
|
41
|
+
add column display_location text check (display_location in ('inline_and_notification', 'inline', 'notification'));
|
|
42
|
+
|
|
43
|
+
comment on column meta.validation.always_execute is 'Runs for a DELETE request too (148), like APEX''s Always Execute: other validations without When button pressed are skipped for DELETE.';
|
|
44
|
+
comment on column meta.validation.display_location is 'Where the error shows (148): inline_and_notification, inline (null: inline, with a "correct the errors below" notice) or notification.';
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
-- Sprint 156 (CD-3, part 1; APEX: Dynamic Action events, client-side conditions and actions).
|
|
2
|
+
--
|
|
3
|
+
-- Events (besides change, click, load, …):
|
|
4
|
+
-- double_click items, buttons or regions (trigger: their names / region ids or static ids)
|
|
5
|
+
-- key_down, key_press a key goes down in an item / a key that types a character (trigger: item names)
|
|
6
|
+
-- mouse_enter, mouse_leave the pointer enters / leaves an item, a button or a region
|
|
7
|
+
-- select text is selected in an item
|
|
8
|
+
-- resize, scroll the window (no trigger)
|
|
9
|
+
-- page_unload the page is left (pagehide; only quick, local actions finish)
|
|
10
|
+
-- before_refresh a region is about to be refreshed (trigger: region ids or static ids)
|
|
11
|
+
-- facets_change a faceted search or smart filters region's facets changed (trigger: that region)
|
|
12
|
+
-- Client-side conditions (besides equals, not_equals, in_list, is_null, is_not_null):
|
|
13
|
+
-- greater, greater_equal, less, less_equal numbers compared as numbers, ISO dates as dates, else text
|
|
14
|
+
-- not_in_list not one of the comma-separated values
|
|
15
|
+
-- Actions (besides the 32 of 001–124):
|
|
16
|
+
-- cancel_event stops the actions after it, and the event's own effect (a button's submit or link)
|
|
17
|
+
-- set_style config {"styles": {"color": "#b42318", "font-weight": "bold"}} on the affected items / region
|
|
18
|
+
-- (a fixed list of properties; values without url() or expressions: checked in the builder and
|
|
19
|
+
-- again before they reach the page)
|
|
20
|
+
-- collapse_tree, expand_tree every node of the affected tree region
|
|
21
|
+
-- show_ai_assistant opens the affected AI assistant region (or its inline dialog) and focuses its input
|
|
22
|
+
-- trigger_geocoding the affected geocoded address item looks its text up (its Check address button)
|
|
23
|
+
-- open_report_dialog code: the dialog of the affected interactive report to open (filter, columns,
|
|
24
|
+
-- sort, highlight, compute, aggregate, chart, group, pivot, break, rows, saved)
|
|
25
|
+
|
|
26
|
+
alter table meta.dynamic_action drop constraint dynamic_action_event_check;
|
|
27
|
+
alter table meta.dynamic_action add constraint dynamic_action_event_check check (event in (
|
|
28
|
+
'change', 'click', 'load', 'dialog_closed', 'after_refresh', 'selection_change', 'focus', 'blur', 'key_release', 'before_submit', 'custom', 'menu_entry',
|
|
29
|
+
'double_click', 'key_down', 'key_press', 'mouse_enter', 'mouse_leave', 'select', 'resize', 'scroll', 'page_unload', 'before_refresh', 'facets_change'));
|
|
30
|
+
|
|
31
|
+
alter table meta.dynamic_action drop constraint dynamic_action_condition_type_check;
|
|
32
|
+
alter table meta.dynamic_action add constraint dynamic_action_condition_type_check check (condition_type in (
|
|
33
|
+
'equals', 'not_equals', 'in_list', 'is_null', 'is_not_null', 'greater', 'greater_equal', 'less', 'less_equal', 'not_in_list'));
|
|
34
|
+
|
|
35
|
+
alter table meta.dynamic_action drop constraint dynamic_action_action_check;
|
|
36
|
+
alter table meta.dynamic_action add constraint dynamic_action_action_check check (action in (
|
|
37
|
+
'show', 'hide', 'enable', 'disable', 'set_value', 'execute_sql', 'refresh_region', 'refresh_item', 'alert', 'submit', 'set_focus', 'add_class',
|
|
38
|
+
'remove_class', 'show_success', 'show_error', 'clear_errors', 'ai_generate', 'execute_javascript', 'plugin', 'push_subscribe', 'confirm',
|
|
39
|
+
'close_dialog', 'cancel_dialog', 'clear', 'open_region', 'close_region', 'download', 'print', 'current_position', 'share', 'wait_popup',
|
|
40
|
+
'remove_wait_popup',
|
|
41
|
+
'cancel_event', 'set_style', 'collapse_tree', 'expand_tree', 'show_ai_assistant', 'trigger_geocoding', 'open_report_dialog'));
|
|
42
|
+
|
|
43
|
+
alter table meta.dynamic_action add constraint dynamic_action_report_dialog_check check (
|
|
44
|
+
action <> 'open_report_dialog'
|
|
45
|
+
or coalesce(trim(code), '') in ('filter', 'columns', 'sort', 'highlight', 'compute', 'aggregate', 'chart', 'group', 'pivot', 'break', 'rows', 'saved'));
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
-- Sprint 157 (CD-4; APEX: page process types): declarative types for what APEX applications do in processes.
|
|
2
|
+
-- Each calls what pgkiln already has; its settings are in config (checked by the builder and again when it runs):
|
|
3
|
+
--
|
|
4
|
+
-- close_dialog {"items": ["P5_ID"]}: closes the modal page after the submit, handing these items' values to
|
|
5
|
+
-- the page below (items of the same name there are set before its Dialog Closed actions)
|
|
6
|
+
-- clear_session_state {"items": [...], "pages": [3, 4], "all": false}: empties items, every P<n>_ item of the pages,
|
|
7
|
+
-- or all page and application items (APEX: Clear Session State)
|
|
8
|
+
-- reset_pagination the reports and grids of the page start on their first page after the submit
|
|
9
|
+
-- user_preferences {"action": "set" | "reset", "preference": "NAME", "item": "P1_X"} (meta.set_preference)
|
|
10
|
+
-- server_geocoding {"address_item": "P3_ADDRESS", "coordinates_item": "P3_LOCATION", "country": "nl"}: the
|
|
11
|
+
-- installation's geocoder; the first place's "lat,lng" into the coordinates item
|
|
12
|
+
-- print_report {"document": "NAME"}: a document template or report query, sent as the answer
|
|
13
|
+
-- human_task_create {"definition": "LEAVE_APPROVAL", "detail_pk": "&P7_ID.", "parameters": {…}, "id_item": "P7_TASK_ID"}
|
|
14
|
+
-- human_task_manage {"action": "approve" | "reject" | "complete" | "claim" | "release" | "delegate" | "cancel",
|
|
15
|
+
-- "task": "&P8_TASK_ID.", "outcome": …, "to": …, "comment": …} (the task functions check who may)
|
|
16
|
+
-- form_init APEX's Form – Initialization: the form region fetches its row by itself, so it does nothing;
|
|
17
|
+
-- imported pages keep it visible
|
|
18
|
+
|
|
19
|
+
alter table meta.process drop constraint process_type_check;
|
|
20
|
+
alter table meta.process add constraint process_type_check check (type in (
|
|
21
|
+
'ai_generate', 'chain', 'data_load', 'download', 'form_dml', 'grid_dml', 'invoke_api', 'sql', 'workflow', 'plugin', 'send_push', 'send_email',
|
|
22
|
+
'close_dialog', 'clear_session_state', 'reset_pagination', 'user_preferences', 'server_geocoding', 'print_report',
|
|
23
|
+
'human_task_create', 'human_task_manage', 'form_init'));
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
-- Sprint 158 (CD-5; APEX 26.2 page items): Image Upload, Percent Graph, Display Map and Text Field with autocomplete.
|
|
2
|
+
--
|
|
3
|
+
-- image_upload a file item for pictures: image/* only, a preview, cropping (config "crop": free, 1:1, 4:3 …; default
|
|
4
|
+
-- free) and a maximum size applied in the browser before upload ("max_px", default 1600); the column
|
|
5
|
+
-- and file settings are a file item's
|
|
6
|
+
-- percent_graph display only: a 0–100 value as a bar (a <progress> element)
|
|
7
|
+
-- display_map display only: a small map of "lat,lng" (the item's value, or config "coordinates_item") with a pin,
|
|
8
|
+
-- from the map regions' tile server (MAP_TILE_URL); config "zoom" (default 15)
|
|
9
|
+
-- autocomplete a text field with suggestions from the list of values; any text may be entered (a one-value combobox)
|
|
10
|
+
|
|
11
|
+
alter table meta.item drop constraint item_type_check;
|
|
12
|
+
alter table meta.item add constraint item_type_check check (type in (
|
|
13
|
+
'text', 'textarea', 'number', 'date', 'datetime', 'select', 'radio', 'checkbox', 'switch', 'hidden', 'display', 'password',
|
|
14
|
+
'checkbox_group', 'multiselect', 'popup_lov', 'email', 'tel', 'url', 'color', 'file', 'location', 'richtext', 'markdown', 'rating',
|
|
15
|
+
'combobox', 'daterange', 'qrcode', 'plugin', 'image', 'address', 'shuttle', 'select_one', 'select_many',
|
|
16
|
+
'image_upload', 'percent_graph', 'display_map', 'autocomplete'));
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
-- Sprint 160 (CD-7; APEX: Workflow Diagram region, 24.2+): a region that draws one workflow instance in a running
|
|
2
|
+
-- application: its steps, the ones it went through, where it is now, and a failed step in red, with who and when in
|
|
3
|
+
-- each step's tooltip. config {"instance_item": "P9_WORKFLOW_ID"}: the item that holds the instance id. The instance
|
|
4
|
+
-- is read through meta.workflows, so a user sees only workflows they started or administer.
|
|
5
|
+
|
|
6
|
+
alter table meta.region drop constraint region_type_check;
|
|
7
|
+
alter table meta.region add constraint region_type_check check (type in (
|
|
8
|
+
'report', 'form', 'chart', 'cards', 'static', 'grid', 'calendar', 'dynamic', 'facets', 'tasks', 'workflows', 'map', 'tree',
|
|
9
|
+
'template_component', 'smart_filters', 'display_selector', 'list', 'data_reporter', 'ai_assistant', 'plugin', 'url', 'search', 'login',
|
|
10
|
+
'form_designer', 'classic_report', 'breadcrumb', 'help_text', 'workflow_diagram'));
|
|
@@ -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-11-05 against **APEX 26.2** (sprint 150: remote databases, another PostgreSQL database's tables as foreign tables the applications query (REST Enabled SQL, AP-7 leftover); sprint 149: running workflow instances inside parallel branches migrate to a newer version (WS-6 leftover); sprint 148: the AI assistant streams its answers as the model writes them (WS-4 leftover); sprint 147: `pgkiln advise --offline` checks an export's files without a database (AP-10 leftover); sprint 146: the Advisor checks JSON sources' views against their data profile (AP-8 leftover); sprint 145: the texts that offered AI with "Claude or OpenAI" name all four providers: Claude, OpenAI, Gemini and OpenAI-compatible services (AP-11); sprint 144: `pgkiln advise` for CI with text, JSON and SARIF output (APEXlang static analysis / SQLcl CodeScan), security checks in the Advisor, and working copies and locks from the command line and MCP (the Working Copy APIs) (AP-10); sprint 143: the interactive report's 26.2 dialogs: *is one of* / *is not one of* filters with the column's values and counts, *is between* two values (dates with the date picker in the application's format), relative periods on date columns, and the column order by drag and drop or arrow buttons, followed by downloads and the PDF (AP-9); sprint 142: JSON sources with a data profile and updatable views whose arrays are rows, document views of a table with its children (APEX's duality views), JSON path columns in reports (AP-8); sprint 141: static workspace files (`#WORKSPACE_FILES#`), remote servers for REST data sources, catalogs and AI services (an environment variable per environment), and workspace-level web credentials (AP-7); sprint 140: the items Shuttle (ordered), Select One and Select Many, the regions Classic Report (report templates, pagination types), Breadcrumb and Help Text with a page help text, and a [mapping of every APEX item and region type](#item-and-region-types-one-by-one) (AP-4); sprint 139: OpenTelemetry, traces with a span per SQL statement, web call, AI request and tool call, logs, metrics and `/metrics` for Prometheus, browser spans relayed by pgkiln, per workspace off or its own collector (AP-6); sprint 138: an application's Utilities tab with a dashboard, database object dependencies, change history per component, Upgrade application, UI defaults (APEX's Attribute Dictionary), application and page checksums and an icon browser (AP-5); sprint 137: Create page as a grid of page types with previews, the page types interactive report, smart filters, search page, data loading, tree, timeline, media list, content row, comments, dashboard, wizard, unified task list and workflow console, a Feature tab with nine features that install once, and Create page as copy with shared components mapped or copied (AP-3); sprint 136: vector providers (an AI service with an embedding model or a SQL function), `meta.embed`, *Add vector column* in Table Properties with an HNSW index and a queue that keeps embeddings current, search types vector and hybrid (reciprocal rank fusion with full-text) and a Retrieve (RAG) tool for AI agents, all as the app's role through RLS, on pgvector (AP-1); sprint 135: full-text search configurations, APEX's Oracle Text search type on PostgreSQL full-text search with stemming, ranking, highlights, *Did you mean* and *Add full-text search* in Table Properties (AP-2); sprint 134: the builder also in Italiano, 中文 (简体), 中文 (繁體), 日本語 and 한국어, APEX's ten builder languages plus Nederlands (SEC-5); sprints 121, 123–125: the builder in Deutsch, English, Español, Français, Nederlands and Português, step by step: the frame, sign-in, Workspace home, App Builder, Page Designer menus, the SQL Workshop's home, SQL Worksheet, Object Browser and Table Properties, Shared Components, application settings, users, identity providers, developers and workspaces (WS-7); sprint 122: *Ask in your own words* sets faceted search and smart filter facets, smart filters read a typed phrase (WS-5), and Sample Maps, Sample Approvals, Sample Data Loading and Sample Files in the App Gallery (WS-8); sprint 120: the App Gallery's single-topic sample apps (charts, cards, calendar, interactive grids, dynamic actions, reporting), the UX Pattern Catalog and a Utility Apps tab with Lookup Lists, Release Notes and Announcements (WS-8); sprint 119: data security per table, a roles × columns matrix and masked values per application role in a masking view, the same identity for pages, AI tools, REST, AutoREST and MCP (WS-13); sprint 118: Administration → Mail queue with delivery per hour and per workspace, the slowest provider calls and failures with Retry and Purge, a workspace's own mail service, and workspace network access lists that narrow the installation's allow-list (WS-9); sprint 117: Pillar Light and Pillar Dark navigation appearances with a header strip, clearer navigation tree states, subtle colour utilities, RTL; sprint 116: the comparison moved from 26.1 to 26.2, with a section for the 26.2 workspace items WS-1 … WS-13 and OCI managed identities; the App Builder list with Updated by, working copies and the lock; `pgkiln import --only`, a file-level import; stale rows on facet menus and blueprints fixed; sprint 115: popup LOVs that load on scroll, Wait Popup dynamic actions and dynamic actions on menu entries; sprint 114: Workflow 26.2 with custom task outcomes, task events and notifications, Send E-Mail and draft steps, migrating running instances and the diagram as SVG / PNG; sprint 113: Team Development with issues, labels, milestones, templates, a board and a set-up wizard; sprint 112: AI interactive reports with chips, Undo, computed columns and a phrase parser that needs no AI service; sprint 111: AI Agents with tools as a shared component, a Navigate tool with checksummed URLs, Gemini and OpenAI-compatible services; sprint 110: Data Reporter as a workspace tool with datasets, reporting applications, editors and viewers, published reports with stable URLs and pins; sprint 109: the Workspace home above the App Builder and SQL Workshop, with a summary, top applications, users and developers, and an optional release check; sprint 108: the code editor's syntax colours in the builder's light and dark themes, read-only SQL highlighted, the Data Modeler in dark mode; sprint 107: a transaction mode in the SQL Worksheet with Commit and Rollback; DA-18: JavaScript (MLE) not planned, plv8 where installed; sprint 106: the change log of DDL change sets with Flyway, Liquibase and SQL downloads; sprint 104: RESTful Services modules, templates and handlers with PL/pgSQL and media handlers, privileges, OpenAPI and Try it; sprint 103: Schema Export / Import with pg_dump and pg_restore; sprint 102: the SQL Monitor with live sessions, Top SQL and a statement's plan; sprint 101: Scheduling of pg_cron jobs with a schedule builder, run now and run history; sprint 100: RESTful Services, tables and views published as REST endpoints with paging, filters, keys and OpenAPI; sprint 99: Administration → Database Users for PostgreSQL roles; sprint 98: the Data Modeler with relational diagrams, DDL and a data dictionary; sprint 97: charts of a query in the worksheet, saved charts and their dashboard; sprint 96: the SQL Workshop's Launchpad with pins and tool groups, the builder's search with Ctrl+K; sprint 95: Table Properties: create, edit or copy a table in a form with a DDL preview and Apply in one transaction; sprint 94: an object's menu with Open in a panel, Quick DDL, Add index / trigger / policy and Drop with dependents; sprint 93: worksheets saved as SQL Scripts with tabs and a Files list, Format, Convert case, find and replace, bind and substitution variables; sprint 92: the worksheet's Query Result with sort, value dialog, copy and downloads, plans as a tree with the slowest step and misestimates, SQL History with status, search and run again; sprint 91: the SQL Worksheet like Database Actions' SQL: navigator, Run Statement at the cursor and Run Script with a log per statement, Explain Plan, Autotrace, notices, history, Run as an application role; sprint 90: Comment Out in the page designer, gallery labels in title case; sprint 89: the Object Browser's schema, one row of tabs, blank NULLs, Modify column; sprint 88: home cards with colour bands and round icons, the hero on the page background, a page footer with the version and Back to top; sprint 87: the Create Application wizard reloads the page list for a schema, RLS badges, the alias from the name; sprint 86: the page designer by page number, HTML error pages in the builder; sprint 85: the Form Designer, beyond APEX; sprint 84: the date picker, facet menus; sprint 83: Component Settings and Component Groups; sprint 82: Report Queries; sprint 81: Application Computations and Shortcuts in Shared Components; sprint 80: the master grid's first row selected when the page opens and after a search; grid cells as text with their format mask until edited, with cell navigation by arrow keys, Enter, F2 and Escape; sprint 79: generated dashboards with sums, donuts and lines, leaving out charts that say nothing; applications open in their own light or dark mode until the user chooses, per application; a user menu with Appearance and Sign in when signed out; the developer toolbar's App and Page texts and debug state; the report search's column scope in the magnifier; sprint 78: generated faceted search reports with one column per foreign key, the faceted search's total row count, Show all and Yes/No values, one search field, friendly headings and number formats in generated grids and master-detail pages, friendly names in the Create Application wizard's page list; sprint 77: the Page Designer's layout and tree by display position, button positions, the tree's context menu with Duplicate and Copy to other page, Show Common / Show All, Go to group and the Template Options dialog; display positions, button positions and side-column page templates at runtime; sprint 76: the interactive report's menus and pagination, date items in the date format; sprint 75: the SQL Workshop's Object Browser and tabs; sprint 74: the builder's information architecture: Shared Components grid, Settings tabs, application home search and tasks; sprint 73: the Create Application wizard on one page with page types and features; sprint 72: the runtime chrome compared with APEX 26.2's: the developer toolbar, the Iris look, the navigation bar's Help menu and Install button; sprint 71: generated applications compared with APEX 26.2's: labels, foreign key names in reports, file columns, format masks, the Home page and the dashboard; sprint 70: treemap, sunburst and timeline charts; sprint 69: dragging tasks on a Gantt chart; sprint 68: the Data Reporter's welcome page, Find my workspace; sprint 67: REST source catalogs from OpenAPI documents, a workspace's export and import (two rows added); sprint 66: a blueprint from an existing application; sprint 65: facet charts; sprint 64: approval vacation rules and expiration policies; sprint 63: range, box plot and stock charts; sprint 62: workspace preferences (SQL Workshop and RESTful services per workspace), extension links, Manage backups across applications, SQL Workshop utilities with object reports, About Database and a database monitor; sprint 61: the builder's screens compared with APEX 26.1: the workspace sign-in page, the Administration menu with workspace message, environment banner and utilization, the SQL Workshop home, the App Gallery, application groups and cross application reports (four rows added); sprint 60: isolated workspaces with their own database logins, row-level security on pgkiln's tables and workspace database roles, workspace administrators; sprint 59: the Page Designer's help pane, Quick edit from the developer toolbar; sprint 58: page groups; sprint 57: region templates hero, title bar, buttons container, inline dialog and drawer, wizard with wizard progress, the carousel; sprint 56: Generate DDL and Schema Comparison in the SQL Workshop, `pgkiln ddl` and `pgkiln compare`; sprint 55: an editable login page with a Login region and the Minimal page template, Forgot password through the application's mail service; sprint 54: interactive grid views, the single row view, group by and chart; sprint 53: application settings, user preferences and items kept per user, dynamic translations, `meta.data_export` and data export downloads, display image and geocoded address items; sprint 52: every dynamic action event and action, Ajax callbacks, an error handling function, the session timeout warning; sprint 51: checked imports, application backups, availability and Run only, feedback, type-specific attribute help; sprint 50: lost update detection, warn on unsaved changes, the URL and search regions with search configurations, the developer toolbar with a session state viewer, and e-mail through SMTP with OAuth2, Microsoft Graph, Amazon SES and HTTP APIs; import checks, application availability, property help and e-mail compared again; 2026-10-06: pgkiln 0.31.0, in progress: static application files and the Execute JavaScript dynamic action; region, item, dynamic action and process plug-ins; conditional and dynamic theme styles; XML and Excel in `meta.parse_data`, zips in SQL, `meta.v_boolean`; file items in S3-compatible object storage; map layers by the visible area and as vector tiles; a graphical query builder; tenants for workflows and tasks; application files as YAML and region static IDs; Lucide icons and icon modifiers; PWA push notifications; 0.30.0: 136 icons and an icon picker; an axe-core accessibility audit; cropping pictures; session sharing between applications; twenty-two built-in languages; 0.29.0: workspaces; the Iris base style; drawers; built-in template components including the metric card; Theme Roller dark-mode colours, live preview and template options on items and report columns; report selection across pages; instance settings; fourteen built-in languages; 0.28.0: AI with Claude and OpenAI; 0.27.0: Data Reporter; sample data generator; create application from several sheets, pasted data or existing tables; 0.26.0: working copies with a three-way merge; theme, library and boilerplate applications with subscriptions; 0.25.0: Gantt, pyramid and polar charts; map layers, clustering and server-side spatial filters; REST data sources that write back from forms and grids and synchronise into tables, OAuth2 password and refresh-token grants; debug messages per request and an install/upgrade log; `meta.web_request()` and `meta.parse_data()`; Theme Roller style variants and template options; 0.24.0: automations with several actions, error handling per row and runs from SQL; invoke-API workflow steps; Unload Data in the Data Workshop; create page wizards for cards, calendar, chart, map, faceted search, form and master-detail; create an application from a file; 0.23.0: interactive grid aggregates, frozen/moved/resized columns, layouts and saved grid reports, master-detail, row actions and copy/paste; download processes, execution chains in the background, workflow processes, branches to a function's URL or another app, the Dialog Closed event; number format masks, automatic time zone, runtime messages in German, French and Spanish; SQL scripts, Quick SQL, a query builder, XML loading and data load definitions; custom authentication, lists, page and application locks with developer comments, supporting objects; 0.22.0: keyset paging, report PDFs and REST collections streamed from a cursor, database-account authentication; 0.21.0: HTTP-header authentication behind a reverse proxy; 0.20.0: a popup list of values with server-side search; 0.19.0: row-range pagination, maximum row counts and row limits, lazy loading and caching of regions, streamed CSV/Excel downloads; 0.18.0: calendar week/day/list views with drag and drop, bubble/gauge/funnel/radar charts and drill-down, smart filters, a region display selector and more facet types, computations, conditional branches, build options, menu buttons, REST data sources and web credentials, rich text/Markdown, rating, combobox, date range and QR code items; 0.17.0: an App Builder home, workspace dashboard and utilities like APEX's; 0.16.0: a Page Designer with drag-and-drop layout, a code editor with autocomplete, template components and plug-ins, parallel branches and versions of workflows, the `pgkiln` command line with one file per component; 0.15.0: drop and paste files, heat maps, filtering a report by the map area; 0.14.0: stacked, combo, scatter and pie charts, several files per upload item; 0.13.0: map and tree regions; 0.12.0: REST modules in the builder; 0.11.0: workflows and Progressive Web Apps; 0.10.0: LDAP, SAML, "Keep me signed in", document templates, JSON loading, approvals and the task list; pgkiln installs no application, HR is an example).
|
|
10
|
+
Last reviewed: 2026-11-05 against **APEX 26.2** (sprint 160: the Workflow Diagram region, an instance's steps with the reached, current and failed ones marked (CD-7); sprint 159: map layers Lines, Polygons and Extruded Polygons with fill and line styles per layer or per row (CD-6); sprint 158: the item types Image Upload, Text Field with autocomplete, Percent Graph and Display Map (CD-5); sprint 157: the process types Close Dialog, Clear Session State, Reset Pagination, User Preferences, Server Side Geocoding, Print Report, Human Task – Create / – Manage and Form – Initialization (CD-4); sprint 156: dynamic action events double click, key down / press, mouse enter / leave, select, resize, scroll, page unload, before refresh and facets change, greater / less and not-in-list conditions, and the actions Cancel Event, Set Style, Collapse / Expand Tree, Show AI Assistant, Trigger Geocoding and Open report dialog (CD-3); sprint 155: APEX's validation types, with an authorization scheme, Always execute and the error's display location (CD-1); sprint 154: one catalogue of server-side condition types for every component, shown in words in the Page Designer (CD-2); sprint 153: Database users in the eleven builder languages (WS-7 leftover); sprint 152: Workspace utilities, the dashboard, Mail queue, Network access, Instance settings and LDAP directories in the eleven builder languages (WS-7 leftover); sprint 151: vector providers with a model in the database, PostgresML (APEX's ONNX models, AP-1 leftover); sprint 150: remote databases, another PostgreSQL database's tables as foreign tables the applications query (REST Enabled SQL, AP-7 leftover); sprint 149: running workflow instances inside parallel branches migrate to a newer version (WS-6 leftover); sprint 148: the AI assistant streams its answers as the model writes them (WS-4 leftover); sprint 147: `pgkiln advise --offline` checks an export's files without a database (AP-10 leftover); sprint 146: the Advisor checks JSON sources' views against their data profile (AP-8 leftover); sprint 145: the texts that offered AI with "Claude or OpenAI" name all four providers: Claude, OpenAI, Gemini and OpenAI-compatible services (AP-11); sprint 144: `pgkiln advise` for CI with text, JSON and SARIF output (APEXlang static analysis / SQLcl CodeScan), security checks in the Advisor, and working copies and locks from the command line and MCP (the Working Copy APIs) (AP-10); sprint 143: the interactive report's 26.2 dialogs: *is one of* / *is not one of* filters with the column's values and counts, *is between* two values (dates with the date picker in the application's format), relative periods on date columns, and the column order by drag and drop or arrow buttons, followed by downloads and the PDF (AP-9); sprint 142: JSON sources with a data profile and updatable views whose arrays are rows, document views of a table with its children (APEX's duality views), JSON path columns in reports (AP-8); sprint 141: static workspace files (`#WORKSPACE_FILES#`), remote servers for REST data sources, catalogs and AI services (an environment variable per environment), and workspace-level web credentials (AP-7); sprint 140: the items Shuttle (ordered), Select One and Select Many, the regions Classic Report (report templates, pagination types), Breadcrumb and Help Text with a page help text, and a [mapping of every APEX item and region type](#item-and-region-types-one-by-one) (AP-4); sprint 139: OpenTelemetry, traces with a span per SQL statement, web call, AI request and tool call, logs, metrics and `/metrics` for Prometheus, browser spans relayed by pgkiln, per workspace off or its own collector (AP-6); sprint 138: an application's Utilities tab with a dashboard, database object dependencies, change history per component, Upgrade application, UI defaults (APEX's Attribute Dictionary), application and page checksums and an icon browser (AP-5); sprint 137: Create page as a grid of page types with previews, the page types interactive report, smart filters, search page, data loading, tree, timeline, media list, content row, comments, dashboard, wizard, unified task list and workflow console, a Feature tab with nine features that install once, and Create page as copy with shared components mapped or copied (AP-3); sprint 136: vector providers (an AI service with an embedding model or a SQL function), `meta.embed`, *Add vector column* in Table Properties with an HNSW index and a queue that keeps embeddings current, search types vector and hybrid (reciprocal rank fusion with full-text) and a Retrieve (RAG) tool for AI agents, all as the app's role through RLS, on pgvector (AP-1); sprint 135: full-text search configurations, APEX's Oracle Text search type on PostgreSQL full-text search with stemming, ranking, highlights, *Did you mean* and *Add full-text search* in Table Properties (AP-2); sprint 134: the builder also in Italiano, 中文 (简体), 中文 (繁體), 日本語 and 한국어, APEX's ten builder languages plus Nederlands (SEC-5); sprints 121, 123–125: the builder in Deutsch, English, Español, Français, Nederlands and Português, step by step: the frame, sign-in, Workspace home, App Builder, Page Designer menus, the SQL Workshop's home, SQL Worksheet, Object Browser and Table Properties, Shared Components, application settings, users, identity providers, developers and workspaces (WS-7); sprint 122: *Ask in your own words* sets faceted search and smart filter facets, smart filters read a typed phrase (WS-5), and Sample Maps, Sample Approvals, Sample Data Loading and Sample Files in the App Gallery (WS-8); sprint 120: the App Gallery's single-topic sample apps (charts, cards, calendar, interactive grids, dynamic actions, reporting), the UX Pattern Catalog and a Utility Apps tab with Lookup Lists, Release Notes and Announcements (WS-8); sprint 119: data security per table, a roles × columns matrix and masked values per application role in a masking view, the same identity for pages, AI tools, REST, AutoREST and MCP (WS-13); sprint 118: Administration → Mail queue with delivery per hour and per workspace, the slowest provider calls and failures with Retry and Purge, a workspace's own mail service, and workspace network access lists that narrow the installation's allow-list (WS-9); sprint 117: Pillar Light and Pillar Dark navigation appearances with a header strip, clearer navigation tree states, subtle colour utilities, RTL; sprint 116: the comparison moved from 26.1 to 26.2, with a section for the 26.2 workspace items WS-1 … WS-13 and OCI managed identities; the App Builder list with Updated by, working copies and the lock; `pgkiln import --only`, a file-level import; stale rows on facet menus and blueprints fixed; sprint 115: popup LOVs that load on scroll, Wait Popup dynamic actions and dynamic actions on menu entries; sprint 114: Workflow 26.2 with custom task outcomes, task events and notifications, Send E-Mail and draft steps, migrating running instances and the diagram as SVG / PNG; sprint 113: Team Development with issues, labels, milestones, templates, a board and a set-up wizard; sprint 112: AI interactive reports with chips, Undo, computed columns and a phrase parser that needs no AI service; sprint 111: AI Agents with tools as a shared component, a Navigate tool with checksummed URLs, Gemini and OpenAI-compatible services; sprint 110: Data Reporter as a workspace tool with datasets, reporting applications, editors and viewers, published reports with stable URLs and pins; sprint 109: the Workspace home above the App Builder and SQL Workshop, with a summary, top applications, users and developers, and an optional release check; sprint 108: the code editor's syntax colours in the builder's light and dark themes, read-only SQL highlighted, the Data Modeler in dark mode; sprint 107: a transaction mode in the SQL Worksheet with Commit and Rollback; DA-18: JavaScript (MLE) not planned, plv8 where installed; sprint 106: the change log of DDL change sets with Flyway, Liquibase and SQL downloads; sprint 104: RESTful Services modules, templates and handlers with PL/pgSQL and media handlers, privileges, OpenAPI and Try it; sprint 103: Schema Export / Import with pg_dump and pg_restore; sprint 102: the SQL Monitor with live sessions, Top SQL and a statement's plan; sprint 101: Scheduling of pg_cron jobs with a schedule builder, run now and run history; sprint 100: RESTful Services, tables and views published as REST endpoints with paging, filters, keys and OpenAPI; sprint 99: Administration → Database Users for PostgreSQL roles; sprint 98: the Data Modeler with relational diagrams, DDL and a data dictionary; sprint 97: charts of a query in the worksheet, saved charts and their dashboard; sprint 96: the SQL Workshop's Launchpad with pins and tool groups, the builder's search with Ctrl+K; sprint 95: Table Properties: create, edit or copy a table in a form with a DDL preview and Apply in one transaction; sprint 94: an object's menu with Open in a panel, Quick DDL, Add index / trigger / policy and Drop with dependents; sprint 93: worksheets saved as SQL Scripts with tabs and a Files list, Format, Convert case, find and replace, bind and substitution variables; sprint 92: the worksheet's Query Result with sort, value dialog, copy and downloads, plans as a tree with the slowest step and misestimates, SQL History with status, search and run again; sprint 91: the SQL Worksheet like Database Actions' SQL: navigator, Run Statement at the cursor and Run Script with a log per statement, Explain Plan, Autotrace, notices, history, Run as an application role; sprint 90: Comment Out in the page designer, gallery labels in title case; sprint 89: the Object Browser's schema, one row of tabs, blank NULLs, Modify column; sprint 88: home cards with colour bands and round icons, the hero on the page background, a page footer with the version and Back to top; sprint 87: the Create Application wizard reloads the page list for a schema, RLS badges, the alias from the name; sprint 86: the page designer by page number, HTML error pages in the builder; sprint 85: the Form Designer, beyond APEX; sprint 84: the date picker, facet menus; sprint 83: Component Settings and Component Groups; sprint 82: Report Queries; sprint 81: Application Computations and Shortcuts in Shared Components; sprint 80: the master grid's first row selected when the page opens and after a search; grid cells as text with their format mask until edited, with cell navigation by arrow keys, Enter, F2 and Escape; sprint 79: generated dashboards with sums, donuts and lines, leaving out charts that say nothing; applications open in their own light or dark mode until the user chooses, per application; a user menu with Appearance and Sign in when signed out; the developer toolbar's App and Page texts and debug state; the report search's column scope in the magnifier; sprint 78: generated faceted search reports with one column per foreign key, the faceted search's total row count, Show all and Yes/No values, one search field, friendly headings and number formats in generated grids and master-detail pages, friendly names in the Create Application wizard's page list; sprint 77: the Page Designer's layout and tree by display position, button positions, the tree's context menu with Duplicate and Copy to other page, Show Common / Show All, Go to group and the Template Options dialog; display positions, button positions and side-column page templates at runtime; sprint 76: the interactive report's menus and pagination, date items in the date format; sprint 75: the SQL Workshop's Object Browser and tabs; sprint 74: the builder's information architecture: Shared Components grid, Settings tabs, application home search and tasks; sprint 73: the Create Application wizard on one page with page types and features; sprint 72: the runtime chrome compared with APEX 26.2's: the developer toolbar, the Iris look, the navigation bar's Help menu and Install button; sprint 71: generated applications compared with APEX 26.2's: labels, foreign key names in reports, file columns, format masks, the Home page and the dashboard; sprint 70: treemap, sunburst and timeline charts; sprint 69: dragging tasks on a Gantt chart; sprint 68: the Data Reporter's welcome page, Find my workspace; sprint 67: REST source catalogs from OpenAPI documents, a workspace's export and import (two rows added); sprint 66: a blueprint from an existing application; sprint 65: facet charts; sprint 64: approval vacation rules and expiration policies; sprint 63: range, box plot and stock charts; sprint 62: workspace preferences (SQL Workshop and RESTful services per workspace), extension links, Manage backups across applications, SQL Workshop utilities with object reports, About Database and a database monitor; sprint 61: the builder's screens compared with APEX 26.1: the workspace sign-in page, the Administration menu with workspace message, environment banner and utilization, the SQL Workshop home, the App Gallery, application groups and cross application reports (four rows added); sprint 60: isolated workspaces with their own database logins, row-level security on pgkiln's tables and workspace database roles, workspace administrators; sprint 59: the Page Designer's help pane, Quick edit from the developer toolbar; sprint 58: page groups; sprint 57: region templates hero, title bar, buttons container, inline dialog and drawer, wizard with wizard progress, the carousel; sprint 56: Generate DDL and Schema Comparison in the SQL Workshop, `pgkiln ddl` and `pgkiln compare`; sprint 55: an editable login page with a Login region and the Minimal page template, Forgot password through the application's mail service; sprint 54: interactive grid views, the single row view, group by and chart; sprint 53: application settings, user preferences and items kept per user, dynamic translations, `meta.data_export` and data export downloads, display image and geocoded address items; sprint 52: every dynamic action event and action, Ajax callbacks, an error handling function, the session timeout warning; sprint 51: checked imports, application backups, availability and Run only, feedback, type-specific attribute help; sprint 50: lost update detection, warn on unsaved changes, the URL and search regions with search configurations, the developer toolbar with a session state viewer, and e-mail through SMTP with OAuth2, Microsoft Graph, Amazon SES and HTTP APIs; import checks, application availability, property help and e-mail compared again; 2026-10-06: pgkiln 0.31.0, in progress: static application files and the Execute JavaScript dynamic action; region, item, dynamic action and process plug-ins; conditional and dynamic theme styles; XML and Excel in `meta.parse_data`, zips in SQL, `meta.v_boolean`; file items in S3-compatible object storage; map layers by the visible area and as vector tiles; a graphical query builder; tenants for workflows and tasks; application files as YAML and region static IDs; Lucide icons and icon modifiers; PWA push notifications; 0.30.0: 136 icons and an icon picker; an axe-core accessibility audit; cropping pictures; session sharing between applications; twenty-two built-in languages; 0.29.0: workspaces; the Iris base style; drawers; built-in template components including the metric card; Theme Roller dark-mode colours, live preview and template options on items and report columns; report selection across pages; instance settings; fourteen built-in languages; 0.28.0: AI with Claude and OpenAI; 0.27.0: Data Reporter; sample data generator; create application from several sheets, pasted data or existing tables; 0.26.0: working copies with a three-way merge; theme, library and boilerplate applications with subscriptions; 0.25.0: Gantt, pyramid and polar charts; map layers, clustering and server-side spatial filters; REST data sources that write back from forms and grids and synchronise into tables, OAuth2 password and refresh-token grants; debug messages per request and an install/upgrade log; `meta.web_request()` and `meta.parse_data()`; Theme Roller style variants and template options; 0.24.0: automations with several actions, error handling per row and runs from SQL; invoke-API workflow steps; Unload Data in the Data Workshop; create page wizards for cards, calendar, chart, map, faceted search, form and master-detail; create an application from a file; 0.23.0: interactive grid aggregates, frozen/moved/resized columns, layouts and saved grid reports, master-detail, row actions and copy/paste; download processes, execution chains in the background, workflow processes, branches to a function's URL or another app, the Dialog Closed event; number format masks, automatic time zone, runtime messages in German, French and Spanish; SQL scripts, Quick SQL, a query builder, XML loading and data load definitions; custom authentication, lists, page and application locks with developer comments, supporting objects; 0.22.0: keyset paging, report PDFs and REST collections streamed from a cursor, database-account authentication; 0.21.0: HTTP-header authentication behind a reverse proxy; 0.20.0: a popup list of values with server-side search; 0.19.0: row-range pagination, maximum row counts and row limits, lazy loading and caching of regions, streamed CSV/Excel downloads; 0.18.0: calendar week/day/list views with drag and drop, bubble/gauge/funnel/radar charts and drill-down, smart filters, a region display selector and more facet types, computations, conditional branches, build options, menu buttons, REST data sources and web credentials, rich text/Markdown, rating, combobox, date range and QR code items; 0.17.0: an App Builder home, workspace dashboard and utilities like APEX's; 0.16.0: a Page Designer with drag-and-drop layout, a code editor with autocomplete, template components and plug-ins, parallel branches and versions of workflows, the `pgkiln` command line with one file per component; 0.15.0: drop and paste files, heat maps, filtering a report by the map area; 0.14.0: stacked, combo, scatter and pie charts, several files per upload item; 0.13.0: map and tree regions; 0.12.0: REST modules in the builder; 0.11.0: workflows and Progressive Web Apps; 0.10.0: LDAP, SAML, "Keep me signed in", document templates, JSON loading, approvals and the task list; pgkiln installs no application, HR is an example).
|
|
11
11
|
|
|
12
12
|
## At a glance
|
|
13
13
|
|
|
@@ -86,7 +86,7 @@ database links row and added static workspace files with workspace web credentia
|
|
|
86
86
|
| Navigation menu (side or top) | ✅ | Collapsible side menu or top bar; a drawer on tablets and phones |
|
|
87
87
|
| Region display selector, tabs | ✅ | Tabs or a select list; regions can share a tab, *Show all*, the choice remembered in the session, `#R<id>` links. Accessible tabs with JavaScript; without it every region shows with links to each |
|
|
88
88
|
| Tree | ✅ | `tree` region from id / parent id / label rows, with icons, links and the first levels open; works without JavaScript |
|
|
89
|
-
| Map region (26.1: vector tiles, bounding box) | ✅ | `map` region: several layers per map, each with its own query (markers, lines and areas from GeoJSON or a PostGIS geometry, heat maps), a legend that switches layers on and off and a colour per layer; marker clustering; popups with links. A report can be filtered by the visible area or by the distance from the map's centre on the server: with PostGIS (`ST_Intersects`/`ST_DWithin`, detected automatically) when installed, otherwise on latitude/longitude (bounding box, haversine). Configurable tile server. (0.31) **Large data sets**: a layer loads only the places in the visible area, again as the map moves (`visible_area`), or is served as **Mapbox Vector Tiles** (`tiles`, MVT 2.1, drawn on canvases with popups; readable by MapLibre, OpenLayers or QGIS), both filtered on the server like the report filter ([chapter 4](guide/04-pages-and-regions.md#map)) |
|
|
89
|
+
| Map region (26.1: vector tiles, bounding box) | ✅ | `map` region: several layers per map, each with its own query (markers, lines and areas from GeoJSON or a PostGIS geometry, heat maps), a legend that switches layers on and off and a colour per layer; marker clustering; popups with links. A report can be filtered by the visible area or by the distance from the map's centre on the server: with PostGIS (`ST_Intersects`/`ST_DWithin`, detected automatically) when installed, otherwise on latitude/longitude (bounding box, haversine). Configurable tile server. (0.31) **Large data sets**: a layer loads only the places in the visible area, again as the map moves (`visible_area`), or is served as **Mapbox Vector Tiles** (`tiles`, MVT 2.1, drawn on canvases with popups; readable by MapLibre, OpenLayers or QGIS), both filtered on the server like the report filter ([chapter 4](guide/04-pages-and-regions.md#map)). (sprint 159) Layer types **Lines**, **Polygons** and **Extruded Polygons** with fill and line colours, width and opacity per layer or per row; extruded polygons drawn flat, shaded by height (no 3D view) |
|
|
90
90
|
| Timeline, comments, media list, avatar template components (26.1: groups, Metric Card) | ✅ | Built in for every application: avatar (groups), badge, comments, (sprint 137) content row, media list, metric card and timeline, as regions (one or all rows, the group) and report column templates; an application's own copy replaces a built-in one ([chapter 4](guide/04-pages-and-regions.md#built-in-template-components)) |
|
|
91
91
|
| Pagination of large tables (row ranges, maximum row count) | ✅ | Reports and grids page in the database; `"pagination": "range"` shows APEX's "row ranges X to Y" without a total (it reads one row more for *Next*); `max_rows` is a maximum row count (the total is counted over at most max+1 rows: "of more than N"; downloads are capped too); page numbers and sizes are clamped on the server. Cards (500), charts (1000), dynamic content (1000) and lists of values (5000) have configurable row limits. Keyset ("seek") paging on an indexed sort (`"keyset"`), with signed positions |
|
|
92
92
|
| Lazy loading of regions | ✅ | `"lazy": true` on report, chart, cards, dynamic, tree and template component regions: a placeholder, fetched after the page shows (page, condition and authorization re-checked); without JavaScript a link shows the region ([chapter 4](guide/04-pages-and-regions.md#large-tables)) |
|
|
@@ -112,6 +112,7 @@ database links row and added static workspace files with workspace web credentia
|
|
|
112
112
|
| File browse / image upload, paste files (26.1) | ✅ | Item type `file`: into a bytea column (with name and type) or a session temporary file (`meta.temp_files`), **several files per item** (one row per file in a child table, or a list of temporary files), drag-and-drop and paste (26.1), image preview, signed downloads through RLS ([chapter 16](guide/16-files.md)). **cropping pictures** in the browser before upload (free or a fixed aspect ratio, mouse and keyboard). **Object storage**: an S3-compatible bucket per item (AWS Signature Version 4 with an `aws_sigv4` web credential; the bucket follows the table on replace, remove, delete and failed saves; downloads through the app) ([chapter 16](guide/16-files.md#object-storage)) |
|
|
113
113
|
| Rich text / markdown editor | ✅ | `richtext` (HTML rebuilt from an allow-list on the server when saved and shown, pasted HTML cleaned in the browser) and `markdown` (rendered on the server, HTML typed in it shown as text); a toolbar with JavaScript, a plain text field without ([chapter 5](guide/05-items.md)) |
|
|
114
114
|
| Star rating, QR code, combobox (tags), date range | ✅ | `rating` (radio buttons drawn as stars), `qrcode` (SVG drawn on the server, no dependency), `combobox` (free text with list-of-values suggestions, tags, colon-separated), `daterange` (`from:to`); all work without JavaScript and are checked on the server |
|
|
115
|
+
| Image Upload, Text Field with autocomplete, Percent Graph, Display Map (26.2) | ✅ | (sprint 158) `image_upload`: a file item for pictures (image/* only, cropping, a maximum size before upload); `autocomplete`: a text field with suggestions from the list of values; `percent_graph`: a 0–100 bar; `display_map`: a small map of `lat,lng` with a pin from the map tile server ([chapter 5](guide/05-items.md#item-types)) |
|
|
115
116
|
| Password reveal toggle (24.2) | ✅ | `{"reveal": true}` on password items; the value is never sent back to the page |
|
|
116
117
|
| Display image, geocoded address | ✅ | (sprint 53) `image` items show a picture from an https URL, a path or a BLOB from a query (served as the application's role, sandboxed); `address` items check the text against the installation's Nominatim-compatible geocoder (`GEOCODER_URL`) and put the chosen address's position into another item |
|
|
117
118
|
|
|
@@ -182,6 +183,7 @@ review is a diff. Not counted in [At a glance](#at-a-glance): the rows above com
|
|
|
182
183
|
| URL | `url` | |
|
|
183
184
|
| Unified Task List | `tasks` | |
|
|
184
185
|
| Workflow Console | `workflows` | |
|
|
186
|
+
| Workflow Diagram | `workflow_diagram` | (sprint 160) one instance, from an item; reached, current and failed steps marked |
|
|
185
187
|
| Data Reporter (26.2, a workspace tool) | `data_reporter` | also a region in an application |
|
|
186
188
|
| Column Toggle Report, Reflow Report, List View (jQuery Mobile, desupported) | — | desupported in APEX; reports reflow on phones (`"mobile": "reflow"`) |
|
|
187
189
|
| Plug-in | `plugin` | region plug-ins with their own code |
|
|
@@ -193,12 +195,12 @@ review is a diff. Not counted in [At a glance](#at-a-glance): the rows above com
|
|
|
193
195
|
|---|---|---|
|
|
194
196
|
| Session state, page items, `:BIND` and `&SUBST.` syntax | ✅ | Binds become escaped untyped literals, so APEX patterns like `:X is null or col = :X` work |
|
|
195
197
|
| Application items and processes | ✅ | `after_login`, `before_page` |
|
|
196
|
-
| Validations | ✅ |
|
|
197
|
-
| Conditions and authorization on components | ✅ | Pages, regions, items, buttons, processes, dynamic actions, navigation entries; re-checked on submit |
|
|
198
|
+
| Validations | ✅ | (sprint 155) APEX's types: SQL expression, rows returned / no rows, function body returning Boolean or error text, item not null / not null or zero / not zero / no spaces / alphanumeric / numeric / valid date / valid timestamp, item = / != value, in / not in a list, character checks, regular expression; a server-side condition, authorization, Always execute and display location; required items; `RAISE … USING COLUMN` in PL/pgSQL targets a field ([chapter 6](guide/06-processing.md#validations)). Interactive grid column validations per row: not yet |
|
|
199
|
+
| Conditions and authorization on components | ✅ | Pages, regions, items, buttons, processes, dynamic actions, navigation entries; re-checked on submit. (sprint 154) One catalogue of **server-side condition types** for regions, items, buttons, dynamic actions, validations, processes, computations and branches: SQL expression, rows returned / no rows, function body, request in / not in, item null / not null / zero / null or zero / = / != value / = / != item / in / not in a colon list, current page in / not in, page is / isn't a modal dialog, user signed in / public, language in / not in, always / never; the simple types decided without a query; shown in words in the Page Designer's tree, in the builder's language ([chapter 6](guide/06-processing.md#server-side-conditions)) |
|
|
198
200
|
| Computations | ✅ | Static, item, SQL query, SQL expression and PL/pgSQL function body; before header and after submit; with a condition, authorization and build option ([chapter 6](guide/06-processing.md#computations)); **application computations** (sprint 81) for every page: after authentication, before header, after submit ([chapter 6](guide/06-processing.md#application-computations)) |
|
|
199
|
-
| Page processes | ✅ | SQL / PL/pgSQL, form DML, grid DML, data loading (`data_load`), **invoke API** (a REST data source or URL, response values into items), **download** (a file from a query; several rows become one zip; on submit or on load), **execution chains** (child processes with their own conditions, nested, optionally run in the background with a status view), **workflow** (start, terminate, retry), **Generate text with AI** (text or structured output into items) |
|
|
200
|
-
| Branches | ✅ | Before header and after processing, to a page (with items) or a URL inside the app, *When button pressed*, server-side conditions (
|
|
201
|
-
| Dynamic actions | ✅ | Show, hide, enable, disable, set value (SQL), execute SQL, refresh region or item, alert, submit, set focus, add/remove class, show success/error message and clear errors (26.1); the **Dialog Closed** event (per dialog page, with the dialog's message). **Execute JavaScript**: calls a function a static application file registered with `pgkiln.actions.register` (no inline code: the CSP stays strict) ([chapter 7](guide/07-dynamic-actions.md#execute-javascript)); dynamic action plug-ins |
|
|
201
|
+
| Page processes | ✅ | SQL / PL/pgSQL, form DML, grid DML, data loading (`data_load`), **invoke API** (a REST data source or URL, response values into items), **download** (a file from a query; several rows become one zip; on submit or on load), **execution chains** (child processes with their own conditions, nested, optionally run in the background with a status view), **workflow** (start, terminate, retry), **Generate text with AI** (text or structured output into items); (sprint 157) **Close Dialog** with items to return, **Clear Session State**, **Reset Pagination**, **User Preferences**, **Server Side Geocoding**, **Print Report**, **Human Task – Create / – Manage**, **Form – Initialization** ([chapter 6](guide/06-processing.md#declarative-process-types)) |
|
|
202
|
+
| Branches | ✅ | Before header and after processing, to a page (with items) or a URL inside the app, *When button pressed*, server-side conditions (the shared catalogue, sprint 154); the button's target page stays the fallback ([chapter 6](guide/06-processing.md#branches)); a PL/pgSQL function returning a path in the app, and a page of another application (with signed items) |
|
|
203
|
+
| Dynamic actions | ✅ | Show, hide, enable, disable, set value (SQL), execute SQL, refresh region or item, alert, submit, set focus, add/remove class, show success/error message and clear errors (26.1); the **Dialog Closed** event (per dialog page, with the dialog's message). **Execute JavaScript**: calls a function a static application file registered with `pgkiln.actions.register` (no inline code: the CSP stays strict) ([chapter 7](guide/07-dynamic-actions.md#execute-javascript)); dynamic action plug-ins ; (sprint 156) events double click, key down / press, mouse enter / leave, select, resize, scroll, page unload, before refresh, facets change; conditions greater / less (or equal), not in list; Cancel Event, Set Style, Collapse / Expand Tree, Show AI Assistant, Trigger Geocoding, Open report dialog. Not yet: grid, calendar, map and tree component events |
|
|
202
204
|
| Dynamic action events | ✅ | Change, click, page load, Dialog Closed and (sprint 52) Get/Lose Focus, Key Release, After Refresh (a refreshed, lazy or master-detail region), Selection Change (report row selection, a grid's master row), Before Page Submit and custom events (`pgkiln.trigger(name, value)`); the actions of one event run in sequence order ([chapter 7](guide/07-dynamic-actions.md#events)) |
|
|
203
205
|
| Dynamic action actions: confirm, close/cancel dialog, clear, open/close region, download, print, current position, share | ✅ | (sprint 52) Confirm (No stops the actions after it, and a submit), Close and Cancel Dialog, Clear, Open/Close Region, Download (a download process of the page), Print, Get Current Position, Share (the share sheet, or the link copied) ([chapter 7](guide/07-dynamic-actions.md#actions)) |
|
|
204
206
|
| Ajax callbacks (On Demand processes, `apex.server.process`) | ✅ | (sprint 52) Page and application processes with point *ajax*, called with `pgkiln.server.process(name, {items, x01 … x10})`: SQL as the app's role with its authorization and condition, JSON rows back, items it sets set on the page ([chapter 7](guide/07-dynamic-actions.md#ajax-callbacks)) |
|
|
@@ -293,10 +295,10 @@ review is a diff. Not counted in [At a glance](#at-a-glance): the rows above com
|
|
|
293
295
|
| APEX | pgkiln | Notes |
|
|
294
296
|
|---|---|---|
|
|
295
297
|
| Approvals and task list | ✅ | Task definitions (approval / action, owner roles and users, business administrators, priority, due date, details page), `meta.create_task` from application SQL, a task list region (claim, approve/reject/complete with comment, release, delegate, cancel, history), completion SQL in the same transaction. (sprint 64) **Vacation rules** (a stand-in acts on a user's tasks while the rule is active, checked on every request) and **expiration policies** (expire, renew up to N times, escalate to a role once; a waiting workflow goes on with the outcome `expired`). (sprint 114) **custom outcomes** with labels and colours (Yes / No / Undecided), **task events** on complete, expire and a failed completion SQL (SQL, e-mail or start a workflow; reopen or keep the task) and **notifications** from e-mail templates on create, complete and expire ([chapter 6](guide/06-processing.md#custom-outcomes)) |
|
|
296
|
-
| Workflow (26.1: parallel flows, multi-tenancy) | ✅ | Workflow definitions of task, SQL, switch, wait, **invoke API** (a REST data source or URL through the invoke-API code, response values and the HTTP status into variables, retryable faults, no transaction open during the call) and end steps with variables, started from application SQL, run by the server (NOTIFY + polling) as the app's role; console region (terminate, retry a faulted step); diagram in the builder. **Parallel branches** (split, then a join that waits for all or for the first branch) and **versions** (development, active, inactive; running instances keep theirs) ([chapter 6](guide/06-processing.md#workflows)). (0.31) **Tenants**: `meta.set_tenant()` (APEX: `APEX_SESSION.SET_TENANT_ID`); workflows, their tasks, background chains, the task list, the console and every action follow the session's tenant ([chapter 6](guide/06-processing.md#tenants)). (sprint 114, 26.1 / 26.2) **Send E-Mail** steps (a template or subject and body), **draft** steps allowed only in development versions, branching on custom task outcomes, **migrating running instances** to a newer version (step mapping, preview, one transaction, a log; not yet for instances inside open parallel branches: [chapter 6](guide/06-processing.md#migrating-instances)) and the diagram as **SVG / PNG** |
|
|
298
|
+
| Workflow (26.1: parallel flows, multi-tenancy) | ✅ | Workflow definitions of task, SQL, switch, wait, **invoke API** (a REST data source or URL through the invoke-API code, response values and the HTTP status into variables, retryable faults, no transaction open during the call) and end steps with variables, started from application SQL, run by the server (NOTIFY + polling) as the app's role; console region (terminate, retry a faulted step); diagram in the builder. **Parallel branches** (split, then a join that waits for all or for the first branch) and **versions** (development, active, inactive; running instances keep theirs) ([chapter 6](guide/06-processing.md#workflows)). (0.31) **Tenants**: `meta.set_tenant()` (APEX: `APEX_SESSION.SET_TENANT_ID`); workflows, their tasks, background chains, the task list, the console and every action follow the session's tenant ([chapter 6](guide/06-processing.md#tenants)). (sprint 114, 26.1 / 26.2) **Send E-Mail** steps (a template or subject and body), **draft** steps allowed only in development versions, branching on custom task outcomes, **migrating running instances** to a newer version (step mapping, preview, one transaction, a log; not yet for instances inside open parallel branches: [chapter 6](guide/06-processing.md#migrating-instances)) and the diagram as **SVG / PNG**. (sprint 160) A **Workflow Diagram region** draws an instance in a running application ([chapter 6](guide/06-processing.md#workflow-diagram-region)) |
|
|
297
299
|
| Automations (scheduled) | ✅ | Shared Components → Automations: cron schedules with time zones, once or per row of a query, **several ordered actions** with their own conditions, **error handling** (stop, skip the row and continue, or disable; row errors in the run history), roles, run history and Run now, **on-demand runs from SQL** with `meta.run_automation()` (like `APEX_AUTOMATION.EXECUTE`, synchronous in the caller's transaction), safe with several servers ([chapter 6](guide/06-processing.md#automations)) |
|
|
298
300
|
| AI assistant, natural-language reports (NL2IR), AI agents and tools (26.1) | ✅ | Region type **AI assistant**: a conversation per session, context queries (RAG over developer queries, run as the app's role, read-only), and **tools** the model may call: SQL with bound arguments checked against declared parameters (read-only unless marked as writing, row limit, timeout) and REST data sources, each optionally behind an authorization scheme. **AI Interactive Reports** (sprint 112; 26.1 / 26.2): an "Ask in your own words" box turns a question into the report's own settings (filters, highlights, search, sort, control break, totals, group by, pivot, chart and computed columns such as "bonus is 10% of salary"), never SQL, limited to its shown columns; each setting is a chip with Edit and Remove, plus Undo. Without an AI service a built-in phrase parser (English, Dutch, German) answers ([chapter 4](guide/04-pages-and-regions.md#ask-in-your-own-words-ai-interactive-reports)). (sprint 122) Conditions a facet can hold set the page's **faceted search and smart filters** facets (values, excluded values, custom ranges, stars), shown as chips; smart filters with `"ask": true` read a typed phrase and offer it as one suggestion. (sprint 111) **AI Agents** as a shared component (26.1 / 26.2): an AI service, system prompt, reasoning effort (low / medium / high, mapped per provider), approved tools, max steps and tokens and an authorization scheme; an assistant region names one. **AI Tools**: SQL (read-only transaction, the app role through RLS, timeout), PL/pgSQL function, REST data source, JavaScript action (a registered action or custom-event dynamic action), and **Navigate**: pgkiln builds the checksummed URL, only to pages the user may open. Every tool call is logged with its arguments (debug and Activity → AI usage). Providers add Gemini and OpenAI-compatible endpoints (Ollama, vLLM, Azure OpenAI). Answers are not streamed; no OCI provider. `pgvector` covers semantic search on the data side (sprint 136) A **Retrieve (RAG)** tool type: the model gives a text, the agent gets the best rows of a search configuration (vector or hybrid) as the app's role in a read-only transaction, logged like other tools |
|
|
299
|
-
| Vector providers, `APEX_AI.GET_VECTOR_EMBEDDINGS`, vector search (24.2) | ✅ | (sprint 136, AP-1) Shared Components → **Vector providers** (exported with the application): an AI service with an embedding model (OpenAI `text-embedding-3-*`, Gemini, any OpenAI-compatible endpoint such as Ollama; the key stays with the service) or a SQL / PL/pgSQL function returning `vector`, with its dimensions, checked on every embedding and against vector columns; **Test**. `meta.embed(text, provider)` for function providers in SQL (as the caller; AI services are called by the server only). Workspace utilities → Vector providers: pgvector detected, *Create extension vector* for administrators, the workspace's providers and vector columns. SQL Workshop › Table Properties › **Add vector column**: `vector(n)`, an HNSW index and a trigger that re-embeds changed rows, at once (function) or through a queue the server works in batches within the provider's requests per minute and the app's daily AI limits, logged under AI usage; **Backfill** with progress ([chapter 3](guide/03-builder.md#vector-providers)).
|
|
301
|
+
| Vector providers, `APEX_AI.GET_VECTOR_EMBEDDINGS`, vector search (24.2) | ✅ | (sprint 136, AP-1) Shared Components → **Vector providers** (exported with the application): an AI service with an embedding model (OpenAI `text-embedding-3-*`, Gemini, any OpenAI-compatible endpoint such as Ollama; the key stays with the service) or a SQL / PL/pgSQL function returning `vector`, with its dimensions, checked on every embedding and against vector columns; **Test**. `meta.embed(text, provider)` for function providers in SQL (as the caller; AI services are called by the server only). Workspace utilities → Vector providers: pgvector detected, *Create extension vector* for administrators, the workspace's providers and vector columns. SQL Workshop › Table Properties › **Add vector column**: `vector(n)`, an HNSW index and a trigger that re-embeds changed rows, at once (function) or through a queue the server works in batches within the provider's requests per minute and the app's daily AI limits, logged under AI usage; **Backfill** with progress ([chapter 3](guide/03-builder.md#vector-providers)). (sprint 151) Models in the database as a provider type of their own: PostgresML's `pgml.embed` runs a Hugging Face model (ONNX among them) inside PostgreSQL, as the query's role, with no AI service |
|
|
300
302
|
| *Generate Text with AI* process, structured outputs (26.1) | ✅ | **AI services** (Workspace utilities, administrators): Claude through `@anthropic-ai/sdk` or OpenAI through `openai`, encrypted write-only keys (or `ANTHROPIC_API_KEY` / `OPENAI_API_KEY`), per-app access with daily request and token limits, a usage log. Page process `ai_generate` (text into an item, or structured output into several items with a schema built from the items or your own) and a dynamic action that runs it without a page submit; `meta.ai_generate` / `ai_result` / `ai_available` from SQL ([chapter 6](guide/06-processing.md)). Prompts, item values included, go to the chosen provider |
|
|
301
303
|
| Blueprints, spec-driven development (26.1) | ✅ | Create → **From a blueprint**: a JSON spec of tables (types, required, unique, allowed values, references), pages, navigation and sample data; optionally drafted by AI from a description; always reviewed (problems, SQL, pages, menu) before the application is created in one transaction; saved blueprints; (sprint 66) **a blueprint from an existing application** (its tables, pages, menu and optionally sample rows, with notes on what didn't carry over) |
|
|
302
304
|
|
|
@@ -333,7 +335,7 @@ row above where there is one.
|
|
|
333
335
|
| WS-4 AI Agents with tools | ✅ | (sprint 111) AI Agents and AI Tools as shared components, a Navigate tool, Gemini and OpenAI-compatible services ([Workflow, automation and AI](#workflow-automation-and-ai)) |
|
|
334
336
|
| WS-5 AI interactive reports: chips, computed columns | ✅ | (sprint 112) *Ask in your own words* with chips, Undo and computed columns; a phrase parser that needs no AI service; (sprint 122) phrases set faceted search and smart filter facets |
|
|
335
337
|
| WS-6 Workflow 26.2: outcomes, migrating running instances, drafts, diagram export | ✅ | (sprint 114) Custom task outcomes, task events, Send E-Mail and draft steps, migrating running instances, the diagram as SVG / PNG ([Workflow, automation and AI](#workflow-automation-and-ai)) |
|
|
336
|
-
| WS-7 The builder in more languages | ✅ | (sprint 121) The builder in Deutsch, English, Español, Français, Nederlands and Português, and (sprint 134, SEC-5) Italiano, 中文 (简体), 中文 (繁體), 日本語 and 한국어 with CJK font stacks: links on the sign-in page, a language menu in the status bar, the choice stored per developer (migration 127); builder texts are keyed message files with a coverage check in CI, also for the builder's own JavaScript (sprint 123). Translated (sprints 121, 123–125): the builder's frame, sign-in page, Workspace home, App Builder home, an application's home and tabs, the Page Designer's toolbar, menus, tree and gallery, the SQL Workshop's home and tabs, the SQL Worksheet, Object Browser and Table Properties, Shared Components, an application's settings, Users, identity providers, Developers and Workspaces ([chapter 3](guide/03-builder.md#choosing-the-builder-language)).
|
|
338
|
+
| WS-7 The builder in more languages | ✅ | (sprint 121) The builder in Deutsch, English, Español, Français, Nederlands and Português, and (sprint 134, SEC-5) Italiano, 中文 (简体), 中文 (繁體), 日本語 and 한국어 with CJK font stacks: links on the sign-in page, a language menu in the status bar, the choice stored per developer (migration 127); builder texts are keyed message files with a coverage check in CI, also for the builder's own JavaScript (sprint 123). Translated (sprints 121, 123–125): the builder's frame, sign-in page, Workspace home, App Builder home, an application's home and tabs, the Page Designer's toolbar, menus, tree and gallery, the SQL Workshop's home and tabs, the SQL Worksheet, Object Browser and Table Properties, Shared Components, an application's settings, Users, identity providers, Developers and Workspaces ([chapter 3](guide/03-builder.md#choosing-the-builder-language)). (sprint 152) Workspace utilities, the dashboard, Mail queue, Network access, Instance settings and LDAP directories; (sprint 153) Database users. Still English: the other SQL Workshop tools and the region and report settings, until they move over; by design the property editor's and component forms' field names and help |
|
|
337
339
|
| WS-8 App Gallery: more sample apps, Utility Apps | ✅ | (sprint 120) Four tabs with counts and a search that also works without JavaScript ([chapter 3](guide/03-builder.md#app-gallery)). *Sample Apps*: HR Demo, Tasks, ten single-topic apps (Sample Charts, Sample Cards, Sample Calendar, Sample Interactive Grids, Sample Dynamic Actions, Sample Reporting; sprint 122: Sample Maps, Sample Approvals, Sample Data Loading, Sample Files) and the **UX Pattern Catalog**, each with its own schema, data, demo account and explanatory texts, installed by administrators from one SQL file in one transaction; *Utility Apps*: Lookup Lists, Release Notes and Announcements as blueprints any developer installs into the workspace. APEX's 27 sample apps include topics pgkiln shows in HR Demo instead (REST, trees, collections); no remote catalogue |
|
|
338
340
|
| WS-9 Mail queue reporting, workspace SMTP, workspace network ACLs | ✅ | (sprint 118) Administration → Mail queue (per hour and per workspace / application, the slowest provider calls, failures with the provider's answer, Retry and Purge), a workspace's own mail service, and a workspace's network access list that narrows the installation's allow-list for every outgoing call ([Administration](#administration)) |
|
|
339
341
|
| WS-10 Universal Theme 26.2: Pillar appearances, navigation polish | ✅ | (sprint 117) Theme Roller → Navigation appearance Pillar Light / Pillar Dark per application or style, with a header strip colour for light and dark mode; the current page filled, its parents bold with an accent guide line; `u-color-*-subtle` utilities; a lighter processing indicator; RTL mirrored |
|
|
@@ -232,11 +232,11 @@ current user:
|
|
|
232
232
|
|
|
233
233
|
| Component | Rendered when |
|
|
234
234
|
|---|---|
|
|
235
|
-
| Region | its authorization scheme passes **and** its server-side condition
|
|
236
|
-
| Item | its region is rendered **and** its
|
|
235
|
+
| Region | its authorization scheme passes **and** its server-side condition holds ([condition types](06-processing.md#server-side-conditions)) |
|
|
236
|
+
| Item | its region is rendered, its authorization scheme passes **and** its server-side condition holds |
|
|
237
237
|
| Item (editable) | rendered, not hidden/display, **and** its read-only condition is false |
|
|
238
238
|
| Button | its region is rendered, its authorization scheme passes **and** its condition is true |
|
|
239
|
-
| Dynamic action | its authorization scheme passes |
|
|
239
|
+
| Dynamic action | its authorization scheme passes **and** its server-side condition holds |
|
|
240
240
|
| Navigation entry, link | the target page's authorization passes |
|
|
241
241
|
|
|
242
242
|
A component that is not rendered **cannot be used**: its button can't be pressed and its item
|
package/docs/guide/03-builder.md
CHANGED
|
@@ -521,7 +521,9 @@ home page and tabs, (sprint 123) the **SQL Worksheet** (with its messages in the
|
|
|
521
521
|
and **Table Properties**, and (sprint 124) **Shared Components** (the overview, every component type's list and
|
|
522
522
|
editor frame, access control, breadcrumbs, component settings) and an application's **Settings**, and (sprint 125)
|
|
523
523
|
the administration screens: **Users** (accounts and identity providers), **Developers** and **Workspaces** (with
|
|
524
|
-
utilization)
|
|
524
|
+
utilization), and (sprint 152) **Workspace utilities**, the workspace **Dashboard**, **Mail queue**, **Network
|
|
525
|
+
access**, **Instance settings** (its frame: each setting's own label and help, and the lockout checks' details, stay
|
|
526
|
+
English) and **LDAP directories**, and (sprint 153) **Database users**. Other builder pages are still in English (they move over screen by screen); so are the
|
|
525
527
|
Page Designer's property names and their help (and, the same way, the field names and help of a shared component's
|
|
526
528
|
form), the links to this guide, and any SQL the builder generates.
|
|
527
529
|
|
|
@@ -1972,14 +1974,22 @@ agents use one. Providers are part of the application: Shared Components → Gen
|
|
|
1972
1974
|
`mxbai-embed-large` (1024) … The key, base URL and daily limits are the service's: **the key stays with the
|
|
1973
1975
|
AI service** (encrypted, write-only, never exported); the export carries only the service's name. Texts per
|
|
1974
1976
|
request and requests per minute limit the background embedding of queued rows;
|
|
1977
|
+
- *Model in the database* (sprint 151; APEX: an ONNX model loaded in the database): the model runs inside
|
|
1978
|
+
PostgreSQL through an extension, with no AI service and nothing leaving the database. The **engine** is
|
|
1979
|
+
`pgml` (PostgresML: `pgml.embed(model, text)`, which loads Hugging Face models, ONNX among them, on its first
|
|
1980
|
+
call) and the **model** its name: `intfloat/e5-small-v2` (384 dimensions), `Alibaba-NLP/gte-base-en-v1.5`
|
|
1981
|
+
(768), `mixedbread-ai/mxbai-embed-large-v1` (1024) … The form says when PostgresML is not installed. Like a
|
|
1982
|
+
function, it runs as the role of the query: grant usage on schema `pgml` to the application's role. Vector
|
|
1983
|
+
columns of such a provider are kept **at once** by their trigger, and searches embed the search text in the
|
|
1984
|
+
query;
|
|
1975
1985
|
- *SQL or PL/pgSQL function*: `schema.name` of a function `(text)` returning `vector`, `real[]` or
|
|
1976
|
-
`float8[]`, e.g.
|
|
1986
|
+
`float8[]`, e.g. `ai.openai_embed` of pgai, an ONNX runtime in PL/Python, or your own;
|
|
1977
1987
|
- the **dimensions**: every embedding is checked against them, and a vector column is `vector(n)` with this *n*
|
|
1978
1988
|
(an HNSW index takes up to 2,000).
|
|
1979
1989
|
|
|
1980
1990
|
**Test** embeds a sample text and shows how many dimensions came back. A provider's page lists the search
|
|
1981
1991
|
configurations and vector columns that use it. In SQL, `meta.embed(text, 'DOC_EMBEDDINGS')` returns a function
|
|
1982
|
-
provider's embedding as `real[]` (cast it: `meta.embed(…)::vector`), running the function **as the role of the
|
|
1992
|
+
or database model provider's embedding as `real[]` (cast it: `meta.embed(…)::vector`), running the function **as the role of the
|
|
1983
1993
|
query** (its grants apply: grant execute on it to the application's role). An AI service is called by the pgkiln
|
|
1984
1994
|
server, never from SQL: `meta.embed` says so for such a provider; use it through a search configuration, a
|
|
1985
1995
|
Retrieve tool or a vector column's queue.
|
|
@@ -118,8 +118,9 @@ region**), e.g. on the click of a button with action *Defined by dynamic action*
|
|
|
118
118
|
them along. The carousel is a style of the [display selector](#display_selector-region-display-selector)
|
|
119
119
|
region (`{"style": "carousel"}`). The HR example's page 44 (*Region templates*) shows them all.
|
|
120
120
|
|
|
121
|
-
Every region also has `seq` (order),
|
|
122
|
-
|
|
121
|
+
Every region also has `seq` (order), a [server-side condition](06-processing.md#server-side-conditions)
|
|
122
|
+
(`condition_type`, `condition` as its expression, `condition_value`; without a type `condition` is a SQL
|
|
123
|
+
boolean expression; the region renders only when it holds) and `authz` (an authorization scheme).
|
|
123
124
|
|
|
124
125
|
### Template options
|
|
125
126
|
|
|
@@ -1102,6 +1103,19 @@ visits, incidents or sales. A legend (fewer → more) sits in the corner. GeoJSO
|
|
|
1102
1103
|
select lat, lng, sal as weight from hr.emp join hr.dept using (deptno) -- {"layer": "heat"}
|
|
1103
1104
|
```
|
|
1104
1105
|
|
|
1106
|
+
**Lines, polygons and extruded polygons** (sprint 159; APEX: map layer types). `"layer": "lines"`,
|
|
1107
|
+
`"polygons"` or `"extruded"` draws only the rows' shapes (a `geojson` column, or a PostGIS geometry),
|
|
1108
|
+
with a style: `{"style": {"fill_color": "#2e5c8a", "stroke_color": "#1b2230", "stroke_width": 2,
|
|
1109
|
+
"opacity": 0.6}}`. A row overrides it with columns of the same names (`fill_color`, `stroke_color`,
|
|
1110
|
+
`stroke_width`, `opacity`); colours are `#rrggbb` and numbers within range, anything else is left
|
|
1111
|
+
out. A shape's `title` is its tooltip, `title` and `body` its popup. **Extruded** polygons are shaded
|
|
1112
|
+
by a `height` column, from light (lowest) to strong (highest), with the height in the tooltip:
|
|
1113
|
+
pgkiln draws them flat, without APEX's 3D view.
|
|
1114
|
+
|
|
1115
|
+
```sql
|
|
1116
|
+
select dname as title, st_asgeojson(area) as geojson, headcount as height from hr.sales_area -- {"layer": "extruded"}
|
|
1117
|
+
```
|
|
1118
|
+
|
|
1105
1119
|
**Marker clustering.** With `"cluster": true` markers that are close together at the current zoom
|
|
1106
1120
|
level are drawn as one round marker with their number; clicking it zooms in to them. Zooming
|
|
1107
1121
|
regroups them, and at the two highest zoom levels every place is shown by itself. Use it for
|
|
@@ -1121,7 +1135,7 @@ seven more, each with its own query (the same columns as above) and its own sett
|
|
|
1121
1135
|
```
|
|
1122
1136
|
|
|
1123
1137
|
Each layer has `name` (shown in the legend, translatable like other texts), `source`, and optionally
|
|
1124
|
-
`layer` (`markers` or `
|
|
1138
|
+
`layer` (`markers`, `heat`, `lines`, `polygons` or `extruded`), `style`, `cluster`, `link`, `hidden` (off until the user switches it on),
|
|
1125
1139
|
`visible_area` and `tiles`.
|
|
1126
1140
|
On a map with more than one layer each layer's places, lines and areas get their own colour, and a
|
|
1127
1141
|
**Layers** legend in the corner switches them on and off. Without JavaScript the list below the map
|