Browse Source

ui fleshed out

Daniel Sheffield 4 months ago
parent
commit
198aaef3d7

+ 4 - 5
util-sqlpage/code/Index.sql

@@ -1,11 +1,10 @@
 SET ":content" = (SELECT sqlpage.variables('post'));
 
-SELECT 'debug' AS component;
-SELECT :has_post_params AS has_post_params;
-SELECT sqlpage.variables('post') AS vars;
-
 SET ":inner" = CASE :has_post_params
-  WHEN 1 THEN 'code/save.sql'
+  WHEN 1 THEN CASE COALESCE($hash, '')
+    WHEN '' THEN 'code/save.sql'
+    ELSE 'code/form-fuel.sql'
+  END
   ELSE CASE COALESCE($hash, '')
     WHEN '' THEN 'code/recent.sql'
     ELSE 'code/form-fuel.sql'

+ 1 - 0
util-sqlpage/code/entry.sql

@@ -1,5 +1,6 @@
 SET title = 'Code';
 SET tool = 'code';
+SET ":link" = '/code.sql';
 SET color = '#f59f00';
 SET tabler_color = 'azure';
 --SET image = '/static/upload/upload-favicon_square.svg';

+ 22 - 48
util-sqlpage/code/form-fuel.sql

@@ -1,55 +1,29 @@
 --TODO: show barcode at top
 --SELECT 'dynamic' AS component, sqlpage.run_sql('sqlpage/QR.sql') AS properties;
-SET filter_options = (
-  SELECT json_group_array(json_object('name', k, 'options', o))
-  FROM (
-    SELECT o.k, json_group_array(
-      json_object('label', v, 'value', v, 'selected', c == 1)
-      ORDER BY v)
-    FROM (
-      SELECT 'store' AS k, DISTINCT store AS v, count(DISTINCT store) AS c FROM code_detail
-      UNION
-      SELECT 'value' AS k, DISTINCT value AS v, count(DISTINCT value) AS c FROM code_detail 
-    ) o
-    WHERE v IS NOT NULL
-    GROUP BY o.k
-  ) q(k, o)
-);
-SET :expiry = (SELECT expiry FROM code_detail WHERE hash = $hash);
-SET :value = (SELECT value FROM code_detail WHERE hash = $hash);
-SET :store = (SELECT store FROM code_detail WHERE hash = $hash);
-SET :used = (SELECT used FROM code_detail WHERE hash = $hash);
+SET ":title" = 'Fuel Voucher';
+SET ":expiry" = COALESCE(:expiry, (SELECT expiry FROM code_detail WHERE hash = $hash));
+SET ":value" = COALESCE(:value, (SELECT value FROM code_detail WHERE hash = $hash));
+SET ":store" = COALESCE(:store, (SELECT store FROM code_detail WHERE hash = $hash));
+SET ":used" = COALESCE(:used, (SELECT used FROM code_detail WHERE hash = $hash));
+SET ":validate" = 'Update';
+SET "$action" = 'Update';
+SET ":method" = 'post';
+SET ":filter_config" = '[
+  {"name": "store", "required": true},
+  {"name": "value", "required": true},
+  {"name": "expiry", "required": true},
+    { "name": "used", "label": "Used",
+      "type": "radio", "value": "true",
+      "width": 2
+    },
+    { "name": "used", "label": "Not Used",
+      "type": "radio", "value": "false",
+      "width": 2
+    }
+]';
 
-SELECT 'form' AS component
-, '/code.sql' AS action
-, 'Update' AS validate
-, $tabler_color AS validate_color
-, 'post' AS method
-;
-SELECT j.name
---, fo.j#>>'{options}' AS label
-, j.label
-, COALESCE(c.type, j.type) AS type
-, j.dropdown AS dropdown
-, j.multiple
-, COALESCE(c.width, j.width) AS width
-, o.j#>'{options}' AS options
-, COALESCE(j.value, v.value) AS value
-, CASE j.type
-    WHEN 'checkbox' THEN v.value::bool
-    ELSE NULL
-  END AS checked
-, j.formaction
-FROM json_populate_recordset(null::sqlpage_filter_type, sqlpage.read_file_as_text('code/json/filters.json')::json) j
-LEFT JOIN json_populate_recordset(null::sqlpage_filter_type, $filter_config::json) c
-USING (name)
-LEFT JOIN json_array_elements($filter_options::json) o(j)
-ON (o.j#>>'{name}') = j.name
-LEFT JOIN json_each_text(sqlpage.variables()::json) v(key, value)
-ON v.key = j.name
-;
 SET ":inner" = CASE COALESCE(:action, '')
   WHEN 'Update' THEN 'code/update.sql'
-  ELSE 'sqlpage/none.sql'
+  ELSE 'code/form.sql'
 END;
 SELECT 'dynamic' AS component, sqlpage.run_sql(:inner) AS properties;

+ 57 - 0
util-sqlpage/code/form.sql

@@ -0,0 +1,57 @@
+SELECT 'dynamic' AS component, sqlpage.run_sql('sqlpage/theme.sql') AS properties;
+SELECT 'dynamic' AS component, sqlpage.run_sql('sqlpage/Style.sql') AS properties;
+SET ":filter_options" = (
+  SELECT json_group_array(json_object('name', q.k, 'options', q.o))
+  FROM (
+    SELECT options.k, jsonb_group_array(
+      jsonb_object('label', v, 'value', v, 'selected', c == 1)
+      ORDER BY v) o
+    FROM (
+      SELECT DISTINCT 'store' k, store v, count(store) OVER () c FROM code_detail
+      UNION
+      SELECT DISTINCT 'type' k, type v, count(type) OVER () c FROM code_detail
+      UNION
+      SELECT DISTINCT 'value' k, value v, count(value) OVER () c FROM code_detail
+    ) options
+    WHERE v IS NOT NULL
+    GROUP BY options.k
+  ) q
+);
+
+SELECT 'form' AS component
+, '/code.sql' AS action
+, $validate AS validate
+, $tabler_color AS validate_color
+, $method AS method
+;
+SELECT COALESCE(c.v->>'name', j.v->>'name') AS name
+--, fo.j#>>'{options}' AS label
+, COALESCE(c.v->>'label', j.v->>'label') AS label
+, COALESCE(c.v->>'type', j.v->>'type') AS type
+, j.v->>'dropdown' AS dropdown
+, j.v->>'create_new' AS create_new
+, j.v->>'multiple' AS multiple
+, COALESCE(c.v->>'width', j.v->>'width') AS width
+, o.j->>'options' AS options
+, j.v->>'prefix' AS prefix
+, COALESCE(c.v->>'value', j.v->>'value', v.v) AS value
+, CASE COALESCE(c.v->>'type', j.v->>'type')
+    WHEN 'checkbox' THEN v.v = 'true'
+    ELSE NULL
+  END AS checked
+, j.v->>'formaction'
+, COALESCE(c.v->>'required', j.v->>'required') AS required
+FROM (SELECT value v FROM json_each(sqlpage.read_file_as_text('code/json/filters.json'))) j
+FULL JOIN (SELECT value v FROM json_each($filter_config)) c
+ON (j.v->>'name' = c.v->>'name')
+LEFT JOIN (SELECT value j FROM json_each($filter_options)) o
+ON (o.j->>'name') = j.v->>'name'
+LEFT JOIN (SELECT "key" k, value v FROM json_each(sqlpage.variables())) v
+ON v.k = j.v->>'name' OR v.k = c.v->>'name'
+;
+
+SELECT 'table' AS component
+WHERE COALESCE($hash, '') <> '';
+SELECT * FROM code_detail
+WHERE COALESCE($hash, '') <> ''
+AND hash = $hash;

+ 6 - 8
util-sqlpage/code/json/filters.json

@@ -4,23 +4,21 @@
       "width": 2
     },
     { "name": "store", "label": "Store",
-      "type": "select", "dropdown": true,
+      "type": "select", "dropdown": true, "create_new": true,
       "width": 2
     },
     { "name": "value", "label": "Value", "prefix": "$",
-      "type": "select", "dropdown": true,
+      "type": "select", "dropdown": true, "create_new": true,
       "width": 2
     },
     { "name": "expiry", "label": "Expiry",
       "type": "date",
       "width": 2
     },
-    { "name": "used", "label": "Use",
-      "type": "checkbox", "value": "true",
-      "width": 2
+    { "name": "action", "label": "",
+      "type": "hidden"
     },
-    { "name": "expired", "label": "",
-      "type": "hidden", "value": "true",
-      "width": 2
+    { "name": "hash", "label": "",
+      "type": "hidden"
     }
 ]

+ 24 - 58
util-sqlpage/code/recent.sql

@@ -1,76 +1,42 @@
-SELECT 'dynamic' AS component, sqlpage.run_sql('sqlpage/theme.sql') AS properties;
-SELECT 'dynamic' AS component, sqlpage.run_sql('sqlpage/Style.sql') AS properties;
+
 SET ":filter_config" = '[
+  {"name": "expiry", "type": "hidden"},
+  {"name": "value", "type": "hidden"},
   {"name": "type", "label": "Type", "type": "select"},
   {"name": "expired", "label": "Show Expired",
-   "type": "checkbox"
+   "type": "checkbox", "value": "true",
+   "width": 2
   },
   {"name": "used", "label": "Show Used",
-   "type": "checkbox"
+   "type": "checkbox", "value": "true",
+   "width": 2
   }
 ]';
-SET ":filter_options" = (SELECT group_concat(v) FROM (
-      SELECT DISTINCT 'store' AS ka, store AS v FROM code_detail
-      UNION
-      SELECT DISTINCT 'type' AS ka, type AS v FROM code_detail 
-    )  q);
-SELECT 'debug' aS component; SELECT :filter_options AS options;
-SET filter_options = (
-  SELECT json_group_array(json_object('name', q.k, 'options', q.o))
-  FROM (
-    SELECT options.k, json_group_array(
-      json_object('label', v, 'value', v, 'selected', c == 1)
-      ORDER BY v) o
-    FROM (
-      SELECT DISTINCT 'store' k, store v, count(store) OVER () c FROM code_detail
-      UNION
-      SELECT DISTINCT 'type' k, type v, count(type) OVER () c FROM code_detail 
-    ) options
-    WHERE v IS NOT NULL
-    GROUP BY options.k
-  ) q
-);
-SELECT 'form' AS component
-, '/code.sql' AS action
-, 'Apply' AS validate
-, $tabler_color AS validate_color
-, 'get' AS method
-;
-SELECT j.v->>'name' AS name
---, fo.j#>>'{options}' AS label
-, COALESCE(c.v->>'label', j.v->>'label') AS label
-, COALESCE(c.v->>'type', j.v->>'type') AS type
-, j.v->>'dropdown' AS dropdown
-, j.v->>'multiple' AS multiple
-, COALESCE(c.v->>'width', j.v->>'width') AS width
-, o.j->'options' AS options
-, COALESCE(j.v->>'value', v.v) AS value
-, CASE COALESCE(c.v->>'type', j.v->>'type')
-    WHEN 'checkbox' THEN v.v = 'true'
-    ELSE NULL
-  END AS checked
-, j.v->>'formaction'
-FROM (SELECT value v FROM json_each(sqlpage.read_file_as_text('code/json/filters.json'))) j
-LEFT JOIN (SELECT value v FROM json_each($filter_config)) c
-ON (j.v->>'name' == c.v->>'name')
-LEFT JOIN (SELECT value j FROM json_each($filter_options::json)) o
-ON (o.j->>'name') = j.v->>'name'
-LEFT JOIN (SELECT "key" k, value v FROM json_each(sqlpage.variables())) v
-ON v.k = j.v->>'name'
-;
-SELECT 'table' AS component;
-SELECT c.hash, content, created
+SET ":validate" = 'Apply';
+SET ":action" = 'Apply';
+SET ":method" = 'get';
+SELECT 'dynamic' AS component, sqlpage.run_sql('code/form.sql') AS properties;
+
+SELECT 'list' AS component;
+SELECT COALESCE(type||' ','') || COALESCE(store||' ', '') || COALESCE(expiry, created) AS title
+, content AS description
+, '/code.sql?hash='||c.hash AS link
 FROM code c
 LEFT JOIN code_detail cd
 ON c.hash = cd.hash
 WHERE (
-    cd.expiry IS NULL OR COALESCE($expired, 'false') == 'true' OR cd.expiry::date < datetime(CURRENT_TIMESTAMP, 'localtime')::date
+    cd.expiry IS NULL OR COALESCE($expired, 'false') = 'true' OR date(cd.expiry) > date(datetime(CURRENT_TIMESTAMP, 'localtime'))
 ) AND (
-    cd.used IS NULL OR COALESCE($used, 'false') == 'true' OR NOT cd.used
+    cd.used IS NULL OR COALESCE($used, 'false') = 'true' OR cd.used||'' = 'false'
 ) AND (
     cd.type IS NULL OR CASE COALESCE($type, '')
       WHEN '' THEN TRUE
-      ELSE COALESCE($type, '') = cd.type
+      ELSE $type = cd.type
+    END
+) AND (
+    cd.store IS NULL OR CASE COALESCE($store, '')
+      WHEN '' THEN TRUE
+      ELSE $store = cd.store
     END
 )
 ORDER BY expiry, type, c.hash NULLS FIRST

+ 1 - 5
util-sqlpage/code/save.sql

@@ -19,8 +19,4 @@ SET ":request" = json_object(
     )
 );
 SET ":qr" = sqlpage.fetch($request);
-SET ":inner" = CASE $action
-  WHEN 'Update' THEN 'code/update.sql'
-  ELSE 'code/new.sql'
-END;
-SELECT 'dynamic' AS component, sqlpage.run_sql(:inner) AS properties;
+SELECT 'dynamic' AS component, sqlpage.run_sql('code/new.sql') AS properties;

+ 6 - 3
util-sqlpage/code/update.sql

@@ -1,9 +1,12 @@
-INSERT INTO code_detal(hash, type, value, expiry, used)
-VALUES ($hash, $type, $value, $expiry, $used)
+INSERT INTO code_detail(hash, type, store, value, expiry, used)
+VALUES ($hash, $type, $store, $value, $expiry, $used)
 ON CONFLICT DO
 UPDATE SET
   type = excluded.type,
+  store = excluded.store,
   value = excluded.value,
   expiry = excluded.expiry,
   used = excluded.used
-;
+WHERE TRUE
+;
+SELECT 'redirect' AS component, '/code.sql' AS link;

+ 0 - 1
util-sqlpage/sqlpage/none.sql

@@ -1 +0,0 @@
--- intentionally blank

+ 1 - 0
util-sqlpage/sqlpage/theme.sql

@@ -1,6 +1,7 @@
 SELECT 'shell' AS component
 , 'dark' AS theme
 , $title AS title
+, $link AS link
 , $image AS image
 , $favicon AS favicon
 , $manifest AS manifest