@opengis/admin 0.3.23 → 0.3.25
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +97 -97
- package/config.js +4 -4
- package/dist/{add-page-2cPkdIAC.js → add-page-BI4K8Lzk.js} +1 -1
- package/dist/{admin-interface-D9Dx7QqK.js → admin-interface-DDP6KpGO.js} +226 -226
- package/dist/{admin-view-C_Ecdip-.js → admin-view-C--DkpIG.js} +3 -3
- package/dist/admin.js +1 -1
- package/dist/admin.umd.cjs +48 -48
- package/dist/assets/logo.svg +41 -41
- package/dist/{card-view-MuS2Gqq6.js → card-view-CPwz8aJg.js} +1 -1
- package/dist/{edit-page-Dr397YuE.js → edit-page-BsDJ8lKP.js} +1 -1
- package/dist/{import-file-CcRnsq1s.js → import-file-B8gDejaq.js} +5459 -5452
- package/dist/{profile-page-BrKTAsqO.js → profile-page-C5UftUwo.js} +1 -1
- package/dist/style.css +1 -1
- package/module/settings/card/admin.accounts.table/index.yml +7 -7
- package/module/settings/card/admin.accounts.table/rules.hbs +18 -18
- package/module/settings/card/admin.accounts.table/users.hbs +13 -13
- package/module/settings/card/admin.roles.table/access.hbs +11 -11
- package/module/settings/card/admin.roles.table/general_info.hbs +9 -9
- package/module/settings/card/admin.roles.table/index.yml +22 -22
- package/module/settings/card/admin.roles.table/users.hbs +12 -12
- package/module/settings/card/admin.routes.table/general_info.hbs +13 -13
- package/module/settings/card/admin.routes.table/groups.hbs +11 -11
- package/module/settings/card/admin.routes.table/index.yml +15 -15
- package/module/settings/card/admin.routes.table/users.hbs +16 -16
- package/module/settings/card/admin.table_properties.table/custom_columns.hbs +22 -22
- package/module/settings/card/admin.table_properties.table/index.yml +12 -12
- package/module/settings/card/admin.table_properties.table/info.hbs +17 -17
- package/module/settings/card/admin.users.table/general_info.hbs +18 -18
- package/module/settings/card/admin.users.table/index.yml +20 -20
- package/module/settings/card/admin.users.table/last_login.hbs +17 -17
- package/module/settings/card/admin.users.table/logs.hbs +16 -16
- package/module/settings/card/admin.users.table/routes.hbs +13 -13
- package/module/settings/card/admin.users.table/user_roles.hbs +35 -35
- package/module/settings/cls/change_type.json +13 -13
- package/module/settings/cls/core.actions.json +17 -17
- package/module/settings/cls/core.column_type.json +14 -14
- package/module/settings/cls/core.scope.json +13 -13
- package/module/settings/cls/properties.site_status.json +13 -13
- package/module/settings/cls/properties.widget_status.json +13 -13
- package/module/settings/cls/users.user_type.json +13 -13
- package/module/settings/cls/yes_no.json +11 -11
- package/module/settings/form/admin.accounts.form.json +13 -13
- package/module/settings/form/admin.custom_column.form.json +55 -55
- package/module/settings/form/admin.properties.form.json +15 -15
- package/module/settings/form/admin.roles.form.json +21 -21
- package/module/settings/form/admin.routes.form.json +25 -25
- package/module/settings/form/admin.rules.form.json +30 -30
- package/module/settings/form/admin.table_properties.form.json +19 -19
- package/module/settings/form/admin.user_properties.form.json +15 -15
- package/module/settings/form/admin.user_roles.form.json +24 -24
- package/module/settings/form/admin.user_roles_card.form.json +13 -13
- package/module/settings/form/admin.users.form.json +177 -177
- package/module/settings/form/admin.users_edit.form.json +145 -145
- package/module/settings/form/context.account_grants.form.json +24 -24
- package/module/settings/form/context.account_users.form.json +12 -12
- package/module/settings/form/user.user_roles.form.json +13 -13
- package/module/settings/interface/admin.properties.json +4 -4
- package/module/settings/interface/admin.roles.json +4 -4
- package/module/settings/interface/admin.routes.json +4 -4
- package/module/settings/interface/admin.users.json +4 -4
- package/module/settings/menu.json +72 -72
- package/module/settings/select/core.routes.sql +1 -1
- package/module/settings/select/core.user_mentioned.sql +1 -1
- package/module/settings/select/core.user_uid.sql +1 -1
- package/module/settings/table/admin.accounts.table.json +49 -49
- package/module/settings/table/admin.custom_column.table.json +100 -100
- package/module/settings/table/admin.properties.table.json +39 -39
- package/module/settings/table/admin.roles.table.json +77 -77
- package/module/settings/table/admin.routes.table.json +73 -73
- package/module/settings/table/admin.rules.table.json +77 -77
- package/module/settings/table/admin.table_properties.table.json +37 -37
- package/module/settings/table/admin.user_properties.table.json +34 -34
- package/module/settings/table/admin.user_roles.table.json +74 -74
- package/module/settings/table/admin.users.table.json +135 -135
- package/module/settings/table/context.account_grants.table.json +88 -88
- package/module/settings/table/context.account_users.table.json +53 -53
- package/module/settings/table/log.table_changes.table.json +100 -100
- package/package.json +102 -102
- package/plugin.js +30 -30
- package/server/helpers/core/badge.js +16 -16
- package/server/helpers/core/buttonHelper.js +21 -21
- package/server/helpers/core/coalesce.js +7 -7
- package/server/helpers/core/select.js +48 -48
- package/server/helpers/core/token.js +18 -18
- package/server/helpers/index.js +40 -40
- package/server/helpers/list/buttonHelper.js +21 -21
- package/server/helpers/list/descriptionList.js +45 -45
- package/server/helpers/list/tableList.js +82 -82
- package/server/helpers/list/utils/button.js +5 -5
- package/server/helpers/list/utils/buttonDel.js +12 -12
- package/server/helpers/list/utils/buttonEdit.js +14 -14
- package/server/helpers/temp/contentList.js +58 -58
- package/server/helpers/temp/ifCond.js +101 -101
- package/server/helpers/utils/button.js +5 -5
- package/server/helpers/utils/buttonAdd.js +6 -6
- package/server/helpers/utils/buttonDel.js +6 -6
- package/server/helpers/utils/buttonEdit.js +5 -5
- package/server/helpers/utils/mdToHTML.js +17 -17
- package/server/helpers/utils/paddingNumber.js +3 -3
- package/server/plugins/access/funcs/getAdminAccess.js +12 -12
- package/server/plugins/access/index.mjs +6 -6
- package/server/plugins/adminHook.js +81 -81
- package/server/plugins/cron.js +10 -10
- package/server/plugins/docs.js +28 -28
- package/server/plugins/hook.js +276 -276
- package/server/plugins/vite.js +77 -77
- package/server/routes/access/controllers/access.group.js +29 -29
- package/server/routes/access/controllers/access.group.post.js +54 -54
- package/server/routes/access/controllers/access.interface.js +33 -33
- package/server/routes/access/index.mjs +11 -11
- package/server/routes/access/schema.mjs +67 -67
- package/server/routes/calendar/controllers/calendar.data.js +125 -125
- package/server/routes/calendar/index.mjs +7 -7
- package/server/routes/calendar/schema.js +21 -21
- package/server/routes/data/controllers/cardData.js +127 -127
- package/server/routes/data/controllers/cardTabData.js +49 -49
- package/server/routes/data/controllers/funcs/getFilterSQL/index.js +92 -92
- package/server/routes/data/controllers/funcs/getFilterSQL/util/formatValue.js +170 -170
- package/server/routes/data/controllers/funcs/getFilterSQL/util/getCustomQuery.js +13 -13
- package/server/routes/data/controllers/funcs/getFilterSQL/util/getFilterQuery.js +64 -64
- package/server/routes/data/controllers/funcs/getFilterSQL/util/getOptimizedQuery.js +12 -12
- package/server/routes/data/controllers/funcs/getFilterSQL/util/getTableSql.js +34 -34
- package/server/routes/data/controllers/tableData.js +31 -31
- package/server/routes/data/controllers/tableDataId.js +27 -27
- package/server/routes/data/controllers/tableFilter.js +9 -9
- package/server/routes/data/controllers/tableInfo.js +112 -112
- package/server/routes/data/controllers/tokenInfo.js +9 -9
- package/server/routes/data/controllers/utils/assignTokens.js +30 -30
- package/server/routes/data/controllers/utils/conditions.js +20 -20
- package/server/routes/data/controllers/utils/getColumns.js +8 -8
- package/server/routes/data/index.mjs +20 -20
- package/server/routes/data/schema.js +54 -54
- package/server/routes/dblist/controllers/readItems.js +20 -20
- package/server/routes/dblist/controllers/setItem.js +22 -22
- package/server/routes/dblist/index.mjs +18 -18
- package/server/routes/dblist/utils/formatData.js +7 -7
- package/server/routes/menu/controllers/getMenu.js +77 -77
- package/server/routes/menu/controllers/interfaces.js +20 -20
- package/server/routes/menu/index.mjs +7 -7
- package/server/routes/notifications/controllers/readNotifications.js +27 -27
- package/server/routes/notifications/controllers/testEmail.js +35 -35
- package/server/routes/notifications/controllers/userNotifications.js +53 -53
- package/server/routes/notifications/funcs/addNotification.js +21 -21
- package/server/routes/notifications/funcs/sendNotification.js +92 -92
- package/server/routes/notifications/hook/onWidgetSet.js +56 -56
- package/server/routes/notifications/index.mjs +26 -26
- package/server/routes/notifications/schema.js +16 -16
- package/server/routes/print/controllers/cardPrint.js +135 -135
- package/server/routes/print/controllers/printTemplate.add.js +37 -37
- package/server/routes/print/controllers/printTemplate.delete.js +29 -29
- package/server/routes/print/controllers/printTemplate.edit.js +42 -42
- package/server/routes/print/controllers/printTemplate.js +67 -67
- package/server/routes/print/controllers/printTemplateList.js +19 -19
- package/server/routes/print/controllers/printTemplatePreview.js +87 -87
- package/server/routes/print/index.mjs +19 -19
- package/server/routes/properties/controllers/admin.properties.get.js +31 -31
- package/server/routes/properties/controllers/table.properties.get.js +120 -120
- package/server/routes/properties/controllers/table.properties.post.js +115 -115
- package/server/routes/properties/controllers/user.properties.get.js +19 -19
- package/server/routes/properties/controllers/user.properties.post.js +10 -10
- package/server/routes/properties/index.mjs +21 -21
- package/server/routes/properties/schema.js +10 -10
- package/server/routes/properties/utils/dataInsert.js +26 -26
- package/server/routes/properties/utils/getColumnMetaData.js +17 -17
- package/server/routes/properties/utils/refreshData.js +128 -128
- package/server/routes/report/controllers/data.js +76 -76
- package/server/routes/report/controllers/list.js +18 -18
- package/server/routes/report/index.mjs +7 -7
- package/server/routes/report/utils/formatValue.js +179 -179
- package/server/routes/report/utils/getFilterQuery.js +67 -67
- package/server/routes/root.mjs +3 -3
- package/server/routes/templates/controllers/getTemplate.js +44 -44
- package/server/routes/templates/index.mjs +16 -16
- package/server/routes/templates/schema.js +8 -8
- package/server/routes/user/controllers/user.cls.id.js +14 -14
- package/server/routes/user/controllers/user.cls.js +72 -72
- package/server/routes/user/controllers/user.cls.post.js +54 -54
- package/server/routes/user/controllers/user.info.js +17 -17
- package/server/routes/user/schema.js +14 -14
- package/server/routes/util/controllers/code.generator.js +89 -89
- package/server/routes/util/index.mjs +5 -5
- package/server/routes/widget/controllers/widget.del.js +63 -63
- package/server/routes/widget/controllers/widget.get.js +125 -125
- package/server/routes/widget/controllers/widget.set.js +84 -84
- package/server/routes/widget/hook/onWidgetSet.js +12 -12
- package/server/routes/widget/index.mjs +16 -16
- package/server/routes/widget/schema.js +12 -12
- package/server/templates/cls/itree.recrzone_category.json +73 -73
- package/server/templates/cls/test.json +9 -9
- package/server/templates/form/admin.profile.form.json +31 -31
- package/server/templates/form/admin.user_cls.data.form.json +49 -49
- package/server/templates/form/admin.user_group_rel.form.json +21 -21
- package/server/templates/form/cp_building.form.json +32 -32
- package/server/templates/form/form-user-pass.json +10 -10
- package/server/templates/form/form-user_group.json +39 -39
- package/server/templates/form/form-users.json +156 -156
- package/server/templates/form/user_group_access.form.json +22 -22
- package/server/templates/pt/card-print.pt.hbs +245 -245
- package/server/templates/select/account_id.json +2 -2
- package/server/templates/table/gis.dataset.table.json +43 -43
- package/server/templates/table/management.user_group.table.json +112 -112
- package/server/templates/table/management.users.table.json +126 -126
- package/utils.js +26 -26
@@ -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('&', '&').replaceAll('<', '<').replaceAll('>', '>').replaceAll('"', '"')
|
45
|
-
.replaceAll("'", ''');
|
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('&', '&').replaceAll('<', '<').replaceAll('>', '>').replaceAll('"', '"')
|
45
|
+
.replaceAll("'", ''');
|
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,7 +1,7 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
const newColor = 'blue'
|
4
|
-
export default function button(token, title) {
|
5
|
-
return `<button onclick="window.v3plugin.$form({ token: '${token}' })"
|
6
|
-
class="px-2 py-1 inline-flex border-solid justify-center items-center gap-2 rounded-md font-semibold focus:outline-none text-sm transition-all border border-transparent hover:text-white ring-offset-white bg-${newColor}-100 text-${newColor}-500 hover:bg-${newColor}-500 focus:ring-${newColor}-500">${title || 'Додати'}</button>`;
|
1
|
+
|
2
|
+
|
3
|
+
const newColor = 'blue'
|
4
|
+
export default function button(token, title) {
|
5
|
+
return `<button onclick="window.v3plugin.$form({ token: '${token}' })"
|
6
|
+
class="px-2 py-1 inline-flex border-solid justify-center items-center gap-2 rounded-md font-semibold focus:outline-none text-sm transition-all border border-transparent hover:text-white ring-offset-white bg-${newColor}-100 text-${newColor}-500 hover:bg-${newColor}-500 focus:ring-${newColor}-500">${title || 'Додати'}</button>`;
|
7
7
|
}
|
@@ -1,7 +1,7 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
const newColor = 'red'
|
4
|
-
export default function button(token, title) {
|
5
|
-
return `<button onclick="window.v3plugin.$api({ api: '/api/table/${token}', method:'delete',confirm: { title:'Підтвердити операцію', text: 'Ви впевнені що хочете вилучити запис?', cancel: 'Скасувати', confirm : 'Виконати'} })"
|
6
|
-
class="px-2 py-1 inline-flex border-solid justify-center items-center gap-2 rounded-md font-semibold focus:outline-none text-sm transition-all border border-transparent hover:text-white ring-offset-white bg-${newColor}-100 text-${newColor}-500 hover:bg-${newColor}-500 focus:ring-${newColor}-500">${title || 'Вилучити'}</button>`;
|
1
|
+
|
2
|
+
|
3
|
+
const newColor = 'red'
|
4
|
+
export default function button(token, title) {
|
5
|
+
return `<button onclick="window.v3plugin.$api({ api: '/api/table/${token}', method:'delete',confirm: { title:'Підтвердити операцію', text: 'Ви впевнені що хочете вилучити запис?', cancel: 'Скасувати', confirm : 'Виконати'} })"
|
6
|
+
class="px-2 py-1 inline-flex border-solid justify-center items-center gap-2 rounded-md font-semibold focus:outline-none text-sm transition-all border border-transparent hover:text-white ring-offset-white bg-${newColor}-100 text-${newColor}-500 hover:bg-${newColor}-500 focus:ring-${newColor}-500">${title || 'Вилучити'}</button>`;
|
7
7
|
}
|
@@ -1,6 +1,6 @@
|
|
1
|
-
|
2
|
-
const newColor = 'blue'
|
3
|
-
export default function button(token, title) {
|
4
|
-
return `<button onclick="window.v3plugin.$form({ token: '${token}' })"
|
5
|
-
class="px-2 py-1 inline-flex border-solid justify-center items-center gap-2 rounded-md font-semibold focus:outline-none text-sm transition-all border border-transparent hover:text-white ring-offset-white bg-${newColor}-100 text-${newColor}-500 hover:bg-${newColor}-500 focus:ring-${newColor}-500">${title || 'Редагувати'}</button>`;
|
1
|
+
|
2
|
+
const newColor = 'blue'
|
3
|
+
export default function button(token, title) {
|
4
|
+
return `<button onclick="window.v3plugin.$form({ token: '${token}' })"
|
5
|
+
class="px-2 py-1 inline-flex border-solid justify-center items-center gap-2 rounded-md font-semibold focus:outline-none text-sm transition-all border border-transparent hover:text-white ring-offset-white bg-${newColor}-100 text-${newColor}-500 hover:bg-${newColor}-500 focus:ring-${newColor}-500">${title || 'Редагувати'}</button>`;
|
6
6
|
}
|
@@ -1,17 +1,17 @@
|
|
1
|
-
import md from 'markdown-it';
|
2
|
-
|
3
|
-
const md1 = md({ html: true });
|
4
|
-
|
5
|
-
/**
|
6
|
-
* Перетворення з файла readme.md до формату HTML.
|
7
|
-
* Потрабно вставити в хелпер шлях до файла або текст readme.md і за допомогою бібліотеки markdown-it перетвориться в HTML.
|
8
|
-
|
9
|
-
* @returns {String} Returns HTML
|
10
|
-
*/
|
11
|
-
export default function mdToHTML(data, options) {
|
12
|
-
// auto detect HTML or MD
|
13
|
-
// const result = md().render(data);
|
14
|
-
if (!data) return 'empty data';
|
15
|
-
const result = md1.render(data);
|
16
|
-
return result;
|
17
|
-
};
|
1
|
+
import md from 'markdown-it';
|
2
|
+
|
3
|
+
const md1 = md({ html: true });
|
4
|
+
|
5
|
+
/**
|
6
|
+
* Перетворення з файла readme.md до формату HTML.
|
7
|
+
* Потрабно вставити в хелпер шлях до файла або текст readme.md і за допомогою бібліотеки markdown-it перетвориться в HTML.
|
8
|
+
|
9
|
+
* @returns {String} Returns HTML
|
10
|
+
*/
|
11
|
+
export default function mdToHTML(data, options) {
|
12
|
+
// auto detect HTML or MD
|
13
|
+
// const result = md().render(data);
|
14
|
+
if (!data) return 'empty data';
|
15
|
+
const result = md1.render(data);
|
16
|
+
return result;
|
17
|
+
};
|
@@ -1,4 +1,4 @@
|
|
1
|
-
export default function (num) {
|
2
|
-
const padding = arguments.length === 3 ? arguments[1] : 6;
|
3
|
-
return num.toLocaleString('en', { minimumIntegerDigits: padding, useGrouping: false })
|
1
|
+
export default function (num) {
|
2
|
+
const padding = arguments.length === 3 ? arguments[1] : 6;
|
3
|
+
return num.toLocaleString('en', { minimumIntegerDigits: padding, useGrouping: false })
|
4
4
|
}
|
@@ -1,13 +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?.local && !['admin'].includes(user.user_type, user.type)) {
|
11
|
-
return { message: 'access restricted: admin', status: 403 };
|
12
|
-
}
|
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
|
+
}
|
13
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;
|
@@ -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);
|
package/server/plugins/cron.js
CHANGED
@@ -1,11 +1,11 @@
|
|
1
|
-
//import { addCron } from '@opengis/fastify-table/utils.js';
|
2
|
-
|
3
|
-
async function deleteOldNotifications({ pg }) {
|
4
|
-
const { rowCount } = pg?.pk?.['crm.notifications'] ? await pg.query('delete from crm.notifications where CURRENT_DATE - \'14 days\'::interval > cdate') : {};
|
5
|
-
return { rowCount };
|
6
|
-
}
|
7
|
-
|
8
|
-
export default async function cron(fastify) {
|
9
|
-
// addCron(deleteOldNotifications, 60 * 60 * 24, fastify);
|
10
|
-
// addCron(deleteOldNotifications, 60 * 1, fastify); // debug
|
1
|
+
//import { addCron } from '@opengis/fastify-table/utils.js';
|
2
|
+
|
3
|
+
async function deleteOldNotifications({ pg }) {
|
4
|
+
const { rowCount } = pg?.pk?.['crm.notifications'] ? await pg.query('delete from crm.notifications where CURRENT_DATE - \'14 days\'::interval > cdate') : {};
|
5
|
+
return { rowCount };
|
6
|
+
}
|
7
|
+
|
8
|
+
export default async function cron(fastify) {
|
9
|
+
// addCron(deleteOldNotifications, 60 * 60 * 24, fastify);
|
10
|
+
// addCron(deleteOldNotifications, 60 * 1, fastify); // debug
|
11
11
|
}
|