@materialui-reactjs/admin 1.0.4

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 (131) hide show
  1. package/README.md +453 -0
  2. package/dist/assets/css/SpinnerLoader.css +1 -0
  3. package/dist/assets/css/form.css +1 -0
  4. package/dist/assets/css/index.css +1 -0
  5. package/dist/assets/css/meta.css +1 -0
  6. package/dist/chunks/Common-C_ZhT4L6.js +217 -0
  7. package/dist/chunks/Env-DRXhvUcb.js +16 -0
  8. package/dist/chunks/HeaderUpdate-lrSYWsKp.js +474 -0
  9. package/dist/chunks/SortableItem-B4-Zsso3.js +31 -0
  10. package/dist/chunks/SpinnerLoader-h8RDIarB.js +21 -0
  11. package/dist/chunks/UDragFile-CAiSfTsp.js +92 -0
  12. package/dist/chunks/Validator-DjZz2bJs.js +203 -0
  13. package/dist/chunks/echarts-CRmndsxC.js +322 -0
  14. package/dist/chunks/form-C8gzkYMW.js +45843 -0
  15. package/dist/chunks/loader-BUiOnhOH.js +1 -0
  16. package/dist/chunks/meta-k8MmuQjS.js +758 -0
  17. package/dist/chunks/sidebar-Dj4Xr9du.js +84 -0
  18. package/dist/chunks/single-DyPwG6ZR.js +1082 -0
  19. package/dist/chunks/top-navbar-FBw88y_o.js +78 -0
  20. package/dist/components/echarts/BarChart.d.ts +11 -0
  21. package/dist/components/echarts/LineChart.d.ts +10 -0
  22. package/dist/components/echarts/MultiBarChart.d.ts +14 -0
  23. package/dist/components/echarts/MultiLineChart.d.ts +14 -0
  24. package/dist/components/echarts/PieChart.d.ts +12 -0
  25. package/dist/components/echarts/index.d.ts +5 -0
  26. package/dist/components/echarts/index.js +2 -0
  27. package/dist/components/form/AdvancedMultiSelect.d.ts +16 -0
  28. package/dist/components/form/AsxhUImages.d.ts +15 -0
  29. package/dist/components/form/BoxAddRow.d.ts +26 -0
  30. package/dist/components/form/CheckTreeBox.d.ts +18 -0
  31. package/dist/components/form/CusForm.d.ts +105 -0
  32. package/dist/components/form/DateInput.d.ts +14 -0
  33. package/dist/components/form/DateTimeInput.d.ts +11 -0
  34. package/dist/components/form/Editor.d.ts +12 -0
  35. package/dist/components/form/EfFile.d.ts +15 -0
  36. package/dist/components/form/EfImage.d.ts +15 -0
  37. package/dist/components/form/EfImages.d.ts +14 -0
  38. package/dist/components/form/PImage.d.ts +15 -0
  39. package/dist/components/form/SelectAddRowBox.d.ts +17 -0
  40. package/dist/components/form/SelectAddRowBoxAdvanced.d.ts +16 -0
  41. package/dist/components/form/SelectBox.d.ts +32 -0
  42. package/dist/components/form/UDragFile.d.ts +13 -0
  43. package/dist/components/form/UFile.d.ts +15 -0
  44. package/dist/components/form/UFiles.d.ts +15 -0
  45. package/dist/components/form/UImages.d.ts +15 -0
  46. package/dist/components/form/index.d.ts +19 -0
  47. package/dist/components/form/index.js +3 -0
  48. package/dist/components/loader/SpinnerLoader.d.ts +8 -0
  49. package/dist/components/loader/index.d.ts +1 -0
  50. package/dist/components/loader/index.js +3 -0
  51. package/dist/components/meta/BtnGroup.d.ts +8 -0
  52. package/dist/components/meta/CardTable.d.ts +37 -0
  53. package/dist/components/meta/CusTooltip.d.ts +7 -0
  54. package/dist/components/meta/ElfinderModal.d.ts +10 -0
  55. package/dist/components/meta/Error403.d.ts +8 -0
  56. package/dist/components/meta/Error404.d.ts +8 -0
  57. package/dist/components/meta/Head.d.ts +1 -0
  58. package/dist/components/meta/HeaderDetail.d.ts +9 -0
  59. package/dist/components/meta/HeaderIndex.d.ts +17 -0
  60. package/dist/components/meta/HeaderUpdate.d.ts +9 -0
  61. package/dist/components/meta/ModalForm.d.ts +18 -0
  62. package/dist/components/meta/Navtabs.d.ts +12 -0
  63. package/dist/components/meta/PDFEmbed.d.ts +11 -0
  64. package/dist/components/meta/Pagination.d.ts +7 -0
  65. package/dist/components/meta/Pdfviewer.d.ts +0 -0
  66. package/dist/components/meta/ScrollTable.d.ts +16 -0
  67. package/dist/components/meta/SearchBox.d.ts +9 -0
  68. package/dist/components/meta/SortableItem.d.ts +1 -0
  69. package/dist/components/meta/index.d.ts +17 -0
  70. package/dist/components/meta/index.js +4 -0
  71. package/dist/components/sidebar/Sidebar.d.ts +3 -0
  72. package/dist/components/sidebar/Sidebar.types.d.ts +25 -0
  73. package/dist/components/sidebar/Sidebar.utils.d.ts +2 -0
  74. package/dist/components/sidebar/SidebarItem.d.ts +10 -0
  75. package/dist/components/sidebar/index.d.ts +2 -0
  76. package/dist/components/sidebar/index.js +2 -0
  77. package/dist/components/single/Detail.d.ts +25 -0
  78. package/dist/components/single/Fields.d.ts +31 -0
  79. package/dist/components/single/Import.d.ts +24 -0
  80. package/dist/components/single/List.d.ts +44 -0
  81. package/dist/components/single/Update.d.ts +33 -0
  82. package/dist/components/single/UpdateDetail.d.ts +7 -0
  83. package/dist/components/single/UpdateTableDetail.d.ts +18 -0
  84. package/dist/components/single/index.d.ts +7 -0
  85. package/dist/components/single/index.js +2 -0
  86. package/dist/components/top-navbar/TopNavbar.d.ts +6 -0
  87. package/dist/components/top-navbar/index.d.ts +1 -0
  88. package/dist/components/top-navbar/index.js +2 -0
  89. package/dist/fontawesome/css/all.css +8 -0
  90. package/dist/fontawesome/css/all.min.css +1 -0
  91. package/dist/fontawesome/webfonts/fa-brands-400.ttf +0 -0
  92. package/dist/fontawesome/webfonts/fa-brands-400.woff2 +0 -0
  93. package/dist/fontawesome/webfonts/fa-duotone-900.ttf +0 -0
  94. package/dist/fontawesome/webfonts/fa-duotone-900.woff2 +0 -0
  95. package/dist/fontawesome/webfonts/fa-light-300.ttf +0 -0
  96. package/dist/fontawesome/webfonts/fa-light-300.woff2 +0 -0
  97. package/dist/fontawesome/webfonts/fa-regular-400.ttf +0 -0
  98. package/dist/fontawesome/webfonts/fa-regular-400.woff2 +0 -0
  99. package/dist/fontawesome/webfonts/fa-sharp-light-300.ttf +0 -0
  100. package/dist/fontawesome/webfonts/fa-sharp-light-300.woff2 +0 -0
  101. package/dist/fontawesome/webfonts/fa-sharp-regular-400.ttf +0 -0
  102. package/dist/fontawesome/webfonts/fa-sharp-regular-400.woff2 +0 -0
  103. package/dist/fontawesome/webfonts/fa-sharp-solid-900.ttf +0 -0
  104. package/dist/fontawesome/webfonts/fa-sharp-solid-900.woff2 +0 -0
  105. package/dist/fontawesome/webfonts/fa-solid-900.ttf +0 -0
  106. package/dist/fontawesome/webfonts/fa-solid-900.woff2 +0 -0
  107. package/dist/fontawesome/webfonts/fa-thin-100.ttf +0 -0
  108. package/dist/fontawesome/webfonts/fa-thin-100.woff2 +0 -0
  109. package/dist/fontawesome/webfonts/fa-v4compatibility.ttf +0 -0
  110. package/dist/fontawesome/webfonts/fa-v4compatibility.woff2 +0 -0
  111. package/dist/hook/detail.d.ts +14 -0
  112. package/dist/hook/detail.js +12 -0
  113. package/dist/hook/fields.d.ts +14 -0
  114. package/dist/hook/fields.js +12 -0
  115. package/dist/hook/import.d.ts +15 -0
  116. package/dist/hook/import.js +0 -0
  117. package/dist/hook/index.d.ts +61 -0
  118. package/dist/hook/index.js +41 -0
  119. package/dist/hook/update.d.ts +24 -0
  120. package/dist/hook/update.js +29 -0
  121. package/dist/index.d.ts +7 -0
  122. package/dist/index.js +11 -0
  123. package/dist/utils/Common.d.ts +136 -0
  124. package/dist/utils/CusRoute.d.ts +7 -0
  125. package/dist/utils/Env.d.ts +2 -0
  126. package/dist/utils/Group.d.ts +1 -0
  127. package/dist/utils/Validator.d.ts +53 -0
  128. package/dist/utils/index.d.ts +5 -0
  129. package/dist/utils/index.js +671 -0
  130. package/package.json +171 -0
  131. package/scripts/postinstall.cjs +80 -0
@@ -0,0 +1,671 @@
1
+ import { n as e, t } from "../chunks/Env-DRXhvUcb.js";
2
+ import n from "sweetalert2";
3
+ import r from "sweetalert2-react-content";
4
+ import { Modal as i } from "bootstrap";
5
+ import { format as a, isValid as o, parse as s } from "date-fns";
6
+ import c from "decimal.js";
7
+ //#region src/utils/Common.ts
8
+ var { SECRET_KEY: l, STATIC_URL: u, API_URL: d, UPLOADS_URL: f } = await e(), p = (e) => new Promise((t, n) => {
9
+ if (document.querySelector(`script[src="${e}"]`)) {
10
+ t();
11
+ return;
12
+ }
13
+ let r = document.createElement("script");
14
+ r.src = e, r.onload = () => t(), r.onerror = () => n(/* @__PURE__ */ Error(`Failed to load script ${e}`)), document.body.appendChild(r);
15
+ }), m = async (e) => {
16
+ for (let t of e) await p(t);
17
+ }, ee = (e, t = !0) => {
18
+ let n = typeof e == "string" ? document.querySelector(e) : e;
19
+ if (n) {
20
+ if (t) n.querySelector(".boxSpinner") || n.insertAdjacentHTML("afterbegin", "<div class=\"boxSpinner rounded\">\n <div class=\"spinner\">\n <div class=\"rect1\"></div>\n <div class=\"rect2\"></div>\n <div class=\"rect3\"></div>\n <div class=\"rect4\"></div>\n <div class=\"rect5\"></div>\n <div class=\"rect6\"></div>\n <div class=\"rect7\"></div>\n </div>\n </div>");
21
+ else {
22
+ let e = n.querySelector(".boxSpinner");
23
+ e && e.remove();
24
+ }
25
+ }
26
+ }, h = (e) => {
27
+ let t = new FormData();
28
+ return Object.entries(e).forEach(([e, n]) => {
29
+ if (n != null) {
30
+ if (n instanceof FileList) {
31
+ Array.from(n).forEach((n) => t.append(e, n));
32
+ return;
33
+ }
34
+ if (n instanceof File) {
35
+ t.append(e, n);
36
+ return;
37
+ }
38
+ if (Array.isArray(n) && n.every((e) => e instanceof File)) {
39
+ n.forEach((n) => t.append(e, n));
40
+ return;
41
+ }
42
+ if (Array.isArray(n) && n.every((e) => [
43
+ "string",
44
+ "number",
45
+ "boolean"
46
+ ].includes(typeof e))) {
47
+ n.forEach((n) => t.append(e, n.toString()));
48
+ return;
49
+ }
50
+ if (typeof n == "object") {
51
+ t.append(e, JSON.stringify(n));
52
+ return;
53
+ }
54
+ t.append(e, n);
55
+ }
56
+ }), t;
57
+ }, g = async (e, t = {}, n = "POST", r = "application/json") => {
58
+ let i = {
59
+ method: n,
60
+ headers: {
61
+ "Content-Type": r,
62
+ "Secret-Key": l
63
+ },
64
+ credentials: "include"
65
+ };
66
+ n == "POST" && (i.body = JSON.stringify(t));
67
+ let a = await (await fetch(e, i)).json();
68
+ if (a.status == 200) return a;
69
+ throw a.msg ? Error(a.msg) : Error("invalid_response");
70
+ }, _ = async (e, t = {}, n = "POST", r = "application/json", i = !0) => {
71
+ let a = { "Secret-Key": l };
72
+ r !== "multipart/form-data" && (a["Content-Type"] = r);
73
+ let o = {
74
+ method: n,
75
+ headers: a,
76
+ credentials: "include"
77
+ };
78
+ if (n == "POST" && (o.body = r === "multipart/form-data" ? h(t) : JSON.stringify(t)), n === "GET" && Object.keys(t).length > 0) {
79
+ let n = new URLSearchParams();
80
+ Object.entries(t).forEach(([e, t]) => {
81
+ Array.isArray(t) ? t.forEach((t) => n.append(e, String(t))) : n.append(e, String(t));
82
+ });
83
+ let r = n.toString();
84
+ e += (e.includes("?") ? "&" : "?") + r;
85
+ }
86
+ let s = await (await fetch(e, o)).text(), c = null;
87
+ if (s) try {
88
+ c = JSON.parse(s);
89
+ } catch {
90
+ c = s;
91
+ }
92
+ if (c?.status == 200) return c;
93
+ if (c?.msg && i) throw Error(c.msg);
94
+ if (i) throw Error("invalid_response");
95
+ return !1;
96
+ }, v = (e = "Bạn có chắc muốn thực hiện thao tác này ?", t = "Đồng ý") => r(n).fire({
97
+ title: "Xác nhận",
98
+ text: e,
99
+ icon: "warning",
100
+ showCancelButton: !0,
101
+ confirmButtonColor: "#4CAF50",
102
+ cancelButtonColor: "#F44336",
103
+ confirmButtonText: t,
104
+ cancelButtonText: "Hủy",
105
+ position: "top"
106
+ }), te = (e, t = "top", i = !1) => {
107
+ r(n).fire({
108
+ toast: i,
109
+ icon: "success",
110
+ position: t,
111
+ title: e,
112
+ showConfirmButton: !1,
113
+ timer: 1500
114
+ });
115
+ }, ne = (e) => {
116
+ r(n).fire({
117
+ icon: "warning",
118
+ title: e,
119
+ showConfirmButton: !1,
120
+ timer: 1500
121
+ });
122
+ }, y = (e) => {
123
+ r(n).fire({
124
+ icon: "error",
125
+ position: "top",
126
+ title: e,
127
+ showConfirmButton: !1
128
+ });
129
+ }, re = (e, t, n = "name") => {
130
+ let r = t?.find((t) => t.id === e);
131
+ return r ? r[n] : null;
132
+ }, b = (e, t, n = "name") => e.map((e) => {
133
+ let r = t.find((t) => t.id === e);
134
+ return r ? r[n] : null;
135
+ }).filter(Boolean).join(", "), x = (e) => Array.isArray(e) ? e.map((e, t) => `<p class="mb-0"><a class="text-info" target="_blank" href="${z(e, "#")}" target="_blank">Tập tin ${t + 1}</a></p>`).filter(Boolean).join("") : "", S = (e, t = !1) => {
136
+ let n = [{
137
+ id: 1,
138
+ name: "Kích hoạt",
139
+ color: "success"
140
+ }, {
141
+ id: 0,
142
+ name: "Khóa",
143
+ color: "danger"
144
+ }];
145
+ if (e === !1) return n;
146
+ let r = n.find((t) => t.id === e);
147
+ return r ? t ? `<span class="badge badge-sm bg-gradient-${r.color}">${r.name}</span>` : r.name : "";
148
+ }, C = (e, t = !1) => {
149
+ let n = [{
150
+ id: 1,
151
+ name: "Xuất bản",
152
+ color: "success"
153
+ }, {
154
+ id: 0,
155
+ name: "Nháp",
156
+ color: "danger"
157
+ }];
158
+ if (e === !1) return n;
159
+ let r = n.find((t) => t.id === e);
160
+ return r ? t ? `<span class="badge badge-sm bg-gradient-${r.color}">${r.name}</span>` : r.name : "";
161
+ }, w = (e, t = !1) => {
162
+ let n = [{
163
+ id: 1,
164
+ name: "Có",
165
+ color: "success"
166
+ }, {
167
+ id: 0,
168
+ name: "Không",
169
+ color: "secondary"
170
+ }];
171
+ if (e === !1) return n;
172
+ let r = n.find((t) => t.id === e);
173
+ return r ? t ? `<span class="badge badge-sm bg-gradient-${r.color}">${r.name}</span>` : r.name : "";
174
+ };
175
+ function T(e) {
176
+ let t = e instanceof Date ? e : new Date(e);
177
+ if (isNaN(t.getTime())) throw Error("Ngày không hợp lệ: " + e);
178
+ return t;
179
+ }
180
+ function E(e) {
181
+ if (!e) return /* @__PURE__ */ new Date();
182
+ if (e instanceof Date) return new Date(e);
183
+ let t = e.trim().toLowerCase();
184
+ if (t === "now") return /* @__PURE__ */ new Date();
185
+ let n = /* @__PURE__ */ new Date(), r = t.match(/^([+-]?\d+)\s*(year|years|month|months|week|weeks|day|days|hour|hours|minute|minutes|min|mins|second|seconds|sec|secs)$/);
186
+ if (r) {
187
+ let e = Number(r[1]);
188
+ switch (r[2]) {
189
+ case "year":
190
+ case "years":
191
+ n.setFullYear(n.getFullYear() + e);
192
+ break;
193
+ case "month":
194
+ case "months":
195
+ n.setMonth(n.getMonth() + e);
196
+ break;
197
+ case "week":
198
+ case "weeks":
199
+ n.setDate(n.getDate() + e * 7);
200
+ break;
201
+ case "day":
202
+ case "days":
203
+ n.setDate(n.getDate() + e);
204
+ break;
205
+ case "hour":
206
+ case "hours":
207
+ n.setHours(n.getHours() + e);
208
+ break;
209
+ case "minute":
210
+ case "minutes":
211
+ case "min":
212
+ case "mins":
213
+ n.setMinutes(n.getMinutes() + e);
214
+ break;
215
+ case "second":
216
+ case "seconds":
217
+ case "sec":
218
+ case "secs": n.setSeconds(n.getSeconds() + e);
219
+ }
220
+ return n;
221
+ }
222
+ let i = new Date(t);
223
+ if (!isNaN(i.getTime())) return i;
224
+ throw Error(`Invalid date expression: ${e}`);
225
+ }
226
+ var D = (e) => {
227
+ if (!e) return "";
228
+ let t = new Date(e);
229
+ return isNaN(t.getTime()) ? "Invalid Date" : `${String(t.getDate()).padStart(2, "0")}/${String(t.getMonth() + 1).padStart(2, "0")}/${t.getFullYear()} ${String(t.getHours()).padStart(2, "0")}:${String(t.getMinutes()).padStart(2, "0")}:${String(t.getSeconds()).padStart(2, "0")}`;
230
+ }, O = (e) => {
231
+ if (!e) return "";
232
+ let t = new Date(e);
233
+ return isNaN(t.getTime()) ? "Invalid Date" : `${String(t.getDate()).padStart(2, "0")}/${String(t.getMonth() + 1).padStart(2, "0")}/${t.getFullYear()}`;
234
+ }, k = (e) => {
235
+ if (!e) return "";
236
+ let t = new Date(e);
237
+ return isNaN(t.getTime()) ? "Invalid Date" : `${t.getFullYear()}`;
238
+ }, A = (e) => {
239
+ if (!e) return "";
240
+ let t = new Date(e);
241
+ if (isNaN(t.getTime())) return "Invalid Date";
242
+ let n = String(t.getDate()).padStart(2, "0"), r = String(t.getMonth() + 1).padStart(2, "0");
243
+ return `${t.getFullYear()}-${r}-${n}`;
244
+ }, j = (e = null) => {
245
+ let t = new URLSearchParams(window.location.search);
246
+ return e ? Array.isArray(e) ? e.reduce((e, n) => (e[n] = t.get(n), e), {}) : t.get(e) : Object.fromEntries(t.entries());
247
+ }, M = (e) => {
248
+ let t = new URLSearchParams(window.location.search);
249
+ return Object.entries(e).forEach(([e, n]) => {
250
+ n === null ? t.delete(e) : t.set(e, n);
251
+ }), t.toString();
252
+ }, N = (e) => {
253
+ let t = new URLSearchParams();
254
+ return Object.entries(e).forEach(([e, n]) => {
255
+ Array.isArray(n) ? n.forEach((n) => {
256
+ n != null && t.append(e, String(n));
257
+ }) : n != null && t.set(e, String(n));
258
+ }), t.toString();
259
+ }, P = () => {
260
+ let e = window.location.pathname.match(/\/(\d+)(\/)?$/);
261
+ return e ? Number(e[1]) : null;
262
+ }, F = (e, t = "/styles/default.jpg") => e ? u + ("/" + e).replaceAll("//", "/") : t, I = (e) => e ? u + ("/" + e).replaceAll("//", "/") : "", L = (e, t = "/styles/default.jpg") => e ? d + ("/" + e).replaceAll("//", "/") : t, R = (e, t = "/styles/default.jpg") => e ? f + "/" + e : t, z = (e, t = "/styles/default.jpg") => e ? f + "/" + e : t;
263
+ function ie(e) {
264
+ let t = "";
265
+ for (let n = 0; n < e; n++) {
266
+ let e = Math.floor(Math.random() * 62);
267
+ t += "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"[e];
268
+ }
269
+ return t;
270
+ }
271
+ function B(e) {
272
+ return new DOMParser().parseFromString(e, "text/html").body.textContent || "";
273
+ }
274
+ var V = (e, t = 20, n = !1) => new Promise((r) => {
275
+ for (let r = 0; r < e.length; r++) if (e[r] !== void 0) {
276
+ if (n.test(e[r].name)) {
277
+ if (e[r].size >= t * 1024 * 1024) return y(`Tập tin tải lên không quá ${t}M`), !1;
278
+ } else return y("Tập tin không hợp lệ"), !1;
279
+ } else return y("Tập tin không tồn tại"), !1;
280
+ r(void 0);
281
+ }), H = (e = "", t = "danger") => {
282
+ let n = "";
283
+ if (typeof e == "string") return e.trim() === "" ? "" : `<div class="alert alert-${t}">${e}</div>`;
284
+ for (let r in e) n += `<div class="alert alert-${t}">${e[r]}</div>`;
285
+ return n;
286
+ }, U = (e) => (e.querySelectorAll("input:not([type=\"hidden\"]):not([type=\"checkbox\"]):not([type=\"radio\"]):not(.noReset), textarea").forEach((e) => {
287
+ e.value = "", e.dispatchEvent(new Event("change", { bubbles: !0 }));
288
+ }), e.querySelectorAll("select:not(.noReset)").forEach((e) => {
289
+ let t = e.querySelector("option[value=\"\"]");
290
+ t ? t.selected = !0 : e.options.length > 0 && (e.selectedIndex = 0), e.dispatchEvent(new Event("change", { bubbles: !0 }));
291
+ }), e.querySelectorAll("input[type=\"checkbox\"]:not(.noReset)").forEach((e) => {
292
+ e.checked = !1, e.dispatchEvent(new Event("change", { bubbles: !0 }));
293
+ }), e.querySelectorAll("input[type=\"radio\"]:not(.noReset)").forEach((e) => {
294
+ e.checked = !1, e.dispatchEvent(new Event("change", { bubbles: !0 }));
295
+ }), e), W = async (e, t, n = !1) => {
296
+ try {
297
+ for (let r in t) {
298
+ let i = `[name="${r}"]:not([type="file"])`, c = e.querySelector(i);
299
+ if (!c) continue;
300
+ let l = c.type;
301
+ if (t[r] && !["checkbox", "radio"].includes(l)) {
302
+ let e = s(t[r], "yyyy-MM-dd", /* @__PURE__ */ new Date()), n = s(t[r], "yyyy-MM-dd HH:mm:ss", /* @__PURE__ */ new Date());
303
+ c.value = o(e) && t[r].length === 10 ? a(e, "dd/MM/yyyy") : o(n) && t[r].length === 19 ? a(n, "dd/MM/yyyy HH:mm") : t[r], c.dispatchEvent(new Event("change", { bubbles: !0 }));
304
+ } else if (l === "checkbox") c.checked = !!parseInt(t[r]), c.dispatchEvent(new Event("change", { bubbles: !0 }));
305
+ else if (l === "radio") {
306
+ let n = e.querySelectorAll(`input[type="radio"][name="${r}"]`);
307
+ n.forEach((e) => {
308
+ e.checked = e.value === String(parseInt(t[r]));
309
+ }), n.forEach((e) => e.dispatchEvent(new Event("change", { bubbles: !0 })));
310
+ } else if (n) {
311
+ let e = c.closest(".form-group");
312
+ e && e.classList.add("hidden");
313
+ }
314
+ }
315
+ return t;
316
+ } catch (e) {
317
+ return Promise.reject(e);
318
+ }
319
+ }, G = (e, t = {}) => new Promise((n, r) => {
320
+ try {
321
+ let r = window.jQuery, i = r(e);
322
+ if (!i.length) throw Error("invalid_elfinder");
323
+ let a = {
324
+ url: d + "/elfinder/connector",
325
+ height: 500,
326
+ resizable: !0,
327
+ baseUrl: "/assets/plugins/elFinder/",
328
+ defaultView: "list",
329
+ useBrowserHistory: !1,
330
+ getFileCallback: (e) => {
331
+ n(e);
332
+ }
333
+ };
334
+ i.elfinder("destroy").elfinder({
335
+ ...a,
336
+ ...t
337
+ });
338
+ } catch (e) {
339
+ r(e);
340
+ }
341
+ }), K = (e) => new Promise((t, n) => {
342
+ try {
343
+ let n = typeof e == "string" ? document.querySelector(e) : e;
344
+ if (!n) throw Error("invalid_modalEl_btnEl");
345
+ n.querySelectorAll(".btn-md-close")?.forEach((e) => {
346
+ e?.addEventListener("click", () => {
347
+ r.hide();
348
+ });
349
+ });
350
+ let r = i.getOrCreateInstance(n, {
351
+ backdrop: "static",
352
+ keyboard: !1
353
+ });
354
+ t({
355
+ md: r,
356
+ modalEl: n
357
+ });
358
+ } catch (e) {
359
+ console.log(e), n(e);
360
+ }
361
+ }), q = (e, t, n = !1, r = !1) => {
362
+ if (!e) throw Error("invalid_btnEl");
363
+ e.addEventListener("click", (i) => {
364
+ i.preventDefault(), K(t).then((t) => {
365
+ let { modalEl: i, md: a } = t;
366
+ G("#elfinderStatic").then((t) => {
367
+ n && n({
368
+ data: t,
369
+ btnEl: e,
370
+ md: a
371
+ });
372
+ }), i.addEventListener("hidden.bs.modal", () => {
373
+ r && r();
374
+ }), a.show();
375
+ });
376
+ });
377
+ }, J = (e, t, n = !1, r = !1) => {
378
+ if (!e) throw Error("invalid_btnEl");
379
+ e.addEventListener("click", (i) => {
380
+ i.preventDefault(), K(t).then((t) => {
381
+ let { modalEl: i, md: a } = t;
382
+ G("#elfinderStatic", { url: d + "/elfinder/connectorFiles" }).then((t) => {
383
+ n && n({
384
+ data: t,
385
+ btnEl: e,
386
+ md: a
387
+ });
388
+ }), i.addEventListener("hidden.bs.modal", () => {
389
+ r && r();
390
+ }), a.show();
391
+ });
392
+ });
393
+ }, Y = (e) => {
394
+ if (typeof e == "string" && (e = X(e, [])), !Array.isArray(e)) return [];
395
+ let t = e.map((e) => Number(e));
396
+ return t = t.filter((e) => !Number.isNaN(e)), [...new Set(t)];
397
+ };
398
+ function X(e, t = {}, n = "ids") {
399
+ let r = t;
400
+ if (Array.isArray(e) && (r = e), typeof e == "object" && e && (r = e), typeof e == "number") return t;
401
+ if (typeof e == "string") try {
402
+ let t = JSON.parse(e);
403
+ Array.isArray(t) && (r = t), typeof t == "object" && t && (r = t);
404
+ } catch {
405
+ return t;
406
+ }
407
+ return n === "ids" && (r = Y(r)), r;
408
+ }
409
+ var ae = (e, t = {}, n = "vi-VN") => e ? e?.toLocaleString(n, t) : 0, oe = (e) => {
410
+ if (!e) return new c(0);
411
+ let t = String(e).replace(/[^\d.]/g, "");
412
+ return t ? new c(t) : new c(0);
413
+ }, se = (e, t) => [...new Set(e.map((e) => e[t]))], ce = (e, t, n, r, i) => {
414
+ let a = e.length, o = [];
415
+ for (let s = 0; s < a; s++) {
416
+ let a = t.find((t) => t[r] === e[s]);
417
+ a && o.push({
418
+ [n]: e[s],
419
+ [i]: a[i]
420
+ });
421
+ }
422
+ return o;
423
+ }, Z = (e, t) => e.map((e) => {
424
+ let n = {};
425
+ for (let r in t) {
426
+ let i = t[r];
427
+ typeof i == "string" ? n[r] = e[i] : typeof i == "function" && (n[r] = i(e));
428
+ }
429
+ return n;
430
+ }), le = (e, t, n = !1) => {
431
+ if (t.split("-").map(Number).includes(e)) return !0;
432
+ if (n) throw Error("invalid_status");
433
+ return !1;
434
+ };
435
+ function ue(e, t) {
436
+ return e?.reduce((e, n) => e + (n[t] ?? 0), 0) || 0;
437
+ }
438
+ var de = (e) => {
439
+ switch (e) {
440
+ case 3: return "tháng " + ((/* @__PURE__ */ new Date()).getMonth() + 1);
441
+ case 4: return "năm " + (/* @__PURE__ */ new Date()).getFullYear();
442
+ }
443
+ return "";
444
+ }, fe = (e = !1) => {
445
+ let t = [{
446
+ id: 1,
447
+ name: "Tiếng Việt"
448
+ }];
449
+ return e === !1 ? t : t.find((t) => t.id === e)?.name || "";
450
+ }, pe = class {
451
+ routes = [];
452
+ async addGS(e, t, n, r = !1, i = !1, a = !1, o = !1) {
453
+ let s = {
454
+ path: e,
455
+ element: t,
456
+ children: [{
457
+ index: !0,
458
+ element: n
459
+ }, {
460
+ path: "page/:page",
461
+ element: n
462
+ }]
463
+ };
464
+ i && s.children.push({
465
+ path: "detail/:id",
466
+ element: i
467
+ }), r && s.children.push({
468
+ path: "create",
469
+ element: r
470
+ }), r && s.children.push({
471
+ path: "edit/:id",
472
+ element: r
473
+ }), a && s.children.push({
474
+ path: "import",
475
+ element: a
476
+ }), o && s.children.push({
477
+ path: "fields",
478
+ element: o
479
+ }), this.routes.push(s);
480
+ }
481
+ addRoute(e = []) {
482
+ this.routes = [...this.routes, ...e];
483
+ }
484
+ getRouter() {
485
+ return this.routes;
486
+ }
487
+ }, Q = (e, t, n, r, i, a) => {
488
+ if (!a) return !1;
489
+ if (a == 1) return !0;
490
+ for (let o of e) {
491
+ if (o.module == t && o.controller == n && o.action == r && o.code == i && o.status !== 1) return o.isPer;
492
+ if (o.subs && o.subs.length > 0 && !Q(o.subs, t, n, r, i, a)) return !1;
493
+ }
494
+ return !0;
495
+ }, $ = window.jQuery, me = class e {
496
+ options;
497
+ validators;
498
+ $element;
499
+ $btn;
500
+ $inputs;
501
+ static VERSION = "0.11.9";
502
+ static INPUT_SELECTOR = ":input:not(.nvali,[type=\"hidden\"], [type=\"submit\"], [type=\"reset\"], button)";
503
+ static FOCUS_OFFSET = 20;
504
+ static DEFAULTS = {
505
+ delay: 500,
506
+ html: !1,
507
+ disable: !0,
508
+ focus: !0,
509
+ custom: {},
510
+ errors: {
511
+ match: "Does not match",
512
+ minlength: "Too short",
513
+ maxlength: "Too long"
514
+ },
515
+ feedback: {
516
+ success: "glyphicon-ok",
517
+ error: "glyphicon-remove"
518
+ }
519
+ };
520
+ static VALIDATORS = {
521
+ native: function(e) {
522
+ let t = e[0];
523
+ if (t.checkValidity) return !t.checkValidity() && !t.validity.valid && (t.validationMessage || "error!");
524
+ },
525
+ match: function(t) {
526
+ let n = t.attr("data-match");
527
+ return n && t.val() !== $(n).val() && e.DEFAULTS.errors.match;
528
+ },
529
+ minlength: function(t) {
530
+ let n = Number(t.attr("data-minlength"));
531
+ return String(t.val() ?? "").length < n && e.DEFAULTS.errors.minlength;
532
+ },
533
+ maxlength: function(t) {
534
+ let n = Number(t.attr("data-maxlength"));
535
+ return String(t.val() ?? "").length > n && e.DEFAULTS.errors.maxlength;
536
+ },
537
+ filesize: function(e) {
538
+ let t = Number(e.data("filesize")), n = e[0];
539
+ return n?.files?.length ? n.files[0].size > t * 1024 * 1024 : !1;
540
+ },
541
+ accept: function(e) {
542
+ let t = e.attr("data-accept");
543
+ if (!t) return !1;
544
+ let n = e[0];
545
+ if (!n?.files?.length) return !1;
546
+ let r = n.files[0];
547
+ return !new RegExp(t).test(r.name);
548
+ },
549
+ pattern: function(e) {
550
+ let t = e.attr("data-pattern");
551
+ return t ? !new RegExp(t).test(String(e.val() ?? "")) : !1;
552
+ }
553
+ };
554
+ constructor(t, n = !1) {
555
+ this.options = n || e.DEFAULTS, this.validators = $.extend({}, e.VALIDATORS), this.$element = $(t), this.$btn = this.$element.find("button[type=\"submit\"], input[type=\"submit\"], .submitAjax"), this.$inputs = this.$element.find(e.INPUT_SELECTOR).add(this.$element.find("[data-validate=\"true\"]")).not(this.$element.find("[data-validate=\"false\"]").each((e, t) => {
556
+ this.clearErrors($(t));
557
+ }));
558
+ }
559
+ static getValue(e) {
560
+ return e.is("[type=\"checkbox\"]") ? !!e.prop("checked") : e.is("[type=\"radio\"]") ? $(`[name="${e.attr("name")}"]:checked`).length > 0 : e.is("select[multiple]") ? (e.val() ?? []).length : e.val() ?? "";
561
+ }
562
+ update = () => {
563
+ let t = this;
564
+ return this.$inputs = this.$element.find(e.INPUT_SELECTOR).add(this.$element.find("[data-validate=\"true\"]")).not(this.$element.find("[data-validate=\"false\"]").each((e, n) => {
565
+ t.clearErrors($(n));
566
+ })), this.toggleSubmit(), this;
567
+ };
568
+ onInput = (e) => {
569
+ let t = this, n = $(e.target), r = e.type !== "focusout";
570
+ this.$inputs.is(n) && this.validateInput(n, r)?.done(function() {
571
+ t.toggleSubmit();
572
+ });
573
+ };
574
+ validateInput = (e, t) => {
575
+ let n = e.data("bs.validator.errors");
576
+ e.is("[type=\"radio\"]") && (e = this.$element.find("input[name=\"" + e.attr("name") + "\"]"));
577
+ let r = $.Event("validate.bs.validator", { relatedTarget: e[0] });
578
+ if (this.$element.trigger(r), r.isDefaultPrevented()) return;
579
+ let i = this;
580
+ return this.runValidators(e).done(function(a) {
581
+ e.data("bs.validator.errors", a), a.length ? t ? i.defer(e, i.showErrors) : i.showErrors(e) : i.clearErrors(e), (!n || a.toString() !== n.toString()) && (r = a.length ? $.Event("invalid.bs.validator", {
582
+ relatedTarget: e[0],
583
+ detail: a
584
+ }) : $.Event("valid.bs.validator", {
585
+ relatedTarget: e[0],
586
+ detail: n
587
+ }), i.$element.trigger(r)), i.toggleSubmit(), i.$element.trigger($.Event("validated.bs.validator", { relatedTarget: e[0] }));
588
+ });
589
+ };
590
+ runValidators = (t) => {
591
+ let n = [], r = $.Deferred();
592
+ t.data("bs.validator.deferred") && t.data("bs.validator.deferred").reject(), t.data("bs.validator.deferred", r);
593
+ function i(e) {
594
+ return t.attr("data-" + e + "-error");
595
+ }
596
+ function a() {
597
+ let e = t[0];
598
+ if (!(e instanceof HTMLInputElement) && !(e instanceof HTMLSelectElement) && !(e instanceof HTMLTextAreaElement)) return null;
599
+ let n = e.validity;
600
+ return n.typeMismatch ? t.attr("data-type-error") ?? null : n.patternMismatch ? t.attr("data-pattern-error") ?? null : n.stepMismatch ? t.attr("data-step-error") ?? null : n.rangeOverflow ? t.attr("data-max-error") ?? null : n.rangeUnderflow ? t.attr("data-min-error") ?? null : n.valueMissing ? t.attr("data-required-error") ?? null : null;
601
+ }
602
+ function o() {
603
+ return t.attr("data-error");
604
+ }
605
+ function s(e) {
606
+ return i(e) || a() || o();
607
+ }
608
+ return $.each(this.validators, $.proxy(function(r, i) {
609
+ let a = null;
610
+ (e.getValue(t) || t.attr("required")) && (t.attr("data-" + r) !== void 0 || r == "native") && (a = i.call(this, t)) && (a = s(r) || a, !~n.indexOf(a) && n.push(a));
611
+ }, this)), r.resolve(n), r.promise();
612
+ };
613
+ validate = () => {
614
+ let e = this;
615
+ return $.when(this.$inputs.map((t, n) => e.validateInput($(n), !1))).then(function() {
616
+ e.toggleSubmit(), e.focusError();
617
+ }), this;
618
+ };
619
+ focusError = () => {
620
+ if (!this.options.focus) return;
621
+ let t = this.$element.find(".has-error:first :input");
622
+ t.length !== 0 && ($("html, body").animate({ scrollTop: t.offset().top - e.FOCUS_OFFSET }, 250), t.focus());
623
+ };
624
+ showErrors = (e) => {
625
+ this.options.html;
626
+ let t = e.data("bs.validator.errors"), n = e.closest(".form-group, .boxUFile"), r = n.find(".form-control-feedback");
627
+ t.length && (t = $("<ul/>").addClass("list-unstyled").append($.map(t, (e) => {
628
+ let t = $("<li/>");
629
+ return this.options.html ? t.html(e) : t.text(e);
630
+ })), n.addClass("has-error has-danger"), n.find(".invalid-tooltip, .invalid-feedback").remove(), n.find(".select2,.form-control").removeClass("is-valid").addClass("is-invalid"), n.append(`<div class="invalid-feedback"><ul class="list-unstyled">${t.html()}<ul/></div>`), n.removeClass("has-success"), n.hasClass("has-feedback"), r.removeClass(this.options.feedback?.success), r.addClass(this.options.feedback?.error));
631
+ };
632
+ clearErrors = (e) => {
633
+ let t = e.closest(".form-group, .boxUFile"), n = t.find(".form-control-feedback");
634
+ t.removeClass("has-error has-danger has-success"), t.find(".invalid-tooltip, .invalid-feedback").remove(), t.find(".select2,.form-control").addClass("is-valid").removeClass("is-invalid"), t.addClass("has-success"), t.hasClass("has-feedback"), n.removeClass(this.options.feedback?.error), n.removeClass(this.options.feedback?.success), n.addClass(this.options.feedback?.success);
635
+ };
636
+ hasErrors = () => !!this.$inputs.filter(function() {
637
+ return !!($(this).data("bs.validator.errors") || []).length;
638
+ }).length;
639
+ isIncomplete = () => !!this.$inputs.filter("[required]").filter((t, n) => {
640
+ let r = e.getValue($(n));
641
+ return !(typeof r == "string" ? r.trim() : r);
642
+ }).length;
643
+ onSubmit = (e) => {
644
+ this.validate(), (this.isIncomplete() || this.hasErrors()) && e.preventDefault();
645
+ };
646
+ toggleSubmit = () => {
647
+ this.options.disable;
648
+ };
649
+ defer = (e, t) => {
650
+ if (t = t.bind(this, e), !this.options.delay) return t();
651
+ window.clearTimeout(e.data("bs.validator.timeout")), e.data("bs.validator.timeout", window.setTimeout(t, this.options.delay));
652
+ };
653
+ reset = () => (this.$element.find(".form-control-feedback").removeClass(this.options?.feedback.error).removeClass(this.options.feedback.success), this.$inputs.removeData(["bs.validator.errors", "bs.validator.deferred"]).each(() => {
654
+ let e = $(this), t = e.data("bs.validator.timeout");
655
+ window.clearTimeout(t), e.removeData("bs.validator.timeout");
656
+ }), this.$element.find(".invalid-tooltip, .invalid-feedback").each(() => {
657
+ let e = $(this), t = e.data("bs.validator.originalContent");
658
+ e.removeData("bs.validator.originalContent").html(t);
659
+ }), this.$btn.removeClass("disabled"), this.$element.find(".has-error, .has-danger, .has-success, .is-invalid, .is-valid").removeClass("has-error has-danger has-success is-invalid is-valid"), this);
660
+ destroy = () => (this.reset(), this.$element.removeAttr("novalidate").removeData("bs.validator").off(".bs.validator"), this.$inputs.off(".bs.validator"), this.options = null, this.validators = null, this.$element = null, this.$btn = null, this.$inputs = null, this);
661
+ run = () => {
662
+ this.update(), this.$element.on("input.bs.validator change.bs.validator focusout.bs.validator", this.onInput.bind(this)), this.$element.on("submit.bs.validator", this.onSubmit.bind(this)), this.$element.on("reset.bs.validator", this.reset.bind(this)), this.$element.find("[data-match]").each(function() {
663
+ let t = $(this), n = t.attr("data-match");
664
+ n && $(n).on("input.bs.validator", function() {
665
+ e.getValue(t) && t.trigger("input.bs.validator");
666
+ });
667
+ }), this.$inputs.filter((t, n) => e.getValue($(n)) && !$(this).closest(".has-error").length).trigger("focusout"), this.$element.attr("novalidate", !0);
668
+ };
669
+ };
670
+ //#endregion
671
+ export { pe as CusRoute, me as Validator, h as buildFormData, g as callFetchApi, _ as callFetchApiToken, Q as checkPermission, V as checkUploadFile, K as createModal, N as createQueryString, oe as decimalNumber, G as elFinderPopup, Y as filterIds, O as formatDate, A as formatDateSql, D as formatDateTime, ae as formatNumber, k as formatYear, S as getActiveStatus, t as getEnv, I as getFile, de as getFilterType, P as getIdParams, F as getImage, fe as getLangs, x as getLinkFiles, re as getName, b as getNames, j as getParams, L as getPubImage, C as getPublishStatus, w as getTrueFlaseStatus, z as getUploadFile, R as getUploadImage, B as htmlToText, le as isStsNum, e as loadEnv, p as loadScript, m as loadScripts, Z as mapArrData, se as mapArrFields, W as mapDataForm, ce as mergeArrObject, T as parseDate, ie as randomString, U as resetForm, M as setParams, J as showFinderFileModal, q as showFinderModal, H as showMessage, v as showSweetAlert, y as showSweetAlertError, te as showSweetAlertOk, ne as showSweetAlertWarning, ee as spinnerLoader, E as strToDate, X as stringToJson, ue as sumArrCol };