@opengis/admin 0.2.81 → 0.2.83
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +97 -97
- package/config.js +4 -4
- package/dist/{add-page-VWjSO8tB.js → add-page-DjV6f_jT.js} +1 -1
- package/dist/{admin-interface-DKCJEmgv.js → admin-interface-DAyLdquZ.js} +4 -4
- package/dist/{admin-view-CUJxtNoN.js → admin-view-DooY0sff.js} +2 -2
- package/dist/admin.js +1 -1
- package/dist/admin.umd.cjs +51 -51
- package/dist/assets/logo.svg +41 -41
- package/dist/{card-view-DM7rFVXy.js → card-view-58mVfI5f.js} +1 -1
- package/dist/{edit-page-CbLwc_DQ.js → edit-page-Bg2NgUpM.js} +1 -1
- package/dist/{import-file-Blg4So6f.js → import-file-BHcTcjJq.js} +6003 -5975
- package/dist/style.css +1 -1
- package/module/settings/card/admin.accounts.table/index.yml +7 -7
- package/module/settings/card/admin.accounts.table/rules.hbs +18 -18
- package/module/settings/card/admin.accounts.table/users.hbs +13 -13
- package/module/settings/card/admin.routes.table/groups.hbs +11 -11
- package/module/settings/card/admin.routes.table/index.yml +11 -11
- package/module/settings/card/admin.routes.table/users.hbs +16 -16
- package/module/settings/card/admin.table_properties.table/custom_columns.hbs +23 -0
- package/module/settings/card/admin.table_properties.table/custom_filters.hbs +1 -0
- package/module/settings/card/admin.table_properties.table/index.yml +13 -0
- package/module/settings/card/admin.table_properties.table/info.hbs +18 -0
- package/module/settings/cls/core.actions.json +17 -17
- package/module/settings/cls/core.scope.json +13 -13
- package/module/settings/cls/properties.site_status.json +13 -13
- package/module/settings/cls/properties.widget_status.json +13 -13
- package/module/settings/cls/users.user_type.json +13 -13
- package/module/settings/cls/yes_no.json +11 -11
- package/module/settings/form/admin.accounts.form.json +13 -13
- package/module/settings/form/admin.properties.form.json +15 -15
- package/module/settings/form/admin.roles.form.json +21 -21
- package/module/settings/form/admin.table_properties.form.json +20 -0
- package/module/settings/form/admin.user_properties.form.json +15 -15
- package/module/settings/form/admin.user_roles_card.form.json +13 -13
- package/module/settings/interface/admin.properties.json +4 -4
- package/module/settings/interface/admin.roles.json +4 -4
- package/module/settings/interface/admin.routes.json +4 -4
- package/module/settings/interface/admin.users.json +4 -4
- package/module/settings/menu.json +7 -32
- package/module/settings/select/core.routes.sql +1 -1
- package/module/settings/select/core.user_mentioned.sql +1 -1
- package/module/settings/select/core.user_uid.sql +1 -1
- package/module/settings/table/admin.properties.table.json +39 -39
- package/module/settings/table/admin.table_properties.table.json +38 -0
- package/module/settings/table/admin.user_properties.table.json +34 -34
- package/module/settings/table/auth.logs.table.json +98 -0
- package/package.json +8 -7
- package/plugin.js +29 -29
- package/server/helpers/core/badge.js +16 -16
- package/server/helpers/core/buttonHelper.js +21 -21
- package/server/helpers/core/select.js +48 -48
- package/server/helpers/core/token.js +18 -18
- package/server/helpers/index.js +31 -31
- package/server/helpers/list/buttonHelper.js +21 -21
- package/server/helpers/list/tableList.js +1 -1
- package/server/helpers/list/utils/button.js +5 -5
- package/server/helpers/temp/contentList.js +58 -58
- package/server/helpers/temp/ifCond.js +101 -101
- package/server/helpers/utils/button.js +5 -5
- package/server/plugins/access/index.mjs +6 -6
- package/server/plugins/adminHook.js +81 -81
- package/server/plugins/cron.js +10 -10
- package/server/plugins/docs.js +28 -28
- package/server/plugins/vite.js +71 -71
- package/server/routes/access/controllers/access.group.js +29 -29
- package/server/routes/access/controllers/access.group.post.js +49 -49
- package/server/routes/access/index.mjs +11 -11
- package/server/routes/access/schema.mjs +67 -67
- package/server/routes/calendar/controllers/calendar.data.js +125 -125
- package/server/routes/calendar/index.mjs +7 -7
- package/server/routes/calendar/schema.js +21 -21
- package/server/routes/data/controllers/cardData.js +106 -106
- package/server/routes/data/controllers/cardTabData.js +49 -49
- package/server/routes/data/controllers/funcs/getFilterSQL/index.js +92 -92
- package/server/routes/data/controllers/funcs/getFilterSQL/util/formatValue.js +170 -170
- package/server/routes/data/controllers/funcs/getFilterSQL/util/getCustomQuery.js +13 -13
- package/server/routes/data/controllers/funcs/getFilterSQL/util/getFilterQuery.js +64 -64
- package/server/routes/data/controllers/funcs/getFilterSQL/util/getOptimizedQuery.js +12 -12
- package/server/routes/data/controllers/funcs/getFilterSQL/util/getTableSql.js +34 -34
- package/server/routes/data/controllers/tableData.js +29 -29
- package/server/routes/data/controllers/tableDataId.js +27 -27
- package/server/routes/data/controllers/tableFilter.js +92 -92
- package/server/routes/data/controllers/tokenInfo.js +9 -9
- package/server/routes/data/controllers/utils/assignTokens.js +30 -30
- package/server/routes/data/controllers/utils/conditions.js +20 -20
- package/server/routes/data/controllers/utils/getColumns.js +8 -8
- package/server/routes/data/index.mjs +20 -20
- package/server/routes/data/schema.js +54 -54
- package/server/routes/menu/controllers/getMenu.js +1 -1
- package/server/routes/menu/index.mjs +5 -5
- package/server/routes/notifications/controllers/readNotifications.js +27 -27
- package/server/routes/notifications/controllers/testEmail.js +35 -35
- package/server/routes/notifications/controllers/userNotifications.js +53 -53
- package/server/routes/notifications/funcs/addNotification.js +21 -21
- package/server/routes/notifications/funcs/sendNotification.js +92 -92
- package/server/routes/notifications/hook/onWidgetSet.js +57 -57
- package/server/routes/notifications/index.mjs +27 -27
- package/server/routes/notifications/schema.js +16 -16
- package/server/routes/print/controllers/cardPrint.js +130 -130
- package/server/routes/properties/controllers/admin.properties.get.js +29 -29
- package/server/routes/properties/controllers/user.properties.get.js +30 -30
- package/server/routes/properties/controllers/user.properties.post.js +30 -30
- package/server/routes/properties/funcs/getSettings.js +56 -56
- package/server/routes/properties/funcs/setSettings.js +44 -44
- package/server/routes/properties/funcs/utils/dataInsert.js +26 -26
- package/server/routes/properties/index.mjs +14 -14
- package/server/routes/properties/schema.js +10 -10
- package/server/routes/root.mjs +3 -3
- package/server/routes/templates/controllers/getTemplate.js +49 -49
- package/server/routes/templates/index.mjs +16 -16
- package/server/routes/templates/schema.js +8 -8
- package/server/routes/user/controllers/user.cls.id.js +14 -14
- package/server/routes/user/controllers/user.cls.js +71 -71
- package/server/routes/user/controllers/user.info.js +17 -17
- package/server/routes/user/schema.js +14 -14
- package/server/routes/widget/controllers/utils/obj2db.js +13 -13
- package/server/routes/widget/controllers/widget.del.js +47 -47
- package/server/routes/widget/controllers/widget.get.js +103 -103
- package/server/routes/widget/controllers/widget.set.js +76 -76
- package/server/routes/widget/index.mjs +11 -11
- package/server/routes/widget/schema.js +12 -12
- package/server/templates/cls/itree.recrzone_category.json +73 -73
- package/server/templates/cls/test.json +9 -9
- package/server/templates/form/admin.user_cls.data.form.json +49 -49
- package/server/templates/form/admin.user_group_rel.form.json +21 -21
- package/server/templates/form/cp_building.form.json +32 -32
- package/server/templates/form/form-user-pass.json +10 -10
- package/server/templates/form/form-user_group.json +39 -39
- package/server/templates/form/form-users.json +156 -156
- package/server/templates/form/user_group_access.form.json +22 -22
- package/server/templates/pt/card-print.pt.hbs +19 -1
- package/server/templates/select/account_id.json +2 -2
- package/server/templates/select/account_id.sql +1 -1
- package/server/templates/table/gis.dataset.table.json +43 -43
- package/server/templates/table/management.user_group.table.json +112 -112
- package/server/templates/table/management.users.table.json +126 -126
- package/utils.js +29 -29
@@ -1,126 +1,126 @@
|
|
1
|
-
import { getMeta, getTemplate, pgClients, handlebarsSync } from '@opengis/fastify-table/utils.js';
|
2
|
-
|
3
|
-
const isValidDate = (dateStr) => (new Date(dateStr)).toString() !== 'Invalid Date';
|
4
|
-
|
5
|
-
export default async function calendarData({
|
6
|
-
pg = pgClients.client, params = {}, query = {}, session = {},
|
7
|
-
}) {
|
8
|
-
const { name } = params;
|
9
|
-
const { granularity = 'month' } = query;
|
10
|
-
const { user = {} } = session.passport || {};
|
11
|
-
|
12
|
-
if (!name) {
|
13
|
-
return { message: 'not enough params: name', status: 400 };
|
14
|
-
}
|
15
|
-
|
16
|
-
if (query.granularity && !['day', 'month', 'week', 'year'].includes(granularity)) {
|
17
|
-
return { message: 'invalid query params: granularity', status: 400 };
|
18
|
-
}
|
19
|
-
|
20
|
-
const body = await getTemplate('calendar', name);
|
21
|
-
|
22
|
-
if (!body) {
|
23
|
-
return { message: `calendar not found: ${name}`, status: 404 };
|
24
|
-
}
|
25
|
-
|
26
|
-
const {
|
27
|
-
title,
|
28
|
-
table,
|
29
|
-
meta = {},
|
30
|
-
} = body || {};
|
31
|
-
|
32
|
-
if (!table) {
|
33
|
-
return { message: 'not enough calendar params: table', status: 404 };
|
34
|
-
}
|
35
|
-
if (!pg.pk?.[table]) {
|
36
|
-
return { message: `table pkey not found: ${table}`, status: 404 };
|
37
|
-
}
|
38
|
-
|
39
|
-
const filterList = (body?.filter || [])
|
40
|
-
.concat(body?.filterInline || [])
|
41
|
-
.concat(body?.filterCustom || [])
|
42
|
-
.concat(body?.filterState || [])
|
43
|
-
.concat(body?.filterList || [])
|
44
|
-
.concat(body?.filters || [])
|
45
|
-
.concat(body?.filter_list || []);
|
46
|
-
|
47
|
-
const { columns = [] } = await getMeta({ pg, table });
|
48
|
-
const columnList = columns?.map((el) => el?.name);
|
49
|
-
|
50
|
-
const dateColumn = columns?.find((el) => el?.name === (meta?.date || meta?.start))?.name
|
51
|
-
|| columns?.find((el) => el?.name === 'cdate')?.name;
|
52
|
-
|
53
|
-
if (query.date && !dateColumn) {
|
54
|
-
return { message: 'invalid template params: date column not found', status: 400 };
|
55
|
-
}
|
56
|
-
|
57
|
-
if (query.date && !isValidDate(query.date)) {
|
58
|
-
return { message: 'Invalid date: out of range or incorrect format', status: 400 };
|
59
|
-
}
|
60
|
-
|
61
|
-
const filterWhere = filterList?.length && query.filter?.length
|
62
|
-
? filterList
|
63
|
-
.filter((el) => (Object.hasOwn(el, 'enabled') ? el?.enabled : true))
|
64
|
-
.map((el) => {
|
65
|
-
const val = query.filter.split(',').find((e) => e?.split('=')?.shift()?.includes(el.column || el.name))?.split('=')?.pop();
|
66
|
-
if (val) return el.column && val ? `(${[`${el.column}::text='${val.replace(/'/g, "''")}'::text`, el.query].filter((el) => el).join(' and ')})` : el.query;
|
67
|
-
})
|
68
|
-
.filter((el) => el)
|
69
|
-
.join(' and ')
|
70
|
-
: undefined;
|
71
|
-
|
72
|
-
const queryWhere = handlebarsSync.compile(body.query || '1=1')({ user, uid: user?.uid });
|
73
|
-
const filterDate = query.date ? `date_trunc('${granularity}', "${dateColumn}"::date)='${query.date}'::date` : undefined;
|
74
|
-
|
75
|
-
const where = [queryWhere, filterDate, filterWhere].filter((el) => el).join(' and ');
|
76
|
-
|
77
|
-
const filtersByColumn = filterList.filter((el) => (Object.hasOwn(el, 'enabled') ? el?.enabled : true) && el?.column);
|
78
|
-
|
79
|
-
const filters = [];
|
80
|
-
if (filtersByColumn?.length) {
|
81
|
-
await Promise.all(filtersByColumn.map(async (el) => {
|
82
|
-
const { rows: filterData = [] } = await pg.query(`select ${el.column.replace(/'/g, "''")} as id, count(*) from ${table}
|
83
|
-
where ${el.query || '1=1'} and ${filterWhere || '1=1'} group by ${el.column.replace(/'/g, "''")}`);
|
84
|
-
if (!filterData?.length) return;
|
85
|
-
|
86
|
-
const clsData = await getTemplate(['cls', 'select'], el.cls);
|
87
|
-
|
88
|
-
if (!el.cls || !clsData?.length) {
|
89
|
-
filterData.forEach((item) => filters.push(item));
|
90
|
-
return;
|
91
|
-
}
|
92
|
-
|
93
|
-
filterData.forEach((filter) => {
|
94
|
-
const cls = clsData.find((item) => item.id === filter.id.toString());
|
95
|
-
Object.assign(filter, { title: cls?.text, color: cls?.color });
|
96
|
-
filters.push(filter);
|
97
|
-
});
|
98
|
-
}));
|
99
|
-
}
|
100
|
-
|
101
|
-
const filtersByPreparedQuery = filterList.filter((el) => (Object.hasOwn(el, 'enabled') ? el?.enabled : true) && !el?.column && el?.query);
|
102
|
-
|
103
|
-
if (filtersByPreparedQuery?.length) {
|
104
|
-
await Promise.all(filtersByPreparedQuery.map(async (el) => {
|
105
|
-
const { rows = [] } = await pg.query(`select ${el.query} as id, count(*) from ${table}
|
106
|
-
where ${filterWhere || '1=1'} group by ${el.query}`);
|
107
|
-
rows.forEach((item) => filters.push(item));
|
108
|
-
}));
|
109
|
-
}
|
110
|
-
|
111
|
-
const metaColumns = Object.keys(meta)
|
112
|
-
.filter((el) => ['date', 'start', 'end', 'title', 'status'].includes(el) && columnList.includes(meta[el]))
|
113
|
-
.map((el) => `"${meta[el]}" as ${el}`);
|
114
|
-
|
115
|
-
if (!metaColumns?.length) {
|
116
|
-
return { message: `calendar param meta is invalid: invalid/empty keys`, status: 404 };
|
117
|
-
}
|
118
|
-
|
119
|
-
const q = `select ${metaColumns.join(',')} from ${table} where ${where}`;
|
120
|
-
if (query?.sql && user?.user_type?.includes('admin')) return q;
|
121
|
-
|
122
|
-
const { rows = [] } = await pg.query(q);
|
123
|
-
|
124
|
-
return { title, filters, granularity, sql: user?.user_type?.includes('admin') ? q : undefined, rows };
|
125
|
-
|
1
|
+
import { getMeta, getTemplate, pgClients, handlebarsSync } from '@opengis/fastify-table/utils.js';
|
2
|
+
|
3
|
+
const isValidDate = (dateStr) => (new Date(dateStr)).toString() !== 'Invalid Date';
|
4
|
+
|
5
|
+
export default async function calendarData({
|
6
|
+
pg = pgClients.client, params = {}, query = {}, session = {},
|
7
|
+
}) {
|
8
|
+
const { name } = params;
|
9
|
+
const { granularity = 'month' } = query;
|
10
|
+
const { user = {} } = session.passport || {};
|
11
|
+
|
12
|
+
if (!name) {
|
13
|
+
return { message: 'not enough params: name', status: 400 };
|
14
|
+
}
|
15
|
+
|
16
|
+
if (query.granularity && !['day', 'month', 'week', 'year'].includes(granularity)) {
|
17
|
+
return { message: 'invalid query params: granularity', status: 400 };
|
18
|
+
}
|
19
|
+
|
20
|
+
const body = await getTemplate('calendar', name);
|
21
|
+
|
22
|
+
if (!body) {
|
23
|
+
return { message: `calendar not found: ${name}`, status: 404 };
|
24
|
+
}
|
25
|
+
|
26
|
+
const {
|
27
|
+
title,
|
28
|
+
table,
|
29
|
+
meta = {},
|
30
|
+
} = body || {};
|
31
|
+
|
32
|
+
if (!table) {
|
33
|
+
return { message: 'not enough calendar params: table', status: 404 };
|
34
|
+
}
|
35
|
+
if (!pg.pk?.[table]) {
|
36
|
+
return { message: `table pkey not found: ${table}`, status: 404 };
|
37
|
+
}
|
38
|
+
|
39
|
+
const filterList = (body?.filter || [])
|
40
|
+
.concat(body?.filterInline || [])
|
41
|
+
.concat(body?.filterCustom || [])
|
42
|
+
.concat(body?.filterState || [])
|
43
|
+
.concat(body?.filterList || [])
|
44
|
+
.concat(body?.filters || [])
|
45
|
+
.concat(body?.filter_list || []);
|
46
|
+
|
47
|
+
const { columns = [] } = await getMeta({ pg, table });
|
48
|
+
const columnList = columns?.map((el) => el?.name);
|
49
|
+
|
50
|
+
const dateColumn = columns?.find((el) => el?.name === (meta?.date || meta?.start))?.name
|
51
|
+
|| columns?.find((el) => el?.name === 'cdate')?.name;
|
52
|
+
|
53
|
+
if (query.date && !dateColumn) {
|
54
|
+
return { message: 'invalid template params: date column not found', status: 400 };
|
55
|
+
}
|
56
|
+
|
57
|
+
if (query.date && !isValidDate(query.date)) {
|
58
|
+
return { message: 'Invalid date: out of range or incorrect format', status: 400 };
|
59
|
+
}
|
60
|
+
|
61
|
+
const filterWhere = filterList?.length && query.filter?.length
|
62
|
+
? filterList
|
63
|
+
.filter((el) => (Object.hasOwn(el, 'enabled') ? el?.enabled : true))
|
64
|
+
.map((el) => {
|
65
|
+
const val = query.filter.split(',').find((e) => e?.split('=')?.shift()?.includes(el.column || el.name))?.split('=')?.pop();
|
66
|
+
if (val) return el.column && val ? `(${[`${el.column}::text='${val.replace(/'/g, "''")}'::text`, el.query].filter((el) => el).join(' and ')})` : el.query;
|
67
|
+
})
|
68
|
+
.filter((el) => el)
|
69
|
+
.join(' and ')
|
70
|
+
: undefined;
|
71
|
+
|
72
|
+
const queryWhere = handlebarsSync.compile(body.query || '1=1')({ user, uid: user?.uid });
|
73
|
+
const filterDate = query.date ? `date_trunc('${granularity}', "${dateColumn}"::date)='${query.date}'::date` : undefined;
|
74
|
+
|
75
|
+
const where = [queryWhere, filterDate, filterWhere].filter((el) => el).join(' and ');
|
76
|
+
|
77
|
+
const filtersByColumn = filterList.filter((el) => (Object.hasOwn(el, 'enabled') ? el?.enabled : true) && el?.column);
|
78
|
+
|
79
|
+
const filters = [];
|
80
|
+
if (filtersByColumn?.length) {
|
81
|
+
await Promise.all(filtersByColumn.map(async (el) => {
|
82
|
+
const { rows: filterData = [] } = await pg.query(`select ${el.column.replace(/'/g, "''")} as id, count(*) from ${table}
|
83
|
+
where ${el.query || '1=1'} and ${filterWhere || '1=1'} group by ${el.column.replace(/'/g, "''")}`);
|
84
|
+
if (!filterData?.length) return;
|
85
|
+
|
86
|
+
const clsData = await getTemplate(['cls', 'select'], el.cls);
|
87
|
+
|
88
|
+
if (!el.cls || !clsData?.length) {
|
89
|
+
filterData.forEach((item) => filters.push(item));
|
90
|
+
return;
|
91
|
+
}
|
92
|
+
|
93
|
+
filterData.forEach((filter) => {
|
94
|
+
const cls = clsData.find((item) => item.id === filter.id.toString());
|
95
|
+
Object.assign(filter, { title: cls?.text, color: cls?.color });
|
96
|
+
filters.push(filter);
|
97
|
+
});
|
98
|
+
}));
|
99
|
+
}
|
100
|
+
|
101
|
+
const filtersByPreparedQuery = filterList.filter((el) => (Object.hasOwn(el, 'enabled') ? el?.enabled : true) && !el?.column && el?.query);
|
102
|
+
|
103
|
+
if (filtersByPreparedQuery?.length) {
|
104
|
+
await Promise.all(filtersByPreparedQuery.map(async (el) => {
|
105
|
+
const { rows = [] } = await pg.query(`select ${el.query} as id, count(*) from ${table}
|
106
|
+
where ${filterWhere || '1=1'} group by ${el.query}`);
|
107
|
+
rows.forEach((item) => filters.push(item));
|
108
|
+
}));
|
109
|
+
}
|
110
|
+
|
111
|
+
const metaColumns = Object.keys(meta)
|
112
|
+
.filter((el) => ['date', 'start', 'end', 'title', 'status'].includes(el) && columnList.includes(meta[el]))
|
113
|
+
.map((el) => `"${meta[el]}" as ${el}`);
|
114
|
+
|
115
|
+
if (!metaColumns?.length) {
|
116
|
+
return { message: `calendar param meta is invalid: invalid/empty keys`, status: 404 };
|
117
|
+
}
|
118
|
+
|
119
|
+
const q = `select ${metaColumns.join(',')} from ${table} where ${where}`;
|
120
|
+
if (query?.sql && user?.user_type?.includes('admin')) return q;
|
121
|
+
|
122
|
+
const { rows = [] } = await pg.query(q);
|
123
|
+
|
124
|
+
return { title, filters, granularity, sql: user?.user_type?.includes('admin') ? q : undefined, rows };
|
125
|
+
|
126
126
|
}
|
@@ -1,7 +1,7 @@
|
|
1
|
-
import calendarData from "./controllers/calendar.data.js";
|
2
|
-
|
3
|
-
import { calendarDataSchema } from './schema.js';
|
4
|
-
|
5
|
-
export default async function route(fastify) {
|
6
|
-
fastify.get('/calendar/:name', { schema: calendarDataSchema }, calendarData);
|
7
|
-
}
|
1
|
+
import calendarData from "./controllers/calendar.data.js";
|
2
|
+
|
3
|
+
import { calendarDataSchema } from './schema.js';
|
4
|
+
|
5
|
+
export default async function route(fastify) {
|
6
|
+
fastify.get('/calendar/:name', { schema: calendarDataSchema }, calendarData);
|
7
|
+
}
|
@@ -1,22 +1,22 @@
|
|
1
|
-
const calendarDataSchema = {
|
2
|
-
params: {
|
3
|
-
name: { type: 'string', pattern: '^([\\d\\w._-]+)$' },
|
4
|
-
},
|
5
|
-
querystring: {
|
6
|
-
date: { type: 'string', pattern: '^\\d{4}-\\d{2}-\\d{2}$' },
|
7
|
-
sql: { type: 'string', pattern: '^(\\d)$' },
|
8
|
-
},
|
9
|
-
|
10
|
-
// query: {
|
11
|
-
// type: 'object',
|
12
|
-
// properties: {
|
13
|
-
// date: {
|
14
|
-
// type: 'string',
|
15
|
-
// format: 'date',
|
16
|
-
// },
|
17
|
-
// },
|
18
|
-
// },
|
19
|
-
};
|
20
|
-
|
21
|
-
export { calendarDataSchema }
|
1
|
+
const calendarDataSchema = {
|
2
|
+
params: {
|
3
|
+
name: { type: 'string', pattern: '^([\\d\\w._-]+)$' },
|
4
|
+
},
|
5
|
+
querystring: {
|
6
|
+
date: { type: 'string', pattern: '^\\d{4}-\\d{2}-\\d{2}$' },
|
7
|
+
sql: { type: 'string', pattern: '^(\\d)$' },
|
8
|
+
},
|
9
|
+
|
10
|
+
// query: {
|
11
|
+
// type: 'object',
|
12
|
+
// properties: {
|
13
|
+
// date: {
|
14
|
+
// type: 'string',
|
15
|
+
// format: 'date',
|
16
|
+
// },
|
17
|
+
// },
|
18
|
+
// },
|
19
|
+
};
|
20
|
+
|
21
|
+
export { calendarDataSchema }
|
22
22
|
export default null;
|
@@ -1,107 +1,107 @@
|
|
1
|
-
import path from 'node:path';
|
2
|
-
|
3
|
-
import { getAccess, handlebars, setOpt, setToken, getTemplate, handlebarsSync, applyHook } from "@opengis/fastify-table/utils.js";
|
4
|
-
//import { setOpt, setToken } from "../../../../../fastify-table/utils.js";
|
5
|
-
// import yaml from 'js-yaml';
|
6
|
-
import getTableData from "./tableData.js";
|
7
|
-
import conditions from './utils/conditions.js';
|
8
|
-
|
9
|
-
export default async function getCardData(req) {
|
10
|
-
|
11
|
-
const {
|
12
|
-
pg, params = {}, session = {}, user
|
13
|
-
} = req;
|
14
|
-
const { table, id } = params;
|
15
|
-
const uid = session.passport?.user?.uid;
|
16
|
-
|
17
|
-
const res = await applyHook('cardData', { table, id, user });
|
18
|
-
if (res) return res;
|
19
|
-
|
20
|
-
|
21
|
-
const time = Date.now();
|
22
|
-
|
23
|
-
const template = await getTemplate('card', table);
|
24
|
-
const access = await getAccess({ table, user });
|
25
|
-
|
26
|
-
const tableTemplate = await getTemplate('table', table);
|
27
|
-
|
28
|
-
const index = template?.find(el => el[0] === 'index.yml')?.[1] || {};
|
29
|
-
|
30
|
-
const { message, rows = [] } = index.table && index.query ? await pg.query(`select * from ${index.table} where ${handlebarsSync.compile(index.query)({ uid, user })}`) :
|
31
|
-
await getTableData({ pg, params: { table, id }, session, user });
|
32
|
-
|
33
|
-
if (message) return { message };
|
34
|
-
|
35
|
-
// conditions
|
36
|
-
index.panels?.filter(el => el.items).forEach(el => {
|
37
|
-
el.items = el.items?.filter(el => conditions(el.conditions, rows[0]));
|
38
|
-
})
|
39
|
-
|
40
|
-
// title, count
|
41
|
-
index.panels?.filter(el => el.items).forEach(async el => {
|
42
|
-
const filtered = el.items.filter(el => el.count?.toLowerCase?.().includes('select'));
|
43
|
-
const data = await Promise.all(filtered.map(el => pg.query(el.count).then(el => el.rows[0] || {})))
|
44
|
-
filtered.forEach((el, i) => {
|
45
|
-
Object.assign(el, data[i] || {}, data[i].count ? {} : { count: undefined })
|
46
|
-
})
|
47
|
-
})
|
48
|
-
|
49
|
-
|
50
|
-
// tokens result
|
51
|
-
const tokens = {};
|
52
|
-
if (access.actions?.includes?.('edit') && index?.tokens && typeof index?.tokens === 'object' && !Array.isArray(index?.tokens)) {
|
53
|
-
for (let key in index?.tokens) {
|
54
|
-
const item = index?.tokens[key];
|
55
|
-
Object.keys(item).filter(el => item[el]?.includes?.('{{')).forEach(el => {
|
56
|
-
item[el] = handlebarsSync.compile(item[el])({ user, uid: user?.uid, id, data: rows[0] });
|
57
|
-
});
|
58
|
-
|
59
|
-
const token = item.form && item.table ? setToken({
|
60
|
-
ids: [JSON.stringify(item)],
|
61
|
-
uid,
|
62
|
-
array: 1,
|
63
|
-
})[0] : setOpt(item, user.uid);
|
64
|
-
tokens[key] = token;
|
65
|
-
}
|
66
|
-
}
|
67
|
-
|
68
|
-
// vue result
|
69
|
-
const vue = template?.filter((el) => el[0].endsWith('.vue'))
|
70
|
-
.reduce((acc, curr) => Object.assign(acc, { [path.parse(curr[0]).name]: curr[1].match(/<template[^>]*>([\s\S]*?)<\/template>/)[1].trim() }), {});
|
71
|
-
|
72
|
-
// data result
|
73
|
-
const data = {};
|
74
|
-
if (index?.data && index?.data?.[0]?.name) {
|
75
|
-
await Promise.all(index.data.filter((el) => el?.name && el?.sql).map(async (el) => {
|
76
|
-
const q = handlebarsSync.compile(el.sql)({ data: rows[0], user, uid: user?.uid, id });
|
77
|
-
const { rows: sqlData } = await pg.query(q);
|
78
|
-
data[el.name] = sqlData;
|
79
|
-
}));
|
80
|
-
}
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
// html result
|
85
|
-
const html = {};
|
86
|
-
if (template) {
|
87
|
-
await Promise.all(template.filter(el => el[0].includes('.hbs')).map(async (el) => {
|
88
|
-
const htmlContent = await handlebars.compile(el[1])({ ...rows[0], user, data, tokens });
|
89
|
-
const name = el[0].substring(0, el[0].lastIndexOf('.'))
|
90
|
-
html[name] = htmlContent;
|
91
|
-
}));
|
92
|
-
}
|
93
|
-
|
94
|
-
return {
|
95
|
-
time: Date.now() - time,
|
96
|
-
...index,
|
97
|
-
tokens,
|
98
|
-
vue,
|
99
|
-
data,
|
100
|
-
html,
|
101
|
-
rows,
|
102
|
-
columns: tableTemplate?.columns || tableTemplate?.colModel,
|
103
|
-
table: undefined,
|
104
|
-
query: undefined,
|
105
|
-
};
|
106
|
-
|
1
|
+
import path from 'node:path';
|
2
|
+
|
3
|
+
import { getAccess, handlebars, setOpt, setToken, getTemplate, handlebarsSync, applyHook } from "@opengis/fastify-table/utils.js";
|
4
|
+
//import { setOpt, setToken } from "../../../../../fastify-table/utils.js";
|
5
|
+
// import yaml from 'js-yaml';
|
6
|
+
import getTableData from "./tableData.js";
|
7
|
+
import conditions from './utils/conditions.js';
|
8
|
+
|
9
|
+
export default async function getCardData(req) {
|
10
|
+
|
11
|
+
const {
|
12
|
+
pg, params = {}, session = {}, user
|
13
|
+
} = req;
|
14
|
+
const { table, id } = params;
|
15
|
+
const uid = session.passport?.user?.uid;
|
16
|
+
|
17
|
+
const res = await applyHook('cardData', { table, id, user });
|
18
|
+
if (res) return res;
|
19
|
+
|
20
|
+
|
21
|
+
const time = Date.now();
|
22
|
+
|
23
|
+
const template = await getTemplate('card', table);
|
24
|
+
const access = await getAccess({ table, user });
|
25
|
+
|
26
|
+
const tableTemplate = await getTemplate('table', table);
|
27
|
+
|
28
|
+
const index = template?.find(el => el[0] === 'index.yml')?.[1] || {};
|
29
|
+
|
30
|
+
const { message, rows = [] } = index.table && index.query ? await pg.query(`select * from ${index.table} where ${handlebarsSync.compile(index.query)({ uid, user })}`) :
|
31
|
+
await getTableData({ pg, params: { table, id }, session, user });
|
32
|
+
|
33
|
+
if (message) return { message };
|
34
|
+
|
35
|
+
// conditions
|
36
|
+
index.panels?.filter(el => el.items).forEach(el => {
|
37
|
+
el.items = el.items?.filter(el => conditions(el.conditions, rows[0]));
|
38
|
+
})
|
39
|
+
|
40
|
+
// title, count
|
41
|
+
index.panels?.filter(el => el.items).forEach(async el => {
|
42
|
+
const filtered = el.items.filter(el => el.count?.toLowerCase?.().includes('select'));
|
43
|
+
const data = await Promise.all(filtered.map(el => pg.query(el.count).then(el => el.rows[0] || {})))
|
44
|
+
filtered.forEach((el, i) => {
|
45
|
+
Object.assign(el, data[i] || {}, data[i].count ? {} : { count: undefined })
|
46
|
+
})
|
47
|
+
})
|
48
|
+
|
49
|
+
|
50
|
+
// tokens result
|
51
|
+
const tokens = {};
|
52
|
+
if (access.actions?.includes?.('edit') && index?.tokens && typeof index?.tokens === 'object' && !Array.isArray(index?.tokens)) {
|
53
|
+
for (let key in index?.tokens) {
|
54
|
+
const item = index?.tokens[key];
|
55
|
+
Object.keys(item).filter(el => item[el]?.includes?.('{{')).forEach(el => {
|
56
|
+
item[el] = handlebarsSync.compile(item[el])({ user, uid: user?.uid, id, data: rows[0] });
|
57
|
+
});
|
58
|
+
|
59
|
+
const token = item.form && item.table ? setToken({
|
60
|
+
ids: [JSON.stringify(item)],
|
61
|
+
uid,
|
62
|
+
array: 1,
|
63
|
+
})[0] : setOpt(item, user.uid);
|
64
|
+
tokens[key] = token;
|
65
|
+
}
|
66
|
+
}
|
67
|
+
|
68
|
+
// vue result
|
69
|
+
const vue = template?.filter((el) => el[0].endsWith('.vue'))
|
70
|
+
.reduce((acc, curr) => Object.assign(acc, { [path.parse(curr[0]).name]: curr[1].match(/<template[^>]*>([\s\S]*?)<\/template>/)[1].trim() }), {});
|
71
|
+
|
72
|
+
// data result
|
73
|
+
const data = {};
|
74
|
+
if (index?.data && index?.data?.[0]?.name) {
|
75
|
+
await Promise.all(index.data.filter((el) => el?.name && el?.sql).map(async (el) => {
|
76
|
+
const q = handlebarsSync.compile(el.sql)({ data: rows[0], user, uid: user?.uid, id });
|
77
|
+
const { rows: sqlData } = await pg.query(q);
|
78
|
+
data[el.name] = sqlData;
|
79
|
+
}));
|
80
|
+
}
|
81
|
+
|
82
|
+
|
83
|
+
|
84
|
+
// html result
|
85
|
+
const html = {};
|
86
|
+
if (template) {
|
87
|
+
await Promise.all(template.filter(el => el[0].includes('.hbs')).map(async (el) => {
|
88
|
+
const htmlContent = await handlebars.compile(el[1])({ ...rows[0], user, data, tokens });
|
89
|
+
const name = el[0].substring(0, el[0].lastIndexOf('.'))
|
90
|
+
html[name] = htmlContent;
|
91
|
+
}));
|
92
|
+
}
|
93
|
+
|
94
|
+
return {
|
95
|
+
time: Date.now() - time,
|
96
|
+
...index,
|
97
|
+
tokens,
|
98
|
+
vue,
|
99
|
+
data,
|
100
|
+
html,
|
101
|
+
rows,
|
102
|
+
columns: tableTemplate?.columns || tableTemplate?.colModel,
|
103
|
+
table: undefined,
|
104
|
+
query: undefined,
|
105
|
+
};
|
106
|
+
|
107
107
|
}
|
@@ -1,50 +1,50 @@
|
|
1
|
-
import { config, handlebars, getToken, getTemplate, getMeta } from "@opengis/fastify-table/utils.js";
|
2
|
-
|
3
|
-
import getTableData from "./tableData.js";
|
4
|
-
|
5
|
-
export default async function cardTabData({
|
6
|
-
pg, query = {}, params = {}, session = {},
|
7
|
-
}) {
|
8
|
-
const { token } = params;
|
9
|
-
const { sql } = query;
|
10
|
-
|
11
|
-
if (!token) {
|
12
|
-
return { message: 'not enough params: token', status: 400 };
|
13
|
-
}
|
14
|
-
|
15
|
-
const time = Date.now();
|
16
|
-
const { uid } = config?.auth?.disable ? { uid: '1' } : (session.passport?.user || {});
|
17
|
-
|
18
|
-
const props = await getToken({
|
19
|
-
token,
|
20
|
-
mode: 'w',
|
21
|
-
uid,
|
22
|
-
json: 1,
|
23
|
-
});
|
24
|
-
|
25
|
-
if (!props || !props?.table || !props) {
|
26
|
-
return { message: { error: 'token is invalid', props }, status: 403 };
|
27
|
-
}
|
28
|
-
|
29
|
-
const tableTemplate = await getTemplate('table', props.table);
|
30
|
-
|
31
|
-
const { columns = [] } = tableTemplate?.columns || tableTemplate?.colModel
|
32
|
-
? { columns: tableTemplate?.columns || tableTemplate?.colModel }
|
33
|
-
: await getMeta({ table: props.table });
|
34
|
-
|
35
|
-
const filter = await handlebars.compile(props.query.replace(/@id/g, '{{id}}'))(props);
|
36
|
-
const { message, rows = [] } = await getTableData({ pg, params: { table: props.table }, session, query: { filter, sql } });
|
37
|
-
if (message) return { message };
|
38
|
-
|
39
|
-
if (props.columns?.length && rows?.length) {
|
40
|
-
const allowList = ['id', 'token'].concat(props.columns).map((el) => [el, `${el}_text`]).flat();
|
41
|
-
rows.forEach((row) => Object.keys(row).forEach((el) => { if (!allowList.includes(el)) delete row[el]; }));
|
42
|
-
|
43
|
-
return {
|
44
|
-
time: Date.now() - time,
|
45
|
-
rows,
|
46
|
-
columns: columns.filter((col) => props.columns.includes(col.name)),
|
47
|
-
};
|
48
|
-
}
|
49
|
-
return { time: Date.now() - time, rows, columns };
|
1
|
+
import { config, handlebars, getToken, getTemplate, getMeta } from "@opengis/fastify-table/utils.js";
|
2
|
+
|
3
|
+
import getTableData from "./tableData.js";
|
4
|
+
|
5
|
+
export default async function cardTabData({
|
6
|
+
pg, query = {}, params = {}, session = {},
|
7
|
+
}) {
|
8
|
+
const { token } = params;
|
9
|
+
const { sql } = query;
|
10
|
+
|
11
|
+
if (!token) {
|
12
|
+
return { message: 'not enough params: token', status: 400 };
|
13
|
+
}
|
14
|
+
|
15
|
+
const time = Date.now();
|
16
|
+
const { uid } = config?.auth?.disable ? { uid: '1' } : (session.passport?.user || {});
|
17
|
+
|
18
|
+
const props = await getToken({
|
19
|
+
token,
|
20
|
+
mode: 'w',
|
21
|
+
uid,
|
22
|
+
json: 1,
|
23
|
+
});
|
24
|
+
|
25
|
+
if (!props || !props?.table || !props) {
|
26
|
+
return { message: { error: 'token is invalid', props }, status: 403 };
|
27
|
+
}
|
28
|
+
|
29
|
+
const tableTemplate = await getTemplate('table', props.table);
|
30
|
+
|
31
|
+
const { columns = [] } = tableTemplate?.columns || tableTemplate?.colModel
|
32
|
+
? { columns: tableTemplate?.columns || tableTemplate?.colModel }
|
33
|
+
: await getMeta({ table: props.table });
|
34
|
+
|
35
|
+
const filter = await handlebars.compile(props.query.replace(/@id/g, '{{id}}'))(props);
|
36
|
+
const { message, rows = [] } = await getTableData({ pg, params: { table: props.table }, session, query: { filter, sql } });
|
37
|
+
if (message) return { message };
|
38
|
+
|
39
|
+
if (props.columns?.length && rows?.length) {
|
40
|
+
const allowList = ['id', 'token'].concat(props.columns).map((el) => [el, `${el}_text`]).flat();
|
41
|
+
rows.forEach((row) => Object.keys(row).forEach((el) => { if (!allowList.includes(el)) delete row[el]; }));
|
42
|
+
|
43
|
+
return {
|
44
|
+
time: Date.now() - time,
|
45
|
+
rows,
|
46
|
+
columns: columns.filter((col) => props.columns.includes(col.name)),
|
47
|
+
};
|
48
|
+
}
|
49
|
+
return { time: Date.now() - time, rows, columns };
|
50
50
|
}
|