@flast-erp/core 1.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,2 @@
1
+ import t from"@babel/runtime/helpers/objectWithoutProperties";import e from"@babel/runtime/helpers/defineProperty";import o from"lodash/mapKeys";import r from"axios";import n from"i18next";import{random as i,pickBy as a,identity as s}from"lodash";import l from"moment";import c from"dayjs";import{notification as u,Upload as d}from"antd";import m from"lodash/forEach";import h from"lodash/last";import p from"lodash/head";import{jsx as f}from"react/jsx-runtime";const g="outsideFilter",v=["png","jpg","jpeg","gif","tif","tiff"];o([{id:11,name:"Web"},{id:1,name:"Facebook"},{id:2,name:"Zalo"},{id:3,name:"Hotline"},{id:4,name:"Trực tiếp"},{id:5,name:"Email"},{id:6,name:"MKT0D"},{id:7,name:"Giới thiệu"},{id:8,name:"Cskh"},{id:9,name:"Partner"},{id:10,name:"Shopee"}],"id");o([{id:1,name:"Chưa liên hệ"},{id:2,name:"Đã liên hệ"}],"id");o([{text:"Doanh số",value:"doanhso"},{text:"SQL",value:"sql"},{text:"Trafic",value:"trafic"}],"value");o([{text:"Cao",value:"cao",color:"red"},{text:"Trung bình",value:"trungbinh",color:"purple"},{text:"Thấp",value:"thap",color:"green"}],"value");o([{value:1,name:"IT",color:"blue"},{value:2,name:"Marketing",color:"green"},{value:3,name:"Kinhdoanh",color:"purple"},{value:4,name:"Khác",color:"orange"}],"value");const y="CHANGE_STORE",w="add__user",b="f5_list",M="in_app_noti",S="",Y=()=>S,j=["title"];function D(t,e){var o=Object.keys(t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(t);e&&(r=r.filter(function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable})),o.push.apply(o,r)}return o}function O(t){for(var o=1;o<arguments.length;o++){var r=null!=arguments[o]?arguments[o]:{};o%2?D(Object(r),!0).forEach(function(o){e(t,o,r[o])}):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(r)):D(Object(r)).forEach(function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(r,e))})}return t}class A{constructor(){this.events={}}_getEventListByName(t){return void 0===this.events[t]&&(this.events[t]=new Set),this.events[t]}on(t,e){this._getEventListByName(t).add(e)}once(t,e){const o=this,r=function(){o.removeListener(t,r);for(var n=arguments.length,i=new Array(n),a=0;a<n;a++)i[a]=arguments[a];e.apply(o,i)};this.on(t,r)}emit(t){for(var e=arguments.length,o=new Array(e>1?e-1:0),r=1;r<e;r++)o[r-1]=arguments[r];this._getEventListByName(t).forEach(function(t){t.apply(this,o)}.bind(this))}addEventListener(t,e){this.on(t,e)}removeListener(t,e){this._getEventListByName(t).delete(e)}}class E{static hasPermission(t,e){return"*"===t||(""===(t||"")||(0===t.length||e))}static generateRoutesFromConfigs(t,e){let o=[];return t.forEach(t=>{o=[...o,...this.setRoutes(t,e)]}),o}static setRoutes(t,e){let o=[...t.routes];return(t.settings||t.auth)&&(o=o.map(o=>{let r=t.auth?[...t.auth]:e||null;return r=o.auth?[...r,...o.auth]:r,O(O({},o),{},{settings:O(O({},t.settings),o.settings),auth:r})})),[...o]}}e(E,"EventEmitter",A);const T={CONTRACT_FORM:"CONTRACT_FORM"},N=new class extends A{constructor(){super(...arguments),e(this,"openDrawer",(e,o)=>{let r=o.title,n=t(o,j);return this.emit("#modal",{hash:e,title:r,data:n})})}normalSuccess(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;this.emit(M,{type:"success",content:t,title:e})}normalInfo(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;this.emit(M,{type:"info",content:t,title:e})}normalError(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;this.emit(M,{type:"error",content:t,title:e})}modal(t,e){this.emit(M,{type:e,content:t,cate:"modal"})}changeStore(t){this.emit(y,t)}};class L{static encodeQueryData(t){if(!t)return"";const e=[];for(let o in t)t[o]&&e.push(encodeURIComponent(o)+"="+encodeURIComponent(t[o]));return e.length>0?"?"+e.join("&"):""}static generateUrlGetParams(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return String(t).concat(this.encodeQueryData(e))}static httpRequest(t,e){let o=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"GET",n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"";const i=Y()+e;let a;return a="GET"===o?r.get(i+this.encodeQueryData(t)):r.post(i+this.encodeQueryData(n),t),a.then(t=>t.data).catch(t=>t)}static Get(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return this.httpRequest(e,t,"GET")}static async GetAsList(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},o=await this.httpRequest(e,t,"GET"),r=o.data;return 200===o.errorCode?r:[]}static Post(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},o=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return this.httpRequest(e,t,"POST",o)}static getJsonFromUrl(t){if(!t)return{};var e=t.substr(1),o={};return e.split("&").forEach(function(t){var e=t.split("=");o[e[0]]=decodeURIComponent(e[1])}),o}}e(L,"uploadSigFile",t=>{let e=t.onSuccess,o=t.onError,n=t.file,i=t.onProgress,a=void 0===i?t=>t:i,s=t.onSuccessUploadServer,l=void 0===s?t=>t:s,c=t.api;const u=new FormData,d={headers:{"content-type":"multipart/form-data"},onUploadProgress:t=>{a({percent:t.loaded/t.total*100},n)}};u.append("files",n),r.post(Y()+"/"+c,u,d).then(t=>{let o=t.data;const r=o.data,i=o.errorCode;e(n),200===i&&""!==((null==r?void 0:r.fileName)||"")&&l(r.fileName)}).catch(t=>{const e=new Error(t.message);o({event:e})})});const P=(t,e)=>(null==t?void 0:t[n.language])||e,k=function(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";return N.emit(y,{type:b,data:{apiPath:t,random:i()}})},C=t=>{const e=t.errorCode,o=t.data;return 200===e?o:[]},R=t=>{const e=t.errorCode,o=t.data;return 200===e?o:{}},_=t=>{const e=t.errorCode,o=t.data;return 200===e?o:{}},x=t=>Array.isArray(t)&&t.length>0,F=t=>!x(t);function I(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[];if(x(t))return t.forEach(t=>I(t,e)),t;if(!t||"object"!=typeof t)return t;for(let o of e){const e=t[o];e&&"string"==typeof e&&(t[o]=JSON.parse(e))}return t}function U(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[];if(!t||"object"!=typeof t)return t;if(!x(e))return JSON.stringify(t);for(let o of e){const e=t[o];e&&"object"==typeof e&&(t[o]=JSON.stringify(e))}return t}const G=function(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[],o=arguments.length>2?arguments[2]:void 0;if(t&&e)for(let r of e){const e=t[r];!e||"string"!=typeof e&&"number"!=typeof e||(t[r]=c(new Date(e),o))}},H=function(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[],o=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"YYYY-MM-DD HH:mm:ss";if("object"!=typeof t)return c(t).format(o);for(let r of e){const e=t[r];e&&(t[r]=c(e).format(o))}return t},$=function(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"DD-MM-YYYY";return t?l(new Date(t)).format(e):"N/a"},z=t=>t?t.toLocaleString("it-IT")+" đ":"0 đ",B=t=>(t.total||0)*(t.vatPercent/100),q=t=>{if(!t)return["(empty)",null];if("string"!=typeof t)return["(invalid)",null];try{return[null,JSON.parse(t)]}catch(t){return[t,null]}},J=t=>{u.error({message:n.t("error.title"),description:t||n.t("error.errorDownloadFile"),duration:2})},Q=t=>{const e=V(t);return!!e&&v.includes(e.toLocaleLowerCase())},W=t=>{var e;return null==t||null===(e=t.split("/"))||void 0===e?void 0:e.pop()},K=t=>{var e;return null===(e=t.type)||void 0===e||e.trim(),!0},V=t=>"string"!=typeof t||-1===t.indexOf(".")?"":t.split(".").pop(),Z=(t,e)=>!!(Number(t.size)/1024/1024<3)||(u.error({message:n.t("error.title"),description:n.t("error.fileSize",{name:n.t(e)}),duration:2}),d.LIST_IGNORE),X=async t=>new Promise(e=>{null!=t&&t.url||(J(),e({loading:!1}));try{r.get(t.url,{responseType:"blob"}).then(o=>{const r=o.data;r||e({loading:!1});o.headers["content-disposition"];const n=t.fileName||W(t.url)||"example",i=document.createElement("a"),a=window.URL.createObjectURL(r);i.href=a,i.download=n,i.click(),window.URL.revokeObjectURL(a),e({loading:!1})})}catch(t){J(null==t?void 0:t.message),e({loading:!1})}}),tt=t=>{var e;return null===(e=t.split("/").pop())||void 0===e||null===(e=e.split("-"))||void 0===e?void 0:e.splice(1).join("-")},et=t=>{const e=t.split(".");return{fileType:e.pop(),fileName:e.join(".")}},ot=t=>{const e={},o={};return m(t,(t,r)=>{const n=r.split("."),i=h(n)||"eq";p(n)===g?e[n.slice(1).join(".")]=(null==t?void 0:t[0])||void 0:o[n.slice(0,-1).join(".")||r]={[i]:t?String(t):void 0}}),{outsideFilter:e,filters:o}},rt=t=>t&&t.field&&t.order?"".concat(t.field,":").concat("descend"===t.order?"DESC":"ASC",":NULLS_LAST"):void 0,nt=t=>Array.isArray(t)?t.map(t=>rt(t)).join(","):rt(t);new class extends E.EventEmitter{constructor(){super(...arguments),e(this,"handleAuthentication",()=>{let t=this.getAccessToken();t?this.isAuthTokenValid(t)?this.emit("onAutoLogin",!0):(this.setSession(null),this.emit("onAutoLogout","access_token expired")):this.emit("onNoAccessToken")}),e(this,"signInWithToken",async()=>{try{const t=await L.Post("/auth/sign-with-token",{token:this.getAccessToken()}),e=t.data,o=t.success;this.setSession(o?e:null)}catch(t){this.emit("onAutoLogout","sign-in-with-token "+t.message)}return"done"}),e(this,"setSession",t=>{if(t){const e=t.jwtToken,o=t.user;localStorage.setItem("jwt_access_token",e),r.defaults.headers.common.Authorization="Bearer "+e,N.emit(y,{type:w,data:o})}else localStorage.removeItem("jwt_access_token"),delete r.defaults.headers.common.Authorization}),e(this,"logout",()=>{this.setSession(null)}),e(this,"isAuthTokenValid",t=>""!==(t||"")),e(this,"getAccessToken",()=>window.localStorage.getItem("jwt_access_token"))}init(){this.handleAuthentication()}};const it=t=>Object.values(t.reduce(at,{})).map(st),at=(t,e)=>{var o;const r=e.name,n=e.id,i=e.value,a=r;return null!==(o=t[a])&&void 0!==o||(t[a]={text:a,values:new Map}),t[a].values.set(n,{id:n,text:i}),t},st=t=>({text:t.text,values:Array.from(t.values.values()).sort((t,e)=>t.id-e.id)}),lt=t=>{if(!t)return null;const e=l(t);let o="h:mma";return 0===e.minutes()&&(o="ha"),e.isSame(l(),"year")?e.format("MMM D, ".concat(o)):e.format("MMM D YYYY, ".concat(o))},ct=function(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"DD-MM-YYYY";return t?l(t).format(e):null},ut=function(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"DD-MM-YYYY";return t?c(t).format(e):null},dt=t=>t?l(t).format("D MMM YYYY"):null,mt=function(t){let e=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];return t?l().isAfter(t)?l().diff(l(t).startOf("day"),"days")<2?l(t).fromNow():l(t).isSame(l(),"year")?e?l(t).format("D MMM, HH:mm"):l(t).format("D MMM"):e?l(t).format("D MMM YYYY, HH:mm"):l(t).format("D MMM YYYY"):"Now":""},ht=t=>t?l(t):null,pt=t=>t?l(t).format("HH:mm DD/MM/YYYY"):null,ft=t=>{if(!t)return{};var e=t.substr(1),o={};return e.split("&").forEach(function(t){var e=t.split("=");e[1]&&(o[e[0]]=decodeURIComponent(e[1]))}),o},gt=t=>{const e=a(t,s);return delete e.resource,new URLSearchParams(e).toString()},vt=(t,e)=>{var o;return!!e&&-1!==(null==t||null===(o=t.toLowerCase())||void 0===o?void 0:o.search(null==e?void 0:e.toLowerCase()))},yt=t=>t?t.startsWith("http")||t.startsWith("/uploads")?t:"/uploads/".concat(t):"/uploads/image-default.png",wt=t=>"".concat(t).replace(/\B(?=(\d{3})+(?!\d))/g,".").replace(/\.(?=\d{0,2}$)/g,","),bt=t=>t?t.replace(/\$\s?|(\.*)/g,"").replace(/(,{1})/g,"."):"",Mt=t=>{if(!t)return"";const e=t.replace(/\D/g,"").match(/^(\d{4})(\d{3})(\d{3})$/);return e?"(".concat(e[1],") ").concat(e[2],"-").concat(e[3]):t},St=t=>{let e=t.discountValue,o=t.discountUnit,r=t.total;return e&&o?"money"===o?e:e*r/100:0},Yt=t=>"number"==typeof t&&Number.isInteger(t)&&t>0,jt={phone:/^[+]?[\s./0-9]*[(]?[0-9]{1,4}[)]?[-\s./0-9]*$/g,password:/^(?=.*[a-zA-Z])(?=.*[0-9])(?=.*\d).{6,}$/g,username:/^([a-z0-9A-Z_-]{3,100})$/g,editBookingId:"#bookings/(.*)/edit",fullName:/^[ 0-9a-z\u017F\u212A]{3,100}$/i,number:/^[0-9]+$/i,url:/(https?:\/\/[^\s]+)/g,accountNo:/^[\t-\r \.-9\xA0\u1680\u2000-\u200A\u2028\u2029\u202F\u205F\u3000\uFEFF]+$/i,customerName:/\S+/,email:/^[^\s@]+@[^\s@]+\.[^\s@]+$/},Dt=()=>[{pattern:jt.password,message:n.t("input.password.validateMsg.pattern")}],Ot=function(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"password";return[e=>{let o=e.getFieldValue;return{validator:(e,r)=>r&&o(t)!==r?Promise.reject(f("p",{children:"".concat(n.t("input.confirmNewPassword.validateMsg.match"))})):Promise.resolve()}}]};export{T as DRAWER_ROUTE,N as InAppEvent,F as arrayEmpty,x as arrayNotEmpty,St as calPriceOff,B as calVat,K as checkFileType,Z as checkValidFileSize,gt as convertObjToSearchStr,it as createMSkuDetails,C as dataArray,_ as dataAsObj,R as dataObj,G as dateFormatForm,H as dateFormatOnSubmit,I as decodeProperty,X as downloadFileByURL,U as encodeProperty,k as f5List,dt as formatBirthday,P as formatDataI18n,ct as formatDate,lt as formatDateDashboard,ut as formatDateDayjs,mt as formatDateFromNow,pt as formatDateTimeComplete,ot as formatFiltersTable,ht as formatInitialValueDateInput,z as formatMoney,Mt as formatPhoneNumber,nt as formatSorterTable,$ as formatTime,wt as formatterInputNumber,Ot as getConfirmPasswordRules,V as getExtensionFile,tt as getFileName,W as getFileNameFromUrl,Dt as getPasswordRules,ft as getQueryParamsFromUrl,yt as getStaticImageUrl,Q as isImageFile,Yt as isPositiveInteger,vt as onSearch,bt as parserInputNumber,et as splitFile,q as string2Object,jt as validateRegex};
2
+ //# sourceMappingURL=index.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.esm.js","sources":["../../src/configs/constant.js","../../src/configs/localData.js","../../src/configs/index.js","../../src/utils/FuseUtils.js","../../src/utils/RequestUtils.js","../../src/utils/dataUtils.js","../../src/utils/fileUtils.js","../../src/utils/formatFilters.js","../../src/utils/jwtService.js","../../src/utils/skuUtils.js","../../src/utils/textUtils.js","../../src/utils/tools.js","../../src/utils/validateUtils.js"],"sourcesContent":["/**************************************************************************/\n/* constant.js */\n/**************************************************************************/\n/* Tệp này là một phần của: */\n/* Open CDP */\n/* https://flast.vn */\n/**************************************************************************/\n/* Bản quyền (c) 2025 - này thuộc về các cộng tác viên Flast Solution */\n/* (xem AUTHORS.md). */\n/* Bản quyền (c) 2024-2025 Long Huu, Quang Duc, Hung Bui */\n/* */\n/* Bạn được quyền sử dụng phần mềm này miễn phí cho bất kỳ mục đích nào, */\n/* bao gồm sao chép, sửa đổi, phân phối, bán lại… */\n/* */\n/* Chỉ cần giữ nguyên thông tin bản quyền và nội dung giấy phép này trong */\n/* các bản sao. */\n/* */\n/* Đội ngũ phát triển mong rằng phần mềm được sử dụng đúng mục đích và */\n/* có trách nghiệm */\n/**************************************************************************/\n\nexport const QUERY_PARAMS_PROPERTY = {\n outsideFilter: 'outsideFilter',\n filters: 'filters',\n extraFilters: 'extraFilters'\n}\n\nexport const MAX_FILE_SIZE_MB = 3;\nexport const VAT_PERCENT = 8;\nexport const HASH_MODAL = \"#modal\";\nexport const FORMAT_TIME_INPUT = 'HH:mm';\nexport const HASH_POPUP = \"HASH_POPUP\";\nexport const HASH_POPUP_CLOSE = \"HASH_POPUP_CLOSE\"\nexport const FORMAT_DATE_INPUT = 'DD-MM-YYYY';\nexport const CURRENCY_UNIT = 'VND';\n\nexport const STATUS_LEAD = {\n CREATE_DATA: 0,\n DO_NOT_MANUFACTORY: 1,\n IS_CONTACT: 2,\n CONTACT_LATER: 6,\n KO_LIEN_HE_DUOC: 4,\n THANH_CO_HOI: 7\n}\n\nexport const getStatusLead = (option) => {\n switch (option) {\n case STATUS_LEAD.CREATE_DATA:\n return ' Chưa liên hệ';\n case STATUS_LEAD.DO_NOT_MANUFACTORY:\n return 'Không triển khai';\n case STATUS_LEAD.IS_CONTACT:\n return ' Đang tư vấn';\n case STATUS_LEAD.CONTACT_LATER:\n return 'Liên hệ sau';\n case STATUS_LEAD.KO_LIEN_HE_DUOC:\n return 'Không liên hệ được';\n case STATUS_LEAD.THANH_CO_HOI:\n return 'Thành cơ hội';\n default:\n return 'N/A';\n }\n}\n\nexport const getColorStatusLead = (option) => {\n switch (option) {\n case STATUS_LEAD.CREATE_DATA:\n return '#f50';\n case STATUS_LEAD.DO_NOT_MANUFACTORY:\n return '#2db7f5';\n case STATUS_LEAD.IS_CONTACT:\n return '#87d068';\n case STATUS_LEAD.CONTACT_LATER:\n return '#108ee9';\n case STATUS_LEAD.KO_LIEN_HE_DUOC:\n return 'red';\n case STATUS_LEAD.THANH_CO_HOI:\n return 'green';\n default:\n return 'black';\n }\n}\n\nexport const getTypeGroup = (option) => {\n switch (option) {\n case 1:\n return 'Sale';\n case 2:\n return 'Chăm sóc khách hàng';\n case 3:\n return 'MarkeTing';\n case 4:\n return 'Kho';\n default:\n return 'N/A';\n }\n}\n\n/**************************************************************************/\n\nexport const SUCCESS_API_CODE = 200;\n\nexport const NGHI_PHEP_META = [\n { id: 1, name: 'Nghỉ phép năm (Annual Leave)' },\n { id: 2, name: 'Nghỉ không lương (Unpaid Absence)' },\n { id: 3, name: 'Nghỉ theo chính sách phúc lợi của công ty (Leave According To Company Welfare Policy)' },\n { id: 4, name: 'Nghỉ ốm hưởng BHXH (Sick Leave With Social Insurance)' },\n { id: 5, name: 'Lý do khác (Other Reasons)' },\n]\n\nexport const OVERTIME_META = [\n { id: 1, name: 'Làm thêm giờ' },\n { id: 2, name: 'Làm thêm vào ngày nghỉ' }\n]\n\nexport const NGHI_PHEP_STATUS_WAITING = 0;\nexport const NGHI_PHEP_STATUS_CONFIRM = 1;\nexport const NGHI_PHEP_STATUS_REJECT = 1;\nexport const NGHI_PHEP_STATUS_DONE = 2;\n\nexport const APP_FOLLOW_STATUS_WAITING = 0;\nexport const APP_FOLLOW_STATUS_CONFIRM = 1;\nexport const APP_FOLLOW_STATUS_DONE = 2;\nexport const APP_FOLLOW_STATUS_REJECT = 3;\n\nexport const NGHI_PHEP_STATUS_TEXT = [\n { id: NGHI_PHEP_STATUS_WAITING, name: 'Chờ duyệt (Waiting For Approval)' },\n { id: NGHI_PHEP_STATUS_REJECT, name: 'Không duyệt (Not Approved)' },\n { id: NGHI_PHEP_STATUS_DONE, name: 'Duyệt (Approved)' }\n]\n\nexport const APP_STATUS_TEXT = NGHI_PHEP_STATUS_TEXT;\n","/**************************************************************************/\n/* localData.js */\n/**************************************************************************/\n/* Tệp này là một phần của: */\n/* Open CDP */\n/* https://flast.vn */\n/**************************************************************************/\n/* Bản quyền (c) 2025 - này thuộc về các cộng tác viên Flast Solution */\n/* (xem AUTHORS.md). */\n/* Bản quyền (c) 2024-2025 Long Huu, Quang Duc, Hung Bui */\n/* */\n/* Bạn được quyền sử dụng phần mềm này miễn phí cho bất kỳ mục đích nào, */\n/* bao gồm sao chép, sửa đổi, phân phối, bán lại… */\n/* */\n/* Chỉ cần giữ nguyên thông tin bản quyền và nội dung giấy phép này trong */\n/* các bản sao. */\n/* */\n/* Đội ngũ phát triển mong rằng phần mềm được sử dụng đúng mục đích và */\n/* có trách nghiệm */\n/**************************************************************************/\n\nimport mapKeys from 'lodash/mapKeys';\n\nexport const ACTIVE_TYPES = [\n {\n value: 2,\n text: 'Kích hoạt',\n color: 'red',\n textColor: \"#ff4d4f\"\n },\n {\n value: 1,\n text: 'Ngưng',\n color: 'green',\n textColor: \"#52c41a\"\n }\n];\n\nexport const IMAGE_TYPES = ['png', 'jpg', 'jpeg', 'gif', 'tif', 'tiff'];\n\nexport const CHANNEL_SOURCE = [\n { 'id': 11, 'name': 'Web' },\n { 'id': 1, 'name': 'Facebook' },\n { 'id': 2, 'name': 'Zalo' },\n { 'id': 3, 'name': 'Hotline' },\n { 'id': 4, 'name': 'Trực tiếp' },\n { 'id': 5, 'name': 'Email' },\n { 'id': 6, 'name': 'MKT0D' },\n { 'id': 7, 'name': 'Giới thiệu' },\n { 'id': 8, 'name': 'Cskh' },\n { 'id': 9, 'name': 'Partner' },\n { 'id': 10, 'name': 'Shopee' }\n];\nexport const CHANNEL_SOURCE_MAP_KEYS = mapKeys(CHANNEL_SOURCE, 'id');\n\nexport const CHANNEL_STATUS = [\n { 'id': 1, 'name': 'Chưa liên hệ' },\n { 'id': 2, 'name': 'Đã liên hệ' }\n];\nexport const CHANNEL_STATUS_MAP_KEYS = mapKeys(CHANNEL_STATUS, 'id');\n\nexport const KPI_TYPE = [\n { text: 'Doanh số', value: 'doanhso' },\n { text: 'SQL', value: 'sql' },\n { text: 'Trafic', value: 'trafic' }\n]\nexport const KPI_TYPE_MAP_KEYS = mapKeys(KPI_TYPE, 'value');\n\nexport const PAYMENT_TYPE_CONST = [\n { label: 'Tiền mặt', value: 6 },\n { label: 'Chuyển khoản MBbank', value: 1 },\n { label: 'Chuyển khoản TPbank', value: 7 },\n { label: 'COD Viettel', value: 2 },\n { label: 'Ví Momo', value: 3 },\n { label: 'Ví Vnpay', value: 4 },\n { label: 'Ncc thu hộ', value: 5 }\n];\n\nexport const PRIORITY_TYPE_TAGS = [\n { text: 'Cao', value: 'cao', color: 'red' },\n { text: 'Trung bình', value: 'trungbinh', color: 'purple' },\n { text: 'Thấp', value: 'thap', color: 'green' }\n];\nexport const PRIORITY_TYPE_TAGS_MAP_KEYS = mapKeys(\n PRIORITY_TYPE_TAGS,\n 'value',\n);\n\nexport const PRODUCT_STATUS = [\n { value: 0, text: 'Ngưng', color: 'red' },\n { value: 1, text: 'Kích hoạt', color: 'green' }\n];\n\nexport const USER_STATUS = [\n { value: 0, text: 'Ngưng', color: 'red' },\n { value: 1, text: 'Kích hoạt', color: 'green' }\n];\n\nexport const DEPARTMENT = [\n { value: 1, name: \"IT\", color: 'blue' },\n { value: 2, name: \"Marketing\", color: 'green' },\n { value: 3, name: \"Kinhdoanh\", color: 'purple' },\n { value: 4, name: \"Khác\", color: 'orange' }\n];\n\nexport const CAR_WORK_TYPE = 1;\nexport const DEPARTMENT_MAP_KEYS_VALUE = mapKeys(DEPARTMENT, 'value');\n\nexport const PROJECT_STATUS_LIST = ['Not Started', 'In Progress', 'Completed', 'On Hold'];\nexport const PROJECT_TASK_STATUS_LIST = ['To Do', 'In Progress', 'Done', 'Cancelled'];\n\nexport const MATERIAL_UNIT_TYPE = [\n { value: \"QUANTITY\", name: \"Số lượng\" },\n { value: \"DIMENSION\", name: \"Kích thước\" },\n { value: \"WEIGHT\", name: \"Trọng lượng\" }\n];\n\n\n\nexport const CAR_NOT_WORK_TYPE = 2;\nexport const REGISTER_WORK_TYPE = [\n { value: 1, text: 'Công tác có phí', color: 'green' },\n { value: 2, text: 'Công tác không phí', color: 'red' }\n];\n\nexport const HOTEL_ROOM_PAY_TYPE_COMPANY = 1;\nexport const HOTEL_ROOM_PAY_TYPE_PERSIONAL = 2;\nexport const HOTEL_ROOM_PAY_TYPE = [\n { value: HOTEL_ROOM_PAY_TYPE_COMPANY, text: 'Công ty trả/company pay', color: 'green' },\n { value: HOTEL_ROOM_PAY_TYPE_PERSIONAL, text: 'Cá nhân tạm ứng/person pay', color: 'red' }\n];\n\nexport const FLIGHT_WAY_TYPE_DEPARTURE = 1;\nexport const FLIGHT_WAY_TYPE_ARRIVAL = 2;\nexport const FLIGHT_WAY_TYPE = [\n { value: FLIGHT_WAY_TYPE_DEPARTURE, text: 'Chiều đi / Departure', color: 'green' },\n { value: FLIGHT_WAY_TYPE_ARRIVAL, text: 'Chiều về / Arrival', color: 'red' }\n];\n","\nexport * from \"./constant\"\nexport * from \"./localData\"\n\nexport const SUCCESS_CODE = 200\nexport const CHANGE_STORE = 'CHANGE_STORE'\nexport const API = { SINGIN: '/auth/login' }\n\nexport const ACTIONS = {\n ADD_USER: 'add__user',\n REMOVE_USER: 'remove__user',\n TOOGLE_COLLAPSE: 'tg_cll',\n F5_LIST: 'f5_list',\n SET_ROUTES: 'set_routes',\n}\n\nexport const INAPP_NOTIFICATION_EMITTER = 'in_app_noti'\nexport const EVENT_ACCEPT_IMAGE_TYPES = '.png, .jpeg, .jpg'\nexport const HASH_MODAL = '#modal'\nexport const HASH_MODAL_CLOSE = '#close-modal'\nexport const DEFAULT_INBOX_ID = 'inbox'\nexport const DEFAULT_PARENT_INBOX_ID = 'parent'\nexport const FORMAT_DATE_INPUT = 'DD-MM-YYYY'\nexport const FORMAT_DATE_TIME_INPUT = 'DD-MM-YYYY HH:mm'\nexport const FORMAT_TIME_INPUT = 'HH:mm'\nexport const MAX_FILE_SIZE_MB = 3\nexport const REPORT_DATE_FORMAT = 'YYYY-MM-DD'\nexport const CURRENCY_UNIT = 'VND'\nexport const EMBED_YOUTUBE_LINK = '//www.youtube.com/embed/'\nexport const DEFAULT_COLOR_VALUE = '#ffffff'\nexport const outerRadius = 143 / 2\n\n// ----------------------------------------------------------------\n// Runtime config\n// App phải gọi initCoreConfig() trước khi dùng bất kỳ API nào\n// ----------------------------------------------------------------\nconst _config = {\n GATEWAY: \"\"\n}\n\n/**\n * Khởi tạo config runtime — gọi 1 lần trong index.js của app\n * @example\n * import { initCoreConfig } from \"@flast-erp/core/configs\"\n * initCoreConfig({ GATEWAY: process.env.REACT_APP_GATEWAY })\n */\nexport function initCoreConfig(config = {}) {\n const gateway = config.GATEWAY || _config.GATEWAY\n Object.assign(_config, {\n ...config,\n GATEWAY: gateway\n })\n}\n\nexport const getGateway = () => _config.GATEWAY\nexport const getConfig = () => ({ ..._config })\n","/**************************************************************************/\n/* FuseUtils.js */\n/**************************************************************************/\n/* Tệp này là một phần của: */\n/* Open CDP */\n/* https://flast.vn */\n/**************************************************************************/\n/* Bản quyền (c) 2025 - này thuộc về các cộng tác viên Flast Solution */\n/* (xem AUTHORS.md). */\n/* Bản quyền (c) 2024-2025 Long Huu, Quang Duc, Hung Bui */\n/* */\n/* Bạn được quyền sử dụng phần mềm này miễn phí cho bất kỳ mục đích nào, */\n/* bao gồm sao chép, sửa đổi, phân phối, bán lại… */\n/* */\n/* Chỉ cần giữ nguyên thông tin bản quyền và nội dung giấy phép này trong */\n/* các bản sao. */\n/* */\n/* Đội ngũ phát triển mong rằng phần mềm được sử dụng đúng mục đích và */\n/* có trách nghiệm */\n/**************************************************************************/\n\nimport { CHANGE_STORE, HASH_MODAL, INAPP_NOTIFICATION_EMITTER } from '@/configs';\n\nclass EventEmitter {\n\n constructor() {\n this.events = {};\n }\n\n _getEventListByName(eventName) {\n if (typeof this.events[eventName] === 'undefined') {\n this.events[eventName] = new Set();\n }\n return this.events[eventName]\n }\n\n on(eventName, fn) {\n this._getEventListByName(eventName).add(fn);\n }\n\n once(eventName, fn) {\n const self = this;\n const onceFn = function (...args) {\n self.removeListener(eventName, onceFn);\n fn.apply(self, args);\n };\n this.on(eventName, onceFn);\n }\n\n emit(eventName, ...args) {\n this._getEventListByName(eventName).forEach(function (fn) {\n fn.apply(this, args);\n }.bind(this));\n }\n\n addEventListener(eventName, fn) {\n this.on(eventName, fn)\n }\n\n removeListener(eventName, fn) {\n this._getEventListByName(eventName).delete(fn);\n }\n}\n\nclass FuseUtils {\n\n static EventEmitter = EventEmitter;\n static hasPermission(authArr, enabled) {\n if (authArr === '*') {\n return true;\n } else if ((authArr || '') === '') {\n return true;\n } else if (authArr.length === 0) {\n return true;\n }\n return enabled;\n }\n\n static generateRoutesFromConfigs(configs, defaultAuth) {\n let allRoutes = [];\n configs.forEach((config) => {\n allRoutes = [\n ...allRoutes,\n ...this.setRoutes(config, defaultAuth)\n ]\n });\n return allRoutes;\n }\n\n static setRoutes(config, defaultAuth) {\n let routes = [...config.routes];\n if (config.settings || config.auth) {\n routes = routes.map((route) => {\n let auth = config.auth ? [...config.auth] : defaultAuth || null;\n auth = route.auth ? [...auth, ...route.auth] : auth;\n return {\n ...route,\n settings: { ...config.settings, ...route.settings },\n auth\n };\n });\n }\n return [...routes];\n }\n}\n\nclass AppEvent extends EventEmitter {\n normalSuccess(content, title = null) {\n this.emit(INAPP_NOTIFICATION_EMITTER, { type: 'success', content, title });\n }\n normalInfo(content, title = null) {\n this.emit(INAPP_NOTIFICATION_EMITTER, { type: 'info', content, title });\n }\n normalError(content, title = null) {\n this.emit(INAPP_NOTIFICATION_EMITTER, { type: 'error', content, title });\n }\n modal(content, type) {\n this.emit(INAPP_NOTIFICATION_EMITTER, { type, content, cate: 'modal' });\n }\n changeStore(data) {\n this.emit(CHANGE_STORE, data);\n }\n openDrawer = (route, { title, ...rest }) => this.emit(HASH_MODAL, {\n hash: route,\n title,\n data: rest\n });\n}\n\nexport const DRAWER_ROUTE = {\n CONTRACT_FORM: 'CONTRACT_FORM'\n}\n\nexport const InAppEvent = new AppEvent();\nexport default FuseUtils;\n","/**************************************************************************/\n/* RequestUtils.js */\n/**************************************************************************/\n/* Tệp này là một phần của: */\n/* Open CDP */\n/* https://flast.vn */\n/**************************************************************************/\n/* Bản quyền (c) 2025 - này thuộc về các cộng tác viên Flast Solution */\n/* (xem AUTHORS.md). */\n/* Bản quyền (c) 2024-2025 Long Huu, Quang Duc, Hung Bui */\n/* */\n/* Bạn được quyền sử dụng phần mềm này miễn phí cho bất kỳ mục đích nào, */\n/* bao gồm sao chép, sửa đổi, phân phối, bán lại… */\n/* */\n/* Chỉ cần giữ nguyên thông tin bản quyền và nội dung giấy phép này trong */\n/* các bản sao. */\n/* */\n/* Đội ngũ phát triển mong rằng phần mềm được sử dụng đúng mục đích và */\n/* có trách nghiệm */\n/**************************************************************************/\n\nimport { getGateway, SUCCESS_CODE } from '@/configs';\nimport axios from 'axios';\n\nclass RequestUtils {\n\n\tstatic encodeQueryData(data) {\n\t\tif (!data) {\n\t\t\treturn '';\n\t\t}\n\t\tconst ret = [];\n\t\tfor (let d in data) {\n\t\t\tif (!data[d]) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tret.push(encodeURIComponent(d) + '=' + encodeURIComponent(data[d]));\n\t\t}\n\t\treturn ret.length > 0 ? ('?' + ret.join('&')) : '';\n\t}\n\n\tstatic generateUrlGetParams(enpoint, params = {}) {\n\t\treturn String(enpoint).concat(this.encodeQueryData(params));\n\t}\n\n\tstatic httpRequest(input, service, method = 'GET', params = '') {\n\t\tconst _uri = getGateway() + service;\n\t\tlet getOrPost;\n\t\tif (method === 'GET') {\n\t\t\tgetOrPost = axios.get(_uri + this.encodeQueryData(input));\n\t\t} else {\n\t\t\tgetOrPost = axios.post(_uri + this.encodeQueryData(params), input);\n\t\t}\n\t\treturn getOrPost.then(({ data }) => {\n\t\t\treturn data;\n\t\t}).catch((response) => {\n\t\t\treturn response;\n\t\t});\n\t}\n\n\tstatic Get(service, input = {}) {\n\t\treturn this.httpRequest(input, service, 'GET');\n\t}\n\n\tstatic async GetAsList(service, input = {}) {\n\t\tlet { data, errorCode } = await this.httpRequest(input, service, 'GET');\n\t\treturn errorCode === 200 ? data : [];\n\t}\n\n\tstatic Post(service, input = {}, params = {}) {\n\t\treturn this.httpRequest(input, service, 'POST', params);\n\t}\n\n\tstatic getJsonFromUrl(url) {\n\t\tif (!url) return {};\n\t\tvar query = url.substr(1);\n\t\tvar result = {};\n\t\tquery.split(\"&\").forEach(function (part) {\n\t\t\tvar item = part.split(\"=\");\n\t\t\tresult[item[0]] = decodeURIComponent(item[1]);\n\t\t});\n\t\treturn result;\n\t}\n\n\tstatic uploadSigFile = ({\n\t\tonSuccess,\n\t\tonError,\n\t\tfile,\n\t\tonProgress = (progress) => progress,\n\t\tonSuccessUploadServer = (values) => values,\n\t\tapi\n\t}) => {\n\t\tconst fmData = new FormData();\n\t\tconst config = {\n\t\t\theaders: { \"content-type\": \"multipart/form-data\" },\n\t\t\tonUploadProgress: event => {\n\t\t\t\tonProgress({ percent: (event.loaded / event.total) * 100 }, file);\n\t\t\t}\n\t\t};\n\t\tfmData.append(\"files\", file);\n\t\taxios.post(getGateway() + \"/\" + api, fmData, config).then(({ data: ret }) => {\n\t\t\tconst { data, errorCode } = ret;\n\t\t\tonSuccess(file);\n\t\t\tif (errorCode === SUCCESS_CODE && (data?.fileName || '') !== '') {\n\t\t\t\tonSuccessUploadServer(data.fileName);\n\t\t\t}\n\t\t}).catch(err => {\n\t\t\tconst error = new Error(err.message);\n\t\t\tonError({ event: error });\n\t\t});\n\t}\n}\n\nexport default RequestUtils;\n","/**************************************************************************/\n/* dataUtils.js */\n/**************************************************************************/\n/* Tệp này là một phần của: */\n/* Open CDP */\n/* https://flast.vn */\n/**************************************************************************/\n/* Bản quyền (c) 2025 - này thuộc về các cộng tác viên Flast Solution */\n/* (xem AUTHORS.md). */\n/* Bản quyền (c) 2024-2025 Long Huu, Quang Duc, Hung Bui */\n/* */\n/* Bạn được quyền sử dụng phần mềm này miễn phí cho bất kỳ mục đích nào, */\n/* bao gồm sao chép, sửa đổi, phân phối, bán lại… */\n/* */\n/* Chỉ cần giữ nguyên thông tin bản quyền và nội dung giấy phép này trong */\n/* các bản sao. */\n/* */\n/* Đội ngũ phát triển mong rằng phần mềm được sử dụng đúng mục đích và */\n/* có trách nghiệm */\n/**************************************************************************/\n\nimport i18next from 'i18next';\nimport { random } from \"lodash\";\nimport { InAppEvent } from \"@/utils/FuseUtils\";\nimport { ACTIONS, CHANGE_STORE } from \"@/configs\";\nimport moment from 'moment';\nimport dayjs from 'dayjs';\n\nexport const formatDataI18n = (displayName, name) => {\n return displayName?.[i18next.language] || name;\n};\n\nexport const f5List = (apiPath = '') => InAppEvent.emit(CHANGE_STORE, {\n type: ACTIONS.F5_LIST,\n data: { apiPath, random: random() }\n});\n\nexport const dataArray = (ret) => {\n const { errorCode, data } = ret;\n return errorCode === 200 ? data : [];\n}\n\nexport const dataObj = (ret) => {\n const { errorCode, data } = ret;\n return errorCode === 200 ? data : {};\n}\n\nexport const dataAsObj = (ret) => {\n const { errorCode, data } = ret;\n return errorCode === 200 ? data : {};\n}\n\nexport const arrayNotEmpty = (data) => Array.isArray(data) && data.length > 0;\nexport const arrayEmpty = (data) => !arrayNotEmpty(data);\n\nexport function decodeProperty(obj, propertys = []) {\n if (arrayNotEmpty(obj)) {\n obj.forEach(elm => decodeProperty(elm, propertys));\n return obj;\n }\n if (!obj || typeof obj !== 'object') {\n return obj;\n }\n for (let p of propertys) {\n const value = obj[p];\n if (value && typeof value === 'string') {\n obj[p] = JSON.parse(value);\n }\n }\n return obj;\n}\n\nexport function encodeProperty(obj, propertys = []) {\n if (!obj || typeof obj !== 'object') {\n return obj;\n }\n if (!arrayNotEmpty(propertys)) {\n return JSON.stringify(obj);\n }\n for (let k of propertys) {\n const value = obj[k];\n if (value && typeof value === 'object') {\n obj[k] = JSON.stringify(value);\n }\n }\n return obj;\n}\n\n/* dateFormatForm(entity, ['startTime', 'endTime'], 'HH:mm') */\nexport const dateFormatForm = (entity, propertes = [], format) => {\n if (!entity || !propertes) {\n return;\n }\n for (let k of propertes) {\n const value = entity[k];\n if (value && (typeof value === 'string' || typeof value === 'number')) {\n entity[k] = dayjs(new Date(value), format);\n }\n }\n}\n\nexport const dateFormatOnSubmit = (entity, propertes = [], format = \"YYYY-MM-DD HH:mm:ss\") => {\n\tif(typeof(entity) !== 'object') {\n\t\treturn dayjs(entity).format(format);\n\t}\n\tfor(let k of propertes) {\n\t\tconst value = entity[k];\n\t\tif(value) {\n\t\t\tentity[k] = dayjs(value).format(format);\n\t\t}\n\t}\n\treturn entity;\n}\n\nexport const formatTime = (text, fm = \"DD-MM-YYYY\") => text ? moment(new Date(text)).format(fm) : 'N/a';\nexport const formatMoney = (x) => x ? x.toLocaleString('it-IT') + ' đ' : '0 đ';\nexport const calVat = ({ total, vatPercent }) => (total || 0) * (vatPercent / 100);\n\nexport const string2Object = (data) => {\n\tif(!data) {\n\t\treturn [ '(empty)', null ];\n\t}\n\tif(typeof(data) !== 'string') {\n\t\treturn [ '(invalid)', null ];\n\t}\n\ttry {\n\t\tlet obj = JSON.parse(data);\n\t\treturn [ null, obj ];\n\t} catch (e) {\n\t\treturn [ e, null ];\n\t}\n}\n","/**************************************************************************/\n/* fileUtils.js */\n/**************************************************************************/\n/* Tệp này là một phần của: */\n/* Open CDP */\n/* https://flast.vn */\n/**************************************************************************/\n/* Bản quyền (c) 2025 - này thuộc về các cộng tác viên Flast Solution */\n/* (xem AUTHORS.md). */\n/* Bản quyền (c) 2024-2025 Long Huu, Quang Duc, Hung Bui */\n/* */\n/* Bạn được quyền sử dụng phần mềm này miễn phí cho bất kỳ mục đích nào, */\n/* bao gồm sao chép, sửa đổi, phân phối, bán lại… */\n/* */\n/* Chỉ cần giữ nguyên thông tin bản quyền và nội dung giấy phép này trong */\n/* các bản sao. */\n/* */\n/* Đội ngũ phát triển mong rằng phần mềm được sử dụng đúng mục đích và */\n/* có trách nghiệm */\n/**************************************************************************/\n\nimport { IMAGE_TYPES } from '@/configs/localData';\nimport { notification, Upload } from 'antd';\nimport i18next from 'i18next';\nimport { MAX_FILE_SIZE_MB } from '@/configs/constant';\nimport axios from 'axios';\n\nconst showErrorDownloadFile = (message) => {\n notification.error({\n message: i18next.t('error.title'),\n description: message || i18next.t('error.errorDownloadFile'),\n duration: 2\n });\n};\n\nexport const isImageFile = (fileName) => {\n const extension = getExtensionFile(fileName);\n if (!extension) return false;\n return IMAGE_TYPES.includes(extension.toLocaleLowerCase());\n};\n\nexport const getFileNameFromUrl = (url) => url?.split('/')?.pop();\nexport const checkFileType = (file) => {\n if (!file.type?.trim()) {\n\n }\n return true;\n};\n\nexport const getExtensionFile = (fileName) => {\n if (typeof fileName !== 'string' || fileName.indexOf('.') === -1) return '';\n return fileName.split('.').pop();\n};\n\nexport const checkValidFileSize = (file, placeholder) => {\n const isCheckSize = Number(file.size) / 1024 / 1024 < MAX_FILE_SIZE_MB;\n if (!isCheckSize) {\n notification.error({\n message: i18next.t('error.title'),\n description: i18next.t('error.fileSize', {\n name: i18next.t(placeholder),\n }),\n duration: 2,\n });\n return Upload.LIST_IGNORE;\n }\n return true;\n};\n\nexport const downloadFileByURL = async (file) => {\n return new Promise(resolve => {\n if (!file?.url) {\n showErrorDownloadFile();\n resolve({ loading: false });\n }\n try {\n axios.get(file.url, { responseType: 'blob' }).then(response => {\n const blob = response.data;\n if (!blob) {\n resolve({ loading: false });\n }\n const disposition = response.headers['content-disposition'];\n const restFileName = file.fileName || getFileNameFromUrl(file.url) || 'example';\n const a = document.createElement('a');\n const url = window.URL.createObjectURL(blob);\n a.href = url;\n a.download = restFileName;\n a.click();\n window.URL.revokeObjectURL(url);\n resolve({ loading: false });\n });\n } catch (error) {\n showErrorDownloadFile(error?.message);\n resolve({ loading: false });\n }\n });\n};\n\nexport const getFileName = (file) =>\n file.split('/').pop()?.split('-')?.splice(1).join('-');\n\nexport const splitFile = (url) => {\n const splitUrl = url.split('.');\n const fileType = splitUrl.pop();\n const fileName = splitUrl.join('.');\n return { fileType, fileName };\n};\n","/**************************************************************************/\n/* formatFilters.js */\n/**************************************************************************/\n/* Tệp này là một phần của: */\n/* Open CDP */\n/* https://flast.vn */\n/**************************************************************************/\n/* Bản quyền (c) 2025 - này thuộc về các cộng tác viên Flast Solution */\n/* (xem AUTHORS.md). */\n/* Bản quyền (c) 2024-2025 Long Huu, Quang Duc, Hung Bui */\n/* */\n/* Bạn được quyền sử dụng phần mềm này miễn phí cho bất kỳ mục đích nào, */\n/* bao gồm sao chép, sửa đổi, phân phối, bán lại… */\n/* */\n/* Chỉ cần giữ nguyên thông tin bản quyền và nội dung giấy phép này trong */\n/* các bản sao. */\n/* */\n/* Đội ngũ phát triển mong rằng phần mềm được sử dụng đúng mục đích và */\n/* có trách nghiệm */\n/**************************************************************************/\n\nimport forEach from 'lodash/forEach';\nimport last from 'lodash/last';\nimport head from 'lodash/head';\nimport { QUERY_PARAMS_PROPERTY } from '@/configs/constant';\n\nexport const formatFiltersTable = (filters) => {\n const outsideFilter = {};\n const restFilters = {};\n forEach(filters, (value, key) => {\n const splitArr = key.split('.');\n const operator = last(splitArr) || 'eq';\n if (head(splitArr) === QUERY_PARAMS_PROPERTY.outsideFilter) {\n outsideFilter[splitArr.slice(1).join('.')] = value?.[0] || undefined;\n } else {\n restFilters[splitArr.slice(0, -1).join('.') || key] = {\n [operator]: value ? String(value) : undefined,\n };\n }\n });\n return { outsideFilter, filters: restFilters };\n};\n\nconst formatSorter = (sorter) => {\n return sorter && sorter.field && sorter.order\n ? `${sorter.field}:${sorter.order === 'descend' ? 'DESC' : 'ASC'}:NULLS_LAST`\n : undefined;\n};\n\nexport const formatSorterTable = (sorter) => {\n if (Array.isArray(sorter)) {\n return sorter.map(item => formatSorter(item)).join(',');\n } else {\n return formatSorter(sorter);\n }\n};\n","/**************************************************************************/\n/* jwtService.js */\n/**************************************************************************/\n/* Tệp này là một phần của: */\n/* Open CDP */\n/* https://flast.vn */\n/**************************************************************************/\n/* Bản quyền (c) 2025 - này thuộc về các cộng tác viên Flast Solution */\n/* (xem AUTHORS.md). */\n/* Bản quyền (c) 2024-2025 Long Huu, Quang Duc, Hung Bui */\n/* */\n/* Bạn được quyền sử dụng phần mềm này miễn phí cho bất kỳ mục đích nào, */\n/* bao gồm sao chép, sửa đổi, phân phối, bán lại… */\n/* */\n/* Chỉ cần giữ nguyên thông tin bản quyền và nội dung giấy phép này trong */\n/* các bản sao. */\n/* */\n/* Đội ngũ phát triển mong rằng phần mềm được sử dụng đúng mục đích và */\n/* có trách nghiệm */\n/**************************************************************************/\n\nimport FuseUtils, { InAppEvent } from './FuseUtils';\nimport axios from 'axios';\nimport { CHANGE_STORE, ACTIONS } from \"@/configs\";\nimport RequestUtils from './RequestUtils';\n\nclass jwtService extends FuseUtils.EventEmitter {\n\n init() {\n this.handleAuthentication();\n }\n\n handleAuthentication = () => {\n let access_token = this.getAccessToken();\n if (!access_token) {\n this.emit('onNoAccessToken');\n return;\n }\n\n if (this.isAuthTokenValid(access_token)) {\n this.emit('onAutoLogin', true);\n } else {\n this.setSession(null);\n this.emit('onAutoLogout', 'access_token expired');\n }\n };\n\n signInWithToken = async () => {\n try {\n const { data, success } = await RequestUtils.Post('/auth/sign-with-token', {\n token: this.getAccessToken()\n });\n this.setSession(success ? data : null);\n } catch (e) {\n this.emit('onAutoLogout', 'sign-in-with-token ' + e.message);\n }\n return \"done\";\n };\n\n setSession = (data) => {\n if (data) {\n const { jwtToken: token, user } = data;\n localStorage.setItem('jwt_access_token', token);\n axios.defaults.headers.common['Authorization'] = 'Bearer ' + token;\n InAppEvent.emit(CHANGE_STORE, { type: ACTIONS.ADD_USER, data: user });\n } else {\n localStorage.removeItem('jwt_access_token');\n delete axios.defaults.headers.common['Authorization'];\n }\n };\n\n logout = () => {\n this.setSession(null);\n };\n\n isAuthTokenValid = access_token => {\n return (access_token || '') !== '';\n };\n\n getAccessToken = () => {\n return window.localStorage.getItem('jwt_access_token');\n };\n}\n\nconst instance = new jwtService();\nexport default instance;\n","/**\n * @param {*} skuDetails \n * [{ \"id\": 20, \"productId\": 776, \"skuId\": 11, \"name\": \"Bồi vỏ\", \"value\": \"Giấy Mỹ thuật\", \"attributedId\": 10024, \"attributedValueId\": 10090, \"del\": 0 }]\n * @returns [{ text: 'Bồi vỏ', values: [{id: 20, text: 'Giấy Mỹ thuật'}]}]\n */\nconst createMSkuDetails = (skuDetails) => \n Object.values(skuDetails.reduce(groupByName, {})).map(toMSkuGroup);\n\n/* Nhóm theo name, giữ lại id + value duy nhất */\nconst groupByName = (acc, item) => {\n const { name, id, value } = item;\n const key = name;\n acc[key] ??= { text: key, values: new Map() };\n acc[key].values.set(id, { id, text: value });\n return acc;\n};\n\n/* Chuyển Map thành mảng và sắp xếp theo id */\nconst toMSkuGroup = (group) => ({\n text: group.text,\n values: Array.from(group.values.values()).sort((a, b) => a.id - b.id)\n});\n\nexport { createMSkuDetails };","import moment from 'moment';\nimport dayjs from 'dayjs';\n\nexport const formatDateDashboard = (text) => {\n if (!text) {\n return null;\n }\n const dateTime = moment(text);\n let formatTime = 'h:mma';\n if (dateTime.minutes() === 0) formatTime = 'ha';\n return dateTime.isSame(moment(), 'year')\n ? dateTime.format(`MMM D, ${formatTime}`)\n : dateTime.format(`MMM D YYYY, ${formatTime}`);\n};\n\nexport const formatDate = (text, pattern = 'DD-MM-YYYY') => {\n return text ? moment(text).format(pattern) : null;\n};\n\nexport const formatDateDayjs = (date, pattern = 'DD-MM-YYYY') => {\n return date ? dayjs(date).format(pattern) : null;\n}\n\nexport const formatBirthday = (text) => {\n return text ? moment(text).format('D MMM YYYY') : null;\n};\n\nexport const formatDateFromNow = (date, showTime = true) => {\n if (!date) {\n return '';\n }\n if (moment().isAfter(date)) {\n /* nếu nhỏ hơn 2 ngày: TODAY , 1 day before */\n if (moment().diff(moment(date).startOf('day'), 'days') < 2) {\n return moment(date).fromNow();\n }\n /* nếu trong năm */\n if (moment(date).isSame(moment(), 'year')) {\n return showTime ? moment(date).format('D MMM, HH:mm') : moment(date).format('D MMM');\n }\n /* lớn hơn năm hiện tại */\n return showTime ? moment(date).format('D MMM YYYY, HH:mm') : moment(date).format('D MMM YYYY');\n }\n return 'Now';\n};\n\nexport const formatInitialValueDateInput = (value) =>\n value ? moment(value) : null;\n\nexport const formatDateTimeComplete = (text) => {\n return text ? moment(text).format('HH:mm DD/MM/YYYY') : null;\n};\n","\nimport { pickBy, identity } from 'lodash'\n\nexport const getQueryParamsFromUrl = (url) => {\n if (!url) {\n return {};\n }\n var query = url.substr(1);\n var result = {};\n query.split(\"&\").forEach(function (part) {\n var item = part.split(\"=\");\n if (item[1]) {\n result[item[0]] = decodeURIComponent(item[1]);\n }\n });\n return result;\n};\n\nexport const convertObjToSearchStr = (params) => {\n /* removes undefined, \"\", 0, null, ... */\n const newParams = pickBy(params, identity);\n delete newParams.resource;\n return new URLSearchParams(newParams).toString();\n};\n\nexport const onSearch = (data, inputValue) =>\n !!inputValue && data?.toLowerCase()?.search(inputValue?.toLowerCase()) !== -1;\n\nexport const getStaticImageUrl = (image) => {\n if (!image) {\n return '/uploads/image-default.png';\n }\n if (image.startsWith('http')) {\n return image;\n }\n\n return image.startsWith('/uploads') ? image : \"/uploads/\".concat(image);\n};\n\nexport const formatterInputNumber = (value) =>\n `${value}`\n .replace(/\\B(?=(\\d{3})+(?!\\d))/g, '.')\n .replace(/\\.(?=\\d{0,2}$)/g, ',');\n\nexport const parserInputNumber = (value) => {\n return value ? value.replace(/\\$\\s?|(\\.*)/g, '').replace(/(,{1})/g, '.') : '';\n};\n\nexport const formatPhoneNumber = (phone) => {\n if (!phone) {\n return '';\n }\n const cleaned = phone.replace(/\\D/g, '');\n const match = cleaned.match(/^(\\d{4})(\\d{3})(\\d{3})$/);\n if (match) {\n return `(${match[1]}) ${match[2]}-${match[3]}`;\n }\n return phone;\n}\n\nexport const calPriceOff = ({ discountValue, discountUnit, total }) => {\n if (!discountValue || !discountUnit) {\n return 0;\n }\n if (discountUnit === \"money\") {\n return discountValue;\n }\n return (discountValue * total) / 100;\n};\n\nexport const isPositiveInteger = (value) => {\n return typeof value === 'number' \n && Number.isInteger(value) \n && value > 0;\n};\n","/**************************************************************************/\n/* validateUtils.js */\n/**************************************************************************/\n/* Tệp này là một phần của: */\n/* Open CDP */\n/* https://flast.vn */\n/**************************************************************************/\n/* Bản quyền (c) 2025 - này thuộc về các cộng tác viên Flast Solution */\n/* (xem AUTHORS.md). */\n/* Bản quyền (c) 2024-2025 Long Huu, Quang Duc, Hung Bui */\n/* */\n/* Bạn được quyền sử dụng phần mềm này miễn phí cho bất kỳ mục đích nào, */\n/* bao gồm sao chép, sửa đổi, phân phối, bán lại… */\n/* */\n/* Chỉ cần giữ nguyên thông tin bản quyền và nội dung giấy phép này trong */\n/* các bản sao. */\n/* */\n/* Đội ngũ phát triển mong rằng phần mềm được sử dụng đúng mục đích và */\n/* có trách nghiệm */\n/**************************************************************************/\n\nimport i18next from 'i18next';\n\nexport const validateRegex = {\n phone: /^[+]?[\\s./0-9]*[(]?[0-9]{1,4}[)]?[-\\s./0-9]*$/g,\n password: /^(?=.*[a-zA-Z])(?=.*[0-9])(?=.*\\d).{6,}$/g,\n username: /^([a-z0-9A-Z_-]{3,100})$/g,\n editBookingId: '#bookings/(.*)/edit',\n fullName: /^[a-z0-9 ]{3,100}$/iu,\n number: /^[0-9]+$/iu,\n url: /(https?:\\/\\/[^\\s]+)/g,\n accountNo: /^[\\s./0-9]+$/iu,\n customerName: /\\S+/,\n email: /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/\n};\n\nexport const getPasswordRules = () => [\n {\n pattern: validateRegex.password,\n message: i18next.t('input.password.validateMsg.pattern'),\n },\n];\n\nexport const getConfirmPasswordRules = (name = 'password') => [\n ({ getFieldValue }) => ({\n validator(_, value) {\n if (!value || getFieldValue(name) === value) {\n return Promise.resolve();\n }\n return Promise.reject(\n <p>{`${i18next.t('input.confirmNewPassword.validateMsg.match')}`}</p>,\n );\n },\n }),\n];\n"],"names":["QUERY_PARAMS_PROPERTY","IMAGE_TYPES","mapKeys","id","name","text","value","color","CHANGE_STORE","ACTIONS","INAPP_NOTIFICATION_EMITTER","_config","getGateway","EventEmitter","constructor","this","events","_getEventListByName","eventName","Set","on","fn","add","once","self","onceFn","removeListener","_len","arguments","length","args","Array","_key","apply","emit","_len2","_key2","forEach","bind","addEventListener","delete","FuseUtils","hasPermission","authArr","enabled","generateRoutesFromConfigs","configs","defaultAuth","allRoutes","config","setRoutes","routes","settings","auth","map","route","_objectSpread","_defineProperty","DRAWER_ROUTE","CONTRACT_FORM","InAppEvent","super","_ref","title","rest","_objectWithoutProperties","_excluded","hash","data","normalSuccess","content","undefined","type","normalInfo","normalError","modal","cate","changeStore","RequestUtils","encodeQueryData","ret","d","push","encodeURIComponent","join","generateUrlGetParams","enpoint","params","String","concat","httpRequest","input","service","method","_uri","getOrPost","axios","get","post","then","catch","response","Get","GetAsList","_await$this$httpReque","errorCode","Post","getJsonFromUrl","url","query","substr","result","split","part","item","decodeURIComponent","_ref2","onSuccess","onError","file","_ref2$onProgress","onProgress","progress","_ref2$onSuccessUpload","onSuccessUploadServer","values","api","fmData","FormData","headers","onUploadProgress","event","percent","loaded","total","append","_ref3","fileName","err","error","Error","message","formatDataI18n","displayName","i18next","language","f5List","apiPath","random","dataArray","dataObj","dataAsObj","arrayNotEmpty","isArray","arrayEmpty","decodeProperty","obj","propertys","elm","p","JSON","parse","encodeProperty","stringify","k","dateFormatForm","entity","propertes","format","dayjs","Date","dateFormatOnSubmit","formatTime","fm","moment","formatMoney","x","toLocaleString","calVat","vatPercent","string2Object","e","showErrorDownloadFile","notification","t","description","duration","isImageFile","extension","getExtensionFile","includes","toLocaleLowerCase","getFileNameFromUrl","_url$split","pop","checkFileType","_file$type","trim","indexOf","checkValidFileSize","placeholder","Number","size","Upload","LIST_IGNORE","downloadFileByURL","async","Promise","resolve","loading","responseType","blob","restFileName","a","document","createElement","window","URL","createObjectURL","href","download","click","revokeObjectURL","getFileName","_file$split$pop","splice","splitFile","splitUrl","fileType","formatFiltersTable","filters","outsideFilter","restFilters","key","splitArr","operator","last","head","slice","formatSorter","sorter","field","order","formatSorterTable","access_token","getAccessToken","isAuthTokenValid","setSession","_await$RequestUtils$P","token","success","jwtToken","user","localStorage","setItem","defaults","common","removeItem","getItem","init","handleAuthentication","createMSkuDetails","skuDetails","Object","reduce","groupByName","toMSkuGroup","acc","_acc$key","Map","set","group","from","sort","b","formatDateDashboard","dateTime","minutes","isSame","formatDate","pattern","formatDateDayjs","date","formatBirthday","formatDateFromNow","showTime","isAfter","diff","startOf","fromNow","formatInitialValueDateInput","formatDateTimeComplete","getQueryParamsFromUrl","convertObjToSearchStr","newParams","pickBy","identity","resource","URLSearchParams","toString","onSearch","inputValue","_data$toLowerCase","toLowerCase","search","getStaticImageUrl","image","startsWith","formatterInputNumber","replace","parserInputNumber","formatPhoneNumber","phone","match","calPriceOff","discountValue","discountUnit","isPositiveInteger","isInteger","validateRegex","password","username","editBookingId","fullName","number","accountNo","customerName","email","getPasswordRules","getConfirmPasswordRules","getFieldValue","validator","_","reject","_jsx","children"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ "use strict";var e=require("@babel/runtime/helpers/objectWithoutProperties"),t=require("@babel/runtime/helpers/defineProperty"),r=require("lodash/mapKeys"),o=require("axios"),n=require("i18next"),a=require("lodash"),i=require("moment"),s=require("dayjs"),l=require("antd"),u=require("lodash/forEach"),c=require("lodash/last"),d=require("lodash/head"),p=require("react/jsx-runtime");const m="outsideFilter",h=["png","jpg","jpeg","gif","tif","tiff"];r([{id:11,name:"Web"},{id:1,name:"Facebook"},{id:2,name:"Zalo"},{id:3,name:"Hotline"},{id:4,name:"Trực tiếp"},{id:5,name:"Email"},{id:6,name:"MKT0D"},{id:7,name:"Giới thiệu"},{id:8,name:"Cskh"},{id:9,name:"Partner"},{id:10,name:"Shopee"}],"id");r([{id:1,name:"Chưa liên hệ"},{id:2,name:"Đã liên hệ"}],"id");r([{text:"Doanh số",value:"doanhso"},{text:"SQL",value:"sql"},{text:"Trafic",value:"trafic"}],"value");r([{text:"Cao",value:"cao",color:"red"},{text:"Trung bình",value:"trungbinh",color:"purple"},{text:"Thấp",value:"thap",color:"green"}],"value");r([{value:1,name:"IT",color:"blue"},{value:2,name:"Marketing",color:"green"},{value:3,name:"Kinhdoanh",color:"purple"},{value:4,name:"Khác",color:"orange"}],"value");const f="CHANGE_STORE",g="add__user",v="f5_list",y="in_app_noti",x="",b=()=>x,w=["title"];function S(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);t&&(o=o.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),r.push.apply(r,o)}return r}function D(e){for(var r=1;r<arguments.length;r++){var o=null!=arguments[r]?arguments[r]:{};r%2?S(Object(o),!0).forEach(function(r){t(e,r,o[r])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(o)):S(Object(o)).forEach(function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(o,t))})}return e}class j{constructor(){this.events={}}_getEventListByName(e){return void 0===this.events[e]&&(this.events[e]=new Set),this.events[e]}on(e,t){this._getEventListByName(e).add(t)}once(e,t){const r=this,o=function(){r.removeListener(e,o);for(var n=arguments.length,a=new Array(n),i=0;i<n;i++)a[i]=arguments[i];t.apply(r,a)};this.on(e,o)}emit(e){for(var t=arguments.length,r=new Array(t>1?t-1:0),o=1;o<t;o++)r[o-1]=arguments[o];this._getEventListByName(e).forEach(function(e){e.apply(this,r)}.bind(this))}addEventListener(e,t){this.on(e,t)}removeListener(e,t){this._getEventListByName(e).delete(t)}}class M{static hasPermission(e,t){return"*"===e||(""===(e||"")||(0===e.length||t))}static generateRoutesFromConfigs(e,t){let r=[];return e.forEach(e=>{r=[...r,...this.setRoutes(e,t)]}),r}static setRoutes(e,t){let r=[...e.routes];return(e.settings||e.auth)&&(r=r.map(r=>{let o=e.auth?[...e.auth]:t||null;return o=r.auth?[...o,...r.auth]:o,D(D({},r),{},{settings:D(D({},e.settings),r.settings),auth:o})})),[...r]}}t(M,"EventEmitter",j);const O=new class extends j{constructor(){super(...arguments),t(this,"openDrawer",(t,r)=>{let o=r.title,n=e(r,w);return this.emit("#modal",{hash:t,title:o,data:n})})}normalSuccess(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;this.emit(y,{type:"success",content:e,title:t})}normalInfo(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;this.emit(y,{type:"info",content:e,title:t})}normalError(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;this.emit(y,{type:"error",content:e,title:t})}modal(e,t){this.emit(y,{type:t,content:e,cate:"modal"})}changeStore(e){this.emit(f,e)}};class E{static encodeQueryData(e){if(!e)return"";const t=[];for(let r in e)e[r]&&t.push(encodeURIComponent(r)+"="+encodeURIComponent(e[r]));return t.length>0?"?"+t.join("&"):""}static generateUrlGetParams(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return String(e).concat(this.encodeQueryData(t))}static httpRequest(e,t){let r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"GET",n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:"";const a=b()+t;let i;return i="GET"===r?o.get(a+this.encodeQueryData(e)):o.post(a+this.encodeQueryData(n),e),i.then(e=>e.data).catch(e=>e)}static Get(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return this.httpRequest(t,e,"GET")}static async GetAsList(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r=await this.httpRequest(t,e,"GET"),o=r.data;return 200===r.errorCode?o:[]}static Post(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};return this.httpRequest(t,e,"POST",r)}static getJsonFromUrl(e){if(!e)return{};var t=e.substr(1),r={};return t.split("&").forEach(function(e){var t=e.split("=");r[t[0]]=decodeURIComponent(t[1])}),r}}t(E,"uploadSigFile",e=>{let t=e.onSuccess,r=e.onError,n=e.file,a=e.onProgress,i=void 0===a?e=>e:a,s=e.onSuccessUploadServer,l=void 0===s?e=>e:s,u=e.api;const c=new FormData,d={headers:{"content-type":"multipart/form-data"},onUploadProgress:e=>{i({percent:e.loaded/e.total*100},n)}};c.append("files",n),o.post(b()+"/"+u,c,d).then(e=>{let r=e.data;const o=r.data,a=r.errorCode;t(n),200===a&&""!==((null==o?void 0:o.fileName)||"")&&l(o.fileName)}).catch(e=>{const t=new Error(e.message);r({event:t})})});const A=e=>Array.isArray(e)&&e.length>0;const T=e=>{l.notification.error({message:n.t("error.title"),description:e||n.t("error.errorDownloadFile"),duration:2})},Y=e=>{var t;return null==e||null===(t=e.split("/"))||void 0===t?void 0:t.pop()},N=e=>"string"!=typeof e||-1===e.indexOf(".")?"":e.split(".").pop(),P=e=>e&&e.field&&e.order?"".concat(e.field,":").concat("descend"===e.order?"DESC":"ASC",":NULLS_LAST"):void 0;new class extends M.EventEmitter{constructor(){super(...arguments),t(this,"handleAuthentication",()=>{let e=this.getAccessToken();e?this.isAuthTokenValid(e)?this.emit("onAutoLogin",!0):(this.setSession(null),this.emit("onAutoLogout","access_token expired")):this.emit("onNoAccessToken")}),t(this,"signInWithToken",async()=>{try{const e=await E.Post("/auth/sign-with-token",{token:this.getAccessToken()}),t=e.data,r=e.success;this.setSession(r?t:null)}catch(e){this.emit("onAutoLogout","sign-in-with-token "+e.message)}return"done"}),t(this,"setSession",e=>{if(e){const t=e.jwtToken,r=e.user;localStorage.setItem("jwt_access_token",t),o.defaults.headers.common.Authorization="Bearer "+t,O.emit(f,{type:g,data:r})}else localStorage.removeItem("jwt_access_token"),delete o.defaults.headers.common.Authorization}),t(this,"logout",()=>{this.setSession(null)}),t(this,"isAuthTokenValid",e=>""!==(e||"")),t(this,"getAccessToken",()=>window.localStorage.getItem("jwt_access_token"))}init(){this.handleAuthentication()}};const F=(e,t)=>{var r;const o=t.name,n=t.id,a=t.value,i=o;return null!==(r=e[i])&&void 0!==r||(e[i]={text:i,values:new Map}),e[i].values.set(n,{id:n,text:a}),e},R=e=>({text:e.text,values:Array.from(e.values.values()).sort((e,t)=>e.id-t.id)}),L={phone:/^[+]?[\s./0-9]*[(]?[0-9]{1,4}[)]?[-\s./0-9]*$/g,password:/^(?=.*[a-zA-Z])(?=.*[0-9])(?=.*\d).{6,}$/g,username:/^([a-z0-9A-Z_-]{3,100})$/g,editBookingId:"#bookings/(.*)/edit",fullName:/^[ 0-9a-z\u017F\u212A]{3,100}$/i,number:/^[0-9]+$/i,url:/(https?:\/\/[^\s]+)/g,accountNo:/^[\t-\r \.-9\xA0\u1680\u2000-\u200A\u2028\u2029\u202F\u205F\u3000\uFEFF]+$/i,customerName:/\S+/,email:/^[^\s@]+@[^\s@]+\.[^\s@]+$/};exports.DRAWER_ROUTE={CONTRACT_FORM:"CONTRACT_FORM"},exports.InAppEvent=O,exports.arrayEmpty=e=>!A(e),exports.arrayNotEmpty=A,exports.calPriceOff=e=>{let t=e.discountValue,r=e.discountUnit,o=e.total;return t&&r?"money"===r?t:t*o/100:0},exports.calVat=e=>(e.total||0)*(e.vatPercent/100),exports.checkFileType=e=>{var t;return null===(t=e.type)||void 0===t||t.trim(),!0},exports.checkValidFileSize=(e,t)=>!!(Number(e.size)/1024/1024<3)||(l.notification.error({message:n.t("error.title"),description:n.t("error.fileSize",{name:n.t(t)}),duration:2}),l.Upload.LIST_IGNORE),exports.convertObjToSearchStr=e=>{const t=a.pickBy(e,a.identity);return delete t.resource,new URLSearchParams(t).toString()},exports.createMSkuDetails=e=>Object.values(e.reduce(F,{})).map(R),exports.dataArray=e=>{const t=e.errorCode,r=e.data;return 200===t?r:[]},exports.dataAsObj=e=>{const t=e.errorCode,r=e.data;return 200===t?r:{}},exports.dataObj=e=>{const t=e.errorCode,r=e.data;return 200===t?r:{}},exports.dateFormatForm=function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[],r=arguments.length>2?arguments[2]:void 0;if(e&&t)for(let o of t){const t=e[o];!t||"string"!=typeof t&&"number"!=typeof t||(e[o]=s(new Date(t),r))}},exports.dateFormatOnSubmit=function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[],r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"YYYY-MM-DD HH:mm:ss";if("object"!=typeof e)return s(e).format(r);for(let o of t){const t=e[o];t&&(e[o]=s(t).format(r))}return e},exports.decodeProperty=function e(t){let r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[];if(A(t))return t.forEach(t=>e(t,r)),t;if(!t||"object"!=typeof t)return t;for(let e of r){const r=t[e];r&&"string"==typeof r&&(t[e]=JSON.parse(r))}return t},exports.downloadFileByURL=async e=>new Promise(t=>{null!=e&&e.url||(T(),t({loading:!1}));try{o.get(e.url,{responseType:"blob"}).then(r=>{const o=r.data;o||t({loading:!1});r.headers["content-disposition"];const n=e.fileName||Y(e.url)||"example",a=document.createElement("a"),i=window.URL.createObjectURL(o);a.href=i,a.download=n,a.click(),window.URL.revokeObjectURL(i),t({loading:!1})})}catch(e){T(null==e?void 0:e.message),t({loading:!1})}}),exports.encodeProperty=function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[];if(!e||"object"!=typeof e)return e;if(!A(t))return JSON.stringify(e);for(let r of t){const t=e[r];t&&"object"==typeof t&&(e[r]=JSON.stringify(t))}return e},exports.f5List=function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";return O.emit(f,{type:v,data:{apiPath:e,random:a.random()}})},exports.formatBirthday=e=>e?i(e).format("D MMM YYYY"):null,exports.formatDataI18n=(e,t)=>(null==e?void 0:e[n.language])||t,exports.formatDate=function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"DD-MM-YYYY";return e?i(e).format(t):null},exports.formatDateDashboard=e=>{if(!e)return null;const t=i(e);let r="h:mma";return 0===t.minutes()&&(r="ha"),t.isSame(i(),"year")?t.format("MMM D, ".concat(r)):t.format("MMM D YYYY, ".concat(r))},exports.formatDateDayjs=function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"DD-MM-YYYY";return e?s(e).format(t):null},exports.formatDateFromNow=function(e){let t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];return e?i().isAfter(e)?i().diff(i(e).startOf("day"),"days")<2?i(e).fromNow():i(e).isSame(i(),"year")?t?i(e).format("D MMM, HH:mm"):i(e).format("D MMM"):t?i(e).format("D MMM YYYY, HH:mm"):i(e).format("D MMM YYYY"):"Now":""},exports.formatDateTimeComplete=e=>e?i(e).format("HH:mm DD/MM/YYYY"):null,exports.formatFiltersTable=e=>{const t={},r={};return u(e,(e,o)=>{const n=o.split("."),a=c(n)||"eq";d(n)===m?t[n.slice(1).join(".")]=(null==e?void 0:e[0])||void 0:r[n.slice(0,-1).join(".")||o]={[a]:e?String(e):void 0}}),{outsideFilter:t,filters:r}},exports.formatInitialValueDateInput=e=>e?i(e):null,exports.formatMoney=e=>e?e.toLocaleString("it-IT")+" đ":"0 đ",exports.formatPhoneNumber=e=>{if(!e)return"";const t=e.replace(/\D/g,"").match(/^(\d{4})(\d{3})(\d{3})$/);return t?"(".concat(t[1],") ").concat(t[2],"-").concat(t[3]):e},exports.formatSorterTable=e=>Array.isArray(e)?e.map(e=>P(e)).join(","):P(e),exports.formatTime=function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"DD-MM-YYYY";return e?i(new Date(e)).format(t):"N/a"},exports.formatterInputNumber=e=>"".concat(e).replace(/\B(?=(\d{3})+(?!\d))/g,".").replace(/\.(?=\d{0,2}$)/g,","),exports.getConfirmPasswordRules=function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"password";return[t=>{let r=t.getFieldValue;return{validator:(t,o)=>o&&r(e)!==o?Promise.reject(p.jsx("p",{children:"".concat(n.t("input.confirmNewPassword.validateMsg.match"))})):Promise.resolve()}}]},exports.getExtensionFile=N,exports.getFileName=e=>{var t;return null===(t=e.split("/").pop())||void 0===t||null===(t=t.split("-"))||void 0===t?void 0:t.splice(1).join("-")},exports.getFileNameFromUrl=Y,exports.getPasswordRules=()=>[{pattern:L.password,message:n.t("input.password.validateMsg.pattern")}],exports.getQueryParamsFromUrl=e=>{if(!e)return{};var t=e.substr(1),r={};return t.split("&").forEach(function(e){var t=e.split("=");t[1]&&(r[t[0]]=decodeURIComponent(t[1]))}),r},exports.getStaticImageUrl=e=>e?e.startsWith("http")||e.startsWith("/uploads")?e:"/uploads/".concat(e):"/uploads/image-default.png",exports.isImageFile=e=>{const t=N(e);return!!t&&h.includes(t.toLocaleLowerCase())},exports.isPositiveInteger=e=>"number"==typeof e&&Number.isInteger(e)&&e>0,exports.onSearch=(e,t)=>{var r;return!!t&&-1!==(null==e||null===(r=e.toLowerCase())||void 0===r?void 0:r.search(null==t?void 0:t.toLowerCase()))},exports.parserInputNumber=e=>e?e.replace(/\$\s?|(\.*)/g,"").replace(/(,{1})/g,"."):"",exports.splitFile=e=>{const t=e.split(".");return{fileType:t.pop(),fileName:t.join(".")}},exports.string2Object=e=>{if(!e)return["(empty)",null];if("string"!=typeof e)return["(invalid)",null];try{return[null,JSON.parse(e)]}catch(e){return[e,null]}},exports.validateRegex=L;
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../../src/configs/constant.js","../../src/configs/localData.js","../../src/configs/index.js","../../src/utils/FuseUtils.js","../../src/utils/RequestUtils.js","../../src/utils/dataUtils.js","../../src/utils/fileUtils.js","../../src/utils/formatFilters.js","../../src/utils/jwtService.js","../../src/utils/skuUtils.js","../../src/utils/validateUtils.js","../../src/utils/tools.js","../../src/utils/textUtils.js"],"sourcesContent":["/**************************************************************************/\n/* constant.js */\n/**************************************************************************/\n/* Tệp này là một phần của: */\n/* Open CDP */\n/* https://flast.vn */\n/**************************************************************************/\n/* Bản quyền (c) 2025 - này thuộc về các cộng tác viên Flast Solution */\n/* (xem AUTHORS.md). */\n/* Bản quyền (c) 2024-2025 Long Huu, Quang Duc, Hung Bui */\n/* */\n/* Bạn được quyền sử dụng phần mềm này miễn phí cho bất kỳ mục đích nào, */\n/* bao gồm sao chép, sửa đổi, phân phối, bán lại… */\n/* */\n/* Chỉ cần giữ nguyên thông tin bản quyền và nội dung giấy phép này trong */\n/* các bản sao. */\n/* */\n/* Đội ngũ phát triển mong rằng phần mềm được sử dụng đúng mục đích và */\n/* có trách nghiệm */\n/**************************************************************************/\n\nexport const QUERY_PARAMS_PROPERTY = {\n outsideFilter: 'outsideFilter',\n filters: 'filters',\n extraFilters: 'extraFilters'\n}\n\nexport const MAX_FILE_SIZE_MB = 3;\nexport const VAT_PERCENT = 8;\nexport const HASH_MODAL = \"#modal\";\nexport const FORMAT_TIME_INPUT = 'HH:mm';\nexport const HASH_POPUP = \"HASH_POPUP\";\nexport const HASH_POPUP_CLOSE = \"HASH_POPUP_CLOSE\"\nexport const FORMAT_DATE_INPUT = 'DD-MM-YYYY';\nexport const CURRENCY_UNIT = 'VND';\n\nexport const STATUS_LEAD = {\n CREATE_DATA: 0,\n DO_NOT_MANUFACTORY: 1,\n IS_CONTACT: 2,\n CONTACT_LATER: 6,\n KO_LIEN_HE_DUOC: 4,\n THANH_CO_HOI: 7\n}\n\nexport const getStatusLead = (option) => {\n switch (option) {\n case STATUS_LEAD.CREATE_DATA:\n return ' Chưa liên hệ';\n case STATUS_LEAD.DO_NOT_MANUFACTORY:\n return 'Không triển khai';\n case STATUS_LEAD.IS_CONTACT:\n return ' Đang tư vấn';\n case STATUS_LEAD.CONTACT_LATER:\n return 'Liên hệ sau';\n case STATUS_LEAD.KO_LIEN_HE_DUOC:\n return 'Không liên hệ được';\n case STATUS_LEAD.THANH_CO_HOI:\n return 'Thành cơ hội';\n default:\n return 'N/A';\n }\n}\n\nexport const getColorStatusLead = (option) => {\n switch (option) {\n case STATUS_LEAD.CREATE_DATA:\n return '#f50';\n case STATUS_LEAD.DO_NOT_MANUFACTORY:\n return '#2db7f5';\n case STATUS_LEAD.IS_CONTACT:\n return '#87d068';\n case STATUS_LEAD.CONTACT_LATER:\n return '#108ee9';\n case STATUS_LEAD.KO_LIEN_HE_DUOC:\n return 'red';\n case STATUS_LEAD.THANH_CO_HOI:\n return 'green';\n default:\n return 'black';\n }\n}\n\nexport const getTypeGroup = (option) => {\n switch (option) {\n case 1:\n return 'Sale';\n case 2:\n return 'Chăm sóc khách hàng';\n case 3:\n return 'MarkeTing';\n case 4:\n return 'Kho';\n default:\n return 'N/A';\n }\n}\n\n/**************************************************************************/\n\nexport const SUCCESS_API_CODE = 200;\n\nexport const NGHI_PHEP_META = [\n { id: 1, name: 'Nghỉ phép năm (Annual Leave)' },\n { id: 2, name: 'Nghỉ không lương (Unpaid Absence)' },\n { id: 3, name: 'Nghỉ theo chính sách phúc lợi của công ty (Leave According To Company Welfare Policy)' },\n { id: 4, name: 'Nghỉ ốm hưởng BHXH (Sick Leave With Social Insurance)' },\n { id: 5, name: 'Lý do khác (Other Reasons)' },\n]\n\nexport const OVERTIME_META = [\n { id: 1, name: 'Làm thêm giờ' },\n { id: 2, name: 'Làm thêm vào ngày nghỉ' }\n]\n\nexport const NGHI_PHEP_STATUS_WAITING = 0;\nexport const NGHI_PHEP_STATUS_CONFIRM = 1;\nexport const NGHI_PHEP_STATUS_REJECT = 1;\nexport const NGHI_PHEP_STATUS_DONE = 2;\n\nexport const APP_FOLLOW_STATUS_WAITING = 0;\nexport const APP_FOLLOW_STATUS_CONFIRM = 1;\nexport const APP_FOLLOW_STATUS_DONE = 2;\nexport const APP_FOLLOW_STATUS_REJECT = 3;\n\nexport const NGHI_PHEP_STATUS_TEXT = [\n { id: NGHI_PHEP_STATUS_WAITING, name: 'Chờ duyệt (Waiting For Approval)' },\n { id: NGHI_PHEP_STATUS_REJECT, name: 'Không duyệt (Not Approved)' },\n { id: NGHI_PHEP_STATUS_DONE, name: 'Duyệt (Approved)' }\n]\n\nexport const APP_STATUS_TEXT = NGHI_PHEP_STATUS_TEXT;\n","/**************************************************************************/\n/* localData.js */\n/**************************************************************************/\n/* Tệp này là một phần của: */\n/* Open CDP */\n/* https://flast.vn */\n/**************************************************************************/\n/* Bản quyền (c) 2025 - này thuộc về các cộng tác viên Flast Solution */\n/* (xem AUTHORS.md). */\n/* Bản quyền (c) 2024-2025 Long Huu, Quang Duc, Hung Bui */\n/* */\n/* Bạn được quyền sử dụng phần mềm này miễn phí cho bất kỳ mục đích nào, */\n/* bao gồm sao chép, sửa đổi, phân phối, bán lại… */\n/* */\n/* Chỉ cần giữ nguyên thông tin bản quyền và nội dung giấy phép này trong */\n/* các bản sao. */\n/* */\n/* Đội ngũ phát triển mong rằng phần mềm được sử dụng đúng mục đích và */\n/* có trách nghiệm */\n/**************************************************************************/\n\nimport mapKeys from 'lodash/mapKeys';\n\nexport const ACTIVE_TYPES = [\n {\n value: 2,\n text: 'Kích hoạt',\n color: 'red',\n textColor: \"#ff4d4f\"\n },\n {\n value: 1,\n text: 'Ngưng',\n color: 'green',\n textColor: \"#52c41a\"\n }\n];\n\nexport const IMAGE_TYPES = ['png', 'jpg', 'jpeg', 'gif', 'tif', 'tiff'];\n\nexport const CHANNEL_SOURCE = [\n { 'id': 11, 'name': 'Web' },\n { 'id': 1, 'name': 'Facebook' },\n { 'id': 2, 'name': 'Zalo' },\n { 'id': 3, 'name': 'Hotline' },\n { 'id': 4, 'name': 'Trực tiếp' },\n { 'id': 5, 'name': 'Email' },\n { 'id': 6, 'name': 'MKT0D' },\n { 'id': 7, 'name': 'Giới thiệu' },\n { 'id': 8, 'name': 'Cskh' },\n { 'id': 9, 'name': 'Partner' },\n { 'id': 10, 'name': 'Shopee' }\n];\nexport const CHANNEL_SOURCE_MAP_KEYS = mapKeys(CHANNEL_SOURCE, 'id');\n\nexport const CHANNEL_STATUS = [\n { 'id': 1, 'name': 'Chưa liên hệ' },\n { 'id': 2, 'name': 'Đã liên hệ' }\n];\nexport const CHANNEL_STATUS_MAP_KEYS = mapKeys(CHANNEL_STATUS, 'id');\n\nexport const KPI_TYPE = [\n { text: 'Doanh số', value: 'doanhso' },\n { text: 'SQL', value: 'sql' },\n { text: 'Trafic', value: 'trafic' }\n]\nexport const KPI_TYPE_MAP_KEYS = mapKeys(KPI_TYPE, 'value');\n\nexport const PAYMENT_TYPE_CONST = [\n { label: 'Tiền mặt', value: 6 },\n { label: 'Chuyển khoản MBbank', value: 1 },\n { label: 'Chuyển khoản TPbank', value: 7 },\n { label: 'COD Viettel', value: 2 },\n { label: 'Ví Momo', value: 3 },\n { label: 'Ví Vnpay', value: 4 },\n { label: 'Ncc thu hộ', value: 5 }\n];\n\nexport const PRIORITY_TYPE_TAGS = [\n { text: 'Cao', value: 'cao', color: 'red' },\n { text: 'Trung bình', value: 'trungbinh', color: 'purple' },\n { text: 'Thấp', value: 'thap', color: 'green' }\n];\nexport const PRIORITY_TYPE_TAGS_MAP_KEYS = mapKeys(\n PRIORITY_TYPE_TAGS,\n 'value',\n);\n\nexport const PRODUCT_STATUS = [\n { value: 0, text: 'Ngưng', color: 'red' },\n { value: 1, text: 'Kích hoạt', color: 'green' }\n];\n\nexport const USER_STATUS = [\n { value: 0, text: 'Ngưng', color: 'red' },\n { value: 1, text: 'Kích hoạt', color: 'green' }\n];\n\nexport const DEPARTMENT = [\n { value: 1, name: \"IT\", color: 'blue' },\n { value: 2, name: \"Marketing\", color: 'green' },\n { value: 3, name: \"Kinhdoanh\", color: 'purple' },\n { value: 4, name: \"Khác\", color: 'orange' }\n];\n\nexport const CAR_WORK_TYPE = 1;\nexport const DEPARTMENT_MAP_KEYS_VALUE = mapKeys(DEPARTMENT, 'value');\n\nexport const PROJECT_STATUS_LIST = ['Not Started', 'In Progress', 'Completed', 'On Hold'];\nexport const PROJECT_TASK_STATUS_LIST = ['To Do', 'In Progress', 'Done', 'Cancelled'];\n\nexport const MATERIAL_UNIT_TYPE = [\n { value: \"QUANTITY\", name: \"Số lượng\" },\n { value: \"DIMENSION\", name: \"Kích thước\" },\n { value: \"WEIGHT\", name: \"Trọng lượng\" }\n];\n\n\n\nexport const CAR_NOT_WORK_TYPE = 2;\nexport const REGISTER_WORK_TYPE = [\n { value: 1, text: 'Công tác có phí', color: 'green' },\n { value: 2, text: 'Công tác không phí', color: 'red' }\n];\n\nexport const HOTEL_ROOM_PAY_TYPE_COMPANY = 1;\nexport const HOTEL_ROOM_PAY_TYPE_PERSIONAL = 2;\nexport const HOTEL_ROOM_PAY_TYPE = [\n { value: HOTEL_ROOM_PAY_TYPE_COMPANY, text: 'Công ty trả/company pay', color: 'green' },\n { value: HOTEL_ROOM_PAY_TYPE_PERSIONAL, text: 'Cá nhân tạm ứng/person pay', color: 'red' }\n];\n\nexport const FLIGHT_WAY_TYPE_DEPARTURE = 1;\nexport const FLIGHT_WAY_TYPE_ARRIVAL = 2;\nexport const FLIGHT_WAY_TYPE = [\n { value: FLIGHT_WAY_TYPE_DEPARTURE, text: 'Chiều đi / Departure', color: 'green' },\n { value: FLIGHT_WAY_TYPE_ARRIVAL, text: 'Chiều về / Arrival', color: 'red' }\n];\n","\nexport * from \"./constant\"\nexport * from \"./localData\"\n\nexport const SUCCESS_CODE = 200\nexport const CHANGE_STORE = 'CHANGE_STORE'\nexport const API = { SINGIN: '/auth/login' }\n\nexport const ACTIONS = {\n ADD_USER: 'add__user',\n REMOVE_USER: 'remove__user',\n TOOGLE_COLLAPSE: 'tg_cll',\n F5_LIST: 'f5_list',\n SET_ROUTES: 'set_routes',\n}\n\nexport const INAPP_NOTIFICATION_EMITTER = 'in_app_noti'\nexport const EVENT_ACCEPT_IMAGE_TYPES = '.png, .jpeg, .jpg'\nexport const HASH_MODAL = '#modal'\nexport const HASH_MODAL_CLOSE = '#close-modal'\nexport const DEFAULT_INBOX_ID = 'inbox'\nexport const DEFAULT_PARENT_INBOX_ID = 'parent'\nexport const FORMAT_DATE_INPUT = 'DD-MM-YYYY'\nexport const FORMAT_DATE_TIME_INPUT = 'DD-MM-YYYY HH:mm'\nexport const FORMAT_TIME_INPUT = 'HH:mm'\nexport const MAX_FILE_SIZE_MB = 3\nexport const REPORT_DATE_FORMAT = 'YYYY-MM-DD'\nexport const CURRENCY_UNIT = 'VND'\nexport const EMBED_YOUTUBE_LINK = '//www.youtube.com/embed/'\nexport const DEFAULT_COLOR_VALUE = '#ffffff'\nexport const outerRadius = 143 / 2\n\n// ----------------------------------------------------------------\n// Runtime config\n// App phải gọi initCoreConfig() trước khi dùng bất kỳ API nào\n// ----------------------------------------------------------------\nconst _config = {\n GATEWAY: \"\"\n}\n\n/**\n * Khởi tạo config runtime — gọi 1 lần trong index.js của app\n * @example\n * import { initCoreConfig } from \"@flast-erp/core/configs\"\n * initCoreConfig({ GATEWAY: process.env.REACT_APP_GATEWAY })\n */\nexport function initCoreConfig(config = {}) {\n const gateway = config.GATEWAY || _config.GATEWAY\n Object.assign(_config, {\n ...config,\n GATEWAY: gateway\n })\n}\n\nexport const getGateway = () => _config.GATEWAY\nexport const getConfig = () => ({ ..._config })\n","/**************************************************************************/\n/* FuseUtils.js */\n/**************************************************************************/\n/* Tệp này là một phần của: */\n/* Open CDP */\n/* https://flast.vn */\n/**************************************************************************/\n/* Bản quyền (c) 2025 - này thuộc về các cộng tác viên Flast Solution */\n/* (xem AUTHORS.md). */\n/* Bản quyền (c) 2024-2025 Long Huu, Quang Duc, Hung Bui */\n/* */\n/* Bạn được quyền sử dụng phần mềm này miễn phí cho bất kỳ mục đích nào, */\n/* bao gồm sao chép, sửa đổi, phân phối, bán lại… */\n/* */\n/* Chỉ cần giữ nguyên thông tin bản quyền và nội dung giấy phép này trong */\n/* các bản sao. */\n/* */\n/* Đội ngũ phát triển mong rằng phần mềm được sử dụng đúng mục đích và */\n/* có trách nghiệm */\n/**************************************************************************/\n\nimport { CHANGE_STORE, HASH_MODAL, INAPP_NOTIFICATION_EMITTER } from '@/configs';\n\nclass EventEmitter {\n\n constructor() {\n this.events = {};\n }\n\n _getEventListByName(eventName) {\n if (typeof this.events[eventName] === 'undefined') {\n this.events[eventName] = new Set();\n }\n return this.events[eventName]\n }\n\n on(eventName, fn) {\n this._getEventListByName(eventName).add(fn);\n }\n\n once(eventName, fn) {\n const self = this;\n const onceFn = function (...args) {\n self.removeListener(eventName, onceFn);\n fn.apply(self, args);\n };\n this.on(eventName, onceFn);\n }\n\n emit(eventName, ...args) {\n this._getEventListByName(eventName).forEach(function (fn) {\n fn.apply(this, args);\n }.bind(this));\n }\n\n addEventListener(eventName, fn) {\n this.on(eventName, fn)\n }\n\n removeListener(eventName, fn) {\n this._getEventListByName(eventName).delete(fn);\n }\n}\n\nclass FuseUtils {\n\n static EventEmitter = EventEmitter;\n static hasPermission(authArr, enabled) {\n if (authArr === '*') {\n return true;\n } else if ((authArr || '') === '') {\n return true;\n } else if (authArr.length === 0) {\n return true;\n }\n return enabled;\n }\n\n static generateRoutesFromConfigs(configs, defaultAuth) {\n let allRoutes = [];\n configs.forEach((config) => {\n allRoutes = [\n ...allRoutes,\n ...this.setRoutes(config, defaultAuth)\n ]\n });\n return allRoutes;\n }\n\n static setRoutes(config, defaultAuth) {\n let routes = [...config.routes];\n if (config.settings || config.auth) {\n routes = routes.map((route) => {\n let auth = config.auth ? [...config.auth] : defaultAuth || null;\n auth = route.auth ? [...auth, ...route.auth] : auth;\n return {\n ...route,\n settings: { ...config.settings, ...route.settings },\n auth\n };\n });\n }\n return [...routes];\n }\n}\n\nclass AppEvent extends EventEmitter {\n normalSuccess(content, title = null) {\n this.emit(INAPP_NOTIFICATION_EMITTER, { type: 'success', content, title });\n }\n normalInfo(content, title = null) {\n this.emit(INAPP_NOTIFICATION_EMITTER, { type: 'info', content, title });\n }\n normalError(content, title = null) {\n this.emit(INAPP_NOTIFICATION_EMITTER, { type: 'error', content, title });\n }\n modal(content, type) {\n this.emit(INAPP_NOTIFICATION_EMITTER, { type, content, cate: 'modal' });\n }\n changeStore(data) {\n this.emit(CHANGE_STORE, data);\n }\n openDrawer = (route, { title, ...rest }) => this.emit(HASH_MODAL, {\n hash: route,\n title,\n data: rest\n });\n}\n\nexport const DRAWER_ROUTE = {\n CONTRACT_FORM: 'CONTRACT_FORM'\n}\n\nexport const InAppEvent = new AppEvent();\nexport default FuseUtils;\n","/**************************************************************************/\n/* RequestUtils.js */\n/**************************************************************************/\n/* Tệp này là một phần của: */\n/* Open CDP */\n/* https://flast.vn */\n/**************************************************************************/\n/* Bản quyền (c) 2025 - này thuộc về các cộng tác viên Flast Solution */\n/* (xem AUTHORS.md). */\n/* Bản quyền (c) 2024-2025 Long Huu, Quang Duc, Hung Bui */\n/* */\n/* Bạn được quyền sử dụng phần mềm này miễn phí cho bất kỳ mục đích nào, */\n/* bao gồm sao chép, sửa đổi, phân phối, bán lại… */\n/* */\n/* Chỉ cần giữ nguyên thông tin bản quyền và nội dung giấy phép này trong */\n/* các bản sao. */\n/* */\n/* Đội ngũ phát triển mong rằng phần mềm được sử dụng đúng mục đích và */\n/* có trách nghiệm */\n/**************************************************************************/\n\nimport { getGateway, SUCCESS_CODE } from '@/configs';\nimport axios from 'axios';\n\nclass RequestUtils {\n\n\tstatic encodeQueryData(data) {\n\t\tif (!data) {\n\t\t\treturn '';\n\t\t}\n\t\tconst ret = [];\n\t\tfor (let d in data) {\n\t\t\tif (!data[d]) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tret.push(encodeURIComponent(d) + '=' + encodeURIComponent(data[d]));\n\t\t}\n\t\treturn ret.length > 0 ? ('?' + ret.join('&')) : '';\n\t}\n\n\tstatic generateUrlGetParams(enpoint, params = {}) {\n\t\treturn String(enpoint).concat(this.encodeQueryData(params));\n\t}\n\n\tstatic httpRequest(input, service, method = 'GET', params = '') {\n\t\tconst _uri = getGateway() + service;\n\t\tlet getOrPost;\n\t\tif (method === 'GET') {\n\t\t\tgetOrPost = axios.get(_uri + this.encodeQueryData(input));\n\t\t} else {\n\t\t\tgetOrPost = axios.post(_uri + this.encodeQueryData(params), input);\n\t\t}\n\t\treturn getOrPost.then(({ data }) => {\n\t\t\treturn data;\n\t\t}).catch((response) => {\n\t\t\treturn response;\n\t\t});\n\t}\n\n\tstatic Get(service, input = {}) {\n\t\treturn this.httpRequest(input, service, 'GET');\n\t}\n\n\tstatic async GetAsList(service, input = {}) {\n\t\tlet { data, errorCode } = await this.httpRequest(input, service, 'GET');\n\t\treturn errorCode === 200 ? data : [];\n\t}\n\n\tstatic Post(service, input = {}, params = {}) {\n\t\treturn this.httpRequest(input, service, 'POST', params);\n\t}\n\n\tstatic getJsonFromUrl(url) {\n\t\tif (!url) return {};\n\t\tvar query = url.substr(1);\n\t\tvar result = {};\n\t\tquery.split(\"&\").forEach(function (part) {\n\t\t\tvar item = part.split(\"=\");\n\t\t\tresult[item[0]] = decodeURIComponent(item[1]);\n\t\t});\n\t\treturn result;\n\t}\n\n\tstatic uploadSigFile = ({\n\t\tonSuccess,\n\t\tonError,\n\t\tfile,\n\t\tonProgress = (progress) => progress,\n\t\tonSuccessUploadServer = (values) => values,\n\t\tapi\n\t}) => {\n\t\tconst fmData = new FormData();\n\t\tconst config = {\n\t\t\theaders: { \"content-type\": \"multipart/form-data\" },\n\t\t\tonUploadProgress: event => {\n\t\t\t\tonProgress({ percent: (event.loaded / event.total) * 100 }, file);\n\t\t\t}\n\t\t};\n\t\tfmData.append(\"files\", file);\n\t\taxios.post(getGateway() + \"/\" + api, fmData, config).then(({ data: ret }) => {\n\t\t\tconst { data, errorCode } = ret;\n\t\t\tonSuccess(file);\n\t\t\tif (errorCode === SUCCESS_CODE && (data?.fileName || '') !== '') {\n\t\t\t\tonSuccessUploadServer(data.fileName);\n\t\t\t}\n\t\t}).catch(err => {\n\t\t\tconst error = new Error(err.message);\n\t\t\tonError({ event: error });\n\t\t});\n\t}\n}\n\nexport default RequestUtils;\n","/**************************************************************************/\n/* dataUtils.js */\n/**************************************************************************/\n/* Tệp này là một phần của: */\n/* Open CDP */\n/* https://flast.vn */\n/**************************************************************************/\n/* Bản quyền (c) 2025 - này thuộc về các cộng tác viên Flast Solution */\n/* (xem AUTHORS.md). */\n/* Bản quyền (c) 2024-2025 Long Huu, Quang Duc, Hung Bui */\n/* */\n/* Bạn được quyền sử dụng phần mềm này miễn phí cho bất kỳ mục đích nào, */\n/* bao gồm sao chép, sửa đổi, phân phối, bán lại… */\n/* */\n/* Chỉ cần giữ nguyên thông tin bản quyền và nội dung giấy phép này trong */\n/* các bản sao. */\n/* */\n/* Đội ngũ phát triển mong rằng phần mềm được sử dụng đúng mục đích và */\n/* có trách nghiệm */\n/**************************************************************************/\n\nimport i18next from 'i18next';\nimport { random } from \"lodash\";\nimport { InAppEvent } from \"@/utils/FuseUtils\";\nimport { ACTIONS, CHANGE_STORE } from \"@/configs\";\nimport moment from 'moment';\nimport dayjs from 'dayjs';\n\nexport const formatDataI18n = (displayName, name) => {\n return displayName?.[i18next.language] || name;\n};\n\nexport const f5List = (apiPath = '') => InAppEvent.emit(CHANGE_STORE, {\n type: ACTIONS.F5_LIST,\n data: { apiPath, random: random() }\n});\n\nexport const dataArray = (ret) => {\n const { errorCode, data } = ret;\n return errorCode === 200 ? data : [];\n}\n\nexport const dataObj = (ret) => {\n const { errorCode, data } = ret;\n return errorCode === 200 ? data : {};\n}\n\nexport const dataAsObj = (ret) => {\n const { errorCode, data } = ret;\n return errorCode === 200 ? data : {};\n}\n\nexport const arrayNotEmpty = (data) => Array.isArray(data) && data.length > 0;\nexport const arrayEmpty = (data) => !arrayNotEmpty(data);\n\nexport function decodeProperty(obj, propertys = []) {\n if (arrayNotEmpty(obj)) {\n obj.forEach(elm => decodeProperty(elm, propertys));\n return obj;\n }\n if (!obj || typeof obj !== 'object') {\n return obj;\n }\n for (let p of propertys) {\n const value = obj[p];\n if (value && typeof value === 'string') {\n obj[p] = JSON.parse(value);\n }\n }\n return obj;\n}\n\nexport function encodeProperty(obj, propertys = []) {\n if (!obj || typeof obj !== 'object') {\n return obj;\n }\n if (!arrayNotEmpty(propertys)) {\n return JSON.stringify(obj);\n }\n for (let k of propertys) {\n const value = obj[k];\n if (value && typeof value === 'object') {\n obj[k] = JSON.stringify(value);\n }\n }\n return obj;\n}\n\n/* dateFormatForm(entity, ['startTime', 'endTime'], 'HH:mm') */\nexport const dateFormatForm = (entity, propertes = [], format) => {\n if (!entity || !propertes) {\n return;\n }\n for (let k of propertes) {\n const value = entity[k];\n if (value && (typeof value === 'string' || typeof value === 'number')) {\n entity[k] = dayjs(new Date(value), format);\n }\n }\n}\n\nexport const dateFormatOnSubmit = (entity, propertes = [], format = \"YYYY-MM-DD HH:mm:ss\") => {\n\tif(typeof(entity) !== 'object') {\n\t\treturn dayjs(entity).format(format);\n\t}\n\tfor(let k of propertes) {\n\t\tconst value = entity[k];\n\t\tif(value) {\n\t\t\tentity[k] = dayjs(value).format(format);\n\t\t}\n\t}\n\treturn entity;\n}\n\nexport const formatTime = (text, fm = \"DD-MM-YYYY\") => text ? moment(new Date(text)).format(fm) : 'N/a';\nexport const formatMoney = (x) => x ? x.toLocaleString('it-IT') + ' đ' : '0 đ';\nexport const calVat = ({ total, vatPercent }) => (total || 0) * (vatPercent / 100);\n\nexport const string2Object = (data) => {\n\tif(!data) {\n\t\treturn [ '(empty)', null ];\n\t}\n\tif(typeof(data) !== 'string') {\n\t\treturn [ '(invalid)', null ];\n\t}\n\ttry {\n\t\tlet obj = JSON.parse(data);\n\t\treturn [ null, obj ];\n\t} catch (e) {\n\t\treturn [ e, null ];\n\t}\n}\n","/**************************************************************************/\n/* fileUtils.js */\n/**************************************************************************/\n/* Tệp này là một phần của: */\n/* Open CDP */\n/* https://flast.vn */\n/**************************************************************************/\n/* Bản quyền (c) 2025 - này thuộc về các cộng tác viên Flast Solution */\n/* (xem AUTHORS.md). */\n/* Bản quyền (c) 2024-2025 Long Huu, Quang Duc, Hung Bui */\n/* */\n/* Bạn được quyền sử dụng phần mềm này miễn phí cho bất kỳ mục đích nào, */\n/* bao gồm sao chép, sửa đổi, phân phối, bán lại… */\n/* */\n/* Chỉ cần giữ nguyên thông tin bản quyền và nội dung giấy phép này trong */\n/* các bản sao. */\n/* */\n/* Đội ngũ phát triển mong rằng phần mềm được sử dụng đúng mục đích và */\n/* có trách nghiệm */\n/**************************************************************************/\n\nimport { IMAGE_TYPES } from '@/configs/localData';\nimport { notification, Upload } from 'antd';\nimport i18next from 'i18next';\nimport { MAX_FILE_SIZE_MB } from '@/configs/constant';\nimport axios from 'axios';\n\nconst showErrorDownloadFile = (message) => {\n notification.error({\n message: i18next.t('error.title'),\n description: message || i18next.t('error.errorDownloadFile'),\n duration: 2\n });\n};\n\nexport const isImageFile = (fileName) => {\n const extension = getExtensionFile(fileName);\n if (!extension) return false;\n return IMAGE_TYPES.includes(extension.toLocaleLowerCase());\n};\n\nexport const getFileNameFromUrl = (url) => url?.split('/')?.pop();\nexport const checkFileType = (file) => {\n if (!file.type?.trim()) {\n\n }\n return true;\n};\n\nexport const getExtensionFile = (fileName) => {\n if (typeof fileName !== 'string' || fileName.indexOf('.') === -1) return '';\n return fileName.split('.').pop();\n};\n\nexport const checkValidFileSize = (file, placeholder) => {\n const isCheckSize = Number(file.size) / 1024 / 1024 < MAX_FILE_SIZE_MB;\n if (!isCheckSize) {\n notification.error({\n message: i18next.t('error.title'),\n description: i18next.t('error.fileSize', {\n name: i18next.t(placeholder),\n }),\n duration: 2,\n });\n return Upload.LIST_IGNORE;\n }\n return true;\n};\n\nexport const downloadFileByURL = async (file) => {\n return new Promise(resolve => {\n if (!file?.url) {\n showErrorDownloadFile();\n resolve({ loading: false });\n }\n try {\n axios.get(file.url, { responseType: 'blob' }).then(response => {\n const blob = response.data;\n if (!blob) {\n resolve({ loading: false });\n }\n const disposition = response.headers['content-disposition'];\n const restFileName = file.fileName || getFileNameFromUrl(file.url) || 'example';\n const a = document.createElement('a');\n const url = window.URL.createObjectURL(blob);\n a.href = url;\n a.download = restFileName;\n a.click();\n window.URL.revokeObjectURL(url);\n resolve({ loading: false });\n });\n } catch (error) {\n showErrorDownloadFile(error?.message);\n resolve({ loading: false });\n }\n });\n};\n\nexport const getFileName = (file) =>\n file.split('/').pop()?.split('-')?.splice(1).join('-');\n\nexport const splitFile = (url) => {\n const splitUrl = url.split('.');\n const fileType = splitUrl.pop();\n const fileName = splitUrl.join('.');\n return { fileType, fileName };\n};\n","/**************************************************************************/\n/* formatFilters.js */\n/**************************************************************************/\n/* Tệp này là một phần của: */\n/* Open CDP */\n/* https://flast.vn */\n/**************************************************************************/\n/* Bản quyền (c) 2025 - này thuộc về các cộng tác viên Flast Solution */\n/* (xem AUTHORS.md). */\n/* Bản quyền (c) 2024-2025 Long Huu, Quang Duc, Hung Bui */\n/* */\n/* Bạn được quyền sử dụng phần mềm này miễn phí cho bất kỳ mục đích nào, */\n/* bao gồm sao chép, sửa đổi, phân phối, bán lại… */\n/* */\n/* Chỉ cần giữ nguyên thông tin bản quyền và nội dung giấy phép này trong */\n/* các bản sao. */\n/* */\n/* Đội ngũ phát triển mong rằng phần mềm được sử dụng đúng mục đích và */\n/* có trách nghiệm */\n/**************************************************************************/\n\nimport forEach from 'lodash/forEach';\nimport last from 'lodash/last';\nimport head from 'lodash/head';\nimport { QUERY_PARAMS_PROPERTY } from '@/configs/constant';\n\nexport const formatFiltersTable = (filters) => {\n const outsideFilter = {};\n const restFilters = {};\n forEach(filters, (value, key) => {\n const splitArr = key.split('.');\n const operator = last(splitArr) || 'eq';\n if (head(splitArr) === QUERY_PARAMS_PROPERTY.outsideFilter) {\n outsideFilter[splitArr.slice(1).join('.')] = value?.[0] || undefined;\n } else {\n restFilters[splitArr.slice(0, -1).join('.') || key] = {\n [operator]: value ? String(value) : undefined,\n };\n }\n });\n return { outsideFilter, filters: restFilters };\n};\n\nconst formatSorter = (sorter) => {\n return sorter && sorter.field && sorter.order\n ? `${sorter.field}:${sorter.order === 'descend' ? 'DESC' : 'ASC'}:NULLS_LAST`\n : undefined;\n};\n\nexport const formatSorterTable = (sorter) => {\n if (Array.isArray(sorter)) {\n return sorter.map(item => formatSorter(item)).join(',');\n } else {\n return formatSorter(sorter);\n }\n};\n","/**************************************************************************/\n/* jwtService.js */\n/**************************************************************************/\n/* Tệp này là một phần của: */\n/* Open CDP */\n/* https://flast.vn */\n/**************************************************************************/\n/* Bản quyền (c) 2025 - này thuộc về các cộng tác viên Flast Solution */\n/* (xem AUTHORS.md). */\n/* Bản quyền (c) 2024-2025 Long Huu, Quang Duc, Hung Bui */\n/* */\n/* Bạn được quyền sử dụng phần mềm này miễn phí cho bất kỳ mục đích nào, */\n/* bao gồm sao chép, sửa đổi, phân phối, bán lại… */\n/* */\n/* Chỉ cần giữ nguyên thông tin bản quyền và nội dung giấy phép này trong */\n/* các bản sao. */\n/* */\n/* Đội ngũ phát triển mong rằng phần mềm được sử dụng đúng mục đích và */\n/* có trách nghiệm */\n/**************************************************************************/\n\nimport FuseUtils, { InAppEvent } from './FuseUtils';\nimport axios from 'axios';\nimport { CHANGE_STORE, ACTIONS } from \"@/configs\";\nimport RequestUtils from './RequestUtils';\n\nclass jwtService extends FuseUtils.EventEmitter {\n\n init() {\n this.handleAuthentication();\n }\n\n handleAuthentication = () => {\n let access_token = this.getAccessToken();\n if (!access_token) {\n this.emit('onNoAccessToken');\n return;\n }\n\n if (this.isAuthTokenValid(access_token)) {\n this.emit('onAutoLogin', true);\n } else {\n this.setSession(null);\n this.emit('onAutoLogout', 'access_token expired');\n }\n };\n\n signInWithToken = async () => {\n try {\n const { data, success } = await RequestUtils.Post('/auth/sign-with-token', {\n token: this.getAccessToken()\n });\n this.setSession(success ? data : null);\n } catch (e) {\n this.emit('onAutoLogout', 'sign-in-with-token ' + e.message);\n }\n return \"done\";\n };\n\n setSession = (data) => {\n if (data) {\n const { jwtToken: token, user } = data;\n localStorage.setItem('jwt_access_token', token);\n axios.defaults.headers.common['Authorization'] = 'Bearer ' + token;\n InAppEvent.emit(CHANGE_STORE, { type: ACTIONS.ADD_USER, data: user });\n } else {\n localStorage.removeItem('jwt_access_token');\n delete axios.defaults.headers.common['Authorization'];\n }\n };\n\n logout = () => {\n this.setSession(null);\n };\n\n isAuthTokenValid = access_token => {\n return (access_token || '') !== '';\n };\n\n getAccessToken = () => {\n return window.localStorage.getItem('jwt_access_token');\n };\n}\n\nconst instance = new jwtService();\nexport default instance;\n","/**\n * @param {*} skuDetails \n * [{ \"id\": 20, \"productId\": 776, \"skuId\": 11, \"name\": \"Bồi vỏ\", \"value\": \"Giấy Mỹ thuật\", \"attributedId\": 10024, \"attributedValueId\": 10090, \"del\": 0 }]\n * @returns [{ text: 'Bồi vỏ', values: [{id: 20, text: 'Giấy Mỹ thuật'}]}]\n */\nconst createMSkuDetails = (skuDetails) => \n Object.values(skuDetails.reduce(groupByName, {})).map(toMSkuGroup);\n\n/* Nhóm theo name, giữ lại id + value duy nhất */\nconst groupByName = (acc, item) => {\n const { name, id, value } = item;\n const key = name;\n acc[key] ??= { text: key, values: new Map() };\n acc[key].values.set(id, { id, text: value });\n return acc;\n};\n\n/* Chuyển Map thành mảng và sắp xếp theo id */\nconst toMSkuGroup = (group) => ({\n text: group.text,\n values: Array.from(group.values.values()).sort((a, b) => a.id - b.id)\n});\n\nexport { createMSkuDetails };","/**************************************************************************/\n/* validateUtils.js */\n/**************************************************************************/\n/* Tệp này là một phần của: */\n/* Open CDP */\n/* https://flast.vn */\n/**************************************************************************/\n/* Bản quyền (c) 2025 - này thuộc về các cộng tác viên Flast Solution */\n/* (xem AUTHORS.md). */\n/* Bản quyền (c) 2024-2025 Long Huu, Quang Duc, Hung Bui */\n/* */\n/* Bạn được quyền sử dụng phần mềm này miễn phí cho bất kỳ mục đích nào, */\n/* bao gồm sao chép, sửa đổi, phân phối, bán lại… */\n/* */\n/* Chỉ cần giữ nguyên thông tin bản quyền và nội dung giấy phép này trong */\n/* các bản sao. */\n/* */\n/* Đội ngũ phát triển mong rằng phần mềm được sử dụng đúng mục đích và */\n/* có trách nghiệm */\n/**************************************************************************/\n\nimport i18next from 'i18next';\n\nexport const validateRegex = {\n phone: /^[+]?[\\s./0-9]*[(]?[0-9]{1,4}[)]?[-\\s./0-9]*$/g,\n password: /^(?=.*[a-zA-Z])(?=.*[0-9])(?=.*\\d).{6,}$/g,\n username: /^([a-z0-9A-Z_-]{3,100})$/g,\n editBookingId: '#bookings/(.*)/edit',\n fullName: /^[a-z0-9 ]{3,100}$/iu,\n number: /^[0-9]+$/iu,\n url: /(https?:\\/\\/[^\\s]+)/g,\n accountNo: /^[\\s./0-9]+$/iu,\n customerName: /\\S+/,\n email: /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/\n};\n\nexport const getPasswordRules = () => [\n {\n pattern: validateRegex.password,\n message: i18next.t('input.password.validateMsg.pattern'),\n },\n];\n\nexport const getConfirmPasswordRules = (name = 'password') => [\n ({ getFieldValue }) => ({\n validator(_, value) {\n if (!value || getFieldValue(name) === value) {\n return Promise.resolve();\n }\n return Promise.reject(\n <p>{`${i18next.t('input.confirmNewPassword.validateMsg.match')}`}</p>,\n );\n },\n }),\n];\n","\nimport { pickBy, identity } from 'lodash'\n\nexport const getQueryParamsFromUrl = (url) => {\n if (!url) {\n return {};\n }\n var query = url.substr(1);\n var result = {};\n query.split(\"&\").forEach(function (part) {\n var item = part.split(\"=\");\n if (item[1]) {\n result[item[0]] = decodeURIComponent(item[1]);\n }\n });\n return result;\n};\n\nexport const convertObjToSearchStr = (params) => {\n /* removes undefined, \"\", 0, null, ... */\n const newParams = pickBy(params, identity);\n delete newParams.resource;\n return new URLSearchParams(newParams).toString();\n};\n\nexport const onSearch = (data, inputValue) =>\n !!inputValue && data?.toLowerCase()?.search(inputValue?.toLowerCase()) !== -1;\n\nexport const getStaticImageUrl = (image) => {\n if (!image) {\n return '/uploads/image-default.png';\n }\n if (image.startsWith('http')) {\n return image;\n }\n\n return image.startsWith('/uploads') ? image : \"/uploads/\".concat(image);\n};\n\nexport const formatterInputNumber = (value) =>\n `${value}`\n .replace(/\\B(?=(\\d{3})+(?!\\d))/g, '.')\n .replace(/\\.(?=\\d{0,2}$)/g, ',');\n\nexport const parserInputNumber = (value) => {\n return value ? value.replace(/\\$\\s?|(\\.*)/g, '').replace(/(,{1})/g, '.') : '';\n};\n\nexport const formatPhoneNumber = (phone) => {\n if (!phone) {\n return '';\n }\n const cleaned = phone.replace(/\\D/g, '');\n const match = cleaned.match(/^(\\d{4})(\\d{3})(\\d{3})$/);\n if (match) {\n return `(${match[1]}) ${match[2]}-${match[3]}`;\n }\n return phone;\n}\n\nexport const calPriceOff = ({ discountValue, discountUnit, total }) => {\n if (!discountValue || !discountUnit) {\n return 0;\n }\n if (discountUnit === \"money\") {\n return discountValue;\n }\n return (discountValue * total) / 100;\n};\n\nexport const isPositiveInteger = (value) => {\n return typeof value === 'number' \n && Number.isInteger(value) \n && value > 0;\n};\n","import moment from 'moment';\nimport dayjs from 'dayjs';\n\nexport const formatDateDashboard = (text) => {\n if (!text) {\n return null;\n }\n const dateTime = moment(text);\n let formatTime = 'h:mma';\n if (dateTime.minutes() === 0) formatTime = 'ha';\n return dateTime.isSame(moment(), 'year')\n ? dateTime.format(`MMM D, ${formatTime}`)\n : dateTime.format(`MMM D YYYY, ${formatTime}`);\n};\n\nexport const formatDate = (text, pattern = 'DD-MM-YYYY') => {\n return text ? moment(text).format(pattern) : null;\n};\n\nexport const formatDateDayjs = (date, pattern = 'DD-MM-YYYY') => {\n return date ? dayjs(date).format(pattern) : null;\n}\n\nexport const formatBirthday = (text) => {\n return text ? moment(text).format('D MMM YYYY') : null;\n};\n\nexport const formatDateFromNow = (date, showTime = true) => {\n if (!date) {\n return '';\n }\n if (moment().isAfter(date)) {\n /* nếu nhỏ hơn 2 ngày: TODAY , 1 day before */\n if (moment().diff(moment(date).startOf('day'), 'days') < 2) {\n return moment(date).fromNow();\n }\n /* nếu trong năm */\n if (moment(date).isSame(moment(), 'year')) {\n return showTime ? moment(date).format('D MMM, HH:mm') : moment(date).format('D MMM');\n }\n /* lớn hơn năm hiện tại */\n return showTime ? moment(date).format('D MMM YYYY, HH:mm') : moment(date).format('D MMM YYYY');\n }\n return 'Now';\n};\n\nexport const formatInitialValueDateInput = (value) =>\n value ? moment(value) : null;\n\nexport const formatDateTimeComplete = (text) => {\n return text ? moment(text).format('HH:mm DD/MM/YYYY') : null;\n};\n"],"names":["QUERY_PARAMS_PROPERTY","IMAGE_TYPES","mapKeys","id","name","text","value","color","CHANGE_STORE","ACTIONS","INAPP_NOTIFICATION_EMITTER","_config","getGateway","EventEmitter","constructor","this","events","_getEventListByName","eventName","Set","on","fn","add","once","self","onceFn","removeListener","_len","arguments","length","args","Array","_key","apply","emit","_len2","_key2","forEach","bind","addEventListener","delete","FuseUtils","hasPermission","authArr","enabled","generateRoutesFromConfigs","configs","defaultAuth","allRoutes","config","setRoutes","routes","settings","auth","map","route","_objectSpread","_defineProperty","InAppEvent","super","_ref","title","rest","_objectWithoutProperties","_excluded","hash","data","normalSuccess","content","undefined","type","normalInfo","normalError","modal","cate","changeStore","RequestUtils","encodeQueryData","ret","d","push","encodeURIComponent","join","generateUrlGetParams","enpoint","params","String","concat","httpRequest","input","service","method","_uri","getOrPost","axios","get","post","then","catch","response","Get","GetAsList","_await$this$httpReque","errorCode","Post","getJsonFromUrl","url","query","substr","result","split","part","item","decodeURIComponent","_ref2","onSuccess","onError","file","_ref2$onProgress","onProgress","progress","_ref2$onSuccessUpload","onSuccessUploadServer","values","api","fmData","FormData","headers","onUploadProgress","event","percent","loaded","total","append","_ref3","fileName","err","error","Error","message","arrayNotEmpty","isArray","showErrorDownloadFile","notification","i18next","t","description","duration","getFileNameFromUrl","_url$split","pop","getExtensionFile","indexOf","formatSorter","sorter","field","order","access_token","getAccessToken","isAuthTokenValid","setSession","async","_await$RequestUtils$P","token","success","e","jwtToken","user","localStorage","setItem","defaults","common","removeItem","window","getItem","init","handleAuthentication","groupByName","acc","_acc$key","key","Map","set","toMSkuGroup","group","from","sort","a","b","validateRegex","phone","password","username","editBookingId","fullName","number","accountNo","customerName","email","CONTRACT_FORM","discountValue","discountUnit","vatPercent","_file$type","trim","checkValidFileSize","placeholder","Number","size","Upload","LIST_IGNORE","newParams","pickBy","identity","resource","URLSearchParams","toString","skuDetails","Object","reduce","entity","propertes","format","k","dayjs","Date","decodeProperty","obj","propertys","elm","p","JSON","parse","Promise","resolve","loading","responseType","blob","restFileName","document","createElement","URL","createObjectURL","href","download","click","revokeObjectURL","stringify","apiPath","random","moment","formatDataI18n","displayName","language","pattern","dateTime","formatTime","minutes","isSame","date","showTime","isAfter","diff","startOf","fromNow","filters","outsideFilter","restFilters","splitArr","operator","last","head","slice","x","toLocaleString","match","replace","fm","getFieldValue","validator","_","reject","_jsx","children","_file$split$pop","splice","getPasswordRules","image","startsWith","extension","includes","toLocaleLowerCase","isInteger","onSearch","inputValue","_data$toLowerCase","toLowerCase","search","splitUrl","fileType"],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,93 @@
1
+ {
2
+ "name": "@flast-erp/core",
3
+ "version": "1.0.4",
4
+ "description": "Shared core library for Flast ERP applications",
5
+ "main": "dist/index.js",
6
+ "module": "dist/index.esm.js",
7
+ "types": "dist/index.d.ts",
8
+ "files": [
9
+ "dist"
10
+ ],
11
+ "exports": {
12
+ ".": {
13
+ "import": "./dist/index.esm.js",
14
+ "require": "./dist/index.js",
15
+ "types": "./dist/index.d.ts"
16
+ },
17
+ "./components": {
18
+ "import": "./dist/components/index.esm.js",
19
+ "require": "./dist/components/index.js"
20
+ },
21
+ "./hooks": {
22
+ "import": "./dist/hooks/index.esm.js",
23
+ "require": "./dist/hooks/index.js"
24
+ },
25
+ "./utils": {
26
+ "import": "./dist/utils/index.esm.js",
27
+ "require": "./dist/utils/index.js"
28
+ },
29
+ "./configs": {
30
+ "import": "./dist/configs/index.esm.js",
31
+ "require": "./dist/configs/index.js"
32
+ }
33
+ },
34
+ "scripts": {
35
+ "build": "rollup -c rollup.config.js",
36
+ "build:watch": "rollup -c rollup.config.js --watch",
37
+ "clean": "rimraf -rf dist",
38
+ "prebuild": "npm run clean",
39
+ "lint": "eslint src --ext .js,.jsx",
40
+ "prepare": "npm run build",
41
+ "release:patch": "npm version patch && npm publish --access public",
42
+ "release:minor": "npm version minor && npm publish --access public",
43
+ "release:major": "npm version major && npm publish --access public"
44
+ },
45
+ "peerDependencies": {
46
+ "@ant-design/icons": "^6.0.0",
47
+ "antd": "^5.21.5",
48
+ "axios": ">=0.27.0",
49
+ "dayjs": ">=1.11.0",
50
+ "i18next": "^21.9.1",
51
+ "jodit-react": "^5.2.31",
52
+ "lodash": ">=4.17.0",
53
+ "moment": "^2.29.4",
54
+ "query-string": "^7.1.1",
55
+ "react": ">=18.0.0",
56
+ "react-dom": ">=18.0.0",
57
+ "react-i18next": "^11.18.5",
58
+ "react-router": ">=6.0.0",
59
+ "react-router-dom": ">=6.0.0",
60
+ "react-waypoint": "^10.3.0",
61
+ "styled-components": "^5.3.5"
62
+ },
63
+ "devDependencies": {
64
+ "@babel/core": "^7.23.0",
65
+ "@babel/plugin-transform-runtime": "^7.23.0",
66
+ "@babel/preset-env": "^7.23.0",
67
+ "@babel/preset-react": "^7.22.0",
68
+ "@rollup/plugin-babel": "^6.0.4",
69
+ "@rollup/plugin-commonjs": "^25.0.7",
70
+ "@rollup/plugin-node-resolve": "^15.2.3",
71
+ "@rollup/plugin-replace": "^5.0.5",
72
+ "@rollup/plugin-terser": "^0.4.4",
73
+ "rollup": "^4.6.0",
74
+ "rollup-plugin-peer-deps-external": "^2.2.4",
75
+ "rollup-plugin-postcss": "^4.0.2"
76
+ },
77
+ "publishConfig": {
78
+ "access": "public"
79
+ },
80
+ "keywords": [
81
+ "erp",
82
+ "flast",
83
+ "react",
84
+ "antd",
85
+ "components"
86
+ ],
87
+ "license": "MIT",
88
+ "dependencies": {
89
+ "@babel/runtime": "^7.29.7",
90
+ "@rollup/plugin-alias": "^6.0.0",
91
+ "rimraf": "^6.1.3"
92
+ }
93
+ }