@materialui-reactjs/admin 2.0.0 → 2.0.1

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 (93) hide show
  1. package/CHANGELOG.md +30 -0
  2. package/README.md +4 -1
  3. package/dist/Common-DFahMuQE.cjs +11 -0
  4. package/dist/{Common-1GAoFU4L.js → Common-_PK8HLKN.js} +22 -16
  5. package/dist/HeaderUpdate-Dirxjmxs.cjs +1 -0
  6. package/dist/{HeaderUpdate-UXncZcAD.js → HeaderUpdate-drlnuHI8.js} +24 -25
  7. package/dist/{UDragFile-BqGt1-gK.js → UDragFile-D8wOZ1Ut.js} +2 -2
  8. package/dist/UDragFile-Db0sK4M7.cjs +1 -0
  9. package/dist/{Validator-aKlMgoxl.js → Validator-D2zwZeov.js} +73 -50
  10. package/dist/Validator-DBxl8wtE.cjs +1 -0
  11. package/dist/ckeditor/ckeditor.d.ts +3 -0
  12. package/dist/ckeditor/plugins/elfinder.d.ts +11 -0
  13. package/dist/ckeditor/plugins/fullscreen.d.ts +15 -0
  14. package/dist/ckeditor/plugins/pdffinder.d.ts +18 -0
  15. package/dist/ckeditor/types.d.ts +37 -0
  16. package/dist/{common-DVWX6AUQ.js → common-CEZp8xpQ.js} +14 -3
  17. package/dist/common-ivDX6gGq.cjs +1 -0
  18. package/dist/components/echarts/index.cjs +1 -1
  19. package/dist/components/echarts/index.js +1 -1
  20. package/dist/components/form/AsxhUImages.d.ts +2 -1
  21. package/dist/components/form/BoxAddRow.d.ts +2 -1
  22. package/dist/components/form/CusForm.d.ts +19 -6
  23. package/dist/components/form/Editor.d.ts +2 -1
  24. package/dist/components/form/EfImage.d.ts +2 -1
  25. package/dist/components/form/EfImages.d.ts +2 -1
  26. package/dist/components/form/PImage.d.ts +2 -1
  27. package/dist/components/form/SelectAddRowBoxAdvanced.d.ts +13 -4
  28. package/dist/components/form/SelectBox.d.ts +20 -7
  29. package/dist/components/form/UDragFile.d.ts +2 -1
  30. package/dist/components/form/UFile.d.ts +2 -1
  31. package/dist/components/form/UFiles.d.ts +9 -2
  32. package/dist/components/form/UImages.d.ts +2 -1
  33. package/dist/components/form/index.cjs +1 -1
  34. package/dist/components/form/index.js +2 -2
  35. package/dist/components/meta/CardTable.d.ts +4 -2
  36. package/dist/components/meta/CardTable.types.d.ts +11 -5
  37. package/dist/components/meta/CusTooltip.d.ts +7 -1
  38. package/dist/components/meta/Head.d.ts +10 -1
  39. package/dist/components/meta/HeaderDetail.d.ts +2 -1
  40. package/dist/components/meta/ScrollTable.d.ts +7 -3
  41. package/dist/components/meta/SearchBox.d.ts +2 -1
  42. package/dist/components/meta/SortableItem.d.ts +11 -1
  43. package/dist/components/meta/index.cjs +1 -1
  44. package/dist/components/meta/index.js +2 -2
  45. package/dist/components/sidebar/index.cjs +1 -1
  46. package/dist/components/sidebar/index.js +1 -1
  47. package/dist/components/single/List.d.ts +15 -4
  48. package/dist/components/single/Update.d.ts +2 -1
  49. package/dist/components/single/UpdateTableDetail.d.ts +2 -1
  50. package/dist/components/single/index.cjs +1 -1
  51. package/dist/components/single/index.js +1 -1
  52. package/dist/components/top-navbar/index.cjs +1 -1
  53. package/dist/components/top-navbar/index.js +28 -28
  54. package/dist/echarts-Bi3uwLbg.cjs +1 -0
  55. package/dist/{echarts-CRmndsxC.js → echarts-CTzMqeR5.js} +4 -4
  56. package/dist/form-heyswTRq.js +3897 -0
  57. package/dist/form-sgtop6li.cjs +49 -0
  58. package/dist/hook/common.d.ts +22 -0
  59. package/dist/hook/detail.cjs +1 -1
  60. package/dist/hook/detail.js +1 -1
  61. package/dist/hook/fields.cjs +1 -1
  62. package/dist/hook/fields.js +1 -1
  63. package/dist/hook/index.cjs +1 -1
  64. package/dist/hook/index.d.ts +4 -3
  65. package/dist/hook/index.js +10 -10
  66. package/dist/hook/update.cjs +1 -1
  67. package/dist/hook/update.d.ts +2 -2
  68. package/dist/hook/update.js +10 -7
  69. package/dist/index.cjs +1 -1
  70. package/dist/index.js +11 -11
  71. package/dist/meta-BANk9kHW.cjs +1 -0
  72. package/dist/meta-CheDAmMh.js +745 -0
  73. package/dist/sidebar-CfQAYWi-.cjs +1 -0
  74. package/dist/{sidebar-CVORMKBY.js → sidebar-CzRmfvhi.js} +3 -3
  75. package/dist/{single-CqD5cgNi.js → single-BsJ7TYJi.js} +240 -252
  76. package/dist/single-C2WPEjhk.cjs +1 -0
  77. package/dist/utils/Common.d.ts +100 -27
  78. package/dist/utils/Env.d.ts +1 -1
  79. package/dist/utils/index.cjs +1 -1
  80. package/dist/utils/index.js +49 -40
  81. package/package.json +1 -1
  82. package/dist/Common-BBYXssMH.cjs +0 -11
  83. package/dist/HeaderUpdate-DIwc8EAA.cjs +0 -1
  84. package/dist/UDragFile-oJ05zNLR.cjs +0 -1
  85. package/dist/Validator-BcydBvOg.cjs +0 -1
  86. package/dist/common-CHDJQ2Ca.cjs +0 -1
  87. package/dist/echarts-Dla22xas.cjs +0 -1
  88. package/dist/form-BNAbGCXe.js +0 -45955
  89. package/dist/form-DUL_O4IY.cjs +0 -65
  90. package/dist/meta-CXHXSPbq.cjs +0 -1
  91. package/dist/meta-Dhll5zt9.js +0 -764
  92. package/dist/sidebar-G5Ody16K.cjs +0 -1
  93. package/dist/single-CsUaxEjQ.cjs +0 -1
package/CHANGELOG.md CHANGED
@@ -5,6 +5,36 @@ All notable changes to this project are documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [Unreleased]
9
+
10
+ ### Changed
11
+
12
+ - **BỎ bundle `ckeditor.js`, dùng source TypeScript trực tiếp (BREAKING).**
13
+ `src/ckeditor/ckeditor.js` — file webpack build sẵn (~1.37 MB) — đã bị xoá và
14
+ thay bằng source TS nằm ngay trong repo: `ckeditor.ts` + `plugins/{elfinder,
15
+ pdffinder,fullscreen}.ts` + `types.ts`. `Editor.tsx` import trực tiếp module
16
+ mới nên sửa plugin/toolbar giờ được typecheck và lint như phần còn lại của
17
+ `src/`, thay vì phải build lại rồi copy file.
18
+
19
+ Hệ quả mong muốn:
20
+ - CKEditor **không còn** bị đóng cứng ở version 47.3.0 — nay dùng version
21
+ của consumer (`ckeditor5` ^48.4.0), nên không còn trường hợp lệch version
22
+ giữa code JS và CSS.
23
+ - `ckeditor5` là optional peer dependency và `vite.config.ts` đánh dấu
24
+ external, nên CKEditor **không** bị đóng gói vào `dist/` (đã kiểm tra:
25
+ output chỉ còn `import ... from "ckeditor5"`, 0 dòng code CKEditor).
26
+ App của consumer chỉ có **một** bản CKEditor duy nhất.
27
+ - `import "ckeditor5/ckeditor5.css"` được giữ nguyên — CSS giờ lấy từ
28
+ package thay vì bị webpack nhúng vào bundle.
29
+
30
+ Không đổi hành vi runtime: toolbar, `defaultConfig`, và logic 3 plugin được
31
+ giữ nguyên so với bản build cũ. `src/types/ckeditor.d.ts` (ambient
32
+ `declare module` vì `.js` không có type) cũng bị xoá vì không còn cần.
33
+
34
+ Thay đổi phụ trong `Editor.tsx`: `config` không còn ép `as any` mà được
35
+ kiểu `M4DEditorConfig`, và `editor.plugins.get("WordCount")` chuyển sang
36
+ `editor.plugins.get(WordCount)` để `wordCountContainer` có đúng kiểu.
37
+
8
38
  ## [2.4.0] - 2026-09-27
9
39
 
10
40
  Ba lỗi chặn publish, tìm ra bằng cách **pack thật rồi cài vào một project sạch**
package/README.md CHANGED
@@ -511,7 +511,10 @@ Test sources live in `test/` and are kept out of the published package (`files`
511
511
  Prettier config fails fast instead of accumulating as unreviewed diff noise.
512
512
 
513
513
  `ckeditor5` is declared as an **optional** peer dependency: it is only needed if you use
514
- the `Editor` component, and it is bundled inside `src/ckeditor/` regardless.
514
+ the `Editor` component. The editor build (`src/ckeditor/`) is plain TypeScript that
515
+ imports from `ckeditor5`, so CKEditor is **never** bundled into this package — the
516
+ consumer installs it and their bundler tree-shakes it, so an app only ever ships a
517
+ single copy of CKEditor.
515
518
 
516
519
  ```bash
517
520
  npm test # run once
@@ -0,0 +1,11 @@
1
+ const e=require("./rolldown-runtime-BocRIvOZ.cjs"),t=require("./Env-DoS-iQjs.cjs");let n=require("sweetalert2");n=e.t(n,1);let r=require("sweetalert2-react-content");r=e.t(r,1);let i=require("bootstrap");require("date-fns");let a=require("decimal.js");a=e.t(a,1),t.n();var o=e=>t.t()[e]??``,s=(e,t=!0)=>{let n=typeof e==`string`?document.querySelector(e):e;if(n){if(t)n.querySelector(`.boxSpinner`)||n.insertAdjacentHTML(`afterbegin`,`<div class="boxSpinner rounded">
2
+ <div class="spinner">
3
+ <div class="rect1"></div>
4
+ <div class="rect2"></div>
5
+ <div class="rect3"></div>
6
+ <div class="rect4"></div>
7
+ <div class="rect5"></div>
8
+ <div class="rect6"></div>
9
+ <div class="rect7"></div>
10
+ </div>
11
+ </div>`);else{let e=n.querySelector(`.boxSpinner`);e&&e.remove()}}},c=e=>{let t=new FormData;return Object.entries(e).forEach(([e,n])=>{if(n!=null){if(n instanceof FileList){Array.from(n).forEach(n=>t.append(e,n));return}if(n instanceof File){t.append(e,n);return}if(Array.isArray(n)&&n.every(e=>e instanceof File)){n.forEach(n=>t.append(e,n));return}if(Array.isArray(n)&&n.every(e=>[`string`,`number`,`boolean`].includes(typeof e))){n.forEach(n=>t.append(e,n.toString()));return}if(typeof n==`object`){t.append(e,JSON.stringify(n));return}n!=null&&typeof n!=`function`&&typeof n!=`object`&&t.append(e,String(n))}}),t},l=class extends Error{errorCode;constructor(e,t){super(e),this.name=`ApiError`,this.errorCode=t}};async function u(e,t={},n=`POST`,r=`application/json`,i=!0){let a={"Secret-Key":o(`SECRET_KEY`)};r!==`multipart/form-data`&&(a[`Content-Type`]=r);let s={method:n,headers:a,credentials:`include`};if(n==`POST`&&(s.body=r===`multipart/form-data`?c(t):JSON.stringify(t)),n===`GET`&&Object.keys(t).length>0){let n=new URLSearchParams;Object.entries(t).forEach(([e,t])=>{Array.isArray(t)?t.forEach(t=>n.append(e,String(t))):n.append(e,String(t))});let r=n.toString();e+=(e.includes(`?`)?`&`:`?`)+r}let u=await(await fetch(e,s)).text(),d=null;if(u)try{d=JSON.parse(u)}catch{d=u}if(d&&typeof d!=`string`&&d.status==200)return d;if(d&&typeof d!=`string`&&d.msg&&i)throw new l(d.msg,d.errorCode??`unknown`);if(i)throw Error(`invalid_response`);return!1}var d=(e=`Bạn có chắc muốn thực hiện thao tác này ?`,t=`Đồng ý`)=>(0,r.default)(n.default).fire({title:`Xác nhận`,text:e,icon:`warning`,showCancelButton:!0,confirmButtonColor:`#4CAF50`,cancelButtonColor:`#F44336`,confirmButtonText:t,cancelButtonText:`Hủy`,position:`top`}),f=(e,t=`top`,i=!1)=>{(0,r.default)(n.default).fire({toast:i,icon:`success`,position:t,title:e,showConfirmButton:!1,timer:1500})},p=e=>{(0,r.default)(n.default).fire({icon:`error`,position:`top`,title:e,showConfirmButton:!1})},m=e=>{if(!e)return null;let t=new Date(e);return isNaN(t.getTime())?null:{dd:String(t.getDate()).padStart(2,`0`),MM:String(t.getMonth()+1).padStart(2,`0`),yyyy:t.getFullYear(),hh:String(t.getHours()).padStart(2,`0`),mm:String(t.getMinutes()).padStart(2,`0`),ss:String(t.getSeconds()).padStart(2,`0`)}},h=e=>{let t=m(e);return t?`${t.dd}/${t.MM}/${t.yyyy}`:e?`Invalid Date`:``},g=e=>{let t=new URLSearchParams;return Object.entries(e).forEach(([e,n])=>{Array.isArray(n)?n.forEach(n=>{n!=null&&t.append(e,String(n))}):n!=null&&t.set(e,String(n))}),t.toString()},_=(e=typeof window<`u`?window.location.pathname:``,t=/\/(?:edit|detail|update)\/(\d+)(?=\/|$)/i)=>{let n=new RegExp(t.source,t.flags.includes(`g`)?t.flags:t.flags+`g`),r=null,i;for(;(i=n.exec(e))!==null;)r=i;if(!r)return null;let a=Number(r[1]);return Number.isFinite(a)?a:null},v=(e,t=`/styles/default.jpg`)=>e?o(`STATIC_URL`)+(`/`+e).replaceAll(`//`,`/`):t,y=e=>e?o(`STATIC_URL`)+(`/`+e).replaceAll(`//`,`/`):``,b=(e,t=`/styles/default.jpg`)=>e?o(`API_URL`)+(`/`+e).replaceAll(`//`,`/`):t,x=(e,t=`/styles/default.jpg`)=>e?o(`UPLOADS_URL`)+`/`+e:t;function S(e){let t=``;for(let n=0;n<e;n++){let e=Math.floor(Math.random()*62);t+=`ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789`[e]}return t}var C=/\.(jpg|jpeg|png|jfif|doc|docx|xls|xlsx|pdf)$/i,w=(e,t)=>{if(!e)return t;let n=e.split(`,`).map(e=>{let t=e.trim();return(t.includes(`/`)?t.slice(t.indexOf(`/`)+1):t).replace(/^\./,``)}).filter(Boolean);if(n.length===0)return t;let r=n.map(e=>e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`));return RegExp(`\\.(${r.join(`|`)})$`,`i`)},T=(e,t=20,n=C)=>new Promise((r,i)=>{let a=Array.from(e??[]);if(a.length===0)return i(Error(`Tập tin không tồn tại`));for(let e of a){if(!n.test(e.name))return p(`Tập tin không hợp lệ`),i(Error(`Tập tin không hợp lệ`));if(e.size>t*1024*1024)return p(`Tập tin tải lên không quá ${t}M`),i(Error(`Tập tin tải lên không quá ${t}M`))}r()}),E={"&":`&amp;`,"<":`&lt;`,">":`&gt;`,'"':`&quot;`,"'":`&#39;`},D=e=>String(e??``).replace(/[&<>"']/g,e=>E[e]),O=new Set([`danger`,`success`,`warning`,`info`,`primary`,`secondary`,`light`,`dark`]),k=(e=``,t=`danger`,n={})=>{let r=O.has(t)?t:`danger`,i=e=>n.raw?e:D(e);return typeof e==`string`?e.trim()===``?``:`<div class="alert alert-${r}">${i(e)}</div>`:!e||typeof e!=`object`?``:Object.values(e).filter(e=>e!=null&&String(e).trim()!==``).map(e=>`<div class="alert alert-${r}">${i(String(e))}</div>`).join(``)},A=(e,t={})=>new Promise((n,r)=>{try{let r=window.jQuery,i=r(e);if(!i.length)throw Error(`invalid_elfinder`);let a={url:o(`API_URL`)+`/elfinder/connector`,height:500,resizable:!0,baseUrl:`/assets/plugins/elFinder/`,defaultView:`list`,useBrowserHistory:!1,getFileCallback:e=>{n(e)}};i.elfinder(`destroy`).elfinder({...a,...t})}catch(e){r(e)}}),j=e=>{if(e instanceof Error)return e.message;if(typeof e==`string`)return e;try{return JSON.stringify(e)??String(e)}catch{return String(e)}},M=e=>new Promise((t,n)=>{try{let n=typeof e==`string`?document.querySelector(e):e;if(!n)throw Error(`invalid_modalEl_btnEl`);n.querySelectorAll(`.btn-md-close`)?.forEach(e=>{e?.addEventListener(`click`,()=>{r.hide()})});let r=i.Modal.getOrCreateInstance(n,{backdrop:`static`,keyboard:!1});t({md:r,modalEl:n})}catch(e){console.log(e),n(e)}}),N=(e,t,n=!1,r=!1)=>{if(!e)throw Error(`invalid_btnEl`);e.addEventListener(`click`,i=>{i.preventDefault(),M(t).then(({modalEl:t,md:i})=>{A(`#elfinderStatic`).then(t=>{n&&n({data:t,btnEl:e,md:i})}),t.addEventListener(`hidden.bs.modal`,()=>{r&&r()}),i.show()})})},P=(e,t,n=!1,r=!1)=>{if(!e)throw Error(`invalid_btnEl`);e.addEventListener(`click`,i=>{i.preventDefault(),M(t).then(({modalEl:t,md:i})=>{A(`#elfinderStatic`,{url:o(`API_URL`)+`/elfinder/connectorFiles`}).then(t=>{n&&n({data:t,btnEl:e,md:i})}),t.addEventListener(`hidden.bs.modal`,()=>{r&&r()}),i.show()})})},F=(e=!1)=>{let t=[{id:1,name:`Tiếng Việt`}];return e===!1?t:t.find(t=>t.id===e)?.name||``};Object.defineProperty(exports,"C",{enumerable:!0,get:function(){return s}}),Object.defineProperty(exports,"S",{enumerable:!0,get:function(){return f}}),Object.defineProperty(exports,"_",{enumerable:!0,get:function(){return P}}),Object.defineProperty(exports,"a",{enumerable:!0,get:function(){return g}}),Object.defineProperty(exports,"b",{enumerable:!0,get:function(){return d}}),Object.defineProperty(exports,"c",{enumerable:!0,get:function(){return D}}),Object.defineProperty(exports,"d",{enumerable:!0,get:function(){return _}}),Object.defineProperty(exports,"f",{enumerable:!0,get:function(){return v}}),Object.defineProperty(exports,"g",{enumerable:!0,get:function(){return S}}),Object.defineProperty(exports,"h",{enumerable:!0,get:function(){return x}}),Object.defineProperty(exports,"i",{enumerable:!0,get:function(){return M}}),Object.defineProperty(exports,"l",{enumerable:!0,get:function(){return h}}),Object.defineProperty(exports,"m",{enumerable:!0,get:function(){return b}}),Object.defineProperty(exports,"n",{enumerable:!0,get:function(){return u}}),Object.defineProperty(exports,"o",{enumerable:!0,get:function(){return A}}),Object.defineProperty(exports,"p",{enumerable:!0,get:function(){return F}}),Object.defineProperty(exports,"r",{enumerable:!0,get:function(){return T}}),Object.defineProperty(exports,"s",{enumerable:!0,get:function(){return j}}),Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return w}}),Object.defineProperty(exports,"u",{enumerable:!0,get:function(){return y}}),Object.defineProperty(exports,"v",{enumerable:!0,get:function(){return N}}),Object.defineProperty(exports,"x",{enumerable:!0,get:function(){return p}}),Object.defineProperty(exports,"y",{enumerable:!0,get:function(){return k}});
@@ -43,7 +43,7 @@ var a = (e) => t()[e] ?? "", o = (e, t = !0) => {
43
43
  t.append(e, JSON.stringify(n));
44
44
  return;
45
45
  }
46
- t.append(e, n);
46
+ n != null && typeof n != "function" && typeof n != "object" && t.append(e, String(n));
47
47
  }
48
48
  }), t;
49
49
  }, c = class extends Error {
@@ -198,7 +198,15 @@ var S = /\.(jpg|jpeg|png|jfif|doc|docx|xls|xlsx|pdf)$/i, C = (e, t) => {
198
198
  } catch (e) {
199
199
  r(e);
200
200
  }
201
- }), A = (e) => new Promise((t, n) => {
201
+ }), A = (e) => {
202
+ if (e instanceof Error) return e.message;
203
+ if (typeof e == "string") return e;
204
+ try {
205
+ return JSON.stringify(e) ?? String(e);
206
+ } catch {
207
+ return String(e);
208
+ }
209
+ }, j = (e) => new Promise((t, n) => {
202
210
  try {
203
211
  let n = typeof e == "string" ? document.querySelector(e) : e;
204
212
  if (!n) throw Error("invalid_modalEl_btnEl");
@@ -218,39 +226,37 @@ var S = /\.(jpg|jpeg|png|jfif|doc|docx|xls|xlsx|pdf)$/i, C = (e, t) => {
218
226
  } catch (e) {
219
227
  console.log(e), n(e);
220
228
  }
221
- }), j = (e, t, n = !1, r = !1) => {
229
+ }), M = (e, t, n = !1, r = !1) => {
222
230
  if (!e) throw Error("invalid_btnEl");
223
231
  e.addEventListener("click", (i) => {
224
- i.preventDefault(), A(t).then((t) => {
225
- let { modalEl: i, md: a } = t;
232
+ i.preventDefault(), j(t).then(({ modalEl: t, md: i }) => {
226
233
  k("#elfinderStatic").then((t) => {
227
234
  n && n({
228
235
  data: t,
229
236
  btnEl: e,
230
- md: a
237
+ md: i
231
238
  });
232
- }), i.addEventListener("hidden.bs.modal", () => {
239
+ }), t.addEventListener("hidden.bs.modal", () => {
233
240
  r && r();
234
- }), a.show();
241
+ }), i.show();
235
242
  });
236
243
  });
237
- }, M = (e, t, n = !1, r = !1) => {
244
+ }, N = (e, t, n = !1, r = !1) => {
238
245
  if (!e) throw Error("invalid_btnEl");
239
246
  e.addEventListener("click", (i) => {
240
- i.preventDefault(), A(t).then((t) => {
241
- let { modalEl: i, md: o } = t;
247
+ i.preventDefault(), j(t).then(({ modalEl: t, md: i }) => {
242
248
  k("#elfinderStatic", { url: a("API_URL") + "/elfinder/connectorFiles" }).then((t) => {
243
249
  n && n({
244
250
  data: t,
245
251
  btnEl: e,
246
- md: o
252
+ md: i
247
253
  });
248
- }), i.addEventListener("hidden.bs.modal", () => {
254
+ }), t.addEventListener("hidden.bs.modal", () => {
249
255
  r && r();
250
- }), o.show();
256
+ }), i.show();
251
257
  });
252
258
  });
253
- }, N = (e = !1) => {
259
+ }, P = (e = !1) => {
254
260
  let t = [{
255
261
  id: 1,
256
262
  name: "Tiếng Việt"
@@ -258,4 +264,4 @@ var S = /\.(jpg|jpeg|png|jfif|doc|docx|xls|xlsx|pdf)$/i, C = (e, t) => {
258
264
  return e === !1 ? t : t.find((t) => t.id === e)?.name || "";
259
265
  };
260
266
  //#endregion
261
- export { O as _, h as a, d as b, v as c, N as d, y as f, j as g, M as h, A as i, g as l, x as m, l as n, k as o, b as p, w as r, m as s, C as t, _ as u, u as v, o as x, f as y };
267
+ export { o as C, d as S, N as _, h as a, u as b, E as c, g as d, _ as f, x as g, b as h, j as i, m as l, y as m, l as n, k as o, P as p, w as r, A as s, C as t, v as u, M as v, f as x, O as y };
@@ -0,0 +1 @@
1
+ const e=require("./Common-DFahMuQE.cjs");let t=require("react/jsx-runtime"),n=require("react-router-dom"),r=require("@mui/material"),i=require("react-helmet-async");function a({title:e,children:n,placement:i=`bottom`,y:a=-10}){return(0,t.jsx)(r.Tooltip,{title:e,placement:i,slotProps:{popper:{modifiers:[{name:`offset`,options:{offset:[0,a]}}]}},children:n})}var o=({data:e,onChange:r,onClickPage:i})=>{let a=Array.isArray(e?.items)?e.items:[],o=e?.length||10,s=e?.page||1,c=e?.recordTotal||0,l=Math.ceil(c/o),u=(s-1)*o,d=s-1,f=s+1,p=d>=1,m=l>s;return(0,t.jsx)(t.Fragment,{children:(0,t.jsxs)(`div`,{className:`d-flex justify-content-between align-items-center`,children:[(0,t.jsxs)(`span`,{children:[`Đang xem từ `,u+1,` đến `,u+a.length,` trong tổng số `,c]}),(0,t.jsx)(`nav`,{children:(0,t.jsxs)(`ul`,{className:`pagination`,children:[s>2&&(0,t.jsx)(`li`,{className:`page-item`,children:(0,t.jsx)(n.NavLink,{className:`first page-link`,to:`#`,"data-page":1,title:`Trang đầu tiên`,onClick:i,children:(0,t.jsx)(`i`,{className:`fal fa-fast-backward`})})}),p&&(0,t.jsx)(`li`,{className:`page-item`,children:(0,t.jsx)(n.NavLink,{className:`prev page-link`,to:`#`,"data-page":d,title:`Trang trước`,onClick:i,children:(0,t.jsx)(`i`,{className:`fal fa-angle-left`})})}),l>1&&(()=>{let e=Math.max(1,s-2),t=Math.min(l,s+2),n=[];for(let r=e;r<=t;r++)n.push(r);return n})().map(e=>(0,t.jsx)(`li`,{className:`page-item ${s===e?`active`:``}`,children:(0,t.jsx)(n.NavLink,{className:`page-link`,to:`#`,"data-page":e,onClick:s===e?void 0:i,children:e})},e)),m&&(0,t.jsx)(`li`,{className:`page-item`,children:(0,t.jsx)(n.NavLink,{className:`next page-link`,to:`#`,"data-page":f,title:`Trang tiếp theo`,onClick:i,children:(0,t.jsx)(`i`,{className:`fal fa-angle-right`})})}),s<l-1&&(0,t.jsx)(`li`,{className:`page-item`,children:(0,t.jsx)(n.NavLink,{className:`first page-link`,to:`#`,"data-page":l,title:`Trang cuối cùng`,onClick:i,children:(0,t.jsx)(`i`,{className:`fal fa-fast-forward`})})})]})}),(0,t.jsxs)(`div`,{className:`d-flex align-items-center`,children:[(0,t.jsx)(`span`,{className:`me-2`,children:`Xem`}),(0,t.jsx)(`div`,{className:`form-group pagination-length`,children:(0,t.jsxs)(`select`,{className:`pageLen`,name:`pageLen`,defaultValue:o,onChange:r,children:[(0,t.jsx)(`option`,{value:`10`,children:`10`}),(0,t.jsx)(`option`,{value:`25`,children:`25`}),(0,t.jsx)(`option`,{value:`50`,children:` 50`}),(0,t.jsx)(`option`,{value:`100`,children:`100`}),(0,t.jsx)(`option`,{value:`500`,children:`500`})]})})]})]})})},s=async(t,n)=>{try{let r=new URLSearchParams;for(let[e,n]of Object.entries(t))n!=null&&r.append(e,String(n));let i=`${n}?${r.toString()}`;return(await e.n(i,{},`GET`)).data}catch{return{items:[],page:1,length:10,pageTotal:0,recordTotal:0}}},c=async(t,n,r,i)=>{let a=t.currentTarget,o=Number(a.getAttribute(`data-page`)??1),s={...n,page:o};return i(`${r}?${e.a(s)}`,{replace:!0}),s},l=async(t,n,r)=>{let i={...t,page:1};return r(`${n}?${e.a(i)}`,{replace:!0}),i},u=async(e,t)=>{e.preventDefault();let{name:n,value:r}=e.target,i={...t};return n===`pageLen`?(i.pageLen=Number(r),i.page=1):i[n]=r,i},d=({title:e=``,cUri:r=``,fluid:a=!1,cUriTitle:o=``})=>(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(i.Helmet,{children:(0,t.jsx)(`title`,{children:e||`Truy cập không được phép`})}),(0,t.jsxs)(`div`,{className:`${a?`container-fluid`:`container`}`,children:[(0,t.jsx)(`div`,{className:`navbar navbar-main navbar-expand-lg px-0 shadow-none border-radius-xl py-3`,children:(0,t.jsx)(`nav`,{"aria-label":`breadcrumb`,children:(0,t.jsxs)(`ol`,{className:`breadcrumb bg-transparent m-0 p-0`,children:[(0,t.jsx)(`li`,{className:`breadcrumb-item`,children:(0,t.jsx)(n.Link,{className:`text-white`,to:`/`,children:(0,t.jsx)(`i`,{className:`fal fa-home`})})}),(0,t.jsx)(`li`,{className:`breadcrumb-item`,children:(0,t.jsx)(n.Link,{className:`text-white`,to:r,children:o})})]})})}),(0,t.jsx)(`div`,{style:{minHeight:`50vh`},className:`d-flex align-items-center`,children:(0,t.jsxs)(`div`,{className:`m-auto text-center`,children:[(0,t.jsx)(`h1`,{className:`display-1 text-bolder text-white`,children:`403`}),(0,t.jsx)(`h2`,{className:`text-white`,children:`Truy cập không được phép`}),(0,t.jsx)(`p`,{className:`lead text-white`,children:`Xin lỗi, bạn không có quyền truy cập vào trang này.`}),(0,t.jsx)(n.Link,{to:`/`,className:`btn btn-outline-white mt-4`,children:`trang chủ`})]})})]})]}),f=({title:e=``,cUri:r=``,fluid:a=!1,cUriTitle:o=``})=>(0,t.jsxs)(t.Fragment,{children:[(0,t.jsx)(i.Helmet,{children:(0,t.jsx)(`title`,{children:e||`Không tìm thấy dữ liệu`})}),(0,t.jsxs)(`div`,{className:`${a?`container-fluid`:`container`}`,children:[(0,t.jsx)(`div`,{className:`navbar navbar-main navbar-expand-lg px-0 shadow-none border-radius-xl py-3`,children:(0,t.jsx)(`nav`,{"aria-label":`breadcrumb`,children:(0,t.jsxs)(`ol`,{className:`breadcrumb bg-transparent m-0 p-0`,children:[(0,t.jsx)(`li`,{className:`breadcrumb-item`,children:(0,t.jsx)(n.Link,{className:`text-white`,to:`/`,children:(0,t.jsx)(`i`,{className:`fal fa-home`})})}),(0,t.jsx)(`li`,{className:`breadcrumb-item`,children:(0,t.jsx)(n.Link,{className:`text-white`,to:r,children:o})})]})})}),(0,t.jsx)(`div`,{style:{minHeight:`50vh`},className:`d-flex align-items-center`,children:(0,t.jsxs)(`div`,{className:`m-auto text-center`,children:[(0,t.jsx)(`h1`,{className:`display-1 text-bolder text-white`,children:`404`}),(0,t.jsx)(`h2`,{className:`text-white`,children:`Không tìm thấy dữ liệu`}),(0,t.jsx)(`p`,{className:`lead text-white`,children:`Xin lỗi, dữ liệu của bạn không được tìm thấy`}),(0,t.jsx)(n.Link,{to:`/`,className:`btn btn-outline-white mt-4`,children:`trang chủ`})]})})]})]}),p=({adminUri:e,cUri:r,title:i,isSave:o=!1,titleAction:s=`Chi tiết`})=>(0,t.jsxs)(`div`,{className:`navbar navbar-main navbar-expand-lg px-0 shadow-none border-radius-xl py-3`,children:[(0,t.jsx)(`nav`,{"aria-label":`breadcrumb`,children:(0,t.jsxs)(`ol`,{className:`breadcrumb bg-transparent m-0 p-0`,children:[(0,t.jsx)(`li`,{className:`breadcrumb-item`,children:(0,t.jsx)(n.Link,{className:`text-white`,to:e,children:(0,t.jsx)(`i`,{className:`fal fa-home`})})}),(0,t.jsx)(`li`,{className:`breadcrumb-item`,children:(0,t.jsx)(n.Link,{className:`text-white`,to:r,children:i})}),(0,t.jsx)(`li`,{className:`breadcrumb-item text-white active`,"aria-current":`page`,children:s})]})}),(0,t.jsxs)(`div`,{className:`ms-auto`,children:[o&&(0,t.jsx)(a,{title:`Lưu lại`,children:(0,t.jsx)(`button`,{type:`submit`,className:`btn btn-sm btn-icon btn-success me-1`,children:(0,t.jsx)(`i`,{className:`material-icons text-white position-relative text-lg`,children:`save`})})}),(0,t.jsx)(a,{title:`Trở lại`,children:(0,t.jsx)(n.Link,{to:r,className:`btn btn-sm btn-icon btn-secondary`,children:(0,t.jsx)(`i`,{className:`material-icons text-white position-relative text-lg`,children:`reply`})})})]})]}),m=({adminUri:e,cUri:r,title:i,isCre:o=!1,isDel:s=!1,isCpy:c=!1,isImp:l=!1,isExp:u=!1,isField:d=!1,isReply:f=!1,replyUri:p=`#`,onDelete:m,onExport:h,onCopy:g})=>(0,t.jsxs)(`div`,{className:`navbar navbar-main navbar-expand-lg px-0 shadow-none border-radius-xl py-3`,"navbar-scroll":`true`,children:[(0,t.jsx)(`nav`,{"aria-label":`breadcrumb`,children:(0,t.jsxs)(`ol`,{className:`breadcrumb bg-transparent m-0 p-0`,children:[(0,t.jsx)(`li`,{className:`breadcrumb-item`,children:(0,t.jsx)(n.Link,{className:`text-white`,to:e||`/`,children:(0,t.jsx)(`i`,{className:`fal fa-home`})})}),(0,t.jsx)(`li`,{className:`breadcrumb-item text-white active`,"aria-current":`page`,children:i})]})}),(0,t.jsxs)(`div`,{className:`ms-auto`,children:[o&&(0,t.jsx)(a,{title:`Tạo mới`,children:(0,t.jsx)(n.Link,{to:r+`/create`,className:`btn btn-success btn-sm btn-icon ms-1`,children:(0,t.jsx)(`i`,{className:`material-icons text-white position-relative text-lg`,children:`add`})})}),u&&(0,t.jsx)(a,{title:`Export Excel`,children:(0,t.jsx)(`button`,{type:`button`,onClick:h,className:`btn btn-warning btn-sm btn-icon ms-1`,children:(0,t.jsx)(`i`,{className:`fal fa-download`})})}),l&&(0,t.jsx)(a,{title:`Import Excel`,children:(0,t.jsx)(n.Link,{to:r+`/import`,className:`btn btn-info btn-sm btn-icon ms-1`,children:(0,t.jsx)(`i`,{className:`fal fa-file-import`})})}),c&&(0,t.jsx)(a,{title:`Sao chép`,children:(0,t.jsx)(`button`,{onClick:g,type:`button`,className:`btn btn-purple btn-sm btn-icon ms-1`,children:(0,t.jsx)(`i`,{className:`material-icons text-white position-relative text-lg`,children:`copy`})})}),s&&(0,t.jsx)(a,{title:`Xóa`,children:(0,t.jsx)(`button`,{onClick:m,type:`button`,className:`btn btn-danger btn-sm btn-icon ms-1`,children:(0,t.jsx)(`i`,{className:`material-icons text-white position-relative text-lg`,children:`delete`})})}),d&&(0,t.jsx)(a,{title:`Tùy chỉnh trường dữ liệu`,children:(0,t.jsx)(n.Link,{to:r+`/fields`,className:`btn btn-purple btn-sm btn-icon ms-1`,children:(0,t.jsx)(`i`,{className:`material-icons text-white position-relative text-lg`,children:`manage_accounts`})})}),f&&(0,t.jsx)(a,{title:`Trở về`,children:(0,t.jsx)(n.Link,{to:p,className:`btn btn-secondary btn-sm btn-icon ms-1`,children:(0,t.jsx)(`i`,{className:`material-icons text-white position-relative text-lg`,children:`reply`})})})]})]}),h=({adminUri:e,cUri:r,title:i,itemId:o,isSave:s=!0,titleAction:c})=>(0,t.jsxs)(`div`,{className:`navbar navbar-main navbar-expand-lg px-0 shadow-none border-radius-xl py-3`,children:[(0,t.jsx)(`nav`,{"aria-label":`breadcrumb`,children:(0,t.jsxs)(`ol`,{className:`breadcrumb bg-transparent m-0 p-0`,children:[(0,t.jsx)(`li`,{className:`breadcrumb-item`,children:(0,t.jsx)(n.Link,{className:`text-white`,to:e||`/`,children:(0,t.jsx)(`i`,{className:`fal fa-home`})})}),(0,t.jsx)(`li`,{className:`breadcrumb-item`,children:(0,t.jsx)(n.Link,{className:`text-white`,to:r,children:i})}),(0,t.jsx)(`li`,{className:`breadcrumb-item text-white active`,"aria-current":`page`,children:c??(o?`Chỉnh sửa`:`Thêm mới`)})]})}),(0,t.jsxs)(`div`,{className:`ms-auto`,children:[s&&(0,t.jsx)(a,{title:`Lưu lại`,children:(0,t.jsx)(`button`,{type:`submit`,className:`btn btn-sm btn-icon btn-success me-1`,children:(0,t.jsx)(`i`,{className:`material-icons text-white position-relative text-lg`,children:`save`})})}),(0,t.jsx)(a,{title:`Trở lại`,children:(0,t.jsx)(n.Link,{to:r,className:`btn btn-sm btn-icon btn-secondary`,children:(0,t.jsx)(`i`,{className:`material-icons text-white position-relative text-lg`,children:`reply`})})})]})]});Object.defineProperty(exports,"a",{enumerable:!0,get:function(){return d}}),Object.defineProperty(exports,"c",{enumerable:!0,get:function(){return l}}),Object.defineProperty(exports,"d",{enumerable:!0,get:function(){return a}}),Object.defineProperty(exports,"i",{enumerable:!0,get:function(){return f}}),Object.defineProperty(exports,"l",{enumerable:!0,get:function(){return u}}),Object.defineProperty(exports,"n",{enumerable:!0,get:function(){return m}}),Object.defineProperty(exports,"o",{enumerable:!0,get:function(){return s}}),Object.defineProperty(exports,"r",{enumerable:!0,get:function(){return p}}),Object.defineProperty(exports,"s",{enumerable:!0,get:function(){return c}}),Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return h}}),Object.defineProperty(exports,"u",{enumerable:!0,get:function(){return o}});
@@ -1,4 +1,4 @@
1
- import { a as e, n as t } from "./Common-1GAoFU4L.js";
1
+ import { a as e, n as t } from "./Common-_PK8HLKN.js";
2
2
  import { Fragment as n, jsx as r, jsxs as i } from "react/jsx-runtime";
3
3
  import { Link as a, NavLink as o } from "react-router-dom";
4
4
  import { Tooltip as s } from "@mui/material";
@@ -18,23 +18,22 @@ function l({ title: e, children: t, placement: n = "bottom", y: i = -10 }) {
18
18
  //#endregion
19
19
  //#region src/components/meta/Pagination.tsx
20
20
  var u = ({ data: e, onChange: t, onClickPage: a }) => {
21
- let s = Math.ceil(e.recordTotal / e.length), c = (e.page - 1) * e.length, l = e.page - 1, u = e.page + 1, d = l >= 1, f = s > e.page;
21
+ let s = Array.isArray(e?.items) ? e.items : [], c = e?.length || 10, l = e?.page || 1, u = e?.recordTotal || 0, d = Math.ceil(u / c), f = (l - 1) * c, p = l - 1, m = l + 1, h = p >= 1, g = d > l;
22
22
  return /* @__PURE__ */ r(n, { children: /* @__PURE__ */ i("div", {
23
23
  className: "d-flex justify-content-between align-items-center",
24
24
  children: [
25
25
  /* @__PURE__ */ i("span", { children: [
26
26
  "Đang xem từ ",
27
- c + 1,
27
+ f + 1,
28
28
  " đến ",
29
- c + e.items.length,
30
- " trong tổng số",
31
- " ",
32
- e.recordTotal
29
+ f + s.length,
30
+ " trong tổng số ",
31
+ u
33
32
  ] }),
34
33
  /* @__PURE__ */ r("nav", { children: /* @__PURE__ */ i("ul", {
35
34
  className: "pagination",
36
35
  children: [
37
- e.page > 2 && /* @__PURE__ */ r("li", {
36
+ l > 2 && /* @__PURE__ */ r("li", {
38
37
  className: "page-item",
39
38
  children: /* @__PURE__ */ r(o, {
40
39
  className: "first page-link",
@@ -45,48 +44,48 @@ var u = ({ data: e, onChange: t, onClickPage: a }) => {
45
44
  children: /* @__PURE__ */ r("i", { className: "fal fa-fast-backward" })
46
45
  })
47
46
  }),
48
- d && /* @__PURE__ */ r("li", {
47
+ h && /* @__PURE__ */ r("li", {
49
48
  className: "page-item",
50
49
  children: /* @__PURE__ */ r(o, {
51
50
  className: "prev page-link",
52
51
  to: "#",
53
- "data-page": l,
52
+ "data-page": p,
54
53
  title: "Trang trước",
55
54
  onClick: a,
56
55
  children: /* @__PURE__ */ r("i", { className: "fal fa-angle-left" })
57
56
  })
58
57
  }),
59
- s > 1 && (() => {
60
- let t = Math.max(1, e.page - 2), n = Math.min(s, e.page + 2), r = [];
61
- for (let e = t; e <= n; e++) r.push(e);
62
- return r;
63
- })().map((t) => /* @__PURE__ */ r("li", {
64
- className: `page-item ${e.page === t ? "active" : ""}`,
58
+ d > 1 && (() => {
59
+ let e = Math.max(1, l - 2), t = Math.min(d, l + 2), n = [];
60
+ for (let r = e; r <= t; r++) n.push(r);
61
+ return n;
62
+ })().map((e) => /* @__PURE__ */ r("li", {
63
+ className: `page-item ${l === e ? "active" : ""}`,
65
64
  children: /* @__PURE__ */ r(o, {
66
65
  className: "page-link",
67
66
  to: "#",
68
- "data-page": t,
69
- onClick: e.page === t ? void 0 : a,
70
- children: t
67
+ "data-page": e,
68
+ onClick: l === e ? void 0 : a,
69
+ children: e
71
70
  })
72
- }, t)),
73
- f && /* @__PURE__ */ r("li", {
71
+ }, e)),
72
+ g && /* @__PURE__ */ r("li", {
74
73
  className: "page-item",
75
74
  children: /* @__PURE__ */ r(o, {
76
75
  className: "next page-link",
77
76
  to: "#",
78
- "data-page": u,
77
+ "data-page": m,
79
78
  title: "Trang tiếp theo",
80
79
  onClick: a,
81
80
  children: /* @__PURE__ */ r("i", { className: "fal fa-angle-right" })
82
81
  })
83
82
  }),
84
- e.page < s - 1 && /* @__PURE__ */ r("li", {
83
+ l < d - 1 && /* @__PURE__ */ r("li", {
85
84
  className: "page-item",
86
85
  children: /* @__PURE__ */ r(o, {
87
86
  className: "first page-link",
88
87
  to: "#",
89
- "data-page": s,
88
+ "data-page": d,
90
89
  title: "Trang cuối cùng",
91
90
  onClick: a,
92
91
  children: /* @__PURE__ */ r("i", { className: "fal fa-fast-forward" })
@@ -104,7 +103,7 @@ var u = ({ data: e, onChange: t, onClickPage: a }) => {
104
103
  children: /* @__PURE__ */ i("select", {
105
104
  className: "pageLen",
106
105
  name: "pageLen",
107
- defaultValue: e.length,
106
+ defaultValue: c,
108
107
  onChange: t,
109
108
  children: [
110
109
  /* @__PURE__ */ r("option", {
@@ -1,4 +1,4 @@
1
- import { r as e, t } from "./Common-1GAoFU4L.js";
1
+ import { r as e, t } from "./Common-_PK8HLKN.js";
2
2
  import { useRef as n, useState as r } from "react";
3
3
  import { jsx as i, jsxs as a } from "react/jsx-runtime";
4
4
  //#region src/components/form/UDragFile.tsx
@@ -32,7 +32,7 @@ var o = ({ label: o, name: s, cpnClass: c = "", required: l = !1, onChange: u, e
32
32
  if (!r) return;
33
33
  let i = f.current?.querySelector(".default-file-input"), a = /\.(pdf|docx|doc|xlsx|xls)$/i, o = i?.getAttribute("accept"), c = t(o, a);
34
34
  e(r, 10, c).then(() => {
35
- m(r[0]), u({
35
+ m(r[0] ?? null), u({
36
36
  target: {
37
37
  type: "file",
38
38
  name: s,
@@ -0,0 +1 @@
1
+ const e=require("./Common-DFahMuQE.cjs");let t=require("react"),n=require("react/jsx-runtime");var r=({label:r,name:i,cpnClass:a=``,required:o=!1,onChange:s,ext:c=`.xlsx, .xls, .docx, .doc, .pdf`})=>{let l=(0,t.useRef)(null),[u,d]=(0,t.useState)(null),[f,p]=(0,t.useState)(!1),m=async t=>{t.preventDefault();let n=l.current?.querySelector(`.default-file-input`),r=n?.files;if(!r)return;let i=/\.(pdf|docx|doc|xlsx|xls)$/i,a=n.getAttribute(`accept`),o=e.t(a,i);e.r(r,10,o).then(()=>{d(r[0]),s(t)}).catch(e=>{console.error(`[UDragFile] Tập tin không hợp lệ:`,e.message)})},h=async e=>{e.preventDefault(),e.stopPropagation(),e.type===`dragenter`||e.type===`dragover`?p(!0):e.type===`dragleave`&&p(!1)};return(0,n.jsx)(`div`,{className:a,children:(0,n.jsxs)(`div`,{ref:l,className:`upload-files-container mb-3`,children:[(0,n.jsxs)(`label`,{className:`drag-file-area mb-2`,onDragEnter:h,onDragOver:h,onDragLeave:h,onDrop:async t=>{t.preventDefault(),t.stopPropagation();let n=t.dataTransfer.files;if(!n)return;let r=l.current?.querySelector(`.default-file-input`),a=/\.(pdf|docx|doc|xlsx|xls)$/i,o=r?.getAttribute(`accept`),c=e.t(o,a);e.r(n,10,c).then(()=>{d(n[0]??null),s({target:{type:`file`,name:i,files:n,value:``},preventDefault:()=>{}}),p(!1)}).catch(e=>{console.error(`[UDragFile] Tập tin không hợp lệ:`,e.message),p(!1)})},"aria-label":r,htmlFor:`importFile1`,children:[(0,n.jsx)(`span`,{className:`upload-icon`,children:(0,n.jsx)(`i`,{className:`fas fa-upload`})}),(0,n.jsxs)(`h3`,{className:`dynamic-message`,children:[f?`Thả tập tin vào đây`:`Chọn tập tin (`+c+`)`,` `]}),(0,n.jsx)(`span`,{className:`label`,children:f?``:`hoặc kéo thả`}),(0,n.jsx)(`span`,{className:`browse-files d-none`,children:(0,n.jsx)(`input`,{id:`importFile1`,onChange:m,type:`file`,required:o,name:i,className:`default-file-input`,accept:c})})]}),(0,n.jsx)(`div`,{className:`file-block`,children:u&&(0,n.jsx)(`div`,{className:`inputClone`,children:(0,n.jsxs)(`div`,{className:`file-info`,children:[(0,n.jsx)(`span`,{className:`file-name me-2`,children:u.name}),(0,n.jsxs)(`div`,{children:[`|`,(0,n.jsx)(`span`,{className:`ms-2 file-size`,children:(u.size/1024).toFixed(1)+` KB`})]})]})})})]})})};Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return r}});
@@ -1,13 +1,33 @@
1
+ //#region src/hook/common.ts
2
+ var e = (e, t, n) => ({
3
+ target: n === void 0 ? {
4
+ name: e,
5
+ value: t
6
+ } : {
7
+ name: e,
8
+ value: t,
9
+ type: n
10
+ },
11
+ preventDefault: () => {}
12
+ });
13
+ function t(e) {
14
+ if (!e) return;
15
+ let t = e.id;
16
+ if (t == null || t === "") return;
17
+ let n = Number(t);
18
+ return Number.isNaN(n) ? void 0 : n;
19
+ }
20
+ //#endregion
1
21
  //#region src/hook/update.ts
2
- var e = (e) => {
22
+ var n = (e) => {
3
23
  e.preventDefault();
4
- let { name: n, type: r, value: i } = t(e);
5
- if (r === "file") {
6
- let t = e.target.files;
7
- return { [n]: t?.[0] ?? null };
24
+ let { name: t, type: n, value: i } = r(e);
25
+ if (n === "file") {
26
+ let n = e.target.files;
27
+ return { [t]: n?.[0] ?? null };
8
28
  }
9
- return { [n]: i };
10
- }, t = (e) => {
29
+ return { [t]: i };
30
+ }, r = (e) => {
11
31
  let { name: t, type: n, value: r } = e.target, i = t.split(/[{}]+/).filter(Boolean), a = i.shift();
12
32
  if (!a || i.length === 0) return {
13
33
  name: t,
@@ -15,27 +35,30 @@ var e = (e) => {
15
35
  value: r
16
36
  };
17
37
  let o = {}, s = o;
18
- for (let e = 0; e < i.length - 1; e++) s[i[e]] = {}, s = s[i[e]];
38
+ for (let e = 0; e < i.length - 1; e++) {
39
+ let t = {};
40
+ s[i[e]] = t, s = t;
41
+ }
19
42
  return s[i[i.length - 1]] = r, {
20
43
  name: a,
21
44
  type: n,
22
45
  value: o
23
46
  };
24
- }, n = (e, t) => {
25
- let r = { ...e };
47
+ }, i = (e) => typeof e == "object" && !!e && !Array.isArray(e) && !(e instanceof File) && !(e instanceof Blob), a = (e, t) => {
48
+ let n = { ...e };
26
49
  return Object.keys(t).forEach((e) => {
27
- let i = t[e], a = r[e];
28
- i && typeof i == "object" && !Array.isArray(i) && a && typeof a == "object" && !Array.isArray(a) ? r[e] = n(a, i) : r[e] = i;
29
- }), r;
30
- }, r = null, i = () => {
31
- if (r) return r;
50
+ let r = t[e], o = n[e];
51
+ i(r) && i(o) ? n[e] = a(o, r) : n[e] = r;
52
+ }), n;
53
+ }, o = null, s = () => {
54
+ if (o) return o;
32
55
  let e = typeof window < "u" ? window.jQuery ?? window.$ : void 0;
33
56
  if (typeof e != "function") throw Error("[@materialui-reactjs/admin] Validator cần jQuery. Hãy thêm \"jquery\" vào dependencies và nạp nó TRƯỚC khi dùng Validator.");
34
- return r = e, r;
35
- }, a = new Proxy((() => {}), {
36
- apply: (e, t, n) => i()(...n),
37
- get: (e, t) => i()[t]
38
- }), o = class e {
57
+ return o = e, o;
58
+ }, c = new Proxy((() => {}), {
59
+ apply: (e, t, n) => s()(...n),
60
+ get: (e, t) => s()[t]
61
+ }), l = class e {
39
62
  options;
40
63
  validators;
41
64
  $element;
@@ -67,7 +90,7 @@ var e = (e) => {
67
90
  },
68
91
  match: function(t) {
69
92
  let n = t.attr("data-match");
70
- return n && t.val() !== a(n).val() && e.DEFAULTS.errors.match;
93
+ return n && t.val() !== c(n).val() && e.DEFAULTS.errors.match;
71
94
  },
72
95
  minlength: function(t) {
73
96
  let n = Number(t.attr("data-minlength"));
@@ -95,21 +118,21 @@ var e = (e) => {
95
118
  }
96
119
  };
97
120
  constructor(t, n = !1) {
98
- this.options = n || e.DEFAULTS, this.validators = a.extend({}, e.VALIDATORS), this.$element = a(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) => {
99
- this.clearErrors(a(t));
121
+ this.options = n || e.DEFAULTS, this.validators = c.extend({}, e.VALIDATORS), this.$element = c(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) => {
122
+ this.clearErrors(c(t));
100
123
  }));
101
124
  }
102
125
  static getValue(e) {
103
- return e.is("[type=\"checkbox\"]") ? !!e.prop("checked") : e.is("[type=\"radio\"]") ? a(`[name="${e.attr("name")}"]:checked`).length > 0 : e.is("select[multiple]") ? (e.val() ?? []).length : e.val() ?? "";
126
+ return e.is("[type=\"checkbox\"]") ? !!e.prop("checked") : e.is("[type=\"radio\"]") ? c(`[name="${e.attr("name")}"]:checked`).length > 0 : e.is("select[multiple]") ? (e.val() ?? []).length : e.val() ?? "";
104
127
  }
105
128
  update = () => {
106
129
  let t = this;
107
130
  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) => {
108
- t.clearErrors(a(n));
131
+ t.clearErrors(c(n));
109
132
  })), this.toggleSubmit(), this;
110
133
  };
111
134
  onInput = (e) => {
112
- let t = this, n = a(e.target), r = e.type !== "focusout";
135
+ let t = this, n = c(e.target), r = e.type !== "focusout";
113
136
  this.$inputs.is(n) && this.validateInput(n, r)?.done(function() {
114
137
  t.toggleSubmit();
115
138
  });
@@ -117,58 +140,58 @@ var e = (e) => {
117
140
  validateInput = (e, t) => {
118
141
  let n = e.data("bs.validator.errors");
119
142
  e.is("[type=\"radio\"]") && (e = this.$element.find("input[name=\"" + e.attr("name") + "\"]"));
120
- let r = a.Event("validate.bs.validator", { relatedTarget: e[0] });
143
+ let r = c.Event("validate.bs.validator", { relatedTarget: e[0] });
121
144
  if (this.$element.trigger(r), r.isDefaultPrevented()) return;
122
145
  let i = this;
123
- return this.runValidators(e).done(function(o) {
124
- e.data("bs.validator.errors", o), o.length ? t ? i.defer(e, i.showErrors) : i.showErrors(e) : i.clearErrors(e), (!n || o.toString() !== n.toString()) && (r = o.length ? a.Event("invalid.bs.validator", {
146
+ return this.runValidators(e).done(function(a) {
147
+ 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 ? c.Event("invalid.bs.validator", {
125
148
  relatedTarget: e[0],
126
- detail: o
127
- }) : a.Event("valid.bs.validator", {
149
+ detail: a
150
+ }) : c.Event("valid.bs.validator", {
128
151
  relatedTarget: e[0],
129
152
  detail: n
130
- }), i.$element.trigger(r)), i.toggleSubmit(), i.$element.trigger(a.Event("validated.bs.validator", { relatedTarget: e[0] }));
153
+ }), i.$element.trigger(r)), i.toggleSubmit(), i.$element.trigger(c.Event("validated.bs.validator", { relatedTarget: e[0] }));
131
154
  });
132
155
  };
133
156
  runValidators = (t) => {
134
- let n = [], r = a.Deferred(), i = t.data("bs.validator.deferred");
157
+ let n = [], r = c.Deferred(), i = t.data("bs.validator.deferred");
135
158
  i && i.reject(), t.data("bs.validator.deferred", r);
136
- function o(e) {
159
+ function a(e) {
137
160
  return t.attr("data-" + e + "-error");
138
161
  }
139
- function s() {
162
+ function o() {
140
163
  let e = t[0];
141
164
  if (!(e instanceof HTMLInputElement) && !(e instanceof HTMLSelectElement) && !(e instanceof HTMLTextAreaElement)) return null;
142
165
  let n = e.validity;
143
166
  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;
144
167
  }
145
- function c() {
168
+ function s() {
146
169
  return t.attr("data-error");
147
170
  }
148
171
  function l(e) {
149
- return o(e) || s() || c();
172
+ return a(e) || o() || s();
150
173
  }
151
- return a.each(this.validators, a.proxy(function(r, i) {
174
+ return c.each(this.validators, c.proxy(function(r, i) {
152
175
  let a;
153
176
  (e.getValue(t) || t.attr("required")) && (t.attr("data-" + r) !== void 0 || r == "native") && (a = i.call(this, t)) && (a = l(r) || a, n.indexOf(a) === -1 && n.push(a));
154
177
  }, this)), r.resolve(n), r.promise();
155
178
  };
156
179
  validate = () => {
157
180
  let e = this;
158
- return a.when(this.$inputs.map((t, n) => e.validateInput(a(n), !1))).then(function() {
181
+ return c.when(this.$inputs.map((t, n) => e.validateInput(c(n), !1))).then(function() {
159
182
  e.toggleSubmit(), e.focusError();
160
183
  }), this;
161
184
  };
162
185
  focusError = () => {
163
186
  if (!this.options.focus) return;
164
187
  let t = this.$element.find(".has-error:first :input");
165
- t.length !== 0 && (a("html, body").animate({ scrollTop: t.offset().top - e.FOCUS_OFFSET }, 250), t.focus());
188
+ t.length !== 0 && (c("html, body").animate({ scrollTop: t.offset().top - e.FOCUS_OFFSET }, 250), t.focus());
166
189
  };
167
190
  showErrors = (e) => {
168
191
  this.options.html;
169
192
  let t = e.data("bs.validator.errors"), n = e.closest(".form-group"), r = n.find(".form-control-feedback");
170
- t.length && (t = a("<ul/>").addClass("list-unstyled").append(a.map(t, (e) => {
171
- let t = a("<li/>");
193
+ t.length && (t = c("<ul/>").addClass("list-unstyled").append(c.map(t, (e) => {
194
+ let t = c("<li/>");
172
195
  return this.options.html ? t.html(e) : t.text(e);
173
196
  })), 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));
174
197
  };
@@ -177,10 +200,10 @@ var e = (e) => {
177
200
  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);
178
201
  };
179
202
  hasErrors = () => !!this.$inputs.filter(function() {
180
- return !!(a(this).data("bs.validator.errors") || []).length;
203
+ return !!(c(this).data("bs.validator.errors") || []).length;
181
204
  }).length;
182
205
  isIncomplete = () => !!this.$inputs.filter("[required]").filter((t, n) => {
183
- let r = e.getValue(a(n));
206
+ let r = e.getValue(c(n));
184
207
  return !(typeof r == "string" ? r.trim() : r);
185
208
  }).length;
186
209
  onSubmit = (e) => {
@@ -194,21 +217,21 @@ var e = (e) => {
194
217
  window.clearTimeout(e.data("bs.validator.timeout")), e.data("bs.validator.timeout", window.setTimeout(t, this.options.delay));
195
218
  };
196
219
  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(() => {
197
- let e = a(this), t = e.data("bs.validator.timeout");
220
+ let e = c(this), t = e.data("bs.validator.timeout");
198
221
  window.clearTimeout(t), e.removeData("bs.validator.timeout");
199
222
  }), this.$element.find(".invalid-tooltip, .invalid-feedback").each(() => {
200
- let e = a(this), t = e.data("bs.validator.originalContent");
223
+ let e = c(this), t = e.data("bs.validator.originalContent");
201
224
  e.removeData("bs.validator.originalContent").html(t);
202
225
  }), 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);
203
226
  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);
204
227
  run = () => {
205
228
  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() {
206
- let t = a(this), n = t.attr("data-match");
207
- n && a(n).on("input.bs.validator", function() {
229
+ let t = c(this), n = t.attr("data-match");
230
+ n && c(n).on("input.bs.validator", function() {
208
231
  e.getValue(t) && t.trigger("input.bs.validator");
209
232
  });
210
- }), this.$inputs.filter((t, n) => e.getValue(a(n)) && !a(this).closest(".has-error").length).trigger("focusout"), this.$element.attr("novalidate", !0);
233
+ }), this.$inputs.filter((t, n) => e.getValue(c(n)) && !c(this).closest(".has-error").length).trigger("focusout"), this.$element.attr("novalidate", !0);
211
234
  };
212
235
  };
213
236
  //#endregion
214
- export { t as i, n, e as r, o as t };
237
+ export { e as a, r as i, a as n, t as o, n as r, l as t };
@@ -0,0 +1 @@
1
+ var e=(e,t,n)=>({target:n===void 0?{name:e,value:t}:{name:e,value:t,type:n},preventDefault:()=>{}});function t(e){if(!e)return;let t=e.id;if(t==null||t===``)return;let n=Number(t);return Number.isNaN(n)?void 0:n}var n=e=>{e.preventDefault();let{name:t,type:n,value:i}=r(e);if(n===`file`){let n=e.target.files;return{[t]:n?.[0]??null}}return{[t]:i}},r=e=>{let{name:t,type:n,value:r}=e.target,i=t.split(/[{}]+/).filter(Boolean),a=i.shift();if(!a||i.length===0)return{name:t,type:n,value:r};let o={},s=o;for(let e=0;e<i.length-1;e++){let t={};s[i[e]]=t,s=t}return s[i[i.length-1]]=r,{name:a,type:n,value:o}},i=e=>typeof e==`object`&&!!e&&!Array.isArray(e)&&!(e instanceof File)&&!(e instanceof Blob),a=(e,t)=>{let n={...e};return Object.keys(t).forEach(e=>{let r=t[e],o=n[e];i(r)&&i(o)?n[e]=a(o,r):n[e]=r}),n},o=null,s=()=>{if(o)return o;let e=typeof window<`u`?window.jQuery??window.$:void 0;if(typeof e!=`function`)throw Error(`[@materialui-reactjs/admin] Validator cần jQuery. Hãy thêm "jquery" vào dependencies và nạp nó TRƯỚC khi dùng Validator.`);return o=e,o},c=new Proxy((()=>{}),{apply:(e,t,n)=>s()(...n),get:(e,t)=>s()[t]}),l=class e{options;validators;$element;$btn;$inputs;static VERSION=`0.11.9`;static INPUT_SELECTOR=`:input:not(.nvali,[type="hidden"], [type="submit"], [type="reset"], button)`;static FOCUS_OFFSET=20;static DEFAULTS={delay:500,html:!1,disable:!0,focus:!0,custom:{},errors:{match:`Does not match`,minlength:`Too short`,maxlength:`Too long`},feedback:{success:`glyphicon-ok`,error:`glyphicon-remove`}};static VALIDATORS={native:function(e){let t=e[0];if(t.checkValidity)return!t.checkValidity()&&!t.validity.valid&&(t.validationMessage||`error!`)},match:function(t){let n=t.attr(`data-match`);return n&&t.val()!==c(n).val()&&e.DEFAULTS.errors.match},minlength:function(t){let n=Number(t.attr(`data-minlength`));return String(t.val()??``).length<n&&e.DEFAULTS.errors.minlength},maxlength:function(t){let n=Number(t.attr(`data-maxlength`));return String(t.val()??``).length>n&&e.DEFAULTS.errors.maxlength},filesize:function(e){let t=Number(e.data(`filesize`)),n=e[0];return n?.files?.length?n.files[0].size>t*1024*1024:!1},accept:function(e){let t=e.attr(`data-accept`);if(!t)return!1;let n=e[0];if(!n?.files?.length)return!1;let r=n.files[0];return!new RegExp(t).test(r.name)},pattern:function(e){let t=e.attr(`data-pattern`);return t?!new RegExp(t).test(String(e.val()??``)):!1}};constructor(t,n=!1){this.options=n||e.DEFAULTS,this.validators=c.extend({},e.VALIDATORS),this.$element=c(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)=>{this.clearErrors(c(t))}))}static getValue(e){return e.is(`[type="checkbox"]`)?!!e.prop(`checked`):e.is(`[type="radio"]`)?c(`[name="${e.attr(`name`)}"]:checked`).length>0:e.is(`select[multiple]`)?(e.val()??[]).length:e.val()??``}update=()=>{let t=this;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)=>{t.clearErrors(c(n))})),this.toggleSubmit(),this};onInput=e=>{let t=this,n=c(e.target),r=e.type!==`focusout`;this.$inputs.is(n)&&this.validateInput(n,r)?.done(function(){t.toggleSubmit()})};validateInput=(e,t)=>{let n=e.data(`bs.validator.errors`);e.is(`[type="radio"]`)&&(e=this.$element.find(`input[name="`+e.attr(`name`)+`"]`));let r=c.Event(`validate.bs.validator`,{relatedTarget:e[0]});if(this.$element.trigger(r),r.isDefaultPrevented())return;let i=this;return this.runValidators(e).done(function(a){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?c.Event(`invalid.bs.validator`,{relatedTarget:e[0],detail:a}):c.Event(`valid.bs.validator`,{relatedTarget:e[0],detail:n}),i.$element.trigger(r)),i.toggleSubmit(),i.$element.trigger(c.Event(`validated.bs.validator`,{relatedTarget:e[0]}))})};runValidators=t=>{let n=[],r=c.Deferred(),i=t.data(`bs.validator.deferred`);i&&i.reject(),t.data(`bs.validator.deferred`,r);function a(e){return t.attr(`data-`+e+`-error`)}function o(){let e=t[0];if(!(e instanceof HTMLInputElement)&&!(e instanceof HTMLSelectElement)&&!(e instanceof HTMLTextAreaElement))return null;let n=e.validity;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}function s(){return t.attr(`data-error`)}function l(e){return a(e)||o()||s()}return c.each(this.validators,c.proxy(function(r,i){let a;(e.getValue(t)||t.attr(`required`))&&(t.attr(`data-`+r)!==void 0||r==`native`)&&(a=i.call(this,t))&&(a=l(r)||a,n.indexOf(a)===-1&&n.push(a))},this)),r.resolve(n),r.promise()};validate=()=>{let e=this;return c.when(this.$inputs.map((t,n)=>e.validateInput(c(n),!1))).then(function(){e.toggleSubmit(),e.focusError()}),this};focusError=()=>{if(!this.options.focus)return;let t=this.$element.find(`.has-error:first :input`);t.length!==0&&(c(`html, body`).animate({scrollTop:t.offset().top-e.FOCUS_OFFSET},250),t.focus())};showErrors=e=>{this.options.html;let t=e.data(`bs.validator.errors`),n=e.closest(`.form-group`),r=n.find(`.form-control-feedback`);t.length&&(t=c(`<ul/>`).addClass(`list-unstyled`).append(c.map(t,e=>{let t=c(`<li/>`);return this.options.html?t.html(e):t.text(e)})),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))};clearErrors=e=>{let t=e.closest(`.form-group`),n=t.find(`.form-control-feedback`);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)};hasErrors=()=>!!this.$inputs.filter(function(){return!!(c(this).data(`bs.validator.errors`)||[]).length}).length;isIncomplete=()=>!!this.$inputs.filter(`[required]`).filter((t,n)=>{let r=e.getValue(c(n));return!(typeof r==`string`?r.trim():r)}).length;onSubmit=e=>{this.validate(),(this.isIncomplete()||this.hasErrors())&&e.preventDefault()};toggleSubmit=()=>{this.options.disable};defer=(e,t)=>{if(t=t.bind(this,e),!this.options.delay)return t();window.clearTimeout(e.data(`bs.validator.timeout`)),e.data(`bs.validator.timeout`,window.setTimeout(t,this.options.delay))};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(()=>{let e=c(this),t=e.data(`bs.validator.timeout`);window.clearTimeout(t),e.removeData(`bs.validator.timeout`)}),this.$element.find(`.invalid-tooltip, .invalid-feedback`).each(()=>{let e=c(this),t=e.data(`bs.validator.originalContent`);e.removeData(`bs.validator.originalContent`).html(t)}),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);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);run=()=>{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(){let t=c(this),n=t.attr(`data-match`);n&&c(n).on(`input.bs.validator`,function(){e.getValue(t)&&t.trigger(`input.bs.validator`)})}),this.$inputs.filter((t,n)=>e.getValue(c(n))&&!c(this).closest(`.has-error`).length).trigger(`focusout`),this.$element.attr(`novalidate`,!0)}};Object.defineProperty(exports,"a",{enumerable:!0,get:function(){return e}}),Object.defineProperty(exports,"i",{enumerable:!0,get:function(){return r}}),Object.defineProperty(exports,"n",{enumerable:!0,get:function(){return a}}),Object.defineProperty(exports,"o",{enumerable:!0,get:function(){return t}}),Object.defineProperty(exports,"r",{enumerable:!0,get:function(){return n}}),Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return l}});
@@ -0,0 +1,3 @@
1
+ import { ClassicEditor } from 'ckeditor5';
2
+ export default class Editor extends ClassicEditor {
3
+ }
@@ -0,0 +1,11 @@
1
+ import { Plugin } from 'ckeditor5';
2
+ /**
3
+ * Nút toolbar `elfinder` — mở file manager để chèn ảnh.
4
+ *
5
+ * Plugin KHÔNG tự quản lý UI: nó chỉ đăng ký button rồi gọi lại callback
6
+ * `config.elfinder` do `Editor.tsx` truyền vào. Nhờ vậy plugin không phụ
7
+ * thuộc vào jQuery/Bootstrap/elFinder — mọi thứ UI thuộc về component React.
8
+ */
9
+ export default class ElFinder extends Plugin {
10
+ init(): void;
11
+ }
@@ -0,0 +1,15 @@
1
+ import { Plugin } from 'ckeditor5';
2
+ /**
3
+ * Nút toolbar `fullscreen` — phóng editor phủ toàn màn hình.
4
+ *
5
+ * CKEditor 5 v48 đã có plugin Fullscreen chính thức, nhưng bản đó đòi hỏi
6
+ * `GeneralHtmlSupport` và đổi hành vi toolbar. Ở đây giữ bản custom để hành vi
7
+ * không đổi so với bản build cũ: chỉ đặt inline style `position: fixed` lên
8
+ * chính thẻ `.ck-editor` rồi khôi phục lại khi bấm lần nữa.
9
+ */
10
+ export default class Fullscreen extends Plugin {
11
+ private isFullscreen;
12
+ private originalStyles;
13
+ init(): void;
14
+ toggle(): void;
15
+ }