Files
sqlpage--sqlpage/examples/CRUD - Authentication/www/currencies_item_form.sql
T
wehub-resource-sync d718c5a372
CI / compile_and_lint (push) Failing after 0s
CI / docker_build (linux/amd64, -linux-amd64-duckdb, duckdb) (push) Failing after 0s
CI / docker_build (linux/arm64, -linux-arm64, minimal) (push) Failing after 2s
CI / docker_build (linux/arm64, -linux-arm64-duckdb, duckdb) (push) Failing after 1s
CI / docker_build (linux/amd64, minimal) (push) Failing after 1s
CI / test (, sqlite, sqlite::memory:) (push) Has been skipped
CI / test (mssql, mssql, mssql://root:Password123!@127.0.0.1/sqlpage) (push) Has been skipped
CI / test (mysql, mysql, mysql://root:Password123!@127.0.0.1/sqlpage) (push) Has been skipped
CI / test (oracle, oracle, Driver=Oracle 21 ODBC driver;Dbq=//127.0.0.1:1521/FREEPDB1;Uid=root;Pwd=Password123!) (push) Has been skipped
CI / test (postgres, odbc, Driver=PostgreSQL Unicode;Server=127.0.0.1;Port=5432;Database=sqlpage;UID=root;PWD=Password123!, true) (push) Has been skipped
CI / test (postgres, postgres, postgres://root:Password123!@127.0.0.1/sqlpage) (push) Has been skipped
CI / playwright (push) Has been skipped
CI / docker_build (linux/arm/v7, -linux-arm-v7, minimal) (push) Failing after 0s
CI / hurl_examples (push) Failing after 8s
deploy website / deploy_official_site (push) Failing after 1s
CI / hurl (${{ matrix.example }}) (push) Has been skipped
CI / docker_push (duckdb) (push) Has been cancelled
CI / docker_push (minimal) (push) Has been cancelled
CI / windows_test (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 12:31:57 +08:00

310 lines
12 KiB
SQL

-- Reads an item from the database if valid id is provided and
-- populates the form. Otherwise, an empty form is presented.
-- =============================================================================
-- =========================== Module Setting ==================================
-- =========================== Login / Logout ==================================
-- =============================================================================
-- $_curpath and $_session_required are required for header_shell_session.sql.
set _curpath = sqlpage.path();
set _session_required = 1;
SELECT
'dynamic' AS component,
sqlpage.run_sql('header_shell_session.sql') AS properties;
-- =============================================================================
-- =============================== Module vars =================================
-- =============================================================================
set _getpath = '?path=' || ifnull($path, $_curpath);
set _action_target = 'currencies_item_dml.sql' || $_getpath;
set _table_list = 'currencies_list.sql';
-- =============================================================================
-- ========================== Filter invalid $id ===============================
-- =============================================================================
--
-- NULL is passed as 0 or '' via POST
SELECT
'redirect' AS component,
$_curpath AS link
WHERE $id = '' OR CAST($id AS INT) = 0;
-- If $id is set, it must be a valid PKEY value.
set error_msg = sqlpage.url_encode('Bad {id = ' || $id || '} provided');
SELECT
'redirect' AS component,
$_curpath || '?error=' || $error_msg AS link
-- If $id IS NULL, NOT IN returns NULL and redirect is NOT selected.
WHERE $id NOT IN (SELECT currencies.id FROM currencies);
-- =============================================================================
-- ======================== Filter invalid $values =============================
-- =============================================================================
--
-- If $values is provided, it must contain a valid JSON.
set _err_msg =
sqlpage.url_encode('Values is set to bad JSON: __ ') || $values || ' __';
SELECT
'redirect' AS component,
$_curpath || '?error=' || $_err_msg AS link
-- Covers $values IS NULL..
WHERE NOT json_valid($values);
-- =============================================================================
-- ============================= Prepare data ==================================
-- =============================================================================
--
-- Field values may be provided via the $values GET variable formatted as JSON
-- object. If $values contains a valid JSON, use it to populate the form.
-- Otherwise, if $id is set to a valid value, retrieve the record from the
-- database and set values. If not, set values to all NULLs.
set _values = (
WITH
fields AS (
-- If valid "id" is supplied as a GET variable, retrieve the record and
-- populate the form.
SELECT id, name, to_rub
FROM currencies
WHERE id = CAST($id AS INT) AND $values IS NULL
-- If no "id" is supplied, the first part does not return any records,
-- so add a dummy record.
UNION ALL
SELECT NULL, '@', 1
WHERE $id IS NULL AND $values IS NULL
-- If $value contains a valid JSON, use it to populate the form
UNION ALL
SELECT
$values ->> '$.id' AS id,
$values ->> '$.name' AS name,
$values ->> '$.to_rub' AS to_rub
WHERE json_valid($values)
)
SELECT
json_object(
'id', CAST(fields.id AS INT),
'name', fields.name,
'to_rub', CAST(CAST(fields.to_rub AS TEXT) AS NUMERIC)
)
FROM fields
);
-- =============================================================================
-- ========================= Browse Records Button =============================
-- =============================================================================
--
SELECT
'button' AS component,
'square' AS shape,
'sm' AS size,
'end' AS justify;
SELECT
'BROWSE' AS title,
'browse_rec' AS id,
'corner-down-left' AS icon,
'corner-down-left' AS icon_after,
'green' AS outline,
TRUE AS narrow,
$_table_list AS link,
'Browse full table' AS tooltip
WHERE NOT ifnull($action = 'DELETE', FALSE);
-- =============================================================================
-- ============================== Main Form ====================================
-- =============================================================================
--
-- When confirming record deletion, set all fields to read-only and id type to
-- number. No need to worry about the field values: all fields. including id are
-- passed back as POST variables, and the code above sets the $_values variable
-- for proper initialization of the reloaded form.
set _valid_ids = (
SELECT json_group_array(
json_object('label', CAST(id AS TEXT), 'value', id) ORDER BY id
)
FROM currencies
WHERE ifnull($action, '') <> 'INSERT'
UNION ALL
SELECT '[]'
WHERE $action = 'INSERT'
);
set _valid_ids = (
json_insert($_valid_ids, '$[#]',
json_object('label', 'NULL', 'value', json('null'))
)
);
SELECT
'dynamic' AS component,
json_array(
json_object(
'component', 'form',
'title', 'Currency',
'class', 'form_class',
'id', 'detail_view',
'validate', '',
'action', $_action_target
),
json_object(
'name', 'id',
'label', 'ID',
'type', iif(ifnull($action = 'DELETE', FALSE), 'number', 'select'),
'name', 'id',
'value', $_values ->> '$.id',
'options', $_valid_ids,
'width', 4,
'readonly', ifnull($action = 'DELETE', FALSE),
'required', json('false')
),
json_object(
'name', 'name',
'label', 'Currency',
'value', $_values ->> '$.name',
'placeholder', 'RUR',
'width', 4,
'readonly', ifnull($action = 'DELETE', FALSE),
'required', json('true')
),
json_object(
'type', 'number',
'step', 0.01,
'name', 'to_rub',
'label', 'Exchange Rate to RUR',
'value', $_values ->> '$.to_rub',
'placeholder', 1,
'width', 4,
'readonly', ifnull($action = 'DELETE', FALSE),
'required', json('true')
)
) AS properties
;
-- =============================================================================
-- ===================== Display DELETE confirmation ===========================
-- =============================================================================
SELECT
'alert' AS component,
'warning' AS color,
'alert-triangle' AS icon,
TRUE AS important,
'Warning' AS title,
'Confirm record deletion' AS description
WHERE $action = 'DELETE';
-- =============================================================================
-- ========================== Main Form Buttons ================================
-- =============================================================================
--
-- When confirming record deletion, disable the UPDATE button, replace
-- the Reload button with the Cancel button, invert the DELETE button by
-- removing the outline color, and ajust the POST target.
SELECT
'button' AS component,
'pill' AS shape,
'' AS size,
'center' AS justify;
SELECT -- Default button
'(Re)load' AS title,
'read_rec' AS id,
'database' AS icon,
'database' AS icon_after,
'green' AS outline,
TRUE AS narrow,
$_curpath AS link,
'detail_view' AS form,
TRUE AS space_after
WHERE NOT ifnull($action = 'DELETE', FALSE);
SELECT -- Cancel DELETE button
'Cancel' AS title,
'read_rec' AS id,
'alert-triangle' AS icon,
'alert-triangle' AS icon_after,
'primary' AS color,
TRUE AS narrow,
$_curpath AS link,
'detail_view' AS form,
TRUE AS space_after
WHERE ifnull($action = 'DELETE', FALSE);
SELECT
'Update' AS title, -- UPDATE / INSERT button
'update_rec' AS id,
'device-floppy' AS icon,
'device-floppy' AS icon_after,
'azure' AS outline,
TRUE AS narrow,
$_action_target || '&action=UPDATE' AS link,
'detail_view' AS form,
ifnull($action = 'DELETE', FALSE) AS disabled,
TRUE AS space_after;
SELECT -- DELETE button
'DELETE' AS title,
'delete_rec' AS id,
'alert-triangle' AS icon,
'trash' AS icon_after,
TRUE AS narrow,
iif(ifnull($action = 'DELETE', FALSE), NULL, 'danger') AS outline,
iif(ifnull($action = 'DELETE', FALSE),
$_action_target, $_curpath || '?') || '&action=DELETE' AS link,
'danger' AS color,
'detail_view' AS form,
FALSE AS space_after;
-- =============================================================================
-- ======================== Display confirmation ===============================
-- =============================================================================
SELECT
'alert' AS component,
'green' AS color,
'check' AS icon,
'Success' AS title,
$info AS description,
True AS dismissible
WHERE $info IS NOT NULL;
-- =============================================================================
-- ======================== Display error message ==============================
-- =============================================================================
SELECT
'alert' AS component,
'red' AS color,
'thumb-down' AS icon,
$op || ' error' AS title,
$error AS description,
True AS dismissible
WHERE $error IS NOT NULL;
-- =============================================================================
-- DEBUG
-- =============================================================================
SELECT
'dynamic' AS component,
sqlpage.run_sql('footer_debug_post-get-set.sql') AS properties;