@opengis/admin 0.3.106 → 0.3.109
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-mpXXLEuf.js → add-page-DELwNBs9.js} +4 -4
- package/dist/{admin-interface-C4iRix-U.js → admin-interface-ChLQ5JCd.js} +13 -13
- package/dist/{admin-view-Bzb14Z1a.js → admin-view-DnD5gBsl.js} +6 -6
- package/dist/admin.js +1 -1
- package/dist/admin.umd.cjs +76 -76
- package/dist/assets/logo.svg +41 -41
- package/dist/{card-view-C7Qpg_zt.js → card-view-Cb3j5eXY.js} +3 -3
- package/dist/{edit-page-8o4I7nX6.js → edit-page-DGjs4jeh.js} +8 -8
- package/dist/{import-file-DcMkaBsX.js → import-file-DIAYCDNH.js} +17021 -17143
- package/dist/{profile-page-D5Vy_Za-.js → profile-page-CaQqFoqe.js} +4 -4
- 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/users.hbs +16 -16
- 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/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.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/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.user_properties.table.json +34 -34
- package/package.json +3 -3
- package/server/helpers/core/coalesce.js +7 -7
- package/server/helpers/core/select.js +48 -48
- package/server/helpers/core/token.js +18 -18
- package/server/helpers/list/buttonHelper.js +21 -21
- 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/helpers/utils/mdToHTML.js +17 -17
- 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/routes/access/controllers/access.group.js +29 -29
- package/server/routes/access/controllers/access.group.post.js +54 -54
- 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/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/tableDataId.js +27 -27
- 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/notifications/controllers/readNotifications.js +18 -18
- package/server/routes/notifications/controllers/testEmail.js +35 -35
- package/server/routes/notifications/controllers/userNotifications.js +53 -53
- package/server/routes/notifications/hook/onWidgetSet.js +56 -56
- package/server/routes/notifications/index.mjs +26 -26
- package/server/routes/notifications/schema.js +16 -16
- package/server/routes/properties/schema.js +10 -10
- package/server/routes/report/controllers/list.js +23 -21
- package/server/routes/report/controllers/tableData.js +46 -17
- package/server/routes/report/controllers/widgetData.js +34 -31
- package/server/routes/report/index.mjs +9 -9
- package/server/routes/report/utils/formatValue.js +179 -179
- package/server/routes/report/utils/getFilterQuery.js +10 -9
- package/server/routes/root.mjs +3 -3
- package/server/routes/templates/controllers/getTemplate.js +44 -44
- 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 +72 -72
- package/server/routes/user/controllers/user.info.js +17 -17
- package/server/routes/user/schema.js +14 -14
- package/server/routes/util/controllers/code.generator.js +89 -89
- package/server/routes/widget/controllers/widget.del.js +80 -80
- package/server/routes/widget/controllers/widget.set.js +101 -101
- package/server/routes/widget/hook/onWidgetSet.js +12 -12
- package/server/routes/widget/index.mjs +20 -20
- 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/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/server/utils/addNotification.js +21 -21
- package/server/utils/sendNotification.js +89 -89
@@ -1,26 +1,26 @@
|
|
1
|
-
import { addHook } from '@opengis/fastify-table/utils.js';
|
2
|
-
|
3
|
-
// api
|
4
|
-
import testEmail from './controllers/testEmail.js';
|
5
|
-
import readNotifications from './controllers/readNotifications.js'; // mark as read
|
6
|
-
import userNotifications from './controllers/userNotifications.js'; // check all, backend pagination
|
7
|
-
|
8
|
-
// hook
|
9
|
-
import onWidgetSet from './hook/onWidgetSet.js'; // send notification on comment
|
10
|
-
|
11
|
-
// funcs
|
12
|
-
// import addNotification from '../notifications/funcs/addNotification.js'; // add to db
|
13
|
-
// import notification from '../notifications/funcs/sendNotification.js'; // send notification
|
14
|
-
|
15
|
-
import { notificationSchema, emailSchema } from './schema.js';
|
16
|
-
|
17
|
-
export default async function route(fastify) {
|
18
|
-
|
19
|
-
// fastify.decorate('addNotification', addNotification);
|
20
|
-
// fastify.decorate('notification', notification);
|
21
|
-
|
22
|
-
fastify.get('/test-email', { config: { policy: ['user'] }, schema: emailSchema }, testEmail);
|
23
|
-
fastify.get('/notification', { config: { policy: ['user'] }, schema: notificationSchema }, userNotifications);
|
24
|
-
fastify.get('/notification-read/:id?', { config: { policy: ['user'] }, schema: notificationSchema }, readNotifications);
|
25
|
-
addHook('onWidgetSet', onWidgetSet);
|
26
|
-
}
|
1
|
+
import { addHook } from '@opengis/fastify-table/utils.js';
|
2
|
+
|
3
|
+
// api
|
4
|
+
import testEmail from './controllers/testEmail.js';
|
5
|
+
import readNotifications from './controllers/readNotifications.js'; // mark as read
|
6
|
+
import userNotifications from './controllers/userNotifications.js'; // check all, backend pagination
|
7
|
+
|
8
|
+
// hook
|
9
|
+
import onWidgetSet from './hook/onWidgetSet.js'; // send notification on comment
|
10
|
+
|
11
|
+
// funcs
|
12
|
+
// import addNotification from '../notifications/funcs/addNotification.js'; // add to db
|
13
|
+
// import notification from '../notifications/funcs/sendNotification.js'; // send notification
|
14
|
+
|
15
|
+
import { notificationSchema, emailSchema } from './schema.js';
|
16
|
+
|
17
|
+
export default async function route(fastify) {
|
18
|
+
|
19
|
+
// fastify.decorate('addNotification', addNotification);
|
20
|
+
// fastify.decorate('notification', notification);
|
21
|
+
|
22
|
+
fastify.get('/test-email', { config: { policy: ['user'] }, schema: emailSchema }, testEmail);
|
23
|
+
fastify.get('/notification', { config: { policy: ['user'] }, schema: notificationSchema }, userNotifications);
|
24
|
+
fastify.get('/notification-read/:id?', { config: { policy: ['user'] }, schema: notificationSchema }, readNotifications);
|
25
|
+
addHook('onWidgetSet', onWidgetSet);
|
26
|
+
}
|
@@ -1,17 +1,17 @@
|
|
1
|
-
const notificationSchema = {
|
2
|
-
params: {
|
3
|
-
id: { type: 'string', pattern: '^([\\d\\w]+)$' },
|
4
|
-
},
|
5
|
-
querystring: {
|
6
|
-
nocache: { type: 'string', pattern: '^(\\d+)$' },
|
7
|
-
},
|
8
|
-
};
|
9
|
-
|
10
|
-
const emailSchema = {
|
11
|
-
quertstring: {
|
12
|
-
to: { type: 'string', pattern: '^((?!\\.)[\\w\\-_.]*[^.])(@\\w+)(\\.\\w+(\\.\\w+)?[^.\\W])$' },
|
13
|
-
},
|
14
|
-
};
|
15
|
-
|
16
|
-
export default null;
|
1
|
+
const notificationSchema = {
|
2
|
+
params: {
|
3
|
+
id: { type: 'string', pattern: '^([\\d\\w]+)$' },
|
4
|
+
},
|
5
|
+
querystring: {
|
6
|
+
nocache: { type: 'string', pattern: '^(\\d+)$' },
|
7
|
+
},
|
8
|
+
};
|
9
|
+
|
10
|
+
const emailSchema = {
|
11
|
+
quertstring: {
|
12
|
+
to: { type: 'string', pattern: '^((?!\\.)[\\w\\-_.]*[^.])(@\\w+)(\\.\\w+(\\.\\w+)?[^.\\W])$' },
|
13
|
+
},
|
14
|
+
};
|
15
|
+
|
16
|
+
export default null;
|
17
17
|
export { notificationSchema, emailSchema }
|
@@ -1,11 +1,11 @@
|
|
1
|
-
const propertiesSchema = {
|
2
|
-
params: {
|
3
|
-
key: { type: 'string', pattern: '^([\\d\\w._]+)$' },
|
4
|
-
},
|
5
|
-
querystring: {
|
6
|
-
json: { type: 'string', pattern: '^([\\d\\w]+)$' },
|
7
|
-
},
|
8
|
-
};
|
9
|
-
|
10
|
-
export default null;
|
1
|
+
const propertiesSchema = {
|
2
|
+
params: {
|
3
|
+
key: { type: 'string', pattern: '^([\\d\\w._]+)$' },
|
4
|
+
},
|
5
|
+
querystring: {
|
6
|
+
json: { type: 'string', pattern: '^([\\d\\w]+)$' },
|
7
|
+
},
|
8
|
+
};
|
9
|
+
|
10
|
+
export default null;
|
11
11
|
export { propertiesSchema }
|
@@ -1,21 +1,23 @@
|
|
1
|
-
import path from 'node:path';
|
2
|
-
|
3
|
-
import { getTemplatePath, getTemplate } from '@opengis/fastify-table/utils.js';
|
4
|
-
|
5
|
-
export default async function reportList({
|
6
|
-
user = {},
|
7
|
-
}) {
|
8
|
-
const arr = getTemplatePath('report');
|
9
|
-
|
10
|
-
const rows = await Promise.all(arr.map(async (el) => {
|
11
|
-
const loadTemplate = await getTemplate('report', el[0]);
|
12
|
-
const item = Array.isArray(loadTemplate) ? loadTemplate?.find?.(el => el[0].replace(path.extname(el[0]), '') === 'index')[1] : loadTemplate;
|
13
|
-
return {
|
14
|
-
name: el[0],
|
15
|
-
filters: item?.filters || [],
|
16
|
-
title: item?.title || el[0],
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
}
|
1
|
+
import path from 'node:path';
|
2
|
+
|
3
|
+
import { getTemplatePath, getTemplate } from '@opengis/fastify-table/utils.js';
|
4
|
+
|
5
|
+
export default async function reportList({
|
6
|
+
user = {},
|
7
|
+
}) {
|
8
|
+
const arr = getTemplatePath('report');
|
9
|
+
|
10
|
+
const rows = await Promise.all(arr.map(async (el) => {
|
11
|
+
const loadTemplate = await getTemplate('report', el[0]);
|
12
|
+
const item = Array.isArray(loadTemplate) ? loadTemplate?.find?.(el => el[0].replace(path.extname(el[0]), '') === 'index')[1] : loadTemplate;
|
13
|
+
return {
|
14
|
+
name: el[0],
|
15
|
+
filters: item?.filters || [],
|
16
|
+
title: item?.title || el[0],
|
17
|
+
subtitle: item?.subtitle,
|
18
|
+
category: item?.category,
|
19
|
+
sql: user.user_type?.includes('admin') ? item?.sql : undefined,
|
20
|
+
};
|
21
|
+
}));
|
22
|
+
return { rows };
|
23
|
+
}
|
@@ -1,14 +1,26 @@
|
|
1
1
|
import path from 'node:path';
|
2
2
|
|
3
|
-
import { pgClients, getTemplate, metaFormat
|
3
|
+
import { pgClients, getTemplate, metaFormat } from '@opengis/fastify-table/utils.js';
|
4
4
|
|
5
5
|
import getFilterQuery from '../utils/getFilterQuery.js';
|
6
|
+
import { downloadFile, getExport, getMimeType } from '@opengis/fastify-file/utils.js';
|
6
7
|
|
7
8
|
const maxLimit = 100;
|
8
9
|
|
9
|
-
|
10
|
-
|
11
|
-
|
10
|
+
const matches = {
|
11
|
+
16: 'yes/no', // boolean
|
12
|
+
701: 'number', // double precision
|
13
|
+
1082: 'date', // date
|
14
|
+
1184: 'date', // timestamp w/ time zone
|
15
|
+
1114: 'date', // timestamp w/o time zone
|
16
|
+
1700: 'number', // numeric
|
17
|
+
};
|
18
|
+
|
19
|
+
export default async function tableData(req, reply) {
|
20
|
+
const {
|
21
|
+
pg = pgClients.client, params = {}, query = {}, user = {}, host, unittest,
|
22
|
+
} = req;
|
23
|
+
|
12
24
|
if (!params?.name) {
|
13
25
|
return { message: 'not enough params: name', status: 400 };
|
14
26
|
}
|
@@ -31,11 +43,12 @@ export default async function tableData({
|
|
31
43
|
});
|
32
44
|
}
|
33
45
|
|
34
|
-
const { title, subtitle, widgets = [], kpi, sql = `select * from ${loadTemplate.table} where ${loadTemplate.query || 'true'}`, meta, filters } = loadTemplate;
|
46
|
+
const { title, subtitle, category, widgets = [], kpi, sql = `select * from ${loadTemplate.table} where ${loadTemplate.query || 'true'}`, meta, filters } = loadTemplate;
|
35
47
|
const { date, columns: metaColumns } = meta || {};
|
36
48
|
|
37
49
|
const granularity = query.granularity && date && false ? `date_trunc('${query.granularity}',${date})::date::text` : null;
|
38
50
|
const groupby = [meta?.groupby, granularity].filter(el => el).join(',');
|
51
|
+
const [orderby, ord] = (query.order || loadTemplate.orderby || '').replace(/ /, '-').split('-');
|
39
52
|
|
40
53
|
const period = query.period && date ? `${date}=${query.period}` : null;
|
41
54
|
const filter = [query.filter, period].filter(el => el).join(';');
|
@@ -45,14 +58,38 @@ export default async function tableData({
|
|
45
58
|
|
46
59
|
const { fields = [] } = await pg.query(`select * from (${sql.replace(/{{uid}}/g, user?.uid)})q limit 0`);
|
47
60
|
|
48
|
-
const where =
|
61
|
+
const where = getFilterQuery({ pg, filter, fields, filterList: filters, searchColumns: meta.search, search: query.search });
|
49
62
|
|
50
|
-
const
|
63
|
+
const orderbyColumnExists = fields?.find?.(el => el.name === orderby);
|
64
|
+
const q = `select ${metaColumns || '*'} from (${sql.replace(/{{uid}}/g, user?.uid)})q where ${where || '1=1'} ${groupby ? `group by ${groupby}` : ''} ${orderby && orderbyColumnExists ? `order by ${orderby} ${['asc', 'desc'].includes(ord) ? ord : 'desc'} nulls last` : ''} limit ${limit} offset ${offset}`;
|
51
65
|
|
52
66
|
if (query.sql && user?.user_type?.includes('admin')) {
|
53
67
|
return q;
|
54
68
|
}
|
55
69
|
|
70
|
+
if (query.export) {
|
71
|
+
const resp = await getExport({
|
72
|
+
pg,
|
73
|
+
host,
|
74
|
+
unittest,
|
75
|
+
nocache: query.nocache,
|
76
|
+
tableSql: `select ${metaColumns || '*'} from (${sql.replace(/{{uid}}/g, user?.uid)})q where ${where || '1=1'}`,
|
77
|
+
sourceName: title || 'report',
|
78
|
+
columns: fields.map(({ name }) => ({ name, title: meta?.titles?.[name] || name })),
|
79
|
+
cls: meta?.cls,
|
80
|
+
format: ['xlsx', 'csv'].find(el => (req.query.format || 'xlsx') === el) || 'xlsx',
|
81
|
+
formatAnswer: 'filepath',
|
82
|
+
}, reply);
|
83
|
+
if (resp?.filePath) {
|
84
|
+
const buffer = await downloadFile(resp.filePath, { buffer: true });
|
85
|
+
const headers = {};
|
86
|
+
headers['Content-Type'] = `attachment; filename=${getMimeType(resp.filePath)}`;
|
87
|
+
headers['Content-Disposition'] = `attachment; filename=${path.basename(resp.filePath)}`;
|
88
|
+
return reply.status(200).headers(headers).send(buffer);
|
89
|
+
}
|
90
|
+
return resp;
|
91
|
+
}
|
92
|
+
|
56
93
|
if (kpi?.length) {
|
57
94
|
await Promise.all(kpi.map(async (el) => {
|
58
95
|
if (!el.sql && !el.table) {
|
@@ -73,8 +110,6 @@ export default async function tableData({
|
|
73
110
|
sql: user?.user_type === 'admin' ? el.sql : undefined
|
74
111
|
}));
|
75
112
|
|
76
|
-
const types = fields.reduce((acc, curr) => ({ ...acc, [curr.name]: pg.pgType?.[curr.dataTypeID] }), {});
|
77
|
-
|
78
113
|
const { rows = [] } = await pg.query(q).catch(err => {
|
79
114
|
return reply.status(500).send('query error: ' + err.toString());
|
80
115
|
});
|
@@ -84,14 +119,7 @@ export default async function tableData({
|
|
84
119
|
const columns = fields.map(el => ({
|
85
120
|
name: el.name,
|
86
121
|
title: meta?.titles?.[el.name] || el.name,
|
87
|
-
|
88
|
-
? 'Autocomplete'
|
89
|
-
: (
|
90
|
-
['date', 'timestamp with time zone', 'timestamp without time zone'].includes(types[el.name])
|
91
|
-
? 'Date'
|
92
|
-
: null
|
93
|
-
) || 'Text',
|
94
|
-
format: pg.pgType?.[el.dataTypeID],
|
122
|
+
format: meta?.cls?.[el.name] ? 'select' : (matches[el.dataTypeID] || 'text'),
|
95
123
|
data: meta?.cls?.[el.name],
|
96
124
|
}));
|
97
125
|
|
@@ -101,6 +129,7 @@ export default async function tableData({
|
|
101
129
|
data: rows,
|
102
130
|
title,
|
103
131
|
subtitle,
|
132
|
+
category,
|
104
133
|
widgets,
|
105
134
|
columns,
|
106
135
|
};
|
@@ -4,6 +4,37 @@ import { pgClients, getTemplate, metaFormat } from '@opengis/fastify-table/utils
|
|
4
4
|
|
5
5
|
const maxLimit = 100;
|
6
6
|
|
7
|
+
const matches = {
|
8
|
+
16: 'yes/no', // boolean
|
9
|
+
701: 'number', // double precision
|
10
|
+
1082: 'date', // date
|
11
|
+
1184: 'date', // timestamp w/ time zone
|
12
|
+
1114: 'date', // timestamp w/o time zone
|
13
|
+
1700: 'number', // numeric
|
14
|
+
};
|
15
|
+
|
16
|
+
function normalizeData(widget, limit = maxLimit, offset = 0) {
|
17
|
+
const groupby = typeof widget.groupby === 'string'
|
18
|
+
? { name: widget.groupby }
|
19
|
+
: (widget.groupby?.[0] || widget.groupby);
|
20
|
+
|
21
|
+
const agg = groupby.name
|
22
|
+
? `${widget.granularity ? `date_trunc('${widget.granularity}', ${groupby.name})` : `${groupby.name}`}`
|
23
|
+
: 'count(*)';
|
24
|
+
|
25
|
+
const xCol = widget.granularity
|
26
|
+
? `date_trunc('${widget.granularity}', ${groupby.name})`
|
27
|
+
: groupby.name;
|
28
|
+
|
29
|
+
const sql = `select * from ${widget.table} where ${widget.query || 'true'} limit ${limit} offset ${offset}`;
|
30
|
+
|
31
|
+
const q = `select ${agg} as ${groupby.name}, ${widget.agg} as metric from (${sql}) t
|
32
|
+
${groupby.name ? `group by ${xCol}` : ''}
|
33
|
+
${widget.orderby || xCol ? `order by ${widget.orderby || xCol}` : ''}`;
|
34
|
+
|
35
|
+
return { groupby, agg, xCol, q };
|
36
|
+
}
|
37
|
+
|
7
38
|
export default async function widgetData({
|
8
39
|
pg = pgClients.client, params = {}, query = {}, user = {},
|
9
40
|
}, reply) {
|
@@ -43,34 +74,15 @@ export default async function widgetData({
|
|
43
74
|
|
44
75
|
const { cls = {}, titles = {} } = widget.meta || {};
|
45
76
|
|
77
|
+
const limit = Math.min(query.limit || maxLimit, maxLimit);
|
46
78
|
const offset = query.page && query.page > 0 ? (query.page - 1) * limit : 0;
|
47
|
-
const sql = widget.sql || `select * from ${widget.table} where ${widget.query || 'true'} limit ${maxLimit} offset ${offset}`;
|
48
79
|
|
49
|
-
const groupby =
|
50
|
-
? { name: widget.groupby }
|
51
|
-
: (widget.groupby?.[0] || widget.groupby);
|
80
|
+
const { groupby, q } = normalizeData(widget, limit, offset);
|
52
81
|
|
53
82
|
if (groupby.cls) {
|
54
83
|
Object.assign(cls, { [groupby.name]: groupby.cls });
|
55
84
|
}
|
56
85
|
|
57
|
-
const xCol = widget.granularity
|
58
|
-
? `date_trunc('${widget.granularity}', ${groupby.name})`
|
59
|
-
: groupby.name;
|
60
|
-
|
61
|
-
const q = widget.agg
|
62
|
-
? `select ${widget.agg} as metric ${groupby.name
|
63
|
-
? `${widget.granularity
|
64
|
-
? `,date_trunc('${widget.granularity}', ${groupby.name})`
|
65
|
-
: `,${groupby.name}`}`
|
66
|
-
: ''
|
67
|
-
} as ${groupby.name} from (${sql}) t ${groupby.name
|
68
|
-
? `group by ${xCol}`
|
69
|
-
: ''
|
70
|
-
}
|
71
|
-
${widget.orderby || xCol ? `order by ${widget.orderby || xCol}` : ''}`
|
72
|
-
: sql;
|
73
|
-
|
74
86
|
if (query.sql) return q;
|
75
87
|
|
76
88
|
const { rows = [], fields = [] } = await pg.query(q).catch(err => {
|
@@ -78,19 +90,10 @@ export default async function widgetData({
|
|
78
90
|
}) || {};
|
79
91
|
await metaFormat({ rows, cls, sufix: false }, pg);
|
80
92
|
|
81
|
-
const types = fields.reduce((acc, curr) => ({ ...acc, [curr.name]: pg.pgType?.[curr.dataTypeID] }), {});
|
82
|
-
|
83
93
|
const columns = fields.map(el => ({
|
84
94
|
name: el.name,
|
85
95
|
title: titles?.[el.name] || el.name,
|
86
|
-
|
87
|
-
? 'Autocomplete'
|
88
|
-
: (
|
89
|
-
['date', 'timestamp with time zone', 'timestamp without time zone'].includes(types[el.name])
|
90
|
-
? 'Date'
|
91
|
-
: null
|
92
|
-
) || 'Text',
|
93
|
-
format: pg.pgType?.[el.dataTypeID],
|
96
|
+
format: cls?.[el.name] ? 'select' : (matches[el.dataTypeID] || 'text'),
|
94
97
|
data: cls?.[el.name],
|
95
98
|
}));
|
96
99
|
|
@@ -1,9 +1,9 @@
|
|
1
|
-
import tableData from './controllers/tableData.js';
|
2
|
-
import widgetData from './controllers/widgetData.js';
|
3
|
-
import reportList from './controllers/list.js';
|
4
|
-
|
5
|
-
export default async function route(app) {
|
6
|
-
app.get('/reports', {}, reportList);
|
7
|
-
app.get('/reports/:name', {}, tableData);
|
8
|
-
app.get('/reports/:name/:widget', {}, widgetData);
|
9
|
-
}
|
1
|
+
import tableData from './controllers/tableData.js';
|
2
|
+
import widgetData from './controllers/widgetData.js';
|
3
|
+
import reportList from './controllers/list.js';
|
4
|
+
|
5
|
+
export default async function route(app) {
|
6
|
+
app.get('/reports', {}, reportList);
|
7
|
+
app.get('/reports/:name', {}, tableData);
|
8
|
+
app.get('/reports/:name/:widget', {}, widgetData);
|
9
|
+
}
|