@opengis/admin 0.2.81 → 0.2.83

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 (137) hide show
  1. package/README.md +97 -97
  2. package/config.js +4 -4
  3. package/dist/{add-page-VWjSO8tB.js → add-page-DjV6f_jT.js} +1 -1
  4. package/dist/{admin-interface-DKCJEmgv.js → admin-interface-DAyLdquZ.js} +4 -4
  5. package/dist/{admin-view-CUJxtNoN.js → admin-view-DooY0sff.js} +2 -2
  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-DM7rFVXy.js → card-view-58mVfI5f.js} +1 -1
  10. package/dist/{edit-page-CbLwc_DQ.js → edit-page-Bg2NgUpM.js} +1 -1
  11. package/dist/{import-file-Blg4So6f.js → import-file-BHcTcjJq.js} +6003 -5975
  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.table_properties.table/custom_columns.hbs +23 -0
  20. package/module/settings/card/admin.table_properties.table/custom_filters.hbs +1 -0
  21. package/module/settings/card/admin.table_properties.table/index.yml +13 -0
  22. package/module/settings/card/admin.table_properties.table/info.hbs +18 -0
  23. package/module/settings/cls/core.actions.json +17 -17
  24. package/module/settings/cls/core.scope.json +13 -13
  25. package/module/settings/cls/properties.site_status.json +13 -13
  26. package/module/settings/cls/properties.widget_status.json +13 -13
  27. package/module/settings/cls/users.user_type.json +13 -13
  28. package/module/settings/cls/yes_no.json +11 -11
  29. package/module/settings/form/admin.accounts.form.json +13 -13
  30. package/module/settings/form/admin.properties.form.json +15 -15
  31. package/module/settings/form/admin.roles.form.json +21 -21
  32. package/module/settings/form/admin.table_properties.form.json +20 -0
  33. package/module/settings/form/admin.user_properties.form.json +15 -15
  34. package/module/settings/form/admin.user_roles_card.form.json +13 -13
  35. package/module/settings/interface/admin.properties.json +4 -4
  36. package/module/settings/interface/admin.roles.json +4 -4
  37. package/module/settings/interface/admin.routes.json +4 -4
  38. package/module/settings/interface/admin.users.json +4 -4
  39. package/module/settings/menu.json +7 -32
  40. package/module/settings/select/core.routes.sql +1 -1
  41. package/module/settings/select/core.user_mentioned.sql +1 -1
  42. package/module/settings/select/core.user_uid.sql +1 -1
  43. package/module/settings/table/admin.properties.table.json +39 -39
  44. package/module/settings/table/admin.table_properties.table.json +38 -0
  45. package/module/settings/table/admin.user_properties.table.json +34 -34
  46. package/module/settings/table/auth.logs.table.json +98 -0
  47. package/package.json +8 -7
  48. package/plugin.js +29 -29
  49. package/server/helpers/core/badge.js +16 -16
  50. package/server/helpers/core/buttonHelper.js +21 -21
  51. package/server/helpers/core/select.js +48 -48
  52. package/server/helpers/core/token.js +18 -18
  53. package/server/helpers/index.js +31 -31
  54. package/server/helpers/list/buttonHelper.js +21 -21
  55. package/server/helpers/list/tableList.js +1 -1
  56. package/server/helpers/list/utils/button.js +5 -5
  57. package/server/helpers/temp/contentList.js +58 -58
  58. package/server/helpers/temp/ifCond.js +101 -101
  59. package/server/helpers/utils/button.js +5 -5
  60. package/server/plugins/access/index.mjs +6 -6
  61. package/server/plugins/adminHook.js +81 -81
  62. package/server/plugins/cron.js +10 -10
  63. package/server/plugins/docs.js +28 -28
  64. package/server/plugins/vite.js +71 -71
  65. package/server/routes/access/controllers/access.group.js +29 -29
  66. package/server/routes/access/controllers/access.group.post.js +49 -49
  67. package/server/routes/access/index.mjs +11 -11
  68. package/server/routes/access/schema.mjs +67 -67
  69. package/server/routes/calendar/controllers/calendar.data.js +125 -125
  70. package/server/routes/calendar/index.mjs +7 -7
  71. package/server/routes/calendar/schema.js +21 -21
  72. package/server/routes/data/controllers/cardData.js +106 -106
  73. package/server/routes/data/controllers/cardTabData.js +49 -49
  74. package/server/routes/data/controllers/funcs/getFilterSQL/index.js +92 -92
  75. package/server/routes/data/controllers/funcs/getFilterSQL/util/formatValue.js +170 -170
  76. package/server/routes/data/controllers/funcs/getFilterSQL/util/getCustomQuery.js +13 -13
  77. package/server/routes/data/controllers/funcs/getFilterSQL/util/getFilterQuery.js +64 -64
  78. package/server/routes/data/controllers/funcs/getFilterSQL/util/getOptimizedQuery.js +12 -12
  79. package/server/routes/data/controllers/funcs/getFilterSQL/util/getTableSql.js +34 -34
  80. package/server/routes/data/controllers/tableData.js +29 -29
  81. package/server/routes/data/controllers/tableDataId.js +27 -27
  82. package/server/routes/data/controllers/tableFilter.js +92 -92
  83. package/server/routes/data/controllers/tokenInfo.js +9 -9
  84. package/server/routes/data/controllers/utils/assignTokens.js +30 -30
  85. package/server/routes/data/controllers/utils/conditions.js +20 -20
  86. package/server/routes/data/controllers/utils/getColumns.js +8 -8
  87. package/server/routes/data/index.mjs +20 -20
  88. package/server/routes/data/schema.js +54 -54
  89. package/server/routes/menu/controllers/getMenu.js +1 -1
  90. package/server/routes/menu/index.mjs +5 -5
  91. package/server/routes/notifications/controllers/readNotifications.js +27 -27
  92. package/server/routes/notifications/controllers/testEmail.js +35 -35
  93. package/server/routes/notifications/controllers/userNotifications.js +53 -53
  94. package/server/routes/notifications/funcs/addNotification.js +21 -21
  95. package/server/routes/notifications/funcs/sendNotification.js +92 -92
  96. package/server/routes/notifications/hook/onWidgetSet.js +57 -57
  97. package/server/routes/notifications/index.mjs +27 -27
  98. package/server/routes/notifications/schema.js +16 -16
  99. package/server/routes/print/controllers/cardPrint.js +130 -130
  100. package/server/routes/properties/controllers/admin.properties.get.js +29 -29
  101. package/server/routes/properties/controllers/user.properties.get.js +30 -30
  102. package/server/routes/properties/controllers/user.properties.post.js +30 -30
  103. package/server/routes/properties/funcs/getSettings.js +56 -56
  104. package/server/routes/properties/funcs/setSettings.js +44 -44
  105. package/server/routes/properties/funcs/utils/dataInsert.js +26 -26
  106. package/server/routes/properties/index.mjs +14 -14
  107. package/server/routes/properties/schema.js +10 -10
  108. package/server/routes/root.mjs +3 -3
  109. package/server/routes/templates/controllers/getTemplate.js +49 -49
  110. package/server/routes/templates/index.mjs +16 -16
  111. package/server/routes/templates/schema.js +8 -8
  112. package/server/routes/user/controllers/user.cls.id.js +14 -14
  113. package/server/routes/user/controllers/user.cls.js +71 -71
  114. package/server/routes/user/controllers/user.info.js +17 -17
  115. package/server/routes/user/schema.js +14 -14
  116. package/server/routes/widget/controllers/utils/obj2db.js +13 -13
  117. package/server/routes/widget/controllers/widget.del.js +47 -47
  118. package/server/routes/widget/controllers/widget.get.js +103 -103
  119. package/server/routes/widget/controllers/widget.set.js +76 -76
  120. package/server/routes/widget/index.mjs +11 -11
  121. package/server/routes/widget/schema.js +12 -12
  122. package/server/templates/cls/itree.recrzone_category.json +73 -73
  123. package/server/templates/cls/test.json +9 -9
  124. package/server/templates/form/admin.user_cls.data.form.json +49 -49
  125. package/server/templates/form/admin.user_group_rel.form.json +21 -21
  126. package/server/templates/form/cp_building.form.json +32 -32
  127. package/server/templates/form/form-user-pass.json +10 -10
  128. package/server/templates/form/form-user_group.json +39 -39
  129. package/server/templates/form/form-users.json +156 -156
  130. package/server/templates/form/user_group_access.form.json +22 -22
  131. package/server/templates/pt/card-print.pt.hbs +19 -1
  132. package/server/templates/select/account_id.json +2 -2
  133. package/server/templates/select/account_id.sql +1 -1
  134. package/server/templates/table/gis.dataset.table.json +43 -43
  135. package/server/templates/table/management.user_group.table.json +112 -112
  136. package/server/templates/table/management.users.table.json +126 -126
  137. package/utils.js +29 -29
@@ -1,31 +1,31 @@
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
- handlebarsSync.registerHelper('button', buttonHelper);
28
- handlebars.registerHelper('ifCond', ifCond);
29
- handlebars.registerHelper('empty', () => { });
30
- handlebarsSync.registerHelper('empty', () => { });
31
- }
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
+ handlebarsSync.registerHelper('button', buttonHelper);
28
+ handlebars.registerHelper('ifCond', ifCond);
29
+ handlebars.registerHelper('empty', () => { });
30
+ handlebarsSync.registerHelper('empty', () => { });
31
+ }
@@ -1,21 +1,21 @@
1
- import buttonAdd from "../utils/buttonAdd.js";
2
- import buttonDel from "../utils/buttonDel.js";
3
- import buttonEdit from "../utils/buttonEdit.js";
4
- import button from "../utils/button.js";
5
- export default function buttonHelper(data, opt) {
6
- const { hash } = opt;
7
-
8
- // console.log(params)
9
-
10
- if (!hash.token) return "token empty";
11
- if (hash.add) {
12
- return buttonAdd(hash.token, hash.title);
13
- }
14
- if (hash.del) {
15
- return buttonDel(hash.token, hash.title);
16
- }
17
- if (hash.edit) {
18
- return buttonEdit(hash.token, hash.title);
19
- }
20
- return button(hash.token, hash.title);
21
- }
1
+ import buttonAdd from "../utils/buttonAdd.js";
2
+ import buttonDel from "../utils/buttonDel.js";
3
+ import buttonEdit from "../utils/buttonEdit.js";
4
+ import button from "../utils/button.js";
5
+ export default function buttonHelper(data, opt) {
6
+ const { hash } = opt;
7
+
8
+ // console.log(params)
9
+
10
+ if (!hash.token) return "token empty";
11
+ if (hash.add) {
12
+ return buttonAdd(hash.token, hash.title);
13
+ }
14
+ if (hash.del) {
15
+ return buttonDel(hash.token, hash.title);
16
+ }
17
+ if (hash.edit) {
18
+ return buttonEdit(hash.token, hash.title);
19
+ }
20
+ return button(hash.token, hash.title);
21
+ }
@@ -77,5 +77,5 @@ export default async function tableList(data, opt) {
77
77
  result.push('</tbody>');
78
78
 
79
79
 
80
- return '<div class="overflow-x-auto"><table class="min-w-full divide-y-2 divide-gray-200 bg-white text-xsmin-w-full divide-y-2 divide-gray-200 bg-white text-xs"> ' + result.join('') + '</table></div>';
80
+ return '<table class="min-w-full divide-y-2 divide-gray-200 bg-white text-xsmin-w-full divide-y-2 divide-gray-200 bg-white text-xs"> ' + result.join('') + '</table>';
81
81
  }
@@ -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
  }
@@ -1,58 +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
- };
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
+ };
@@ -1,101 +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
- }
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
+ }
@@ -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
  }
@@ -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;
@@ -1,81 +1,81 @@
1
- import fp from 'fastify-plugin';
2
- import fs from 'node:fs';
3
-
4
- import config from '../../config.js';
5
-
6
- // to export the decorators to the outer scope
7
-
8
- async function plugin(fastify) {
9
- fastify.decorate('config', config);
10
-
11
- // preSerialization
12
- fastify.addHook('preSerialization', async (req, reply, payload) => {
13
- if (req.url.includes('/suggest/') && !req.query.json) {
14
- return payload?.data;
15
- }
16
- if (payload?.redirect) {
17
- return reply.redirect(payload.redirect);
18
- }
19
- if (reply.sent) {
20
- return null;
21
- }
22
-
23
- if ([200, 400, 403, 409, 404, 500].includes(payload.status)) {
24
- reply.status(payload.status);
25
- }
26
- /* if (payload.headers) {
27
- reply.headers(payload.headers);
28
- } */
29
- if (payload?.buffer) {
30
- return payload.buffer;
31
- }
32
- if (payload?.file) {
33
- // const buffer = await readFile(payload.file);
34
- // return reply.send(buffer);
35
- const stream = fs.createReadStream(payload.file);
36
- return stream;
37
- // return reply.send(stream);
38
- }
39
-
40
- if (payload?.message) {
41
- return payload.message;
42
- }
43
- return payload;
44
- });
45
-
46
- // preValidation
47
- fastify.addHook('preValidation', async (req) => {
48
- const parseRawBody = ['POST', 'PUT'].includes(req.method) && req.body && typeof req.body === 'string'
49
- && req.body.trim(/\r\n/g).startsWith('{')
50
- && req.body.trim(/\r\n/g).endsWith('}');
51
- if (parseRawBody) {
52
- try {
53
- req.body = JSON.parse(req.body || '{}');
54
- }
55
- catch (err) {
56
- // throw new Error('invalid body');
57
- // return { error: 'invalid body', status: 400 };
58
- }
59
- }
60
- });
61
-
62
- // allow upload file
63
- const kIsMultipart = Symbol.for('[FastifyMultipart.isMultipart]');
64
- fastify.addContentTypeParser('multipart', (request, _, done) => {
65
- request[kIsMultipart] = true;
66
- done(null);
67
- });
68
-
69
- // parse Body
70
- function contentParser(req, body, done) {
71
- const parseBody = decodeURIComponent(body.toString()).split('&').reduce((acc, el) => {
72
- const [key, val] = el.split('=');
73
- return { ...acc, [key]: val };
74
- }, {});
75
- done(null, parseBody);
76
- }
77
-
78
- fastify.addContentTypeParser('application/x-www-form-urlencoded', { parseAs: 'buffer' }, contentParser);
79
- }
80
-
81
- export default fp(plugin);
1
+ import fp from 'fastify-plugin';
2
+ import fs from 'node:fs';
3
+
4
+ import config from '../../config.js';
5
+
6
+ // to export the decorators to the outer scope
7
+
8
+ async function plugin(fastify) {
9
+ fastify.decorate('config', config);
10
+
11
+ // preSerialization
12
+ fastify.addHook('preSerialization', async (req, reply, payload) => {
13
+ if (req.url.includes('/suggest/') && !req.query.json) {
14
+ return payload?.data;
15
+ }
16
+ if (payload?.redirect) {
17
+ return reply.redirect(payload.redirect);
18
+ }
19
+ if (reply.sent) {
20
+ return null;
21
+ }
22
+
23
+ if ([200, 400, 403, 409, 404, 500].includes(payload.status)) {
24
+ reply.status(payload.status);
25
+ }
26
+ /* if (payload.headers) {
27
+ reply.headers(payload.headers);
28
+ } */
29
+ if (payload?.buffer) {
30
+ return payload.buffer;
31
+ }
32
+ if (payload?.file) {
33
+ // const buffer = await readFile(payload.file);
34
+ // return reply.send(buffer);
35
+ const stream = fs.createReadStream(payload.file);
36
+ return stream;
37
+ // return reply.send(stream);
38
+ }
39
+
40
+ if (payload?.message) {
41
+ return payload.message;
42
+ }
43
+ return payload;
44
+ });
45
+
46
+ // preValidation
47
+ fastify.addHook('preValidation', async (req) => {
48
+ const parseRawBody = ['POST', 'PUT'].includes(req.method) && req.body && typeof req.body === 'string'
49
+ && req.body.trim(/\r\n/g).startsWith('{')
50
+ && req.body.trim(/\r\n/g).endsWith('}');
51
+ if (parseRawBody) {
52
+ try {
53
+ req.body = JSON.parse(req.body || '{}');
54
+ }
55
+ catch (err) {
56
+ // throw new Error('invalid body');
57
+ // return { error: 'invalid body', status: 400 };
58
+ }
59
+ }
60
+ });
61
+
62
+ // allow upload file
63
+ const kIsMultipart = Symbol.for('[FastifyMultipart.isMultipart]');
64
+ fastify.addContentTypeParser('multipart', (request, _, done) => {
65
+ request[kIsMultipart] = true;
66
+ done(null);
67
+ });
68
+
69
+ // parse Body
70
+ function contentParser(req, body, done) {
71
+ const parseBody = decodeURIComponent(body.toString()).split('&').reduce((acc, el) => {
72
+ const [key, val] = el.split('=');
73
+ return { ...acc, [key]: val };
74
+ }, {});
75
+ done(null, parseBody);
76
+ }
77
+
78
+ fastify.addContentTypeParser('application/x-www-form-urlencoded', { parseAs: 'buffer' }, contentParser);
79
+ }
80
+
81
+ export default fp(plugin);