@opengis/cms 0.0.47 → 0.0.49

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.
Files changed (42) hide show
  1. package/dist/ArticlesPage-BcR1hbds.js +286 -0
  2. package/dist/BuilderPage-CK_osM89.js +386 -0
  3. package/dist/CollectionsBreadcrumb.vue_vue_type_script_setup_true_lang-CnOe9ORD.js +45 -0
  4. package/dist/CollectionsPage-JfmrHNR_.js +110 -0
  5. package/dist/CreateForm-BMOBeP4G.js +125 -0
  6. package/dist/EditCollectionPage-DtgvKGm-.js +803 -0
  7. package/dist/EmptyData-DaZt_nAm.js +72 -0
  8. package/dist/MenuAddPage-Bf48Z-ah.js +115 -0
  9. package/dist/MenuItemPage-BSwUW8tv.js +1365 -0
  10. package/dist/MenuPage-tJZtK46W.js +106 -0
  11. package/dist/MonacoEditor.vue_vue_type_script_setup_true_lang-B1DrxmQX.js +84 -0
  12. package/dist/UniversalTable.vue_vue_type_script_setup_true_lang-CJGTsd1V.js +210 -0
  13. package/dist/UniversalTablePagination.vue_vue_type_script_setup_true_lang-GYZd_gkA.js +89 -0
  14. package/dist/_plugin-vue_export-helper-CHgC5LLL.js +9 -0
  15. package/dist/contentForm-NcG15_5z.js +553 -0
  16. package/dist/getField-C7EZs-YQ.js +2920 -0
  17. package/dist/index.js +1710 -13356
  18. package/dist/vuedraggable-CoAPPFYd.js +1742 -0
  19. package/package.json +4 -4
  20. package/server/functions/getContent.js +21 -11
  21. package/server/functions/getSearchData.js +41 -0
  22. package/server/functions/getUser.js +4 -3
  23. package/server/migrations/fixes.sql +5 -0
  24. package/server/routes/cms/controllers/getContent.js +5 -4
  25. package/server/routes/cms/controllers/getPermissions.js +15 -15
  26. package/server/routes/cms/controllers/searchContent.js +7 -5
  27. package/server/routes/cms/controllers/setPermissions.js +49 -49
  28. package/server/routes/cms/functions/getSettings.js +4 -2
  29. package/server/routes/cms/utils/getCollection.js +10 -3
  30. package/server/routes/cms/utils/updateLocalization.js +4 -4
  31. package/server/routes/contentType/controllers/addContentType.js +0 -2
  32. package/server/routes/contentType/utils/updateCustomContentTable.js +5 -5
  33. package/server/routes/menu/functions/getMenu.js +4 -2
  34. package/server/templates/select/core.user_mentioned.sql +1 -1
  35. package/utils.d.ts +49 -13
  36. package/utils.js +1 -0
  37. package/dist/MenuAddPage-DJPQEn2D.js +0 -4
  38. package/dist/MenuItemPage-EH8svyv5.js +0 -4
  39. package/dist/MenuPage-BgE0yNpY.js +0 -4
  40. package/dist/en-sWmaB9uu.js +0 -787
  41. package/dist/index.umd.cjs +0 -272
  42. package/dist/uk-rH4IPxG5.js +0 -805
@@ -0,0 +1,106 @@
1
+ import { defineComponent as D, ref as a, onMounted as S, resolveComponent as V, openBlock as f, createElementBlock as _, createElementVNode as r, toDisplayString as u, unref as l, createVNode as m, withCtx as j, createTextVNode as F, createCommentVNode as N } from "vue";
2
+ import { useRouter as L } from "vue-router";
3
+ import { HelpCircle as q, Plus as B } from "lucide-vue-next";
4
+ import { _ as M } from "./UniversalTable.vue_vue_type_script_setup_true_lang-CJGTsd1V.js";
5
+ import { useI18n as P } from "vue-i18n";
6
+ import T from "@opengis/filter";
7
+ import { notify as w } from "@opengis/core";
8
+ const A = { class: "space-y-6 max-w-7xl mx-auto" }, H = { class: "flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between" }, I = { class: "flex items-center gap-2" }, O = { class: "text-3xl font-bold text-slate-800 dark:text-slate-100 mb-2" }, Q = ["href", "title"], R = { class: "text-slate-600 dark:text-slate-300" }, z = { class: "overflow-hidden bg-white border border-gray-200 rounded-lg shadow-sm dark:bg-gray-800 dark:border-gray-700" }, G = {
9
+ key: 0,
10
+ class: "p-4 border-b border-gray-200 sm:p-6 dark:border-gray-700"
11
+ }, ne = /* @__PURE__ */ D({
12
+ __name: "MenuPage",
13
+ setup(J) {
14
+ const { t: o, locale: g } = P(), v = L(), x = a(""), d = a([]), i = a([]), y = a(""), h = a([
15
+ { name: "name", title: o("cms.menu.form.name"), type: "text" },
16
+ { name: "description", title: o("cms.menu.form.description"), type: "text" },
17
+ { name: "locale", title: o("cms.menu.form.language"), type: "select", data: [{ text: "uk", id: "uk" }, { text: "en", id: "en" }] }
18
+ ]), p = async () => {
19
+ const t = await (await fetch("/api/cms-menu")).json(), s = t.rows;
20
+ d.value = s;
21
+ const n = (t.filters || []).map((c) => {
22
+ const { extra: K, title: U, ...E } = c;
23
+ return E;
24
+ });
25
+ i.value = n;
26
+ }, b = (e) => {
27
+ v.push(`/menu/edit/${e == null ? void 0 : e.menu_id}`);
28
+ }, k = async (e) => {
29
+ try {
30
+ await fetch(`/api/cms-menu/${e == null ? void 0 : e.menu_id}`, { method: "DELETE" }), await w({
31
+ title: o("cms.menu.menuDeleted"),
32
+ type: "success",
33
+ message: o("cms.menu.menuDeleted")
34
+ }), await p();
35
+ } catch {
36
+ w({
37
+ title: o("cms.menu.menuDeleteError"),
38
+ type: "error",
39
+ message: o("cms.menu.menuDeleteError")
40
+ });
41
+ }
42
+ }, $ = (e, t) => {
43
+ if (!t)
44
+ return !0;
45
+ const s = t.toLowerCase();
46
+ return h.value.some((n) => {
47
+ const c = e[n.name];
48
+ return c && c.toString().toLowerCase().includes(s);
49
+ });
50
+ }, C = (e) => {
51
+ const t = Object.entries(e == null ? void 0 : e.data).filter(([, s]) => s != null).map(([s, n]) => `${s}=${n}`).join("|");
52
+ y.value = t;
53
+ };
54
+ return S(p), (e, t) => {
55
+ var n;
56
+ const s = V("router-link");
57
+ return f(), _("div", A, [
58
+ r("div", H, [
59
+ r("div", null, [
60
+ r("div", I, [
61
+ r("h1", O, u(e.$t("cms.menu.title")), 1),
62
+ r("a", {
63
+ href: `https://cms.opengis.info/${l(g)}/guides/menu/`,
64
+ target: "_blank",
65
+ title: e.$t("cms.guide.menu")
66
+ }, [
67
+ m(l(q), { class: "w-5 h-5" })
68
+ ], 8, Q)
69
+ ]),
70
+ r("p", R, u(e.$t("cms.menu.description")), 1)
71
+ ]),
72
+ m(s, {
73
+ to: "/menu/create",
74
+ class: "inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium h-9 px-4 py-2 bg-blue-600 text-white shadow-md transition-all duration-200 transform hover:bg-blue-700 hover:shadow-lg hover:scale-105"
75
+ }, {
76
+ default: j(() => [
77
+ m(l(B), { class: "w-4 h-4 mr-2" }),
78
+ F(" " + u(e.$t("cms.menu.menuAdd")), 1)
79
+ ]),
80
+ _: 1
81
+ })
82
+ ]),
83
+ r("div", z, [
84
+ ((n = i.value) == null ? void 0 : n.length) > 0 ? (f(), _("div", G, [
85
+ m(l(T), {
86
+ schema: i.value,
87
+ view: "inline",
88
+ onChange: C
89
+ }, null, 8, ["schema"])
90
+ ])) : N("", !0),
91
+ m(M, {
92
+ rows: d.value,
93
+ columns: h.value,
94
+ query: x.value,
95
+ filterFn: $,
96
+ onEdit: b,
97
+ onDelete: k
98
+ }, null, 8, ["rows", "columns", "query"])
99
+ ])
100
+ ]);
101
+ };
102
+ }
103
+ });
104
+ export {
105
+ ne as default
106
+ };
@@ -0,0 +1,84 @@
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
+ };
@@ -0,0 +1,210 @@
1
+ import { defineComponent as j, ref as L, computed as $, openBlock as s, createElementBlock as n, createElementVNode as r, Fragment as v, renderList as C, normalizeClass as g, createBlock as f, resolveDynamicComponent as A, createCommentVNode as M, createTextVNode as _, toDisplayString as l, createVNode as F, unref as p, withModifiers as N, renderSlot as B } from "vue";
2
+ import { useI18n as q } from "vue-i18n";
3
+ import { Eye as U, File as P, Layers as z, Pencil as H, Trash2 as W, XCircle as X, Edit as G, CheckCircle as J } from "lucide-vue-next";
4
+ const K = { class: "text-card-foreground border-0 bg-white/80 dark:bg-slate-800/80 backdrop-blur-sm" }, O = { class: "p-0" }, Q = { class: "table-scroll overflow-x-auto" }, Y = { class: "relative w-full overflow-auto max-h-[calc(100vh-270px)]" }, Z = { class: "w-full caption-bottom text-sm" }, I = { class: "border-b border-slate-200 dark:border-slate-700 bg-slate-50/50 dark:bg-slate-700/50 hover:bg-slate-50/80 dark:hover:bg-slate-700/80 transition-colors" }, ee = { class: "flex items-center gap-2" }, te = { class: "h-10 text-center px-4 font-semibold text-slate-700 dark:text-slate-300 max-w-32" }, se = ["onClick"], ne = {
5
+ key: 1,
6
+ class: "whitespace-nowrap"
7
+ }, ae = {
8
+ key: 2,
9
+ class: "whitespace-nowrap"
10
+ }, re = {
11
+ key: 3,
12
+ class: "flex items-center"
13
+ }, ie = {
14
+ key: 4,
15
+ class: "inline-flex whitespace-nowrap items-center rounded-md border px-2.5 py-0.5 text-xs font-semibold transition-colors bg-white dark:bg-slate-700 border-slate-300 dark:border-slate-600 text-slate-700 dark:text-slate-300"
16
+ }, oe = {
17
+ key: 5,
18
+ class: "flex items-center"
19
+ }, de = {
20
+ key: 6,
21
+ class: "flex items-center gap-3"
22
+ }, le = {
23
+ key: 8,
24
+ class: "flex items-center gap-3"
25
+ }, ce = {
26
+ key: 11,
27
+ class: "flex items-center gap-3"
28
+ }, me = { class: "line-clamp-2" }, ue = { class: "flex justify-end py-2 px-4 align-middle max-w-40" }, be = { class: "flex items-center justify-center gap-1" }, he = ["onClick"], ge = ["onClick"], ye = /* @__PURE__ */ j({
29
+ __name: "UniversalTable",
30
+ props: {
31
+ rows: {},
32
+ query: {},
33
+ filterFn: { type: Function },
34
+ onEdit: { type: Function },
35
+ onView: { type: Function },
36
+ onDelete: { type: Function },
37
+ columns: {},
38
+ onMore: { type: Function },
39
+ customRender: {}
40
+ },
41
+ emits: ["edit", "view", "delete", "more"],
42
+ setup(b, { emit: E }) {
43
+ const { t: o } = q();
44
+ L(null);
45
+ const d = b, k = E, T = $(() => !d.query || !d.filterFn ? d.rows : d.rows.filter((a) => d.filterFn(a, d.query))), V = (a) => {
46
+ if (!a)
47
+ return "";
48
+ const i = new Date(a);
49
+ return isNaN(i.getTime()) ? "" : a.includes("T") || a.includes(" ") || a.includes(":") ? i.toLocaleString("uk-UA", { dateStyle: "medium", timeStyle: "medium" }) : i.toLocaleDateString("uk-UA", { dateStyle: "medium" });
50
+ }, y = (a) => {
51
+ switch (a) {
52
+ case "published":
53
+ return {
54
+ icon: J,
55
+ text: o("cms.common.status.published"),
56
+ classes: "bg-green-100 text-green-800 dark:bg-green-900/30 dark:text-green-200 border-green-200 dark:border-green-700"
57
+ };
58
+ case "draft":
59
+ return {
60
+ icon: G,
61
+ text: o("cms.common.status.draft"),
62
+ classes: "bg-yellow-100 text-yellow-800 dark:bg-yellow-900/30 dark:text-yellow-200 border-yellow-200 dark:border-yellow-700"
63
+ };
64
+ case "archived":
65
+ return {
66
+ icon: X,
67
+ text: o("cms.common.status.archived"),
68
+ classes: "bg-gray-100 text-gray-800 dark:bg-gray-900/30 dark:text-gray-300 border-gray-200 dark:border-gray-700"
69
+ };
70
+ default:
71
+ return null;
72
+ }
73
+ }, w = (a, i) => {
74
+ switch (a) {
75
+ case "edit":
76
+ k("edit", i), d.onEdit && d.onEdit(i);
77
+ break;
78
+ case "view":
79
+ k("view", i), d.onView && d.onView(i);
80
+ break;
81
+ case "delete":
82
+ k("delete", i);
83
+ break;
84
+ case "more":
85
+ k("more", i), d.onMore && d.onMore(i);
86
+ break;
87
+ }
88
+ }, R = (a) => {
89
+ w("edit", a);
90
+ }, S = (a) => {
91
+ const i = /* @__PURE__ */ new Date(), e = new Date(a), t = i - e, x = Math.floor(t / 1e3), c = Math.floor(x / 60), m = Math.floor(c / 60), u = Number(Math.floor(m / 24)), h = Number(Math.floor(u / 7));
92
+ return h >= 2 ? o("cms.table.time.weeksAgo", { count: h }) : h === 1 ? o("cms.table.time.weekAgo") : u >= 2 ? o("cms.table.time.daysAgo", { count: u }) : u === 1 ? o("cms.table.time.dayAgo") : m >= 2 ? o("cms.table.time.hoursAgo", { count: m }) : m === 1 ? o("cms.table.time.hourAgo") : c >= 2 ? o("cms.table.time.minutesAgo", { count: c }) : o(c === 1 ? "cms.table.time.minuteAgo" : "cms.table.time.justNow");
93
+ };
94
+ return (a, i) => (s(), n("div", K, [
95
+ r("div", O, [
96
+ r("div", Q, [
97
+ r("div", Y, [
98
+ r("table", Z, [
99
+ r("thead", null, [
100
+ r("tr", I, [
101
+ (s(!0), n(v, null, C(b.columns, (e) => (s(), n("th", {
102
+ key: e.name,
103
+ class: g(["h-10 px-4 text-left align-middle font-semibold text-slate-700 dark:text-slate-300 max-w-80", {
104
+ "min-w-[200px]": ["title", "name"].includes(e.name),
105
+ "min-w-[150px]": e.name === "slug",
106
+ "min-w-[250px]": e.name === "description"
107
+ }])
108
+ }, [
109
+ r("div", ee, [
110
+ e.icon ? (s(), f(A(e.icon), {
111
+ key: 0,
112
+ class: "w-5 h-5"
113
+ })) : M("", !0),
114
+ _(" " + l(e.label || e.title || e.ua || e.name), 1)
115
+ ])
116
+ ], 2))), 128)),
117
+ r("th", te, l(a.$t("cms.table.actions")), 1)
118
+ ])
119
+ ]),
120
+ r("tbody", null, [
121
+ (s(!0), n(v, null, C(T.value, (e) => (s(), n("tr", {
122
+ key: e.id || e._id || e.name,
123
+ class: "transition-all duration-200 hover:bg-slate-100 dark:hover:bg-slate-700/60"
124
+ }, [
125
+ (s(!0), n(v, null, C(b.columns, (t, x) => {
126
+ var c, m, u, h, D;
127
+ return s(), n("td", {
128
+ key: t.name,
129
+ class: g(["py-2 px-4 align-middle max-w-80", {
130
+ "font-medium text-slate-800 dark:text-white cursor-pointer": x === 0,
131
+ "text-slate-600 dark:text-slate-400 font-mono text-sm": x !== 0
132
+ }]),
133
+ onClick: (xe) => x === 0 ? R(e) : void 0
134
+ }, [
135
+ b.customRender && b.customRender[t.name] ? (s(), f(A(b.customRender[t.name](e[t.name], e)), { key: 0 })) : M("", !0),
136
+ [
137
+ "published_at",
138
+ "publish_at",
139
+ "created_at",
140
+ "date"
141
+ ].includes(t.name) && e[t.name] ? (s(), n("span", ne, l(V(e[t.name])), 1)) : [
142
+ "updated_at",
143
+ "lastModified",
144
+ "last_edit"
145
+ ].includes(t.name) ? (s(), n("span", ae, l(S(e[t.name]) || "--"), 1)) : t.name === "views" ? (s(), n("div", re, [
146
+ F(p(U), { class: "w-4 h-4 mr-1" }),
147
+ _(" " + l(((m = (c = e[t.name]) == null ? void 0 : c.toLocaleString) == null ? void 0 : m.call(c)) ?? e[t.name]), 1)
148
+ ])) : ["entries", "fields"].includes(t.name) ? (s(), n("div", ie, l(e[t.name] || "-"), 1)) : t.name === "type" ? (s(), n("div", oe, [
149
+ r("div", {
150
+ class: g(["whitespace-nowrap inline-flex items-center rounded-md border px-2.5 py-0.5 text-xs font-semibold transition-colors border-transparent hover:bg-secondary/80", e[t.name] === "pages" ? "bg-blue-100 text-blue-800 dark:bg-blue-900/30 dark:text-blue-300" : "bg-purple-100 text-purple-800 dark:bg-purple-900/30 dark:text-purple-300"])
151
+ }, l(e[t.name] || "-"), 3)
152
+ ])) : t.name === "name" ? (s(), n("div", de, [
153
+ e.type === "single" ? (s(), f(p(P), {
154
+ key: 0,
155
+ class: "shrink-0 lucide lucide-page w-5 h-5 text-blue-600"
156
+ })) : (s(), f(p(z), {
157
+ key: 1,
158
+ class: "shrink-0 lucide lucide-layers w-5 h-5 text-blue-600"
159
+ })),
160
+ _(" " + l(e[t.name]), 1)
161
+ ])) : t.name === "status" ? (s(), n(v, { key: 7 }, [
162
+ y(e[t.name]) ? (s(), n("div", {
163
+ key: 0,
164
+ class: g(["whitespace-nowrap rounded-md border px-2.5 py-0.5 text-xs font-semibold transition-colors hover:bg-secondary/80 flex items-center w-fit bg-green-100 text-green-800 border-green-200 dark:bg-green-900/30 dark:text-green-300 dark:border-green-700", (u = y(e[t.name])) == null ? void 0 : u.classes])
165
+ }, [
166
+ (s(), f(A((h = y(e[t.name])) == null ? void 0 : h.icon), { class: "w-3 h-3 mr-1" })),
167
+ _(" " + l((D = y(e[t.name])) == null ? void 0 : D.text), 1)
168
+ ], 2)) : M("", !0)
169
+ ], 64)) : t.name === "slug" ? (s(), n("div", le, l(e[t.name] ? "/" + e[t.name] : "-"), 1)) : t.name === "color" ? (s(), n("span", {
170
+ key: 9,
171
+ class: g(["w-4 h-4 rounded-full block ml-2", "bg-[" + e[t.name] + "]"])
172
+ }, null, 2)) : t.name === "enabled" ? (s(), n("span", {
173
+ key: 10,
174
+ class: g(["whitespace-nowrap rounded-md border px-2.5 py-0.5 text-xs font-semibold transition-colors hover:bg-secondary/80 flex items-center w-fit", e[t.name] ? "bg-green-100 text-green-800 border-green-200" : "bg-red-100 text-red-800 border-red-200"])
175
+ }, l(e[t.name] ? "Доступ" : "Заборонено"), 3)) : (s(), n("div", ce, [
176
+ r("p", me, l(e[t.name] || "-"), 1)
177
+ ]))
178
+ ], 10, se);
179
+ }), 128)),
180
+ r("td", ue, [
181
+ r("div", be, [
182
+ r("button", {
183
+ onClick: N((t) => w("edit", e), ["stop"]),
184
+ class: "inline-flex items-center justify-center whitespace-nowrap font-medium border rounded-md text-xs h-8 w-8 p-0 border-slate-300 bg-white transition-all duration-200 shadow-sm dark:border-slate-600 dark:bg-slate-700 dark:hover:bg-slate-600 dark:hover:text-slate-200 hover:border-blue-300 hover:bg-blue-50 hover:text-blue-600",
185
+ title: "Edit"
186
+ }, [
187
+ F(p(H), { class: "text-slate-800 dark:text-slate-200 w-4 h-4 group-hover:text-green-600 dark:group-hover:text-blue-50" })
188
+ ], 8, he),
189
+ r("button", {
190
+ onClick: N((t) => w("delete", e), ["stop"]),
191
+ class: "inline-flex items-center justify-center whitespace-nowrap font-medium border rounded-md text-xs h-8 w-8 p-0 border-slate-300 bg-white transition-all duration-200 shadow-sm dark:border-slate-600 dark:bg-slate-700 dark:hover:bg-slate-600 dark:hover:text-slate-200 hover:border-blue-300 hover:bg-blue-50 hover:text-blue-600",
192
+ title: "Preview"
193
+ }, [
194
+ F(p(W), { class: "w-4 h-4 text-slate-800 dark:text-slate-200 group-hover:text-red-600 dark:group-hover:text-blue-50" })
195
+ ], 8, ge),
196
+ B(a.$slots, "actions", { row: e })
197
+ ])
198
+ ])
199
+ ]))), 128))
200
+ ])
201
+ ])
202
+ ])
203
+ ])
204
+ ])
205
+ ]));
206
+ }
207
+ });
208
+ export {
209
+ ye as _
210
+ };
@@ -0,0 +1,89 @@
1
+ import { defineComponent as f, mergeModels as p, useModel as w, computed as h, openBlock as d, createElementBlock as c, createElementVNode as e, toDisplayString as n, createTextVNode as u, createVNode as b, unref as g, Fragment as v, renderList as k, normalizeClass as y } from "vue";
2
+ import { ChevronLeft as $, ChevronRight as M } from "lucide-vue-next";
3
+ const C = { class: "flex items-center justify-between px-6 py-4 border-t border-slate-200 dark:border-slate-700 bg-white dark:bg-slate-800" }, _ = { class: "flex justify-between flex-1 sm:hidden" }, j = { class: "relative inline-flex items-center px-4 py-2 text-sm font-medium text-gray-700 bg-white border border-gray-300 rounded-md hover:bg-gray-50" }, P = { class: "relative inline-flex items-center px-4 py-2 ml-3 text-sm font-medium text-gray-700 bg-white border border-gray-300 rounded-md hover:bg-gray-50" }, N = { class: "hidden sm:flex-1 sm:flex sm:items-center sm:justify-between" }, T = { class: "text-sm text-slate-600 dark:text-slate-400" }, V = { class: "font-medium text-slate-800 dark:text-slate-100" }, z = { class: "font-medium text-slate-800 dark:text-slate-100" }, B = {
4
+ class: "relative z-0 inline-flex space-x-2 rounded-md shadow-sm",
5
+ "aria-label": "Pagination"
6
+ }, E = ["disabled"], L = { class: "sr-only" }, S = { class: "space-x-1" }, D = {
7
+ key: 0,
8
+ class: "px-2 py-2 text-gray-400"
9
+ }, F = ["onClick"], R = ["disabled"], U = { class: "sr-only" }, G = /* @__PURE__ */ f({
10
+ __name: "UniversalTablePagination",
11
+ props: /* @__PURE__ */ p({
12
+ total: {},
13
+ count: {},
14
+ limit: {}
15
+ }, {
16
+ page: {},
17
+ pageModifiers: {}
18
+ }),
19
+ emits: ["update:page"],
20
+ setup(a) {
21
+ const t = w(a, "page"), r = h(() => Math.ceil(a.total / a.limit)), x = h(() => {
22
+ const s = [];
23
+ if (r.value <= 4) {
24
+ for (let i = 1; i <= r.value; i++)
25
+ s.push(i);
26
+ return s;
27
+ }
28
+ const o = Math.max(2, t.value - 2), m = Math.min(r.value - 1, t.value + 2);
29
+ s.push(1), o > 2 && s.push("ellipsis");
30
+ for (let i = o; i <= m; i++)
31
+ s.push(i);
32
+ return m < r.value - 1 && s.push("ellipsis"), s.push(r.value), s;
33
+ });
34
+ return (l, s) => (d(), c("div", C, [
35
+ e("div", _, [
36
+ e("button", j, n(l.$t("cms.common.pagination.previous")), 1),
37
+ e("button", P, n(l.$t("cms.common.pagination.next")), 1)
38
+ ]),
39
+ e("div", N, [
40
+ e("div", null, [
41
+ e("p", T, [
42
+ u(n(l.$t("cms.common.pagination.showing")) + " ", 1),
43
+ e("span", V, n(a.count), 1),
44
+ u(" " + n(l.$t("cms.common.pagination.of")) + " ", 1),
45
+ e("span", z, n(a.total), 1),
46
+ u(" " + n(l.$t("cms.common.pagination.results")), 1)
47
+ ])
48
+ ]),
49
+ e("div", null, [
50
+ e("nav", B, [
51
+ e("button", {
52
+ onClick: s[0] || (s[0] = (o) => t.value = t.value > 1 ? t.value - 1 : 1),
53
+ disabled: t.value === 1,
54
+ class: "inline-flex items-center justify-center whitespace-nowrap font-medium transition-colors border shadow-sm rounded-md text-xs h-8 w-8 p-0 bg-white border-slate-300 text-slate-600 disabled:pointer-events-none disabled:opacity-50 disabled:cursor-not-allowed hover:text-accent-foreground hover:bg-slate-50 dark:bg-slate-700 dark:border-slate-600 dark:text-slate-300 dark:hover:bg-slate-600"
55
+ }, [
56
+ e("span", L, n(l.$t("cms.common.pagination.previous")), 1),
57
+ b(g($), { class: "w-5 h-5" })
58
+ ], 8, E),
59
+ e("div", S, [
60
+ (d(!0), c(v, null, k(x.value, (o, m) => (d(), c(v, {
61
+ key: o + "-" + m
62
+ }, [
63
+ o === "ellipsis" ? (d(), c("span", D, "...")) : (d(), c("button", {
64
+ key: 1,
65
+ onClick: (i) => t.value = o,
66
+ class: y(["inline-flex items-center justify-center whitespace-nowrap font-medium transition-colors h-8 w-8 p-0 text-sm rounded-md", {
67
+ "border shadow-sm hover:text-accent-foreground bg-white dark:bg-slate-700 border-slate-300 dark:border-slate-600 text-slate-600 dark:text-slate-300 hover:border-blue-600 hover:bg-slate-50 dark:hover:bg-slate-600": o !== t.value,
68
+ "shadow bg-blue-600 hover:bg-blue-700 text-white border-blue-600": o === t.value
69
+ }])
70
+ }, n(o), 11, F))
71
+ ], 64))), 128))
72
+ ]),
73
+ e("button", {
74
+ onClick: s[1] || (s[1] = (o) => t.value = t.value < Math.ceil(a.total / a.limit) ? t.value + 1 : Math.ceil(a.total / a.limit)),
75
+ disabled: t.value === Math.ceil(a.total / a.limit),
76
+ class: "inline-flex items-center justify-center whitespace-nowrap font-medium transition-colors border shadow-sm rounded-md text-xs h-8 w-8 p-0 bg-white border-slate-300 text-slate-600 disabled:pointer-events-none disabled:opacity-50 disabled:cursor-not-allowed hover:text-accent-foreground hover:bg-slate-50 dark:bg-slate-700 dark:border-slate-600 dark:text-slate-300 dark:hover:bg-slate-600"
77
+ }, [
78
+ e("span", U, n(l.$t("cms.common.pagination.next")), 1),
79
+ b(g(M), { class: "w-5 h-5" })
80
+ ], 8, R)
81
+ ])
82
+ ])
83
+ ])
84
+ ]));
85
+ }
86
+ });
87
+ export {
88
+ G as _
89
+ };
@@ -0,0 +1,9 @@
1
+ const s = (t, r) => {
2
+ const o = t.__vccOpts || t;
3
+ for (const [c, e] of r)
4
+ o[c] = e;
5
+ return o;
6
+ };
7
+ export {
8
+ s as _
9
+ };