@opengis/cms 0.0.49 → 0.0.50
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/{ArticlesPage-BcR1hbds.js → ArticlesPage-Cuit_90w.js} +3 -3
- package/dist/{BuilderPage-CK_osM89.js → BuilderPage-B79YHrmr.js} +51 -51
- package/dist/{CollectionsBreadcrumb.vue_vue_type_script_setup_true_lang-CnOe9ORD.js → CollectionsBreadcrumb.vue_vue_type_script_setup_true_lang-B6irHMzL.js} +19 -19
- package/dist/{EditCollectionPage-DtgvKGm-.js → EditCollectionPage-B4p_iA6h.js} +2 -2
- package/dist/{MenuAddPage-Bf48Z-ah.js → MenuAddPage-CmU4kAUM.js} +1 -1
- package/dist/{MenuItemPage-BSwUW8tv.js → MenuItemPage-UV8JlJvT.js} +59 -59
- package/dist/{MenuPage-tJZtK46W.js → MenuPage-c4TPJgIN.js} +1 -1
- package/dist/MonacoEditor.vue_vue_type_script_setup_true_lang-C8cip9Ci.js +84 -0
- package/dist/{UniversalTable.vue_vue_type_script_setup_true_lang-CJGTsd1V.js → UniversalTable.vue_vue_type_script_setup_true_lang-DR4PQwqR.js} +80 -80
- package/dist/{UniversalTablePagination.vue_vue_type_script_setup_true_lang-GYZd_gkA.js → UniversalTablePagination.vue_vue_type_script_setup_true_lang-C8P9DCeX.js} +46 -46
- package/dist/{contentForm-NcG15_5z.js → contentForm-S5mXr5B7.js} +1 -1
- package/dist/index.js +72 -1752
- package/locales/en.json +809 -0
- package/locales/uk.json +809 -0
- package/package.json +68 -67
- package/server/routes/cms/controllers/getPermissions.js +15 -15
- package/server/routes/cms/controllers/listMedia.js +18 -2
- package/server/routes/cms/controllers/setPermissions.js +49 -49
- package/server/templates/select/core.user_mentioned.sql +1 -1
- package/dist/MonacoEditor.vue_vue_type_script_setup_true_lang-B1DrxmQX.js +0 -84
package/package.json
CHANGED
|
@@ -1,67 +1,68 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "@opengis/cms",
|
|
3
|
-
"version": "0.0.
|
|
4
|
-
"description": "cms",
|
|
5
|
-
"type": "module",
|
|
6
|
-
"author": "Softpro",
|
|
7
|
-
"main": "./dist/index.js",
|
|
8
|
-
"license": "EULA",
|
|
9
|
-
"files": [
|
|
10
|
-
"module",
|
|
11
|
-
"
|
|
12
|
-
"
|
|
13
|
-
"
|
|
14
|
-
"
|
|
15
|
-
"utils.
|
|
16
|
-
"
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
"
|
|
21
|
-
"
|
|
22
|
-
"
|
|
23
|
-
"
|
|
24
|
-
"
|
|
25
|
-
"build
|
|
26
|
-
"
|
|
27
|
-
"
|
|
28
|
-
"
|
|
29
|
-
"
|
|
30
|
-
"
|
|
31
|
-
"
|
|
32
|
-
"
|
|
33
|
-
"
|
|
34
|
-
"
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
"
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
"@
|
|
43
|
-
"@opengis/
|
|
44
|
-
"@opengis/
|
|
45
|
-
"@opengis/
|
|
46
|
-
"@opengis/
|
|
47
|
-
"@
|
|
48
|
-
"
|
|
49
|
-
"
|
|
50
|
-
"
|
|
51
|
-
"
|
|
52
|
-
"vue
|
|
53
|
-
"vue-
|
|
54
|
-
"
|
|
55
|
-
"
|
|
56
|
-
"@
|
|
57
|
-
"@
|
|
58
|
-
"
|
|
59
|
-
"
|
|
60
|
-
"
|
|
61
|
-
"
|
|
62
|
-
"
|
|
63
|
-
"
|
|
64
|
-
"
|
|
65
|
-
"
|
|
66
|
-
|
|
67
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "@opengis/cms",
|
|
3
|
+
"version": "0.0.50",
|
|
4
|
+
"description": "cms",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"author": "Softpro",
|
|
7
|
+
"main": "./dist/index.js",
|
|
8
|
+
"license": "EULA",
|
|
9
|
+
"files": [
|
|
10
|
+
"module",
|
|
11
|
+
"locales",
|
|
12
|
+
"dist",
|
|
13
|
+
"server",
|
|
14
|
+
"plugin.js",
|
|
15
|
+
"utils.js",
|
|
16
|
+
"utils.d.ts",
|
|
17
|
+
"input-types.json"
|
|
18
|
+
],
|
|
19
|
+
"scripts": {
|
|
20
|
+
"patch": "npm version patch && git push && npm publish",
|
|
21
|
+
"test": "node --test test/**/*.test.js",
|
|
22
|
+
"lint": "eslint . --ext .vue,.js,.jsx,.cjs,.mjs,.ts,.tsx,.cts,.mts --fix --ignore-path .gitignore",
|
|
23
|
+
"dev": "NODE_ENV=dev bun --env-file=.env.ip server ",
|
|
24
|
+
"admin": "vite admin",
|
|
25
|
+
"build": "vite build && vite build admin",
|
|
26
|
+
"build:lib": "vite build",
|
|
27
|
+
"proxy": "vite dev admin",
|
|
28
|
+
"start": "bun --env-file=.env.ip server",
|
|
29
|
+
"prod": "NODE_ENV=production bun --env-file=.env.ip server ",
|
|
30
|
+
"ip": "bun --env-file=.env.ip server",
|
|
31
|
+
"demo": "node --env-file=.env.demo --env-file=.env server",
|
|
32
|
+
"i18n:sync": "node i18n-sync.cjs",
|
|
33
|
+
"prepublishOnly": "bun build:lib",
|
|
34
|
+
"softpro": "bun --env-file=.env.softpro server",
|
|
35
|
+
"softpro1": "NODE_ENV=production bun --env-file=.env.prod-softpro.local server"
|
|
36
|
+
},
|
|
37
|
+
"dependencies": {},
|
|
38
|
+
"resolutions": {
|
|
39
|
+
"rollup": "4.30.0"
|
|
40
|
+
},
|
|
41
|
+
"devDependencies": {
|
|
42
|
+
"@fastify/compress": "^8.1.0",
|
|
43
|
+
"@opengis/core": "^0.0.30",
|
|
44
|
+
"@opengis/fastify-table": "^2.0.137",
|
|
45
|
+
"@opengis/filter": "^0.1.31",
|
|
46
|
+
"@opengis/form": "^0.0.109",
|
|
47
|
+
"@opengis/richtext": "0.0.38",
|
|
48
|
+
"@vueuse/head": "2.0.0",
|
|
49
|
+
"js-yaml": "^4.1.0",
|
|
50
|
+
"lucide-vue-next": "0.344.0",
|
|
51
|
+
"vite": "5.1.4",
|
|
52
|
+
"vue": "^3.5.17",
|
|
53
|
+
"vue-i18n": "11.1.5",
|
|
54
|
+
"vue-router": "4.4.3",
|
|
55
|
+
"vuedraggable": "4.1.0",
|
|
56
|
+
"@tailwindcss/typography": "0.5.10",
|
|
57
|
+
"@tsconfig/node22": "^22.0.2",
|
|
58
|
+
"@vitejs/plugin-vue": "5.0.4",
|
|
59
|
+
"autoprefixer": "10.4.18",
|
|
60
|
+
"eslint": "8.49.0",
|
|
61
|
+
"postcss": "8.4.35",
|
|
62
|
+
"sass": "^1.92.1",
|
|
63
|
+
"tailwindcss": "3.4.1",
|
|
64
|
+
"typescript": "~5.8.0",
|
|
65
|
+
"vitest": "3.2.4",
|
|
66
|
+
"vue-tsc": "^2.2.10"
|
|
67
|
+
}
|
|
68
|
+
}
|
|
@@ -1,16 +1,16 @@
|
|
|
1
|
-
import { pgClients } from '@opengis/fastify-table/utils.js';
|
|
2
|
-
|
|
3
|
-
export default async function getPermissions(req, reply) {
|
|
4
|
-
const { pg = pgClients.client, params = {}, user = {} } = req;
|
|
5
|
-
|
|
6
|
-
if (!user?.uid) {
|
|
7
|
-
return reply.status(401).send('unauthorized');
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
const { rows = [] } = await pg.query(
|
|
11
|
-
`select * from site.permissions where ${params.id ? 'user_id=$1' : 'true'}`,
|
|
12
|
-
[params.id].filter(Boolean),
|
|
13
|
-
);
|
|
14
|
-
|
|
15
|
-
return { permissions: rows };
|
|
1
|
+
import { pgClients } from '@opengis/fastify-table/utils.js';
|
|
2
|
+
|
|
3
|
+
export default async function getPermissions(req, reply) {
|
|
4
|
+
const { pg = pgClients.client, params = {}, user = {} } = req;
|
|
5
|
+
|
|
6
|
+
if (!user?.uid) {
|
|
7
|
+
return reply.status(401).send('unauthorized');
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
const { rows = [] } = await pg.query(
|
|
11
|
+
`select * from site.permissions where ${params.id ? 'user_id=$1' : 'true'}`,
|
|
12
|
+
[params.id].filter(Boolean),
|
|
13
|
+
);
|
|
14
|
+
|
|
15
|
+
return { permissions: rows };
|
|
16
16
|
}
|
|
@@ -2,9 +2,22 @@ import path from 'node:path';
|
|
|
2
2
|
import { existsSync, mkdirSync } from 'node:fs';
|
|
3
3
|
import { readdir, stat } from 'node:fs/promises';
|
|
4
4
|
|
|
5
|
-
import { config, getFolder, pgClients, getMimeType } from '@opengis/fastify-table/utils.js';
|
|
5
|
+
import { config, getFolder, pgClients, getMimeType, getFilterSQL } from '@opengis/fastify-table/utils.js';
|
|
6
6
|
import { createHash } from 'node:crypto';
|
|
7
7
|
|
|
8
|
+
const filterList = [
|
|
9
|
+
{
|
|
10
|
+
name: "created_at",
|
|
11
|
+
type: "Date",
|
|
12
|
+
ua: "Дата створення"
|
|
13
|
+
},
|
|
14
|
+
{
|
|
15
|
+
name: "updated_at",
|
|
16
|
+
type: "Date",
|
|
17
|
+
ua: "Дата редагування"
|
|
18
|
+
}
|
|
19
|
+
]
|
|
20
|
+
|
|
8
21
|
// path.resolve() converts POSIX paths from getFolder to valid Windows paths (Bun/Node fs require this on Windows)
|
|
9
22
|
const rootDir = path.resolve(getFolder(config, 'local'));
|
|
10
23
|
const dir = '/files';
|
|
@@ -39,12 +52,15 @@ export default async function listMedia(req, reply) {
|
|
|
39
52
|
const allItems = isDirectory ? await readdir(dirpath, { withFileTypes: true, recursive: true }) : [];
|
|
40
53
|
const items = isDirectory ? await readdir(dirpath, { withFileTypes: true }) : [];
|
|
41
54
|
|
|
55
|
+
const { q = '' } = await getFilterSQL({ table: 'site.media', filter: query?.filter, filterList, pg });
|
|
56
|
+
|
|
42
57
|
const rows = await pg.query(
|
|
43
58
|
`select
|
|
44
59
|
media_id as id, filename, filetype, filesize, url, description, alt,
|
|
45
60
|
mime, preview_url, created_at, updated_at, created_by, updated_by
|
|
46
61
|
from site.media
|
|
47
|
-
where ${subdir ? 'subdir = $1' : (search ? '1=1' : 'subdir is null')} ${search ? `and filename ilike '%${search.replace(/'/g, "''")}%'` : ''}
|
|
62
|
+
where ${subdir ? 'subdir = $1' : (search ? '1=1' : 'subdir is null')} ${search ? `and filename ilike '%${search.replace(/'/g, "''")}%'` : ''}
|
|
63
|
+
${q ? ` and (${q})` : ''}`,
|
|
48
64
|
[subdir].filter(Boolean),
|
|
49
65
|
).then(el => el.rows || []); // ?.filter(row => items.map(el => el.name).includes(row.filename))
|
|
50
66
|
|
|
@@ -1,50 +1,50 @@
|
|
|
1
|
-
import { logger, pgClients, dataInsert } from '@opengis/fastify-table/utils.js';
|
|
2
|
-
|
|
3
|
-
export default async function setPermissions(req, reply) {
|
|
4
|
-
const { pg = pgClients.client, params = {}, user = {}, body = {} } = req;
|
|
5
|
-
|
|
6
|
-
if (!user?.uid) {
|
|
7
|
-
return reply.status(401).send('unauthorized');
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
if (!params.id) {
|
|
11
|
-
return reply.status(400).send('not enough params: id');
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
const client = await pg.connect()
|
|
15
|
-
const result = {};
|
|
16
|
-
try {
|
|
17
|
-
await client.query('BEGIN');
|
|
18
|
-
|
|
19
|
-
const { rowCount = 0 } = await client.query(
|
|
20
|
-
`delete from site.permissions where user_id=$1`,
|
|
21
|
-
[params.id].filter(Boolean),
|
|
22
|
-
);
|
|
23
|
-
|
|
24
|
-
Object.assign(result, { deleted: rowCount });
|
|
25
|
-
|
|
26
|
-
if (Array.isArray(body.permissions) && body.permissions?.length) {
|
|
27
|
-
body.permissions.forEach((el) => {
|
|
28
|
-
Object.assign(el, { user_id: el.user_id || params.id });
|
|
29
|
-
});
|
|
30
|
-
|
|
31
|
-
await Promise.all(body.permissions.map(async (el) => dataInsert({
|
|
32
|
-
pg: client,
|
|
33
|
-
table: 'site.permissions',
|
|
34
|
-
data: el,
|
|
35
|
-
uid: user.uid,
|
|
36
|
-
})));
|
|
37
|
-
|
|
38
|
-
Object.assign(result, { inserted: body.permissions.length });
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
await client.query('COMMIT');
|
|
42
|
-
return reply.status(200).send(result);
|
|
43
|
-
} catch (err) {
|
|
44
|
-
await client.query('ROLLBACK');
|
|
45
|
-
logger.file('cms/permissions', { error: err.toString(), stack: err.stack });
|
|
46
|
-
return reply.status(500).send('set permissions error');
|
|
47
|
-
} finally {
|
|
48
|
-
client.release();
|
|
49
|
-
}
|
|
1
|
+
import { logger, pgClients, dataInsert } from '@opengis/fastify-table/utils.js';
|
|
2
|
+
|
|
3
|
+
export default async function setPermissions(req, reply) {
|
|
4
|
+
const { pg = pgClients.client, params = {}, user = {}, body = {} } = req;
|
|
5
|
+
|
|
6
|
+
if (!user?.uid) {
|
|
7
|
+
return reply.status(401).send('unauthorized');
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
if (!params.id) {
|
|
11
|
+
return reply.status(400).send('not enough params: id');
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
const client = await pg.connect()
|
|
15
|
+
const result = {};
|
|
16
|
+
try {
|
|
17
|
+
await client.query('BEGIN');
|
|
18
|
+
|
|
19
|
+
const { rowCount = 0 } = await client.query(
|
|
20
|
+
`delete from site.permissions where user_id=$1`,
|
|
21
|
+
[params.id].filter(Boolean),
|
|
22
|
+
);
|
|
23
|
+
|
|
24
|
+
Object.assign(result, { deleted: rowCount });
|
|
25
|
+
|
|
26
|
+
if (Array.isArray(body.permissions) && body.permissions?.length) {
|
|
27
|
+
body.permissions.forEach((el) => {
|
|
28
|
+
Object.assign(el, { user_id: el.user_id || params.id });
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
await Promise.all(body.permissions.map(async (el) => dataInsert({
|
|
32
|
+
pg: client,
|
|
33
|
+
table: 'site.permissions',
|
|
34
|
+
data: el,
|
|
35
|
+
uid: user.uid,
|
|
36
|
+
})));
|
|
37
|
+
|
|
38
|
+
Object.assign(result, { inserted: body.permissions.length });
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
await client.query('COMMIT');
|
|
42
|
+
return reply.status(200).send(result);
|
|
43
|
+
} catch (err) {
|
|
44
|
+
await client.query('ROLLBACK');
|
|
45
|
+
logger.file('cms/permissions', { error: err.toString(), stack: err.stack });
|
|
46
|
+
return reply.status(500).send('set permissions error');
|
|
47
|
+
} finally {
|
|
48
|
+
client.release();
|
|
49
|
+
}
|
|
50
50
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
select uid, coalesce(sur_name,'')||coalesce(' '||user_name,'') as text, email from admin.users
|
|
1
|
+
select uid, coalesce(sur_name,'')||coalesce(' '||user_name,'') as text, email from admin.users
|
|
2
2
|
where enabled order by coalesce(sur_name,'')||coalesce(' '||user_name,'')
|
|
@@ -1,84 +0,0 @@
|
|
|
1
|
-
import { defineComponent as s, mergeModels as c, useModel as m, ref as f, onMounted as h, watch as d, onBeforeUnmount as g, openBlock as p, createElementBlock as v, normalizeStyle as w } from "vue";
|
|
2
|
-
async function M() {
|
|
3
|
-
if (window.monaco)
|
|
4
|
-
return window.monaco;
|
|
5
|
-
const a = "https://cdn.jsdelivr.net/npm/monaco-editor@0.45.0/min";
|
|
6
|
-
return window.require || (window.require = { paths: { vs: `${a}/vs` } }, await new Promise((o, l) => {
|
|
7
|
-
const n = document.createElement("script");
|
|
8
|
-
n.src = `${a}/vs/loader.min.js`, n.onload = () => o(), n.onerror = l, document.head.appendChild(n);
|
|
9
|
-
})), new Promise((o) => {
|
|
10
|
-
window.require(["vs/editor/editor.main"], () => o(window.monaco));
|
|
11
|
-
});
|
|
12
|
-
}
|
|
13
|
-
const C = /* @__PURE__ */ s({
|
|
14
|
-
__name: "MonacoEditor",
|
|
15
|
-
props: /* @__PURE__ */ c({
|
|
16
|
-
language: { default: "javascript" },
|
|
17
|
-
theme: { default: "vs-dark" },
|
|
18
|
-
width: { default: "100%" },
|
|
19
|
-
height: { default: "100%" },
|
|
20
|
-
options: { default: () => ({
|
|
21
|
-
minimap: { enabled: !1 }
|
|
22
|
-
}) }
|
|
23
|
-
}, {
|
|
24
|
-
modelValue: {
|
|
25
|
-
required: !0
|
|
26
|
-
},
|
|
27
|
-
modelModifiers: {}
|
|
28
|
-
}),
|
|
29
|
-
emits: ["update:modelValue"],
|
|
30
|
-
setup(a) {
|
|
31
|
-
const o = a, l = m(a, "modelValue"), n = f(null);
|
|
32
|
-
let e = null, i = null;
|
|
33
|
-
return h(async () => {
|
|
34
|
-
var t;
|
|
35
|
-
if (n.value)
|
|
36
|
-
try {
|
|
37
|
-
i = await M();
|
|
38
|
-
const r = ((t = l.value) == null ? void 0 : t.replace(/\\n/g, `
|
|
39
|
-
`)) || "";
|
|
40
|
-
e = i.editor.create(n.value, {
|
|
41
|
-
value: r,
|
|
42
|
-
language: o.language,
|
|
43
|
-
theme: o.theme,
|
|
44
|
-
automaticLayout: !0,
|
|
45
|
-
...o.options
|
|
46
|
-
}), e.onDidChangeModelContent(() => {
|
|
47
|
-
const u = (e == null ? void 0 : e.getValue()) || "";
|
|
48
|
-
l.value = u;
|
|
49
|
-
});
|
|
50
|
-
} catch (r) {
|
|
51
|
-
console.error("Failed to load Monaco Editor:", r);
|
|
52
|
-
}
|
|
53
|
-
}), d(
|
|
54
|
-
() => l.value,
|
|
55
|
-
(t) => {
|
|
56
|
-
if (e) {
|
|
57
|
-
const r = (t == null ? void 0 : t.replace(/\\n/g, `
|
|
58
|
-
`)) || "";
|
|
59
|
-
r !== e.getValue() && e.setValue(r);
|
|
60
|
-
}
|
|
61
|
-
},
|
|
62
|
-
{ immediate: !0 }
|
|
63
|
-
), d(
|
|
64
|
-
() => o.language,
|
|
65
|
-
(t) => {
|
|
66
|
-
e && t && i && i.editor.setModelLanguage(e.getModel(), t);
|
|
67
|
-
}
|
|
68
|
-
), d(
|
|
69
|
-
() => o.theme,
|
|
70
|
-
(t) => {
|
|
71
|
-
e && t && i && i.editor.setTheme(t);
|
|
72
|
-
}
|
|
73
|
-
), g(() => {
|
|
74
|
-
e && (e.dispose(), e = null);
|
|
75
|
-
}), (t, r) => (p(), v("div", {
|
|
76
|
-
ref_key: "editorContainer",
|
|
77
|
-
ref: n,
|
|
78
|
-
style: w({ width: a.width, height: a.height })
|
|
79
|
-
}, null, 4));
|
|
80
|
-
}
|
|
81
|
-
});
|
|
82
|
-
export {
|
|
83
|
-
C as _
|
|
84
|
-
};
|