@opengis/admin 0.1.53 → 0.1.55
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 +29 -29
- package/config.js +4 -4
- package/dist/{add-page-DxsI9oTt.js → add-page-CWG_sjY-.js} +1 -1
- package/dist/{admin-interface-D1Z9zulm.js → admin-interface-AsFloazv.js} +67 -67
- package/dist/{admin-view-DE_wFOGr.js → admin-view-QbbIb27N.js} +2 -2
- package/dist/admin.js +1 -1
- package/dist/admin.umd.cjs +40 -40
- package/dist/{card-page-BEJ2rFfi.js → card-page-DCoKtnma.js} +22 -22
- package/dist/{card-view-RRo1C2UV.js → card-view-B-tInKRH.js} +1 -1
- package/dist/{edit-page-D4hRn8sR.js → edit-page-BBYenvB9.js} +1 -1
- package/dist/{import-file-CL8r9Pju.js → import-file-YqGiZOb_.js} +20 -13
- package/dist/style.css +1 -1
- package/module/settings/card/admin.roles.table/access.hbs +27 -27
- package/module/settings/card/admin.roles.table/general_info.hbs +16 -16
- package/module/settings/card/admin.roles.table/index.yml +14 -14
- package/module/settings/card/admin.roles.table/users.hbs +27 -27
- package/module/settings/card/admin.routes.table/general_info.hbs +40 -40
- package/module/settings/card/admin.routes.table/index.yml +8 -8
- package/module/settings/card/admin.routes.table/users.hbs +33 -33
- package/module/settings/card/admin.users.table/general_info.hbs +25 -25
- package/module/settings/card/admin.users.table/index.yml +12 -12
- package/module/settings/card/admin.users.table/logs.hbs +30 -30
- package/module/settings/card/admin.users.table/user_roles.hbs +24 -24
- package/module/settings/cls/core.actions.json +13 -13
- 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/form/admin.access.form.json +36 -36
- package/module/settings/form/admin.custom_column.form.json +71 -71
- package/module/settings/form/admin.properties.form.json +15 -15
- package/module/settings/form/admin.roles.form.json +19 -19
- package/module/settings/form/admin.routes.form.json +25 -25
- package/module/settings/form/admin.user_properties.form.json +15 -15
- package/module/settings/form/admin.user_roles.form.json +21 -21
- package/module/settings/form/admin.users.form.json +150 -150
- package/module/settings/form/user.user_roles.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 +50 -50
- package/module/settings/select/core.roles.json +2 -2
- package/module/settings/select/core.routes.sql +1 -1
- package/module/settings/select/core.user_uid.sql +1 -1
- package/module/settings/table/admin.access.table.json +77 -77
- package/module/settings/table/admin.custom_column.table.json +94 -94
- package/module/settings/table/admin.properties.table.json +33 -33
- package/module/settings/table/admin.roles.table.json +58 -58
- package/module/settings/table/admin.routes.table.json +67 -67
- package/module/settings/table/admin.user_properties.table.json +28 -28
- package/module/settings/table/admin.user_roles.table.json +66 -66
- package/module/settings/table/admin.users.table.json +119 -119
- package/package.json +81 -81
- package/plugin.js +162 -162
- package/server/helpers/controllers/badge.js +11 -11
- package/server/helpers/controllers/hb.js +2 -2
- package/server/helpers/controllers/map.js +2 -2
- package/server/helpers/controllers/mls.js +2 -2
- package/server/helpers/controllers/vue.js +2 -2
- package/server/helpers/index.mjs +13 -13
- package/server/plugins/docs.js +28 -28
- package/server/plugins/hook.js +229 -229
- package/server/plugins/vite.js +69 -69
- package/server/routes/calendar/controllers/calendar.data.js +89 -0
- package/server/routes/calendar/index.mjs +17 -0
- package/server/routes/data/controllers/cardData.js +56 -56
- 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 +145 -149
- package/server/routes/data/controllers/tableDataId.js +27 -27
- package/server/routes/data/controllers/tableFilter.js +63 -63
- package/server/routes/data/controllers/utils/assignTokens.js +30 -30
- package/server/routes/data/controllers/utils/getColumns.js +21 -21
- package/server/routes/data/index.mjs +15 -15
- package/server/routes/data/schema.js +7 -7
- package/server/routes/menu/controllers/getMenu.js +34 -35
- package/server/routes/menu/index.mjs +5 -5
- package/server/routes/notifications/controllers/readNotifications.js +30 -30
- package/server/routes/notifications/controllers/userNotifications.js +64 -64
- package/server/routes/notifications/hook/onWidgetSet.js +63 -63
- package/server/routes/notifications/index.mjs +40 -40
- package/server/routes/properties/controllers/admin.properties.get.js +29 -29
- package/server/routes/properties/controllers/user.properties.get.js +34 -34
- 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 +26 -26
- package/server/routes/root.mjs +3 -3
- package/server/routes/templates/controllers/getTemplate.js +16 -16
- package/server/routes/templates/index.mjs +14 -14
- 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/select/account_id.json +2 -2
- 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 +21 -50
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { /* getSelectVal, */ getMeta, getTemplate } from '@opengis/fastify-table/utils.js';
|
|
2
|
+
|
|
3
|
+
export default async function calendarData({
|
|
4
|
+
pg, funcs, params = {}, query = {}, session = {},
|
|
5
|
+
}) {
|
|
6
|
+
const { name } = params;
|
|
7
|
+
const { uid } = session.passport?.user || {};
|
|
8
|
+
if (!name) {
|
|
9
|
+
return { message: 'not enough params: name', status: 400 };
|
|
10
|
+
}
|
|
11
|
+
const { date, sql } = query;
|
|
12
|
+
|
|
13
|
+
try {
|
|
14
|
+
const body = await getTemplate('calendar', name);
|
|
15
|
+
|
|
16
|
+
if (!body) {
|
|
17
|
+
return { message: `calendar not found: ${name}`, status: 404 };
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
const {
|
|
21
|
+
title,
|
|
22
|
+
table,
|
|
23
|
+
query: query1 = '1=1',
|
|
24
|
+
meta = {},
|
|
25
|
+
filter = [],
|
|
26
|
+
} = body;
|
|
27
|
+
|
|
28
|
+
if (!table) {
|
|
29
|
+
return { message: 'not enough calendar params: table', status: 404 };
|
|
30
|
+
}
|
|
31
|
+
if (!pg.pk?.[table]) {
|
|
32
|
+
return { message: `table pkey not found: ${table}`, status: 404 };
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
const filterWhere = filter?.length && query.filter?.length
|
|
36
|
+
? filter.filter((el) => (Object.hasOwn(el, 'enabled') ? el?.enabled : true))
|
|
37
|
+
.map((el) => {
|
|
38
|
+
const val = query.filter.split(',').find((e) => e?.split('=')?.shift()?.includes(el.column || el.name))?.split('=')?.pop();
|
|
39
|
+
if (val) return el.column && val ? `(${[`${el.column}::text='${val.replace(/'/g,"''")}'::text`, el.query].filter((el) => el).join(' and ')})` : el.query;
|
|
40
|
+
}).filter((el) => el).join(' and ')
|
|
41
|
+
: undefined;
|
|
42
|
+
// console.log(filterWhere);
|
|
43
|
+
|
|
44
|
+
const queryWhere = await funcs.handlebars.compile(query1)({ uid });
|
|
45
|
+
const filterDate = date ? `date_trunc('month', "${meta?.date || meta?.start}"::date)='${date}'::date` : undefined;
|
|
46
|
+
const where = [queryWhere, filterDate, filterWhere].filter((el) => el).join(' and ');
|
|
47
|
+
|
|
48
|
+
const filtersByColumn = filter.filter((el) => (Object.hasOwn(el, 'enabled') ? el?.enabled : true) && el?.column);
|
|
49
|
+
|
|
50
|
+
const filters = [];
|
|
51
|
+
if (filtersByColumn?.length) {
|
|
52
|
+
await Promise.all(filtersByColumn.map(async (el) => {
|
|
53
|
+
const { rows: filterData = [] } = await pg.query(`select "${el.column}" as id, count(*) from ${table}
|
|
54
|
+
where ${el.query || '1=1'} and ${filterWhere || '1=1'} group by "${el.column}"`);
|
|
55
|
+
if (!filterData?.length) return;
|
|
56
|
+
|
|
57
|
+
// const clsData = await getSelectVal({ pg, name: el.cls, values: filterData.map((el) => el.id) });
|
|
58
|
+
const clsData = el.cls ? await getTemplate(['cls', 'select'], el.cls) : undefined;
|
|
59
|
+
|
|
60
|
+
if (!el.cls) {
|
|
61
|
+
filterData.forEach((el1) => filters.push(el1));
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
filterData.forEach((el1) => {
|
|
66
|
+
const cls = clsData.find((item) => item.id === el1.id.toString());
|
|
67
|
+
Object.assign(el1, { title: cls?.text, color: cls?.color });
|
|
68
|
+
filters.push(el1);
|
|
69
|
+
});
|
|
70
|
+
}));
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
const tableMeta = await getMeta({ pg, table });
|
|
74
|
+
const columnList = tableMeta?.columns?.map((el) => el?.name);
|
|
75
|
+
const columns = Object.keys(meta).filter((el) => ['date', 'start','end','title','status'].includes(el) && columnList.includes(meta[el])).map((el) => `"${meta[el]}" as ${el}`);
|
|
76
|
+
|
|
77
|
+
if (!columns?.length) {
|
|
78
|
+
return { message: `calendar param meta is invalid: invalid/empty keys`, status: 404 };
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
const q = `select ${columns.join(',')} from ${table} where ${where}`;
|
|
82
|
+
if (sql) return q;
|
|
83
|
+
|
|
84
|
+
const { rows = [] } = await pg.query(q);
|
|
85
|
+
return { title, filters, rows };
|
|
86
|
+
} catch (err) {
|
|
87
|
+
return { error: err.toString(), status: 500 };
|
|
88
|
+
}
|
|
89
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import calendarData from "./controllers/calendar.data.js";
|
|
2
|
+
|
|
3
|
+
const schema = {
|
|
4
|
+
query: {
|
|
5
|
+
type: 'object',
|
|
6
|
+
properties: {
|
|
7
|
+
date: {
|
|
8
|
+
type: 'string',
|
|
9
|
+
format: 'date',
|
|
10
|
+
},
|
|
11
|
+
},
|
|
12
|
+
},
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
export default async function route(fastify) {
|
|
16
|
+
fastify.get('/calendar/:name', { schema }, calendarData);
|
|
17
|
+
}
|
|
@@ -1,57 +1,57 @@
|
|
|
1
|
-
import { setToken, getTemplate } from "@opengis/fastify-table/utils.js";
|
|
2
|
-
// import yaml from 'js-yaml';
|
|
3
|
-
import getTableData from "./tableData.js";
|
|
4
|
-
|
|
5
|
-
export default async function getCardData({
|
|
6
|
-
pg, funcs, params = {}, session = {},
|
|
7
|
-
}) {
|
|
8
|
-
const { table, id } = params;
|
|
9
|
-
const { uid } = session.passport?.user || {};
|
|
10
|
-
|
|
11
|
-
const time = Date.now();
|
|
12
|
-
|
|
13
|
-
const template = await getTemplate('card', table);
|
|
14
|
-
|
|
15
|
-
const tableTemplate = await getTemplate('table', table);
|
|
16
|
-
const index = template?.find(el => el[0] === 'index.yml')?.[1] || {};
|
|
17
|
-
if (index?.panels?.length) {
|
|
18
|
-
index?.panels.filter((el) => el.props || el.items?.find((item) => item.props))?.forEach((panel) => {
|
|
19
|
-
if (panel.props) {
|
|
20
|
-
const editTokens = setToken({
|
|
21
|
-
ids: [JSON.stringify({...panel.props, id })],
|
|
22
|
-
mode: 'w',
|
|
23
|
-
uid: funcs.config?.auth?.disable ? '1' : uid,
|
|
24
|
-
array: 1,
|
|
25
|
-
});
|
|
26
|
-
Object.assign(panel, { token: editTokens[0] });
|
|
27
|
-
}
|
|
28
|
-
if (panel.items?.length) {
|
|
29
|
-
panel.items.filter((item)=> item?.props)?.forEach((item) => {
|
|
30
|
-
const editTokens = setToken({
|
|
31
|
-
ids: [JSON.stringify({...item.props, id })],
|
|
32
|
-
mode: 'w',
|
|
33
|
-
uid: funcs.config?.auth?.disable ? '1' : uid,
|
|
34
|
-
array: 1,
|
|
35
|
-
});
|
|
36
|
-
Object.assign(item, { token: editTokens[0] });
|
|
37
|
-
});
|
|
38
|
-
}
|
|
39
|
-
});
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
const data = {};
|
|
43
|
-
const { message, rows = [] } = await getTableData({ pg, funcs, params: { table, id }, session, mode: 'card' });
|
|
44
|
-
|
|
45
|
-
if (message) return { message };
|
|
46
|
-
|
|
47
|
-
if (template) {
|
|
48
|
-
await Promise.all(template.filter(el => el[0].includes('.hbs')).map(async (el) => {
|
|
49
|
-
const htmlContent = await funcs.handlebars.compile(el[1])(rows[0]);
|
|
50
|
-
const name = el[0].substring(0, el[0].lastIndexOf('.'))
|
|
51
|
-
data[name] = htmlContent;
|
|
52
|
-
}));
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
return { time: Date.now() - time, ...index, data, rows, columns: tableTemplate?.columns || tableTemplate?.colModel };
|
|
56
|
-
|
|
1
|
+
import { setToken, getTemplate } from "@opengis/fastify-table/utils.js";
|
|
2
|
+
// import yaml from 'js-yaml';
|
|
3
|
+
import getTableData from "./tableData.js";
|
|
4
|
+
|
|
5
|
+
export default async function getCardData({
|
|
6
|
+
pg, funcs, params = {}, session = {},
|
|
7
|
+
}) {
|
|
8
|
+
const { table, id } = params;
|
|
9
|
+
const { uid } = session.passport?.user || {};
|
|
10
|
+
|
|
11
|
+
const time = Date.now();
|
|
12
|
+
|
|
13
|
+
const template = await getTemplate('card', table);
|
|
14
|
+
|
|
15
|
+
const tableTemplate = await getTemplate('table', table);
|
|
16
|
+
const index = template?.find(el => el[0] === 'index.yml')?.[1] || {};
|
|
17
|
+
if (index?.panels?.length) {
|
|
18
|
+
index?.panels.filter((el) => el.props || el.items?.find((item) => item.props))?.forEach((panel) => {
|
|
19
|
+
if (panel.props) {
|
|
20
|
+
const editTokens = setToken({
|
|
21
|
+
ids: [JSON.stringify({...panel.props, id })],
|
|
22
|
+
mode: 'w',
|
|
23
|
+
uid: funcs.config?.auth?.disable ? '1' : uid,
|
|
24
|
+
array: 1,
|
|
25
|
+
});
|
|
26
|
+
Object.assign(panel, { token: editTokens[0] });
|
|
27
|
+
}
|
|
28
|
+
if (panel.items?.length) {
|
|
29
|
+
panel.items.filter((item)=> item?.props)?.forEach((item) => {
|
|
30
|
+
const editTokens = setToken({
|
|
31
|
+
ids: [JSON.stringify({...item.props, id })],
|
|
32
|
+
mode: 'w',
|
|
33
|
+
uid: funcs.config?.auth?.disable ? '1' : uid,
|
|
34
|
+
array: 1,
|
|
35
|
+
});
|
|
36
|
+
Object.assign(item, { token: editTokens[0] });
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
const data = {};
|
|
43
|
+
const { message, rows = [] } = await getTableData({ pg, funcs, params: { table, id }, session, mode: 'card' });
|
|
44
|
+
|
|
45
|
+
if (message) return { message };
|
|
46
|
+
|
|
47
|
+
if (template) {
|
|
48
|
+
await Promise.all(template.filter(el => el[0].includes('.hbs')).map(async (el) => {
|
|
49
|
+
const htmlContent = await funcs.handlebars.compile(el[1])(rows[0]);
|
|
50
|
+
const name = el[0].substring(0, el[0].lastIndexOf('.'))
|
|
51
|
+
data[name] = htmlContent;
|
|
52
|
+
}));
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
return { time: Date.now() - time, ...index, data, rows, columns: tableTemplate?.columns || tableTemplate?.colModel };
|
|
56
|
+
|
|
57
57
|
}
|
|
@@ -1,50 +1,50 @@
|
|
|
1
|
-
import { 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, funcs, 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 } = funcs.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 funcs.handlebars.compile(props.query.replace(/@id/g, '{{id}}'))(props);
|
|
36
|
-
const { message, rows = [] } = await getTableData({ pg, funcs, 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 { 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, funcs, 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 } = funcs.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 funcs.handlebars.compile(props.query.replace(/@id/g, '{{id}}'))(props);
|
|
36
|
+
const { message, rows = [] } = await getTableData({ pg, funcs, 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
|
}
|
|
@@ -1,92 +1,92 @@
|
|
|
1
|
-
import { getTemplate } from "@opengis/fastify-table/utils.js";
|
|
2
|
-
// import pgClients from '@opengis/fastify-table/pg/funcs/pgClients.js';
|
|
3
|
-
|
|
4
|
-
import getTableSql from './util/getTableSql.js';
|
|
5
|
-
import getFilterQuery from './util/getFilterQuery.js';
|
|
6
|
-
import getOptimizedQuery from './util/getOptimizedQuery.js';
|
|
7
|
-
|
|
8
|
-
async function getFilterSQL({
|
|
9
|
-
pg: pg1, funcs, table, filter, search, filterList, query, uid,
|
|
10
|
-
}) {
|
|
11
|
-
if (!table) return { error: 'param table is required', status: 400 };
|
|
12
|
-
|
|
13
|
-
const pg = pg1 || funcs.getPG();
|
|
14
|
-
const body = await getTemplate('table', table);
|
|
15
|
-
|
|
16
|
-
const sqlList = body?.sql?.length
|
|
17
|
-
? body?.sql?.filter((el) => !el.disabled && el?.sql?.replace)
|
|
18
|
-
.map((el, i) => {
|
|
19
|
-
Object.assign(el, { name: el.name || `t${i + 1}` });
|
|
20
|
-
return ` left join lateral (${el.filter ? el.sql.replace(/limit 1/ig, '') : el.sql}) as ${el.name} on 1=1 `;
|
|
21
|
-
}).join(' ')
|
|
22
|
-
: '';
|
|
23
|
-
const fieldQuery = `select * from ${body?.table || table} ${sqlList ? ` t ${sqlList}` : ''} where 1=1 limit 0`;
|
|
24
|
-
const { fields = [] } = await pg.query(fieldQuery);
|
|
25
|
-
|
|
26
|
-
const { fields: fieldsModel } = pg.pk[body?.table] ? await pg.query(`select * from ${body.table} limit 0`) : {};
|
|
27
|
-
|
|
28
|
-
const autoSearchColumn = fields?.filter((el) => pg.pgType?.[el.dataTypeID] === 'text')?.map((el) => el.name).join(',');
|
|
29
|
-
const searchColumn = body?.search_column || autoSearchColumn;
|
|
30
|
-
const fieldsList = (fieldsModel || fields)?.map((el) => el.name);
|
|
31
|
-
try {
|
|
32
|
-
const tableSQL = await getTableSql({
|
|
33
|
-
pg, body, table, fields,
|
|
34
|
-
});
|
|
35
|
-
const sval = `ilike '%${decodeURIComponent(search).replace(/'/g, "''")}%'`;
|
|
36
|
-
const searchQuery = search && searchColumn
|
|
37
|
-
? ` (${searchColumn.split(',')?.map((name) => {
|
|
38
|
-
const { pk } = tableSQL.find((el) => el.name === name) || {};
|
|
39
|
-
return pk && !fieldsList.includes(name) ? `${pk} in (select ${pk} from (${fieldQuery})q where ${name} ${sval})` : `${name} ${sval}`;
|
|
40
|
-
}).join(' or ')} )` : '';
|
|
41
|
-
|
|
42
|
-
// table_properties - user filter data
|
|
43
|
-
const { rows: filterProperties = [] } = await pg.query(`select
|
|
44
|
-
|
|
45
|
-
const
|
|
46
|
-
|
|
47
|
-
const filterList1 = await Promise.all((filterList || (body?.filter_list || []).concat(body?.filterInline || []).concat(body?.filterCustom || []).concat(body?.filterState || []).concat(body?.filterList || []).concat(body?.filters || []))
|
|
48
|
-
|
|
49
|
-
?.map(async (el) => {
|
|
50
|
-
if (!el?.data) return el;
|
|
51
|
-
const cls = await getTemplate(['cls', 'select'], el.data);
|
|
52
|
-
if (Array.isArray(cls) && cls?.length) {
|
|
53
|
-
Object.assign(el, { options: cls });
|
|
54
|
-
} else if (typeof (cls?.sql || cls) === 'string') {
|
|
55
|
-
Object.assign(el, { sql: cls?.sql || cls });
|
|
56
|
-
}
|
|
57
|
-
return el;
|
|
58
|
-
})
|
|
59
|
-
);
|
|
60
|
-
const filters = getFilterQuery({
|
|
61
|
-
pg,
|
|
62
|
-
filter,
|
|
63
|
-
table: body?.table || table,
|
|
64
|
-
tableSQL,
|
|
65
|
-
fields,
|
|
66
|
-
filterList: filterList1,
|
|
67
|
-
});
|
|
68
|
-
|
|
69
|
-
// filter
|
|
70
|
-
const filterQuery = filters?.filter((el) => el.query)?.map((el) => `${el.query} `).join(' and ');
|
|
71
|
-
const q = [body?.query, query, searchQuery, filterQuery].filter((el) => el).join(' and ');
|
|
72
|
-
|
|
73
|
-
// table
|
|
74
|
-
const modelQuery = body?.model || body?.table || table;
|
|
75
|
-
const optimizedSQL = `select * from ${getOptimizedQuery({ body, table, q })} `;
|
|
76
|
-
const tableCount = getOptimizedQuery({ body, table, q }, true);
|
|
77
|
-
// console.log(optimizedSQL);
|
|
78
|
-
return {
|
|
79
|
-
filterList,
|
|
80
|
-
q,
|
|
81
|
-
optimizedSQL,
|
|
82
|
-
tableCount,
|
|
83
|
-
table: modelQuery,
|
|
84
|
-
searchQuery,
|
|
85
|
-
};
|
|
86
|
-
}
|
|
87
|
-
catch (err) {
|
|
88
|
-
throw new Error(err.toString());
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
export default getFilterSQL;
|
|
1
|
+
import { getTemplate } from "@opengis/fastify-table/utils.js";
|
|
2
|
+
// import pgClients from '@opengis/fastify-table/pg/funcs/pgClients.js';
|
|
3
|
+
|
|
4
|
+
import getTableSql from './util/getTableSql.js';
|
|
5
|
+
import getFilterQuery from './util/getFilterQuery.js';
|
|
6
|
+
import getOptimizedQuery from './util/getOptimizedQuery.js';
|
|
7
|
+
|
|
8
|
+
async function getFilterSQL({
|
|
9
|
+
pg: pg1, funcs, table, filter, search, filterList, query, uid,
|
|
10
|
+
}) {
|
|
11
|
+
if (!table) return { error: 'param table is required', status: 400 };
|
|
12
|
+
|
|
13
|
+
const pg = pg1 || funcs.getPG();
|
|
14
|
+
const body = await getTemplate('table', table);
|
|
15
|
+
|
|
16
|
+
const sqlList = body?.sql?.length
|
|
17
|
+
? body?.sql?.filter((el) => !el.disabled && el?.sql?.replace)
|
|
18
|
+
.map((el, i) => {
|
|
19
|
+
Object.assign(el, { name: el.name || `t${i + 1}` });
|
|
20
|
+
return ` left join lateral (${el.filter ? el.sql.replace(/limit 1/ig, '') : el.sql}) as ${el.name} on 1=1 `;
|
|
21
|
+
}).join(' ')
|
|
22
|
+
: '';
|
|
23
|
+
const fieldQuery = `select * from ${body?.table || table} ${sqlList ? ` t ${sqlList}` : ''} where 1=1 limit 0`;
|
|
24
|
+
const { fields = [] } = await pg.query(fieldQuery);
|
|
25
|
+
|
|
26
|
+
const { fields: fieldsModel } = pg.pk[body?.table] ? await pg.query(`select * from ${body.table} limit 0`) : {};
|
|
27
|
+
|
|
28
|
+
const autoSearchColumn = fields?.filter((el) => pg.pgType?.[el.dataTypeID] === 'text')?.map((el) => el.name).join(',');
|
|
29
|
+
const searchColumn = body?.search_column || autoSearchColumn;
|
|
30
|
+
const fieldsList = (fieldsModel || fields)?.map((el) => el.name);
|
|
31
|
+
try {
|
|
32
|
+
const tableSQL = await getTableSql({
|
|
33
|
+
pg, body, table, fields,
|
|
34
|
+
});
|
|
35
|
+
const sval = `ilike '%${decodeURIComponent(search).replace(/'/g, "''")}%'`;
|
|
36
|
+
const searchQuery = search && searchColumn
|
|
37
|
+
? ` (${searchColumn.split(',')?.map((name) => {
|
|
38
|
+
const { pk } = tableSQL.find((el) => el.name === name) || {};
|
|
39
|
+
return pk && !fieldsList.includes(name) ? `${pk} in (select ${pk} from (${fieldQuery})q where ${name} ${sval})` : `${name} ${sval}`;
|
|
40
|
+
}).join(' or ')} )` : '';
|
|
41
|
+
|
|
42
|
+
// table_properties - user filter data
|
|
43
|
+
const { rows: filterProperties = [] } = await pg.query(`select column_id, name, title, format, data from admin.custom_column where entity=$1 and uid=$2`, [table, uid]);
|
|
44
|
+
const extraFilters = filterProperties.map((row) => ({ ua: row.title, name: row.name, type: row.format, data: row.data, extra: true }));
|
|
45
|
+
const customFilters = [];
|
|
46
|
+
|
|
47
|
+
const filterList1 = await Promise.all((filterList || (body?.filter_list || []).concat(body?.filterInline || []).concat(body?.filterCustom || []).concat(body?.filterState || []).concat(body?.filterList || []).concat(body?.filters || [])).concat(extraFilters || []).concat(customFilters || [])
|
|
48
|
+
|
|
49
|
+
?.map(async (el) => {
|
|
50
|
+
if (!el?.data) return el;
|
|
51
|
+
const cls = await getTemplate(['cls', 'select'], el.data);
|
|
52
|
+
if (Array.isArray(cls) && cls?.length) {
|
|
53
|
+
Object.assign(el, { options: cls });
|
|
54
|
+
} else if (typeof (cls?.sql || cls) === 'string') {
|
|
55
|
+
Object.assign(el, { sql: cls?.sql || cls });
|
|
56
|
+
}
|
|
57
|
+
return el;
|
|
58
|
+
})
|
|
59
|
+
);
|
|
60
|
+
const filters = getFilterQuery({
|
|
61
|
+
pg,
|
|
62
|
+
filter,
|
|
63
|
+
table: body?.table || table,
|
|
64
|
+
tableSQL,
|
|
65
|
+
fields,
|
|
66
|
+
filterList: filterList1,
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
// filter
|
|
70
|
+
const filterQuery = filters?.filter((el) => el.query)?.map((el) => `${el.query} `).join(' and ');
|
|
71
|
+
const q = [body?.query, query, searchQuery, filterQuery].filter((el) => el).join(' and ');
|
|
72
|
+
|
|
73
|
+
// table
|
|
74
|
+
const modelQuery = body?.model || body?.table || table;
|
|
75
|
+
const optimizedSQL = `select * from ${getOptimizedQuery({ body, table, q })} `;
|
|
76
|
+
const tableCount = getOptimizedQuery({ body, table, q }, true);
|
|
77
|
+
// console.log(optimizedSQL);
|
|
78
|
+
return {
|
|
79
|
+
filterList,
|
|
80
|
+
q,
|
|
81
|
+
optimizedSQL,
|
|
82
|
+
tableCount,
|
|
83
|
+
table: modelQuery,
|
|
84
|
+
searchQuery,
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
catch (err) {
|
|
88
|
+
throw new Error(err.toString());
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
export default getFilterSQL;
|