@opengis/admin 0.2.143 → 0.2.144
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-D5lJWSZt.js → add-page-DqAEM4wi.js} +1 -1
- package/dist/{admin-interface-9V9mx8hr.js → admin-interface-CP1bJ5OV.js} +2 -2
- package/dist/{admin-view-vhH7dO38.js → admin-view-UNkTut9K.js} +2 -2
- package/dist/admin.js +1 -1
- package/dist/admin.umd.cjs +47 -47
- package/dist/assets/logo.svg +41 -41
- package/dist/{card-view-xoIISSpq.js → card-view-CJMjRRV2.js} +1 -1
- package/dist/{edit-page-Dx9kwJcl.js → edit-page-BdXlecyS.js} +1 -1
- package/dist/{import-file-CUPX51_k.js → import-file-OsslhkRJ.js} +7040 -7017
- package/dist/{profile-page-CdYuNDgt.js → profile-page-C211CQGb.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.routes.table/groups.hbs +11 -11
- package/module/settings/card/admin.routes.table/users.hbs +16 -16
- 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.properties.form.json +15 -15
- package/module/settings/form/admin.roles.form.json +21 -21
- package/module/settings/form/admin.user_properties.form.json +15 -15
- package/module/settings/form/admin.user_roles_card.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/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.properties.table.json +39 -39
- package/module/settings/table/admin.user_properties.table.json +34 -34
- package/package.json +1 -1
- 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/list/buttonHelper.js +21 -21
- package/server/helpers/list/descriptionList.js +3 -10
- package/server/helpers/list/tableList.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/mdToHTML.js +17 -17
- 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/routes/access/controllers/access.group.js +29 -29
- package/server/routes/access/controllers/access.group.post.js +54 -54
- 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/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 +108 -108
- 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/getColumns.js +8 -8
- package/server/routes/data/index.mjs +20 -20
- package/server/routes/data/schema.js +54 -54
- 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/properties/schema.js +10 -10
- 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/root.mjs +3 -3
- package/server/routes/templates/controllers/getTemplate.js +49 -49
- 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.info.js +17 -17
- package/server/routes/user/schema.js +14 -14
- package/server/routes/widget/controllers/widget.del.js +47 -47
- 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.user_cls.data.form.json +49 -49
- package/server/templates/form/admin.user_group_rel.form.json +21 -21
- 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
@@ -1,35 +1,35 @@
|
|
1
|
-
{
|
2
|
-
"ua": "Налаштування користувача",
|
3
|
-
"key": "property_id",
|
4
|
-
"form": "admin.user_properties.form",
|
5
|
-
"table": "admin.user_properties",
|
6
|
-
"order": "cdate desc",
|
7
|
-
"access": "admin",
|
8
|
-
"actions": [
|
9
|
-
"add",
|
10
|
-
"edit",
|
11
|
-
"del"
|
12
|
-
],
|
13
|
-
"meta": {
|
14
|
-
"search": "property_key"
|
15
|
-
},
|
16
|
-
"columns": [
|
17
|
-
{
|
18
|
-
"name": "property_key",
|
19
|
-
"title": "Ключ",
|
20
|
-
"format": "text"
|
21
|
-
},
|
22
|
-
{
|
23
|
-
"name": "property_json",
|
24
|
-
"title": "Значення",
|
25
|
-
"format": "text"
|
26
|
-
}
|
27
|
-
],
|
28
|
-
"filters": [
|
29
|
-
{
|
30
|
-
"ua": "Ключ",
|
31
|
-
"name": "property_key",
|
32
|
-
"type": "text"
|
33
|
-
}
|
34
|
-
]
|
1
|
+
{
|
2
|
+
"ua": "Налаштування користувача",
|
3
|
+
"key": "property_id",
|
4
|
+
"form": "admin.user_properties.form",
|
5
|
+
"table": "admin.user_properties",
|
6
|
+
"order": "cdate desc",
|
7
|
+
"access": "admin",
|
8
|
+
"actions": [
|
9
|
+
"add",
|
10
|
+
"edit",
|
11
|
+
"del"
|
12
|
+
],
|
13
|
+
"meta": {
|
14
|
+
"search": "property_key"
|
15
|
+
},
|
16
|
+
"columns": [
|
17
|
+
{
|
18
|
+
"name": "property_key",
|
19
|
+
"title": "Ключ",
|
20
|
+
"format": "text"
|
21
|
+
},
|
22
|
+
{
|
23
|
+
"name": "property_json",
|
24
|
+
"title": "Значення",
|
25
|
+
"format": "text"
|
26
|
+
}
|
27
|
+
],
|
28
|
+
"filters": [
|
29
|
+
{
|
30
|
+
"ua": "Ключ",
|
31
|
+
"name": "property_key",
|
32
|
+
"type": "text"
|
33
|
+
}
|
34
|
+
]
|
35
35
|
}
|
package/package.json
CHANGED
@@ -1,16 +1,16 @@
|
|
1
|
-
import { getSelect } from "@opengis/fastify-table/utils.js";
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
export default async function badge(id, options) {
|
6
|
-
if (!id) return '-';
|
7
|
-
const data = options.hash?.data;
|
8
|
-
if (!data) return id;
|
9
|
-
const classifier = await getSelect(data);
|
10
|
-
if (!classifier?.arr) return id;
|
11
|
-
|
12
|
-
const item = classifier?.arr.find(el => el.id == id);
|
13
|
-
if (!item) return id;
|
14
|
-
return `<span style='color:${item.color || '#14b8a6'};border-color:${item.color || '#14b8a6'};' class="inline-flex items-center gap-x-1.5 py-1.5 px-3 rounded-full text-xs font-medium border border-teal-500 text-teal-500">${item.text}</span>`
|
15
|
-
|
16
|
-
}
|
1
|
+
import { getSelect } from "@opengis/fastify-table/utils.js";
|
2
|
+
|
3
|
+
|
4
|
+
|
5
|
+
export default async function badge(id, options) {
|
6
|
+
if (!id) return '-';
|
7
|
+
const data = options.hash?.data;
|
8
|
+
if (!data) return id;
|
9
|
+
const classifier = await getSelect(data);
|
10
|
+
if (!classifier?.arr) return id;
|
11
|
+
|
12
|
+
const item = classifier?.arr.find(el => el.id == id);
|
13
|
+
if (!item) return id;
|
14
|
+
return `<span style='color:${item.color || '#14b8a6'};border-color:${item.color || '#14b8a6'};' class="inline-flex items-center gap-x-1.5 py-1.5 px-3 rounded-full text-xs font-medium border border-teal-500 text-teal-500">${item.text}</span>`
|
15
|
+
|
16
|
+
}
|
@@ -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,8 +1,8 @@
|
|
1
|
-
export default function coalesce() {
|
2
|
-
for (let i = 0; i < arguments.length - 1; i += 1) {
|
3
|
-
if (arguments[i] || arguments[i] === 0) {
|
4
|
-
return arguments[i];
|
5
|
-
}
|
6
|
-
}
|
7
|
-
return null;
|
1
|
+
export default function coalesce() {
|
2
|
+
for (let i = 0; i < arguments.length - 1; i += 1) {
|
3
|
+
if (arguments[i] || arguments[i] === 0) {
|
4
|
+
return arguments[i];
|
5
|
+
}
|
6
|
+
}
|
7
|
+
return null;
|
8
8
|
}
|
@@ -1,48 +1,48 @@
|
|
1
|
-
import { getPG, getSelect } from "@opengis/fastify-table/utils.js";
|
2
|
-
const pg = getPG();
|
3
|
-
|
4
|
-
export default async function select(ids, options) {
|
5
|
-
if (!ids || (Array.isArray(ids) && ids.length === 0) || ids === '') {
|
6
|
-
return '';
|
7
|
-
}
|
8
|
-
|
9
|
-
const data = options.hash?.data;
|
10
|
-
if (!data && data !== false && data !== 0) return '';
|
11
|
-
try {
|
12
|
-
const idsArray = Array.isArray(ids) ? ids : [ids];
|
13
|
-
|
14
|
-
const classifier = await getSelect(data);
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
if (!classifier) return `Не знайдено класифікатор ${data}`;
|
19
|
-
|
20
|
-
const arr = classifier.arr || []
|
21
|
-
if (classifier.sql && typeof classifier.sql === 'string') {
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
const metaQuery = `SELECT * FROM (${classifier.sql})q LIMIT 0`;
|
26
|
-
const meta = await pg.query(metaQuery);
|
27
|
-
const idColumn = meta.fields[0].name;
|
28
|
-
const textColumn = meta.fields[1].name;
|
29
|
-
|
30
|
-
const sql = `SELECT "${idColumn}" AS id, "${textColumn}" AS text FROM (${classifier.sql}) q WHERE "${idColumn}" = ANY($1::text[])`;
|
31
|
-
const values = [idsArray.map(id => String(id))];
|
32
|
-
|
33
|
-
const { rows } = await pg.query(sql, values);
|
34
|
-
Object.assign(arr, rows)
|
35
|
-
|
36
|
-
}
|
37
|
-
if (!arr.length) return idsArray
|
38
|
-
|
39
|
-
const results = idsArray.map(id => {
|
40
|
-
const result = arr.find(el => String(el.id) == String(id));
|
41
|
-
return result ? result.text : '';
|
42
|
-
});
|
43
|
-
|
44
|
-
return results.filter(Boolean).join(', ');
|
45
|
-
} catch (error) {
|
46
|
-
return `Сталася помилка.<!-- err: ${error.toString()} -->`;
|
47
|
-
}
|
48
|
-
}
|
1
|
+
import { getPG, getSelect } from "@opengis/fastify-table/utils.js";
|
2
|
+
const pg = getPG();
|
3
|
+
|
4
|
+
export default async function select(ids, options) {
|
5
|
+
if (!ids || (Array.isArray(ids) && ids.length === 0) || ids === '') {
|
6
|
+
return '';
|
7
|
+
}
|
8
|
+
|
9
|
+
const data = options.hash?.data;
|
10
|
+
if (!data && data !== false && data !== 0) return '';
|
11
|
+
try {
|
12
|
+
const idsArray = Array.isArray(ids) ? ids : [ids];
|
13
|
+
|
14
|
+
const classifier = await getSelect(data);
|
15
|
+
|
16
|
+
|
17
|
+
|
18
|
+
if (!classifier) return `Не знайдено класифікатор ${data}`;
|
19
|
+
|
20
|
+
const arr = classifier.arr || []
|
21
|
+
if (classifier.sql && typeof classifier.sql === 'string') {
|
22
|
+
|
23
|
+
|
24
|
+
|
25
|
+
const metaQuery = `SELECT * FROM (${classifier.sql})q LIMIT 0`;
|
26
|
+
const meta = await pg.query(metaQuery);
|
27
|
+
const idColumn = meta.fields[0].name;
|
28
|
+
const textColumn = meta.fields[1].name;
|
29
|
+
|
30
|
+
const sql = `SELECT "${idColumn}" AS id, "${textColumn}" AS text FROM (${classifier.sql}) q WHERE "${idColumn}" = ANY($1::text[])`;
|
31
|
+
const values = [idsArray.map(id => String(id))];
|
32
|
+
|
33
|
+
const { rows } = await pg.query(sql, values);
|
34
|
+
Object.assign(arr, rows)
|
35
|
+
|
36
|
+
}
|
37
|
+
if (!arr.length) return idsArray
|
38
|
+
|
39
|
+
const results = idsArray.map(id => {
|
40
|
+
const result = arr.find(el => String(el.id) == String(id));
|
41
|
+
return result ? result.text : '';
|
42
|
+
});
|
43
|
+
|
44
|
+
return results.filter(Boolean).join(', ');
|
45
|
+
} catch (error) {
|
46
|
+
return `Сталася помилка.<!-- err: ${error.toString()} -->`;
|
47
|
+
}
|
48
|
+
}
|
@@ -1,19 +1,19 @@
|
|
1
|
-
import { setToken } from "@opengis/fastify-table/utils.js";
|
2
|
-
|
3
|
-
export default function token(params) {
|
4
|
-
|
5
|
-
const { data, hash } = params;
|
6
|
-
|
7
|
-
if (!data?.root?.user?.uid && !hash.uid) return '-';
|
8
|
-
if (!hash || typeof hash !== 'object') return '-';
|
9
|
-
|
10
|
-
// const id = hash?.edit ? hash?.id : data?.root?.id;
|
11
|
-
// console.log(hash)
|
12
|
-
const [token] = setToken({
|
13
|
-
ids: [JSON.stringify(hash)],
|
14
|
-
|
15
|
-
uid: data?.root?.user?.uid || hash.uid,
|
16
|
-
array: 1,
|
17
|
-
});
|
18
|
-
return token;
|
1
|
+
import { setToken } from "@opengis/fastify-table/utils.js";
|
2
|
+
|
3
|
+
export default function token(params) {
|
4
|
+
|
5
|
+
const { data, hash } = params;
|
6
|
+
|
7
|
+
if (!data?.root?.user?.uid && !hash.uid) return '-';
|
8
|
+
if (!hash || typeof hash !== 'object') return '-';
|
9
|
+
|
10
|
+
// const id = hash?.edit ? hash?.id : data?.root?.id;
|
11
|
+
// console.log(hash)
|
12
|
+
const [token] = setToken({
|
13
|
+
ids: [JSON.stringify(hash)],
|
14
|
+
|
15
|
+
uid: data?.root?.user?.uid || hash.uid,
|
16
|
+
array: 1,
|
17
|
+
});
|
18
|
+
return token;
|
19
19
|
}
|
@@ -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,18 +1,15 @@
|
|
1
1
|
import { config, handlebarsSync, handlebars } from '@opengis/fastify-table/utils.js'
|
2
2
|
|
3
3
|
async function format(d, key, data) {
|
4
|
+
|
4
5
|
if (!key?.includes) return '';
|
5
6
|
if (d === true) return 'Так';
|
6
7
|
if (d === false) return 'Ні';
|
7
8
|
|
8
|
-
if (key.
|
9
|
-
return
|
10
|
-
} else if (key.startsWith('{{')) {
|
11
|
-
return handlebars.compile(key)(data);
|
9
|
+
if (key.includes('{{')) {
|
10
|
+
return await handlebars.compile(key)(data);
|
12
11
|
}
|
13
12
|
|
14
|
-
// if (config.local && config.debug) console.log('descriptionList:d', d, key, data);
|
15
|
-
if (!d) return null;
|
16
13
|
return d;
|
17
14
|
}
|
18
15
|
export default async function descriptionList(data, opt) {
|
@@ -38,10 +35,6 @@ export default async function descriptionList(data, opt) {
|
|
38
35
|
|
39
36
|
const d1 = await format(data[key], key, data) || '-';
|
40
37
|
|
41
|
-
if (config.local && config.debug && d1 === '-') {
|
42
|
-
// console.log('descriptionList:for', name, nameHBS, key, data);
|
43
|
-
}
|
44
|
-
|
45
38
|
result.push(`<div class="grid grid-cols-1 gap-1 py-3 sm:grid-cols-3 sm:gap-4">
|
46
39
|
<dt class="text-gray-900">${nameHBS || name}</dt>
|
47
40
|
<dd class="text-gray-700 sm:col-span-2">${d1}</dd>
|
@@ -10,8 +10,8 @@ function format(d, key, data, hash) {
|
|
10
10
|
if (key === 'actions') {
|
11
11
|
return `<div class="flex items-center gap-2">${(hash.form ? buttonEdit(d, 'Редагувати') : '') + buttonDel(d)}</div>`
|
12
12
|
}
|
13
|
-
if (key.startsWith('{{')
|
14
|
-
return
|
13
|
+
if (key.startsWith('{{')) {
|
14
|
+
return handlebars.compile(key)(data);
|
15
15
|
} else if (key.startsWith('{{') && key.includes(' ') && !(key.match(/\{\{([^\s]+)/)?.[1] in handlebars.helpers)) {
|
16
16
|
return null;
|
17
17
|
}
|
@@ -21,7 +21,7 @@ function format(d, key, data, hash) {
|
|
21
21
|
export default async function tableList(data, opt) {
|
22
22
|
const { hash } = opt;
|
23
23
|
// no data
|
24
|
-
|
24
|
+
// const time = Date.now();
|
25
25
|
if (hash.nodata && !data?.length) {
|
26
26
|
const noDataText = typeof hash.nodata == 'string' ? hash.nodata : '<div class="bg-gray-200 text-center p-6 rounded-xl"><h3 class="text-lg font-semibold">Інформація відсутня</h3></div>';
|
27
27
|
return noDataText
|
@@ -66,7 +66,7 @@ export default async function tableList(data, opt) {
|
|
66
66
|
if (skip[name]) continue;
|
67
67
|
|
68
68
|
const tokenData = key == 'actions' ? token : null;
|
69
|
-
const d1 =
|
69
|
+
const d1 = key.includes('{{') ? await handlebars.compile(key)({ ...row, token, hash }) || '-' : null
|
70
70
|
result.push(`<td class="whitespace-nowrap py-2 text-gray-900">
|
71
71
|
${d1 || format(tokenData || row[key], key, row, hash)}
|
72
72
|
</td>`);
|
@@ -78,6 +78,6 @@ export default async function tableList(data, opt) {
|
|
78
78
|
}
|
79
79
|
result.push('</tbody>');
|
80
80
|
|
81
|
-
|
81
|
+
// console.log(Date.now() - time)
|
82
82
|
return '<table class="min-w-full divide-y-2 divide-gray-200 bg-white min-w-full divide-y-2 divide-gray-200 bg-white "> ' + result.join('') + '</table>';
|
83
83
|
}
|
@@ -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
|
+
};
|