@opengis/cms 0.0.56 → 0.0.58

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 (149) hide show
  1. package/README.md +131 -131
  2. package/dist/AddNewItemInTree-05PSSEFi.js +76 -0
  3. package/dist/ArticlesPage-CFjE_cw_.js +298 -0
  4. package/dist/CollectionsBreadcrumb-BCxeRikP.js +4 -0
  5. package/dist/CollectionsBreadcrumb.vue_vue_type_script_setup_true_lang-umRzB5mY.js +53 -0
  6. package/dist/CollectionsPage-DHfPNql6.js +124 -0
  7. package/dist/{CreateForm-BMOBeP4G.js → CreateForm-5FvT45vH.js} +1 -1
  8. package/dist/Dashboard-C1eGscNd.js +358 -0
  9. package/dist/EditCollectionPage-DIr1tdtn.js +187 -0
  10. package/dist/{EmptyData-DaZt_nAm.js → EmptyData-DxPrSXhV.js} +1 -1
  11. package/dist/{MenuAddPage-Bf48Z-ah.js → MenuAddPage-D-p3gFgm.js} +40 -35
  12. package/dist/MenuBody-rN5j4YBu.js +125 -0
  13. package/dist/MenuItemPage-BoJw885D.js +1027 -0
  14. package/dist/MenuList-DFEBS0NB.js +172 -0
  15. package/dist/MenuPage-BCZB_S8j.js +107 -0
  16. package/dist/MenuWrapper-AZ_8s-zd.js +12 -0
  17. package/dist/MonacoEditor-Db-3Jc3E.js +4 -0
  18. package/dist/{UniversalTable.vue_vue_type_script_setup_true_lang-CJGTsd1V.js → UniversalTable-CzqPG-tY.js} +12 -12
  19. package/dist/{UniversalTablePagination.vue_vue_type_script_setup_true_lang-GYZd_gkA.js → UniversalTablePagination-4gL47A7I.js} +1 -1
  20. package/dist/VsFormTags-CMjiu9sY.js +114 -0
  21. package/dist/VsPreview-DwETkOpb.js +63 -0
  22. package/dist/contentForm-CtMhQTG0.js +489 -0
  23. package/dist/getField-CpwVE28P.js +179 -0
  24. package/dist/index.d.ts +8 -0
  25. package/dist/index.html +29 -29
  26. package/dist/index.js +72 -71
  27. package/dist/style.css +1 -1
  28. package/dist/vs-builder-edit-D-q1o8tF.js +604 -0
  29. package/dist/vs-builder-monaco-B3Jj0V31.js +33 -0
  30. package/dist/vs-builder-preview-BH4VAM3a.js +44 -0
  31. package/dist/vs-form-custom-datatable-BDZo48w3.js +317 -0
  32. package/dist/vs-form-integer-BZ855R3g.js +61 -0
  33. package/dist/vs-form-media-select-NY27EaG1.js +837 -0
  34. package/dist/vs-form-reference-list-Dtv8fJJU.js +1536 -0
  35. package/dist/vs-form-reletion-link-BhzNQszm.js +34 -0
  36. package/dist/vs-form-tiptap-DDFQjRjY.js +4 -0
  37. package/dist/vs-form-tiptap.vue_vue_type_script_setup_true_lang-DGgsqXwg.js +11 -0
  38. package/dist/vs-richtext-md-C098v_6Q.js +4 -0
  39. package/dist/vs-richtext-md.vue_vue_type_script_setup_true_lang-Ct8uTV-J.js +14 -0
  40. package/input-types.json +9 -9
  41. package/locales/en.json +815 -814
  42. package/locales/uk.json +813 -812
  43. package/module/cms/cls/content.status.json +17 -17
  44. package/module/cms/cls/user_type.json +9 -9
  45. package/module/cms/form/admin.users.form.json +77 -77
  46. package/module/cms/select/cms.page_type.sql +1 -1
  47. package/module/cms/select/news_tag_id.sql +11 -11
  48. package/module/cms/table/admin.users.table.json +53 -53
  49. package/module/cms/table/collection.default.table.json +96 -96
  50. package/module/cms/table/single.default.table.json +116 -116
  51. package/package.json +68 -68
  52. package/plugin.js +43 -43
  53. package/server/app.js +35 -35
  54. package/server/config.js +4 -4
  55. package/server/functions/getContent.js +45 -45
  56. package/server/functions/getDraftKey.js +22 -22
  57. package/server/functions/getSearchData.js +31 -31
  58. package/server/functions/getTags.js +30 -30
  59. package/server/functions/getUser.js +27 -27
  60. package/server/functions/utils/mock.reply.js +55 -55
  61. package/server/index.js +22 -22
  62. package/server/migrations/fixes.sql +129 -129
  63. package/server/migrations/site.sql +595 -595
  64. package/server/plugins/adminHook.js +78 -78
  65. package/server/plugins/hook.js +59 -59
  66. package/server/plugins/vite.js +75 -75
  67. package/server/routes/category/controllers/cms.category.delete.js +21 -21
  68. package/server/routes/category/controllers/cms.category.get.js +17 -17
  69. package/server/routes/category/controllers/cms.category.list.js +16 -16
  70. package/server/routes/category/controllers/cms.category.post.js +21 -21
  71. package/server/routes/category/controllers/cms.category.put.js +23 -23
  72. package/server/routes/category/index.mjs +22 -22
  73. package/server/routes/cms/controllers/cmsStat.js +55 -55
  74. package/server/routes/cms/controllers/cmsSuggest.js +57 -57
  75. package/server/routes/cms/controllers/deleteContent.js +113 -113
  76. package/server/routes/cms/controllers/deleteMedia.js +76 -76
  77. package/server/routes/cms/controllers/downloadMedia.js +84 -84
  78. package/server/routes/cms/controllers/getContent.js +113 -113
  79. package/server/routes/cms/controllers/getContentBySlug.js +93 -93
  80. package/server/routes/cms/controllers/insertContent.js +217 -217
  81. package/server/routes/cms/controllers/listMedia.js +155 -155
  82. package/server/routes/cms/controllers/metadataMedia.js +39 -39
  83. package/server/routes/cms/controllers/properties.get.js +18 -18
  84. package/server/routes/cms/controllers/properties.post.js +99 -99
  85. package/server/routes/cms/controllers/searchContent.js +214 -214
  86. package/server/routes/cms/controllers/translate.js +89 -89
  87. package/server/routes/cms/controllers/updateContent.js +266 -264
  88. package/server/routes/cms/controllers/uploadMedia.js +79 -79
  89. package/server/routes/cms/functions/getSettings.js +48 -48
  90. package/server/routes/cms/index.mjs +112 -112
  91. package/server/routes/cms/utils/additionalData.js +35 -35
  92. package/server/routes/cms/utils/getCollection.js +89 -89
  93. package/server/routes/cms/utils/getSingle.js +188 -183
  94. package/server/routes/cms/utils/inputTypes.js +5 -5
  95. package/server/routes/cms/utils/insertContentLocalization.js +104 -104
  96. package/server/routes/cms/utils/requestTranslation.js +85 -85
  97. package/server/routes/cms/utils/updateLocalization.js +47 -47
  98. package/server/routes/cmsSpace/controllers/deleteSpace.js +25 -25
  99. package/server/routes/cmsSpace/controllers/getSpaces.js +27 -27
  100. package/server/routes/cmsSpace/controllers/insertSpace.js +21 -21
  101. package/server/routes/cmsSpace/controllers/updateSpace.js +23 -23
  102. package/server/routes/cmsSpace/index.mjs +20 -20
  103. package/server/routes/contentType/controllers/addContentType.js +160 -160
  104. package/server/routes/contentType/controllers/contentTypeList.js +54 -54
  105. package/server/routes/contentType/controllers/delContentType.js +75 -75
  106. package/server/routes/contentType/controllers/editContentType.js +88 -81
  107. package/server/routes/contentType/controllers/getContentType.js +65 -57
  108. package/server/routes/contentType/index.mjs +35 -35
  109. package/server/routes/contentType/utils/updateContents.js +44 -44
  110. package/server/routes/contentType/utils/updateCustomContentTable.js +53 -53
  111. package/server/routes/feedback/controllers/email.list.js +24 -24
  112. package/server/routes/feedback/controllers/feedback.js +48 -48
  113. package/server/routes/feedback/controllers/feedback.list.js +37 -37
  114. package/server/routes/feedback/controllers/news.subscriptions.js +44 -44
  115. package/server/routes/feedback/index.mjs +71 -71
  116. package/server/routes/logs/controllers/export.user.logs.js +77 -77
  117. package/server/routes/logs/controllers/user.logs.js +44 -44
  118. package/server/routes/logs/index.mjs +9 -9
  119. package/server/routes/menu/controllers/addMenu.js +37 -37
  120. package/server/routes/menu/controllers/delMenu.js +31 -31
  121. package/server/routes/menu/controllers/editMenu.js +41 -41
  122. package/server/routes/menu/controllers/getMenu.js +24 -24
  123. package/server/routes/menu/functions/getMenu.js +50 -50
  124. package/server/routes/menu/index.mjs +13 -13
  125. package/server/routes/migration/controllers/collectionToCustom.js +137 -137
  126. package/server/routes/migration/index.mjs +8 -8
  127. package/server/routes/root.mjs +8 -8
  128. package/server/routes/tags/controllers/add.tags.js +24 -24
  129. package/server/routes/tags/controllers/del.tags.js +19 -19
  130. package/server/routes/tags/controllers/edit.tags.js +25 -25
  131. package/server/routes/tags/controllers/get.tags.js +15 -15
  132. package/server/routes/tags/index.mjs +14 -14
  133. package/server/templates/cls/cms.category_type.json +9 -9
  134. package/server/templates/cls/cms.content_review_status.json +9 -9
  135. package/server/templates/cls/cms.content_status.json +9 -9
  136. package/server/templates/cls/cms.content_type.json +9 -9
  137. package/server/templates/cls/cms.lang.json +9 -9
  138. package/server/templates/page/login.html +126 -126
  139. package/utils.d.ts +52 -52
  140. package/utils.js +8 -8
  141. package/dist/ArticlesPage-BcR1hbds.js +0 -286
  142. package/dist/BuilderPage-CK_osM89.js +0 -386
  143. package/dist/CollectionsBreadcrumb.vue_vue_type_script_setup_true_lang-CnOe9ORD.js +0 -45
  144. package/dist/CollectionsPage-JfmrHNR_.js +0 -110
  145. package/dist/EditCollectionPage-Cw3GQYRe.js +0 -809
  146. package/dist/MenuItemPage-CXn5HC8j.js +0 -1366
  147. package/dist/MenuPage-tJZtK46W.js +0 -106
  148. package/dist/contentForm-B6gHgGkz.js +0 -586
  149. package/dist/getField-Y5WXnRR0.js +0 -2948
@@ -0,0 +1,837 @@
1
+ import { openBlock as o, createElementBlock as p, normalizeClass as S, unref as c, toDisplayString as d, ref as y, onMounted as xe, onUpdated as Te, createVNode as b, createElementVNode as s, createCommentVNode as z, Fragment as Z, renderList as oe, withModifiers as V, createBlock as k, resolveComponent as Pe, createTextVNode as G, mergeModels as ge, useModel as Ie, computed as R, watch as X, mergeProps as Se, withCtx as He, Teleport as be, normalizeStyle as Le, withDirectives as Ne, vModelText as Ee } from "vue";
2
+ import { File as Oe, Trash2 as J, Folder as we, FileText as Ve, ChevronRight as ye, GripVertical as qe, Download as ae, Loader2 as le, Plus as fe, Image as Ue, Search as Re, ChevronDown as Ge, LayoutGrid as Ze, List as We } from "lucide-vue-next";
3
+ import { d as Ke } from "./vuedraggable-CoAPPFYd.js";
4
+ import { confirm as Qe } from "@opengis/core";
5
+ import { useI18n as ne } from "vue-i18n";
6
+ import { _ as ie } from "./_plugin-vue_export-helper-CHgC5LLL.js";
7
+ import { useRoute as Xe, useRouter as Je } from "vue-router";
8
+ function ke(u) {
9
+ if (u === 0)
10
+ return "0 Bytes";
11
+ const h = 1024, _ = ["Bytes", "KB", "MB", "GB", "TB"], w = Math.floor(Math.log(u) / Math.log(h));
12
+ return Number.parseFloat((u / Math.pow(h, w)).toFixed(2)) + " " + _[w];
13
+ }
14
+ function Ye(u) {
15
+ const h = new Date(u);
16
+ return isNaN(h.getTime()) ? "" : h.toISOString().slice(0, 10);
17
+ }
18
+ const et = {
19
+ __name: "TypeTag",
20
+ props: {
21
+ type: {
22
+ type: String,
23
+ required: !0
24
+ }
25
+ },
26
+ setup(u) {
27
+ const h = /* @__PURE__ */ new Map([
28
+ ["document", "bg-blue-100 text-blue-800 border-blue-200 dark:bg-blue-900/30 dark:text-blue-300 dark:border-blue-700"],
29
+ ["image", "bg-green-100 text-green-800 border-green-200 dark:bg-green-900/30 dark:text-green-300 dark:border-green-700"],
30
+ ["video", "bg-purple-100 text-purple-800 border-purple-200 dark:bg-purple-900/30 dark:text-purple-300 dark:border-purple-700"]
31
+ ]);
32
+ return (_, w) => (o(), p("div", {
33
+ class: S(["inline-flex items-center rounded-md border px-2.5 py-0.5 text-xs font-semibold transition-colors shadow-lg backdrop-blur-sm", c(h).get(u.type)])
34
+ }, d(u.type), 3));
35
+ }
36
+ }, tt = { class: "grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-6 max-h-[calc(100%-130px)] overflow-y-auto px-2 pt-2 pb-5" }, st = {
37
+ key: 0,
38
+ class: "flex flex-col items-center justify-center h-64 text-muted-foreground col-span-full"
39
+ }, at = ["onClick"], lt = ["onClick"], rt = { class: "truncate font-medium text-slate-800 dark:text-slate-100 mb-2" }, ot = { class: "text-sm text-slate-500 dark:text-slate-400" }, nt = ["onClick"], it = { class: "p-0" }, dt = { class: "aspect-video bg-slate-100 dark:bg-slate-700 rounded-t-lg overflow-hidden relative" }, ut = { class: "w-full h-full flex items-center justify-center bg-gradient-to-br from-slate-100 to-slate-200 dark:from-slate-700 dark:to-slate-800" }, ct = {
40
+ key: 0,
41
+ class: "relative w-full"
42
+ }, pt = ["src", "alt"], vt = { class: "p-4" }, ht = { class: "flex items-center justify-between mb-2" }, mt = { class: "font-medium text-slate-800 dark:text-slate-100 truncate flex-1 mr-2" }, gt = { class: "space-y-1 text-sm text-slate-500 dark:text-slate-400" }, bt = { class: "flex justify-between" }, yt = { class: "flex justify-between" }, ft = {
43
+ __name: "MediaGrid",
44
+ props: {
45
+ files: {
46
+ type: Array,
47
+ required: !0
48
+ },
49
+ selectedFile: {
50
+ type: Object,
51
+ default: null
52
+ },
53
+ selectedFiles: {
54
+ type: Array,
55
+ default: () => []
56
+ },
57
+ isDeleteButton: {
58
+ type: Boolean,
59
+ default: !1
60
+ }
61
+ },
62
+ emits: ["delete-file", "file-click", "delete-folder"],
63
+ setup(u, { emit: h }) {
64
+ ne();
65
+ const _ = u, w = y([]), M = y(null), i = (g) => {
66
+ if (!g)
67
+ return "";
68
+ const m = new Date(g);
69
+ return isNaN(m.getTime()) ? "" : m.toISOString().slice(0, 10);
70
+ }, $ = () => {
71
+ w.value = _.files.sort((g, m) => g.type === "dir" && m.type !== "dir" ? -1 : g.type !== "dir" && m.type === "dir" ? 1 : 0);
72
+ };
73
+ return xe(() => $()), Te(() => $()), (g, m) => {
74
+ var v;
75
+ return o(), p("div", tt, [
76
+ ((v = u.files) == null ? void 0 : v.length) === 0 ? (o(), p("div", st, [
77
+ b(c(Oe), { class: "w-12 h-12 mb-2" }),
78
+ s("p", null, d(g.$t("cms.noFilesInFolder")), 1)
79
+ ])) : z("", !0),
80
+ (o(!0), p(Z, null, oe(w.value, (e) => {
81
+ var H;
82
+ return o(), p(Z, {
83
+ key: e == null ? void 0 : e.url
84
+ }, [
85
+ (e == null ? void 0 : e.type) === "dir" ? (o(), p("div", {
86
+ key: 0,
87
+ class: "p-6 text-center rounded-xl h-[fit-content] relative text-card-foreground shadow-lg border-0 bg-white dark:bg-slate-800 backdrop-blur-sm hover:shadow-xl transition-all duration-200 transform hover:scale-105 cursor-pointer",
88
+ onClick: (D) => g.$emit("file-click", e)
89
+ }, [
90
+ u.isDeleteButton ? (o(), p("div", {
91
+ key: 0,
92
+ onClick: V((D) => {
93
+ M.value = e;
94
+ }, ["stop"]),
95
+ class: "absolute top-4 right-4 p-1 border border-gray-300 dark:border-slate-700 rounded-lg cursor-pointer hover:bg-gray-200 dark:hover:bg-slate-700 group"
96
+ }, [
97
+ b(c(J), { class: "w-4 h-4 text-gray-500 group-hover:text-red-500" })
98
+ ], 8, lt)) : z("", !0),
99
+ b(c(we), { class: "w-16 h-16 mx-auto mb-4 text-blue-600" }),
100
+ s("h3", rt, d(e == null ? void 0 : e.name), 1),
101
+ s("p", ot, d(e == null ? void 0 : e.count) + " " + d(g.$t("cms.media.files")), 1)
102
+ ], 8, at)) : (e == null ? void 0 : e.type) === "file" ? (o(), p("div", {
103
+ key: 1,
104
+ class: S(["h-[fit-content] rounded-xl text-card-foreground shadow-lg border-0 bg-white dark:bg-slate-800 backdrop-blur-sm hover:shadow-xl transition-all duration-200 transform hover:scale-105 group cursor-pointer", {
105
+ "bg-accent text-accent-foreground ring-2 ring-primary": ((H = u.selectedFile) == null ? void 0 : H.url) === (e == null ? void 0 : e.url) || u.selectedFiles && u.selectedFiles.some((D) => D.id === e.id)
106
+ }]),
107
+ onClick: (D) => g.$emit("file-click", e)
108
+ }, [
109
+ s("div", it, [
110
+ s("div", dt, [
111
+ s("div", ut, [
112
+ (e == null ? void 0 : e.filetype) === "image" && (e != null && e.filepath || e != null && e.url) ? (o(), p("div", ct, [
113
+ s("img", {
114
+ src: e == null ? void 0 : e.preview,
115
+ alt: (e == null ? void 0 : e.alt) || (e == null ? void 0 : e.filename),
116
+ class: "object-cover w-full h-full rounded text-xs"
117
+ }, null, 8, pt)
118
+ ])) : (o(), k(c(Ve), {
119
+ key: 1,
120
+ class: "w-12 h-12 text-gray-500"
121
+ }))
122
+ ])
123
+ ]),
124
+ s("div", vt, [
125
+ s("div", ht, [
126
+ s("h3", mt, d(e.filename), 1),
127
+ b(et, {
128
+ type: e == null ? void 0 : e.filetype
129
+ }, null, 8, ["type"])
130
+ ]),
131
+ s("div", gt, [
132
+ s("div", bt, [
133
+ s("span", null, d(g.$t("cms.media.size")) + ":", 1),
134
+ s("span", null, d(c(ke)(e.filesize)), 1)
135
+ ]),
136
+ s("div", yt, [
137
+ s("span", null, d(g.$t("cms.media.uploaded")) + ":", 1),
138
+ s("span", null, d(i(e.created_at)), 1)
139
+ ])
140
+ ])
141
+ ])
142
+ ])
143
+ ], 10, nt)) : z("", !0)
144
+ ], 64);
145
+ }), 128))
146
+ ]);
147
+ };
148
+ }
149
+ }, xt = {}, wt = {
150
+ "aria-hidden": "true",
151
+ focusable: "false",
152
+ role: "img",
153
+ viewBox: "0 0 16 16",
154
+ width: "16",
155
+ height: "16",
156
+ fill: "currentColor"
157
+ };
158
+ function kt(u, h) {
159
+ return o(), p("svg", wt, [...h[0] || (h[0] = [
160
+ s("path", { d: "M.513 1.513A1.75 1.75 0 0 1 1.75 1h3.5c.55 0 1.07.26 1.4.7l.9 1.2a.25.25 0 0 0 .2.1H 13a1 1 0 0 1 1 1v.5H2.75a.75.75 0 0 0 0 1.5h11.978a1 1 0 0 1 .994 1.117L15 13.25A1.75 1.75 0 0 1 13.25 15H1.75A1.75 1.75 0 0 1 0 13.25V2.75c0-.464.184-.91.513-1.237Z" }, null, -1),
161
+ s("path", { d: "M1.75 1A1.75 1.75 0 0 0 0 2.75v10.5C0 14.216.784 15 1.75 15h12.5A1.75 1.75 0 0 0 16 13.25v-8.5A1.75 1.75 0 0 0 14.25 3H7.5a.25.25 0 0 1-.2-.1l-.9-1.2C6.07 1.26 5.55 1 5 1H1.75Z" }, null, -1)
162
+ ])]);
163
+ }
164
+ const _t = /* @__PURE__ */ ie(xt, [["render", kt]]), $t = {}, Ct = {
165
+ "aria-hidden": "true",
166
+ focusable: "false",
167
+ role: "img",
168
+ viewBox: "0 0 16 16",
169
+ width: "16",
170
+ height: "16",
171
+ fill: "currentColor"
172
+ };
173
+ function Ft(u, h) {
174
+ return o(), p("svg", Ct, [...h[0] || (h[0] = [
175
+ s("path", { d: "M.513 1.513A1.75 1.75 0 0 1 1.75 1h3.5c.55 0 1.07.26 1.4.7l.9 1.2a.25.25 0 0 0 .2.1H 13a1 1 0 0 1 1 1v.5H2.75a.75.75 0 0 0 0 1.5h11.978a1 1 0 0 1 .994 1.117L15 13.25A1.75 1.75 0 0 1 13.25 15H1.75A1.75 1.75 0 0 1 0 13.25V2.75c0-.464.184-.91.513-1.237Z" }, null, -1),
176
+ s("path", { d: "M1.75 1A1.75 1.75 0 0 0 0 2.75v10.5C0 14.216.784 15 1.75 15h12.5A1.75 1.75 0 0 0 16 13.25v-8.5A1.75 1.75 0 0 0 14.25 3H7.5a.25.25 0 0 1-.2-.1l-.9-1.2C6.07 1.26 5.55 1 5 1H1.75Z" }, null, -1)
177
+ ])]);
178
+ }
179
+ const At = /* @__PURE__ */ ie($t, [["render", Ft]]), jt = {
180
+ key: 0,
181
+ class: "flex flex-col items-center justify-center h-64 text-muted-foreground"
182
+ }, Bt = {
183
+ key: 1,
184
+ class: "w-full text-sm caption-bottom"
185
+ }, zt = { class: "[&_tr]:border-b" }, Mt = { class: "border-b transition-colors hover:bg-muted/50 data-[state=selected]:bg-muted" }, Dt = { class: "h-12 px-4 text-left align-middle font-medium text-muted-foreground w-[300px]" }, Tt = { class: "h-12 px-4 font-medium text-left align-middle text-muted-foreground" }, Pt = { class: "h-12 px-4 font-medium text-left align-middle text-muted-foreground" }, It = { class: "hidden h-12 px-4 font-medium text-left align-middle text-muted-foreground md:table-cell" }, St = { class: "[&_tr:last-child]:border-0" }, Ht = ["onClick"], Lt = { class: "p-4 font-medium align-middle" }, Nt = { class: "flex items-center gap-2" }, Et = {
186
+ key: 1,
187
+ class: "relative w-8 h-8"
188
+ }, Ot = ["src", "alt"], Vt = { class: "truncate max-w-[200px]" }, qt = { class: "p-4 align-middle" }, Ut = { class: "p-4 align-middle" }, Rt = { class: "hidden p-4 align-middle md:table-cell" }, Gt = { key: 0 }, Zt = {
189
+ __name: "MediaList",
190
+ props: {
191
+ files: {
192
+ type: Array,
193
+ required: !0
194
+ },
195
+ selectedFile: {
196
+ type: Object,
197
+ default: null
198
+ },
199
+ selectedFiles: {
200
+ type: Array,
201
+ default: () => []
202
+ }
203
+ },
204
+ emits: ["file-click", "delete-folder"],
205
+ setup(u, { emit: h }) {
206
+ const { t: _ } = ne(), w = y(null), M = h, i = () => {
207
+ Qe({
208
+ title: _("cms.builder.deleteTitle"),
209
+ message: _("cms.builder.deleteObject"),
210
+ type: "error",
211
+ onConfirm: () => {
212
+ $();
213
+ }
214
+ });
215
+ }, $ = () => {
216
+ M("delete-folder", w.value);
217
+ };
218
+ return (g, m) => {
219
+ const v = Pe("File");
220
+ return o(), p("div", null, [
221
+ u.files.length === 0 ? (o(), p("div", jt, [
222
+ b(v, { class: "w-12 h-12 mb-2" }),
223
+ s("p", null, d(g.$t("cms.media.noFilesInFolder")), 1)
224
+ ])) : (o(), p("table", Bt, [
225
+ s("thead", zt, [
226
+ s("tr", Mt, [
227
+ s("th", Dt, d(g.$t("cms.media.name")), 1),
228
+ s("th", Tt, d(g.$t("cms.media.type")), 1),
229
+ s("th", Pt, d(g.$t("cms.media.size")), 1),
230
+ s("th", It, d(g.$t("cms.media.updatedAt")), 1),
231
+ m[0] || (m[0] = s("th", null, null, -1))
232
+ ])
233
+ ]),
234
+ s("tbody", St, [
235
+ (o(!0), p(Z, null, oe(u.files, (e) => {
236
+ var H, D, q, A, L;
237
+ return o(), p("tr", {
238
+ key: e.id,
239
+ class: S(["border-b transition-colors hover:bg-blue-200/50 data-[state=selected]:bg-muted cursor-pointer", {
240
+ "bg-blue-200": ((H = w.value) == null ? void 0 : H.id) === e.id && ((D = w.value) == null ? void 0 : D.type) === e.type || u.selectedFiles && u.selectedFiles.some((j) => j.id === e.id && j.type === e.type)
241
+ }]),
242
+ onClick: (j) => g.$emit("file-click", e)
243
+ }, [
244
+ s("td", Lt, [
245
+ s("div", Nt, [
246
+ e.type === "dir" ? (o(), k(_t, {
247
+ key: 0,
248
+ class: "w-5 h-5 text-blue-500"
249
+ })) : (e == null ? void 0 : e.filetype) === "image" && (e != null && e.filepath) ? (o(), p("div", Et, [
250
+ s("img", {
251
+ src: e == null ? void 0 : e.preview,
252
+ alt: (e == null ? void 0 : e.alt) || (e == null ? void 0 : e.filename),
253
+ class: "object-cover w-full h-full rounded"
254
+ }, null, 8, Ot)
255
+ ])) : (e == null ? void 0 : e.filetype) === "image" ? (o(), k(At, {
256
+ key: 2,
257
+ class: "w-5 h-5 text-green-500"
258
+ })) : (o(), k(v, {
259
+ key: 3,
260
+ class: "w-5 h-5 text-gray-500"
261
+ })),
262
+ s("span", Vt, d((e == null ? void 0 : e.filename) || (e == null ? void 0 : e.name)), 1)
263
+ ])
264
+ ]),
265
+ s("td", qt, d((e == null ? void 0 : e.type) === "dir" ? g.$t("cms.media.folder") : ((A = (q = e == null ? void 0 : e.filetype) == null ? void 0 : q.charAt(0)) == null ? void 0 : A.toUpperCase()) + ((L = e == null ? void 0 : e.filetype) == null ? void 0 : L.slice(1))), 1),
266
+ s("td", Ut, d((e == null ? void 0 : e.type) === "dir" ? "--" : c(ke)(e == null ? void 0 : e.filesize)), 1),
267
+ s("td", Rt, d(e != null && e.updated_at ? c(Ye)(e == null ? void 0 : e.updated_at) : "--"), 1),
268
+ e.type === "dir" ? (o(), p("td", Gt, [
269
+ b(c(J), {
270
+ class: "w-4 h-4 text-red-500 cursor-pointer",
271
+ onClick: V(i, ["stop"])
272
+ }, null, 8, ["onClick"])
273
+ ])) : z("", !0)
274
+ ], 10, Ht);
275
+ }), 128))
276
+ ])
277
+ ]))
278
+ ]);
279
+ };
280
+ }
281
+ }, Wt = {}, Kt = {
282
+ xmlns: "http://www.w3.org/2000/svg",
283
+ width: "20",
284
+ height: "20",
285
+ viewBox: "0 0 24 24",
286
+ fill: "none",
287
+ stroke: "currentColor",
288
+ "stroke-width": "2",
289
+ "stroke-linecap": "round",
290
+ "stroke-linejoin": "round"
291
+ };
292
+ function Qt(u, h) {
293
+ return o(), p("svg", Kt, [...h[0] || (h[0] = [
294
+ s("path", { d: "m3 9 9-7 9 7v11a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z" }, null, -1),
295
+ s("polyline", { points: "9 22 9 12 15 12 15 22" }, null, -1)
296
+ ])]);
297
+ }
298
+ const Xt = /* @__PURE__ */ ie(Wt, [["render", Qt]]), Jt = { class: "flex items-center space-x-1" }, Yt = ["onClick"], es = {
299
+ __name: "MediaBreadcrumb",
300
+ props: {
301
+ currentPath: {
302
+ type: Array,
303
+ required: !0
304
+ }
305
+ },
306
+ emits: ["navigate"],
307
+ setup(u) {
308
+ return (h, _) => (o(), p("div", Jt, [
309
+ s("button", {
310
+ class: "flex gap-x-1 items-center px-2 py-1 rounded text-sm font-medium transition-all duration-200 text-blue-600 dark:text-blue-400 bg-blue-50 dark:bg-blue-900/20",
311
+ onClick: _[0] || (_[0] = (w) => h.$emit("navigate", []))
312
+ }, [
313
+ b(Xt, { class: "w-3 h-3" }),
314
+ G(" " + d(h.$t("cms.media.mediaLibrary")), 1)
315
+ ]),
316
+ u.currentPath.length > 0 ? (o(), k(c(ye), {
317
+ key: 0,
318
+ class: "w-3 h-3 text-slate-400 dark:text-slate-500"
319
+ })) : z("", !0),
320
+ (o(!0), p(Z, null, oe(u.currentPath, (w, M) => (o(), p("button", {
321
+ key: M,
322
+ class: "flex gap-x-1 items-center px-2 py-1 rounded text-sm font-medium transition-all duration-200 text-blue-700 dark:text-blue-300 bg-blue-50 dark:bg-blue-900/20",
323
+ onClick: (i) => h.$emit("navigate", u.currentPath.slice(0, M + 1))
324
+ }, [
325
+ b(c(we), { class: "w-3 h-3" }),
326
+ G(" " + d(w) + " ", 1),
327
+ M < u.currentPath.length - 1 ? (o(), k(c(ye), {
328
+ key: 0,
329
+ class: "w-3 h-3 text-slate-400 dark:text-slate-500"
330
+ })) : z("", !0)
331
+ ], 8, Yt))), 128))
332
+ ]));
333
+ }
334
+ }, ts = { class: "relative group" }, ss = {
335
+ class: "absolute top-1 left-1 z-20 p-1.5 rounded bg-white/90 dark:bg-slate-700/90 shadow cursor-grab active:cursor-grabbing opacity-0 group-hover:opacity-100 transition-opacity drag-handle",
336
+ title: "Перетягніть для зміни порядку"
337
+ }, as = ["src"], ls = { class: "absolute inset-0 bg-black bg-opacity-50 flex items-center justify-center opacity-0 group-hover:opacity-100 transition-opacity rounded-lg gap-2" }, rs = ["onClick"], os = ["onClick"], ns = ["title"], is = {
338
+ key: 1,
339
+ class: "relative group"
340
+ }, ds = ["src"], us = { class: "absolute inset-0 bg-black bg-opacity-50 flex items-center justify-center opacity-0 group-hover:opacity-100 transition-opacity rounded-lg gap-2" }, cs = ["title"], ps = {
341
+ key: 2,
342
+ class: "absolute inset-0 bg-white bg-opacity-75 flex items-center justify-center rounded-lg z-10"
343
+ }, vs = { class: "flex flex-col items-center gap-2" }, hs = { class: "text-xs text-gray-600" }, ms = ["multiple", "disabled"], gs = { class: "whitespace-nowrap text-sm" }, bs = { class: "whitespace-nowrap text-sm" }, ys = { class: "flex items-center justify-between p-4 border-b" }, fs = { class: "text-lg font-semibold" }, xs = { class: "flex items-center justify-between gap-4 p-4 border-b" }, ws = { class: "relative z-[1] rounded-xl text-card-foreground shadow-lg border-0 bg-white dark:bg-slate-800 backdrop-blur-sm mb-6 p-4 mx-4" }, ks = { class: "flex items-center justify-between gap-4" }, _s = { class: "flex items-center gap-4 flex-1" }, $s = { class: "relative flex-1 max-w-md" }, Cs = ["placeholder"], Fs = { class: "flex items-center gap-2 relative" }, As = { class: "text-xs font-bold" }, js = { class: "text-xs font-bold" }, Bs = {
344
+ key: 0,
345
+ class: "w-full absolute top-full left-1/2 transform -translate-x-1/2 mt-2 z-50 bg-white dark:bg-slate-700 flex flex-col items-start border border-slate-200 dark:border-slate-600 rounded-md shadow-lg"
346
+ }, zs = { class: "flex items-center gap-2" }, Ms = { class: "flex flex-col gap-4 overflow-y-auto p-4 flex-1" }, Ds = { class: "p-4 border-t flex items-center justify-between" }, Ts = {
347
+ key: 0,
348
+ class: "text-sm text-gray-600 dark:text-gray-400"
349
+ }, Ps = { key: 1 }, Is = ["disabled"], Ss = 112, re = 10, Us = {
350
+ __name: "vs-form-media-select",
351
+ props: /* @__PURE__ */ ge({
352
+ multiple: {
353
+ type: Boolean,
354
+ default: !1
355
+ },
356
+ multi: {
357
+ type: Boolean,
358
+ default: !1
359
+ }
360
+ }, {
361
+ modelValue: {},
362
+ modelModifiers: {}
363
+ }),
364
+ emits: /* @__PURE__ */ ge(["change"], ["update:modelValue"]),
365
+ setup(u, { emit: h }) {
366
+ const { t: _ } = ne(), w = Xe(), M = Je(), i = Ie(u, "modelValue"), $ = h, g = u, m = R(() => g.multiple || g.multi), v = y(null), e = R(() => i.value || v.value), H = R(() => {
367
+ if (!m.value)
368
+ return [];
369
+ const t = e.value;
370
+ return t ? Array.isArray(t) ? t : [t] : [];
371
+ }), D = R({
372
+ get: () => H.value,
373
+ set: (t) => {
374
+ if (!t || !Array.isArray(t) || t.length === 0) {
375
+ i && (i.value = null), v.value = null, $("cms.change", null);
376
+ return;
377
+ }
378
+ const a = t.map((l) => typeof l == "string" ? l : (l == null ? void 0 : l.filepath) || (l == null ? void 0 : l.file_path) || l), r = t.map(
379
+ (l) => typeof l == "object" ? l : v.value && Array.isArray(v.value) ? v.value.find((n) => U(n) === l) ?? l : l
380
+ );
381
+ i && (i.value = a), v.value = r, $("cms.change", a);
382
+ }
383
+ }), q = R(() => e.value ? typeof e.value == "object" ? e.value.filename || e.value.file_name || e.value.native_file_name || "File" : typeof e.value == "string" ? e.value.split("cms./").pop() || e.value : "File" : ""), A = y(!1), L = y(!1), j = y("grid"), I = y([]), T = y([]), N = y([]), f = y(), C = y([]), Y = y(null), P = y(!1), W = y(null), ee = y(null), de = y({}), E = y(""), O = y(!1), K = y("name"), _e = /* @__PURE__ */ new Map([
384
+ ["name", _("cms.media.sortBy.name")],
385
+ ["filesize", _("cms.media.sortBy.filesize")]
386
+ ]), U = (t) => typeof t == "string" ? t : (t == null ? void 0 : t.filepath) || (t == null ? void 0 : t.file_path) || t, ue = (t) => t ? typeof t == "string" ? t.split("cms./").pop() || t : t.filename || t.file_name || t.native_file_name || "File" : "", $e = (t) => typeof t == "string" ? t : (t == null ? void 0 : t.preview) || `/file/resize?filepath=${U(t)}&h=137&quality=75`, Ce = () => {
387
+ Y.value && Y.value.click();
388
+ }, Fe = () => {
389
+ A.value = !A.value, A.value && Ae();
390
+ }, Ae = () => {
391
+ if (W.value) {
392
+ const t = W.value.getBoundingClientRect(), a = window.innerHeight - t.bottom, r = t.top, l = a >= Ss + re || a >= r;
393
+ de.value = {
394
+ top: l ? `${t.bottom + re}px` : "auto",
395
+ bottom: l ? "auto" : `${window.innerHeight - t.top + re}px`,
396
+ left: `${t.left + t.width / 2}px`,
397
+ transform: "translateX(-50%)",
398
+ width: "200px"
399
+ };
400
+ }
401
+ }, ce = (t) => {
402
+ var a;
403
+ if (t.type === "dir")
404
+ pe([...I.value, t.name]);
405
+ else if (m.value) {
406
+ const r = C.value.findIndex((l) => l.id === t.id);
407
+ r >= 0 ? C.value.splice(r, 1) : C.value.push(t);
408
+ } else
409
+ f.value = t.id === ((a = f.value) == null ? void 0 : a.id) ? null : t;
410
+ }, Q = (t) => {
411
+ K.value = t, O.value = !1, T.value = T.value.sort((a, r) => {
412
+ var l;
413
+ if ((a == null ? void 0 : a.type) === "dir")
414
+ return -1;
415
+ if (t === "name")
416
+ return (l = a == null ? void 0 : a.name) == null ? void 0 : l.localeCompare(r == null ? void 0 : r.name);
417
+ if (t === "filesize")
418
+ return (r == null ? void 0 : r.filesize) - (a == null ? void 0 : a.filesize);
419
+ });
420
+ }, je = async () => {
421
+ try {
422
+ const t = I.value.join("/"), r = await (await fetch(`/api/cms-media?subdir=${t}${E.value ? "&search=" + E.value : ""}`, {
423
+ method: "GET"
424
+ })).json();
425
+ r.data ? (T.value = r.data.map((l) => ({
426
+ ...l,
427
+ id: l.type === "dir" ? `dir-${l.name}` : l.id,
428
+ preview: `/file/resize?filepath=${l.filepath}&h=137&quality=75`
429
+ })), Q(K.value)) : T.value = [];
430
+ } catch (t) {
431
+ console.error("Search error:", t), T.value = [];
432
+ }
433
+ }, Be = () => {
434
+ if (m.value) {
435
+ if (C.value.length > 0) {
436
+ const t = Array.isArray(i.value) ? [...i.value] : i.value ? [i.value] : [], a = Array.isArray(v.value) ? [...v.value] : v.value ? [v.value] : [];
437
+ C.value.forEach((r) => {
438
+ const l = r.filepath || r.file_path;
439
+ t.some((n) => (typeof n == "string" ? n : (n == null ? void 0 : n.filepath) || (n == null ? void 0 : n.file_path)) === l) || (t.push(l), a.push(r));
440
+ }), i && (i.value = t), v.value = a, $("cms.change", t), C.value = [];
441
+ }
442
+ } else if (f.value) {
443
+ const t = f.value.filepath || f.value.file_path;
444
+ i && (i.value = t), v.value = f.value, $("cms.change", t), f.value = null;
445
+ }
446
+ te();
447
+ }, te = () => {
448
+ L.value = !1;
449
+ }, pe = (t) => {
450
+ I.value = t, N.value = [...N.value, t], f.value = null, m.value && (C.value = []), se();
451
+ }, ze = () => {
452
+ N.value.length > 1 && (N.value.pop(), I.value = N.value[N.value.length - 1], f.value = null, m.value && (C.value = []), se());
453
+ }, se = async () => {
454
+ try {
455
+ const t = I.value.join("/"), r = await (await fetch(`/api/cms-media?subdir=${t}${E.value ? "&search=" + E.value : ""}`, {
456
+ method: "GET"
457
+ })).json();
458
+ r.data ? (T.value = r.data.map((l) => ({
459
+ ...l,
460
+ id: l.type === "dir" ? `dir-${l.name}` : l.id,
461
+ preview: `/file/resize?filepath=${l.filepath}&h=137&quality=75`
462
+ })), Q(K.value)) : T.value = [];
463
+ } catch (t) {
464
+ console.error("Fetch error:", t), T.value = [];
465
+ }
466
+ }, ve = async (t, a) => {
467
+ try {
468
+ const r = typeof t == "string" ? t : U(t);
469
+ if (await fetch(`/file/delete${r}`), m.value) {
470
+ const l = Array.isArray(i.value) ? [...i.value] : [], n = Array.isArray(v.value) ? [...v.value] : [];
471
+ if (a !== void 0 && a >= 0)
472
+ l.splice(a, 1), n.splice(a, 1);
473
+ else {
474
+ const x = l.findIndex((F) => (typeof F == "string" ? F : (F == null ? void 0 : F.filepath) || (F == null ? void 0 : F.file_path)) === r);
475
+ x >= 0 && (l.splice(x, 1), n.splice(x, 1));
476
+ }
477
+ i && (i.value = l.length > 0 ? l : null), v.value = n.length > 0 ? n : null, $("cms.change", l.length > 0 ? l : null);
478
+ } else
479
+ i && (i.value = null), v.value = null, $("cms.change", null);
480
+ return !0;
481
+ } catch (r) {
482
+ return console.error(r), !1;
483
+ }
484
+ }, he = async (t) => {
485
+ try {
486
+ const a = await fetch(`/file/download/files/uploads${t}`), r = await a.arrayBuffer(), l = a.headers["content-type"], n = new TextDecoder("utf-8").decode(r), x = new Blob([n], { type: l }), F = document.createElement("cms.a");
487
+ F.setAttribute("download", t), F.href = window.URL.createObjectURL(x), F.click();
488
+ } catch (a) {
489
+ console.error(a.message);
490
+ }
491
+ }, Me = async (t) => {
492
+ if (!t.target.files || t.target.files.length === 0)
493
+ return;
494
+ const a = Array.from(t.target.files);
495
+ P.value = !0;
496
+ try {
497
+ const r = [];
498
+ for (const l of a) {
499
+ const n = new FormData();
500
+ n.append("file", l);
501
+ const x = await fetch("/file/upload/uploads?id=1&form=form&table=table", {
502
+ method: "POST",
503
+ body: n
504
+ });
505
+ if (!x.ok)
506
+ throw new Error(`Upload failed: ${x.status}`);
507
+ const B = (await x.json()).result, De = {
508
+ file_id: B.file_id,
509
+ file_name: B.file_name,
510
+ file_path: B.file_path,
511
+ filepath: B.file_path,
512
+ // Для сумісності
513
+ format: B.format,
514
+ size: B.size,
515
+ entity_id: B.entity_id,
516
+ dir: B.dir,
517
+ native_file_name: B.native_file_name,
518
+ preview: `/file/resize?filepath=${B.file_path}&h=137&quality=75`
519
+ };
520
+ r.push(De);
521
+ }
522
+ if (m.value) {
523
+ const l = Array.isArray(i.value) ? [...i.value] : i.value ? [i.value] : [], n = Array.isArray(v.value) ? [...v.value] : v.value ? [v.value] : [];
524
+ r.forEach((x) => {
525
+ l.push(x.file_path), n.push(x);
526
+ }), i && (i.value = l), v.value = n, $("cms.change", l);
527
+ } else {
528
+ const l = r[0];
529
+ i && (i.value = l.file_path), v.value = l, $("cms.change", l.file_path);
530
+ }
531
+ A.value = !1;
532
+ } catch (r) {
533
+ console.error("Upload error:", r), alert("cms.Помилка завантаження файлу: " + r.message);
534
+ } finally {
535
+ P.value = !1;
536
+ }
537
+ t.target.value = "";
538
+ };
539
+ X(L, (t) => {
540
+ t && se();
541
+ }), X(I, (t) => {
542
+ t.length > 0 ? M.push({ query: { path: t.join("/") } }) : M.push({ query: { path: void 0 } });
543
+ });
544
+ let me;
545
+ return X(E, (t) => {
546
+ clearTimeout(me), me = setTimeout(() => {
547
+ je();
548
+ }, 500);
549
+ }), X(i, (t) => {
550
+ var a, r, l, n;
551
+ if (t && typeof t == "object") {
552
+ const x = ((a = f.value) == null ? void 0 : a.filepath) || ((r = f.value) == null ? void 0 : r.file_path);
553
+ t.filepath !== x && t.file_path !== x && (f.value = null);
554
+ } else if (t && typeof t == "string") {
555
+ const x = ((l = f.value) == null ? void 0 : l.filepath) || ((n = f.value) == null ? void 0 : n.file_path);
556
+ t !== x && (f.value = null);
557
+ }
558
+ }), xe(() => {
559
+ var a, r;
560
+ I.value = ((r = (a = w.query) == null ? void 0 : a.path) == null ? void 0 : r.split("cms./")) || [], N.value = [[]], i.value || (f.value = null);
561
+ const t = (l) => {
562
+ var n;
563
+ A.value && !((n = W.value) != null && n.contains(l.target)) && (A.value = !1), O.value && ee.value && !ee.value.contains(l.target) && (O.value = !1);
564
+ };
565
+ document.addEventListener("click", t);
566
+ }), (t, a) => (o(), p(Z, null, [
567
+ s("div", Se(t.$attrs, { class: "flex gap-4 flex-wrap" }), [
568
+ m.value ? (o(), k(c(Ke), {
569
+ key: 0,
570
+ modelValue: D.value,
571
+ "onUpdate:modelValue": a[0] || (a[0] = (r) => D.value = r),
572
+ "item-key": (r) => U(r),
573
+ handle: ".drag-handle",
574
+ class: S(["flex gap-4 flex-wrap", t.$attrs.class])
575
+ }, {
576
+ item: He(({ element: r, index: l }) => [
577
+ s("div", ts, [
578
+ s("div", ss, [
579
+ b(c(qe), { class: "w-4 h-4 text-gray-500 dark:text-slate-400" })
580
+ ]),
581
+ s("img", {
582
+ src: $e(r),
583
+ alt: "Selected File",
584
+ class: "w-32 h-32 object-cover rounded-lg"
585
+ }, null, 8, as),
586
+ s("div", ls, [
587
+ s("button", {
588
+ type: "button",
589
+ onClick: (n) => ve(r, l),
590
+ class: "p-2 rounded-full bg-red-500 text-white hover:bg-red-600 transition-colors"
591
+ }, [
592
+ b(c(J), { class: "w-4 h-4" })
593
+ ], 8, rs),
594
+ s("button", {
595
+ type: "button",
596
+ onClick: (n) => he(U(r)),
597
+ class: "p-2 rounded-full bg-blue-500 text-white hover:bg-blue-600 transition-colors"
598
+ }, [
599
+ b(c(ae), { class: "w-4 h-4" })
600
+ ], 8, os)
601
+ ]),
602
+ s("div", {
603
+ class: "absolute bottom-full left-0 mb-2 px-3 py-1.5 bg-gray-900 text-white text-xs rounded-lg opacity-0 group-hover:opacity-100 transition-opacity pointer-events-none whitespace-nowrap z-10 max-w-[200px] truncate",
604
+ title: ue(r)
605
+ }, [
606
+ G(d(ue(r)) + " ", 1),
607
+ a[13] || (a[13] = s("div", { class: "absolute top-full left-4 border-4 border-transparent border-t-gray-900" }, null, -1))
608
+ ], 8, ns)
609
+ ])
610
+ ]),
611
+ _: 1
612
+ }, 8, ["modelValue", "item-key", "class"])) : e.value ? (o(), p("div", is, [
613
+ s("img", {
614
+ src: e.value.preview || e.value,
615
+ alt: "Selected File",
616
+ class: "w-32 h-32 object-cover rounded-lg"
617
+ }, null, 8, ds),
618
+ s("div", us, [
619
+ s("button", {
620
+ type: "button",
621
+ onClick: a[1] || (a[1] = (r) => {
622
+ var l, n;
623
+ return ve(((l = e.value) == null ? void 0 : l.filepath) || ((n = e.value) == null ? void 0 : n.file_path) || e.value);
624
+ }),
625
+ class: "p-2 rounded-full bg-red-500 text-white hover:bg-red-600 transition-colors"
626
+ }, [
627
+ b(c(J), { class: "w-4 h-4" })
628
+ ]),
629
+ s("button", {
630
+ type: "button",
631
+ onClick: a[2] || (a[2] = (r) => {
632
+ var l, n;
633
+ return he(((l = e.value) == null ? void 0 : l.filepath) || ((n = e.value) == null ? void 0 : n.file_path) || e.value);
634
+ }),
635
+ class: "p-2 rounded-full bg-blue-500 text-white hover:bg-blue-600 transition-colors"
636
+ }, [
637
+ b(c(ae), { class: "w-4 h-4" })
638
+ ])
639
+ ]),
640
+ s("div", {
641
+ class: "absolute bottom-full left-0 mb-2 px-3 py-1.5 bg-gray-900 text-white text-xs rounded-lg opacity-0 group-hover:opacity-100 transition-opacity pointer-events-none whitespace-nowrap z-10 max-w-[200px] truncate",
642
+ title: q.value
643
+ }, [
644
+ G(d(q.value) + " ", 1),
645
+ a[14] || (a[14] = s("div", { class: "absolute top-full left-4 border-4 border-transparent border-t-gray-900" }, null, -1))
646
+ ], 8, cs)
647
+ ])) : z("", !0),
648
+ s("div", {
649
+ ref_key: "triggerButton",
650
+ ref: W,
651
+ class: S(["relative w-32 h-32 flex items-center justify-center border border-dotted border-gray-300 rounded-lg hover:border-blue-500 hover:bg-blue-500/10 hover:cursor-pointer transition-all", { "border-blue-500 bg-blue-500/10": A.value, "opacity-50 cursor-not-allowed": P.value }]),
652
+ onClick: Fe
653
+ }, [
654
+ P.value ? (o(), k(c(le), {
655
+ key: 0,
656
+ class: "w-4 h-4 animate-spin text-blue-500"
657
+ })) : (o(), k(c(fe), {
658
+ key: 1,
659
+ class: "w-4 h-4"
660
+ })),
661
+ P.value ? (o(), p("div", ps, [
662
+ s("div", vs, [
663
+ b(c(le), { class: "w-6 h-6 animate-spin text-blue-500" }),
664
+ s("span", hs, d(t.$t("cms.media.uploading")), 1)
665
+ ])
666
+ ])) : z("", !0),
667
+ (o(), k(be, { to: "body" }, [
668
+ A.value ? (o(), p("div", {
669
+ key: 0,
670
+ class: "fixed bg-white z-[100001] border border-gray-200 rounded-lg shadow-lg flex flex-col items-center justify-center",
671
+ style: Le(de.value)
672
+ }, [
673
+ s("div", {
674
+ class: S(["relative overflow-hidden flex justify-start items-center w-full gap-2 p-4 hover:bg-blue-50 text-blue-700 border hover:border-blue-200 dark:bg-slate-700 dark:text-slate-100 hover:cursor-pointer", { "opacity-50 cursor-not-allowed": P.value }]),
675
+ onClick: a[4] || (a[4] = (r) => !P.value && Ce())
676
+ }, [
677
+ s("input", {
678
+ type: "file",
679
+ ref_key: "fileInput",
680
+ ref: Y,
681
+ class: "absolute justify-center bottom-0 left-0 w-full opacity-0",
682
+ onChange: Me,
683
+ onClick: a[3] || (a[3] = V(() => {
684
+ }, ["stop"])),
685
+ multiple: m.value,
686
+ disabled: P.value
687
+ }, null, 40, ms),
688
+ P.value ? (o(), k(c(le), {
689
+ key: 0,
690
+ class: "w-4 h-4 animate-spin"
691
+ })) : (o(), k(c(ae), { key: 1 })),
692
+ s("span", gs, d(P.value ? t.$t("cms.media.uploading") : t.$t("cms.media.upload")), 1)
693
+ ], 2),
694
+ s("div", {
695
+ onClick: a[5] || (a[5] = (r) => L.value = !0),
696
+ class: "flex justify-start items-center w-full gap-2 p-4 hover:bg-blue-50 text-blue-700 border hover:border-blue-200 dark:bg-slate-700 dark:text-slate-100 hover:cursor-pointer"
697
+ }, [
698
+ b(c(Ue)),
699
+ s("span", bs, d(t.$t("cms.media.selectFromMedia")), 1)
700
+ ])
701
+ ], 4)) : z("", !0)
702
+ ]))
703
+ ], 2)
704
+ ], 16),
705
+ (o(), k(be, { to: "body" }, [
706
+ L.value ? (o(), p("div", {
707
+ key: 0,
708
+ class: "fixed inset-0 z-[100001] flex items-center justify-center bg-black bg-opacity-50",
709
+ onClick: te
710
+ }, [
711
+ s("div", {
712
+ class: "bg-white rounded-lg shadow-xl max-w-4xl w-full mx-4 max-h-[90vh] flex flex-col",
713
+ onClick: a[12] || (a[12] = V(() => {
714
+ }, ["stop"]))
715
+ }, [
716
+ s("div", ys, [
717
+ s("h3", fs, d(t.$t("cms.media.selectFiles")), 1),
718
+ s("button", {
719
+ onClick: te,
720
+ class: "text-gray-400 hover:text-gray-600"
721
+ }, [...a[15] || (a[15] = [
722
+ s("svg", {
723
+ class: "w-6 h-6",
724
+ fill: "none",
725
+ stroke: "currentColor",
726
+ viewBox: "0 0 24 24"
727
+ }, [
728
+ s("path", {
729
+ "stroke-linecap": "round",
730
+ "stroke-linejoin": "round",
731
+ "stroke-width": "2",
732
+ d: "M6 18L18 6M6 6l12 12"
733
+ })
734
+ ], -1)
735
+ ])])
736
+ ]),
737
+ s("div", xs, [
738
+ b(es, {
739
+ "current-path": I.value,
740
+ onNavigate: pe,
741
+ onNavigateBack: ze
742
+ }, null, 8, ["current-path"])
743
+ ]),
744
+ s("div", ws, [
745
+ s("div", ks, [
746
+ s("div", _s, [
747
+ s("div", $s, [
748
+ b(c(Re), { class: "absolute left-3 top-1/2 transform -translate-y-1/2 w-4 h-4 text-slate-400 dark:text-slate-500" }),
749
+ Ne(s("input", {
750
+ type: "text",
751
+ placeholder: t.$t("cms.media.search"),
752
+ class: "w-full pl-10 pr-4 py-2 text-sm border border-slate-200 dark:border-slate-600 rounded-lg focus:outline-none focus:ring-2 focus:ring-blue-500 focus:border-transparent bg-white dark:bg-slate-700 text-slate-700 dark:text-slate-200 placeholder-slate-400 dark:placeholder-slate-500",
753
+ "onUpdate:modelValue": a[6] || (a[6] = (r) => E.value = r)
754
+ }, null, 8, Cs), [
755
+ [Ee, E.value]
756
+ ])
757
+ ]),
758
+ s("div", Fs, [
759
+ s("span", As, d(t.$t("cms.media.sortBy.title") + ": "), 1),
760
+ s("button", {
761
+ ref_key: "sortByButton",
762
+ ref: ee,
763
+ class: "relative z-[1000] inline-flex items-center justify-center gap-2 whitespace-nowrap font-medium transition-colors border shadow-sm h-8 rounded-md px-3 text-xs bg-white border-slate-300 text-slate-700 disabled:pointer-events-none disabled:opacity-50 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",
764
+ onClick: a[9] || (a[9] = (r) => O.value = !O.value)
765
+ }, [
766
+ b(c(Ge), { class: "w-4 h-4" }),
767
+ s("span", js, d(c(_e).get(K.value)), 1),
768
+ O.value ? (o(), p("div", Bs, [
769
+ s("span", {
770
+ class: "text-left text-xs font-bold w-full p-2 hover:bg-slate-100 dark:hover:bg-slate-600 border-b border-slate-200 dark:border-slate-600 cursor-pointer",
771
+ onClick: a[7] || (a[7] = V((r) => Q("name"), ["stop"]))
772
+ }, d(t.$t("cms.media.sortBy.name")), 1),
773
+ s("span", {
774
+ class: "text-left text-xs font-bold w-full p-2 hover:bg-slate-100 dark:hover:bg-slate-600 cursor-pointer",
775
+ onClick: a[8] || (a[8] = V((r) => Q("filesize"), ["stop"]))
776
+ }, d(t.$t("cms.media.sortBy.filesize")), 1)
777
+ ])) : z("", !0)
778
+ ], 512)
779
+ ])
780
+ ]),
781
+ s("div", zs, [
782
+ s("button", {
783
+ class: S(["inline-flex items-center justify-center whitespace-nowrap font-medium transition-colors disabled:pointer-events-none disabled:opacity-50 h-8 px-3 text-xs rounded-md", {
784
+ "shadow bg-blue-600 hover:bg-blue-700 text-white": j.value === "grid",
785
+ "border shadow-sm hover:text-accent-foreground bg-white dark:bg-slate-700 border-slate-300 dark:border-slate-600 text-slate-700 dark:text-slate-300 hover:bg-slate-50 dark:hover:bg-slate-600": j.value === "list"
786
+ }]),
787
+ onClick: a[10] || (a[10] = (r) => j.value = "grid")
788
+ }, [
789
+ b(c(Ze), { class: "w-4 h-4" })
790
+ ], 2),
791
+ s("button", {
792
+ class: S(["inline-flex items-center justify-center whitespace-nowrap font-medium transition-colors disabled:pointer-events-none disabled:opacity-50 h-8 px-3 text-xs rounded-md", {
793
+ "shadow bg-blue-600 hover:bg-blue-700 text-white": j.value === "list",
794
+ "border shadow-sm hover:text-accent-foreground bg-white dark:bg-slate-700 border-slate-300 dark:border-slate-600 text-slate-700 dark:text-slate-300 hover:bg-slate-50 dark:hover:bg-slate-600": j.value === "grid"
795
+ }]),
796
+ onClick: a[11] || (a[11] = (r) => j.value = "list")
797
+ }, [
798
+ b(c(We), { class: "w-4 h-4" })
799
+ ], 2)
800
+ ])
801
+ ])
802
+ ]),
803
+ s("div", Ms, [
804
+ j.value === "grid" ? (o(), k(ft, {
805
+ key: 0,
806
+ files: T.value,
807
+ "selected-file": m.value ? null : f.value,
808
+ "selected-files": m.value ? C.value : [],
809
+ onFileClick: ce
810
+ }, null, 8, ["files", "selected-file", "selected-files"])) : (o(), k(Zt, {
811
+ key: 1,
812
+ files: T.value,
813
+ "selected-file": m.value ? null : f.value,
814
+ "selected-files": m.value ? C.value : [],
815
+ onFileClick: ce
816
+ }, null, 8, ["files", "selected-file", "selected-files"]))
817
+ ]),
818
+ s("div", Ds, [
819
+ m.value && C.value.length > 0 ? (o(), p("div", Ts, d(t.$t("cms.media.selectedFiles", { count: C.value.length })), 1)) : (o(), p("div", Ps)),
820
+ s("button", {
821
+ onClick: Be,
822
+ disabled: m.value ? C.value.length === 0 : !f.value,
823
+ class: "flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium disabled:pointer-events-none disabled:opacity-50 h-9 px-4 py-2 ml-auto bg-blue-600 hover:bg-blue-700 text-white shadow-md hover:shadow-lg transition-all duration-200 transform hover:scale-105"
824
+ }, [
825
+ b(c(fe), { class: "w-4 h-4 mr-2" }),
826
+ G(" " + d(t.$t("cms.common.actions.add")), 1)
827
+ ], 8, Is)
828
+ ])
829
+ ])
830
+ ])) : z("", !0)
831
+ ]))
832
+ ], 64));
833
+ }
834
+ };
835
+ export {
836
+ Us as default
837
+ };