@opengis/admin 0.1.64 → 0.1.66
Sign up to get free protection for your applications and to get access to all the features.
- package/README.md +29 -29
- package/config.js +4 -4
- package/dist/{add-page-LONm322L.js → add-page-YonHQsF2.js} +1 -1
- package/dist/{admin-interface-eocB4uF3.js → admin-interface-DSR1im5I.js} +67 -65
- package/dist/{admin-view-CEePX3t5.js → admin-view-WZhYBXYw.js} +2 -2
- package/dist/admin.js +1 -1
- package/dist/admin.umd.cjs +46 -46
- package/dist/{card-page-CnQufGpK.js → card-page-BH8lGOKk.js} +2 -2
- package/dist/{card-view-MKU1ijjK.js → card-view-DYhMgpIH.js} +1 -1
- package/dist/{edit-page-C1wXXuPF.js → edit-page-D8fMSwEp.js} +1 -1
- package/dist/{import-file-BkyTVz51.js → import-file-Do-GQQHc.js} +3572 -3603
- 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.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 +80 -80
- package/plugin.js +100 -100
- 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/adminHook.js +165 -165
- package/server/plugins/cron.js +10 -10
- package/server/plugins/docs.js +28 -28
- package/server/plugins/hook.js +185 -194
- package/server/plugins/vite.js +69 -69
- package/server/routes/calendar/controllers/calendar.data.js +88 -88
- package/server/routes/calendar/index.mjs +17 -17
- package/server/routes/data/controllers/cardData.js +57 -57
- 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 +112 -112
- 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 +8 -8
- package/server/routes/data/index.mjs +15 -15
- package/server/routes/data/schema.js +7 -7
- package/server/routes/menu/controllers/getMenu.js +51 -34
- 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 +57 -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 +22 -22
- 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 -21
@@ -1,113 +1,113 @@
|
|
1
|
-
import {
|
2
|
-
applyHook, getMeta, getAccess, getTemplate, metaFormat, getTableColumn,
|
3
|
-
} from "@opengis/fastify-table/utils.js";
|
4
|
-
|
5
|
-
import getFilterSQL from "./funcs/getFilterSQL/index.js";
|
6
|
-
|
7
|
-
import assignTokens from './utils/assignTokens.js';
|
8
|
-
|
9
|
-
import getColumns from './utils/getColumns.js';
|
10
|
-
|
11
|
-
const maxLimit = 100;
|
12
|
-
|
13
|
-
export default async function getTableData(req) {
|
14
|
-
const time = Date.now();
|
15
|
-
|
16
|
-
const {
|
17
|
-
pg, params, funcs = {}, query = {}, opt = {}, session = {},
|
18
|
-
} = req;
|
19
|
-
const { uid } = session.passport?.user || {};
|
20
|
-
|
21
|
-
try {
|
22
|
-
const loadTable = await getTemplate('table', params.table);
|
23
|
-
|
24
|
-
if (!loadTable) {
|
25
|
-
return { message: 'template not found', status: 404 };
|
26
|
-
}
|
27
|
-
|
28
|
-
const {
|
29
|
-
table, sql, form, meta, sqlColumns, ispublic,
|
30
|
-
} = loadTable;
|
31
|
-
const columns = loadTable.columns || loadTable.colModel;
|
32
|
-
|
33
|
-
const { pk, columns: dbColumns = [] } = await getMeta(table);
|
34
|
-
|
35
|
-
if (!pk) {
|
36
|
-
return { message: `table not found: ${table}`, status: 404 };
|
37
|
-
}
|
38
|
-
|
39
|
-
const columnList = dbColumns.map((el) => el.name || el).join(',');
|
40
|
-
const cols = columns.filter((el) => columnList.includes(el?.name) && el?.name !== 'geom').map((el) => el?.name || el).join(',');
|
41
|
-
|
42
|
-
const metaCols = Object.keys(loadTable?.meta?.cls || {}).filter((el) => !cols.includes(el)).length
|
43
|
-
? `,${Object.keys(loadTable?.meta?.cls || {})?.filter((el) => !cols.includes(el)).join(',')}`
|
44
|
-
: '';
|
45
|
-
|
46
|
-
const sqlTable = sql?.filter?.((el) => !el?.disabled && el?.sql?.replace).map((el, i) => ` left join lateral (${el.sql.replace('{{uid}}', uid)}) ${el.name || `t${i}`} on 1=1 `)?.join('') || '';
|
47
|
-
|
48
|
-
if (params.id && columnList.includes(params.id)) {
|
49
|
-
return getTableColumn({
|
50
|
-
pg, funcs, layer: params.table, column: params.id, sql: query.sql,
|
51
|
-
});
|
52
|
-
}
|
53
|
-
|
54
|
-
const fData = query.filter || query.search ? await getFilterSQL({
|
55
|
-
funcs,
|
56
|
-
filter: query.filter,
|
57
|
-
search: query.search,
|
58
|
-
table: params.table,
|
59
|
-
uid,
|
60
|
-
json: 1,
|
61
|
-
}) : {};
|
62
|
-
|
63
|
-
const keyQuery = query.key && loadTable.key && !(opt?.id || params.id) ? `${loadTable.key}=$1` : null;
|
64
|
-
|
65
|
-
const limit = Math.min(maxLimit, +(query.limit || 20));
|
66
|
-
|
67
|
-
const offset = query.page && query.page > 0 ? ` offset ${(query.page - 1) * limit}` : '';
|
68
|
-
// id, query, filter
|
69
|
-
const [orderColumn, orderDir] = (query.order || loadTable.order || '').split(/[- ]/);
|
70
|
-
|
71
|
-
const order = columnList.includes(orderColumn) && orderColumn?.length ? `order by ${orderColumn} ${query.desc || orderDir === 'desc' ? 'desc' : ''}` : '';
|
72
|
-
|
73
|
-
const state = loadTable.filterState && query.state ? loadTable.filterState?.find((el) => el.name === query.state)?.sql : null;
|
74
|
-
|
75
|
-
const custom = loadTable.filterCustom && query.custom ? loadTable.filterCustom?.find((el) => el.name === query.custom)?.sql : null;
|
76
|
-
|
77
|
-
const search = loadTable.meta?.search && query.search ? `(${loadTable.meta?.search.split(',').map(el => `${el} ilike '%${query.search}%'`).join(' or ')})` : null;
|
78
|
-
|
79
|
-
const queryBbox = query?.bbox ? query.bbox.replace(/ /g, ',').split(',')?.map((el) => el - 0) : [];
|
80
|
-
|
81
|
-
const queryPolyline = meta?.bbox && query?.polyline ? `ST_Contains(ST_MakePolygon(ST_LineFromEncodedPolyline('${query?.polyline}')),${meta.bbox})` : undefined;
|
82
|
-
|
83
|
-
const bbox = meta?.bbox && queryBbox.filter((el) => !Number.isNaN(el))?.length === 4 ? `${meta.bbox} && 'box(${queryBbox[0]} ${queryBbox[1]},${queryBbox[2]} ${queryBbox[3]})'::box2d ` : undefined;
|
84
|
-
|
85
|
-
const access = await getAccess(req, params.table);
|
86
|
-
|
87
|
-
const where = [(opt?.id || params.id ? ` "${pk}" = $1` : null), keyQuery, loadTable.query, fData.q, state, custom, search, access?.query || '1=1', bbox, queryPolyline, fData.extraQuery].filter((el) => el);
|
88
|
-
|
89
|
-
const q = `select ${pk ? `"${pk}" as id,` : ''} ${columnList.includes('geom') ? 'st_asgeojson(geom)::json as geom,' : ''} ${query.id || query.key ? '*' : sqlColumns || cols || '*'} ${metaCols} from ${table} t ${sqlTable} where ${where.join(' and ') || 'true'} ${order} ${offset} limit ${limit}`;
|
90
|
-
|
91
|
-
if (query.sql === '1') { return { message: q }; }
|
92
|
-
|
93
|
-
const { rows } = await pg.query(q, (opt?.id || params.id ? [opt?.id || params.id] : null) || (query.key && loadTable.key ? [query.key] : []));
|
94
|
-
|
95
|
-
const total = keyQuery || opt?.id || params.id ? rows.length : await pg.queryCache(`select count(*) from ${table} t ${sqlTable} where ${where.join(' and ') || 'true'}`).then((el) => (el?.rows[0]?.count || 0) - 0);
|
96
|
-
|
97
|
-
|
98
|
-
const res = {
|
99
|
-
time: Date.now() - time, card: loadTable.card, actions: loadTable.actions, access, total, count: rows.length, pk, form, meta, columns,
|
100
|
-
};
|
101
|
-
|
102
|
-
await applyHook('afterTable', {
|
103
|
-
await metaFormat({ funcs, rows, table: params.table });
|
104
|
-
|
105
|
-
|
106
|
-
const addToken = assignTokens({ rows, funcs, ispublic, uid: 1, loadTable });
|
107
|
-
Object.assign(res, { rows, addToken });
|
108
|
-
|
109
|
-
return res;
|
110
|
-
} catch (err) {
|
111
|
-
return { message: err.toString(), status: 500 };
|
112
|
-
}
|
1
|
+
import {
|
2
|
+
applyHook, getMeta, getAccess, getTemplate, metaFormat, getTableColumn,
|
3
|
+
} from "@opengis/fastify-table/utils.js";
|
4
|
+
|
5
|
+
import getFilterSQL from "./funcs/getFilterSQL/index.js";
|
6
|
+
|
7
|
+
import assignTokens from './utils/assignTokens.js';
|
8
|
+
|
9
|
+
import getColumns from './utils/getColumns.js';
|
10
|
+
|
11
|
+
const maxLimit = 100;
|
12
|
+
|
13
|
+
export default async function getTableData(req) {
|
14
|
+
const time = Date.now();
|
15
|
+
|
16
|
+
const {
|
17
|
+
pg, params, funcs = {}, query = {}, opt = {}, session = {},
|
18
|
+
} = req;
|
19
|
+
const { uid } = session.passport?.user || {};
|
20
|
+
|
21
|
+
try {
|
22
|
+
const loadTable = await getTemplate('table', params.table);
|
23
|
+
|
24
|
+
if (!loadTable) {
|
25
|
+
return { message: 'template not found', status: 404 };
|
26
|
+
}
|
27
|
+
|
28
|
+
const {
|
29
|
+
table, sql, form, meta, sqlColumns, ispublic,
|
30
|
+
} = loadTable;
|
31
|
+
const columns = loadTable.columns || loadTable.colModel;
|
32
|
+
|
33
|
+
const { pk, columns: dbColumns = [] } = await getMeta(table);
|
34
|
+
|
35
|
+
if (!pk) {
|
36
|
+
return { message: `table not found: ${table}`, status: 404 };
|
37
|
+
}
|
38
|
+
|
39
|
+
const columnList = dbColumns.map((el) => el.name || el).join(',');
|
40
|
+
const cols = columns.filter((el) => columnList.includes(el?.name) && el?.name !== 'geom').map((el) => el?.name || el).join(',');
|
41
|
+
|
42
|
+
const metaCols = Object.keys(loadTable?.meta?.cls || {}).filter((el) => !cols.includes(el)).length
|
43
|
+
? `,${Object.keys(loadTable?.meta?.cls || {})?.filter((el) => !cols.includes(el)).join(',')}`
|
44
|
+
: '';
|
45
|
+
|
46
|
+
const sqlTable = sql?.filter?.((el) => !el?.disabled && el?.sql?.replace).map((el, i) => ` left join lateral (${el.sql.replace('{{uid}}', uid)}) ${el.name || `t${i}`} on 1=1 `)?.join('') || '';
|
47
|
+
|
48
|
+
if (params.id && columnList.includes(params.id)) {
|
49
|
+
return getTableColumn({
|
50
|
+
pg, funcs, layer: params.table, column: params.id, sql: query.sql,
|
51
|
+
});
|
52
|
+
}
|
53
|
+
|
54
|
+
const fData = query.filter || query.search ? await getFilterSQL({
|
55
|
+
funcs,
|
56
|
+
filter: query.filter,
|
57
|
+
search: query.search,
|
58
|
+
table: params.table,
|
59
|
+
uid,
|
60
|
+
json: 1,
|
61
|
+
}) : {};
|
62
|
+
|
63
|
+
const keyQuery = query.key && loadTable.key && !(opt?.id || params.id) ? `${loadTable.key}=$1` : null;
|
64
|
+
|
65
|
+
const limit = Math.min(maxLimit, +(query.limit || 20));
|
66
|
+
|
67
|
+
const offset = query.page && query.page > 0 ? ` offset ${(query.page - 1) * limit}` : '';
|
68
|
+
// id, query, filter
|
69
|
+
const [orderColumn, orderDir] = (query.order || loadTable.order || '').split(/[- ]/);
|
70
|
+
|
71
|
+
const order = columnList.includes(orderColumn) && orderColumn?.length ? `order by ${orderColumn} ${query.desc || orderDir === 'desc' ? 'desc' : ''}` : '';
|
72
|
+
|
73
|
+
const state = loadTable.filterState && query.state ? loadTable.filterState?.find((el) => el.name === query.state)?.sql : null;
|
74
|
+
|
75
|
+
const custom = loadTable.filterCustom && query.custom ? loadTable.filterCustom?.find((el) => el.name === query.custom)?.sql : null;
|
76
|
+
|
77
|
+
const search = loadTable.meta?.search && query.search ? `(${loadTable.meta?.search.split(',').map(el => `${el} ilike '%${query.search}%'`).join(' or ')})` : null;
|
78
|
+
|
79
|
+
const queryBbox = query?.bbox ? query.bbox.replace(/ /g, ',').split(',')?.map((el) => el - 0) : [];
|
80
|
+
|
81
|
+
const queryPolyline = meta?.bbox && query?.polyline ? `ST_Contains(ST_MakePolygon(ST_LineFromEncodedPolyline('${query?.polyline}')),${meta.bbox})` : undefined;
|
82
|
+
|
83
|
+
const bbox = meta?.bbox && queryBbox.filter((el) => !Number.isNaN(el))?.length === 4 ? `${meta.bbox} && 'box(${queryBbox[0]} ${queryBbox[1]},${queryBbox[2]} ${queryBbox[3]})'::box2d ` : undefined;
|
84
|
+
|
85
|
+
const access = await getAccess(req, params.table);
|
86
|
+
|
87
|
+
const where = [(opt?.id || params.id ? ` "${pk}" = $1` : null), keyQuery, loadTable.query, fData.q, state, custom, search, access?.query || '1=1', bbox, queryPolyline, fData.extraQuery].filter((el) => el);
|
88
|
+
|
89
|
+
const q = `select ${pk ? `"${pk}" as id,` : ''} ${columnList.includes('geom') ? 'st_asgeojson(geom)::json as geom,' : ''} ${query.id || query.key ? '*' : sqlColumns || cols || '*'} ${metaCols} from ${table} t ${sqlTable} where ${where.join(' and ') || 'true'} ${order} ${offset} limit ${limit}`;
|
90
|
+
|
91
|
+
if (query.sql === '1') { return { message: q }; }
|
92
|
+
|
93
|
+
const { rows } = await pg.query(q, (opt?.id || params.id ? [opt?.id || params.id] : null) || (query.key && loadTable.key ? [query.key] : []));
|
94
|
+
|
95
|
+
const total = keyQuery || opt?.id || params.id ? rows.length : await pg.queryCache(`select count(*) from ${table} t ${sqlTable} where ${where.join(' and ') || 'true'}`).then((el) => (el?.rows[0]?.count || 0) - 0);
|
96
|
+
|
97
|
+
|
98
|
+
const res = {
|
99
|
+
time: Date.now() - time, card: loadTable.card, actions: loadTable.actions, access, total, count: rows.length, pk, form, meta, columns,
|
100
|
+
};
|
101
|
+
|
102
|
+
await applyHook('afterTable', { table: params?.table, res, rows, user: session?.passport?.user });
|
103
|
+
await metaFormat({ funcs, rows, table: params.table });
|
104
|
+
|
105
|
+
|
106
|
+
const addToken = assignTokens({ rows, funcs, ispublic, uid: 1, loadTable });
|
107
|
+
Object.assign(res, { rows, addToken });
|
108
|
+
|
109
|
+
return res;
|
110
|
+
} catch (err) {
|
111
|
+
return { message: err.toString(), status: 500 };
|
112
|
+
}
|
113
113
|
}
|
@@ -1,28 +1,28 @@
|
|
1
|
-
import getTemplate from "../../templates/funcs/getTemplate.js";
|
2
|
-
import getTableData from "./tableData.js";
|
3
|
-
|
4
|
-
export default async function tableDataId({
|
5
|
-
pg, funcs, params = {}, session = {},
|
6
|
-
}, reply) {
|
7
|
-
const { name, id } = params;
|
8
|
-
|
9
|
-
const data = await getTemplate('pt', `${name}.pt`);
|
10
|
-
|
11
|
-
|
12
|
-
if (!data) {
|
13
|
-
return { message: `invalid template: ${name}.pt`, status: 400 };
|
14
|
-
}
|
15
|
-
|
16
|
-
const { message, status = 500, rows = [] } = await getTableData({ pg, params: { name, id }, session });
|
17
|
-
if (message) {
|
18
|
-
return { message, status };
|
19
|
-
}
|
20
|
-
|
21
|
-
if (!rows.length) {
|
22
|
-
return { message: `data not found: ${name}/${id}`, status: 404 };
|
23
|
-
}
|
24
|
-
|
25
|
-
const htmlContent = await funcs.handlebars.compile(data)(rows[0]);
|
26
|
-
|
27
|
-
return reply.headers({ 'Content-Type': 'text/html; charset=utf-8' }).send(htmlContent);
|
1
|
+
import getTemplate from "../../templates/funcs/getTemplate.js";
|
2
|
+
import getTableData from "./tableData.js";
|
3
|
+
|
4
|
+
export default async function tableDataId({
|
5
|
+
pg, funcs, params = {}, session = {},
|
6
|
+
}, reply) {
|
7
|
+
const { name, id } = params;
|
8
|
+
|
9
|
+
const data = await getTemplate('pt', `${name}.pt`);
|
10
|
+
|
11
|
+
|
12
|
+
if (!data) {
|
13
|
+
return { message: `invalid template: ${name}.pt`, status: 400 };
|
14
|
+
}
|
15
|
+
|
16
|
+
const { message, status = 500, rows = [] } = await getTableData({ pg, params: { name, id }, session });
|
17
|
+
if (message) {
|
18
|
+
return { message, status };
|
19
|
+
}
|
20
|
+
|
21
|
+
if (!rows.length) {
|
22
|
+
return { message: `data not found: ${name}/${id}`, status: 404 };
|
23
|
+
}
|
24
|
+
|
25
|
+
const htmlContent = await funcs.handlebars.compile(data)(rows[0]);
|
26
|
+
|
27
|
+
return reply.headers({ 'Content-Type': 'text/html; charset=utf-8' }).send(htmlContent);
|
28
28
|
}
|
@@ -1,64 +1,64 @@
|
|
1
|
-
import { getTemplate } from "@opengis/fastify-table/utils.js";
|
2
|
-
|
3
|
-
export default async function tableFilter(req) {
|
4
|
-
const time = Date.now();
|
5
|
-
const { pg, funcs = {}, params = {}, session = {} } = req;
|
6
|
-
const { uid } = session.passport?.user || {};
|
7
|
-
|
8
|
-
if (!params.name) {
|
9
|
-
return { message: 'not enouggh params: name', status: 400 };
|
10
|
-
}
|
11
|
-
|
12
|
-
const loadTable = await getTemplate('table', params.name);
|
13
|
-
|
14
|
-
if (!loadTable) {
|
15
|
-
return { message: 'table not found', status: 404 };
|
16
|
-
}
|
17
|
-
|
18
|
-
const { columns = [] } = await funcs.getMeta({ table: loadTable.table });
|
19
|
-
|
20
|
-
const filters = loadTable?.filter_list || loadTable?.filters || loadTable?.filterList || [];
|
21
|
-
filters.forEach(el => {
|
22
|
-
Object.assign(el, { id: el.name || el.id, name: el.name || el.id });
|
23
|
-
});
|
24
|
-
|
25
|
-
// admin.custom_column - user filter
|
26
|
-
const { rows: properties = [] } = await pg.query(`select column_id, name, title, format, data from admin.custom_column where entity=$1 and uid=$2 and filter`, [params.name, uid]);
|
27
|
-
properties.forEach((row) => filters.push({ id: row.name, name: row.name, ua: row.title, type: row.format, data: row.data }));
|
28
|
-
|
29
|
-
await Promise.all(filters.filter((el) => el.data).map(async (el) => {
|
30
|
-
|
31
|
-
const cls = await getTemplate(['cls', 'select'], el.data);
|
32
|
-
const name = el.name || el.id;
|
33
|
-
|
34
|
-
if (!cls?.length || !Array.isArray(cls) || !loadTable.table || !name) return;
|
35
|
-
const { dataTypeID } = columns.find((item) => item?.name === name) || {};
|
36
|
-
if (el.extra && el.type === 'select' && Array.isArray(cls)) {
|
37
|
-
const countArr = await pg.query(`select value_text as id, count(*) from crm.extra_data where property_key='${name}' and property_entity='${params.name}' group by value_text`);
|
38
|
-
const options = countArr.rows.map(cel => {
|
39
|
-
const data = cls.find(c => c.id === cel.id);
|
40
|
-
return { ...cel, ...data };
|
41
|
-
});
|
42
|
-
Object.assign(el, { options });
|
43
|
-
}
|
44
|
-
if (!dataTypeID) return;
|
45
|
-
|
46
|
-
const countArr = pg.pgType?.[dataTypeID]?.includes('[]')
|
47
|
-
? await pg.queryCache(`select unnest(${name})::text as id,count(*) from ${loadTable.table} group by unnest(${name})`)
|
48
|
-
: await pg.queryCache(`select ${name}::text as id,count(*) from ${loadTable.table} group by ${name}`);
|
49
|
-
|
50
|
-
const options = countArr.rows.map(cel => {
|
51
|
-
const data = cls.find(c => c.id === cel.id);
|
52
|
-
return { ...cel, ...data };
|
53
|
-
});
|
54
|
-
Object.assign(el, { options });
|
55
|
-
}));
|
56
|
-
|
57
|
-
return {
|
58
|
-
time: Date.now() - time,
|
59
|
-
list: filters,
|
60
|
-
custom: loadTable?.filterCustom?.map(el => ({ label: el.label })),
|
61
|
-
inline: loadTable?.filterInline,
|
62
|
-
state: loadTable?.filterState?.map(el => ({ label: el.label })),
|
63
|
-
};
|
1
|
+
import { getTemplate } from "@opengis/fastify-table/utils.js";
|
2
|
+
|
3
|
+
export default async function tableFilter(req) {
|
4
|
+
const time = Date.now();
|
5
|
+
const { pg, funcs = {}, params = {}, session = {} } = req;
|
6
|
+
const { uid } = session.passport?.user || {};
|
7
|
+
|
8
|
+
if (!params.name) {
|
9
|
+
return { message: 'not enouggh params: name', status: 400 };
|
10
|
+
}
|
11
|
+
|
12
|
+
const loadTable = await getTemplate('table', params.name);
|
13
|
+
|
14
|
+
if (!loadTable) {
|
15
|
+
return { message: 'table not found', status: 404 };
|
16
|
+
}
|
17
|
+
|
18
|
+
const { columns = [] } = await funcs.getMeta({ table: loadTable.table });
|
19
|
+
|
20
|
+
const filters = loadTable?.filter_list || loadTable?.filters || loadTable?.filterList || [];
|
21
|
+
filters.forEach(el => {
|
22
|
+
Object.assign(el, { id: el.name || el.id, name: el.name || el.id });
|
23
|
+
});
|
24
|
+
|
25
|
+
// admin.custom_column - user filter
|
26
|
+
const { rows: properties = [] } = await pg.query(`select column_id, name, title, format, data from admin.custom_column where entity=$1 and uid=$2 and filter`, [params.name, uid]);
|
27
|
+
properties.forEach((row) => filters.push({ id: row.name, name: row.name, ua: row.title, type: row.format, data: row.data }));
|
28
|
+
|
29
|
+
await Promise.all(filters.filter((el) => el.data).map(async (el) => {
|
30
|
+
|
31
|
+
const cls = await getTemplate(['cls', 'select'], el.data);
|
32
|
+
const name = el.name || el.id;
|
33
|
+
|
34
|
+
if (!cls?.length || !Array.isArray(cls) || !loadTable.table || !name) return;
|
35
|
+
const { dataTypeID } = columns.find((item) => item?.name === name) || {};
|
36
|
+
if (el.extra && el.type === 'select' && Array.isArray(cls)) {
|
37
|
+
const countArr = await pg.query(`select value_text as id, count(*) from crm.extra_data where property_key='${name}' and property_entity='${params.name}' group by value_text`);
|
38
|
+
const options = countArr.rows.map(cel => {
|
39
|
+
const data = cls.find(c => c.id === cel.id);
|
40
|
+
return { ...cel, ...data };
|
41
|
+
});
|
42
|
+
Object.assign(el, { options });
|
43
|
+
}
|
44
|
+
if (!dataTypeID) return;
|
45
|
+
|
46
|
+
const countArr = pg.pgType?.[dataTypeID]?.includes('[]')
|
47
|
+
? await pg.queryCache(`select unnest(${name})::text as id,count(*) from ${loadTable.table} group by unnest(${name})`)
|
48
|
+
: await pg.queryCache(`select ${name}::text as id,count(*) from ${loadTable.table} group by ${name}`);
|
49
|
+
|
50
|
+
const options = countArr.rows.map(cel => {
|
51
|
+
const data = cls.find(c => c.id === cel.id);
|
52
|
+
return { ...cel, ...data };
|
53
|
+
});
|
54
|
+
Object.assign(el, { options });
|
55
|
+
}));
|
56
|
+
|
57
|
+
return {
|
58
|
+
time: Date.now() - time,
|
59
|
+
list: filters,
|
60
|
+
custom: loadTable?.filterCustom?.map(el => ({ label: el.label })),
|
61
|
+
inline: loadTable?.filterInline,
|
62
|
+
state: loadTable?.filterState?.map(el => ({ label: el.label })),
|
63
|
+
};
|
64
64
|
}
|
@@ -1,31 +1,31 @@
|
|
1
|
-
import setToken from "@opengis/fastify-table/crud/funcs/setToken.js";
|
2
|
-
|
3
|
-
export default function assignTokens({
|
4
|
-
rows = [], funcs = {}, ispublic, uid, loadTable = {},
|
5
|
-
}) {
|
6
|
-
if (funcs.config?.security?.disableToken) return;
|
7
|
-
|
8
|
-
if (!funcs.config?.auth?.disable && !ispublic && !uid) throw new Error('empty user');
|
9
|
-
if (!loadTable?.table || !(loadTable?.form || loadTable?.add_form)) return null;
|
10
|
-
|
11
|
-
const form = loadTable?.form || loadTable?.add_form;
|
12
|
-
const addTokens = setToken({
|
13
|
-
ids: [JSON.stringify({ add: loadTable.table, form })],
|
14
|
-
mode: 'a',
|
15
|
-
uid: funcs.config?.auth?.disable || ispublic ? '1' : uid,
|
16
|
-
array: 1,
|
17
|
-
});
|
18
|
-
if (!rows.length) return addTokens[0];
|
19
|
-
|
20
|
-
rows.forEach((row) => {
|
21
|
-
const editTokens = setToken({
|
22
|
-
ids: [JSON.stringify({ id: row.id, table: loadTable.table, form })],
|
23
|
-
mode: 'w',
|
24
|
-
uid: funcs.config?.auth?.disable || ispublic ? '1' : uid,
|
25
|
-
array: 1,
|
26
|
-
});
|
27
|
-
Object.assign(row, { token: editTokens[0] });
|
28
|
-
});
|
29
|
-
return addTokens[0];
|
30
|
-
|
1
|
+
import setToken from "@opengis/fastify-table/crud/funcs/setToken.js";
|
2
|
+
|
3
|
+
export default function assignTokens({
|
4
|
+
rows = [], funcs = {}, ispublic, uid, loadTable = {},
|
5
|
+
}) {
|
6
|
+
if (funcs.config?.security?.disableToken) return;
|
7
|
+
|
8
|
+
if (!funcs.config?.auth?.disable && !ispublic && !uid) throw new Error('empty user');
|
9
|
+
if (!loadTable?.table || !(loadTable?.form || loadTable?.add_form)) return null;
|
10
|
+
|
11
|
+
const form = loadTable?.form || loadTable?.add_form;
|
12
|
+
const addTokens = setToken({
|
13
|
+
ids: [JSON.stringify({ add: loadTable.table, form })],
|
14
|
+
mode: 'a',
|
15
|
+
uid: funcs.config?.auth?.disable || ispublic ? '1' : uid,
|
16
|
+
array: 1,
|
17
|
+
});
|
18
|
+
if (!rows.length) return addTokens[0];
|
19
|
+
|
20
|
+
rows.forEach((row) => {
|
21
|
+
const editTokens = setToken({
|
22
|
+
ids: [JSON.stringify({ id: row.id, table: loadTable.table, form })],
|
23
|
+
mode: 'w',
|
24
|
+
uid: funcs.config?.auth?.disable || ispublic ? '1' : uid,
|
25
|
+
array: 1,
|
26
|
+
});
|
27
|
+
Object.assign(row, { token: editTokens[0] });
|
28
|
+
});
|
29
|
+
return addTokens[0];
|
30
|
+
|
31
31
|
}
|
@@ -1,9 +1,9 @@
|
|
1
|
-
import { getTemplate } from "@opengis/fastify-table/utils.js";
|
2
|
-
|
3
|
-
export default async function getColumns({
|
4
|
-
columns = [], params = {}, opt = {}, loadTable = {}, form, table, dbColumns = [], mode = 'table',
|
5
|
-
}) {
|
6
|
-
const columnList = dbColumns.map((el) => el.name || el).join(',');
|
7
|
-
const cols = columns.filter((el) => columnList.includes(el?.name) && el?.name !== 'geom').map((el) => el?.name || el).join(',');
|
8
|
-
return { cols, columnList };
|
1
|
+
import { getTemplate } from "@opengis/fastify-table/utils.js";
|
2
|
+
|
3
|
+
export default async function getColumns({
|
4
|
+
columns = [], params = {}, opt = {}, loadTable = {}, form, table, dbColumns = [], mode = 'table',
|
5
|
+
}) {
|
6
|
+
const columnList = dbColumns.map((el) => el.name || el).join(',');
|
7
|
+
const cols = columns.filter((el) => columnList.includes(el?.name) && el?.name !== 'geom').map((el) => el?.name || el).join(',');
|
8
|
+
return { cols, columnList };
|
9
9
|
}
|
@@ -1,15 +1,15 @@
|
|
1
|
-
|
2
|
-
import tableData from "./controllers/tableData.js";
|
3
|
-
// import tableDataId from "./controllers/tableDataId.js";
|
4
|
-
import cardData from "./controllers/cardData.js";
|
5
|
-
import cardTabData from './controllers/cardTabData.js';
|
6
|
-
import tableFilter from "./controllers/tableFilter.js";
|
7
|
-
|
8
|
-
import { tableDataSchema } from './schema.js';
|
9
|
-
|
10
|
-
export default async function route(fastify) {
|
11
|
-
fastify.get(`/table-data/:table`, { schema: tableDataSchema }, tableData);
|
12
|
-
fastify.get(`/card-data/:token`, cardTabData);
|
13
|
-
fastify.get(`/table-data/:table/:id`, cardData);
|
14
|
-
fastify.get(`/table-filter/:name`, tableFilter);
|
15
|
-
}
|
1
|
+
|
2
|
+
import tableData from "./controllers/tableData.js";
|
3
|
+
// import tableDataId from "./controllers/tableDataId.js";
|
4
|
+
import cardData from "./controllers/cardData.js";
|
5
|
+
import cardTabData from './controllers/cardTabData.js';
|
6
|
+
import tableFilter from "./controllers/tableFilter.js";
|
7
|
+
|
8
|
+
import { tableDataSchema } from './schema.js';
|
9
|
+
|
10
|
+
export default async function route(fastify) {
|
11
|
+
fastify.get(`/table-data/:table`, { schema: tableDataSchema }, tableData);
|
12
|
+
fastify.get(`/card-data/:token`, cardTabData);
|
13
|
+
fastify.get(`/table-data/:table/:id`, cardData);
|
14
|
+
fastify.get(`/table-filter/:name`, tableFilter);
|
15
|
+
}
|
@@ -1,7 +1,7 @@
|
|
1
|
-
const tableDataSchema = {
|
2
|
-
querystring: {
|
3
|
-
limit: { type: 'integer' },
|
4
|
-
}
|
5
|
-
};
|
6
|
-
export { tableDataSchema }
|
7
|
-
export default null;
|
1
|
+
const tableDataSchema = {
|
2
|
+
querystring: {
|
3
|
+
limit: { type: 'integer' },
|
4
|
+
}
|
5
|
+
};
|
6
|
+
export { tableDataSchema }
|
7
|
+
export default null;
|
@@ -1,35 +1,52 @@
|
|
1
|
-
|
2
|
-
import { join } from 'path';
|
3
|
-
import { userTemplateDir } from '@opengis/fastify-table/utils.js';
|
4
|
-
|
5
|
-
import { existsSync, readdirSync, readFileSync } from 'fs';
|
6
|
-
const menuCache = [];
|
7
|
-
// check module dir
|
8
|
-
const moduleDir = join(process.cwd(), 'module');
|
9
|
-
const dirs = existsSync(moduleDir) ?
|
10
|
-
readdirSync(moduleDir).map(el => join(moduleDir, el)) : [];
|
11
|
-
|
12
|
-
// all menu files module + user
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
const isProduction = process.env.NODE_ENV === 'production';
|
17
|
-
// readMenu();
|
18
|
-
|
19
|
-
async function readMenu() {
|
20
|
-
const menuList = dirs.concat(userTemplateDir)
|
21
|
-
.map(el => join(el, 'menu.json'))
|
22
|
-
.filter(el => existsSync(el))
|
23
|
-
// const list = menuList.map(el => readFileSync(el, 'utf-8')); // sync
|
24
|
-
const list = await Promise.all(menuList.map(el => readFileSync(el, 'utf-8'))); // sync
|
25
|
-
const menus = list.reduce((p, el) => p.concat(JSON.parse(el)), [])
|
26
|
-
.map(el => ({ order: 0, ...el }))
|
27
|
-
.sort((a, b) => (a.order > b.order) ? 1 : ((b.order > a.order) ? -1 : 0))
|
28
|
-
|
29
|
-
if (!menuCache.length) menus.forEach(el => menuCache.push(el))
|
30
|
-
return menus;
|
31
|
-
}
|
32
|
-
export default async function adminMenu() {
|
33
|
-
const menus = isProduction && menuCache.length ? menuCache : await readMenu();
|
34
|
-
|
1
|
+
|
2
|
+
import { join } from 'path';
|
3
|
+
import { userTemplateDir, config, getAccess } from '@opengis/fastify-table/utils.js';
|
4
|
+
|
5
|
+
import { existsSync, readdirSync, readFileSync } from 'fs';
|
6
|
+
const menuCache = [];
|
7
|
+
// check module dir
|
8
|
+
const moduleDir = join(process.cwd(), 'module');
|
9
|
+
const dirs = existsSync(moduleDir) ?
|
10
|
+
readdirSync(moduleDir).map(el => join(moduleDir, el)) : [];
|
11
|
+
|
12
|
+
// all menu files module + user
|
13
|
+
|
14
|
+
|
15
|
+
|
16
|
+
const isProduction = process.env.NODE_ENV === 'production';
|
17
|
+
// readMenu();
|
18
|
+
|
19
|
+
async function readMenu() {
|
20
|
+
const menuList = dirs.concat(userTemplateDir)
|
21
|
+
.map(el => join(el, 'menu.json'))
|
22
|
+
.filter(el => existsSync(el))
|
23
|
+
// const list = menuList.map(el => readFileSync(el, 'utf-8')); // sync
|
24
|
+
const list = await Promise.all(menuList.map(el => readFileSync(el, 'utf-8'))); // sync
|
25
|
+
const menus = list.reduce((p, el) => p.concat(JSON.parse(el)), [])
|
26
|
+
.map(el => ({ order: 0, ...el }))
|
27
|
+
.sort((a, b) => (a.order > b.order) ? 1 : ((b.order > a.order) ? -1 : 0))
|
28
|
+
|
29
|
+
if (!menuCache.length) menus.forEach(el => menuCache.push(el))
|
30
|
+
return menus;
|
31
|
+
}
|
32
|
+
export default async function adminMenu(req) {
|
33
|
+
const menus = isProduction && menuCache.length ? menuCache : await readMenu();
|
34
|
+
if (req) {
|
35
|
+
const user = req?.session?.passport?.user || {};
|
36
|
+
const userMenu = await Promise.all(menus.map(async (menu) => {
|
37
|
+
if (menu?.menu?.length) {
|
38
|
+
const submenu = await Promise.all(menu.menu?.map(async (submenu) => {
|
39
|
+
const access = await getAccess({ table: submenu?.table, user });
|
40
|
+
return { ...submenu, access };
|
41
|
+
}));
|
42
|
+
return { ...menu, menu: submenu.filter((e) => e?.access), access: submenu.filter((e) => e?.access?.actions?.includes('get'))?.length };
|
43
|
+
} else if (menu?.table) {
|
44
|
+
const access = await getAccess({ table: menu?.table, user });
|
45
|
+
return { ...menu, access };
|
46
|
+
}
|
47
|
+
return menu;
|
48
|
+
}));
|
49
|
+
return userMenu.filter((e) => e?.access)?.map((e) => ({ ...e, menu: e?.menu ? e?.menu?.filter((el) => el?.access?.actions?.includes('get')) : undefined }));
|
50
|
+
}
|
51
|
+
return menus;
|
35
52
|
}
|
@@ -1,5 +1,5 @@
|
|
1
|
-
import getMenu from './controllers/getMenu.js';
|
2
|
-
|
3
|
-
export default async function (fastify, opts) {
|
4
|
-
fastify.get(`/user-menu`, getMenu);
|
5
|
-
}
|
1
|
+
import getMenu from './controllers/getMenu.js';
|
2
|
+
|
3
|
+
export default async function (fastify, opts) {
|
4
|
+
fastify.get(`/user-menu`, getMenu);
|
5
|
+
}
|