@opengis/admin 0.2.102 → 0.2.104

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