form.sql 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. SET ":filter_options" = (
  2. SELECT json_group_array(json_object('name', q.k, 'options', q.o))
  3. FROM (
  4. SELECT options.k, jsonb_group_array(
  5. jsonb_object('label', v, 'value', v, 'selected', s OR CASE :autofill WHEN TRUE THEN c = 1 ELSE FALSE END)
  6. ORDER BY v) o
  7. FROM (
  8. SELECT DISTINCT k, v, s, count(v) OVER (
  9. PARTITION BY k ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
  10. ) c FROM (
  11. SELECT 'store'||'[]' k, value v, TRUE s FROM (SELECT value FROM json_each($store))
  12. UNION
  13. SELECT 'store'||'[]', store, NULL s FROM code_detail
  14. UNION
  15. SELECT 'type'||'[]' k, value v, TRUE s FROM (SELECT value FROM json_each($type))
  16. UNION
  17. SELECT 'type'||'[]', type, NULL s FROM code_detail
  18. UNION
  19. SELECT 'value', value, CASE COALESCE($value, '') WHEN '' THEN FALSE ELSE value = :value END s FROM code_detail
  20. )
  21. ) options
  22. WHERE v IS NOT NULL
  23. GROUP BY options.k
  24. ) q
  25. );
  26. SELECT 'form' AS component
  27. , '/code/' AS action
  28. , :validate AS validate
  29. , :tabler_color AS validate_color
  30. , :method AS method
  31. ;
  32. SELECT COALESCE(c.v->>'name', j.v->>'name') AS name
  33. --, fo.j#>>'{options}' AS label
  34. , COALESCE(c.v->>'label', j.v->>'label') AS label
  35. , COALESCE(c.v->>'type', j.v->>'type') AS type
  36. , COALESCE(c.v->>'dropdown', j.v->>'dropdown') AS dropdown
  37. , COALESCE(c.v->>'create_new', j.v->>'create_new') AS create_new
  38. , COALESCE(c.v->>'multiple', j.v->>'multiple') AS multiple
  39. , COALESCE(c.v->>'placeholder', j.v->>'placeholder') AS placeholder
  40. , COALESCE(c.v->>'width', j.v->>'width') AS width
  41. , o.j->>'options' AS options
  42. , COALESCE(c.v->>'prefix', j.v->>'prefix') AS prefix
  43. , COALESCE(c.v->>'value', j.v->>'value', v.v) AS value
  44. , CASE COALESCE(c.v->>'type', j.v->>'type')
  45. WHEN 'checkbox' THEN COALESCE(c.v->>'checked', v.v) = 'true'
  46. WHEN 'radio' THEN COALESCE(c.v->>'checked', v.v) = 'true'
  47. ELSE NULL
  48. END AS checked
  49. , j.v->>'formaction'
  50. , COALESCE(c.v->>'required', j.v->>'required') AS required
  51. FROM (SELECT value v FROM json_each(sqlpage.read_file_as_text('code/json/filters.json'))) j
  52. FULL JOIN (SELECT value v FROM json_each(:filter_config)) c
  53. ON (j.v->>'name' = c.v->>'name')
  54. LEFT JOIN (SELECT value j FROM json_each(:filter_options)) o
  55. ON (o.j->>'name') = j.v->>'name'
  56. LEFT JOIN (SELECT "key" k, value v FROM json_each(sqlpage.variables())) v
  57. ON v.k = j.v->>'name' OR v.k = c.v->>'name'
  58. ;