@opengis/admin 0.2.22 → 0.2.24
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 +74 -74
- package/config.js +4 -4
- package/dist/{IconChevronDown-C6z84v50.js → IconChevronDown-YiScKeCD.js} +1 -1
- package/dist/{add-page-xwsnaHWx.js → add-page-BItu_AHs.js} +1 -1
- package/dist/{admin-interface-BfW6K5Kr.js → admin-interface-BLjLejF-.js} +296 -337
- package/dist/{admin-view-xjz2kCnj.js → admin-view-DhQnq5_I.js} +3 -3
- package/dist/admin.js +1 -1
- package/dist/admin.umd.cjs +58 -58
- package/dist/assets/logo.svg +41 -41
- package/dist/{card-view-DE8P5Jv2.js → card-view-CfqOZwH-.js} +1 -1
- package/dist/{edit-page-CFaYbjcN.js → edit-page-IMNYnSVY.js} +1 -1
- package/dist/{import-file-CvC0ITeC.js → import-file-ClYLtoYl.js} +9544 -9437
- 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 +3 -3
- package/module/settings/card/admin.roles.table/general_info.hbs +1 -1
- package/module/settings/card/admin.roles.table/index.yml +21 -21
- package/module/settings/card/admin.roles.table/users.hbs +6 -6
- 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 +11 -11
- package/module/settings/card/admin.routes.table/users.hbs +16 -16
- package/module/settings/card/admin.users.table/context.hbs +14 -14
- package/module/settings/card/admin.users.table/general_info.hbs +12 -12
- package/module/settings/card/admin.users.table/index.yml +22 -22
- package/module/settings/card/admin.users.table/last_login.hbs +9 -9
- package/module/settings/card/admin.users.table/logs.hbs +10 -10
- package/module/settings/card/admin.users.table/routes.hbs +7 -7
- package/module/settings/card/admin.users.table/user_roles.hbs +12 -12
- package/module/settings/cls/core.actions.json +17 -17
- 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 +71 -71
- 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.user_properties.form.json +15 -15
- package/module/settings/form/admin.user_roles.form.json +13 -13
- package/module/settings/form/admin.user_roles_card.form.json +13 -13
- package/module/settings/form/admin.users.form.json +153 -153
- package/module/settings/form/context.account_grants.form.json +23 -23
- 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 +84 -84
- 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 +42 -42
- package/module/settings/table/admin.custom_column.table.json +99 -99
- package/module/settings/table/admin.properties.table.json +39 -39
- package/module/settings/table/admin.roles.table.json +64 -64
- package/module/settings/table/admin.routes.table.json +73 -73
- package/module/settings/table/admin.rules.table.json +76 -76
- package/module/settings/table/admin.user_properties.table.json +34 -34
- package/module/settings/table/admin.user_roles.table.json +72 -72
- package/module/settings/table/admin.users.table.json +132 -132
- package/module/settings/table/context.account_grants.table.json +67 -67
- package/module/settings/table/context.account_users.table.json +37 -37
- package/package.json +84 -84
- package/plugin.js +29 -29
- package/server/helpers/core/badge.js +16 -16
- package/server/helpers/core/buttonHelper.js +21 -21
- package/server/helpers/core/select.js +48 -48
- package/server/helpers/core/token.js +18 -18
- package/server/helpers/index.js +29 -29
- package/server/helpers/list/buttonHelper.js +21 -21
- package/server/helpers/list/descriptionList.js +43 -43
- package/server/helpers/list/tableList.js +81 -81
- package/server/helpers/list/utils/button.js +5 -5
- 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 +5 -5
- package/server/helpers/utils/buttonDel.js +5 -5
- package/server/helpers/utils/buttonEdit.js +5 -5
- 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 +236 -236
- package/server/plugins/vite.js +71 -71
- package/server/routes/access/controllers/access.group.js +29 -29
- package/server/routes/access/controllers/access.group.post.js +49 -49
- package/server/routes/access/index.mjs +8 -8
- package/server/routes/access/schema.mjs +57 -57
- package/server/routes/calendar/controllers/calendar.data.js +87 -87
- package/server/routes/calendar/index.mjs +7 -7
- package/server/routes/calendar/schema.js +21 -21
- package/server/routes/data/controllers/cardData.js +105 -105
- 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 +29 -29
- package/server/routes/data/controllers/tableDataId.js +27 -27
- package/server/routes/data/controllers/tableFilter.js +67 -67
- 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 +17 -17
- package/server/routes/data/schema.js +54 -54
- package/server/routes/menu/controllers/getMenu.js +58 -58
- package/server/routes/menu/index.mjs +5 -5
- 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 +57 -57
- package/server/routes/notifications/index.mjs +27 -27
- package/server/routes/notifications/schema.js +16 -16
- package/server/routes/properties/controllers/admin.properties.get.js +29 -29
- package/server/routes/properties/controllers/user.properties.get.js +30 -30
- package/server/routes/properties/controllers/user.properties.post.js +30 -30
- package/server/routes/properties/funcs/getSettings.js +56 -56
- package/server/routes/properties/funcs/setSettings.js +44 -44
- package/server/routes/properties/funcs/utils/dataInsert.js +26 -26
- package/server/routes/properties/index.mjs +14 -14
- package/server/routes/properties/schema.js +10 -10
- package/server/routes/root.mjs +3 -3
- package/server/routes/templates/controllers/getTemplate.js +43 -43
- 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 +71 -71
- package/server/routes/user/controllers/user.cls.post.js +52 -52
- package/server/routes/user/controllers/user.info.js +17 -17
- package/server/routes/user/schema.js +14 -14
- package/server/routes/widget/controllers/utils/historyFormat.js +75 -75
- package/server/routes/widget/controllers/utils/obj2db.js +13 -13
- package/server/routes/widget/controllers/widget.del.js +41 -41
- package/server/routes/widget/controllers/widget.get.js +96 -96
- package/server/routes/widget/controllers/widget.set.js +76 -76
- package/server/routes/widget/index.mjs +11 -11
- 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.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/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 +29 -29
package/server/helpers/index.js
CHANGED
@@ -1,29 +1,29 @@
|
|
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
|
-
}
|
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
|
+
}
|
@@ -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
|
+
}
|
@@ -1,44 +1,44 @@
|
|
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>';
|
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>';
|
44
44
|
}
|
@@ -1,82 +1,82 @@
|
|
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>';
|
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>';
|
82
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
|
}
|
@@ -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
|
+
};
|