@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.
Files changed (112) hide show
  1. package/README.md +97 -97
  2. package/config.js +4 -4
  3. package/dist/{add-page-mpXXLEuf.js → add-page-DELwNBs9.js} +4 -4
  4. package/dist/{admin-interface-C4iRix-U.js → admin-interface-ChLQ5JCd.js} +13 -13
  5. package/dist/{admin-view-Bzb14Z1a.js → admin-view-DnD5gBsl.js} +6 -6
  6. package/dist/admin.js +1 -1
  7. package/dist/admin.umd.cjs +76 -76
  8. package/dist/assets/logo.svg +41 -41
  9. package/dist/{card-view-C7Qpg_zt.js → card-view-Cb3j5eXY.js} +3 -3
  10. package/dist/{edit-page-8o4I7nX6.js → edit-page-DGjs4jeh.js} +8 -8
  11. package/dist/{import-file-DcMkaBsX.js → import-file-DIAYCDNH.js} +17021 -17143
  12. package/dist/{profile-page-D5Vy_Za-.js → profile-page-CaQqFoqe.js} +4 -4
  13. package/dist/style.css +1 -1
  14. package/module/settings/card/admin.accounts.table/index.yml +7 -7
  15. package/module/settings/card/admin.accounts.table/rules.hbs +18 -18
  16. package/module/settings/card/admin.accounts.table/users.hbs +13 -13
  17. package/module/settings/card/admin.routes.table/groups.hbs +11 -11
  18. package/module/settings/card/admin.routes.table/users.hbs +16 -16
  19. package/module/settings/cls/core.actions.json +17 -17
  20. package/module/settings/cls/core.scope.json +13 -13
  21. package/module/settings/cls/properties.site_status.json +13 -13
  22. package/module/settings/cls/properties.widget_status.json +13 -13
  23. package/module/settings/cls/yes_no.json +11 -11
  24. package/module/settings/form/admin.accounts.form.json +13 -13
  25. package/module/settings/form/admin.properties.form.json +15 -15
  26. package/module/settings/form/admin.roles.form.json +21 -21
  27. package/module/settings/form/admin.user_properties.form.json +15 -15
  28. package/module/settings/form/admin.user_roles_card.form.json +13 -13
  29. package/module/settings/interface/admin.properties.json +4 -4
  30. package/module/settings/interface/admin.roles.json +4 -4
  31. package/module/settings/interface/admin.routes.json +4 -4
  32. package/module/settings/interface/admin.users.json +4 -4
  33. package/module/settings/select/core.routes.sql +1 -1
  34. package/module/settings/select/core.user_mentioned.sql +1 -1
  35. package/module/settings/select/core.user_uid.sql +1 -1
  36. package/module/settings/table/admin.properties.table.json +39 -39
  37. package/module/settings/table/admin.user_properties.table.json +34 -34
  38. package/package.json +3 -3
  39. package/server/helpers/core/coalesce.js +7 -7
  40. package/server/helpers/core/select.js +48 -48
  41. package/server/helpers/core/token.js +18 -18
  42. package/server/helpers/list/buttonHelper.js +21 -21
  43. package/server/helpers/list/utils/button.js +5 -5
  44. package/server/helpers/temp/contentList.js +58 -58
  45. package/server/helpers/temp/ifCond.js +101 -101
  46. package/server/helpers/utils/button.js +5 -5
  47. package/server/helpers/utils/mdToHTML.js +17 -17
  48. package/server/plugins/access/index.mjs +6 -6
  49. package/server/plugins/adminHook.js +81 -81
  50. package/server/plugins/cron.js +10 -10
  51. package/server/plugins/docs.js +28 -28
  52. package/server/routes/access/controllers/access.group.js +29 -29
  53. package/server/routes/access/controllers/access.group.post.js +54 -54
  54. package/server/routes/access/index.mjs +11 -11
  55. package/server/routes/access/schema.mjs +67 -67
  56. package/server/routes/calendar/controllers/calendar.data.js +125 -125
  57. package/server/routes/calendar/index.mjs +7 -7
  58. package/server/routes/calendar/schema.js +21 -21
  59. package/server/routes/data/controllers/cardTabData.js +49 -49
  60. package/server/routes/data/controllers/funcs/getFilterSQL/index.js +92 -92
  61. package/server/routes/data/controllers/funcs/getFilterSQL/util/formatValue.js +170 -170
  62. package/server/routes/data/controllers/funcs/getFilterSQL/util/getCustomQuery.js +13 -13
  63. package/server/routes/data/controllers/funcs/getFilterSQL/util/getFilterQuery.js +64 -64
  64. package/server/routes/data/controllers/funcs/getFilterSQL/util/getOptimizedQuery.js +12 -12
  65. package/server/routes/data/controllers/funcs/getFilterSQL/util/getTableSql.js +34 -34
  66. package/server/routes/data/controllers/tableDataId.js +27 -27
  67. package/server/routes/data/controllers/tokenInfo.js +9 -9
  68. package/server/routes/data/controllers/utils/assignTokens.js +30 -30
  69. package/server/routes/data/controllers/utils/conditions.js +20 -20
  70. package/server/routes/data/controllers/utils/getColumns.js +8 -8
  71. package/server/routes/data/index.mjs +20 -20
  72. package/server/routes/data/schema.js +54 -54
  73. package/server/routes/notifications/controllers/readNotifications.js +18 -18
  74. package/server/routes/notifications/controllers/testEmail.js +35 -35
  75. package/server/routes/notifications/controllers/userNotifications.js +53 -53
  76. package/server/routes/notifications/hook/onWidgetSet.js +56 -56
  77. package/server/routes/notifications/index.mjs +26 -26
  78. package/server/routes/notifications/schema.js +16 -16
  79. package/server/routes/properties/schema.js +10 -10
  80. package/server/routes/report/controllers/list.js +23 -21
  81. package/server/routes/report/controllers/tableData.js +46 -17
  82. package/server/routes/report/controllers/widgetData.js +34 -31
  83. package/server/routes/report/index.mjs +9 -9
  84. package/server/routes/report/utils/formatValue.js +179 -179
  85. package/server/routes/report/utils/getFilterQuery.js +10 -9
  86. package/server/routes/root.mjs +3 -3
  87. package/server/routes/templates/controllers/getTemplate.js +44 -44
  88. package/server/routes/templates/schema.js +8 -8
  89. package/server/routes/user/controllers/user.cls.id.js +14 -14
  90. package/server/routes/user/controllers/user.cls.js +72 -72
  91. package/server/routes/user/controllers/user.info.js +17 -17
  92. package/server/routes/user/schema.js +14 -14
  93. package/server/routes/util/controllers/code.generator.js +89 -89
  94. package/server/routes/widget/controllers/widget.del.js +80 -80
  95. package/server/routes/widget/controllers/widget.set.js +101 -101
  96. package/server/routes/widget/hook/onWidgetSet.js +12 -12
  97. package/server/routes/widget/index.mjs +20 -20
  98. package/server/routes/widget/schema.js +12 -12
  99. package/server/templates/cls/itree.recrzone_category.json +73 -73
  100. package/server/templates/cls/test.json +9 -9
  101. package/server/templates/form/admin.user_cls.data.form.json +49 -49
  102. package/server/templates/form/admin.user_group_rel.form.json +21 -21
  103. package/server/templates/form/form-user-pass.json +10 -10
  104. package/server/templates/form/form-user_group.json +39 -39
  105. package/server/templates/form/form-users.json +156 -156
  106. package/server/templates/form/user_group_access.form.json +22 -22
  107. package/server/templates/select/account_id.json +2 -2
  108. package/server/templates/table/gis.dataset.table.json +43 -43
  109. package/server/templates/table/management.user_group.table.json +112 -112
  110. package/server/templates/table/management.users.table.json +126 -126
  111. package/server/utils/addNotification.js +21 -21
  112. 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
- sql: user.user_type?.includes('admin') ? item?.sql : undefined,
18
- };
19
- }));
20
- return { rows };
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, handlebarsSync } from '@opengis/fastify-table/utils.js';
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
- export default async function tableData({
10
- pg = pgClients.client, params = {}, query = {}, user = {},
11
- }, reply) {
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 = filter ? getFilterQuery({ pg, filter, fields, filterList: filters })?.map?.(el => el.query)?.join(' and ') : null;
61
+ const where = getFilterQuery({ pg, filter, fields, filterList: filters, searchColumns: meta.search, search: query.search });
49
62
 
50
- const q = `select ${metaColumns || '*'} from (${sql.replace(/{{uid}}/g, user?.uid)})q where ${where || '1=1'} ${groupby ? `group by ${groupby}` : ''} limit ${limit} offset ${offset}`;
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
- type: meta?.cls?.[el.name]
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 = typeof widget.groupby === 'string'
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
- type: cls?.[el.name]
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
+ }