Daniel Sheffield 4 ヶ月 前
コミット
6d29028712

+ 2 - 1
util-sqlpage/code.sql

@@ -1,2 +1,3 @@
-SET inner = 'code/Index.sql';
+SET ":has_post_params" = (SELECT 1 FROM json_each(sqlpage.variables('post')) LIMIT 1);
+SET ":inner" = 'code/Index.sql';
 SELECT 'dynamic' AS component, sqlpage.run_sql('code/entry.sql') AS properties;

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

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

+ 9 - 13
util-sqlpage/code/form-fuel.sql

@@ -1,16 +1,16 @@
 --TODO: show barcode at top
 --SELECT 'dynamic' AS component, sqlpage.run_sql('sqlpage/QR.sql') AS properties;
 SET filter_options = (
-  SELECT json_agg(json_build_object('name', k, 'options', o))
+  SELECT json_group_array(json_object('name', k, 'options', o))
   FROM (
-    SELECT o.k, json_agg(
-      json_build_object('label', v, 'value', v, 'selected', c == 1)
+    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 
-    ) AS o
+    ) o
     WHERE v IS NOT NULL
     GROUP BY o.k
   ) q(k, o)
@@ -48,12 +48,8 @@ ON (o.j#>>'{name}') = j.name
 LEFT JOIN json_each_text(sqlpage.variables()::json) v(key, value)
 ON v.key = j.name
 ;
-INSERT INTO code_detal(hash, type, value, expiry, used)
-VALUES ($hash, $type, $value, $expiry, $used)
-ON CONFLICT DO
-UPDATE SET
-  type = excluded.type,
-  value = excluded.value,
-  expiry = excluded.expiry,
-  used = excluded.used
-;
+SET ":inner" = CASE COALESCE(:action, '')
+  WHEN 'Update' THEN 'code/update.sql'
+  ELSE 'sqlpage/none.sql'
+END;
+SELECT 'dynamic' AS component, sqlpage.run_sql(:inner) AS properties;

+ 16 - 11
util-sqlpage/code/json/filters.json

@@ -1,21 +1,26 @@
 [
     { "name": "type", "label": "",
-      "type": "hidden", "value": "Fuel"
-    },
-    { "name": "used", "label": "Use",
-      "type": "checkbox", "value": "true",
-      "width": 1
-    },
-    { "name": "expiry", "label": "Expiry",
-      "type": "date",
-      "width": 3
+      "type": "hidden", "value": "Fuel",
+      "width": 2
     },
     { "name": "store", "label": "Store",
       "type": "select", "dropdown": true,
-      "width": 3
+      "width": 2
     },
     { "name": "value", "label": "Value", "prefix": "$",
       "type": "select", "dropdown": true,
-      "width": 3
+      "width": 2
+    },
+    { "name": "expiry", "label": "Expiry",
+      "type": "date",
+      "width": 2
+    },
+    { "name": "used", "label": "Use",
+      "type": "checkbox", "value": "true",
+      "width": 2
+    },
+    { "name": "expired", "label": "",
+      "type": "hidden", "value": "false",
+      "width": 2
     }
 ]

+ 37 - 31
util-sqlpage/code/recent.sql

@@ -1,57 +1,63 @@
 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": "type", "type": "select"},
+SET ":filter_config" = '[
+  {"name": "type", "label": "Type", "type": "select"},
   {"name": "expired", "label": "Show Expired",
    "type": "checkbox", "value": "true"
   },
   {"name": "used", "label": "Show Used"}
 ]';
+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_agg(json_build_object('name', k, 'options', o))
+  SELECT json_group_array(json_object('name', q.k, 'options', q.o))
   FROM (
-    SELECT o.k, json_agg(
-      json_build_object('label', v, 'value', v, 'selected', c == 1)
-      ORDER BY v)
+    SELECT options.k, json_group_array(
+      json_object('label', v, 'value', v, 'selected', c == 1)
+      ORDER BY v) o
     FROM (
-      SELECT 'store' AS k, DISTINCT store AS v, count(DISTINCT store) AS c FROM code_detail
+      SELECT DISTINCT 'store' k, store v, count(store) OVER () c FROM code_detail
       UNION
-      SELECT 'type' AS k, DISTINCT type AS v, count(DISTINCT type) AS c FROM code_detail 
-    ) AS o
+      SELECT DISTINCT 'type' k, type v, count(type) OVER () c FROM code_detail 
+    ) options
     WHERE v IS NOT NULL
-    GROUP BY o.k
-  ) q(k, o)
+    GROUP BY options.k
+  ) q
 );
 SELECT 'form' AS component
 , '/code.sql' AS action
-, 'Update' AS validate
+, 'Apply' AS validate
 , $tabler_color AS validate_color
 , 'get' AS method
 ;
-SELECT j.name
+SELECT j.v->>'name' AS 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
+, 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.value) AS value
+, CASE j.v->>'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
+, 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 json_each(sqlpage.variables()::json) v
+ON v.key = j.v->>'name'
 ;
 SELECT 'table' AS component;
-SELECT hash, content, created
+SELECT c.hash, content, created
 FROM code c
 LEFT JOIN code_detail cd
 ON c.hash = cd.hash
@@ -65,5 +71,5 @@ WHERE (
       ELSE COALESCE($type, '') = cd.type
     END
 )
-ORDER BY expiry, type, hash NULLS FIRST
+ORDER BY expiry, type, c.hash NULLS FIRST
 ;

+ 6 - 6
util-sqlpage/code/save.sql

@@ -1,4 +1,4 @@
-SET :request = json_object(
+SET ":request" = json_object(
     'method', 'POST',
     'url', 'https://shandan.one/hash',
     'headers', json_object(),
@@ -7,9 +7,9 @@ SET :request = json_object(
         'person', $tool
     )
 );
-SET :hash = sqlpage.fetch($request);
-SET :fallback = 'https://shandan.one/upload/' || sqlpage.url_encode($hash);
-SET :request = json_object(
+SET ":hash" = sqlpage.fetch($request);
+SET ":fallback" = 'https://shandan.one/upload/' || sqlpage.url_encode($hash);
+SET ":request" = json_object(
     'method', 'POST',
     'url', 'https://shandan.one/qr',
     'headers', json_object(),
@@ -18,8 +18,8 @@ SET :request = json_object(
         'fallback', $fallback
     )
 );
-SET :qr = sqlpage.fetch($request);
-SET :inner = CASE $action
+SET ":qr" = sqlpage.fetch($request);
+SET ":inner" = CASE $action
   WHEN 'Update' THEN 'code/update.sql'
   ELSE 'code/new.sql'
 END;

+ 9 - 0
util-sqlpage/code/update.sql

@@ -0,0 +1,9 @@
+INSERT INTO code_detal(hash, type, value, expiry, used)
+VALUES ($hash, $type, $value, $expiry, $used)
+ON CONFLICT DO
+UPDATE SET
+  type = excluded.type,
+  value = excluded.value,
+  expiry = excluded.expiry,
+  used = excluded.used
+;

+ 1 - 0
util-sqlpage/sqlpage/migrations/007_code_detail.sql

@@ -2,6 +2,7 @@ DROP TABLE IF EXISTS code_detail;
 CREATE TABLE IF NOT EXISTS code_detail(
   hash text PRIMARY KEY,
   type text,
+  store text,
   value numeric,
   expiry timestamp,
   used bool

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

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