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
310 lines
12 KiB
SQL
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;
|