@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
@@ -0,0 +1 @@
1
+ const e=require("./rolldown-runtime-BocRIvOZ.cjs"),t=require("./Env-DoS-iQjs.cjs"),n=require("./Common-DFahMuQE.cjs"),r=require("./Validator-DBxl8wtE.cjs"),i=require("./UDragFile-Db0sK4M7.cjs"),a=require("./SpinnerLoader-BujLjvC3.cjs"),o=require("./HeaderUpdate-Dirxjmxs.cjs"),s=require("./common-ivDX6gGq.cjs");let c=require("react");c=e.t(c,1);let l=require("react/jsx-runtime"),u=require("react-router-dom"),d=require("react-helmet-async");var f=(e,t,n,r,i,a)=>{if(!a)return!1;if(a===1)return!0;if(!Array.isArray(e))return!1;for(let o of e)if(o){if(o.module===t&&o.controller===n&&o.action===r&&Number(o.code)===Number(i))return o.status!==0&&!!o.isPer;if(Array.isArray(o.subs)&&o.subs.length>0&&f(o.subs,t,n,r,i,a))return!0}return!1},p=class extends c.default.Component{effectRan=!1;module=`admins`;controller=``;state={data:{filter:{}},formValue:{},item:void 0,isDetail:void 0};title=``;cUri=``;_envOverride={};_cLinkOverride;get API_URL(){return this._envOverride.API_URL??t.t().API_URL??``}set API_URL(e){this._envOverride.API_URL=e}get ADMIN_URI(){return this._envOverride.ADMIN_URI??t.t().ADMIN_URI??``}set ADMIN_URI(e){this._envOverride.ADMIN_URI=e}get cLink(){return this._cLinkOverride??this.ADMIN_URI+this.cUri}set cLink(e){this._cLinkOverride=e}getDataUrl=``;ctype=`application/json`;fluid=!1;isBackUri=!0;debug=!1;renderForm=()=>(0,l.jsx)(l.Fragment,{});syncPermissionsAndState=async()=>{let{menuData:e,user:t}=this.props,r={isDetail:f(e,this.module,this.controller,`detail`,0,t.groupId)};this.setState(r,async()=>{let e=n.d();if(e&&r.isDetail){let t=await n.n(this.getDataUrl+`/`+e,{},`GET`,`application/json`,!1),r=t?t.data:void 0;this.setState({item:r||!1,formValue:r?JSON.parse(JSON.stringify(r)):{}},async()=>{await this.componentDidMountAfter()})}})};async initDidMount(){try{if(this.effectRan)return;this.effectRan=!0,this.props.user?.groupId&&await this.syncPermissionsAndState()}catch(e){n.s(e)===`invalid_404`&&this.props.navigate(this.cUri),n.x(n.s(e))}}componentDidMount(){this.initDidMount()}componentDidMountAfter=async()=>{};renderHeaderDetail(){return(0,l.jsx)(o.r,{adminUri:this.ADMIN_URI,title:this.title,cUri:this.cUri})}handleChange=async e=>{e.preventDefault();let t=s.r(e);this.debug&&console.log(`handleChange:`,e.target.name,e.target.value),this.setState(e=>({formValue:{...e.formValue,...t}}))};render(){let{isDetail:e,item:t}=this.state;return e?t===!1?(0,l.jsx)(o.i,{cUriTitle:this.title,cUri:this.cUri,title:this.title+` | Chi tiết`}):(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(d.Helmet,{children:(0,l.jsx)(`title`,{children:this.title})}),(0,l.jsxs)(`div`,{className:`mb-3 ${this.fluid?`container-fluid`:`container`}`,children:[this.renderHeaderDetail(),(0,l.jsx)(`div`,{className:`position-relative`,children:(0,l.jsx)(a.t,{loading:!t,style:{minHeight:200,marginTop:20},children:this.renderForm()})})]})]}):(0,l.jsx)(o.a,{cUriTitle:this.title,cUri:this.cUri,title:this.title+` | Chi tiết`,fluid:this.fluid})}},m=class extends c.default.Component{effectRan=!1;module=`admins`;controller=``;table=``;state={formValue:{},item:void 0,isField:!1,isDetail:!1};title=``;cUri=``;_envOverride={};_cLinkOverride;get API_URL(){return this._envOverride.API_URL??t.t().API_URL??``}set API_URL(e){this._envOverride.API_URL=e}get ADMIN_URI(){return this._envOverride.ADMIN_URI??t.t().ADMIN_URI??``}set ADMIN_URI(e){this._envOverride.ADMIN_URI=e}get cLink(){return this._cLinkOverride??this.ADMIN_URI+this.cUri}set cLink(e){this._cLinkOverride=e}getDataUrl=``;editUrl=``;createUrl=``;ctype=`application/json`;fluid=!1;isBackUri=!1;debug=!1;renderForm=()=>(0,l.jsx)(l.Fragment,{});renderAfterForm=()=>(0,l.jsx)(l.Fragment,{});handleChange=async e=>{e.preventDefault();let t=s.r(e);this.debug&&console.log(`handleChange:`,e.target.name,e.target.value),this.setState(e=>({formValue:{...e.formValue,...t}}))};syncPermissionsAndState=async()=>{let{menuData:e,user:t}=this.props,i={isDetail:f(e,this.module,this.controller,`detail`,0,t.groupId)};this.setState(i,async()=>{try{let e=await n.n(this.getDataUrl,{table:this.table},`GET`,`application/json`,!1),t=e?e.data:void 0;this.setState({item:t||!1,formValue:t?{...t}:{}}),new r.t(`#fieldUpdate`).run()}catch(e){n.s(e)===`invalid_404`&&this.props.navigate(this.cUri),n.x(n.s(e))}})};async initDidMount(){try{if(this.effectRan)return;this.effectRan=!0,this.props.user?.groupId&&(await this.syncPermissionsAndState(),await this.componentDidMountAfter())}catch(e){n.s(e)===`invalid_404`&&this.props.navigate(this.cUri),n.x(n.s(e))}}componentDidMount(){this.initDidMount()}componentDidMountAfter=async()=>{};handleSubmit=async e=>{e.preventDefault();let{formValue:t}=this.state,i=new r.t(`#fieldUpdate`);if(!i.hasErrors()&&!i.isIncomplete()){n.C(`#fieldUpdate`,!0);try{t.table||=this.table;let e=await n.n(this.editUrl,t,`POST`,this.ctype);if(n.S(`Cập nhật thành công`,`top-end`,!0),e.data.id){if(this.isBackUri)return this.props.navigate(this.cUri);this.props.navigate(this.cUri+`/fields`),this.setState({item:{...e.data},formValue:{...e.data}},async()=>{await this.afterSubmit(e.data)})}}catch(e){n.x(n.s(e))}finally{n.C(`#fieldUpdate`,!1)}}};afterSubmit=async e=>{};renderHeaderUpdate(){return(0,l.jsx)(o.t,{adminUri:this.ADMIN_URI,title:this.title,cUri:this.cUri,itemId:r.o(this.state.item)})}render(){let{isDetail:e,item:t}=this.state;return e===!1?(0,l.jsx)(o.a,{cUriTitle:this.title,cUri:this.cUri,title:this.title,fluid:this.fluid}):(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(d.Helmet,{children:(0,l.jsxs)(`title`,{children:[this.title,` | Tùy chỉnh dữ liệu`]})}),(0,l.jsx)(`div`,{className:`position-relative mb-3 ${this.fluid?`container-fluid`:`container`}`,children:(0,l.jsx)(u.Form,{id:`fieldUpdate`,className:`position-relative`,method:`post`,encType:`multipart/form-data`,"data-toggle":`validator`,role:`form`,onSubmit:this.handleSubmit,children:(0,l.jsxs)(a.t,{loading:!t,style:{minHeight:200,marginTop:20},children:[this.renderHeaderUpdate(),this.renderForm()]})})}),this.renderAfterForm()]})}},h=class extends c.default.Component{module=`admins`;controller=``;state={formValue:{},error:{},isCre:!1,isEdit:!1};title=``;cUri=``;_envOverride={};_cLinkOverride;get API_URL(){return this._envOverride.API_URL??t.t().API_URL??``}set API_URL(e){this._envOverride.API_URL=e}get ADMIN_URI(){return this._envOverride.ADMIN_URI??t.t().ADMIN_URI??``}set ADMIN_URI(e){this._envOverride.ADMIN_URI=e}get cLink(){return this._cLinkOverride??this.ADMIN_URI+this.cUri}set cLink(e){this._cLinkOverride=e}importUrl=``;importFile=`assetorigin.xlsx`;ctype=`multipart/form-data`;fluid=!1;handleChange=async e=>{e.preventDefault();let{name:t,type:n,value:r}=e.target;if(n===`file`){let n=e.target.files;this.setState(e=>({formValue:{...e.formValue,[t]:n?n[0]:null}}))}else this.setState(e=>({formValue:{...e.formValue,[t]:r}}))};syncPermissionsAndState=()=>{let{menuData:e,user:t}=this.props,n={isCre:f(e,this.module,this.controller,`update`,0,t.groupId),isEdit:f(e,this.module,this.controller,`update`,1,t.groupId)};this.setState(n,async()=>{new r.t(`#itemImport`).run()})};async initDidMount(){try{this.props.user?.groupId&&(this.syncPermissionsAndState(),this.componentDidMountAfter())}catch(e){n.s(e)===`invalid_404`&&this.props.navigate(this.cUri),n.x(n.s(e))}}componentDidMount(){this.initDidMount()}componentDidMountAfter=async()=>{};handleSubmit=async e=>{e.preventDefault();let{formValue:t}=this.state,i=new r.t(`#itemImport`);if(!i.hasErrors()&&!i.isIncomplete()){n.C(`#itemImport`,!0);try{let e=await n.n(this.importUrl,t,`POST`,this.ctype);e.data?.error?.length?Array.isArray(e.data?.error)&&e.data.error.length&&this.setState({error:Object.fromEntries(e.data.error.map((e,t)=>[t,e]))}):(this.props.navigate(this.cUri),n.S(`Import thành công`,`top-end`,!0))}catch(e){n.x(n.s(e))}finally{n.C(`#itemImport`,!1)}}};renderForm=()=>(0,l.jsx)(l.Fragment,{children:(0,l.jsx)(i.t,{onChange:this.handleChange,label:`Import excel`,name:`importfile`,ext:`.xlsx,.xls`})});render(){let{isCre:e,isEdit:t}=this.state;return e===!1&&t===!1?(0,l.jsx)(o.a,{cUriTitle:this.title,cUri:this.cUri,title:this.title+` | Import`,fluid:this.fluid}):(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(d.Helmet,{children:(0,l.jsxs)(`title`,{children:[this.title,` | `,`Import`]})}),(0,l.jsx)(`div`,{className:`mb-3 ${this.fluid?`container-fluid`:`container`}`,children:(0,l.jsxs)(u.Form,{id:`itemImport`,className:`position-relative`,action:this.importUrl,method:`post`,encType:`multipart/form-data`,"data-toggle":`validator`,role:`form`,onSubmit:this.handleSubmit,children:[(0,l.jsxs)(`div`,{className:`navbar navbar-main navbar-expand-lg px-0 shadow-none border-radius-xl py-3`,children:[(0,l.jsx)(`nav`,{"aria-label":`breadcrumb`,children:(0,l.jsxs)(`ol`,{className:`breadcrumb bg-transparent m-0 p-0`,children:[(0,l.jsx)(`li`,{className:`breadcrumb-item`,children:(0,l.jsx)(u.Link,{className:`text-white`,to:this.ADMIN_URI||`/`,children:(0,l.jsx)(`i`,{className:`fal fa-home`})})}),(0,l.jsx)(`li`,{className:`breadcrumb-item`,children:(0,l.jsx)(u.Link,{className:`text-white`,to:this.cUri,children:this.title})}),(0,l.jsx)(`li`,{className:`breadcrumb-item text-white active`,"aria-current":`page`,children:`Import`})]})}),(0,l.jsxs)(`div`,{className:`ms-auto`,children:[(0,l.jsx)(u.Link,{target:`_blank`,to:this.API_URL+`/importfile/`+this.importFile,className:`btn btn-sm btn-icon btn-info me-2`,title:`Tải xuống biểu mẫu`,children:(0,l.jsx)(`i`,{className:`material-icons text-white position-relative text-lg`,children:`file_download`})}),(0,l.jsx)(u.Link,{to:this.cUri,className:`btn btn-sm btn-icon btn-secondary`,title:`Trở lại`,children:(0,l.jsx)(`i`,{className:`material-icons text-white position-relative text-lg`,children:`reply`})})]})]}),(0,l.jsx)(`div`,{className:`card`,children:(0,l.jsx)(`div`,{className:`card-body pb-0`,children:(0,l.jsx)(`div`,{className:`row justify-content-center`,children:(0,l.jsxs)(`div`,{className:`col-md-8 pt-5 pb-4`,children:[(0,l.jsx)(`div`,{dangerouslySetInnerHTML:{__html:n.y(this.state.error)}}),this.renderForm(),(0,l.jsx)(`div`,{className:`w-100 d-flex`,children:(0,l.jsx)(`button`,{title:`Import`,type:`submit`,className:`btn btn-success mb-4 mx-auto`,children:`Import`})})]})})})})]})})]})}},g=class extends c.default.Component{effectRan=!1;fluid=!1;module=`admins`;controller=``;table=``;hasField=!1;state={loading:!0,data:{items:[],page:1,filter:{},length:10,pageTotal:0,recordTotal:0},isDel:void 0,isCre:void 0,isEdit:void 0,isDelOne:void 0,isDetail:void 0,isIndex:void 0,isImport:void 0,isExport:void 0,isCopy:void 0,selectedIds:[],ftfield:[],tbfield:[]};activeMethod=[`ind`,`det`,`cre`,`edit`,`delone`,`del`];cUri=``;_envOverride={};_cLinkOverride;get API_URL(){return this._envOverride.API_URL??t.t().API_URL??``}set API_URL(e){this._envOverride.API_URL=e}get ADMIN_URI(){return this._envOverride.ADMIN_URI??t.t().ADMIN_URI??``}set ADMIN_URI(e){this._envOverride.ADMIN_URI=e}get cLink(){return this._cLinkOverride??this.ADMIN_URI+this.cUri}set cLink(e){this._cLinkOverride=e}getDataUrl=``;deleteUrl=``;copyUrl=``;exportUrl=``;title=``;handleChange=async e=>{try{e.preventDefault();let{name:t}=e.target,r=await o.l(e,this.state.data.filter||{});if(t===`pageLen`){await this.setFilter(r);let e=r?n.a(r):``;this.props.navigate(`${this.cUri}?${e}`,{replace:!0}),await this.fetchData()}else this.setState(e=>({data:{...e.data,filter:r}}))}catch(e){console.log(e)}};handleSearchForm=async e=>{try{e.preventDefault();let t=await o.c(this.state.data.filter||{},this.cUri,this.props.navigate);await this.setFilter(t),await this.fetchData()}catch(e){console.log(e)}};handleClickPage=async e=>{try{e.preventDefault();let t=await o.s(e,this.state.data.filter||{},this.cUri,this.props.navigate);await this.setFilter(t),await this.fetchData()}catch(e){n.x(n.s(e))}};handleDeleteOne=async e=>{n.b().then(async()=>{try{await n.n(`${this.deleteUrl}/${e}`,{},`DELETE`),n.S(`Xoá thành công!`,`top-end`,!0),await this.fetchData()}catch(e){n.x(n.s(e))}})};handleDelete=async()=>{this.state.selectedIds.length?n.b().then(async()=>{try{await n.n(this.deleteUrl,{selected:this.state.selectedIds},`POST`),n.S(`Xoá thành công!`,`top-end`,!0),await this.fetchData()}catch(e){n.x(n.s(e))}}):n.x(`Vui lòng chọn thông tin`)};handleCopy=async()=>{this.state.selectedIds.length?n.b().then(async()=>{try{await n.n(this.copyUrl,{selected:this.state.selectedIds},`POST`),n.S(`Sao chép thành công!`,`top-end`,!0),await this.fetchData()}catch(e){n.x(n.s(e))}}):n.x(`Vui lòng chọn thông tin`)};handleExport=async()=>{try{let{data:e}=this.state,t=n.a(e.filter||{});this.exportUrl&&(window.location.href=this.exportUrl+`?${t}`)}catch(e){n.x(n.s(e))}};handleSelectOne=(e,t)=>{this.setState(n=>({selectedIds:t?[...new Set([...Array.isArray(n.selectedIds)?n.selectedIds:[],e])]:(n.selectedIds??[]).filter(t=>t!==e)}))};handleSelectAll=(e,t=[])=>{this.setState({selectedIds:e?(this.state.data?.items??[]).map(e=>e.id).filter(e=>typeof e==`number`).filter(e=>!t.includes(e)):[]})};setFilter(e){return new Promise(t=>{this.setState(t=>({data:{...t.data,filter:e}}),t)})}fetchData=async()=>{try{let e=await o.o(this.state.data.filter||{},this.getDataUrl);if(!e||!(`items`in e))return;this.setState({data:{...e,filter:e.filter??this.state.data.filter},selectedIds:[]})}catch(e){console.error(n.s(e))}};syncGetField=async()=>({userfield:{},tablefield:{}});syncPermissionsAndState=async()=>{let{menuData:e,user:t}=this.props,n={isCre:this.activeMethod.includes(`cre`)?f(e,this.module,this.controller,`update`,0,t.groupId):!1,isEdit:this.activeMethod.includes(`edit`)?f(e,this.module,this.controller,`update`,1,t.groupId):!1,isDel:this.activeMethod.includes(`del`)?f(e,this.module,this.controller,`delete`,0,t.groupId):!1,isDelOne:this.activeMethod.includes(`delone`)?f(e,this.module,this.controller,`delete`,1,t.groupId):!1,isIndex:this.activeMethod.includes(`ind`)?f(e,this.module,this.controller,`index`,0,t.groupId):!1,isDetail:this.activeMethod.includes(`det`)?f(e,this.module,this.controller,`detail`,0,t.groupId):!1,isImport:!!this.activeMethod.includes(`imp`),isExport:!!this.activeMethod.includes(`exp`),isCopy:!!this.activeMethod.includes(`cpy`)};this.setState(n,async()=>{if(n.isIndex){if(this.hasField){let{userfield:e,tablefield:t}=await this.syncGetField(),n=e?.data?.ftfield||t?.data?.deft||[],r=e?.data?.tbfield||t?.data?.detb||[];this.setState(e=>({...e,ftfield:n,tbfield:r}))}await this.fetchData(),this.setState({loading:!1}),await this.componentDidMountAfter()}})};async initDidMount(){try{if(this.effectRan)return;this.effectRan=!0;let e=new URLSearchParams(window.location.search),t=Object.fromEntries(e.entries()),n={...this.state.data.filter||{},page:1,...t};await this.setFilter(n),this.props.user?.groupId&&await this.syncPermissionsAndState()}catch(e){n.x(n.s(e))}}componentDidMount(){this.initDidMount()}componentDidMountAfter=async()=>{};renderHeaderIndex(){return(0,l.jsx)(o.n,{adminUri:this.ADMIN_URI,title:this.title,cUri:this.cUri,isExp:this.state.isExport,isImp:this.state.isImport,isCre:this.state.isCre,isDel:this.state.isDel,isCpy:this.state.isCopy,isField:this.hasField,onExport:this.handleExport,onCopy:this.handleCopy,onDelete:this.handleDelete})}renderTable=()=>(0,l.jsx)(l.Fragment,{});renderSearch=()=>(0,l.jsx)(l.Fragment,{});render(){let{isIndex:e,data:t,loading:n}=this.state;return e===!1?(0,l.jsx)(o.a,{cUriTitle:this.title,cUri:this.cUri,title:this.title,fluid:this.fluid}):(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(d.Helmet,{children:(0,l.jsx)(`title`,{children:this.title})}),(0,l.jsx)(a.t,{loading:n,children:e&&(0,l.jsxs)(`div`,{className:`mb-3 ${this.fluid?`container-fluid`:`container`}`,children:[this.renderHeaderIndex(),(0,l.jsx)(`div`,{className:`card position-relative`,children:(0,l.jsx)(`div`,{className:`card-body`,style:{minHeight:`200px`},children:(0,l.jsxs)(`div`,{className:`searchForm`,children:[(0,l.jsx)(`form`,{onSubmit:this.handleSearchForm,children:this.renderSearch()}),t?.items?.length?(0,l.jsx)(o.u,{data:t,onChange:this.handleChange,onClickPage:this.handleClickPage}):``,(0,l.jsx)(`div`,{className:`table-responsive mt-2`,children:this.renderTable()}),t?.items?.length?(0,l.jsx)(o.u,{data:t,onChange:this.handleChange,onClickPage:this.handleClickPage}):``]})})})]})})]})}},_=({adminUri:e,cUri:t,title:n,itemId:r,isSave:i=!0,titleAction:a})=>(0,l.jsxs)(`div`,{className:`navbar navbar-main navbar-expand-lg px-0 shadow-none border-radius-xl py-3`,children:[(0,l.jsx)(`nav`,{"aria-label":`breadcrumb`,children:(0,l.jsxs)(`ol`,{className:`breadcrumb bg-transparent m-0 p-0`,children:[(0,l.jsx)(`li`,{className:`breadcrumb-item`,children:(0,l.jsx)(u.Link,{className:`text-white`,to:e||`/`,children:(0,l.jsx)(`i`,{className:`fal fa-home`})})}),(0,l.jsx)(`li`,{className:`breadcrumb-item`,children:(0,l.jsx)(u.Link,{className:`text-white`,to:t,children:n})}),(0,l.jsx)(`li`,{className:`breadcrumb-item text-white active`,"aria-current":`page`,children:a??(r?`Chỉnh sửa`:`Thêm mới`)})]})}),(0,l.jsxs)(`div`,{className:`ms-auto`,children:[i&&(0,l.jsx)(o.d,{title:`Lưu lại`,children:(0,l.jsx)(`button`,{type:`submit`,className:`btn btn-sm btn-icon btn-success me-1`,children:(0,l.jsx)(`i`,{className:`material-icons text-white position-relative text-lg`,children:`save`})})}),(0,l.jsx)(o.d,{title:`Trở lại`,children:(0,l.jsx)(u.Link,{to:t,className:`btn btn-sm btn-icon btn-secondary`,children:(0,l.jsx)(`i`,{className:`material-icons text-white position-relative text-lg`,children:`reply`})})})]})]}),v=({title:e=``,cUri:t=``,fluid:n=!1,cUriTitle:r=``})=>(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(d.Helmet,{children:(0,l.jsx)(`title`,{children:e||`Truy cập không được phép`})}),(0,l.jsxs)(`div`,{className:`${n?`container-fluid`:`container`}`,children:[(0,l.jsx)(`div`,{className:`navbar navbar-main navbar-expand-lg px-0 shadow-none border-radius-xl py-3`,children:(0,l.jsx)(`nav`,{"aria-label":`breadcrumb`,children:(0,l.jsxs)(`ol`,{className:`breadcrumb bg-transparent m-0 p-0`,children:[(0,l.jsx)(`li`,{className:`breadcrumb-item`,children:(0,l.jsx)(u.Link,{className:`text-white`,to:`/`,children:(0,l.jsx)(`i`,{className:`fal fa-home`})})}),(0,l.jsx)(`li`,{className:`breadcrumb-item`,children:(0,l.jsx)(u.Link,{className:`text-white`,to:t,children:r})})]})})}),(0,l.jsx)(`div`,{style:{minHeight:`50vh`},className:`d-flex align-items-center`,children:(0,l.jsxs)(`div`,{className:`m-auto text-center`,children:[(0,l.jsx)(`h1`,{className:`display-1 text-bolder text-white`,children:`403`}),(0,l.jsx)(`h2`,{className:`text-white`,children:`Truy cập không được phép`}),(0,l.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,l.jsx)(u.Link,{to:`/`,className:`btn btn-outline-white mt-4`,children:`trang chủ`})]})})]})]}),y=({title:e=``,cUri:t=``,fluid:n=!1,cUriTitle:r=``})=>(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(d.Helmet,{children:(0,l.jsx)(`title`,{children:e||`Không tìm thấy dữ liệu`})}),(0,l.jsxs)(`div`,{className:`${n?`container-fluid`:`container`}`,children:[(0,l.jsx)(`div`,{className:`navbar navbar-main navbar-expand-lg px-0 shadow-none border-radius-xl py-3`,children:(0,l.jsx)(`nav`,{"aria-label":`breadcrumb`,children:(0,l.jsxs)(`ol`,{className:`breadcrumb bg-transparent m-0 p-0`,children:[(0,l.jsx)(`li`,{className:`breadcrumb-item`,children:(0,l.jsx)(u.Link,{className:`text-white`,to:`/`,children:(0,l.jsx)(`i`,{className:`fal fa-home`})})}),(0,l.jsx)(`li`,{className:`breadcrumb-item`,children:(0,l.jsx)(u.Link,{className:`text-white`,to:t,children:r})})]})})}),(0,l.jsx)(`div`,{style:{minHeight:`50vh`},className:`d-flex align-items-center`,children:(0,l.jsxs)(`div`,{className:`m-auto text-center`,children:[(0,l.jsx)(`h1`,{className:`display-1 text-bolder text-white`,children:`404`}),(0,l.jsx)(`h2`,{className:`text-white`,children:`Không tìm thấy dữ liệu`}),(0,l.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,l.jsx)(u.Link,{to:`/`,className:`btn btn-outline-white mt-4`,children:`trang chủ`})]})})]})]}),b=class extends c.default.Component{effectRan=!1;module=`admins`;controller=``;state={formValue:{},error:{},loading:!0,item:void 0,isCre:void 0,isEdit:void 0,isDetail:void 0};title=``;cUri=``;_envOverride={};_cLinkOverride;get API_URL(){return this._envOverride.API_URL??t.t().API_URL??``}set API_URL(e){this._envOverride.API_URL=e}get ADMIN_URI(){return this._envOverride.ADMIN_URI??t.t().ADMIN_URI??``}set ADMIN_URI(e){this._envOverride.ADMIN_URI=e}get cLink(){return this._cLinkOverride??this.ADMIN_URI+this.cUri}set cLink(e){this._cLinkOverride=e}getDataUrl=``;editUrl=``;createUrl=``;ctype=`application/json`;formRef;fluid=!1;isBackUri=!0;debug=!1;constructor(e){super(e),this.formRef=c.default.createRef()}renderForm=()=>(0,l.jsx)(l.Fragment,{});renderAfterForm=()=>(0,l.jsx)(l.Fragment,{});handleChange=e=>{e.preventDefault();let t=r.r(e);this.setState(e=>({formValue:r.n(e.formValue,t)}))};syncPermissionsAndState=async()=>{let{menuData:e,user:t}=this.props,i={isCre:f(e,this.module,this.controller,`update`,0,t.groupId),isEdit:f(e,this.module,this.controller,`update`,1,t.groupId),isDetail:f(e,this.module,this.controller,`detail`,0,t.groupId)};this.setState(i,async()=>{let e=n.d();if(e&&i.isEdit){let t=await n.n(this.getDataUrl+`/`+e,{},`GET`,`application/json`,!1),i=t?t.data:void 0;this.setState({item:i||!1,formValue:i?JSON.parse(JSON.stringify(i)):{}},async()=>{this.setState({loading:!1}),await this.componentDidMountAfter(),this.formRef.current&&new r.t(this.formRef.current).run()})}else{if(this.setState({loading:!1}),await this.componentDidMountAfter(),!this.formRef.current)return;new r.t(this.formRef.current).run()}})};async initDidMount(){try{if(this.effectRan)return;this.effectRan=!0,this.props.user?.groupId&&await this.syncPermissionsAndState()}catch(e){n.s(e)===`invalid_404`&&this.props.navigate(this.cUri),n.x(n.s(e))}}componentDidMount=()=>{this.initDidMount()};componentDidMountAfter=async()=>{};beforeSubmit=()=>new Promise(e=>{e(!0)});handleSubmit=async e=>{e.preventDefault();let{item:t,formValue:i}=this.state,a=r.o(t),o=new r.t(this.formRef.current);!o.hasErrors()&&!o.isIncomplete()&&this.formRef.current&&this.beforeSubmit().then(async()=>{this.setState({loading:!0});try{let e=a?this.editUrl+`/`+a:this.createUrl,t=await n.n(e,i,`POST`,this.ctype);if(a?n.S(`Cập nhật thành công`,`top-end`,!0):n.S(`Thêm mới thành công`,`top-end`,!0),t?.data?.id){if(this.isBackUri)return this.props.navigate(this.cUri);this.props.navigate(this.cUri+`/edit/`+Number(t.data.id)),this.setState({item:{...t.data},formValue:{...t.data}},async()=>{await this.afterSubmit(t.data)})}}catch(e){n.x(n.s(e))}finally{this.setState({loading:!1})}})};afterSubmit=async e=>{};renderHeaderUpdate(){return(0,l.jsx)(_,{adminUri:this.ADMIN_URI,title:this.title,cUri:this.cUri,itemId:r.o(this.state.item)})}render(){let e=n.d(),{isCre:t,isEdit:i,isDetail:o,item:s}=this.state;return t===!1&&i===!1&&o===!1||t===!1&&e==null||(i===!1||o===!1)&&e?(0,l.jsx)(v,{cUriTitle:this.title,cUri:this.cUri,title:this.title+` | `+(e?`Chỉnh sửa`:`Thêm mới`),fluid:this.fluid}):e&&s===!1?(0,l.jsx)(y,{cUriTitle:this.title,cUri:this.cUri,title:this.title+` | `+(e?`Chỉnh sửa`:`Thêm mới`)}):(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(d.Helmet,{children:(0,l.jsxs)(`title`,{children:[this.title,` | `,r.o(s)?`Chỉnh sửa`:`Thêm mới`]})}),(0,l.jsxs)(`div`,{className:`mb-3 ${this.fluid?`container-fluid`:`container`}`,children:[(0,l.jsx)(`div`,{dangerouslySetInnerHTML:{__html:n.y(this.state.error)}}),(0,l.jsx)(u.Form,{ref:this.formRef,className:`position-relative`,method:`post`,encType:`multipart/form-data`,"data-toggle":`validator`,role:`form`,onSubmit:this.handleSubmit,children:(0,l.jsxs)(a.t,{loading:!!this.state.loading,style:{minHeight:200,marginTop:20},children:[this.renderHeaderUpdate(),this.renderForm()]})}),this.renderAfterForm()]})]})}},x=class extends b{urlUpdateDetail=``;render(){let e=n.d(),{isCre:t,isEdit:i,isDetail:o,item:s}=this.state;if(t===!1&&i===!1&&o===!1||t===!1&&e==null||(i===!1||o===!1)&&e)return(0,l.jsx)(v,{cUriTitle:this.title,cUri:this.cUri,title:this.title+` | `+(e?`Chỉnh sửa`:`Thêm mới`),fluid:this.fluid});if(e&&s===!1)return(0,l.jsx)(y,{cUriTitle:this.title,cUri:this.cUri,title:this.title+` | `+(e?`Chỉnh sửa`:`Thêm mới`)});let c=r.o(s);return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(d.Helmet,{children:(0,l.jsxs)(`title`,{children:[this.title,` | `,c?`Chỉnh sửa`:`Thêm mới`]})}),(0,l.jsxs)(`div`,{className:`mb-3 ${this.fluid?`container-fluid`:`container`}`,children:[(0,l.jsx)(_,{adminUri:this.ADMIN_URI,title:this.title,cUri:this.cUri,isSave:!1,itemId:c}),(0,l.jsx)(`div`,{dangerouslySetInnerHTML:{__html:n.y(this.state.error)}}),(0,l.jsx)(`div`,{className:`position-relative`,children:(0,l.jsx)(a.t,{loading:!!this.state.loading,style:{minHeight:200,marginTop:0},children:this.renderForm()})})]})]})}handleDetailSubmit=async(e,t)=>{try{let i=r.o(this.state.item);i&&e?.length&&(n.C(t,!0),await n.n(this.urlUpdateDetail,{itemid:i,details:e}),n.C(t,!1),n.S(`Thêm tài sản thành công`,`top-end`,!0),await this.editDetailAfter(i),this.props.navigate(this.cUri+`/edit/`+i))}catch(e){n.x(n.s(e)),n.C(t,!1)}};editDetailAfter=async e=>{}},S=class extends b{urlGetDeTableList=``;urlGetDeTable=``;urlCreDeTable=``;urlEditDeTable=``;urlDelDeTable=``;modalRef;isBackUri=!1;constructor(e){super(e),this.modalRef=(0,c.createRef)()}async fetchDataDetails(){return{}}render(){let e=n.d(),{isCre:t,isEdit:i,isDetail:a,item:o}=this.state;if(t===!1&&i===!1&&a===!1||t===!1&&e==null||(i===!1||a===!1)&&e)return(0,l.jsx)(v,{cUriTitle:this.title,cUri:this.cUri,title:this.title+` | `+(e?`Chỉnh sửa`:`Thêm mới`),fluid:this.fluid});if(e&&o===!1)return(0,l.jsx)(y,{cUriTitle:this.title,cUri:this.cUri,title:this.title+` | `+(e?`Chỉnh sửa`:`Thêm mới`)});let s=r.o(o);return(0,l.jsxs)(l.Fragment,{children:[(0,l.jsx)(d.Helmet,{children:(0,l.jsxs)(`title`,{children:[this.title,` | `,s?`Chỉnh sửa`:`Thêm mới`]})}),(0,l.jsxs)(`div`,{className:`mb-3 ${this.fluid?`container-fluid`:`container`}`,children:[(0,l.jsx)(_,{adminUri:this.ADMIN_URI,title:this.title,cUri:this.cUri,isSave:!1,itemId:s}),o?this.renderDeTable():null,this.renderForm()]})]})}renderDeTable(){return(0,l.jsx)(l.Fragment,{})}renderModalDeBody=(e,t)=>(0,l.jsx)(l.Fragment,{});handleDetailSubmit=async e=>{e.preventDefault()};editDetailAfter=async e=>{}};Object.defineProperty(exports,"a",{enumerable:!0,get:function(){return h}}),Object.defineProperty(exports,"i",{enumerable:!0,get:function(){return g}}),Object.defineProperty(exports,"n",{enumerable:!0,get:function(){return x}}),Object.defineProperty(exports,"o",{enumerable:!0,get:function(){return m}}),Object.defineProperty(exports,"r",{enumerable:!0,get:function(){return b}}),Object.defineProperty(exports,"s",{enumerable:!0,get:function(){return p}}),Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return S}});
@@ -1,9 +1,11 @@
1
+ import { SweetAlertPosition } from 'sweetalert2';
2
+ import { Modal } from 'bootstrap';
1
3
  import { default as Decimal } from 'decimal.js';
2
4
  import { CrudItem, FormValue } from '../hook/common';
3
5
  export declare const loadScript: (src: string) => Promise<void>;
4
6
  export declare const loadScripts: (scripts: string[]) => Promise<void>;
5
7
  export declare const spinnerLoader: (box: string | Element, action?: boolean) => void;
6
- export declare const buildFormData: (data: Record<string, any>) => FormData;
8
+ export declare const buildFormData: (data: Record<string, unknown>) => FormData;
7
9
  export declare class ApiError extends Error {
8
10
  errorCode: string;
9
11
  constructor(message: string, errorCode: string);
@@ -35,7 +37,7 @@ export declare const callFetchApi: <T = Record<string, unknown>>(url: string, da
35
37
  export declare function callFetchApiToken<T = Record<string, unknown>>(url: string, data?: FormValue, type?: string, ctype?: string, isTry?: true): Promise<ApiResponse<T>>;
36
38
  export declare function callFetchApiToken<T = Record<string, unknown>>(url: string, data: FormValue | undefined, type: string | undefined, ctype: string | undefined, isTry: false): Promise<ApiResponse<T> | false>;
37
39
  export declare const showSweetAlert: (text?: string, confirmText?: string) => Promise<import('sweetalert2').SweetAlertResult<any>>;
38
- export declare const showSweetAlertOk: (title: string, pos?: any, toast?: boolean) => void;
40
+ export declare const showSweetAlertOk: (title: string, pos?: SweetAlertPosition, toast?: boolean) => void;
39
41
  export declare const showSweetAlertWarning: (title: string) => void;
40
42
  export declare const showSweetAlertError: (title: string) => void;
41
43
  /**
@@ -86,7 +88,7 @@ export declare const formatDateSql: (date: DateInput) => string;
86
88
  */
87
89
  export declare const getParams: (name?: string | string[] | null) => string | Record<string, string | null> | null;
88
90
  export declare const setParams: (newParams: Record<string, string | null>) => string;
89
- export declare const createQueryString: (params: Record<string, any>) => string;
91
+ export declare const createQueryString: (params: Record<string, unknown>) => string;
90
92
  /**
91
93
  * Lấy `:id` từ URL hiện tại.
92
94
  *
@@ -148,23 +150,79 @@ export declare const showMessage: (errors?: {
148
150
  raw?: boolean;
149
151
  }) => string;
150
152
  export declare const resetForm: (form: HTMLFormElement) => HTMLFormElement;
151
- export declare const mapDataForm: (form: HTMLFormElement, data: Record<string, any>, hidden?: boolean) => Promise<Record<string, any>>;
152
- export declare const elFinderPopup: (el: string, options?: Record<string, any>) => Promise<unknown>;
153
- export declare const createModal: (modalCls: string | HTMLElement) => Promise<unknown>;
154
- export declare const showFinderModal: (btnEl: HTMLDivElement, modalCls: string, fnShow?: ((item: {
155
- data: any;
156
- modalEl?: HTMLElement;
157
- btnEl?: any;
158
- md?: any;
159
- }) => void) | false, fnHide?: (() => void) | false) => void;
160
- export declare const showFinderFileModal: (btnEl: HTMLDivElement, modalCls: string, fnShow?: ((item: {
161
- data: any;
153
+ export declare const mapDataForm: (form: HTMLFormElement, data: Record<string, unknown>, hidden?: boolean) => Promise<Record<string, unknown>>;
154
+ export declare const elFinderPopup: (el: string, options?: Record<string, unknown>) => Promise<unknown>;
155
+ /**
156
+ * Lấy message từ giá trị trong `catch`.
157
+ *
158
+ * `catch` nhận `unknown` (`useUnknownInCatchVariables` bật cùng `strict`) vì
159
+ * JavaScript cho `throw` BẤT KỲ thứ gì — kể cả chuỗi. Trong codebase này
160
+ * `Promise.reject("invalid_404")` là mẫu rất hay dùng, và các call site so sánh
161
+ * `error.message == "invalid_404"`. Nếu ép `catch (error: any)` chỉ để đọc
162
+ * `.message` thì với các giá trị đó runtime sẽ ra `undefined` và so sánh luôn
163
+ * sai — tức là mất luôn cả nhánh xử lý 404.
164
+ *
165
+ * Vì vậy: `Error` thì lấy `.message`, chuỗi thì trả chính nó, còn lại thử
166
+ * `JSON.stringify`. `JSON.stringify` có thể ném với `BigInt`/vòng lặp nên bọc
167
+ * trong `try`.
168
+ */
169
+ export declare const errorMessage: (error: unknown) => string;
170
+ /**
171
+ * Mở modal Bootstrap và trả về instance để điều khiển (`show`/`hide`).
172
+ *
173
+ * Khai báo rõ kiểu của `Promise` vì `new Promise((resolve) => ...)` không có
174
+ * type argument sẽ suy ra là `Promise<unknown>` — mọi call site phải ép `any`
175
+ * mới destructure được `{ md, modalEl }`. `Modal` lấy từ `bootstrap` nên có kiểu
176
+ * đầy đủ (`hide`/`show`/`dispose`), không phải tự định nghĩa.
177
+ */
178
+ export declare const createModal: (modalCls: string | HTMLElement) => Promise<{
179
+ md: Modal;
180
+ modalEl: HTMLElement;
181
+ }>;
182
+ /**
183
+ * Payload mà `showFinderModal`/`showFinderFileModal` đưa cho callback của
184
+ * consumer.
185
+ *
186
+ * `data` là kết quả từ elFinder nên để `unknown` — tuỳ chế độ chọn nó là 1 file
187
+ * hoặc mảng file, và `ElFinderFile` đã mô tả đúng một file. `md` là instance
188
+ * `Modal` của bootstrap, `btnEl` là phần tử đã bấm.
189
+ */
190
+ export interface FinderModalItem {
191
+ data: unknown;
162
192
  modalEl?: HTMLElement;
163
- btnEl?: any;
164
- md?: any;
165
- }) => void) | false, fnHide?: (() => void) | false) => void;
166
- export declare const filterIds: (input: any[] | string) => number[];
167
- export declare function stringToJson(input: any, df?: {}, type?: string): any;
193
+ btnEl?: HTMLDivElement;
194
+ /**
195
+ * Instance modal để điều khiển.
196
+ *
197
+ * Đánh dấu OPTIONAL vì consumer có thể tự dựng object này khi test; nhưng hai
198
+ * hàm `showFinderModal`/`showFinderFileModal` LUÔN truyền kèm `md` nên
199
+ * call site thật dùng callback `FinderModalItem` sẽ không phải kiểm tra lại.
200
+ */
201
+ md?: Modal;
202
+ }
203
+ export declare const showFinderModal: (btnEl: HTMLDivElement, modalCls: string, fnShow?: ((item: FinderModalItem) => void) | false, fnHide?: (() => void) | false) => void;
204
+ export declare const showFinderFileModal: (btnEl: HTMLDivElement, modalCls: string, fnShow?: ((item: FinderModalItem) => void) | false, fnHide?: (() => void) | false) => void;
205
+ /**
206
+ * Giá trị đọc được từ `stringToJson` khi `type` không phải `"ids"`.
207
+ *
208
+ * Hàm xử lý cả mảng lẫn object tuỳ input nên kiểu trả về là `unknown` — bắt
209
+ * buộc call site tự kiểm tra trước khi dùng, thay vì `any` khiến mọi thứ biến
210
+ * thành `any[]` ngay từ đầu.
211
+ */
212
+ export type ParsedJson = unknown;
213
+ /**
214
+ * Ép một mảng bất kỳ thành `number[]`, bỏ `NaN` và trùng lặp.
215
+ *
216
+ * Input đến từ query string / JSON nên có thể là chuỗi số, số, hoặc rỗng.
217
+ */
218
+ export declare const filterIds: (input: ParsedJson | string) => number[];
219
+ /**
220
+ * Đọc JSON từ chuỗi (query string, hidden field...) với giá trị mặc định.
221
+ *
222
+ * Trả về `unknown` vì kết quả có thể là mảng hoặc object tuỳ nội dung JSON —
223
+ * người gọi phải tự kiểm tra. `type = "ids"` thì lọc thành `number[]`.
224
+ */
225
+ export declare function stringToJson(input: unknown, df?: unknown, type?: string): ParsedJson;
168
226
  /** Luôn trả về chuỗi đã format (0 -> "0", null -> "0") để không lệch return type. */
169
227
  export declare const formatNumber: (number: number, options?: Intl.NumberFormatOptions, type?: string) => string;
170
228
  export declare const decimalNumber: (value: string | number) => Decimal;
@@ -187,7 +245,7 @@ export declare const decimalNumber: (value: string | number) => Decimal;
187
245
  * const ids = mapArrFields(data, 'id');
188
246
  * // Kết quả: [1, 2, 3]
189
247
  */
190
- export declare const mapArrFields: (data: any[], field: any) => any[];
248
+ export declare const mapArrFields: (data: readonly CrudItem[], field: string) => unknown[];
191
249
  /**
192
250
  * Gộp (merge) các object trong mảng thành một object duy nhất
193
251
  * Các key trùng nhau sẽ bị ghi đè bởi object xuất hiện sau
@@ -204,10 +262,7 @@ export declare const mapArrFields: (data: any[], field: any) => any[];
204
262
  * const result = mergeArrObject(data);
205
263
  * // Kết quả: { a: 1, b: 3, c: 4, d: 5 }
206
264
  */
207
- export declare const mergeArrObject: (array1: any[], array2: any[], field1: string, field2: string, field2S: string) => {
208
- id: number;
209
- name: string;
210
- }[];
265
+ export declare const mergeArrObject: (array1: readonly unknown[], array2: readonly CrudItem[], field1: string, field2: string, field2S: string) => Record<string, unknown>[];
211
266
  /**
212
267
  * Map lại dữ liệu của mảng object theo rule chỉ định
213
268
  *
@@ -238,11 +293,29 @@ export declare const mergeArrObject: (array1: any[], array2: any[], field1: stri
238
293
  * // { userId: 2, fullName: 'Bình', isAdult: true }
239
294
  * // ]
240
295
  */
241
- export declare const mapArrData: (arr: any[], rule: any) => any[];
296
+ /**
297
+ * Quy tắc ánh xạ cho `mapArrData`: hoặc tên field cần lấy, hoặc hàm tự tính.
298
+ *
299
+ * Về callback: dùng `(...args: never[]) => unknown` chứ không phải
300
+ * `(item: CrudItem) => unknown`. `never` ở vị trí tham số khiến mọi callback có
301
+ * tham số kiểu cụ thể hơn đều gán được (contravariance) — nếu khai báo
302
+ * `(item: CrudItem)` thì consumer viết `(item: { age: number }) => ...` sẽ bị
303
+ * báo lỗi dù hoàn toàn hợp lệ. Thân hàm thì vẫn gọi với `item` thật.
304
+ */
305
+ export type MapArrDataRule = Record<string, string | ((...args: never[]) => unknown)>;
306
+ export declare const mapArrData: (arr: readonly CrudItem[], rule: MapArrDataRule) => CrudItem[];
242
307
  export declare const isStsNum: (status: number, type: string, tryThrow?: boolean) => boolean;
243
308
  export declare function sumArrCol<T extends Record<string, number>>(items: T[], col: keyof T): number;
244
309
  export declare const getFilterType: (type: number) => string;
245
- export declare const getLangs: (key?: any) => string | {
310
+ /** Một ngôn ngữ trong danh sách `getLangs`. */
311
+ export interface Lang {
246
312
  id: number;
247
313
  name: string;
248
- }[];
314
+ }
315
+ /**
316
+ * Danh sách ngôn ngữ, hoặc tên ngôn ngữ khi truyền `key`.
317
+ *
318
+ * Trả về `Lang[] | string` nên call site phải biết mình đang ở nhánh nào —
319
+ * trước đây kiểu `any` khiến `BoxAddRow` phải ép `as Array<{id;name}>`.
320
+ */
321
+ export declare const getLangs: (key?: number | false) => Lang[] | string;
@@ -4,7 +4,7 @@ export interface EnvType {
4
4
  SECRET_KEY?: string;
5
5
  STATIC_URL?: string;
6
6
  UPLOADS_URL?: string;
7
- [key: string]: any;
7
+ [key: string]: unknown;
8
8
  }
9
9
  /**
10
10
  * Tải cấu hình runtime từ `/env.json`.
@@ -8,4 +8,4 @@ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=requi
8
8
  <div class="rect6"></div>
9
9
  <div class="rect7"></div>
10
10
  </div>
11
- </div>`);else{let e=n.querySelector(`.boxSpinner`);e&&e.remove()}}},u=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}t.append(e,n)}}),t},d=class extends Error{errorCode;constructor(e,t){super(e),this.name=`ApiError`,this.errorCode=t}},te=async(e,t={},n=`POST`,r=`application/json`)=>{let i={method:n,headers:{"Content-Type":r,"Secret-Key":s(`SECRET_KEY`)},credentials:`include`};n==`POST`&&(i.body=JSON.stringify(t));let a=await(await fetch(e,i)).json();if(a.status==200)return a;throw a.msg?new d(a.msg,a.errorCode??`unknown`):Error(`invalid_response`)};async function f(e,t={},n=`POST`,r=`application/json`,i=!0){let a={"Secret-Key":s(`SECRET_KEY`)};r!==`multipart/form-data`&&(a[`Content-Type`]=r);let o={method:n,headers:a,credentials:`include`};if(n==`POST`&&(o.body=r===`multipart/form-data`?u(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 c=await(await fetch(e,o)).text(),l=null;if(c)try{l=JSON.parse(c)}catch{l=c}if(l&&typeof l!=`string`&&l.status==200)return l;if(l&&typeof l!=`string`&&l.msg&&i)throw new d(l.msg,l.errorCode??`unknown`);if(i)throw Error(`invalid_response`);return!1}var p=(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`}),m=(e,t=`top`,i=!1)=>{(0,r.default)(n.default).fire({toast:i,icon:`success`,position:t,title:e,showConfirmButton:!1,timer:1500})},ne=e=>{(0,r.default)(n.default).fire({icon:`warning`,title:e,showConfirmButton:!1,timer:1500})},h=e=>{(0,r.default)(n.default).fire({icon:`error`,position:`top`,title:e,showConfirmButton:!1})},re=(e,t,n=`name`)=>{let r=t?.find(t=>t.id===e);return r?r[n]??null:null},ie=(e,t,n=`name`)=>e.map(e=>{let r=t.find(t=>t.id===e);return r?r[n]:null}).filter(Boolean).join(`, `),ae=e=>Array.isArray(e)?e.map((e,t)=>`<p class="mb-0"><a class="text-info" target="_blank" rel="noopener noreferrer" href="${V(F(e,`#`))}">Tập tin ${t+1}</a></p>`).filter(Boolean).join(``):``,g=(e,t,n=!1)=>{if(e===!1)return t;let r=t.find(t=>t.id===Number(e));return r?n?`<span class="badge badge-sm bg-gradient-${r.color}">${r.name}</span>`:r.name:``},oe=[{id:1,name:`Kích hoạt`,color:`success`},{id:0,name:`Khóa`,color:`danger`}],se=[{id:1,name:`Xuất bản`,color:`success`},{id:0,name:`Nháp`,color:`danger`}],ce=[{id:1,name:`Có`,color:`success`},{id:0,name:`Không`,color:`secondary`}],_=(e,t=!1)=>g(e,oe,t),v=(e,t=!1)=>g(e,se,t),y=(e,t=!1)=>g(e,ce,t);function b(e){let t=e instanceof Date?e:new Date(e);if(isNaN(t.getTime()))throw Error(`Ngày không hợp lệ: `+e);return t}function x(e){if(!e)return new Date;if(e instanceof Date)return new Date(e);let t=e.trim().toLowerCase();if(t===`now`)return new Date;let n=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)$/);if(r){let e=Number(r[1]);switch(r[2]){case`year`:case`years`:n.setFullYear(n.getFullYear()+e);break;case`month`:case`months`:n.setMonth(n.getMonth()+e);break;case`week`:case`weeks`:n.setDate(n.getDate()+e*7);break;case`day`:case`days`:n.setDate(n.getDate()+e);break;case`hour`:case`hours`:n.setHours(n.getHours()+e);break;case`minute`:case`minutes`:case`min`:case`mins`:n.setMinutes(n.getMinutes()+e);break;case`second`:case`seconds`:case`sec`:case`secs`:n.setSeconds(n.getSeconds()+e)}return n}let i=new Date(t);if(!isNaN(i.getTime()))return i;throw Error(`Invalid date expression: ${e}`)}var S=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`)}},C=e=>{let t=S(e);return t?`${t.dd}/${t.MM}/${t.yyyy} ${t.hh}:${t.mm}:${t.ss}`:e?`Invalid Date`:``},w=e=>{let t=S(e);return t?`${t.dd}/${t.MM}/${t.yyyy}`:e?`Invalid Date`:``},T=e=>{let t=S(e);return t?`${t.yyyy}`:e?`Invalid Date`:``},E=e=>{let t=S(e);return t?`${t.yyyy}-${t.MM}-${t.dd}`:e?`Invalid Date`:``},D=e=>{let t=new URLSearchParams(window.location.search);return e?Array.isArray(e)?e.reduce((e,n)=>(e[n]=t.get(n),e),{}):t.get(e):Object.fromEntries(t.entries())},O=e=>{let t=new URLSearchParams(window.location.search);return Object.entries(e).forEach(([e,n])=>{n===null?t.delete(e):t.set(e,n)}),t.toString()},k=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()},A=(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},j=(e,t=`/styles/default.jpg`)=>e?s(`STATIC_URL`)+(`/`+e).replaceAll(`//`,`/`):t,M=e=>e?s(`STATIC_URL`)+(`/`+e).replaceAll(`//`,`/`):``,N=(e,t=`/styles/default.jpg`)=>e?s(`API_URL`)+(`/`+e).replaceAll(`//`,`/`):t,P=(e,t=`/styles/default.jpg`)=>e?s(`UPLOADS_URL`)+`/`+e:t,F=(e,t=`/styles/default.jpg`)=>e?s(`UPLOADS_URL`)+`/`+e:t;function I(e){let t=``;for(let n=0;n<e;n++){let e=Math.floor(Math.random()*62);t+=`ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789`[e]}return t}function L(e){return new DOMParser().parseFromString(e,`text/html`).body.textContent||``}var R=/\.(jpg|jpeg|png|jfif|doc|docx|xls|xlsx|pdf)$/i,z=(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`)},B=(e,t=20,n=R)=>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 h(`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 h(`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()}),le={"&":`&amp;`,"<":`&lt;`,">":`&gt;`,'"':`&quot;`,"'":`&#39;`},V=e=>String(e??``).replace(/[&<>"']/g,e=>le[e]),H=new Set([`danger`,`success`,`warning`,`info`,`primary`,`secondary`,`light`,`dark`]),U=(e=``,t=`danger`,n={})=>{let r=H.has(t)?t:`danger`,i=e=>n.raw?e:V(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(``)},W=e=>(e.querySelectorAll(`input:not([type="hidden"]):not([type="checkbox"]):not([type="radio"]):not(.noReset), textarea`).forEach(e=>{e.value=``,e.dispatchEvent(new Event(`change`,{bubbles:!0}))}),e.querySelectorAll(`select:not(.noReset)`).forEach(e=>{let t=e.querySelector(`option[value=""]`);t?t.selected=!0:e.options.length>0&&(e.selectedIndex=0),e.dispatchEvent(new Event(`change`,{bubbles:!0}))}),e.querySelectorAll(`input[type="checkbox"]:not(.noReset)`).forEach(e=>{e.checked=!1,e.dispatchEvent(new Event(`change`,{bubbles:!0}))}),e.querySelectorAll(`input[type="radio"]:not(.noReset)`).forEach(e=>{e.checked=!1,e.dispatchEvent(new Event(`change`,{bubbles:!0}))}),e),ue=async(e,t,n=!1)=>{try{for(let r in t){let i=`[name="${r}"]:not([type="file"])`,o=e.querySelector(i);if(!o)continue;let s=o.type;if(t[r]&&![`checkbox`,`radio`].includes(s)){let e=(0,a.parse)(t[r],`yyyy-MM-dd`,new Date),n=(0,a.parse)(t[r],`yyyy-MM-dd HH:mm:ss`,new Date);o.value=(0,a.isValid)(e)&&t[r].length===10?(0,a.format)(e,`dd/MM/yyyy`):(0,a.isValid)(n)&&t[r].length===19?(0,a.format)(n,`dd/MM/yyyy HH:mm`):t[r],o.dispatchEvent(new Event(`change`,{bubbles:!0}))}else if(s===`checkbox`)o.checked=!!parseInt(t[r]),o.dispatchEvent(new Event(`change`,{bubbles:!0}));else if(s===`radio`){let n=e.querySelectorAll(`input[type="radio"][name="${r}"]`);n.forEach(e=>{e.checked=e.value===String(parseInt(t[r]))}),n.forEach(e=>e.dispatchEvent(new Event(`change`,{bubbles:!0})))}else if(n){let e=o.closest(`.form-group`);e&&e.classList.add(`hidden`)}}return t}catch(e){return Promise.reject(e)}},G=(e,t={})=>new Promise((n,r)=>{try{let r=window.jQuery,i=r(e);if(!i.length)throw Error(`invalid_elfinder`);let a={url:s(`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)}}),K=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)}}),de=(e,t,n=!1,r=!1)=>{if(!e)throw Error(`invalid_btnEl`);e.addEventListener(`click`,i=>{i.preventDefault(),K(t).then(t=>{let{modalEl:i,md:a}=t;G(`#elfinderStatic`).then(t=>{n&&n({data:t,btnEl:e,md:a})}),i.addEventListener(`hidden.bs.modal`,()=>{r&&r()}),a.show()})})},fe=(e,t,n=!1,r=!1)=>{if(!e)throw Error(`invalid_btnEl`);e.addEventListener(`click`,i=>{i.preventDefault(),K(t).then(t=>{let{modalEl:i,md:a}=t;G(`#elfinderStatic`,{url:s(`API_URL`)+`/elfinder/connectorFiles`}).then(t=>{n&&n({data:t,btnEl:e,md:a})}),i.addEventListener(`hidden.bs.modal`,()=>{r&&r()}),a.show()})})},q=e=>{if(typeof e==`string`&&(e=J(e,[])),!Array.isArray(e))return[];let t=e.map(e=>Number(e));return t=t.filter(e=>!Number.isNaN(e)),[...new Set(t)]};function J(e,t={},n=`ids`){let r=t;if(Array.isArray(e)&&(r=e),typeof e==`object`&&e&&(r=e),typeof e==`number`)return t;if(typeof e==`string`)try{let t=JSON.parse(e);Array.isArray(t)&&(r=t),typeof t==`object`&&t&&(r=t)}catch{return t}return n===`ids`&&(r=q(r)),r}var pe=(e,t={},n=`vi-VN`)=>e==null||Number.isNaN(e)?`0`:e.toLocaleString(n,t),me=e=>{if(!e)return new o.default(0);let t=String(e).replace(/[^\d.]/g,``);return t?new o.default(t):new o.default(0)},he=(e,t)=>[...new Set(e.map(e=>e[t]))],ge=(e,t,n,r,i)=>{let a=e.length,o=[];for(let s=0;s<a;s++){let a=t.find(t=>t[r]===e[s]);a&&o.push({[n]:e[s],[i]:a[i]})}return o},_e=(e,t)=>e.map(e=>{let n={};for(let r in t){let i=t[r];typeof i==`string`?n[r]=e[i]:typeof i==`function`&&(n[r]=i(e))}return n}),Y=(e,t,n=!1)=>{if(t.split(`-`).map(Number).includes(e))return!0;if(n)throw Error(`invalid_status`);return!1};function ve(e,t){return e?.reduce((e,n)=>e+(n[t]??0),0)||0}var ye=e=>{switch(e){case 3:return`tháng `+(new Date().getMonth()+1);case 4:return`năm `+new Date().getFullYear()}return``},be=(e=!1)=>{let t=[{id:1,name:`Tiếng Việt`}];return e===!1?t:t.find(t=>t.id===e)?.name||``},xe=class{routes=[];async addGS(e,t,n,r=!1,i=!1,a=!1,o=!1){let s={path:e,element:t,children:[{index:!0,element:n},{path:`page/:page`,element:n}]};i&&s.children.push({path:`detail/:id`,element:i}),r&&s.children.push({path:`create`,element:r}),r&&s.children.push({path:`edit/:id`,element:r}),a&&s.children.push({path:`import`,element:a}),o&&s.children.push({path:`fields`,element:o}),this.routes.push(s)}addRoute(e=[]){this.routes=[...this.routes,...e]}getRouter(){return this.routes}},X=(e,t,n,r,i,a)=>{if(!a)return!1;if(a===1)return!0;if(!Array.isArray(e))return!1;for(let o of e)if(o){if(o.module===t&&o.controller===n&&o.action===r&&Number(o.code)===Number(i))return o.status!==0&&!!o.isPer;if(Array.isArray(o.subs)&&o.subs.length>0&&X(o.subs,t,n,r,i,a))return!0}return!1},Z=null,Q=()=>{if(Z)return Z;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 Z=e,Z},$=new Proxy((()=>{}),{apply:(e,t,n)=>Q()(...n),get:(e,t)=>Q()[t]}),Se=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()!==$(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=$.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)=>{this.clearErrors($(t))}))}static getValue(e){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()??``}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($(n))})),this.toggleSubmit(),this};onInput=e=>{let t=this,n=$(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=$.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?$.Event(`invalid.bs.validator`,{relatedTarget:e[0],detail:a}):$.Event(`valid.bs.validator`,{relatedTarget:e[0],detail:n}),i.$element.trigger(r)),i.toggleSubmit(),i.$element.trigger($.Event(`validated.bs.validator`,{relatedTarget:e[0]}))})};runValidators=t=>{let n=[],r=$.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 c(e){return a(e)||o()||s()}return $.each(this.validators,$.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=c(r)||a,n.indexOf(a)===-1&&n.push(a))},this)),r.resolve(n),r.promise()};validate=()=>{let e=this;return $.when(this.$inputs.map((t,n)=>e.validateInput($(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&&($(`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=$(`<ul/>`).addClass(`list-unstyled`).append($.map(t,e=>{let t=$(`<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!!($(this).data(`bs.validator.errors`)||[]).length}).length;isIncomplete=()=>!!this.$inputs.filter(`[required]`).filter((t,n)=>{let r=e.getValue($(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=$(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=$(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=$(this),n=t.attr(`data-match`);n&&$(n).on(`input.bs.validator`,function(){e.getValue(t)&&t.trigger(`input.bs.validator`)})}),this.$inputs.filter((t,n)=>e.getValue($(n))&&!$(this).closest(`.has-error`).length).trigger(`focusout`),this.$element.attr(`novalidate`,!0)}};exports.ApiError=d,exports.CusRoute=xe,exports.Validator=Se,exports.buildAcceptRegExp=z,exports.buildFormData=u,exports.callFetchApi=te,exports.callFetchApiToken=f,exports.checkPermission=X,exports.checkUploadFile=B,exports.createModal=K,exports.createQueryString=k,exports.decimalNumber=me,exports.elFinderPopup=G,exports.escapeHtml=V,exports.filterIds=q,exports.formatDate=w,exports.formatDateSql=E,exports.formatDateTime=C,exports.formatNumber=pe,exports.formatYear=T,exports.getActiveStatus=_,exports.getEnv=t.t,exports.getFile=M,exports.getFilterType=ye,exports.getIdParams=A,exports.getImage=j,exports.getLangs=be,exports.getLinkFiles=ae,exports.getName=re,exports.getNames=ie,exports.getParams=D,exports.getPubImage=N,exports.getPublishStatus=v,exports.getStatus=g,exports.getTrueFlaseStatus=y,exports.getUploadFile=F,exports.getUploadImage=P,exports.htmlToText=L,exports.isStsNum=Y,exports.loadEnv=t.n,exports.loadScript=c,exports.loadScripts=l,exports.mapArrData=_e,exports.mapArrFields=he,exports.mapDataForm=ue,exports.mergeArrObject=ge,exports.parseDate=b,exports.randomString=I,exports.reloadEnv=t.r,exports.resetForm=W,exports.setParams=O,exports.showFinderFileModal=fe,exports.showFinderModal=de,exports.showMessage=U,exports.showSweetAlert=p,exports.showSweetAlertError=h,exports.showSweetAlertOk=m,exports.showSweetAlertWarning=ne,exports.spinnerLoader=ee,exports.strToDate=x,exports.stringToJson=J,exports.sumArrCol=ve;
11
+ </div>`);else{let e=n.querySelector(`.boxSpinner`);e&&e.remove()}}},u=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},d=class extends Error{errorCode;constructor(e,t){super(e),this.name=`ApiError`,this.errorCode=t}},te=async(e,t={},n=`POST`,r=`application/json`)=>{let i={method:n,headers:{"Content-Type":r,"Secret-Key":s(`SECRET_KEY`)},credentials:`include`};n==`POST`&&(i.body=JSON.stringify(t));let a=await(await fetch(e,i)).json();if(a.status==200)return a;throw a.msg?new d(a.msg,a.errorCode??`unknown`):Error(`invalid_response`)};async function f(e,t={},n=`POST`,r=`application/json`,i=!0){let a={"Secret-Key":s(`SECRET_KEY`)};r!==`multipart/form-data`&&(a[`Content-Type`]=r);let o={method:n,headers:a,credentials:`include`};if(n==`POST`&&(o.body=r===`multipart/form-data`?u(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 c=await(await fetch(e,o)).text(),l=null;if(c)try{l=JSON.parse(c)}catch{l=c}if(l&&typeof l!=`string`&&l.status==200)return l;if(l&&typeof l!=`string`&&l.msg&&i)throw new d(l.msg,l.errorCode??`unknown`);if(i)throw Error(`invalid_response`);return!1}var p=(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`}),m=(e,t=`top`,i=!1)=>{(0,r.default)(n.default).fire({toast:i,icon:`success`,position:t,title:e,showConfirmButton:!1,timer:1500})},ne=e=>{(0,r.default)(n.default).fire({icon:`warning`,title:e,showConfirmButton:!1,timer:1500})},h=e=>{(0,r.default)(n.default).fire({icon:`error`,position:`top`,title:e,showConfirmButton:!1})},re=(e,t,n=`name`)=>{let r=t?.find(t=>t.id===e);return r?r[n]??null:null},ie=(e,t,n=`name`)=>{let r=Array.isArray(e)?e:[],i=Array.isArray(t)?t:[];return r.map(e=>{let t=i.find(t=>t.id===e);return t?t[n]:null}).filter(Boolean).join(`, `)},ae=e=>Array.isArray(e)?e.map((e,t)=>`<p class="mb-0"><a class="text-info" target="_blank" rel="noopener noreferrer" href="${V(F(e,`#`))}">Tập tin ${t+1}</a></p>`).filter(Boolean).join(``):``,g=(e,t,n=!1)=>{if(e===!1)return t;let r=t.find(t=>t.id===Number(e));return r?n?`<span class="badge badge-sm bg-gradient-${r.color}">${r.name}</span>`:r.name:``},oe=[{id:1,name:`Kích hoạt`,color:`success`},{id:0,name:`Khóa`,color:`danger`}],se=[{id:1,name:`Xuất bản`,color:`success`},{id:0,name:`Nháp`,color:`danger`}],ce=[{id:1,name:`Có`,color:`success`},{id:0,name:`Không`,color:`secondary`}],_=(e,t=!1)=>g(e,oe,t),v=(e,t=!1)=>g(e,se,t),y=(e,t=!1)=>g(e,ce,t);function b(e){let t=e instanceof Date?e:new Date(e);if(isNaN(t.getTime()))throw Error(`Ngày không hợp lệ: `+e);return t}function x(e){if(!e)return new Date;if(e instanceof Date)return new Date(e);let t=e.trim().toLowerCase();if(t===`now`)return new Date;let n=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)$/);if(r){let e=Number(r[1]);switch(r[2]){case`year`:case`years`:n.setFullYear(n.getFullYear()+e);break;case`month`:case`months`:n.setMonth(n.getMonth()+e);break;case`week`:case`weeks`:n.setDate(n.getDate()+e*7);break;case`day`:case`days`:n.setDate(n.getDate()+e);break;case`hour`:case`hours`:n.setHours(n.getHours()+e);break;case`minute`:case`minutes`:case`min`:case`mins`:n.setMinutes(n.getMinutes()+e);break;case`second`:case`seconds`:case`sec`:case`secs`:n.setSeconds(n.getSeconds()+e)}return n}let i=new Date(t);if(!isNaN(i.getTime()))return i;throw Error(`Invalid date expression: ${e}`)}var S=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`)}},C=e=>{let t=S(e);return t?`${t.dd}/${t.MM}/${t.yyyy} ${t.hh}:${t.mm}:${t.ss}`:e?`Invalid Date`:``},w=e=>{let t=S(e);return t?`${t.dd}/${t.MM}/${t.yyyy}`:e?`Invalid Date`:``},T=e=>{let t=S(e);return t?`${t.yyyy}`:e?`Invalid Date`:``},E=e=>{let t=S(e);return t?`${t.yyyy}-${t.MM}-${t.dd}`:e?`Invalid Date`:``},D=e=>{let t=new URLSearchParams(window.location.search);return e?Array.isArray(e)?e.reduce((e,n)=>(e[n]=t.get(n),e),{}):t.get(e):Object.fromEntries(t.entries())},O=e=>{let t=new URLSearchParams(window.location.search);return Object.entries(e).forEach(([e,n])=>{n===null?t.delete(e):t.set(e,n)}),t.toString()},k=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()},A=(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},j=(e,t=`/styles/default.jpg`)=>e?s(`STATIC_URL`)+(`/`+e).replaceAll(`//`,`/`):t,M=e=>e?s(`STATIC_URL`)+(`/`+e).replaceAll(`//`,`/`):``,N=(e,t=`/styles/default.jpg`)=>e?s(`API_URL`)+(`/`+e).replaceAll(`//`,`/`):t,P=(e,t=`/styles/default.jpg`)=>e?s(`UPLOADS_URL`)+`/`+e:t,F=(e,t=`/styles/default.jpg`)=>e?s(`UPLOADS_URL`)+`/`+e:t;function I(e){let t=``;for(let n=0;n<e;n++){let e=Math.floor(Math.random()*62);t+=`ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789`[e]}return t}function L(e){return new DOMParser().parseFromString(e,`text/html`).body.textContent||``}var R=/\.(jpg|jpeg|png|jfif|doc|docx|xls|xlsx|pdf)$/i,z=(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`)},B=(e,t=20,n=R)=>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 h(`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 h(`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()}),le={"&":`&amp;`,"<":`&lt;`,">":`&gt;`,'"':`&quot;`,"'":`&#39;`},V=e=>String(e??``).replace(/[&<>"']/g,e=>le[e]),H=new Set([`danger`,`success`,`warning`,`info`,`primary`,`secondary`,`light`,`dark`]),U=(e=``,t=`danger`,n={})=>{let r=H.has(t)?t:`danger`,i=e=>n.raw?e:V(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(``)},W=e=>(e.querySelectorAll(`input:not([type="hidden"]):not([type="checkbox"]):not([type="radio"]):not(.noReset), textarea`).forEach(e=>{e.value=``,e.dispatchEvent(new Event(`change`,{bubbles:!0}))}),e.querySelectorAll(`select:not(.noReset)`).forEach(e=>{let t=e.querySelector(`option[value=""]`);t?t.selected=!0:e.options.length>0&&(e.selectedIndex=0),e.dispatchEvent(new Event(`change`,{bubbles:!0}))}),e.querySelectorAll(`input[type="checkbox"]:not(.noReset)`).forEach(e=>{e.checked=!1,e.dispatchEvent(new Event(`change`,{bubbles:!0}))}),e.querySelectorAll(`input[type="radio"]:not(.noReset)`).forEach(e=>{e.checked=!1,e.dispatchEvent(new Event(`change`,{bubbles:!0}))}),e),ue=async(e,t,n=!1)=>{try{for(let r in t){let i=`[name="${r}"]:not([type="file"])`,o=e.querySelector(i);if(!o)continue;let s=o.type,c=t[r];if(c&&![`checkbox`,`radio`].includes(s)){let e=String(c),t=(0,a.parse)(e,`yyyy-MM-dd`,new Date),n=(0,a.parse)(e,`yyyy-MM-dd HH:mm:ss`,new Date);o.value=(0,a.isValid)(t)&&e.length===10?(0,a.format)(t,`dd/MM/yyyy`):(0,a.isValid)(n)&&e.length===19?(0,a.format)(n,`dd/MM/yyyy HH:mm`):e,o.dispatchEvent(new Event(`change`,{bubbles:!0}))}else if(s===`checkbox`)o.checked=!!parseInt(String(c)),o.dispatchEvent(new Event(`change`,{bubbles:!0}));else if(s===`radio`){let t=e.querySelectorAll(`input[type="radio"][name="${r}"]`);t.forEach(e=>{e.checked=e.value===String(parseInt(String(c)))}),t.forEach(e=>e.dispatchEvent(new Event(`change`,{bubbles:!0})))}else if(n){let e=o.closest(`.form-group`);e&&e.classList.add(`hidden`)}}return t}catch(e){return Promise.reject(e)}},G=(e,t={})=>new Promise((n,r)=>{try{let r=window.jQuery,i=r(e);if(!i.length)throw Error(`invalid_elfinder`);let a={url:s(`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)}}),de=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)}},K=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)}}),fe=(e,t,n=!1,r=!1)=>{if(!e)throw Error(`invalid_btnEl`);e.addEventListener(`click`,i=>{i.preventDefault(),K(t).then(({modalEl:t,md:i})=>{G(`#elfinderStatic`).then(t=>{n&&n({data:t,btnEl:e,md:i})}),t.addEventListener(`hidden.bs.modal`,()=>{r&&r()}),i.show()})})},pe=(e,t,n=!1,r=!1)=>{if(!e)throw Error(`invalid_btnEl`);e.addEventListener(`click`,i=>{i.preventDefault(),K(t).then(({modalEl:t,md:i})=>{G(`#elfinderStatic`,{url:s(`API_URL`)+`/elfinder/connectorFiles`}).then(t=>{n&&n({data:t,btnEl:e,md:i})}),t.addEventListener(`hidden.bs.modal`,()=>{r&&r()}),i.show()})})},q=e=>{if(typeof e==`string`&&(e=J(e,[])),!Array.isArray(e))return[];let t=e.map(e=>Number(e)).filter(e=>!Number.isNaN(e));return[...new Set(t)]};function J(e,t={},n=`ids`){let r=t;if(Array.isArray(e)&&(r=e),typeof e==`object`&&e&&(r=e),typeof e==`number`)return t;if(typeof e==`string`)try{let t=JSON.parse(e);Array.isArray(t)&&(r=t),typeof t==`object`&&t&&(r=t)}catch{return t}return n===`ids`&&(r=q(r)),r}var me=(e,t={},n=`vi-VN`)=>e==null||Number.isNaN(e)?`0`:e.toLocaleString(n,t),he=e=>{if(!e)return new o.default(0);let t=String(e).replace(/[^\d.]/g,``);return t?new o.default(t):new o.default(0)},ge=(e,t)=>[...new Set((Array.isArray(e)?e:[]).map(e=>e[t]))],_e=(e,t,n,r,i)=>{let a=e.length,o=[];for(let s=0;s<a;s++){let a=t.find(t=>t[r]===e[s]);a&&o.push({[n]:e[s],[i]:a[i]})}return o},Y=(e,t)=>(Array.isArray(e)?e:[]).map(e=>{let n={};for(let r in t){let i=t[r];typeof i==`string`?n[r]=e[i]:typeof i==`function`&&(n[r]=i(e))}return n}),ve=(e,t,n=!1)=>{if((t??``).split(`-`).map(Number).includes(e))return!0;if(n)throw Error(`invalid_status`);return!1};function ye(e,t){return e?.reduce((e,n)=>e+(n[t]??0),0)||0}var be=e=>{switch(e){case 3:return`tháng `+(new Date().getMonth()+1);case 4:return`năm `+new Date().getFullYear()}return``},xe=(e=!1)=>{let t=[{id:1,name:`Tiếng Việt`}];return e===!1?t:t.find(t=>t.id===e)?.name||``},Se=class{routes=[];async addGS(e,t,n,r=!1,i=!1,a=!1,o=!1){let s={path:e,element:t,children:[{index:!0,element:n},{path:`page/:page`,element:n}]};i&&s.children.push({path:`detail/:id`,element:i}),r&&s.children.push({path:`create`,element:r}),r&&s.children.push({path:`edit/:id`,element:r}),a&&s.children.push({path:`import`,element:a}),o&&s.children.push({path:`fields`,element:o}),this.routes.push(s)}addRoute(e=[]){this.routes=[...this.routes,...e]}getRouter(){return this.routes}},X=(e,t,n,r,i,a)=>{if(!a)return!1;if(a===1)return!0;if(!Array.isArray(e))return!1;for(let o of e)if(o){if(o.module===t&&o.controller===n&&o.action===r&&Number(o.code)===Number(i))return o.status!==0&&!!o.isPer;if(Array.isArray(o.subs)&&o.subs.length>0&&X(o.subs,t,n,r,i,a))return!0}return!1},Z=null,Q=()=>{if(Z)return Z;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 Z=e,Z},$=new Proxy((()=>{}),{apply:(e,t,n)=>Q()(...n),get:(e,t)=>Q()[t]}),Ce=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()!==$(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=$.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)=>{this.clearErrors($(t))}))}static getValue(e){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()??``}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($(n))})),this.toggleSubmit(),this};onInput=e=>{let t=this,n=$(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=$.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?$.Event(`invalid.bs.validator`,{relatedTarget:e[0],detail:a}):$.Event(`valid.bs.validator`,{relatedTarget:e[0],detail:n}),i.$element.trigger(r)),i.toggleSubmit(),i.$element.trigger($.Event(`validated.bs.validator`,{relatedTarget:e[0]}))})};runValidators=t=>{let n=[],r=$.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 c(e){return a(e)||o()||s()}return $.each(this.validators,$.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=c(r)||a,n.indexOf(a)===-1&&n.push(a))},this)),r.resolve(n),r.promise()};validate=()=>{let e=this;return $.when(this.$inputs.map((t,n)=>e.validateInput($(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&&($(`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=$(`<ul/>`).addClass(`list-unstyled`).append($.map(t,e=>{let t=$(`<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!!($(this).data(`bs.validator.errors`)||[]).length}).length;isIncomplete=()=>!!this.$inputs.filter(`[required]`).filter((t,n)=>{let r=e.getValue($(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=$(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=$(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=$(this),n=t.attr(`data-match`);n&&$(n).on(`input.bs.validator`,function(){e.getValue(t)&&t.trigger(`input.bs.validator`)})}),this.$inputs.filter((t,n)=>e.getValue($(n))&&!$(this).closest(`.has-error`).length).trigger(`focusout`),this.$element.attr(`novalidate`,!0)}};exports.ApiError=d,exports.CusRoute=Se,exports.Validator=Ce,exports.buildAcceptRegExp=z,exports.buildFormData=u,exports.callFetchApi=te,exports.callFetchApiToken=f,exports.checkPermission=X,exports.checkUploadFile=B,exports.createModal=K,exports.createQueryString=k,exports.decimalNumber=he,exports.elFinderPopup=G,exports.errorMessage=de,exports.escapeHtml=V,exports.filterIds=q,exports.formatDate=w,exports.formatDateSql=E,exports.formatDateTime=C,exports.formatNumber=me,exports.formatYear=T,exports.getActiveStatus=_,exports.getEnv=t.t,exports.getFile=M,exports.getFilterType=be,exports.getIdParams=A,exports.getImage=j,exports.getLangs=xe,exports.getLinkFiles=ae,exports.getName=re,exports.getNames=ie,exports.getParams=D,exports.getPubImage=N,exports.getPublishStatus=v,exports.getStatus=g,exports.getTrueFlaseStatus=y,exports.getUploadFile=F,exports.getUploadImage=P,exports.htmlToText=L,exports.isStsNum=ve,exports.loadEnv=t.n,exports.loadScript=c,exports.loadScripts=l,exports.mapArrData=Y,exports.mapArrFields=ge,exports.mapDataForm=ue,exports.mergeArrObject=_e,exports.parseDate=b,exports.randomString=I,exports.reloadEnv=t.r,exports.resetForm=W,exports.setParams=O,exports.showFinderFileModal=pe,exports.showFinderModal=fe,exports.showMessage=U,exports.showSweetAlert=p,exports.showSweetAlertError=h,exports.showSweetAlertOk=m,exports.showSweetAlertWarning=ne,exports.spinnerLoader=ee,exports.strToDate=x,exports.stringToJson=J,exports.sumArrCol=ye;
@@ -52,7 +52,7 @@ var u = (e) => n()[e] ?? "", d = (e) => new Promise((t, n) => {
52
52
  t.append(e, JSON.stringify(n));
53
53
  return;
54
54
  }
55
- t.append(e, n);
55
+ n != null && typeof n != "function" && typeof n != "object" && t.append(e, String(n));
56
56
  }
57
57
  }), t;
58
58
  }, p = class extends Error {
@@ -137,10 +137,13 @@ var g = (e = "Bạn có chắc muốn thực hiện thao tác này ?", t = "Đ
137
137
  }, ie = (e, t, n = "name") => {
138
138
  let r = t?.find((t) => t.id === e);
139
139
  return r ? r[n] ?? null : null;
140
- }, ae = (e, t, n = "name") => e.map((e) => {
141
- let r = t.find((t) => t.id === e);
142
- return r ? r[n] : null;
143
- }).filter(Boolean).join(", "), oe = (e) => Array.isArray(e) ? e.map((e, t) => `<p class="mb-0"><a class="text-info" target="_blank" rel="noopener noreferrer" href="${W(R(e, "#"))}">Tập tin ${t + 1}</a></p>`).filter(Boolean).join("") : "", v = (e, t, n = !1) => {
140
+ }, ae = (e, t, n = "name") => {
141
+ let r = Array.isArray(e) ? e : [], i = Array.isArray(t) ? t : [];
142
+ return r.map((e) => {
143
+ let t = i.find((t) => t.id === e);
144
+ return t ? t[n] : null;
145
+ }).filter(Boolean).join(", ");
146
+ }, oe = (e) => Array.isArray(e) ? e.map((e, t) => `<p class="mb-0"><a class="text-info" target="_blank" rel="noopener noreferrer" href="${W(R(e, "#"))}">Tập tin ${t + 1}</a></p>`).filter(Boolean).join("") : "", v = (e, t, n = !1) => {
144
147
  if (e === !1) return t;
145
148
  let r = t.find((t) => t.id === Number(e));
146
149
  return r ? n ? `<span class="badge badge-sm bg-gradient-${r.color}">${r.name}</span>` : r.name : "";
@@ -325,16 +328,16 @@ var V = /\.(jpg|jpeg|png|jfif|doc|docx|xls|xlsx|pdf)$/i, H = (e, t) => {
325
328
  for (let r in t) {
326
329
  let i = `[name="${r}"]:not([type="file"])`, a = e.querySelector(i);
327
330
  if (!a) continue;
328
- let l = a.type;
329
- if (t[r] && !["checkbox", "radio"].includes(l)) {
330
- let e = c(t[r], "yyyy-MM-dd", /* @__PURE__ */ new Date()), n = c(t[r], "yyyy-MM-dd HH:mm:ss", /* @__PURE__ */ new Date());
331
- a.value = s(e) && t[r].length === 10 ? o(e, "dd/MM/yyyy") : s(n) && t[r].length === 19 ? o(n, "dd/MM/yyyy HH:mm") : t[r], a.dispatchEvent(new Event("change", { bubbles: !0 }));
332
- } else if (l === "checkbox") a.checked = !!parseInt(t[r]), a.dispatchEvent(new Event("change", { bubbles: !0 }));
331
+ let l = a.type, u = t[r];
332
+ if (u && !["checkbox", "radio"].includes(l)) {
333
+ let e = String(u), t = c(e, "yyyy-MM-dd", /* @__PURE__ */ new Date()), n = c(e, "yyyy-MM-dd HH:mm:ss", /* @__PURE__ */ new Date());
334
+ a.value = s(t) && e.length === 10 ? o(t, "dd/MM/yyyy") : s(n) && e.length === 19 ? o(n, "dd/MM/yyyy HH:mm") : e, a.dispatchEvent(new Event("change", { bubbles: !0 }));
335
+ } else if (l === "checkbox") a.checked = !!parseInt(String(u)), a.dispatchEvent(new Event("change", { bubbles: !0 }));
333
336
  else if (l === "radio") {
334
- let n = e.querySelectorAll(`input[type="radio"][name="${r}"]`);
335
- n.forEach((e) => {
336
- e.checked = e.value === String(parseInt(t[r]));
337
- }), n.forEach((e) => e.dispatchEvent(new Event("change", { bubbles: !0 })));
337
+ let t = e.querySelectorAll(`input[type="radio"][name="${r}"]`);
338
+ t.forEach((e) => {
339
+ e.checked = e.value === String(parseInt(String(u)));
340
+ }), t.forEach((e) => e.dispatchEvent(new Event("change", { bubbles: !0 })));
338
341
  } else if (n) {
339
342
  let e = a.closest(".form-group");
340
343
  e && e.classList.add("hidden");
@@ -366,7 +369,15 @@ var V = /\.(jpg|jpeg|png|jfif|doc|docx|xls|xlsx|pdf)$/i, H = (e, t) => {
366
369
  } catch (e) {
367
370
  r(e);
368
371
  }
369
- }), K = (e) => new Promise((t, n) => {
372
+ }), me = (e) => {
373
+ if (e instanceof Error) return e.message;
374
+ if (typeof e == "string") return e;
375
+ try {
376
+ return JSON.stringify(e) ?? String(e);
377
+ } catch {
378
+ return String(e);
379
+ }
380
+ }, K = (e) => new Promise((t, n) => {
370
381
  try {
371
382
  let n = typeof e == "string" ? document.querySelector(e) : e;
372
383
  if (!n) throw Error("invalid_modalEl_btnEl");
@@ -386,42 +397,40 @@ var V = /\.(jpg|jpeg|png|jfif|doc|docx|xls|xlsx|pdf)$/i, H = (e, t) => {
386
397
  } catch (e) {
387
398
  console.log(e), n(e);
388
399
  }
389
- }), me = (e, t, n = !1, r = !1) => {
400
+ }), he = (e, t, n = !1, r = !1) => {
390
401
  if (!e) throw Error("invalid_btnEl");
391
402
  e.addEventListener("click", (i) => {
392
- i.preventDefault(), K(t).then((t) => {
393
- let { modalEl: i, md: a } = t;
403
+ i.preventDefault(), K(t).then(({ modalEl: t, md: i }) => {
394
404
  G("#elfinderStatic").then((t) => {
395
405
  n && n({
396
406
  data: t,
397
407
  btnEl: e,
398
- md: a
408
+ md: i
399
409
  });
400
- }), i.addEventListener("hidden.bs.modal", () => {
410
+ }), t.addEventListener("hidden.bs.modal", () => {
401
411
  r && r();
402
- }), a.show();
412
+ }), i.show();
403
413
  });
404
414
  });
405
- }, he = (e, t, n = !1, r = !1) => {
415
+ }, ge = (e, t, n = !1, r = !1) => {
406
416
  if (!e) throw Error("invalid_btnEl");
407
417
  e.addEventListener("click", (i) => {
408
- i.preventDefault(), K(t).then((t) => {
409
- let { modalEl: i, md: a } = t;
418
+ i.preventDefault(), K(t).then(({ modalEl: t, md: i }) => {
410
419
  G("#elfinderStatic", { url: u("API_URL") + "/elfinder/connectorFiles" }).then((t) => {
411
420
  n && n({
412
421
  data: t,
413
422
  btnEl: e,
414
- md: a
423
+ md: i
415
424
  });
416
- }), i.addEventListener("hidden.bs.modal", () => {
425
+ }), t.addEventListener("hidden.bs.modal", () => {
417
426
  r && r();
418
- }), a.show();
427
+ }), i.show();
419
428
  });
420
429
  });
421
430
  }, q = (e) => {
422
431
  if (typeof e == "string" && (e = J(e, [])), !Array.isArray(e)) return [];
423
- let t = e.map((e) => Number(e));
424
- return t = t.filter((e) => !Number.isNaN(e)), [...new Set(t)];
432
+ let t = e.map((e) => Number(e)).filter((e) => !Number.isNaN(e));
433
+ return [...new Set(t)];
425
434
  };
426
435
  function J(e, t = {}, n = "ids") {
427
436
  let r = t;
@@ -434,11 +443,11 @@ function J(e, t = {}, n = "ids") {
434
443
  }
435
444
  return n === "ids" && (r = q(r)), r;
436
445
  }
437
- var ge = (e, t = {}, n = "vi-VN") => e == null || Number.isNaN(e) ? "0" : e.toLocaleString(n, t), _e = (e) => {
446
+ var _e = (e, t = {}, n = "vi-VN") => e == null || Number.isNaN(e) ? "0" : e.toLocaleString(n, t), ve = (e) => {
438
447
  if (!e) return new l(0);
439
448
  let t = String(e).replace(/[^\d.]/g, "");
440
449
  return t ? new l(t) : new l(0);
441
- }, ve = (e, t) => [...new Set(e.map((e) => e[t]))], ye = (e, t, n, r, i) => {
450
+ }, ye = (e, t) => [...new Set((Array.isArray(e) ? e : []).map((e) => e[t]))], be = (e, t, n, r, i) => {
442
451
  let a = e.length, o = [];
443
452
  for (let s = 0; s < a; s++) {
444
453
  let a = t.find((t) => t[r] === e[s]);
@@ -448,34 +457,34 @@ var ge = (e, t = {}, n = "vi-VN") => e == null || Number.isNaN(e) ? "0" : e.toLo
448
457
  });
449
458
  }
450
459
  return o;
451
- }, be = (e, t) => e.map((e) => {
460
+ }, xe = (e, t) => (Array.isArray(e) ? e : []).map((e) => {
452
461
  let n = {};
453
462
  for (let r in t) {
454
463
  let i = t[r];
455
464
  typeof i == "string" ? n[r] = e[i] : typeof i == "function" && (n[r] = i(e));
456
465
  }
457
466
  return n;
458
- }), xe = (e, t, n = !1) => {
459
- if (t.split("-").map(Number).includes(e)) return !0;
467
+ }), Se = (e, t, n = !1) => {
468
+ if ((t ?? "").split("-").map(Number).includes(e)) return !0;
460
469
  if (n) throw Error("invalid_status");
461
470
  return !1;
462
471
  };
463
- function Se(e, t) {
472
+ function Ce(e, t) {
464
473
  return e?.reduce((e, n) => e + (n[t] ?? 0), 0) || 0;
465
474
  }
466
- var Ce = (e) => {
475
+ var we = (e) => {
467
476
  switch (e) {
468
477
  case 3: return "tháng " + ((/* @__PURE__ */ new Date()).getMonth() + 1);
469
478
  case 4: return "năm " + (/* @__PURE__ */ new Date()).getFullYear();
470
479
  }
471
480
  return "";
472
- }, we = (e = !1) => {
481
+ }, Y = (e = !1) => {
473
482
  let t = [{
474
483
  id: 1,
475
484
  name: "Tiếng Việt"
476
485
  }];
477
486
  return e === !1 ? t : t.find((t) => t.id === e)?.name || "";
478
- }, Y = class {
487
+ }, Te = class {
479
488
  routes = [];
480
489
  async addGS(e, t, n, r = !1, i = !1, a = !1, o = !1) {
481
490
  let s = {
@@ -529,7 +538,7 @@ var Ce = (e) => {
529
538
  }, $ = new Proxy((() => {}), {
530
539
  apply: (e, t, n) => Q()(...n),
531
540
  get: (e, t) => Q()[t]
532
- }), Te = class e {
541
+ }), Ee = class e {
533
542
  options;
534
543
  validators;
535
544
  $element;
@@ -705,4 +714,4 @@ var Ce = (e) => {
705
714
  };
706
715
  };
707
716
  //#endregion
708
- export { p as ApiError, Y as CusRoute, Te as Validator, H as buildAcceptRegExp, f as buildFormData, m as callFetchApi, h as callFetchApiToken, X as checkPermission, le as checkUploadFile, K as createModal, M as createQueryString, _e as decimalNumber, G as elFinderPopup, W as escapeHtml, q as filterIds, D as formatDate, k as formatDateSql, E as formatDateTime, ge as formatNumber, O as formatYear, b as getActiveStatus, n as getEnv, F as getFile, Ce as getFilterType, N as getIdParams, P as getImage, we as getLangs, oe as getLinkFiles, ie as getName, ae as getNames, A as getParams, I as getPubImage, x as getPublishStatus, v as getStatus, S as getTrueFlaseStatus, R as getUploadFile, L as getUploadImage, B as htmlToText, xe as isStsNum, e as loadEnv, d as loadScript, ee as loadScripts, be as mapArrData, ve as mapArrFields, pe as mapDataForm, ye as mergeArrObject, C as parseDate, z as randomString, t as reloadEnv, fe as resetForm, j as setParams, he as showFinderFileModal, me as showFinderModal, de as showMessage, g as showSweetAlert, _ as showSweetAlertError, ne as showSweetAlertOk, re as showSweetAlertWarning, te as spinnerLoader, w as strToDate, J as stringToJson, Se as sumArrCol };
717
+ export { p as ApiError, Te as CusRoute, Ee as Validator, H as buildAcceptRegExp, f as buildFormData, m as callFetchApi, h as callFetchApiToken, X as checkPermission, le as checkUploadFile, K as createModal, M as createQueryString, ve as decimalNumber, G as elFinderPopup, me as errorMessage, W as escapeHtml, q as filterIds, D as formatDate, k as formatDateSql, E as formatDateTime, _e as formatNumber, O as formatYear, b as getActiveStatus, n as getEnv, F as getFile, we as getFilterType, N as getIdParams, P as getImage, Y as getLangs, oe as getLinkFiles, ie as getName, ae as getNames, A as getParams, I as getPubImage, x as getPublishStatus, v as getStatus, S as getTrueFlaseStatus, R as getUploadFile, L as getUploadImage, B as htmlToText, Se as isStsNum, e as loadEnv, d as loadScript, ee as loadScripts, xe as mapArrData, ye as mapArrFields, pe as mapDataForm, be as mergeArrObject, C as parseDate, z as randomString, t as reloadEnv, fe as resetForm, j as setParams, ge as showFinderFileModal, he as showFinderModal, de as showMessage, g as showSweetAlert, _ as showSweetAlertError, ne as showSweetAlertOk, re as showSweetAlertWarning, te as spinnerLoader, w as strToDate, J as stringToJson, Ce as sumArrCol };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@materialui-reactjs/admin",
3
- "version": "2.0.0",
3
+ "version": "2.0.1",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
@@ -1,11 +0,0 @@
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}t.append(e,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=>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)}}),M=(e,t,n=!1,r=!1)=>{if(!e)throw Error(`invalid_btnEl`);e.addEventListener(`click`,i=>{i.preventDefault(),j(t).then(t=>{let{modalEl:i,md:a}=t;A(`#elfinderStatic`).then(t=>{n&&n({data:t,btnEl:e,md:a})}),i.addEventListener(`hidden.bs.modal`,()=>{r&&r()}),a.show()})})},N=(e,t,n=!1,r=!1)=>{if(!e)throw Error(`invalid_btnEl`);e.addEventListener(`click`,i=>{i.preventDefault(),j(t).then(t=>{let{modalEl:i,md:a}=t;A(`#elfinderStatic`,{url:o(`API_URL`)+`/elfinder/connectorFiles`}).then(t=>{n&&n({data:t,btnEl:e,md:a})}),i.addEventListener(`hidden.bs.modal`,()=>{r&&r()}),a.show()})})},P=(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,"_",{enumerable:!0,get:function(){return k}}),Object.defineProperty(exports,"a",{enumerable:!0,get:function(){return g}}),Object.defineProperty(exports,"b",{enumerable:!0,get:function(){return f}}),Object.defineProperty(exports,"c",{enumerable:!0,get:function(){return y}}),Object.defineProperty(exports,"d",{enumerable:!0,get:function(){return P}}),Object.defineProperty(exports,"f",{enumerable:!0,get:function(){return b}}),Object.defineProperty(exports,"g",{enumerable:!0,get:function(){return M}}),Object.defineProperty(exports,"h",{enumerable:!0,get:function(){return N}}),Object.defineProperty(exports,"i",{enumerable:!0,get:function(){return j}}),Object.defineProperty(exports,"l",{enumerable:!0,get:function(){return _}}),Object.defineProperty(exports,"m",{enumerable:!0,get:function(){return S}}),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 x}}),Object.defineProperty(exports,"r",{enumerable:!0,get:function(){return T}}),Object.defineProperty(exports,"s",{enumerable:!0,get:function(){return h}}),Object.defineProperty(exports,"t",{enumerable:!0,get:function(){return w}}),Object.defineProperty(exports,"u",{enumerable:!0,get:function(){return v}}),Object.defineProperty(exports,"v",{enumerable:!0,get:function(){return d}}),Object.defineProperty(exports,"x",{enumerable:!0,get:function(){return s}}),Object.defineProperty(exports,"y",{enumerable:!0,get:function(){return p}});