forked from sqlpage/SQLPage
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcomponent.sql
147 lines (134 loc) · 6.64 KB
/
component.sql
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
-- ensure that the component exists and do not render this page if it does not
select 'redirect' as component,
'component_not_found.sql' || coalesce('?component=' || sqlpage.url_encode($component), '') as link
where not exists (select 1 from component where name = $component);
-- This line, at the top of the page, tells web browsers to keep the page locally in cache once they have it.
select 'http_header' as component,
'public, max-age=600, stale-while-revalidate=3600, stale-if-error=86400' as "Cache-Control",
printf('<%s>; rel="canonical"', sqlpage.link('component.sql', json_object('component', $component))) as "Link";
select 'dynamic' as component, json_patch(json_extract(properties, '$[0]'), json_object(
'title', coalesce($component || ' - ', '') || 'SQLPage Documentation'
)) as properties
FROM example WHERE component = 'shell' LIMIT 1;
select 'breadcrumb' as component;
select 'SQLPage' as title, '/' as link, 'Home page' as description;
select 'Components' as title, '/documentation.sql' as link, 'List of all components' as description;
select $component as title, '/component.sql?component=' || sqlpage.url_encode($component) as link;
select 'text' as component, 'component' as id, true as article,
format('# The **%s** component
%s', $component, description) as contents_md
from component where name = $component;
select format('Introduced in SQLPage v%s.', introduced_in_version) as contents, 1 as size
from component
where name = $component and introduced_in_version IS NOT NULL;
select 'title' as component, 3 as level, 'Top-level parameters' as contents where $component IS NOT NULL;
select 'table' as component, true as striped, true as hoverable, true as freeze_columns,
'type' as markdown
where $component IS NOT NULL;
select
name,
CASE WHEN optional THEN '' ELSE 'REQUIRED' END as required,
CASE type
WHEN 'COLOR' THEN printf('[%s](/colors.sql)', type)
WHEN 'ICON' THEN printf('[%s](https://tabler-icons.io/?ref=sqlpage)', type)
ELSE type
END AS type,
description
from parameter where component = $component AND top_level
ORDER BY optional, name;
select 'title' as component, 3 as level, 'Row-level parameters' as contents
WHERE $component IS NOT NULL AND EXISTS (SELECT 1 from parameter where component = $component AND NOT top_level);
select 'table' as component, true as striped, true as hoverable, true as freeze_columns,
'type' as markdown
where $component IS NOT NULL;
select
name,
CASE WHEN optional THEN '' ELSE 'REQUIRED' END as required,
CASE type
WHEN 'COLOR' THEN printf('[%s](/colors.sql)', type)
WHEN 'ICON' THEN printf('[%s](https://tabler-icons.io/?ref=sqlpage)', type)
ELSE type
END AS type,
description
from parameter where component = $component AND NOT top_level
ORDER BY optional, name;
select
'dynamic' as component,
'[
{"component": "code"},
{
"title": "Example ' || (row_number() OVER ()) || '",
"description_md": ' || json_quote(description) || ',
"language": "sql",
"contents": ' || json_quote((
select
group_concat(
'select ' || char(10) ||
(
with t as (select * from json_tree(top.value)),
key_val as (select
CASE t.type
WHEN 'integer' THEN t.atom
WHEN 'real' THEN t.atom
WHEN 'true' THEN 'TRUE'
WHEN 'false' THEN 'FALSE'
WHEN 'null' THEN 'NULL'
WHEN 'object' THEN 'JSON(' || quote(t.value) || ')'
WHEN 'array' THEN 'JSON(' || quote(t.value) || ')'
ELSE quote(t.value)
END as val,
CASE parent.fullkey
WHEN '$' THEN t.key
ELSE parent.key
END as key
from t inner join t parent on parent.id = t.parent
where ((parent.fullkey = '$' and t.type != 'array')
or (parent.type = 'array' and parent.path = '$'))
),
key_val_padding as (select
CASE
WHEN (key LIKE '% %') or (key LIKE '%-%') THEN
format('"%w"', key)
ELSE
key
END as key,
val,
1 + max(0, max(case when length(val) < 30 then length(val) else 0 end) over () - length(val)) as padding
from key_val
)
select group_concat(
format(' %s%.*cas %s', val, padding, ' ', key),
',' || char(10)
) from key_val_padding
) || ';',
char(10)
)
from json_each(properties) AS top
)) || '
}, '||
CASE component
WHEN 'shell' THEN '{"component": "text", "contents": ""}'
WHEN 'http_header' THEN '{ "component": "text", "contents": "" }'
ELSE '
{"component": "title", "level": 3, "contents": "Result"},
{"component": "dynamic", "properties": ' || properties ||' }
'
END || '
]
' as properties
from example where component = $component AND properties IS NOT NULL;
SELECT 'title' AS component, 3 AS level, 'Examples' AS contents
WHERE EXISTS (SELECT 1 FROM example WHERE component = $component AND properties IS NULL);
SELECT 'text' AS component, description AS contents_md
FROM example WHERE component = $component AND properties IS NULL;
select 'title' as component, 2 as level, 'See also: other components' as contents;
select
'button' as component,
'sm' as size,
'pill' as shape;
select
name as title,
icon,
sqlpage.link('component.sql', json_object('component', name)) as link
from component
order by name;