@opengis/admin 0.2.86 → 0.2.87
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/dist/{add-page-D1o3UElp.js → add-page-DQ70Si9f.js} +1 -1
- package/dist/{admin-interface-CX9gUQPl.js → admin-interface-CgXFerXl.js} +1 -1
- package/dist/{admin-view-BItQEdb1.js → admin-view-t-gzhVnl.js} +1 -1
- package/dist/admin.js +1 -1
- package/dist/admin.umd.cjs +56 -56
- package/dist/{card-view-CXouK5bH.js → card-view-Dtf6Ap9G.js} +1 -1
- package/dist/{edit-page-UiEicOwd.js → edit-page-BWRXfML4.js} +1 -1
- package/dist/{import-file-CrwXBa6w.js → import-file-CztGvKRc.js} +14122 -13803
- package/dist/style.css +1 -1
- package/module/settings/menu.json +58 -59
- package/package.json +2 -2
- package/server/helpers/list/utils/button.js +5 -5
- package/server/routes/data/controllers/utils/conditions.js +20 -20
- package/server/routes/properties/controllers/admin.properties.get.js +17 -14
- package/server/routes/properties/controllers/admin.properties.post.js +1 -1
- package/server/routes/properties/controllers/table.properties.get.js +120 -0
- package/server/routes/properties/controllers/table.properties.post.js +115 -0
- package/server/routes/properties/controllers/user.properties.get.js +2 -2
- package/server/routes/properties/controllers/user.properties.post.js +1 -1
- package/server/routes/properties/funcs/setSettings.js +1 -1
- package/server/routes/properties/index.mjs +15 -8
- package/server/routes/properties/utils/getColumnMetaData.js +17 -0
- package/server/routes/properties/utils/refreshData.js +128 -0
- package/server/routes/widget/controllers/widget.get.js +2 -1
- package/server/templates/setting/test.json +20 -0
- /package/server/routes/properties/{funcs/utils → utils}/dataInsert.js +0 -0
@@ -1,60 +1,59 @@
|
|
1
1
|
[
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
]
|
2
|
+
{
|
3
|
+
"ua": "Доступ",
|
4
|
+
"en": "Management",
|
5
|
+
"name": "administration",
|
6
|
+
"icon": "IconLockCode",
|
7
|
+
"order": 9,
|
8
|
+
"menu": [
|
9
|
+
{
|
10
|
+
"path": "admin.users",
|
11
|
+
"table": "admin.users.table",
|
12
|
+
"ua": "Користувачі",
|
13
|
+
"en": "Users"
|
14
|
+
},
|
15
|
+
{
|
16
|
+
"path": "admin.roles",
|
17
|
+
"table": "admin.roles.table",
|
18
|
+
"ua": "Ролі/Групи",
|
19
|
+
"en": "Roles"
|
20
|
+
},
|
21
|
+
{
|
22
|
+
"path": "admin.routes",
|
23
|
+
"table": "admin.routes.table",
|
24
|
+
"ua": "Інтерфейси",
|
25
|
+
"en": "Routes"
|
26
|
+
},
|
27
|
+
{
|
28
|
+
"path": "auth.logs",
|
29
|
+
"table": "auth.logs.table",
|
30
|
+
"ua": "Логи інтерфейсів"
|
31
|
+
}
|
32
|
+
]
|
33
|
+
},
|
34
|
+
{
|
35
|
+
"ua": "Управління",
|
36
|
+
"en": "Management",
|
37
|
+
"name": "administration",
|
38
|
+
"order": 10,
|
39
|
+
"icon": "IconSettingsCog",
|
40
|
+
"menu": [
|
41
|
+
{
|
42
|
+
"path": "admin.user-cls",
|
43
|
+
"ua": "Довідники ",
|
44
|
+
"component": "user-cls-page"
|
45
|
+
},
|
46
|
+
{
|
47
|
+
"path": "admin.properties",
|
48
|
+
"table": "admin.properties.table",
|
49
|
+
"ua": "Налаштування",
|
50
|
+
"en": "Settings"
|
51
|
+
},
|
52
|
+
{
|
53
|
+
"path": "admin.table_settings",
|
54
|
+
"ua": "Налаштування таблиць",
|
55
|
+
"component": "table-settings-page"
|
56
|
+
}
|
57
|
+
]
|
58
|
+
}
|
59
|
+
]
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "@opengis/admin",
|
3
|
-
"version": "0.2.
|
3
|
+
"version": "0.2.87",
|
4
4
|
"description": "This project Softpro Admin",
|
5
5
|
"main": "dist/admin.js",
|
6
6
|
"type": "module",
|
@@ -49,7 +49,7 @@
|
|
49
49
|
"@opengis/admin": "^0.2.82",
|
50
50
|
"@opengis/fastify-auth": "^1.0.61",
|
51
51
|
"@opengis/fastify-file": "^1.0.40",
|
52
|
-
"@opengis/fastify-table": "^1.1.
|
52
|
+
"@opengis/fastify-table": "^1.1.148",
|
53
53
|
"@opengis/v3-core": "^0.3.33",
|
54
54
|
"@opengis/v3-filter": "^0.0.62",
|
55
55
|
"@tabler/icons-vue": "^3.28.1",
|
@@ -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,21 +1,21 @@
|
|
1
|
-
function onCheck(rule, data) {
|
2
|
-
const val = data[rule[0]];
|
3
|
-
// console.log(val, rule[1], rule[2])
|
4
|
-
if (rule[1] === '==') return val === rule[2];
|
5
|
-
if (rule[1] === '!=') return val !== rule[2];
|
6
|
-
if (rule[1] === 'in' && rule[2].split) return rule[2].split(',').includes(val);
|
7
|
-
if (rule[1] === 'in' && rule[2].includes) return rule[2].includes(val);
|
8
|
-
|
9
|
-
if (rule[1] === 'not in' && rule[2].split) return !rule[2].split(',').includes(val);
|
10
|
-
if (rule[1] === 'not in' && rule[2].includes) return !rule[2].includes(val);
|
11
|
-
|
12
|
-
if (rule[1] === '>') return val > rule[2];
|
13
|
-
if (rule[1] === '<') return val < rule[2];
|
14
|
-
}
|
15
|
-
export default function conditions(rules, data) {
|
16
|
-
if (!rules?.length) return true;
|
17
|
-
const result = Array.isArray(rules[0]) ? !rules.filter(el => !onCheck(el, data)).length : onCheck(rules, data)
|
18
|
-
// console.log(rules, result)
|
19
|
-
return result;
|
20
|
-
|
1
|
+
function onCheck(rule, data) {
|
2
|
+
const val = data[rule[0]];
|
3
|
+
// console.log(val, rule[1], rule[2])
|
4
|
+
if (rule[1] === '==') return val === rule[2];
|
5
|
+
if (rule[1] === '!=') return val !== rule[2];
|
6
|
+
if (rule[1] === 'in' && rule[2].split) return rule[2].split(',').includes(val);
|
7
|
+
if (rule[1] === 'in' && rule[2].includes) return rule[2].includes(val);
|
8
|
+
|
9
|
+
if (rule[1] === 'not in' && rule[2].split) return !rule[2].split(',').includes(val);
|
10
|
+
if (rule[1] === 'not in' && rule[2].includes) return !rule[2].includes(val);
|
11
|
+
|
12
|
+
if (rule[1] === '>') return val > rule[2];
|
13
|
+
if (rule[1] === '<') return val < rule[2];
|
14
|
+
}
|
15
|
+
export default function conditions(rules, data) {
|
16
|
+
if (!rules?.length) return true;
|
17
|
+
const result = Array.isArray(rules[0]) ? !rules.filter(el => !onCheck(el, data)).length : onCheck(rules, data)
|
18
|
+
// console.log(rules, result)
|
19
|
+
return result;
|
20
|
+
|
21
21
|
}
|
@@ -1,29 +1,32 @@
|
|
1
1
|
const table = 'admin.properties';
|
2
2
|
|
3
|
-
import { config, getRedis } from '@opengis/fastify-table/utils.js';
|
3
|
+
import { config, getRedis, pgClients, getTemplatePath, getTemplate } from '@opengis/fastify-table/utils.js';
|
4
4
|
|
5
5
|
import { getSettings } from '../../../../utils.js';
|
6
6
|
|
7
|
-
|
8
|
-
|
7
|
+
const redis = getRedis();
|
8
|
+
|
9
|
+
export default async function getSettingsApp({
|
10
|
+
pg = pgClients.client, params = {}, query = {},
|
9
11
|
}) {
|
10
12
|
if (!pg.pk?.[table]) {
|
11
13
|
return { message: 'table not found', status: 404 };
|
12
14
|
}
|
13
15
|
|
14
|
-
const redis = getRedis();
|
15
16
|
const keyCache = `${pg.options?.database}:settings:${params?.key || 'all'}:${query?.json ? 'json' : 'plain'}:${table}`;
|
16
|
-
|
17
17
|
const cache = await redis.get(keyCache);
|
18
|
-
if (cache && !config?.local) return JSON.parse(cache);
|
19
18
|
|
20
|
-
|
21
|
-
|
22
|
-
pg, key: params.key, json: query.json, redis, table,
|
23
|
-
});
|
24
|
-
return { message: res, status: 200 };
|
25
|
-
}
|
26
|
-
catch (err) {
|
27
|
-
return { error: err.toString(), status: 500 };
|
19
|
+
if (cache && !config?.local) {
|
20
|
+
return JSON.parse(cache);
|
28
21
|
}
|
22
|
+
|
23
|
+
const settings = await getSettings({
|
24
|
+
pg, key: params.key, json: query.json, redis, table,
|
25
|
+
});
|
26
|
+
|
27
|
+
const forms = await Promise.all(getTemplatePath('setting')
|
28
|
+
.map(async (el) => ({ name: el[0], body: await getTemplate('setting', el[0]) }))
|
29
|
+
);
|
30
|
+
|
31
|
+
return { message: { forms, settings }, status: 200 };
|
29
32
|
}
|
@@ -2,7 +2,7 @@ const table = 'admin.properties';
|
|
2
2
|
|
3
3
|
import { setSettings } from '../../../../utils.js';
|
4
4
|
|
5
|
-
export default async function
|
5
|
+
export default async function postSettingsApp({
|
6
6
|
pg, session = {}, body = {},
|
7
7
|
}) {
|
8
8
|
if (session.passport?.user?.user_type !== 'superadmin') {
|
@@ -0,0 +1,120 @@
|
|
1
|
+
import { pgClients, getMeta, getTemplate } from '@opengis/fastify-table/utils.js';
|
2
|
+
|
3
|
+
import getColumnMetaData from '../utils/getColumnMetaData.js';
|
4
|
+
|
5
|
+
/**
|
6
|
+
*
|
7
|
+
* @method GET
|
8
|
+
* @priority 4
|
9
|
+
* @alias getSettingsTable
|
10
|
+
* @type api
|
11
|
+
* @tag custom
|
12
|
+
|
13
|
+
* @returns {String} message and status
|
14
|
+
*/
|
15
|
+
|
16
|
+
export default async function getSettingsTable({
|
17
|
+
pg = pgClients.client, params = {}, user = {}, query = {},
|
18
|
+
}) {
|
19
|
+
const { table, entity } = params;
|
20
|
+
const { uid } = user;
|
21
|
+
const time = [];
|
22
|
+
|
23
|
+
if (!uid) {
|
24
|
+
return { message: 'access restricted', status: 401 };
|
25
|
+
}
|
26
|
+
|
27
|
+
if (!table) {
|
28
|
+
return { message: 'not enough params: table', status: 400 };
|
29
|
+
}
|
30
|
+
|
31
|
+
const loadTable = await getTemplate('table', table);
|
32
|
+
|
33
|
+
const tableName = loadTable?.table || table;
|
34
|
+
const meta = await getMeta({ pg, table: tableName });
|
35
|
+
const { view, pk } = meta || {};
|
36
|
+
time.push(Date.now());
|
37
|
+
|
38
|
+
if (!pk && !view) {
|
39
|
+
return {
|
40
|
+
message: `table primary key not found: ${tableName}`,
|
41
|
+
status: 400,
|
42
|
+
};
|
43
|
+
}
|
44
|
+
|
45
|
+
const { rows: geometry } = meta?.geom
|
46
|
+
? await pg.queryCache(`select st_geometrytype(${meta?.geom}) as type ,count(*)
|
47
|
+
from ${tableName} group by st_geometrytype(${meta?.geom})`, { table: tableName }) : [];
|
48
|
+
time.push(Date.now());
|
49
|
+
|
50
|
+
const stat = !view ? await getColumnMetaData({ pg, table: tableName }) : {};
|
51
|
+
time.push(Date.now());
|
52
|
+
|
53
|
+
const { total = 0 } = await pg.queryCache(`select count(*) as total from ${tableName}`, { table: tableName })
|
54
|
+
.then(el => el.rows?.[0] || {});
|
55
|
+
time.push(Date.now());
|
56
|
+
|
57
|
+
const { property_json: customColumns = [] } = await pg.query(`select property_json::json from setting.property
|
58
|
+
where property_entity='customColumn' and object_id=$1`, [table]).then(el => el.rows?.[0] || {});
|
59
|
+
|
60
|
+
const { property_json: tableSettingColumns } = await pg.query(`select property_json::json from setting.property
|
61
|
+
where property_entity='column' and object_id=$1`, [table]).then(el => el.rows?.[0] || {});
|
62
|
+
|
63
|
+
const columns = (tableSettingColumns || loadTable?.columns || meta?.columns)?.map((el) => ({ ...el, title: el.title || el.name }))
|
64
|
+
?.filter((value, index, array) => array?.map((el) => el.name).indexOf(value.name) === index); // get unique columns
|
65
|
+
|
66
|
+
const cls = columns?.filter((el) => ['badge', 'select'].includes(el.format) && (el.option || el.data))
|
67
|
+
?.map((el) => (el.option || el.data))
|
68
|
+
?.filter((value, index, array) => array.indexOf(value) === index); // get unique cls
|
69
|
+
|
70
|
+
const { property_json: userFilterList } = await pg.query(`select property_json::json from setting.property
|
71
|
+
where property_entity='filter' and object_id=$1`, [table]).then(el => el.rows?.[0] || {});
|
72
|
+
|
73
|
+
const { property_json: customQuery } = await pg.query(`select json_agg(json_build_object('id',property_id,'name', property_key,
|
74
|
+
'query', property_text, 'disabled', coalesce((property_json::json->>'disabled')::boolean,false) )) as property_json
|
75
|
+
from setting.property where 1=1 and property_entity='customQuery' and object_id=$1`, [table]).then(el => el.rows?.[0] || {});
|
76
|
+
|
77
|
+
time.push(Date.now());
|
78
|
+
|
79
|
+
const debug = user?.user_type?.includes('admin') && query?.debug
|
80
|
+
? {
|
81
|
+
view,
|
82
|
+
tableName,
|
83
|
+
opt,
|
84
|
+
colModel,
|
85
|
+
metaColumns: meta?.columns,
|
86
|
+
columnProperties: tableSettingColumns,
|
87
|
+
}
|
88
|
+
: undefined;
|
89
|
+
|
90
|
+
const res = {
|
91
|
+
message: {
|
92
|
+
time: {
|
93
|
+
geom: time[1] - time[0],
|
94
|
+
stat: time[2] - time[1],
|
95
|
+
count: time[3] - time[2],
|
96
|
+
total: time[4] - time[0],
|
97
|
+
},
|
98
|
+
debug,
|
99
|
+
model: tableName,
|
100
|
+
total,
|
101
|
+
geometry,
|
102
|
+
stat,
|
103
|
+
cls,
|
104
|
+
columns,
|
105
|
+
filters: userFilterList?.length
|
106
|
+
? userFilterList
|
107
|
+
: loadTable?.filters?.map((el) => ({ ...el, title: el.title || el.ua })),
|
108
|
+
customQuery: customQuery?.length ? customQuery : [],
|
109
|
+
customColumns,
|
110
|
+
customFilters: userFilterList || [],
|
111
|
+
},
|
112
|
+
status: 200,
|
113
|
+
};
|
114
|
+
|
115
|
+
if (entity) {
|
116
|
+
return { [entity]: res.message[entity] };
|
117
|
+
}
|
118
|
+
|
119
|
+
return res;
|
120
|
+
};
|
@@ -0,0 +1,115 @@
|
|
1
|
+
import { getRedis, pgClients } from '@opengis/fastify-table/utils.js';
|
2
|
+
|
3
|
+
import refreshData from '../utils/refreshData.js';
|
4
|
+
|
5
|
+
const rclient = getRedis();
|
6
|
+
|
7
|
+
/**
|
8
|
+
*
|
9
|
+
* @method POST
|
10
|
+
* @priority 4
|
11
|
+
* @alias postSettingsTable
|
12
|
+
* @type api
|
13
|
+
* @tag custom
|
14
|
+
* @returns {String} message and status
|
15
|
+
*/
|
16
|
+
|
17
|
+
export default async function postTablpostSettingsTableeProperties({
|
18
|
+
pg = pgClients.client, params = {}, body = {}, user = {},
|
19
|
+
}) {
|
20
|
+
const { table } = params;
|
21
|
+
const { uid } = user;
|
22
|
+
|
23
|
+
if (!uid) {
|
24
|
+
return { message: 'access restricted', status: 401 };
|
25
|
+
}
|
26
|
+
|
27
|
+
if (!table) {
|
28
|
+
return { message: 'not enough params: table', status: 400 };
|
29
|
+
}
|
30
|
+
|
31
|
+
const {
|
32
|
+
deleted = [],
|
33
|
+
columns = [],
|
34
|
+
filters = [],
|
35
|
+
customColumns = [],
|
36
|
+
customQuery = [],
|
37
|
+
} = body;
|
38
|
+
|
39
|
+
const cacheKey = `${pg.options?.database}:filter-list:${table}`;
|
40
|
+
|
41
|
+
if (Array.isArray(deleted) && deleted?.length) {
|
42
|
+
const sqlList = {
|
43
|
+
columns: `delete from setting.property where property_entity='column' and object_id=$1`,
|
44
|
+
filters: `delete from setting.property where property_entity='filter' and object_id=$1`,
|
45
|
+
customColumns: `delete from setting.custom_data where attr in (select cf_id from setting.custom_field where object_id=$1);
|
46
|
+
delete from setting.custom_field where object_id=$1;
|
47
|
+
delete from setting.property where property_entity='customColumn' and object_id=$1;`,
|
48
|
+
customQuery: `delete from setting.property where property_entity='customQuery' and object_id=$1;`,
|
49
|
+
};
|
50
|
+
const q = deleted.map((item) => sqlList[item])?.filter((el) => el)?.join(' ');
|
51
|
+
const { rowCount = 0 } = await pg.query(q, [table]);
|
52
|
+
|
53
|
+
if (['customColumn', 'column'].find((el) => deleted.includes(el))) {
|
54
|
+
// await funcs.applyHook('preTemplate', { pg, name: table, type: 'table' });
|
55
|
+
}
|
56
|
+
if (['customQuery', 'filter'].find((el) => deleted.includes(el))) {
|
57
|
+
await rclient.del(cacheKey);
|
58
|
+
}
|
59
|
+
|
60
|
+
if (rowCount === 0) {
|
61
|
+
return { message: 'nothing to restore', status: 200 };
|
62
|
+
}
|
63
|
+
|
64
|
+
return {
|
65
|
+
message: {
|
66
|
+
command: 'DELETE',
|
67
|
+
deleted,
|
68
|
+
table,
|
69
|
+
result: 'success',
|
70
|
+
},
|
71
|
+
status: 200,
|
72
|
+
};
|
73
|
+
}
|
74
|
+
|
75
|
+
const result = {};
|
76
|
+
// custom filter query (sql)
|
77
|
+
if (customQuery?.length) {
|
78
|
+
const res = await refreshData({ pg, entity: 'customQuery', table, uid, data: customQuery });
|
79
|
+
if (res?.error) return res;
|
80
|
+
Object.assign(result, { customQuery: res });
|
81
|
+
}
|
82
|
+
|
83
|
+
// columns
|
84
|
+
if (columns?.length) {
|
85
|
+
const res = await refreshData({ pg, entity: 'column', table, uid, data: columns });
|
86
|
+
if (res?.error) return res;
|
87
|
+
Object.assign(result, { columns: res });
|
88
|
+
}
|
89
|
+
|
90
|
+
// custom columns
|
91
|
+
if (customColumns?.length) {
|
92
|
+
const colModel = await pg.query(`select property_json::json from setting.property
|
93
|
+
where property_entity='customColumn' and object_id=$1`, [table]).then((el) => el.rows?.[0]?.property_json);
|
94
|
+
|
95
|
+
const res = await refreshData({ pg, entity: 'customColumn', table, uid, data: customColumns, colModel });
|
96
|
+
if (res?.error) return res;
|
97
|
+
Object.assign(result, { customColumns: res });
|
98
|
+
}
|
99
|
+
|
100
|
+
// filters
|
101
|
+
if (filters?.length) {
|
102
|
+
const res = await refreshData({ pg, entity: 'filter', table, uid, data: filters });
|
103
|
+
if (res?.error) return res;
|
104
|
+
Object.assign(result, { filters: res });
|
105
|
+
}
|
106
|
+
|
107
|
+
if (columns?.length || customColumns?.length) {
|
108
|
+
// await funcs.applyHook('preTemplate', { pg, type: 'table', name: table });
|
109
|
+
}
|
110
|
+
if (filters?.length || customQuery?.length) {
|
111
|
+
await rclient.del(cacheKey);
|
112
|
+
}
|
113
|
+
|
114
|
+
return { message: result, status: 200 };
|
115
|
+
};
|
@@ -4,7 +4,7 @@ import { getRedis } from '@opengis/fastify-table/utils.js';
|
|
4
4
|
|
5
5
|
import { getSettings } from '../../../../utils.js';
|
6
6
|
|
7
|
-
export default async function
|
7
|
+
export default async function getSettingsUser({
|
8
8
|
pg = {}, params = {}, query = {}, session = {},
|
9
9
|
}) {
|
10
10
|
const { uid } = session.passport?.user || {};
|
@@ -25,6 +25,6 @@ export default async function getUserProperties({
|
|
25
25
|
const res = await getSettings({
|
26
26
|
pg, key: params.key, json: query.json, redis, table, uid,
|
27
27
|
});
|
28
|
-
|
28
|
+
|
29
29
|
return { message: res, status: 200 };
|
30
30
|
}
|
@@ -2,7 +2,7 @@ const table = 'admin.user_properties';
|
|
2
2
|
|
3
3
|
import { setSettings } from '../../../../utils.js';
|
4
4
|
|
5
|
-
export default async function
|
5
|
+
export default async function postSettingsUser({
|
6
6
|
pg, session = {}, body = {},
|
7
7
|
}) {
|
8
8
|
const { uid } = session.passport?.user || {};
|
@@ -1,14 +1,21 @@
|
|
1
|
-
import
|
2
|
-
import
|
1
|
+
import getSettingsApp from './controllers/admin.properties.get.js';
|
2
|
+
import postSettingsApp from './controllers/admin.properties.post.js';
|
3
3
|
|
4
|
-
import
|
5
|
-
import
|
4
|
+
import getSettingsUser from './controllers/user.properties.get.js';
|
5
|
+
import postSettingsUser from './controllers/user.properties.post.js';
|
6
|
+
|
7
|
+
import getSettingsTable from './controllers/table.properties.get.js';
|
8
|
+
import postSettingsTable from './controllers/table.properties.post.js';
|
6
9
|
|
7
10
|
import { propertiesSchema } from './schema.js';
|
8
11
|
|
9
12
|
export default async function route(fastify) {
|
10
|
-
fastify.get('/
|
11
|
-
fastify.
|
12
|
-
|
13
|
-
fastify.
|
13
|
+
fastify.get('/settings-app/:key?', { scheme: propertiesSchema }, getSettingsApp);
|
14
|
+
fastify.post('/settings-app', { config: { policy: ['superadmin'] } }, postSettingsApp);
|
15
|
+
|
16
|
+
fastify.get('/settings-user/:key?', { scheme: propertiesSchema }, getSettingsUser);
|
17
|
+
fastify.post('/settings-user', {}, postSettingsUser);
|
18
|
+
|
19
|
+
fastify.get('/settings-table/:table/:entity?', {}, getSettingsTable);
|
20
|
+
fastify.post('/settings-table/:table', {}, postSettingsTable);
|
14
21
|
}
|
@@ -0,0 +1,17 @@
|
|
1
|
+
import { pgClients, getMeta } from '@opengis/fastify-table/utils.js';
|
2
|
+
|
3
|
+
export default async function getColumnMetaData({
|
4
|
+
pg = pgClients.client, table,
|
5
|
+
}) {
|
6
|
+
if (!table) return null;
|
7
|
+
|
8
|
+
const { columns = [] } = await getMeta({ pg, table });
|
9
|
+
const columnList = columns.filter(el => !['files', 'uid', 'editor_date', 'editor_id', 'cdate'].includes(el.name)).map(el => el.name);
|
10
|
+
|
11
|
+
const sql = `select count(*) as total, ${columnList.map((item) => `(count(*) filter(where ${item} is not null)) as "${item}"`).join(',')} from ${table}`;
|
12
|
+
const res = await pg.queryCache(sql, { table }).then(el => el.rows?.[0] || {});
|
13
|
+
|
14
|
+
return columns
|
15
|
+
.filter(el => !['files', 'uid', 'editor_date', 'editor_id', 'cdate'].includes(el.name))
|
16
|
+
.map((row) => Object.assign(row, { percent: ((+res[row.name] / +res.total) * 100).toFixed(0) }));
|
17
|
+
};
|