@opengis/admin 0.1.97 → 0.1.99

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 (174) hide show
  1. package/README.md +29 -29
  2. package/config.js +4 -4
  3. package/dist/{IconChevronDown-C6C2qgO7.js → IconChevronDown-CHEXfG3v.js} +1 -1
  4. package/dist/{add-page-Bz9AriTG.js → add-page-DGnHyxhv.js} +18 -14
  5. package/dist/{admin-interface-QcGlLoY3.js → admin-interface-D2IezdVx.js} +6 -5
  6. package/dist/{admin-view-AjnQFK-4.js → admin-view-CtPrS-pT.js} +153 -148
  7. package/dist/admin.js +1 -1
  8. package/dist/admin.umd.cjs +59 -59
  9. package/dist/assets/logo.svg +41 -41
  10. package/dist/{card-view-BFYrLzFg.js → card-view-WP8gH2Ul.js} +1 -1
  11. package/dist/{edit-page-BlHpTvcw.js → edit-page-0YrQy_VE.js} +1 -1
  12. package/dist/{import-file-2vpw3792.js → import-file-DoWm0VXP.js} +8889 -8813
  13. package/dist/style.css +1 -1
  14. package/module/settings/card/admin.accounts.table/index.yml +8 -0
  15. package/module/settings/card/admin.accounts.table/rules.hbs +19 -0
  16. package/module/settings/card/admin.accounts.table/users.hbs +14 -0
  17. package/module/settings/card/admin.roles.table/access.hbs +3 -27
  18. package/module/settings/card/admin.roles.table/general_info.hbs +1 -17
  19. package/module/settings/card/admin.roles.table/index.yml +21 -14
  20. package/module/settings/card/admin.roles.table/users.hbs +6 -27
  21. package/module/settings/card/admin.routes.table/general_info.hbs +14 -41
  22. package/module/settings/card/admin.routes.table/groups.hbs +12 -0
  23. package/module/settings/card/admin.routes.table/index.yml +11 -8
  24. package/module/settings/card/admin.routes.table/users.hbs +16 -33
  25. package/module/settings/card/admin.users.table/context.hbs +15 -0
  26. package/module/settings/card/admin.users.table/general_info.hbs +13 -26
  27. package/module/settings/card/admin.users.table/index.yml +22 -12
  28. package/module/settings/card/admin.users.table/last_login.hbs +10 -0
  29. package/module/settings/card/admin.users.table/logs.hbs +11 -31
  30. package/module/settings/card/admin.users.table/routes.hbs +8 -0
  31. package/module/settings/card/admin.users.table/user_roles.hbs +13 -25
  32. package/module/settings/cls/core.actions.json +17 -17
  33. package/module/settings/cls/core.scope.json +13 -13
  34. package/module/settings/cls/properties.site_status.json +13 -13
  35. package/module/settings/cls/properties.widget_status.json +13 -13
  36. package/module/settings/cls/users.user_type.json +13 -13
  37. package/module/settings/form/admin.access.form.json +36 -36
  38. package/module/settings/form/admin.accounts.form.json +13 -0
  39. package/module/settings/form/admin.custom_column.form.json +71 -71
  40. package/module/settings/form/admin.properties.form.json +15 -15
  41. package/module/settings/form/admin.roles.form.json +21 -19
  42. package/module/settings/form/admin.routes.form.json +25 -25
  43. package/module/settings/form/admin.rules.form.json +31 -0
  44. package/module/settings/form/admin.user_properties.form.json +15 -15
  45. package/module/settings/form/admin.user_roles.form.json +13 -21
  46. package/module/settings/form/admin.user_roles_card.form.json +14 -0
  47. package/module/settings/form/admin.users.form.json +153 -153
  48. package/module/settings/form/context.account_grants.form.json +24 -0
  49. package/module/settings/form/context.account_users.form.json +12 -0
  50. package/module/settings/form/user.user_roles.form.json +13 -13
  51. package/module/settings/interface/admin.properties.json +4 -4
  52. package/module/settings/interface/admin.roles.json +4 -4
  53. package/module/settings/interface/admin.routes.json +4 -4
  54. package/module/settings/interface/admin.users.json +4 -4
  55. package/module/settings/menu.json +84 -50
  56. package/module/settings/select/core.accounts.sql +1 -0
  57. package/module/settings/select/core.roles.sql +1 -1
  58. package/module/settings/select/core.routes.sql +1 -1
  59. package/module/settings/select/core.rules.sql +1 -0
  60. package/module/settings/select/core.user_mentioned.sql +1 -1
  61. package/module/settings/select/core.user_uid.sql +1 -2
  62. package/module/settings/table/admin.access.table.json +83 -83
  63. package/module/settings/table/admin.accounts.table.json +42 -0
  64. package/module/settings/table/admin.custom_column.table.json +99 -99
  65. package/module/settings/table/admin.properties.table.json +39 -39
  66. package/module/settings/table/admin.roles.table.json +64 -64
  67. package/module/settings/table/admin.routes.table.json +73 -68
  68. package/module/settings/table/admin.rules.table.json +77 -0
  69. package/module/settings/table/admin.user_properties.table.json +34 -34
  70. package/module/settings/table/admin.user_roles.table.json +72 -72
  71. package/module/settings/table/admin.users.table.json +132 -121
  72. package/module/settings/table/context.account_grants.table.json +68 -0
  73. package/module/settings/table/context.account_users.table.json +38 -0
  74. package/package.json +83 -82
  75. package/plugin.js +29 -29
  76. package/server/helpers/core/badge.js +16 -0
  77. package/server/helpers/core/buttonHelper.js +14 -0
  78. package/server/helpers/core/select.js +48 -0
  79. package/server/helpers/{controllers → core}/token.js +16 -16
  80. package/server/helpers/index.js +28 -0
  81. package/server/helpers/list/buttonHelper.js +10 -10
  82. package/server/helpers/list/descriptionList.js +43 -34
  83. package/server/helpers/list/tableList.js +81 -65
  84. package/server/helpers/list/utils/button.js +5 -5
  85. package/server/helpers/temp/contentList.js +58 -0
  86. package/server/helpers/temp/ifCond.js +101 -0
  87. package/server/helpers/utils/button.js +6 -0
  88. package/server/helpers/utils/buttonDel.js +6 -0
  89. package/server/plugins/access/funcs/getAdminAccess.js +12 -14
  90. package/server/plugins/access/index.mjs +6 -6
  91. package/server/plugins/adminHook.js +81 -81
  92. package/server/plugins/cron.js +10 -10
  93. package/server/plugins/docs.js +28 -28
  94. package/server/plugins/hook.js +226 -226
  95. package/server/plugins/vite.js +71 -71
  96. package/server/routes/access/controllers/access.group.js +29 -29
  97. package/server/routes/access/controllers/access.group.post.js +48 -43
  98. package/server/routes/access/index.mjs +8 -63
  99. package/server/routes/access/schema.mjs +58 -0
  100. package/server/routes/calendar/controllers/calendar.data.js +87 -87
  101. package/server/routes/calendar/index.mjs +7 -7
  102. package/server/routes/calendar/schema.js +21 -21
  103. package/server/routes/data/controllers/cardData.js +100 -89
  104. package/server/routes/data/controllers/cardTabData.js +49 -49
  105. package/server/routes/data/controllers/funcs/getFilterSQL/index.js +92 -92
  106. package/server/routes/data/controllers/funcs/getFilterSQL/util/formatValue.js +170 -170
  107. package/server/routes/data/controllers/funcs/getFilterSQL/util/getCustomQuery.js +13 -13
  108. package/server/routes/data/controllers/funcs/getFilterSQL/util/getFilterQuery.js +64 -64
  109. package/server/routes/data/controllers/funcs/getFilterSQL/util/getOptimizedQuery.js +12 -12
  110. package/server/routes/data/controllers/funcs/getFilterSQL/util/getTableSql.js +34 -34
  111. package/server/routes/data/controllers/tableData.js +29 -20
  112. package/server/routes/data/controllers/tableDataId.js +27 -27
  113. package/server/routes/data/controllers/tableFilter.js +67 -67
  114. package/server/routes/data/controllers/tokenInfo.js +9 -9
  115. package/server/routes/data/controllers/utils/assignTokens.js +30 -30
  116. package/server/routes/data/controllers/utils/conditions.js +20 -20
  117. package/server/routes/data/controllers/utils/getColumns.js +8 -8
  118. package/server/routes/data/index.mjs +17 -17
  119. package/server/routes/data/schema.js +54 -54
  120. package/server/routes/menu/controllers/getMenu.js +54 -67
  121. package/server/routes/menu/index.mjs +5 -5
  122. package/server/routes/notifications/controllers/readNotifications.js +27 -27
  123. package/server/routes/notifications/controllers/testEmail.js +35 -35
  124. package/server/routes/notifications/controllers/userNotifications.js +53 -53
  125. package/server/routes/notifications/funcs/addNotification.js +21 -21
  126. package/server/routes/notifications/funcs/sendNotification.js +92 -92
  127. package/server/routes/notifications/hook/onWidgetSet.js +57 -57
  128. package/server/routes/notifications/index.mjs +27 -27
  129. package/server/routes/notifications/schema.js +16 -16
  130. package/server/routes/properties/controllers/admin.properties.get.js +29 -29
  131. package/server/routes/properties/controllers/user.properties.get.js +30 -30
  132. package/server/routes/properties/controllers/user.properties.post.js +30 -30
  133. package/server/routes/properties/funcs/getSettings.js +56 -56
  134. package/server/routes/properties/funcs/setSettings.js +44 -44
  135. package/server/routes/properties/funcs/utils/dataInsert.js +26 -26
  136. package/server/routes/properties/index.mjs +14 -14
  137. package/server/routes/properties/schema.js +10 -10
  138. package/server/routes/root.mjs +3 -3
  139. package/server/routes/templates/controllers/getTemplate.js +26 -26
  140. package/server/routes/templates/index.mjs +16 -16
  141. package/server/routes/templates/schema.js +8 -8
  142. package/server/routes/user/controllers/user.cls.id.js +14 -14
  143. package/server/routes/user/controllers/user.cls.js +71 -71
  144. package/server/routes/user/controllers/user.cls.post.js +52 -52
  145. package/server/routes/user/controllers/user.info.js +17 -17
  146. package/server/routes/user/schema.js +14 -14
  147. package/server/routes/widget/controllers/utils/historyFormat.js +75 -75
  148. package/server/routes/widget/controllers/utils/obj2db.js +13 -13
  149. package/server/routes/widget/controllers/widget.del.js +41 -41
  150. package/server/routes/widget/controllers/widget.get.js +96 -96
  151. package/server/routes/widget/controllers/widget.set.js +76 -76
  152. package/server/routes/widget/index.mjs +11 -11
  153. package/server/routes/widget/schema.js +12 -12
  154. package/server/templates/cls/itree.recrzone_category.json +73 -73
  155. package/server/templates/cls/test.json +9 -9
  156. package/server/templates/form/admin.user_cls.data.form.json +49 -49
  157. package/server/templates/form/admin.user_group_rel.form.json +21 -21
  158. package/server/templates/form/cp_building.form.json +32 -32
  159. package/server/templates/form/form-user-pass.json +10 -10
  160. package/server/templates/form/form-user_group.json +39 -39
  161. package/server/templates/form/form-users.json +156 -156
  162. package/server/templates/form/user_group_access.form.json +22 -22
  163. package/server/templates/select/account_id.json +2 -2
  164. package/server/templates/table/gis.dataset.table.json +43 -43
  165. package/server/templates/table/management.user_group.table.json +112 -112
  166. package/server/templates/table/management.users.table.json +126 -126
  167. package/utils.js +29 -29
  168. package/module/settings/select/core.roles.json +0 -3
  169. package/server/helpers/controllers/badge.js +0 -12
  170. package/server/helpers/controllers/hb.js +0 -3
  171. package/server/helpers/controllers/map.js +0 -3
  172. package/server/helpers/controllers/mls.js +0 -3
  173. package/server/helpers/controllers/vue.js +0 -3
  174. package/server/helpers/index.mjs +0 -29
@@ -0,0 +1,48 @@
1
+ import { getPG, getSelect } from "@opengis/fastify-table/utils.js";
2
+ const pg = getPG();
3
+
4
+ export default async function select(ids, options) {
5
+ if (!ids || (Array.isArray(ids) && ids.length === 0) || ids === '') {
6
+ return '';
7
+ }
8
+
9
+ const data = options.hash?.data;
10
+ if (!data && data !== false && data !== 0) return '';
11
+ try {
12
+ const idsArray = Array.isArray(ids) ? ids : [ids];
13
+
14
+ const classifier = await getSelect(data);
15
+
16
+
17
+
18
+ if (!classifier) return `Не знайдено класифікатор ${data}`;
19
+
20
+ const arr = classifier.arr || []
21
+ if (classifier.sql && typeof classifier.sql === 'string') {
22
+
23
+
24
+
25
+ const metaQuery = `SELECT * FROM (${classifier.sql})q LIMIT 0`;
26
+ const meta = await pg.query(metaQuery);
27
+ const idColumn = meta.fields[0].name;
28
+ const textColumn = meta.fields[1].name;
29
+
30
+ const sql = `SELECT "${idColumn}" AS id, "${textColumn}" AS text FROM (${classifier.sql}) q WHERE "${idColumn}" = ANY($1::text[])`;
31
+ const values = [idsArray.map(id => String(id))];
32
+
33
+ const { rows } = await pg.query(sql, values);
34
+ Object.assign(arr, rows)
35
+
36
+ }
37
+ if (!arr.length) return idsArray
38
+
39
+ const results = idsArray.map(id => {
40
+ const result = arr.find(el => String(el.id) == String(id));
41
+ return result ? result.text : '';
42
+ });
43
+
44
+ return results.filter(Boolean).join(', ');
45
+ } catch (error) {
46
+ return `Сталася помилка.<!-- err: ${error.toString()} -->`;
47
+ }
48
+ }
@@ -1,17 +1,17 @@
1
- import { config, setToken } from "@opengis/fastify-table/utils.js";
2
-
3
- export default function token(params) {
4
- const { data, hash } = params;
5
- if (!data?.root?.user?.uid) return '';
6
- if (!hash || typeof hash !== 'object') return '-';
7
-
8
- // const id = hash?.edit ? hash?.id : data?.root?.id;
9
- // console.log(hash)
10
- const [token] = setToken({
11
- ids: [JSON.stringify(hash)],
12
-
13
- uid: data?.root?.user?.uid,
14
- array: 1,
15
- });
16
- return token;
1
+ import { setToken } from "@opengis/fastify-table/utils.js";
2
+
3
+ export default function token(params) {
4
+ const { data, hash } = params;
5
+ if (!data?.root?.user?.uid) return '';
6
+ if (!hash || typeof hash !== 'object') return '-';
7
+
8
+ // const id = hash?.edit ? hash?.id : data?.root?.id;
9
+ // console.log(hash)
10
+ const [token] = setToken({
11
+ ids: [JSON.stringify(hash)],
12
+
13
+ uid: data?.root?.user?.uid,
14
+ array: 1,
15
+ });
16
+ return token;
17
17
  }
@@ -0,0 +1,28 @@
1
+
2
+ import { handlebars, handlebarsSync } from "@opengis/fastify-table/utils.js";
3
+
4
+ import token from "./core/token.js";
5
+ import descriptionList from "./list/descriptionList.js";
6
+ import tableList from "./list/tableList.js";
7
+ import buttonHelper from "./core/buttonHelper.js";
8
+ import select from "./core/select.js";
9
+ import badge from "./core/badge.js";
10
+
11
+
12
+ import ifCond from "./temp/ifCond.js";
13
+ import contentList from "./temp/contentList.js";
14
+
15
+
16
+
17
+ export default async function route() {
18
+
19
+ handlebars.registerHelper('token', token);
20
+ handlebars.registerHelper('descriptionList', descriptionList);
21
+ handlebars.registerHelper('tableList', tableList);
22
+ handlebars.registerHelper('button', buttonHelper);
23
+ handlebars.registerHelper('select', select);
24
+ handlebars.registerHelper('badge', badge);
25
+ handlebars.registerHelper('contentList', contentList);
26
+ handlebarsSync.registerHelper('ifCond', ifCond);
27
+ handlebars.registerHelper('ifCond', ifCond);
28
+ }
@@ -1,11 +1,11 @@
1
-
2
- import button from './utils/button.js';
3
- export default function buttonHelper(data, opt) {
4
- const { hash } = opt;
5
-
6
- // console.log(params)
7
-
8
- if (!hash.token) return 'token empty';
9
-
10
- return button(hash.token, hash.title);
1
+
2
+ import button from './utils/button.js';
3
+ export default function buttonHelper(data, opt) {
4
+ const { hash } = opt;
5
+
6
+ // console.log(params)
7
+
8
+ if (!hash.token) return 'token empty';
9
+
10
+ return button(hash.token, hash.title);
11
11
  }
@@ -1,35 +1,44 @@
1
- import { handlebarsSync } from '@opengis/fastify-table/utils.js'
2
-
3
- function format(d, key, data) {
4
- if (!key?.includes) return '';
5
- if (d === true) return 'так';
6
- if (d === false) return 'ні'
7
- if (key.includes('{{')) {
8
- return handlebarsSync.compile(key)(data);
9
- }
10
- if (!d) return '-';
11
- return d;
12
- }
13
- export default function descriptionList(data, opt) {
14
- const { hash } = opt;
15
-
16
- // console.log(params)
17
-
18
- if (!hash.columns) return 'columns empty'
19
- const keys = hash.columns.split(',').map(el => el.trim().replace(new RegExp(hash.comma || '#', 'g'), ','));
20
-
21
- const result = [];
22
-
23
- for (let i = 0; i < keys.length; i += 2) {
24
- const name = keys[i];
25
- const key = keys[i + 1];
26
-
27
- result.push(`<tr class="bg-white even:bg-gray-50">
28
- <th class="px-6 py-3 text-left text-xs font-medium text-gray-500 uppercase max-w-44">${name}</th>
29
- <td class="px-6 py-2 text-sm text-gray-900 max-w-44 font-semibold">${format(data[key], key, data)}</td>
30
- </tr>
31
- `);
32
-
33
- }
34
- return '<table class="min-w-full divide-y divide-gray-200">' + result.join('') + '</table>';
1
+ import { handlebarsSync, handlebars } from '@opengis/fastify-table/utils.js'
2
+
3
+ function format(d, key, data) {
4
+ if (!key?.includes) return '';
5
+ if (d === true) return 'так';
6
+ if (d === false) return 'ні'
7
+
8
+ if (key.includes('{{')) {
9
+ return handlebarsSync.compile(key)(data);
10
+ }
11
+ if (!d) return '-';
12
+ return d;
13
+ }
14
+ export default async function descriptionList(data, opt) {
15
+ const { hash } = opt;
16
+
17
+ // no data
18
+ if (hash.nodata && !data) {
19
+ const noDataText = typeof hash.nodata == 'string' ? hash.nodata : 'no data';
20
+ return noDataText
21
+ }
22
+ if (!hash.columns) return 'columns empty'
23
+ const keys = hash.columns.split(',').map(el => hash.comma ? el.trim().replace(new RegExp(hash.comma || '#', 'g'), ',') : el.trim());
24
+
25
+ const result = [];
26
+
27
+ for (let i = 0; i < keys.length; i += 2) {
28
+ const name = keys[i];
29
+ const nameHBS = name.includes('{{') ? handlebarsSync.compile(name)({ ...data, hash }) : false
30
+
31
+ if (!nameHBS && name.includes('{{')) continue;
32
+
33
+ const key = keys[i + 1];
34
+ const d1 = ['{{format', '{{select', '{{badge', '{{ifCond'].filter(el => key.includes(el)).length ? await handlebars.compile(key)(data) || '-' : null
35
+
36
+ result.push(`<div class="flex py-[16px] text-[14px] border-b border-[#E5E7EB">
37
+ <div class="text-[#6B7280] font-[400] w-[50%]">${nameHBS || name}</div>
38
+ <div class="font-[600] text-black w-[50%]">${d1 || format(data[key], key, data)}</div>
39
+ </div>
40
+ `);
41
+
42
+ }
43
+ return '<div class="w-full">' + result.join('') + '</div>';
35
44
  }
@@ -1,66 +1,82 @@
1
- import { handlebarsSync, setToken } from '@opengis/fastify-table/utils.js'
2
-
3
- import button from './utils/button.js';
4
-
5
- function format(d, key, data) {
6
- if (!key?.includes) return '';
7
- if (d === true) return 'так';
8
- if (d === false) return 'ні';
9
- if (key === 'actions') {
10
- return button(d, 'Редагувати')
11
- }
12
- if (key.includes('{{')) {
13
- return handlebarsSync.compile(key)(data);
14
- }
15
- if (!d) return '-';
16
- return d;
17
- }
18
- export default function tableList(data, opt) {
19
- const { hash } = opt;
20
-
21
- if (!hash.columns) return 'columns empty'
22
- const keys = hash.columns.split(',').map(el => el.trim().replace(new RegExp(hash.comma || '#', 'g'), ',')).concat(hash.uid && hash.table && hash.form ? ['Дії', 'actions'] : []);
23
-
24
- const result = [];
25
- result.push('<thead> <tr class="border-t border-gray-200 divide-x divide-gray-200">');
26
-
27
- // thead
28
- for (let i = 0; i < keys.length; i += 2) {
29
- const name = keys[i];
30
-
31
- result.push(`<th scope="col">
32
- <div class="hs-dropdown relative inline-flex w-full ">
33
- <div
34
- class="px-5 py-2.5 text-start w-full flex items-center gap-x-1 text-sm text-nowrap font-normal text-gray-500 ">
35
- ${name}
36
- </div>
37
- </div>
38
- </th>`)
39
- }
40
- result.push('</tr></thead>');
41
-
42
- // body
43
- for (let k = 0; k < data.length; k += 2) {
44
- const row = data[k];
45
- result.push('<tr class="divide-x divide-gray-200">');
46
- for (let i = 0; i < keys.length; i += 2) {
47
- const key = keys[i + 1];
48
- const obj = { form: hash.form, table: hash.table, id: row[hash.id] }
49
-
50
- const token = key == 'actions' ? setToken({ ids: [JSON.stringify(obj)], uid: hash.uid, array: 1 })[0] : null;
51
-
52
- result.push(`<td class="size-px">
53
- <div class="px-5 py-2">
54
- <p class="text-sm font-semibold text-gray-800">${format(token || row[key], key, data)}</p>
55
- </div>
56
- </td>`);
57
-
58
- }
59
- // action token
60
-
61
- result.push('</tr>');
62
- }
63
-
64
-
65
- return '<table class="min-w-full divide-y divide-gray-200"> ' + result.join('') + '</table>';
1
+ import { handlebarsSync, setToken, handlebars } from '@opengis/fastify-table/utils.js'
2
+
3
+ import button from '../utils/button.js';
4
+ import buttonDel from '../utils/buttonDel.js';
5
+
6
+ function format(d, key, data, hash) {
7
+ if (!key?.includes) return '';
8
+ if (d === true) return 'так';
9
+ if (d === false) return 'ні';
10
+ if (key === 'actions') {
11
+ return (hash.form ? button(d, 'редагувати') : '') + buttonDel(d)
12
+ }
13
+ if (key.includes('{{')) {
14
+ return handlebarsSync.compile(key)(data);
15
+ }
16
+ if (!d) return '-';
17
+ return d;
18
+ }
19
+ export default async function tableList(data, opt) {
20
+ const { hash } = opt;
21
+ // no data
22
+
23
+ if (hash.nodata && !data?.length) {
24
+ const noDataText = typeof hash.nodata == 'string' ? hash.nodata : 'no data';
25
+ return noDataText
26
+ }
27
+ if (!hash.columns) return 'columns empty'
28
+ const keys = hash.columns.split(hash.divider || ',').map(el => hash.comma ? el.trim().replace(new RegExp(hash.comma, 'g'), ',') : el.trim()).concat(hash.uid && hash.table && hash.id && !hash.noactions ? ['Дії', 'actions'] : []);
29
+
30
+ const result = [];
31
+ result.push('<thead> <tr>');
32
+
33
+ // thead
34
+ const skip = {}
35
+ for (let i = 0; i < keys.length; i += 2) {
36
+ const name = keys[i];
37
+
38
+ // check hbs
39
+ if (name.includes('{{')) {
40
+ console.log(hash)
41
+ }
42
+ const nameHBS = name.includes('{{') ? handlebarsSync.compile(name)({ ...data, hash }) : false;
43
+ // console.log(name, data, nameHBS)
44
+ skip[name] = name.includes('{{') && !nameHBS;
45
+ if (skip[name]) continue;
46
+
47
+ result.push(`<th scope="col">
48
+ <div class="px-[20px] py-[12px] text-start text-nowrap font-medium text-[14px] text-[#6B7280] ">
49
+ ${nameHBS || name}
50
+ </div>
51
+ </th>`)
52
+ }
53
+ result.push('</tr></thead>');
54
+
55
+ // body
56
+ for (let k = 0; k < data.length; k += 1) {
57
+ const row = data[k];
58
+ result.push('<tbody><tr class="border-t border-gray-200">');
59
+ const obj = { form: hash.form, table: hash.table, id: row[hash.id] }
60
+ const token = hash.table ? setToken({ ids: [JSON.stringify(obj)], uid: hash.uid, array: 1 })[0] : null;
61
+ for (let i = 0; i < keys.length; i += 2) {
62
+
63
+ const name = keys[i];
64
+ const key = keys[i + 1];
65
+ if (!key) continue;
66
+ if (skip[name]) continue;
67
+
68
+ const tokenData = key == 'actions' ? token : null;
69
+ const d1 = ['{{format', '{{select', '{{badge', '{{#ifCond'].filter(el => key.includes(el)).length ? await handlebars.compile(key)({ ...row, token, hash }) || '-' : null
70
+ result.push(`<td >
71
+ <div class="px-[20px] py-[12px] text-start font-medium text-[14px] text-black">${d1 || format(tokenData || row[key], key, row, hash)}</div>
72
+ </td>`);
73
+
74
+ }
75
+ // action token
76
+
77
+ result.push('</tr></tbody>');
78
+ }
79
+
80
+
81
+ return '<table class="min-w-full divide-y divide-gray-200"> ' + result.join('') + '</table>';
66
82
  }
@@ -1,6 +1,6 @@
1
-
2
-
3
- export default function button(token, title) {
4
- return `<button onclick="window.v3plugin.$form({ token: '${token}' })"
5
- class="inline-flex items-center px-2 py-1 text-sm font-medium text-white duration-300 bg-blue-600 border border-transparent rounded-lg gap-x-2 hover:bg-blue-700 hover:text-white">${title || 'Додати'}</button>`;
1
+
2
+
3
+ export default function button(token, title) {
4
+ return `<button onclick="window.v3plugin.$form({ token: '${token}' })"
5
+ class="inline-flex items-center px-2 py-1 text-sm font-medium text-white duration-300 bg-blue-600 border border-transparent rounded-lg gap-x-2 hover:bg-blue-700 hover:text-white">${title || 'Додати'}</button>`;
6
6
  }
@@ -0,0 +1,58 @@
1
+
2
+
3
+ import { getPG, handlebars } from '@opengis/fastify-table/utils.js';
4
+
5
+ const maxLimit = 100;
6
+
7
+ /**
8
+ * Відображення даних з таблиці або запиту до БД на сторінці. За запитом отримуємо масив json із рядків бази даних.
9
+ * Є можливість застосування синтаксису sql у змінній query для формування запиту до БД.
10
+ *
11
+ * @summary Відображення контенту на сторінці. Є можливість застосування синтаксису sql у змінній query.
12
+ * @priority 5
13
+ * @type helper
14
+ * @alias contentList
15
+ * @example
16
+ * {{#contentList table="help.doc_function" query="type='api'" sql1=1 limit=1}}{{#each rows}}{{{JSON 2 this}}}{{/each}}{{/contentList}}
17
+ * @example
18
+ * {{#contentList table="help.doc_function" sql1=1 query="name like '%form%'" limit=1}}{{#each rows}}{{{JSON 2 this}}}{{/each}}{{/contentList}}
19
+ * @example
20
+ * {{#contentList table="help.article" sql=1 query="module='CORE'" limit=1}}{{#each rows}}{{{JSON 2 this}}}{{/each}}{{/contentList}}
21
+ * @param {String} table Таблиця в базі або конфіг таблиця
22
+ * @param {String} query Запит до бази
23
+ * @param {Number} limit Кількість рядків на сторінці
24
+ * @param {String} sql Вивід sql запиту
25
+ * @returns {String} Returns HTML
26
+ */
27
+ export default async function contentList(options) {
28
+ const { table, limit, query, order, sql, debug } = options.hash;
29
+ if (!table) { return 'Table undefined'; }
30
+
31
+ try {
32
+ const pg = getPG();
33
+
34
+ const hasBrackets = table.trim().startsWith('(') && table.trim().endsWith(')');
35
+
36
+ const where = `where ${query ? query : '1=1'}`;
37
+ const _limit = limit !== undefined && limit !== null ? Math.min(maxLimit, +limit) : 15;
38
+ const _order = order ? `order by ${order}` : '';
39
+
40
+ const SQL = `select *,${pg.pk[table] || '1'}::text from ${hasBrackets ? table + ' t' : table} ${where} ${_order} limit ${_limit}`;
41
+ const compiledSQL = SQL.includes('{{') ? await handlebars.compile(SQL)({ ...options.data.root, hash: options.hash, opt: options.hash }) : SQL;
42
+
43
+ if (sql) {
44
+ return compiledSQL.replaceAll('&', '&amp;').replaceAll('<', '&lt;').replaceAll('>', '&gt;').replaceAll('"', '&quot;')
45
+ .replaceAll("'", '&#039;');
46
+ }
47
+ const { rows } = await pg.query(compiledSQL);
48
+ const data = { rows, total: rows.length, ...options.data?.root };
49
+
50
+ if (debug) {
51
+ return JSON.stringify(data, null, 2);
52
+ }
53
+
54
+ return options.fn(data);
55
+ } catch (err) {
56
+ return `Сталася помилка, зверніться до відділу підтримки.<!-- err: ${err.toString()} -->`;
57
+ }
58
+ };
@@ -0,0 +1,101 @@
1
+ /**
2
+ * Перетинає два масиви
3
+ *
4
+ * @example
5
+ * // returns [1, 4, 5, 6]
6
+ * intersect([1,2,3,4,5,6],[1,4,5,6,7,8,9,11])
7
+ * @param {Array} a
8
+ * @param {Array} b
9
+ * @returns {Array} Returns new intersect array
10
+ */
11
+ function intersect(a, b) {
12
+ let aN = a; let bN = b;
13
+ if (b.length > a.length) {
14
+ [aN, bN] = [bN, aN];
15
+ }
16
+ return aN.filter((e) => bN.includes(e));
17
+ }
18
+
19
+ /**
20
+ * Створення шаблона або його частини внаслідок перевірки значення із веб-запиту та заздалегідь прописаного значення.
21
+ * Дозволяє змінювати наповнення сторінки через ряд перевірок. Є можливість внесення додаткової умови - що робити, коли умова не виконується.
22
+ *
23
+ * @summary Перевірка двох значень та виконання коду при виконанні умови, а також у всіх інших випадках.
24
+ * @priority 5
25
+ * @alias ifCond
26
+ * @type helper
27
+ * @tag condition
28
+ * @example
29
+ * {{#ifCond @root.req.domain 'in' 'help.softpro.ua,123'}} {{select user.uid data="get_full_uid"}} {{^}} Умова не виконана {{/ifCond}}
30
+ * @example
31
+ * {{#ifCond "1234567890" 'in' @root.user.group_list}} 1=1 {{^}} uid='{{uid}}' {{/ifCond}}
32
+ * @example
33
+ * {{#ifCond 'debug' 'in' @root.setting.core.setting}}Умова виконана{{^}}Не виконана умова{{/ifCond}}
34
+ * @param {Array} args Параметри для значень і умов
35
+ * @param {Array} args[0]] Перше значення
36
+ * @param {Array} args[1]] Оператор
37
+ * @param {Array} args[2]] Друге значення
38
+ * @returns {String} Returns HTML
39
+ */
40
+ export default function ifCond(v1, operator, v2, options) {
41
+ const __obj = this;
42
+
43
+ switch (operator) {
44
+ case '==':
45
+ return (v1 == v2) ? options.fn(__obj) : options.inverse(__obj);
46
+ case '!=':
47
+ return (v1 != v2) ? options.fn(__obj) : options.inverse(__obj);
48
+ case '===':
49
+ return (v1 === v2) ? options.fn(__obj) : options.inverse(__obj);
50
+ case '!==':
51
+ return (v1 !== v2) ? options.fn(__obj) : options.inverse(__obj);
52
+ case '&&':
53
+ return (v1 && v2) ? options.fn(__obj) : options.inverse(__obj);
54
+ case '||':
55
+ return (v1 || v2) ? options.fn(__obj) : options.inverse(__obj);
56
+ case '<':
57
+ return (v1 < v2) ? options.fn(__obj) : options.inverse(__obj);
58
+ case '<=':
59
+ return (v1 <= v2) ? options.fn(__obj) : options.inverse(__obj);
60
+ case '>':
61
+ return (v1 > v2) ? options.fn(__obj) : options.inverse(__obj);
62
+ case '>=':
63
+ return (v1 >= v2) ? options.fn(__obj) : options.inverse(__obj);
64
+ case '&':
65
+ return intersect(v1, v2).length !== 0
66
+ ? options.fn(__obj)
67
+ : options.inverse(__obj);
68
+ case '!~':
69
+ return (v1 || '').indexOf(v2) === -1
70
+ ? options.fn(__obj)
71
+ : options.inverse(__obj);
72
+ case '~':
73
+ return (v1 || '').indexOf(v2) !== -1
74
+ ? options.fn(__obj)
75
+ : options.inverse(__obj);
76
+ case 'period':
77
+ return (new Date(v1) < new Date() && new Date(v2) > new Date())
78
+ ? options.fn(__obj)
79
+ : options.inverse(__obj);
80
+ case 'in': {
81
+ if (typeof v2 === 'string') v2 = v2.split(',').map(item => item.trim());
82
+
83
+ if (Array.isArray(v1)) {
84
+ return v1.some((value) => v2.includes(value.toString()))
85
+ ? options.fn(__obj)
86
+ : options.inverse(__obj);
87
+ }
88
+ return v2.includes(v1?.toString())
89
+ ? options.fn(__obj)
90
+ : options.inverse(__obj);
91
+ }
92
+ case 'not in': {
93
+ if (typeof v2 === 'string') v2 = v2.split(',').map(item => item.trim());
94
+ return !v2.includes(v1?.toString())
95
+ ? options.fn(__obj)
96
+ : options.inverse(__obj);
97
+ }
98
+ default:
99
+ return options.inverse(__obj);
100
+ }
101
+ }
@@ -0,0 +1,6 @@
1
+
2
+
3
+ export default function button(token, title) {
4
+ return `<button onclick="window.v3plugin.$form({ token: '${token}' })"
5
+ class="inline-flex items-center px-2 py-1 text-sm font-medium text-white duration-300 bg-blue-600 border border-transparent rounded-lg gap-x-2 hover:bg-blue-700 hover:text-white">${title || 'Додати'}</button>`;
6
+ }
@@ -0,0 +1,6 @@
1
+
2
+
3
+ export default function button(token, title) {
4
+ return `<button onclick="window.v3plugin.$api({ api: '/api/table/${token}', method:'delete',confirm: { title:'Підтвердити операцію', text: 'Ви впевнені що хочете вилучити запис?', cancel: 'Скасувати', confirm : 'Виконати'} })"
5
+ class="inline-flex items-center px-2 py-1 text-sm font-medium text-white duration-300 bg-red-600 border border-transparent rounded-lg gap-x-2 hover:bg-red-700 hover:text-white">${title || 'Вилучити'}</button>`;
6
+ }
@@ -1,15 +1,13 @@
1
- import { config } from '@opengis/fastify-table/utils.js';
2
-
3
- export default async function getAdminAccess({
4
- id, user = {},
5
- }) {
6
- if (!id) {
7
- return { message: 'not enough params: id', status: 400 };
8
- }
9
-
10
- if (config?.auth?.disable) return;
11
-
12
- if (!config?.local && user?.user_type?.includes('admin')) {
13
- return { message: 'access restricted: admin', status: 403 };
14
- }
1
+ import { config } from '@opengis/fastify-table/utils.js';
2
+
3
+ export default async function getAdminAccess({
4
+ id, user = {},
5
+ }) {
6
+ if (!id) {
7
+ return { message: 'not enough params: id', status: 400 };
8
+ }
9
+
10
+ if (!config?.local && !['admin'].includes(user.user_type, user.type)) {
11
+ return { message: 'access restricted: admin', status: 403 };
12
+ }
15
13
  }
@@ -1,6 +1,6 @@
1
- import getAdminAccess from './funcs/getAdminAccess.js';
2
-
3
- async function plugin(fastify) {
4
- // fastify.decorate('getAdminAccess', getAdminAccess);
5
- }
6
- export default plugin;
1
+ import getAdminAccess from './funcs/getAdminAccess.js';
2
+
3
+ async function plugin(fastify) {
4
+ // fastify.decorate('getAdminAccess', getAdminAccess);
5
+ }
6
+ export default plugin;