@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.
- package/README.md +105 -0
- package/dist/DataContext.esm.js +2 -0
- package/dist/DataContext.esm.js.map +1 -0
- package/dist/DataContext.js +2 -0
- package/dist/DataContext.js.map +1 -0
- package/dist/components/index.esm.js +2 -0
- package/dist/components/index.esm.js.map +1 -0
- package/dist/components/index.js +2 -0
- package/dist/components/index.js.map +1 -0
- package/dist/configs/index.esm.js +2 -0
- package/dist/configs/index.esm.js.map +1 -0
- package/dist/configs/index.js +2 -0
- package/dist/configs/index.js.map +1 -0
- package/dist/hooks/index.esm.js +2 -0
- package/dist/hooks/index.esm.js.map +1 -0
- package/dist/hooks/index.js +2 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/index.esm.js +2 -0
- package/dist/index.esm.js.map +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/dist/utils/index.esm.js +2 -0
- package/dist/utils/index.esm.js.map +1 -0
- package/dist/utils/index.js +2 -0
- package/dist/utils/index.js.map +1 -0
- package/package.json +93 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/components/BreadcrumbCustom/styles.js","../src/components/BreadcrumbCustom/index.js","../src/components/CustomButton/styles.js","../src/components/CustomButton/index.js","../src/components/DrawerCustom/styles.js","../src/components/DrawerCustom/Header.js","../src/components/DrawerCustom/DrawerContent.js","../src/components/DrawerCustom/DrawerRoute.js","../src/components/DrawerCustom/index.js","../src/components/RestActions/CreateButton/index.js","../src/components/RestActions/CustomButtonIcon/ButtonIcon.js","../src/components/RestActions/CustomButtonIcon/styles.js","../src/utils/tools.js","../src/components/RestLayout/RestList/styles.js","../src/configs/constant.js","../src/configs/localData.js","../src/configs/index.js","../src/components/RestLayout/RestList/ListLayout.js","../src/components/context/FormContextCustom.js","../src/components/RestLayout/RestFilter/styles.js","../src/components/RestLayout/RestFilter/index.js","../src/hooks/MyHooks.js","../src/utils/RequestUtils.js","../src/utils/FuseUtils.js","../src/DataContext.js","../src/hooks/useGetList.js","../src/utils/dataUtils.js","../src/components/RestLayout/CustomList.js","../src/components/common/CustomImage.js","../src/components/common/HeaderCompany.js","../src/components/common/Noresult.js","../src/components/common/UserInfo/styles.js","../src/components/common/UserInfo/UserWrapper.js","../src/utils/jwtService.js","../src/components/common/File/ImageUploader.js","../src/components/form/FormInput.js","../src/components/form/FormInputNumber.js","../src/components/form/FormSelect.js","../src/components/form/FormSelectAPI.js","../src/components/form/FormDatePicker.js","../src/components/form/FormTimePicker.js","../src/components/form/FormTextArea.js","../src/components/form/FormCheckbox.js","../src/components/form/FormRadioGroup.js","../src/components/form/FormAutoComplete.js","../src/components/form/FormCascader.js","../src/hooks/useData.js","../src/hooks/useInfinite.js","../src/components/form/SelectInfinite/FormSelectInfinite.js","../src/components/form/SelectInfinite/FormSelectInfiniteProvince.js","../src/components/form/FormAddress.js","../src/components/form/FormHidden.js","../src/components/form/FormJoditEditor.js","../src/components/form/FormListAddtion/styles.js","../src/components/form/FormSelectUser.js","../src/components/form/AutoCompleteInfinite/FormAutoCompleteInfinite.js","../src/components/form/AutoCompleteInfinite/FormAutoCompleteCustomer.js","../src/components/form/SelectInfinite/FormSelectInfiniteMaterial.js","../src/components/form/SelectInfinite/FormSelectInfiniteBusinessUser.js","../src/components/form/SelectInfinite/FormInfiniteStock.js","../src/components/form/SelectInfinite/FormInfiniteShipStatus.js","../src/components/form/SelectInfinite/FormCategoryPost.js","../src/hooks/useServiceId.js","../src/utils/fileUtils.js","../src/utils/formatFilters.js","../src/utils/skuUtils.js","../src/utils/validateUtils.js","../src/components/RestActions/CustomButtonIcon/index.js","../src/components/common/File/FileUploadView.js","../src/components/form/SelectInfinite/FormInfiniteCategory.js","../src/components/form/SelectInfinite/FormInfiniteOrderCode.js","../src/components/form/FormListAddtion/index.js","../src/components/form/SelectInfinite/FormSelectInfiniteCustomer.js","../src/components/form/SelectInfinite/FormSelectInfiniteProduct.js","../src/components/form/SelectInfinite/FormSelectInfiniteProvider.js","../src/components/form/SelectInfinite/FormSelectInfiniteService.js","../src/components/form/SelectInfinite/InfiniteFaq.js","../src/components/Loading/index.js","../src/components/common/NoFooter.js","../src/components/RestLayout/RestEditModal.js","../src/components/RestLayout/RestList/index.js","../src/components/common/UserInfo/index.js","../src/utils/textUtils.js","../src/hooks/useCollapseSidebar.js","../src/hooks/useDeleteMutation.js","../src/hooks/useGetIdFromHash.js","../src/hooks/useGetOneQuery.js","../src/hooks/useGetRestApi.js","../src/hooks/useLogin.js","../src/hooks/useNavigateSearch.js","../src/hooks/useQueryParams.js","../src/hooks/useQueryParamsOnHeader.js"],"sourcesContent":["/**************************************************************************/\n/* styles.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 styled from 'styled-components';\n\nexport const BreadcrumbWrapper = styled.div`\n font-weight: 600;\n font-size: 16px;\n line-height: 22px;\n margin-bottom: 20px;\n\n .breadcrumb-item {\n &__name {\n font-weight: 600;\n font-size: 16px;\n line-height: 22px;\n }\n &__link {\n cursor: pointer;\n &:hover {\n color: ${({ theme }) => theme.palette.primary} !important;\n }\n }\n }\n\n .antd-breadcrumb > span:last-child {\n color: ${({ theme }) => theme.palette.primary} !important;\n }\n`;\n","/**************************************************************************/\n/* index.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 { useTranslation } from 'react-i18next';\nimport { Breadcrumb } from 'antd';\nimport { Link } from 'react-router-dom';\nimport { BreadcrumbWrapper } from './styles';\n\nconst BreadcrumbCustom = ({ data }) => {\n const { t } = useTranslation();\n return (\n <BreadcrumbWrapper>\n <Breadcrumb separator=\">\">\n {\n data.map((data, index) => (\n <Breadcrumb.Item key={String(index)}>\n {data.path ? (\n <Link to={data.path}>\n <span className=\"breadcrumb-item__name breadcrumb-item__link\">\n {t(data.title)}\n </span>\n </Link>\n ) : (\n <span className=\"breadcrumb-item__name\">\n {data.title ? t(data.title) : t('error.waitingUpdate')}\n </span>\n )}\n </Breadcrumb.Item>\n ))\n }\n </Breadcrumb>\n </BreadcrumbWrapper>\n );\n};\n\nBreadcrumbCustom.propTypes = {};\nexport default BreadcrumbCustom;\n","/**************************************************************************/\n/* styles.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 styled from 'styled-components';\n\nexport const CustomButtonStyles = styled.div`\n button[disabled] > i {\n color: ${({ theme }) => theme.background.disabled};\n }\n .normal-action-wrapper {\n position: relative;\n }\n .action-feature-icon {\n position: absolute;\n top: -12px;\n right: -10px;\n font-size: 20px;\n color: ${({ theme }) => theme.subscriptions.colorIcon};\n }\n`;\n","/**************************************************************************/\n/* index.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 { Button } from 'antd';\nimport { useTranslation } from 'react-i18next';\nimport { CustomButtonStyles } from './styles';\n\nconst CustomButton = ({\n title = \"Hoàn thành\",\n color = \"danger\",\n variant = \"solid\",\n inRigth = true,\n style,\n ...props\n}) => {\n const { t } = useTranslation();\n return (\n <CustomButtonStyles\n className=\"custom-button\"\n style={{\n display: 'flex',\n ...(inRigth ? { justifyContent: 'end' } : {}),\n ...(style ? style : {})\n }}\n >\n <Button\n color={color}\n variant={variant}\n {...props}\n >\n {t(title)}\n </Button>\n </CustomButtonStyles>\n )\n};\n\nexport default CustomButton;\n","/**************************************************************************/\n/* styles.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 styled from 'styled-components';\nimport { Drawer } from 'antd';\n\nexport const DrawerWrapper = styled(Drawer)`\n .ant-drawer-body {\n height: 100%;\n padding: 0 !important;\n overflow: hidden;\n }\n \n .drawer-content-wrapper {\n height: 100%;\n }\n\n .drawer-content {\n height: calc(100vh - 50px);\n padding: 16px 24px;\n overflow-y: auto;\n overflow-x: hidden;\n\n ::-webkit-scrollbar {\n width: 6px;\n }\n\n /* Track */\n ::-webkit-scrollbar-track {\n border-radius: 10px;\n }\n\n /* Handle */\n ::-webkit-scrollbar-thumb {\n background: ${({ theme }) => theme.scrollbar.thumb};\n border-radius: 10px;\n }\n }\n\n .ant-time-picker-input,\n textarea,\n .ant-input,\n .ant-select-selection,\n .ant-cascader-picker,\n .ant-input-number,\n .ant-select-dropdown-menu,\n .ant-select-dropdown,\n .ant-select-dropdown-menu-vertical,\n .ant-picker,\n .ant-input-affix-wrapper {\n background: ${({ theme }) => theme.background.input};\n border: 1px solid ${({ theme }) => theme.background.input};\n }\n\n .ant-select-selector {\n background: ${({ theme }) => theme.background.input} !important;\n border: 1px solid ${({ theme }) => theme.background.input} !important;\n }\n\n .ant-calendar-picker,\n .ant-select,\n .ant-input-number,\n .ant-picker {\n width: 100%;\n }\n\n .ant-form-item-label {\n label {\n font-weight: bold;\n &:after {\n content: '';\n }\n }\n }\n`;\n\nexport const HeaderStyles = styled.div`\n height: 60px;\n background: ${({ theme }) => theme.palette.primary};\n color: ${({ theme }) => theme.text.primaryButtonTextColor};\n padding: 24px;\n\n display: flex;\n justify-content: space-between;\n align-items: center;\n font-size: 20px;\n font-weight: bold;\n\n .drawer-header-title {\n text-overflow: ellipsis;\n overflow: hidden;\n white-space: nowrap;\n }\n`;\n","/**************************************************************************/\n/* Header.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 { CloseSquareOutlined } from '@ant-design/icons';\nimport { useTranslation } from 'react-i18next';\nimport { HeaderStyles } from './styles';\n\nconst Header = ({ title, onClose }) => {\n const { t } = useTranslation();\n return (\n <HeaderStyles>\n <div className=\"drawer-header-title\">{t(title)}</div>\n <CloseSquareOutlined\n onClick={onClose}\n className=\"drawer-header-icon\"\n type=\"close-square\"\n />\n </HeaderStyles>\n );\n};\n\nexport default Header;\n","/**************************************************************************/\n/* DrawerContent.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 Header from './Header';\n\nconst DrawerContent = ({\n title,\n onClose,\n children\n}) => {\n return (\n <div className=\"drawer-content-wrapper\">\n {title && <Header onClose={onClose} title={title} />}\n <div id=\"drawer-content\" className=\"drawer-content\">{children}</div>\n </div>\n );\n};\n\nexport default DrawerContent;\n","/**************************************************************************/\n/* DrawerRoute.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 { DrawerWrapper } from './styles';\n\nconst DrawerRoute = ({ width = 600, children, onClose, title, ...props }) => {\n return (\n <DrawerWrapper\n width={width}\n onClose={onClose}\n styles={\n { wrapper: { maxWidth: '100vw' } }\n }\n {...props}\n destroyOnClose\n closable={false}\n footer={null}\n >\n {children}\n </DrawerWrapper>\n )\n};\n\nexport default DrawerRoute;\n","/**************************************************************************/\n/* index.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 React from 'react';\nimport DrawerContent from './DrawerContent';\nimport DrawerRoute from './DrawerRoute';\n\nconst DrawerCustom = ({ children, onClose, title, ...props }) => (\n <DrawerRoute\n onClose={onClose}\n title={title}\n {...props}\n >\n <DrawerContent\n title={title}\n onClose={onClose}\n {...props}\n >\n {children}\n </DrawerContent>\n </DrawerRoute>\n);\n\nexport default DrawerCustom;\n","/**************************************************************************/\n/* index.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 { PlusOutlined } from '@ant-design/icons';\nimport CustomButton from '@/components/CustomButton';\n\nconst CreateButton = ({\n title = 'button.create',\n handleClick,\n}) => {\n return (\n <CustomButton\n title={title}\n onClick={handleClick}\n icon={<PlusOutlined />}\n type='primary'\n />\n );\n};\n\nexport default CreateButton;\n","/**************************************************************************/\n/* ButtonIcon.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 I18n from 'i18next';\nimport { Tooltip, Button } from 'antd';\nimport { SyncOutlined } from '@ant-design/icons';\n\nconst ButtonIcon = ({\n title = '',\n disabled,\n buttonProps,\n handleClick,\n icon = <SyncOutlined />\n}) => {\n return (\n <div>\n <Tooltip title={I18n.t(title)}>\n <Button\n {...buttonProps}\n disabled={buttonProps?.disabled || disabled}\n icon={icon}\n onClick={handleClick}\n />\n </Tooltip>\n </div>\n );\n};\n\nexport default ButtonIcon;\n","/**************************************************************************/\n/* styles.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 styled from 'styled-components';\n\nexport const CustomButtonIconWrapper = styled.div`\n .ant-btn::not(.ant-btn-dangerous) {\n color: ${({ theme }) => theme.text.primary};\n }\n\n .ant-btn {\n border: 0px !important;\n height: 32px !important;\n width: 32px;\n padding: 0 !important;\n background: transparent !important;\n box-shadow: none !important;\n &:hover {\n background: transparent;\n transform: scale(1.1, 1.1);\n color: ${({ theme }) => theme.palette.primary} !important;\n }\n &:focus {\n background: transparent;\n transform: scale(1.1, 1.1);\n color: ${({ theme }) => theme.palette.primary} !important;\n }\n .anticon {\n font-size: 20px;\n }\n &[disabled] > i {\n color: ${({ theme }) => theme.background.disabled};\n }\n }\n\n .normal-action-wrapper {\n position: relative;\n }\n\n .action-feature-icon {\n position: absolute;\n top: -5px;\n right: -7px;\n font-size: 18px;\n color: ${({ theme }) => theme.subscriptions.colorIcon};\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","/**************************************************************************/\n/* styles.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 styled from 'styled-components';\n\nconst ListLayoutStyles = styled.div`\n .list-layout {\n &__pagination-top {\n display: flex;\n flex-wrap: wrap;\n justify-content: space-between;\n align-items: center;\n margin-bottom: 20px;\n gap: 16px 0px;\n }\n &__pagination-bottom {\n margin-top: 20px;\n display: flex;\n justify-content: flex-end;\n }\n &__group-action {\n flex: 1;\n > .ant-space {\n justify-content: flex-end;\n display: flex;\n }\n }\n }\n\n .ant-table-thead > tr:first-child > th {\n /* background: ${({ theme }) => theme.table.headerBackground}; */\n font-weight: 600;\n text-transform: uppercase;\n }\n`;\n\nexport default ListLayoutStyles;\n","/**************************************************************************/\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/* ListLayout.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 { useCallback } from 'react';\nimport { Pagination, Table, Space } from 'antd';\nimport ListLayoutStyles from './styles';\nimport { useLocation, useNavigate } from 'react-router-dom';\nimport { HASH_MODAL } from '@/configs';\nimport CreateButton from '@/components/RestActions/CreateButton';\n\nconst ListLayout = ({\n columns,\n data,\n xScroll,\n pagination = {},\n rowKey = 'id',\n hasCreate = true,\n handleChangeQueryParams = () => null,\n resource,\n queryParams,\n totalItems,\n setTableFilter,\n customClickCreate,\n customActions,\n expandable,\n ...props\n}) => {\n\n const location = useLocation();\n const navigate = useNavigate();\n const showTotal = useCallback(\n (total, range) => `${range[0]}-${range[1]}/${total}`,\n [],\n );\n\n const onChangeTable = (pagination, filters, sorter) => {\n setTableFilter(filters);\n handleChangeQueryParams(filters);\n };\n\n const paginationResult = {\n total: totalItems || 0,\n pageSize: queryParams?.limit || 10,\n current: queryParams?.page || 1,\n showSizeChanger: true,\n showQuickJumper: false,\n showTotal,\n ...pagination,\n };\n\n const onChangePagination = (page, pageSize) => {\n handleChangeQueryParams({\n page,\n limit: pageSize,\n });\n };\n\n const handleClickCreate = () => {\n if (customClickCreate) {\n customClickCreate();\n } else {\n navigate({ search: location.search, hash: `${HASH_MODAL}/${resource}/create` });\n }\n };\n\n return (\n <ListLayoutStyles>\n <div className=\"list-layout__pagination-top\">\n <Pagination {...paginationResult} onChange={onChangePagination} />\n <div className=\"list-layout__group-action\">\n { /* Đoạn này đang tạm bỏ */}\n <Space size={10}>\n {customActions}\n {hasCreate && (\n <CreateButton\n handleClick={handleClickCreate}\n />\n )}\n </Space>\n </div>\n </div>\n <Table\n columns={columns}\n dataSource={data}\n pagination={false}\n rowKey={rowKey}\n scroll={{ x: xScroll || 1700 }}\n expandable={expandable}\n onChange={onChangeTable}\n {...props}\n />\n <div className=\"list-layout__pagination-bottom\">\n <Pagination {...paginationResult} onChange={onChangePagination} />\n </div>\n </ListLayoutStyles>\n );\n};\n\nexport default ListLayout;\n","\n/**************************************************************************/\n/* FormContextCustom.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 { createContext } from 'react';\nexport const FormContextCustom = createContext({});","/**************************************************************************/\n/* styles.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 styled from 'styled-components';\n\nconst RestFilterStyles = styled.div`\n margin-bottom: 10px;\n .ant-form-item {\n margin-bottom: 10px !important;\n }\n .row-filter {\n .ant-form-item-control-input-content > input,\n .ant-select-selector,\n .ant-picker {\n border: 1px solid transparent;\n ${'' /* background: #EDF1F6; */}\n :hover, :focus {\n border: 1px solid ${({ theme }) => theme.palette.primary};\n }\n }\n .ant-form-item-label {\n display: none;\n }\n .ant-input-number,\n .ant-picker {\n width: 100%;\n }\n .ant-select-selection__rendered {\n height: 32px;\n }\n .ant-form-item-control {\n line-height: 32px;\n }\n }\n .clearButton {\n background: ${({ theme }) => theme.background.content};\n color: ${({ theme }) => theme.palette.primary};\n border: 1px solid ${({ theme }) => theme.palette.primary};\n box-sizing: border-box;\n }\n .row-action-bottom {\n display: flex;\n button {\n width: 50%;\n margin-bottom: 10px;\n }\n .filterButton {\n margin-right: 16px;\n }\n }\n .col-export-excel {\n text-align: right;\n .ant-btn {\n border-color: transparent !important;\n }\n .anticon {\n font-size: 22px;\n }\n }\n`;\n\nexport default RestFilterStyles;\n","/**************************************************************************/\n/* index.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 { useEffect } from 'react';\nimport { Row, Col, Button, Form } from 'antd';\nimport { useTranslation } from 'react-i18next';\nimport { FormContextCustom } from '@/components/context/FormContextCustom';\nimport RestFilterStyles from './styles';\n\nconst RestFilter = ({\n children,\n greyInput,\n onSubmitFilter = () => null,\n onClearFilter = () => null,\n responsiveFilter = {\n xxl: 20,\n xl: 20,\n lg: 18,\n md: 24,\n xs: 24,\n },\n responsiveAction = {\n xxl: 4,\n xl: 4,\n lg: 6,\n md: 24,\n xs: 24,\n },\n defaultQueryParams\n}) => {\n\n const [form] = Form.useForm();\n const { t } = useTranslation();\n\n const onFilter = () => {\n form.validateFields().then(onSubmitFilter);\n };\n\n const onClear = () => {\n form.resetFields();\n onClearFilter();\n };\n\n useEffect(() => {\n form.setFieldsValue(defaultQueryParams);\n }, [form, defaultQueryParams]);\n\n return (\n <RestFilterStyles\n className={greyInput ? 'grey-input-filter' : 'default-input-filter'}\n >\n <Form form={form} autoComplete=\"off\">\n <FormContextCustom.Provider\n value={{ form, allowPressEnter: true, handleSubmit: onFilter }}\n >\n <Row gutter={16} className=\"row-filter\">\n <Col {...responsiveFilter}>{children}</Col>\n <Col {...responsiveAction} className=\"row-action-bottom\">\n <Button\n type=\"primary\"\n className=\"filterButton\"\n onClick={onFilter}\n >\n {t('button.filter')}\n </Button>\n <Button className=\"clearButton\" onClick={onClear}>\n {t('button.clearFilter')}\n </Button>\n </Col>\n </Row>\n </FormContextCustom.Provider>\n </Form>\n </RestFilterStyles>\n );\n};\n\nexport default RestFilter;\n","/**************************************************************************/\n/* MyHooks.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 React, { useEffect } from \"react\"\n\nexport const useMount = (callback) => {\n useEffect(() => {\n callback();\n /* eslint-disable-next-line */\n }, []);\n};\n\n/* useUnmount(() => console.log(\"useUnmount\")) */\nexport const useUnmount = (callback) => {\n const callbackRef = React.useRef(callback)\n callbackRef.current = callback\n useEffect(() => {\n return () => {\n callbackRef.current()\n }\n }, []);\n};\n\n/* const [count, setCount] = useSetState(initState) \n* setCount({ name: 'medium' })\n*/\nexport const useSetState = (initState) => {\n const [state, setState] = React.useState(initState)\n const setMergeState = (value) => setState((prevValue) => {\n const newValue = typeof value === 'function' ? value(prevValue) : value\n return newValue ? { ...prevValue, ...newValue } : prevValue\n })\n return [state, setMergeState]\n};\n\n/*\nconst [ count, setCount ] = React.useState(0)\nuseUpdateEffect(() => {\n console.log('Count changed', count)\n}, [ count ])\n*/\nexport const useUpdateEffect = function (effectCallback, deps = []) {\n\n const isFirstMount = React.useRef(false)\n useEffect(() => {\n return () => {\n isFirstMount.current = false\n }\n }, []);\n\n useEffect(() => {\n /* Không thực thi code cho lần đầu tiên watch */\n if (!isFirstMount.current) {\n isFirstMount.current = true\n } else {\n return effectCallback()\n }\n /* eslint-disable-next-line */\n }, deps);\n};\n\n/*\nuseEffectAsync(async () => {\n const books = await fetchBooks();\n setBooks(books);\n});\n*/\nexport function useEffectAsync(effect, inputs = [], callback) {\n useEffect(() => {\n let isMounted = true;\n const run = async () => {\n await effect(isMounted);\n };\n run();\n return () => {\n if(typeof callback === 'function') {\n callback();\n }\n isMounted = false; \n };\n /* eslint-disable-next-line */\n }, inputs);\n};\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/* 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","\r\nimport React, { useReducer, useCallback, useEffect } from 'react'\r\nimport { ACTIONS, CHANGE_STORE } from '@/configs';\r\nimport { InAppEvent } from '@/utils/FuseUtils';\r\n\r\nconst DataContext = React.createContext();\r\n\r\nconst actions = {\r\n [ACTIONS.ADD_USER]: 'user',\r\n [ACTIONS.REMOVE_USER]: 'user',\r\n [ACTIONS.TOOGLE_COLLAPSE]: 'isCollapse',\r\n [ACTIONS.F5_LIST]: 'f5List'\r\n};\r\n\r\nfunction storeReducer(state, action) {\r\n const { data, type } = action;\r\n const varible = actions[type];\r\n return !varible ? state : {\r\n ...state,\r\n [varible]: data\r\n }\r\n};\r\n\r\nexport const DataProvider = ({ children, initialRoutes = [] }) => {\r\n\r\n const [state, dispatch] = useReducer(storeReducer, {\r\n routes: initialRoutes, isCollapse: false\r\n })\r\n\r\n const value = { ...state, dispatch };\r\n const handleEventChange = useCallback(({ type, data }) => {\r\n dispatch({ type, data });\r\n }, [dispatch]);\r\n\r\n useEffect(() => {\r\n /* InAppEvent.emit(CHANGE_STORE, { type: 'user', data: data }); */\r\n InAppEvent.addEventListener(CHANGE_STORE, handleEventChange);\r\n return () => {\r\n InAppEvent.removeListener(CHANGE_STORE, handleEventChange);\r\n };\r\n }, [handleEventChange]);\r\n\r\n return (\r\n <DataContext.Provider value={value}>\r\n {children}\r\n </DataContext.Provider>\r\n )\r\n};\r\n\r\nexport function useStore() {\r\n const context = React.useContext(DataContext)\r\n if (context === undefined) {\r\n throw new Error('useCount must be used within a StoreProvider')\r\n }\r\n return context\r\n};\r\n\r\nexport default DataContext;\r\n","/**************************************************************************/\n/* useGetList.js \t\t\t\t*/\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 { useCallback, useEffect, useState, useContext } from \"react\";\nimport RequestUtils from \"@/utils/RequestUtils\";\nimport MyContext from '@/DataContext';\nimport { useUpdateEffect } from \"@/hooks/MyHooks\";\n\nconst LOGGER_TAG = '[hooks.useGetList]';\nfunction useGetList({\n\tqueryParams: filter,\n\tonData\n}) {\n\n\tconst { f5List } = useContext(MyContext)\n\tconst [ loading, setLoading ] = useState(true);\n\tconst [ data, setData ] = useState({ embedded: [], page: {} });\n\n\tconst fetchResource = useCallback((values) => {\n\t\t\n\t\tconst { apiPath, ...params } = values;\n\t\tsetLoading(true);\n\n\t\tRequestUtils.Get('/' + apiPath, params).then(async ({ data, errorCode, message }) => {\n\t\t\tif (errorCode !== 200) {\n\t\t\t\tconsole.error(LOGGER_TAG, message);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tPromise.resolve(onData(data)).then(setData);\n\t\t\tsetLoading(false);\n\t\t}).catch(e => {\n\t\t\tconsole.error(LOGGER_TAG, e);\n\t\t\tsetLoading(false);\n\t\t});\n\t}, [ onData ]);\n\n\tuseEffect(() => {\n\t\tfetchResource(filter);\n\t\t/* eslint-disable-next-line */\n\t}, [filter]);\n\n\tuseUpdateEffect(() => {\n\t\tif (f5List?.apiPath === filter.apiPath) {\n\t\t\tfetchResource(filter);\n\t\t}\n\t}, [f5List, filter]);\n\n\treturn {\n\t\tdata,\n\t\tloading\n\t}\n};\n\nexport default useGetList;\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","import { useState } from 'react';\r\nimport { Form, Space, List } from \"antd\";\r\nimport CustomButton from '@/components/CustomButton';\r\nimport useGetList from \"@/hooks/useGetList\";\r\nimport { dateFormatOnSubmit } from \"@/utils/dataUtils\";\r\n\r\nconst CustomList = ({\r\n apiPath = '',\r\n filter = '',\r\n grid = {},\r\n hasCreate = false,\r\n onClickCreate = (values) => values,\r\n renderItem = (record) => '',\r\n onData = (data) => data\r\n}) => {\r\n\r\n const [ form ] = Form.useForm();\r\n const [ filterFormValues, setFilterFormValues ] = useState({\r\n apiPath,\r\n page: 1\r\n });\r\n\r\n const { data: { embedded, page }, loading } = useGetList({\r\n queryParams: filterFormValues,\r\n onData: onData\r\n });\r\n\r\n const handleFilterChange = (allValues) => {\r\n const formattedValues = { ...allValues };\r\n dateFormatOnSubmit(formattedValues, ['from', 'to']);\r\n setFilterFormValues(pre => ({...pre, ...formattedValues}));\r\n };\r\n\r\n const handlePageChange = (page, pageSize) => {\r\n setFilterFormValues(pre => ({...pre, page }));\r\n };\r\n\r\n const resetFilter = () => {\r\n form.resetFields();\r\n form.submit();\r\n }\r\n\r\n return (\r\n <div id=\"content-list\">\r\n <Form onFinish={handleFilterChange} form={form}>\r\n { filter }\r\n <Space align='end'>\r\n <CustomButton title=\"Tìm kiếm\" htmlType=\"submit\" />\r\n <CustomButton title=\"Xóa lọc\" variant=\"dashed\" onClick={resetFilter} />\r\n { hasCreate && \r\n <CustomButton title=\"Thêm mới\" color=\"primary\" variant=\"solid\" onClick={onClickCreate} />\r\n }\r\n </Space>\r\n </Form>\r\n <List\r\n style={{marginTop: 20}}\r\n grid={{ gutter: 16, xs: 1, sm: 2, md: 3, lg: 3, xl: 4, xxl: 4, ...grid }}\r\n dataSource={embedded}\r\n renderItem={renderItem}\r\n loading={loading}\r\n pagination={{\r\n current: filterFormValues?.page || 1,\r\n total: page?.totalElements || 0,\r\n pageSize: 10,\r\n onChange: handlePageChange,\r\n showSizeChanger: false\r\n }}\r\n />\r\n </div>\r\n )\r\n};\r\n\r\nexport default CustomList;","import { Image } from 'antd';\nimport { useState } from 'react';\n\nconst CustomImage = ({ src, fallbackSrc = '/img/image_not_found.png', ...props }) => {\n const [ imgSrc, setImgSrc ] = useState(src);\n const handleError = () => {\n if (imgSrc !== fallbackSrc) {\n setImgSrc(fallbackSrc);\n }\n };\n return <Image src={imgSrc} onError={handleError} {...props} />;\n};\n\nexport default CustomImage;","import React from 'react';\r\nimport { Row, Col, Typography } from 'antd';\r\nconst { Text } = Typography;\r\n\r\nconst HeaderCompany = () => {\r\n return (\r\n <Row justify=\"start\" align=\"middle\">\r\n <Col span={7} className='logo'>\r\n <img\r\n src=\"/logo.png\"\r\n alt=\"Logo\"\r\n style={{ maxHeight: 40, width: 'auto' }}\r\n />\r\n </Col>\r\n <Col span={14} className='company'>\r\n <p><strong>CÔNG TY CỔ PHẦN FLAST SOLUTUON</strong></p>\r\n <div className='contact'>\r\n <Text>Hà Nội: Số 35 Lê Văn Lương, Thanh Xuân, TP.Hà Nội</Text>\r\n <Row justify=\"start\" style={{ marginTop: '5px' }}>\r\n <Text>(0987) 938-491</Text>\r\n <Text className='left20'>flast.vn@printgo.vn</Text>\r\n <Text className='left20'>www.flast.vn</Text>\r\n </Row>\r\n </div>\r\n </Col>\r\n </Row>\r\n )\r\n}\r\n\r\nexport default HeaderCompany;","import React from 'react';\nimport styled from 'styled-components';\n\nconst StyledNotFound = styled.div`\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n height: calc(100vh - 170px);\n background-color: #f5f8fa;\n text-align: center;\n`;\n\nconst NotFoundImage = styled.img`\n width: 300px;\n margin-bottom: 24px;\n`;\n\nconst NotFoundSubtitle = styled.p`\n font-size: 20px;\n color: #333;\n`;\n\nconst NotFoundDescription = styled.p`\n font-size: 16px;\n color: #666;\n`;\n\nconst BackHomeButton = styled.a`\n background-color: #007bff;\n color: white;\n font-size: 16px;\n padding: 12px 24px;\n border-radius: 8px;\n &:hover {\n background-color: #0056b3;\n }\n`;\n\nconst NotFoundPage = ({message}) => {\n return (\n <StyledNotFound>\n <NotFoundImage src=\"/img/404.png\" alt=\"404 Image\" />\n <NotFoundSubtitle>Yêu cầu không tìm thấy</NotFoundSubtitle>\n <NotFoundDescription>\n {message || 'Trang yêu cầu không tìm thấy. Vui lòng tìm kiếm lại.'}\n </NotFoundDescription>\n <BackHomeButton href=\"/\">\n Về trang chủ\n </BackHomeButton>\n </StyledNotFound>\n );\n};\n\nexport default NotFoundPage;","/**************************************************************************/\n/* styles.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 styled from 'styled-components';\n\nconst UserInfoStyles = styled.div`\n .user-info-wrapper {\n display: flex;\n align-items: center;\n .user-content {\n flex: 1;\n overflow: hidden;\n }\n .ant-avatar {\n margin-right: 10px;\n }\n .user-note {\n font-size: 12px;\n color: ${({ theme }) => theme.text.mainL1};\n text-overflow: ellipsis;\n overflow: hidden;\n }\n }\n`;\n\nexport default UserInfoStyles;\n","/**************************************************************************/\n/* UserWrapper.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 { useTranslation } from 'react-i18next';\nimport { Avatar } from 'antd';\nimport { UserOutlined } from '@ant-design/icons';\nimport { Link } from 'react-router-dom';\nimport UserInfoStyles from './styles';\n\nconst UserWrapper = ({\n item,\n avatarProp = 'avatar',\n nameProp = 'name',\n noteProp,\n customNote,\n disabled,\n path,\n size,\n}) => {\n const { t } = useTranslation();\n const element = (\n <div className=\"user-info-wrapper\">\n <Avatar size={size} src={item?.[avatarProp]} icon={<UserOutlined />} />\n <div className=\"user-content\">\n <div className=\"user-name ellipsis-2-t\">\n {item?.[nameProp] || t('error.waitingUpdate')}\n </div>\n <div className=\"user-note\">\n {noteProp ? item?.[noteProp] : customNote}\n </div>\n </div>\n </div>\n );\n\n return (\n <UserInfoStyles>\n {!path || disabled ? (\n element\n ) : (\n <Link className=\"link-default\" to={path}>\n {element}\n </Link>\n )}\n </UserInfoStyles>\n );\n};\n\nexport default UserWrapper;\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","import React, { useContext, useEffect, useState } from 'react';\nimport jwtService from '@/utils/jwtService';\nimport {\n Upload,\n Button,\n Checkbox,\n List,\n Input,\n message,\n Space,\n Row,\n Col,\n} from 'antd';\nimport { DeleteOutlined, UploadOutlined, PlusOutlined } from '@ant-design/icons';\nimport { isPositiveInteger } from '@/utils/tools';\nimport RequestUtils from '@/utils/RequestUtils';\nimport { getGateway, SUCCESS_CODE } from '@/configs';\nimport { FormContextCustom } from '@/components/context/FormContextCustom';\nimport CustomImage from '@/components/common/CustomImage';\n\nconst ImageUploader = ({\n apiUploadMultiPart,\n apiUploadUrlFile = '',\n apiRemoveFile = '',\n title = 'Upload ảnh sản phẩm',\n showImgSlide = true,\n imageSize = 80,\n onBeforeSubmitMultiPart = (values) => values,\n onBeforeSubmitUrl = (values) => values,\n onClickAddImageToContent = (url) => url,\n onToggleFeatured = (id) => id,\n onToggleSlideShow = (id, checked) => true\n}) => {\n\n const { record } = useContext(FormContextCustom);\n const [ images, setImages ] = useState([]);\n const [ showUrlInput, setShowUrlInput ] = useState(false);\n const [ urlInputValue, setUrlInputValue ] = useState('');\n\n useEffect(() => {\n setImages(record?.images ?? []);\n }, [record])\n\n const handleFileChange = ({ file, fileList }) => {\n const newImage = {\n id: String(Date.now()),\n url: URL.createObjectURL(file),\n name: file.name,\n isFeatured: false,\n isSlideshow: false,\n fromUpload: true,\n originFile: file\n };\n setImages(prev => {\n /* Tránh thêm file trùng (dựa trên name + size) */\n const exists = prev.some(\n img => img.name === file.name && img.size === file.size\n );\n if (exists) return prev;\n return [newImage, ...prev];\n })\n };\n\n const handleAddByUrl = () => {\n setShowUrlInput(true);\n };\n\n const handleUrlSubmit = async () => {\n if (!urlInputValue.trim()) {\n message.warning('Vui lòng nhập URL hình ảnh!');\n return;\n }\n if(apiUploadUrlFile) {\n message.warning('Vui lòng cấu hình API cập nhật Url file !');\n return;\n }\n\n const newImage = {\n url: urlInputValue.trim(),\n name: urlInputValue.trim().split('/').pop(),\n isFeatured: false,\n isSlideshow: false,\n fromUpload: true\n };\n\n const { errorCode, data } = await RequestUtils.Post(apiUploadUrlFile, { \n method: 'POST', \n body: onBeforeSubmitUrl(newImage)\n });\n if (errorCode !== 200) {\n message.error('Update file url thất bại');\n return;\n }\n setImages(prev => [...prev, data]);\n setUrlInputValue('');\n setShowUrlInput(false);\n };\n\n const handleRemove = (id) => {\n if(!apiRemoveFile) {\n message.error('Chưa cấu hình enpoint xóa file !');\n return;\n }\n RequestUtils.Post(`${apiRemoveFile}/${id}`, {});\n setImages(images.filter((img) => img.id !== id));\n };\n\n const handleToggleFeatured = (id) => {\n setImages(images.map(img => ({\n ...img,\n isFeatured: img.id === id ? !img.isFeatured : img.isFeatured\n })));\n onToggleFeatured(id);\n };\n\n const handleToggleSlide = (id, checked) => {\n setImages(images.map(img => \n img.id === id ? { ...img, isSlideshow: checked } : img\n ));\n onToggleSlideShow(id, checked);\n };\n\n const handleUpload = (id) => {\n const image = images.find(img => img.id === id);\n if (image && image.fromUpload && image.originFile) {\n uploadToServer(image);\n }\n };\n\n const uploadToServer = async (image) => {\n\n const formData = new FormData();\n formData.append('image', image.originFile, image.name);\n formData.append('isFeatured', image.isFeatured);\n formData.append('isSlideshow', image.isSlideshow);\n\n const response = await fetch(String(getGateway()).concat(apiUploadMultiPart), { \n method: 'POST',\n headers: {\n 'Authorization': `Bearer ${jwtService.getAccessToken()}`,\n },\n body: onBeforeSubmitMultiPart(formData)\n });\n if (!response.ok) {\n message.error('Upload thất bại!');\n return;\n }\n\n const { data, errorCode, message: MSG } = await response.json();\n if(errorCode !== SUCCESS_CODE) {\n message.error(MSG);\n return;\n }\n\n const { fileName, ...mImage } = data;\n /* reset originFile = null */\n setImages(prev => prev.map(img =>\n img.id === image.id ?\n {\n ...mImage, \n url: String(getGateway()).concat(fileName), \n originFile: null, \n fromUpload: false \n } : img\n ));\n if (image.url && image.fromUpload) {\n URL.revokeObjectURL(image.url);\n }\n };\n\n return (\n <div style={{ padding: '20px 0px', fontFamily: 'Arial' }}>\n <h3>{title}</h3>\n\n {/* Thêm ảnh và URL */}\n <div style={{ border: '1px solid #e8e8e8', borderRadius: '4px', marginBottom: '16px', padding: '12px' }}>\n <Row justify=\"space-between\" align=\"middle\">\n <Space>\n <Upload\n showUploadList={false}\n beforeUpload={() => false}\n onChange={handleFileChange}\n >\n <Button type=\"primary\" style={{ backgroundColor: '#52c41a', borderColor: '#52c41a' }}>\n Thêm ảnh...\n </Button>\n </Upload>\n <Button type=\"default\" style={{ backgroundColor: '#f5a623', borderColor: '#f5a623', color: 'white' }}>\n Hủy\n </Button>\n </Space>\n <Button type=\"primary\" style={{ backgroundColor: '#4096ff', borderColor: '#4096ff' }} onClick={handleAddByUrl}>\n Thêm Url\n </Button>\n </Row>\n </div>\n\n {/* Form nhập URL nếu đang mở */}\n {showUrlInput && (\n <div style={{ border: '1px solid #e8e8e8', borderRadius: '4px', marginBottom: '16px', padding: '12px' }}>\n <Input\n placeholder=\"Nhập URL hình ảnh...\"\n value={urlInputValue}\n onChange={(e) => setUrlInputValue(e.target.value)}\n onPressEnter={handleUrlSubmit}\n style={{ marginBottom: '8px' }}\n />\n <Space>\n <Button type=\"primary\" onClick={handleUrlSubmit}>\n Xác nhận\n </Button>\n <Button type=\"default\" onClick={() => setShowUrlInput(false)}>\n Hủy\n </Button>\n </Space>\n </div>\n )}\n\n {/* Danh sách ảnh */}\n <div style={{ border: '1px solid #e8e8e8', borderRadius: '4px' }}>\n <List\n dataSource={images}\n renderItem={(item) => (\n <List.Item\n key={item.id}\n style={{\n border: '1px solid #e8e8e8',\n borderBottom: 'none',\n padding: '12px',\n display: 'flex',\n alignItems: 'center',\n }}\n >\n <Col span={4}>\n <CustomImage\n preview={false}\n src={item.url}\n alt={item.name}\n width={imageSize}\n height={imageSize}\n style={{ objectFit: 'cover', borderRadius: '4px' }}\n />\n </Col>\n <Col span={12} style={{ paddingLeft: '16px', overflow: 'hidden' }}>\n <div\n style={{\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n maxWidth: '100%',\n }}\n >\n {item.name}\n </div>\n <div style={{ marginTop: '8px' }}>\n <Checkbox\n checked={item.isFeatured}\n onChange={(e) => handleToggleFeatured(item.id)}\n style={{ marginRight: '16px' }}\n >\n Chọn làm ảnh đại diện\n </Checkbox>\n { showImgSlide && \n <Checkbox\n checked={item.isSlideshow}\n onChange={(e) => handleToggleSlide(item.id, e.target.checked)}\n >\n Chọn làm ảnh slide\n </Checkbox>\n }\n </div>\n </Col>\n <Col span={8} style={{ textAlign: 'right' }}>\n <Space>\n {item.fromUpload && (\n <Button\n icon={<UploadOutlined />}\n type=\"primary\"\n size=\"small\"\n style={{ backgroundColor: '#1890ff', borderColor: '#1890ff' }}\n onClick={() => handleUpload(item.id)}\n >\n Tải lên\n </Button>\n )}\n {isPositiveInteger(item.id) && \n <Button\n icon={<PlusOutlined />}\n danger\n size=\"small\"\n onClick={() => onClickAddImageToContent(item.url)}\n />\n }\n <Button\n icon={<DeleteOutlined />}\n danger\n size=\"small\"\n onClick={() => handleRemove(item.id)}\n />\n </Space>\n </Col>\n </List.Item>\n )}\n />\n </div>\n </div>\n )\n};\n\nexport default ImageUploader;\n","/**************************************************************************/\n/* FormInput.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 { useContext, useMemo } from 'react';\nimport { Form, Input, Tooltip } from 'antd';\nimport { useTranslation } from 'react-i18next';\nimport { FormContextCustom } from '@/components/context/FormContextCustom';\n\nconst FormInput = ({\n name,\n label,\n required,\n messageRequire = 'error.required',\n placeholder,\n rules = [],\n initialValue,\n formItemProps,\n ContentComponent = Input,\n whitespace,\n isShowTooltip,\n minLength,\n maxLength,\n ...props\n}) => {\n const { t } = useTranslation();\n\n const { allowPressEnter, handleSubmit } = useContext(FormContextCustom);\n\n const minMaxRule = useMemo(() => {\n const ruleLengthArr = [];\n\n if (minLength) {\n ruleLengthArr.push({\n min: minLength,\n message: t('error.minLength', { min: minLength }),\n });\n }\n\n if (maxLength) {\n ruleLengthArr.push({\n max: maxLength,\n message: t('error.maxLength', { max: maxLength }),\n });\n }\n\n return ruleLengthArr;\n }, []); // eslint-disable-line\n\n const formItem = (\n <Form.Item\n {...(label && {\n label: t(label),\n })}\n name={name}\n initialValue={initialValue}\n rules={[\n {\n required,\n message: t(messageRequire),\n },\n ...(whitespace\n ? [\n {\n whitespace,\n message: t('error.empty'),\n },\n ]\n : []),\n ...minMaxRule,\n ...rules,\n ]}\n {...formItemProps}\n >\n <ContentComponent\n {...(placeholder && {\n placeholder: t(placeholder),\n })}\n {...props}\n onPressEnter={allowPressEnter ? handleSubmit : undefined}\n />\n </Form.Item>\n );\n\n return isShowTooltip ? (\n <Tooltip title={placeholder ? t(placeholder) : ''}>{formItem}</Tooltip>\n ) : (\n formItem\n );\n};\n\nexport default FormInput;\n","/**************************************************************************/\n/* FormInputNumber.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 { Form, InputNumber, Tooltip } from 'antd';\nimport { useTranslation } from 'react-i18next';\nimport { formatterInputNumber, parserInputNumber } from '@/utils/tools';\n\nconst FormInputNumber = ({\n name,\n label,\n required,\n messageRequire = 'error.required',\n placeholder,\n rules = [],\n initialValue,\n formItemProps,\n isShowTooltip,\n form,\n ...props\n}) => {\n const { t } = useTranslation();\n\n const formItem = (\n <Form.Item\n {...(label && {\n label: t(label),\n })}\n name={name}\n initialValue={initialValue}\n rules={[\n {\n required,\n message: t(messageRequire),\n },\n ...rules,\n ]}\n {...formItemProps}\n >\n <InputNumber\n {...(placeholder && {\n placeholder: t(placeholder),\n })}\n formatter={formatterInputNumber}\n parser={parserInputNumber}\n {...props}\n />\n </Form.Item>\n );\n\n return isShowTooltip ? (\n <Tooltip title={placeholder ? t(placeholder) : ''}>{formItem}</Tooltip>\n ) : (\n formItem\n );\n};\n\nexport default FormInputNumber;\n","/**************************************************************************/\n/* FormSelect.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 { useMemo, useCallback } from 'react';\nimport { Form, Select, Spin, Tooltip } from 'antd';\nimport { map, isObject, get } from 'lodash';\nimport { Waypoint } from 'react-waypoint';\nimport { useTranslation } from 'react-i18next';\nimport { onSearch as onChangeSearch } from '@/utils/tools';\n\nconst { Option } = Select;\n\nconst FormSelect = ({\n name,\n label = '',\n required,\n messageRequire = 'error.required',\n placeholder = 'placeholder.select',\n rules = [],\n resourceData,\n valueProp = 'id',\n titleProp = 'name',\n isFilterOption = true,\n formatText = value => value,\n formatValue = value => value,\n searchKey = 'name',\n loading,\n onEnter,\n enableWaypoint,\n initialValue,\n formItemProps,\n isShowTooltip,\n onChangeGetSelectedItem,\n onChange,\n isLimitWidth = false,\n ...props\n}) => {\n const { t } = useTranslation();\n const onSelectOption = useCallback((inputValue, option) => {\n const data = isObject(option.children) ? get(option.children.props?.record, searchKey) : option.children;\n if (onChangeSearch(data, inputValue)) {\n return option.value;\n }\n return null;\n }, [searchKey]);\n\n const optionWaypoint = (\n <Option\n className=\"loading-select-option\"\n disabled\n value=\"waypointTracking\"\n key=\"waypoint\"\n >\n <div style={{ height: 1 }}>\n <Waypoint onEnter={onEnter} />\n </div>\n </Option>\n );\n\n const optionLoading = useMemo(() => {\n return (\n <Option\n className=\"loading-select-option\"\n disabled\n value=\"loadingTracking\"\n key=\"loading\"\n >\n <div className=\"loading-select\">\n <Spin />\n </div>\n </Option>\n );\n }, []);\n\n const handleChange = (value) => {\n if (!onChangeGetSelectedItem) return;\n const findItem = resourceData?.find(\n (item) => get(item, valueProp) === value,\n );\n onChangeGetSelectedItem(value, findItem);\n };\n const formItem = (\n <Form.Item\n label={t(label)}\n name={name}\n rules={[\n { required, message: t(messageRequire) },\n ...rules\n ]}\n initialValue={initialValue}\n {...formItemProps}\n >\n <Select\n placeholder={t(placeholder)}\n filterOption={isFilterOption ? onSelectOption : false}\n popupMatchSelectWidth={isLimitWidth}\n {...props}\n onChange={onChange || handleChange}\n >\n {map(resourceData, (data, index) => (\n <Option\n key={String(index)}\n value={formatValue(valueProp ? get(data, valueProp) : data, data)}\n >\n {formatText(titleProp ? get(data, titleProp) : data, data)}\n </Option>\n ))}\n {enableWaypoint && optionWaypoint}\n {loading && optionLoading}\n </Select>\n </Form.Item>\n );\n\n return isShowTooltip ? (\n <Tooltip title={placeholder ? t(placeholder) : ''}>{formItem}</Tooltip>\n ) : (\n formItem\n );\n};\n\nexport default FormSelect;\n","/**************************************************************************/\n/* FormSelectAPI.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 { useContext, useEffect, useState, useMemo, useCallback } from 'react';\nimport RequestUtils from '@/utils/RequestUtils';\nimport { Form, Select, Spin, Divider, Input, Button, message } from 'antd';\nimport { get } from 'lodash';\nimport debounce from 'lodash/debounce';\nimport { useTranslation } from 'react-i18next';\nimport MyContext from '@/DataContext';\nimport { useUpdateEffect, useMount } from \"@/hooks/MyHooks\";\nimport { PlusOutlined } from '@ant-design/icons';\nimport { SUCCESS_CODE } from '@/configs';\nimport { arrayEmpty } from \"@/utils/dataUtils\"\n\nconst { Option } = Select;\nconst FormSelectAPI = ({\n apiPath = '',\n apiAddNewItem = '',\n name,\n label = '',\n required,\n messageRequire = 'error.required',\n placeholder = 'placeholder.select',\n rules = [],\n valueProp = 'id',\n titleProp = 'name',\n isFetchOnMount = true,\n formatText = value => value,\n formatValue = value => value,\n searchKey = 'name',\n initialValue,\n formItemProps,\n isShowModalCreateNewItem,\n onChangeGetSelectedItem,\n onCreateNewItem = () => false,\n isLimitWidth = false,\n filter,\n createDefaultValues,\n onData = (values) => values,\n fnLoadData,\n title = '',\n ...props\n}) => {\n\n const { f5List } = useContext(MyContext);\n const [localFilter, setLocalFilter] = useState(filter || {});\n const [loading, setLoading] = useState(false);\n const [resourceData, setData] = useState([]);\n const [value, setValue] = useState('');\n\n useEffect(() => {\n setLocalFilter(filter);\n }, [filter]);\n\n useMount(() => {\n if (isFetchOnMount && arrayEmpty(resourceData)) {\n fetchResource(localFilter);\n }\n });\n\n const fetchResource = useCallback((values) => {\n if (!apiPath) {\n return;\n }\n if (fnLoadData) {\n Promise.resolve(fnLoadData(values)).then(onData).then(data => {\n setData(data)\n });\n return;\n }\n setLoading(true);\n RequestUtils.Get('/' + apiPath, values).then(async ({ data, errorCode }) => {\n if (errorCode !== 200) {\n return Promise.reject(\"Get not success from server .!\");\n }\n Promise.resolve(onData(data)).then(data => {\n setData(data)\n })\n setLoading(false);\n }).catch(e => {\n console.log('[form.FormSelectAPI] Error ', e);\n setLoading(false);\n });\n /* eslint-disable-next-line */\n }, [onData, apiPath]);\n\n useUpdateEffect(() => {\n if (f5List?.apiPath === apiPath || (localFilter?.forceUpdate ?? false) !== false) {\n fetchResource(localFilter);\n }\n /* eslint-disable-next-line */\n }, [f5List, localFilter, apiPath]);\n\n const { t } = useTranslation();\n const optionLoading = useMemo(() => {\n return (\n <Option\n className=\"loading-select-option\"\n disabled\n value=\"loadingTracking\"\n key=\"loading\"\n >\n <div className=\"loading-select\">\n <Spin />\n </div>\n </Option>\n );\n }, []);\n\n const addItem = useCallback(async () => {\n /* Open Modal Create Data */\n if (onCreateNewItem()) {\n return;\n }\n if (!value || !apiAddNewItem) {\n return;\n }\n let dataPost = { [searchKey]: value, ...(createDefaultValues || {}) }\n const { data, errorCode, message: msg } = await RequestUtils.Post(\"/\" + apiAddNewItem, dataPost);\n if (errorCode === SUCCESS_CODE) {\n const newData = resourceData.concat(data);\n setData(newData);\n setValue('');\n }\n message.info(msg);\n /* eslint-disable-next-line */\n }, [value, createDefaultValues, fnLoadData]);\n\n const onSearch = useCallback((value) => {\n fetchResource({ ...localFilter, [searchKey]: value });\n /* eslint-disable-next-line */\n }, [localFilter, searchKey]);\n\n const handleValueInput = (e) => {\n setValue(e.target.value);\n }\n\n const handleChange = (value) => {\n if (!onChangeGetSelectedItem) return;\n const findItem = resourceData?.find(\n (item) => get(item, valueProp) === value,\n );\n onChangeGetSelectedItem(value, findItem);\n };\n\n return (\n <Form.Item\n label={t(label)}\n name={name}\n rules={[\n { required, message: t(messageRequire) },\n ...rules\n ]}\n initialValue={initialValue}\n {...formItemProps}\n >\n <Select\n placeholder={t(placeholder)}\n filterOption={false}\n popupMatchSelectWidth={isLimitWidth}\n dropdownRender={(menu) => (\n <>\n {menu}\n <Divider style={{ margin: '8px 0' }} />\n <div style={{ padding: \"0 8px 4px\", display: \"flex\", alignItems: \"end\" }} >\n {!isShowModalCreateNewItem &&\n <Input\n style={{ width: '100%' }}\n placeholder=\"Add new item\"\n value={value}\n onChange={handleValueInput}\n onKeyDown={(e) => e.stopPropagation()}\n />\n }\n <Button\n type=\"text\"\n icon={<PlusOutlined />}\n onClick={addItem}\n color=\"primary\"\n variant=\"dashed\"\n style={{ marginLeft: 20 }}\n >\n Add item\n </Button>\n </div>\n </>\n )}\n options={\n resourceData?.map((item) => ({\n label: formatText(titleProp ? get(item, titleProp) : item, item),\n value: formatValue(valueProp ? get(item, valueProp) : item, item)\n }))\n }\n onSearch={debounce(onSearch, 600)}\n onChange={handleChange}\n {...props}\n >\n {loading && optionLoading}\n </Select>\n </Form.Item>\n );\n}\n\nexport default FormSelectAPI;","/**************************************************************************/\n/* FormDatePicker.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 { DatePicker, Form } from 'antd';\nimport { FORMAT_DATE_INPUT } from '@/configs/constant';\nimport dayjs from 'dayjs';\nimport { useTranslation } from 'react-i18next';\n\nconst FormDatePicker = ({\n name,\n label,\n required,\n messageRequire = 'error.required',\n initialValue,\n rules = [],\n placeholder,\n disabled = false,\n format = FORMAT_DATE_INPUT,\n formItemProps,\n ...props\n}) => {\n const { t } = useTranslation();\n return (\n <Form.Item\n {...(label && {\n label: t(label),\n })}\n name={name}\n rules={[\n { required, message: t(messageRequire) },\n ...rules,\n ]}\n normalize={(value) => value && dayjs(value)}\n getValueProps={(value) => ({\n value: value && dayjs(value)\n })}\n {...formItemProps}\n >\n <DatePicker\n style={{ width: '100%' }}\n format={format}\n disabled={disabled}\n {...(placeholder && {\n placeholder: t(placeholder),\n })}\n {...props}\n />\n </Form.Item>\n );\n};\n\nexport default FormDatePicker;\n","/**************************************************************************/\n/* FormTimePicker.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 { Form, TimePicker } from 'antd';\nimport { FORMAT_TIME_INPUT } from '@/configs/constant';\nimport { useTranslation } from 'react-i18next';\n\nconst FormTimePicker = ({\n name,\n label,\n required,\n messageRequire = 'error.required',\n onChange,\n initialValue,\n rules = [],\n placeholder,\n format = FORMAT_TIME_INPUT,\n formItemProps,\n ...props\n}) => {\n const { t } = useTranslation();\n return (\n <Form.Item\n {...(label && {\n label: t(label),\n })}\n name={name}\n rules={[\n {\n required,\n message: t(messageRequire),\n },\n ...rules,\n ]}\n initialValue={initialValue}\n {...formItemProps}\n >\n <TimePicker\n onChange={onChange}\n format={format}\n {...(placeholder && {\n placeholder: t(placeholder),\n })}\n {...props}\n />\n </Form.Item>\n );\n};\n\nexport default FormTimePicker;\n","/**************************************************************************/\n/* FormTextArea.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 { Form, Input } from 'antd';\nimport { useTranslation } from 'react-i18next';\n\nconst { TextArea } = Input;\nconst FormTextArea = ({\n name,\n label,\n required,\n messageRequire = 'error.required',\n placeholder,\n rules = [],\n formItemProps,\n ...props\n}) => {\n\n const { t } = useTranslation();\n return (\n <Form.Item\n {...formItemProps}\n {...(label && {\n label: t(label),\n })}\n name={name}\n rules={[\n {\n required,\n message: t(messageRequire),\n },\n {\n whitespace: true,\n message: t('error.empty'),\n },\n ...rules,\n ]}\n >\n <TextArea\n {...props}\n {...(placeholder && {\n placeholder: t(placeholder),\n })}\n />\n </Form.Item>\n );\n};\n\nexport default FormTextArea;\n","/**************************************************************************/\n/* FormCheckbox.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 { Form, Checkbox } from 'antd';\nimport { useTranslation } from 'react-i18next';\n\nconst FormCheckbox = ({\n name,\n label,\n text,\n rules = [],\n formItemProps,\n initialValue,\n ...props\n}) => {\n const { t } = useTranslation();\n\n return (\n <Form.Item\n {...formItemProps}\n {...(label && {\n label: t(label),\n })}\n name={name}\n initialValue={initialValue}\n rules={rules}\n valuePropName=\"checked\"\n >\n <Checkbox {...props}> {text} </Checkbox>\n </Form.Item>\n );\n};\n\nexport default FormCheckbox;\n","/**************************************************************************/\n/* FormRadioGroup.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 { Form, Radio } from 'antd';\nimport { useTranslation } from 'react-i18next';\nimport { map, get } from 'lodash';\n\nconst FormRadioGroup = ({\n name,\n label,\n required,\n messageRequire = 'error.required',\n placeholder,\n valueProp = 'id',\n titleProp = 'name',\n formatText = value => value,\n formatValue = value => value,\n rules = [],\n resourceData = [],\n initialValue,\n formItemProps,\n ...props\n}) => {\n const { t } = useTranslation();\n return (\n <Form.Item\n {...(label && { label: t(label) })}\n name={name}\n initialValue={initialValue}\n rules={[\n { required, message: t(messageRequire) },\n ...rules,\n ]}\n {...formItemProps}\n >\n <Radio.Group\n {...(placeholder && { placeholder: t(placeholder) })}\n {...props}\n >\n {map(resourceData, (data, index) => (\n <Radio\n key={String(index)}\n value={formatValue(valueProp ? get(data, valueProp) : data, data)}\n >\n {formatText(titleProp ? get(data, titleProp) : data, data)}\n </Radio>\n ))}\n </Radio.Group>\n </Form.Item>\n );\n};\n\nexport default FormRadioGroup;\n","/**************************************************************************/\n/* FormAutoComplete.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 { useMemo, useCallback } from 'react';\nimport { AutoComplete, Form, Spin } from 'antd';\nimport { map, isObject, get } from 'lodash';\nimport { useTranslation } from 'react-i18next';\nimport { onSearch as onChangeSearch } from '@/utils/tools';\n\nconst { Option } = AutoComplete;\n\nconst FormAutoComplete = ({\n name,\n label = '',\n required,\n messageRequire = 'error.required',\n placeholder = 'placeholder.select',\n rules = [],\n resourceData,\n valueProp = 'id',\n titleProp = 'name',\n isFilterOption = true,\n formatText = value => value,\n formatValue = value => value.toString(),\n searchKey = 'name',\n loading,\n initialValue,\n formItemProps,\n customGetValueFromEvent,\n ...props\n}) => {\n\n const { t } = useTranslation();\n const onSelectOption = useCallback((inputValue, option) => {\n const data = isObject(option.children) ? get(option.children.props?.record, searchKey) : option.children;\n if (onChangeSearch(data, inputValue)) {\n return option.value;\n }\n return null;\n }, [searchKey]);\n\n const optionLoading = useMemo(() => (\n <Option\n className=\"loading-select-option\"\n disabled\n value=\"loadingTracking\"\n key=\"loading\"\n >\n <div className=\"loading-select\"><Spin /></div>\n </Option>\n ), []);\n\n const getValueFromEvent = (value) => {\n if (!customGetValueFromEvent) {\n return value;\n }\n const findItem = resourceData?.find(\n (item) => get(item, valueProp).toString() === value,\n );\n return customGetValueFromEvent(value, findItem);\n };\n\n return (\n <Form.Item\n label={t(label)}\n name={name}\n rules={[\n { required, message: t(messageRequire) },\n ...rules\n ]}\n initialValue={initialValue}\n {...(customGetValueFromEvent && {\n getValueFromEvent\n })}\n {...formItemProps}\n >\n <AutoComplete\n placeholder={t(placeholder)}\n filterOption={isFilterOption ? onSelectOption : false}\n {...props}\n >\n {map(resourceData, (data, index) => (\n <Option\n key={String(index)}\n value={formatValue(valueProp ? get(data, valueProp) : data)}\n >\n {formatText(titleProp ? get(data, titleProp) : data)}\n </Option>\n ))}\n {loading && optionLoading}\n </AutoComplete>\n </Form.Item>\n );\n};\n\nexport default FormAutoComplete;\n","/**************************************************************************/\n/* FormCascader.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 React from 'react';\nimport { Cascader, Form } from 'antd';\nimport { useTranslation } from 'react-i18next';\nconst { SHOW_CHILD } = Cascader;\n\nconst FormCascader = ({\n name,\n label,\n required,\n resourcesData = [],\n messageRequire = 'error.required',\n rules = [],\n initialValue,\n formItemProps,\n ...props\n}) => {\n const { t } = useTranslation();\n const onChange = (value) => {\n console.log(value);\n };\n return (\n <Form.Item\n label={t(label)}\n name={name}\n rules={[\n { required, message: t(messageRequire) },\n ...rules,\n ]}\n initialValue={initialValue}\n {...formItemProps}\n >\n <Cascader\n style={{ width: '100%' }}\n options={resourcesData}\n onChange={onChange}\n multiple\n maxTagCount=\"responsive\"\n showCheckedStrategy={SHOW_CHILD}\n {...props}\n />\n </Form.Item>\n );\n};\n\nexport default FormCascader;","/**************************************************************************/\n/* useData.js \t\t\t\t\t\t*/\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 { isArray } from \"lodash\";\nimport { useContext, useCallback, useEffect, useState } from \"react\";\nimport RequestUtils from \"@/utils/RequestUtils\";\nimport MyContext from '@/DataContext';\nimport { useUpdateEffect } from \"@/hooks/MyHooks\";\nimport { SUCCESS_CODE } from \"@/configs\";\n\nconst log = (val, key = '') => console.log('[hooks.useData] ' + key, val);\nfunction useData({\n\tqueryParams,\n\tonCompleted = values => values,\n\tapi\n}) {\n\n\tconst [loading, setLoading] = useState(false);\n\tconst [data, setData] = useState({});\n\tconst { f5List } = useContext(MyContext)\n\n\t/* refetch dành cho fetch các page tăng dần */\n\tconst refetch = useCallback(async (values) => {\n\t\tif (loading) {\n\t\t\treturn Promise.resolve({ eMsg: \"loading\" });\n\t\t}\n\t\tsetLoading(true);\n\t\tconst { data, errorCode } = await RequestUtils.Get('/' + api, values);\n\t\tsetLoading(false);\n\t\tif (errorCode !== SUCCESS_CODE) {\n\t\t\treturn Promise.resolve({ eMsg: api + \" not fetch success .!\" });\n\t\t}\n\t\tlet myData = data;\n\t\tif (isArray(myData)) {\n\t\t\tmyData = { embedded: myData, page: {} }\n\t\t}\n\t\tsetData(myData);\n\t\tonCompleted(myData);\n\t\treturn myData;\n\t}, [onCompleted, api, loading]);\n\n\tuseEffect(() => {\n\t\trefetch(queryParams);\n\t\t/* eslint-disable-next-line */\n\t}, [queryParams]);\n\n\t/* fetchMore dành cho search kết quả đã có săn của Form để có dữ liệu hiển thị trong form select */\n\tconst fetchMore = useCallback(async ({ filterField, defaultValue }) => {\n\t\tlog({ queryParams, filterField, defaultValue }, 'fetchMore');\n\t\tconst { data, errorCode } = await RequestUtils.Get('/' + api, { [filterField]: defaultValue });\n\t\tif (errorCode !== SUCCESS_CODE) {\n\t\t\treturn { embedded: [], page: {} }\n\t\t}\n\t\tlet myData = data;\n\t\tif (isArray(myData)) {\n\t\t\tmyData = { embedded: myData, page: {} }\n\t\t}\n\t\treturn myData;\n\t}, [queryParams, api]);\n\n\tuseUpdateEffect(() => {\n\t\trefetch(queryParams);\n\t}, [f5List]);\n\n\treturn {\n\t\tloading, data, refetch, fetchMore\n\t};\n}\n\nexport const useGetAllCustomersSimpleQuery = ({ queryParams, onCompleted }) =>\n\tuseData({ queryParams, onCompleted, api: 'customer/find' });\n\nexport const useGetAllBusinessUsersQuery = ({ queryParams, onCompleted }) =>\n\tuseData({ queryParams, onCompleted, api: 'user/list' });\n\nexport const useGetAllProductQuery = ({ queryParams, onCompleted }) =>\n\tuseData({ queryParams, onCompleted, api: 'product/fetch' });\n\nexport const useGetAllProviderQuery = ({ queryParams, onCompleted }) =>\n\tuseData({ queryParams, onCompleted, api: 'provider/fetch' });\n\nexport const useGetAllProvinceQuery = ({ queryParams, onCompleted }) =>\n\tuseData({ queryParams, onCompleted, api: 'province/find' });\n\nexport const useGetAllStockQuery = ({ queryParams, onCompleted }) =>\n\tuseData({ queryParams, onCompleted, api: 'warehouse/fetch-stock' });\n\nexport const useGetAllCategoryQuery = ({ queryParams, onCompleted }) =>\n\tuseData({ queryParams, onCompleted, api: 'category/product/fetch' });\n\nexport const useGetCategoryPost = ({ queryParams, onCompleted }) =>\n\tuseData({ queryParams, onCompleted, api: 'category/page/fetch' });\n\nexport const useGetShipStatusQuery = ({ queryParams, onCompleted }) =>\n\tuseData({ queryParams, onCompleted, api: 'shipping/fetch-status' });\n\nexport const useGetOrderCodeQuery = ({ queryParams, onCompleted }) =>\n\tuseData({ queryParams, onCompleted, api: 'order/fetch' });\n\nexport const useGetServiceQuery = ({ queryParams, onCompleted }) =>\n\tuseData({ queryParams, onCompleted, api: 'service/list' });\n\nexport const useGetMaterialQuery = ({ queryParams, onCompleted }) =>\n\tuseData({ queryParams, onCompleted, api: 'material/fetch' });\n\nexport const useGetAllFaq = ({ queryParams, onCompleted }) =>\n\tuseData({ queryParams, onCompleted, api: 'faq/fetch' });\n\nexport default useData;\n","/**************************************************************************/\n/* useInfinite.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 unionBy from 'lodash/unionBy';\nimport { useState } from 'react';\n\nconst log = (value, key = '') => console.log('[hooks.useInfinite] ' + key, value);\n\nconst useInfinite = ({\n initialFilter = {},\n useGetAllQuery,\n searchKey = 'q',\n handleSelectedDefault\n}) => {\n\n const [queryParams, setQueryParams] = useState(initialFilter);\n const [isSetDefaultValue, isSetSetDefaultValue] = useState(!handleSelectedDefault);\n const [currentPage, setCurrentPage] = useState(1);\n const [resourceData, setResourceData] = useState([]);\n\n const { loading, data, refetch, fetchMore } = useGetAllQuery({\n queryParams,\n onCompleted: res => {\n setResourceData(res?.embedded);\n if (!isSetDefaultValue) {\n isSetSetDefaultValue(true);\n handleSelectedDefault?.(res?.embedded?.[0]?.id);\n }\n }\n });\n\n const onLoadMore = () => {\n log('onLoadMore .!!')\n if (currentPage === data?.page?.totalPages && !loading) {\n return Promise.resolve();\n }\n return refetch({\n ...queryParams,\n page: data?.page?.currentPage + 1\n }).then(data => {\n setCurrentPage(data?.page?.currentPage);\n const mergedData = unionBy(resourceData, data?.embedded, 'id');\n setResourceData(mergedData);\n });\n };\n\n const enableWaypoint = !loading && data?.embedded?.length < data?.page?.pageSize;\n const onSearch = (value) => {\n if (searchKey === 'q') {\n setQueryParams({ ...queryParams, page: 1, q: value?.trim() || undefined });\n } else {\n setQueryParams({ ...queryParams, [searchKey]: value, page: 1 });\n }\n };\n\n const onSubmitFilter = (values) => {\n setQueryParams({ ...queryParams, page: 1, ...values });\n };\n\n const onClearFilter = () => {\n setQueryParams({ page: 1, limit: 10 });\n };\n\n const fetchMoreDefaultValue = (filterField, defaultValue) => {\n log({ filterField, defaultValue }, 'fetchMoreDefaultValue .!!')\n fetchMore({ filterField, defaultValue })?.then(data => {\n const mergedData = unionBy(resourceData, data?.embedded, 'id');\n setResourceData(mergedData);\n });\n };\n\n return {\n onLoadMore,\n onSearch,\n fetchMoreDefaultValue,\n onSubmitFilter,\n onClearFilter,\n enableWaypoint,\n loading,\n resourceData,\n refetch\n };\n};\n\nexport default useInfinite;\n","/**************************************************************************/\n/* FormSelectInfinite.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 { forwardRef, useContext, useEffect, useImperativeHandle, useMemo } from 'react';\nimport debounce from 'lodash/debounce';\nimport get from 'lodash/get';\nimport useInfinite from '@/hooks/useInfinite';\nimport { FormContextCustom } from '@/components/context/FormContextCustom';\nimport FormSelect from '../FormSelect';\n\nconst FormSelectInfinite = ({\n useGetAllQuery,\n initialFilter,\n searchKey = 'q',\n filterField = 'id',\n customValue,\n handleSelectedDefault,\n ...props\n}, ref) => {\n\n const { record } = useContext(FormContextCustom);\n const defaultPropName = get(record, props.name);\n const defaultValue = useMemo(() =>\n customValue || (defaultPropName ?? undefined),\n [defaultPropName, customValue]);\n\n const {\n onLoadMore,\n onSearch,\n enableWaypoint,\n fetchMoreDefaultValue,\n loading,\n resourceData,\n refetch,\n } = useInfinite({\n initialFilter,\n useGetAllQuery,\n searchKey,\n handleSelectedDefault\n });\n\n useEffect(() => {\n if (defaultValue) {\n fetchMoreDefaultValue(filterField, defaultValue);\n }\n /* eslint-disable-next-line */\n }, [defaultValue]);\n\n useImperativeHandle(ref, () => ({\n refetchList: () => {\n refetch();\n },\n /* eslint-disable-next-line */\n }), [defaultValue]);\n\n return (\n <FormSelect\n onEnter={onLoadMore}\n loading={loading}\n resourceData={resourceData}\n enableWaypoint={enableWaypoint}\n onSearch={debounce(onSearch, 600)}\n isFilterOption={false}\n {...props}\n showSearch\n />\n );\n};\n\nexport default forwardRef(FormSelectInfinite);\n","/**************************************************************************/\n/* FormSelectInfiniteProvince.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 { useGetAllProvinceQuery } from '@/hooks/useData';\nimport FormSelectInfinite from './FormSelectInfinite';\n\nconst FormSelectInfiniteProvince = ({ name, ...props }) => {\n return (\n <FormSelectInfinite\n useGetAllQuery={useGetAllProvinceQuery}\n name={name || \"provinceId\"}\n valueProp=\"id\"\n titleProp=\"name\"\n searchKey=\"name\"\n filterField=\"id\"\n {...props}\n />\n );\n};\n\nexport default FormSelectInfiniteProvince;\n","/**************************************************************************/\n/* FormAddress.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 { Form, Col } from \"antd\";\nimport FormInput from \"@/components/form/FormInput\";\nimport FormSelect from \"@/components/form/FormSelect\";\nimport FormSelectInfiniteProvince from \"@/components/form/SelectInfinite/FormSelectInfiniteProvince\";\nimport { useEffectAsync } from \"@/hooks/MyHooks\";\nimport React, { useState } from \"react\";\nimport RequestUtils from \"@/utils/RequestUtils\";\n\nconst FormAddress = () => {\n return <>\n <Col md={12} xs={24}>\n <FormSelectInfiniteProvince\n name=\"provinceId\"\n label=\"Tỉnh / TP\"\n required\n placeholder=\"Tỉnh / TP\"\n initialFilter={{ id: 0 }}\n />\n </Col>\n <Col md={12} xs={24}>\n <Form.Item\n noStyle\n shouldUpdate={(prevValues, curValues) => prevValues.provinceId !== curValues.provinceId}\n >\n {({ getFieldValue }) => (\n <FormWard\n parentId={getFieldValue('provinceId')}\n />\n )}\n </Form.Item>\n </Col>\n <Col md={24} xs={24}>\n <FormInput\n label=\"Địa chỉ\"\n name=\"address\"\n required\n placeholder=\"Địa chỉ\"\n />\n </Col>\n </>\n}\n\nconst FormWard = React.memo(({ parentId }) => {\n\n const [datas, setData] = useState([]);\n useEffectAsync(async () => {\n if (!parentId) {\n return;\n }\n const wards = await RequestUtils.GetAsList(\"/province/find\", { id: parentId });\n setData(wards);\n }, [parentId]);\n\n return (\n <FormSelect\n name=\"wardId\"\n label=\"Phường / Xã\"\n required\n resourceData={datas}\n placeholder=\"Phường / Xã\"\n />\n );\n});\n\nexport default FormAddress;","/**************************************************************************/\n/* FormHidden.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 { Form, Input } from 'antd';\n\nconst FormHidden = ({ name, ...props }) => (\n <Form.Item name={name} {...props} hidden >\n <Input />\n </Form.Item>\n)\n\nexport default FormHidden;","import { useContext, useState, useRef, useImperativeHandle, forwardRef } from 'react';\r\nimport JoditEditor from 'jodit-react';\r\nimport { useEffectAsync } from '@/hooks/MyHooks';\r\nimport { FormContextCustom } from '@/components/context/FormContextCustom';\r\n\r\nconst FormJoditEditor = forwardRef(({ \r\n name,\r\n initContent = '',\r\n placeholder = 'Nhập nội dung'\r\n }, ref) => {\r\n\r\n const { form } = useContext(FormContextCustom);\r\n const [ editorValue, setEditorValue ] = useState('');\r\n const joditInstance = useRef(null);\r\n\r\n const config = {\r\n placeholder: placeholder || '',\r\n minHeight: 700,\r\n spellcheck: true,\r\n enter: \"BR\"\r\n };\r\n\r\n const handleChange = (newContent) => {\r\n const content = newContent || '';\r\n form.setFieldValue(name, content);\r\n };\r\n\r\n /* Hàm public để chèn ảnh (sẽ được gọi từ ngoài) */\r\n useImperativeHandle(ref, () => ({\r\n insertImage: (imageUrl) => {\r\n if (!joditInstance.current) {\r\n return;\r\n }\r\n const editor = joditInstance.current;\r\n const imgHtml = `\r\n <p style=\"text-align: center;\">\r\n <img src=\"${imageUrl}\" style=\"max-width: 600px; height: auto;\" />\r\n </p>\r\n `;\r\n try {\r\n editor.selection.insertHTML(imgHtml);\r\n handleChange(editor.value);\r\n } catch (err) {\r\n console.error('Insert failed:', err);\r\n }\r\n }\r\n /* eslint-disable-next-line */\r\n }), [form, name]);\r\n\r\n useEffectAsync(() => {\r\n setEditorValue(initContent);\r\n }, [initContent]);\r\n\r\n return (\r\n <JoditEditor\r\n value={editorValue}\r\n config={config}\r\n onChange={handleChange}\r\n ref={(editor) => {\r\n joditInstance.current = editor;\r\n }}\r\n />\r\n )\r\n});\r\n\r\nexport default FormJoditEditor;","/**************************************************************************/\n/* styles.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 styled from 'styled-components';\n\nconst FormStyles = styled.div`\n .form-list {\n &__list-item {\n position: relative;\n padding: 15px;\n border: 2px dashed ${({ theme }) => theme.border.default};\n border-radius: 8px;\n margin-bottom: 20px;\n }\n &__remove-button {\n position: absolute;\n top: -10px;\n right: -10px;\n font-size: 25px;\n }\n }\n`;\n\nexport default FormStyles;\n","/**************************************************************************/\n/* FormSelectUser.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 { useState } from 'react';\nimport FormSelect from './FormSelect';\nimport RequestUtils from '@/utils/RequestUtils';\nimport { arrayNotEmpty } from '@/utils/dataUtils';\nimport { useEffectAsync } from '@/hooks/MyHooks';\n\nconst FormSelectUser = ({ name, label, filter, ...props }) => {\n\n\tconst [data, setData] = useState([]);\n\tuseEffectAsync(async () => {\n\t\tconst { data } = await RequestUtils.Get('/user/list', filter);\n\t\tif (arrayNotEmpty(data?.embedded)) {\n\t\t\tsetData(data.embedded);\n\t\t}\n\t}, [filter]);\n\n\treturn (\n\t\t<FormSelect\n\t\t\tlabel={label}\n\t\t\tplaceholder={label}\n\t\t\tname={name || 'ssoId'}\n\t\t\tvalueProp=\"id\"\n\t\t\ttitleProp=\"ssoId\"\n\t\t\tresourceData={data}\n\t\t\t{...props}\n\t\t/>\n\t);\n}\n\nexport default FormSelectUser;","\n/**************************************************************************/\n/* FormAutoCompleteInfinite.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 { useContext, useEffect, useMemo } from 'react';\nimport debounce from 'lodash/debounce';\nimport get from 'lodash/get';\nimport useInfinite from '@/hooks/useInfinite';\nimport { FormContextCustom } from '@/components/context/FormContextCustom';\nimport FormAutoComplete from '../FormAutoComplete';\n\nconst FormAutoCompleteInfinite = ({\n useGetAllQuery,\n initialFilter,\n searchKey = 'q',\n filterField = 'id',\n customValue,\n ...props\n}) => {\n\n const { record } = useContext(FormContextCustom);\n const defaultValue = useMemo(\n () => customValue || get(record, props.name),\n /* eslint-disable-next-line */\n [record]);\n\n const { onSearch, fetchMoreDefaultValue, loading, resourceData } = useInfinite({\n initialFilter,\n useGetAllQuery,\n searchKey\n });\n\n useEffect(() => {\n if (defaultValue) {\n fetchMoreDefaultValue(filterField, defaultValue);\n }\n /* eslint-disable-next-line */\n }, [defaultValue]);\n\n return (\n <FormAutoComplete\n loading={loading}\n resourceData={resourceData}\n onSearch={debounce(onSearch, 600)}\n isFilterOption={false}\n {...props}\n />\n );\n};\n\nexport default FormAutoCompleteInfinite;\n","\n/**************************************************************************/\n/* FormAutoCompleteCustomer.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 { useGetAllCustomersSimpleQuery } from '@/hooks/useData';\nimport FormAutoCompleteInfinite from './FormAutoCompleteInfinite';\n\nconst FormAutoCompleteCustomer = props => {\n return (\n <FormAutoCompleteInfinite\n useGetAllQuery={useGetAllCustomersSimpleQuery}\n name=\"customerId\"\n valueProp=\"name\"\n titleProp=\"name\"\n {...props}\n />\n );\n};\n\nexport default FormAutoCompleteCustomer;\n","/**************************************************************************/\n/* FormSelectInfiniteProduct.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 { useGetMaterialQuery } from '@/hooks/useData';\nimport FormSelectInfinite from './FormSelectInfinite';\n\nconst FormSelectInfiniteMaterial = props => {\n return (\n <FormSelectInfinite\n useGetAllQuery={useGetMaterialQuery}\n name=\"materialId\"\n valueProp=\"id\"\n titleProp=\"name\"\n searchKey=\"name\"\n filterField=\"id\"\n {...props}\n />\n );\n};\n\nexport default FormSelectInfiniteMaterial;\n","/**************************************************************************/\n/* FormSelectInfiniteBusinessUser.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 { useGetAllBusinessUsersQuery } from '@/hooks/useData';\nimport FormSelectInfinite from './FormSelectInfinite';\n\nconst FormSelectInfiniteBusinessUser = ({\n name = \"assigneeId\",\n valueProp=\"id\",\n ...props\n}) => {\n return (\n <FormSelectInfinite\n useGetAllQuery={useGetAllBusinessUsersQuery}\n name={name}\n valueProp={valueProp}\n titleProp=\"fullName\"\n searchKey=\"fullName\"\n filterField=\"id\"\n {...props}\n />\n )\n};\n\nexport default FormSelectInfiniteBusinessUser;\n","/**************************************************************************/\n/* FormInfiniteStock.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 { useGetAllStockQuery } from '@/hooks/useData';\nimport FormSelectInfinite from './FormSelectInfinite';\n\nconst FormInfiniteStock = props => {\n return (\n <FormSelectInfinite\n useGetAllQuery={useGetAllStockQuery}\n name=\"stockId\"\n valueProp=\"id\"\n titleProp=\"name\"\n searchKey=\"name\"\n filterField=\"id\"\n initialFilter={{ page: 1 }}\n {...props}\n />\n );\n};\n\nexport default FormInfiniteStock;\n","import { useGetShipStatusQuery } from '@/hooks/useData';\nimport FormSelectInfinite from './FormSelectInfinite';\n\nconst FormInfiniteShipStatus = props => {\n return (\n <FormSelectInfinite\n useGetAllQuery={useGetShipStatusQuery}\n name=\"status\"\n valueProp=\"id\"\n titleProp=\"name\"\n searchKey=\"name\"\n filterField=\"id\"\n initialFilter={{page: 1}}\n {...props}\n />\n );\n};\n\nexport default FormInfiniteShipStatus;\n","/**************************************************************************/\n/* FormInfiniteCategory.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 { useGetAllCategoryQuery } from '@/hooks/useData';\nimport FormSelectInfinite from './FormSelectInfinite';\n\nconst FormCategoryPost = ({\n name=\"pageCategoryId\", \n ...props\n}) => {\n return (\n <FormSelectInfinite\n useGetAllQuery={useGetAllCategoryQuery}\n name={name}\n valueProp=\"id\"\n titleProp=\"name\"\n searchKey=\"name\"\n filterField=\"id\"\n initialFilter={{ page: 1 }}\n {...props}\n />\n )\n};\n\nexport default FormCategoryPost;\n","/**************************************************************************/\n/* useServiceId.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 { useState, useCallback } from 'react';\n\nconst useServiceId = () => {\n\n const [data, setData] = useState();\n const setServiceId = useCallback((id) => {\n setData({ serviceId: id });\n }, []);\n\n return {\n serviceId: data?.serviceId,\n setServiceId,\n };\n};\n\nexport default useServiceId;\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 * @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","/**************************************************************************/\n/* index.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 ButtonIcon from './ButtonIcon';\nimport { CustomButtonIconWrapper } from './styles';\n\nconst CustomButtonIcon = ({\n handleClick,\n icon,\n title,\n buttonProps,\n className,\n}) => {\n return (\n <CustomButtonIconWrapper\n className={`custom-button-icon-wrapper ${className || ''}`}\n >\n <ButtonIcon\n title={title}\n handleClick={handleClick}\n buttonProps={buttonProps}\n icon={icon}\n />\n </CustomButtonIconWrapper>\n );\n};\n\nexport default CustomButtonIcon;\n","/**************************************************************************/\n/* FileUploadView.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 { useState, useEffect } from \"react\";\nimport { Col, Tag, Popconfirm } from \"antd\";\nimport { DeleteOutlined } from '@ant-design/icons';\n\nconst FileUploadView = ({\n\tfiles = [],\n\tmultiPathFile,\n\tonRemoveFile = (file) => file,\n\tonRemoveMultiPathFile = (value) => value\n}) => {\n\n\tconst [multiPaths, setmultiPaths] = useState([]);\n\tuseEffect(() => {\n\t\tlet files = multiPathFile.map(f => f.name);\n\t\tsetmultiPaths(files);\n\t}, [multiPathFile]);\n\n\tconst onDelete = (name) => {\n\t\tif (String(name).startsWith(\"http\")) {\n\t\t\tonRemoveFile(name);\n\t\t} else {\n\t\t\tonRemoveMultiPathFile(name)\n\t\t}\n\t}\n\n\tconst onClick = (file) => {\n\t\tif (String(file).startsWith(\"http\")) {\n\t\t\twindow.open(file, '_blank');\n\t\t}\n\t}\n\n\treturn [...multiPaths, ...files].map((file, key) =>\n\t\t<Col span={8} key={key}>\n\t\t\t<Tag\n\t\t\t\tcolor=\"#108ee9\"\n\t\t\t\ticon={\n\t\t\t\t\t<Popconfirm\n\t\t\t\t\t\ttitle=\"Bạn có chắc muốn xóa File này ?\"\n\t\t\t\t\t\tonConfirm={() => onDelete(file)}\n\t\t\t\t\t\tokText=\"Yes\"\n\t\t\t\t\t\tcancelText=\"No\"\n\t\t\t\t\t>\n\t\t\t\t\t\t<DeleteOutlined />\n\t\t\t\t\t</Popconfirm>\n\t\t\t\t}\n\t\t\t>\n\t\t\t\t<span onClick={() => onClick(file)} >\n\t\t\t\t\t{file.split(\"/\").filter(Boolean).pop()}\n\t\t\t\t</span>\n\t\t\t</Tag>\n\t\t</Col>\n\t)\n}\n\nexport default FileUploadView;","/**************************************************************************/\n/* FormInfiniteCategory.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 { useGetAllCategoryQuery } from '@/hooks/useData';\nimport FormSelectInfinite from './FormSelectInfinite';\n\nconst FormInfiniteCategory = ({\n name=\"categotyId\", \n ...props\n}) => {\n return (\n <FormSelectInfinite\n useGetAllQuery={useGetAllCategoryQuery}\n name={name}\n valueProp=\"id\"\n titleProp=\"name\"\n searchKey=\"name\"\n filterField=\"id\"\n initialFilter={{ page: 1 }}\n {...props}\n />\n )\n};\n\nexport default FormInfiniteCategory;\n","/**************************************************************************/\n/* FormInfiniteOrderCode.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 { useGetOrderCodeQuery } from '@/hooks/useData';\nimport FormSelectInfinite from './FormSelectInfinite';\n\nconst FormInfiniteOrderCode = props => {\n return (\n <FormSelectInfinite\n useGetAllQuery={useGetOrderCodeQuery}\n name=\"orderCode\"\n valueProp=\"code\"\n titleProp=\"code\"\n searchKey=\"code\"\n filterField=\"code\"\n initialFilter={{ page: 1, type: 'order' }}\n {...props}\n />\n );\n};\n\nexport default FormInfiniteOrderCode;\n","/**************************************************************************/\n/* index.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 React, { useContext } from 'react';\nimport { Typography, Button, Form } from 'antd';\nimport { useTranslation } from 'react-i18next';\nimport isEmpty from 'lodash/isEmpty';\nimport get from 'lodash/get';\nimport { CloseCircleFilled, PlusOutlined } from '@ant-design/icons';\nimport { FormContextCustom } from '@/components/context/FormContextCustom';\nimport FormStyles from './styles';\n\nconst FormListAddition = ({\n children,\n name,\n showBtnInLeft = true,\n textAddNew = 'Thêm mới',\n title,\n formatInitialValue = value => value,\n defaultValueItem,\n}) => {\n\n const { t } = useTranslation();\n const { record } = useContext(FormContextCustom);\n\n const value = get(record, name);\n const initialValue = isEmpty(value) ? [{}] : formatInitialValue(value);\n\n return (\n <FormStyles className=\"form-list__list-wrapper\">\n {title && <Typography.Title level={4}>{t(title)}</Typography.Title>}\n <div className=\"form-list__list\">\n <Form.List name={name} initialValue={initialValue}>\n {(fields, { add, remove }, { errors }) => (\n <>\n {fields.map(field => (\n <div key={field.key} className=\"form-list__list-item\">\n {React.cloneElement(children, { field })}\n <CloseCircleFilled\n className=\"form-list__remove-button\"\n onClick={() => remove(field.name)}\n />\n </div>\n ))}\n <Form.Item>\n <div style={{ display: 'flex', justifyContent: showBtnInLeft ? 'flex-start' : 'flex-end' }}>\n <Button\n type=\"dashed\"\n onClick={() => add(defaultValueItem)}\n icon={<PlusOutlined />}\n >\n {textAddNew}\n </Button>\n </div>\n <Form.ErrorList errors={errors} />\n </Form.Item>\n </>\n )}\n </Form.List>\n </div>\n </FormStyles>\n );\n};\n\nexport default FormListAddition;\n","/**************************************************************************/\n/* FormSelectInfiniteCustomer.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 { useGetAllCustomersSimpleQuery } from '@/hooks/useData';\nimport FormSelectInfinite from './FormSelectInfinite';\n\nconst FormSelectInfiniteCustomer = ({\n name = \"customerId\",\n ...props\n}) => {\n return (\n <FormSelectInfinite\n useGetAllQuery={useGetAllCustomersSimpleQuery}\n name={name}\n valueProp=\"id\"\n titleProp=\"name\"\n searchKey='name'\n filterField='id'\n {...props}\n />\n );\n};\n\nexport default FormSelectInfiniteCustomer;\n","/**************************************************************************/\n/* FormSelectInfiniteProduct.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 { useGetAllProductQuery } from '@/hooks/useData';\nimport FormSelectInfinite from './FormSelectInfinite';\n\nconst FormSelectInfiniteProduct = props => {\n return (\n <FormSelectInfinite\n useGetAllQuery={useGetAllProductQuery}\n name=\"productId\"\n valueProp=\"id\"\n titleProp=\"name\"\n searchKey=\"name\"\n filterField=\"id\"\n {...props}\n />\n );\n};\n\nexport default FormSelectInfiniteProduct;\n","/**************************************************************************/\n/* FormSelectInfiniteProvider.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 { useGetAllProviderQuery } from '@/hooks/useData';\nimport FormSelectInfinite from './FormSelectInfinite';\n\nconst FormSelectInfiniteProvider = props => {\n return (\n <FormSelectInfinite\n useGetAllQuery={useGetAllProviderQuery}\n name=\"providerId\"\n valueProp=\"id\"\n titleProp=\"name\"\n searchKey=\"name\"\n filterField=\"id\"\n {...props}\n />\n );\n};\n\nexport default FormSelectInfiniteProvider;\n","/**************************************************************************/\n/* FormSelectInfiniteProvince.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 { useGetServiceQuery } from '@/hooks/useData';\nimport FormSelectInfinite from './FormSelectInfinite';\n\nconst FormSelectInfiniteService = ({ name, ...props }) => {\n return (\n <FormSelectInfinite\n useGetAllQuery={useGetServiceQuery}\n name={name || \"serviceId\"}\n valueProp=\"id\"\n titleProp=\"name\"\n searchKey=\"name\"\n filterField=\"id\"\n {...props}\n />\n );\n};\n\nexport default FormSelectInfiniteService;\n","/**************************************************************************/\n/* InfiniteFaq.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 { useGetAllFaq } from '@/hooks/useData';\nimport FormSelectInfinite from './FormSelectInfinite';\n\nconst InfiniteFaq = ({\n name=\"faqId\", \n ...props\n}) => {\n return (\n <FormSelectInfinite\n useGetAllQuery={useGetAllFaq}\n name={name}\n valueProp=\"id\"\n titleProp=\"name\"\n searchKey=\"name\"\n filterField=\"id\"\n initialFilter={{ page: 1 }}\n {...props}\n />\n )\n};\n\nexport default InfiniteFaq;\n","/**************************************************************************/\n/* index.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 React from \"react\";\nimport { Spin, Space } from 'antd';\n\nconst Loading = () => {\n return (\n <div style={{ display: 'flex', flex: 1, justifyContent: 'center', alignItems: 'center' }}>\n <Space size=\"middle\">\n <Spin size=\"small\" />\n <Spin />\n <Spin size=\"large\" />\n </Space>\n </div>\n )\n}\n\nexport default Loading;\n","/**************************************************************************/\n/* NoFooter.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 NoFooter = () => <span></span>","/**************************************************************************/\n/* RestEditModal.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 { Form } from 'antd';\nimport { FormContextCustom } from '@/components/context/FormContextCustom';\nimport { useCallback, useEffect } from 'react';\n\nconst RestEditModal = ({\n children,\n record,\n form: externalForm,\n isMergeRecordOnSubmit = true,\n formatOnSubmit = values => values,\n updateRecord = values => values,\n formatDefaultValues = values => values,\n onSubmit\n}) => {\n\n const [innerForm] = Form.useForm();\n const form = externalForm || innerForm;\n\n useEffect(() => {\n form.setFieldsValue(formatDefaultValues(record));\n /* eslint-disable-next-line */\n }, [form, record]);\n\n const onFinish = useCallback((values) => {\n const datas = isMergeRecordOnSubmit ? { ...record, ...values } : values;\n onSubmit(formatOnSubmit(datas));\n /* eslint-disable-next-line */\n }, [record, onSubmit]);\n\n return (\n <Form form={form} layout=\"vertical\" onFinish={onFinish}>\n <FormContextCustom.Provider value={{ form, record, updateRecord }}>\n {children}\n </FormContextCustom.Provider>\n </Form>\n );\n};\n\nexport default RestEditModal;\n","/**************************************************************************/\n/* index.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 { useState } from 'react';\nimport { useLocation, useNavigate } from \"react-router-dom\";\nimport { convertObjToSearchStr, getQueryParamsFromUrl } from '@/utils/tools';\nimport ListLayout from './ListLayout';\nimport RestFilter from '../RestFilter';\nimport { useUpdateEffect } from '@/hooks/MyHooks';\nimport { isEmpty } from 'lodash';\n\nconst log = (k, v) => console.log('[component.RestLayout.RestList] ' + k, v);\nconst RestList = ({\n onData = (values) => values,\n beforeSubmitFilter = (values) => values,\n filter,\n columns,\n apiPath = '',\n useGetAllQuery,\n initialFilter,\n tabKey,\n resource,\n hasCreate = true,\n tabProps = 'model',\n ...props\n}) => {\n\n let location = useLocation();\n let navigate = useNavigate();\n\n const onSetTableFilter = (filter) => {\n log('table filter', filter);\n };\n\n const [defaultQueryParams] = useState(getQueryParamsFromUrl(location.search));\n const [queryParams, setQueryParams] = useState({\n ...initialFilter,\n ...defaultQueryParams,\n apiPath,\n resource\n });\n\n useUpdateEffect(() => {\n if (!isEmpty(initialFilter)) {\n setQueryParams(pre => ({ ...pre, ...initialFilter }));\n }\n }, []);\n\n const { data, loading } = useGetAllQuery({ queryParams, onData });\n const handleChangeQueryParams = (params) => {\n const restQueryParams = {\n ...queryParams,\n ...params\n };\n setQueryParams(restQueryParams);\n const { apiPath, ...urlParams } = restQueryParams;\n navigate({ search: convertObjToSearchStr(urlParams) });\n };\n\n const onSubmitFilter = (values) => {\n handleChangeQueryParams({ resource, page: 1, ...beforeSubmitFilter(values) });\n };\n\n const onClearFilter = () => {\n const initFilter = { apiPath: queryParams.apiPath, resource, page: 1, limit: 10 };\n setQueryParams(initFilter);\n const { apiPath, ...params } = initFilter;\n navigate({ search: convertObjToSearchStr(params) });\n };\n\n return (\n <div>\n {filter &&\n <RestFilter\n onSubmitFilter={onSubmitFilter}\n onClearFilter={onClearFilter}\n defaultQueryParams={defaultQueryParams}\n >\n {filter}\n </RestFilter>\n }\n <ListLayout\n resource={resource}\n queryParams={queryParams}\n handleChangeQueryParams={handleChangeQueryParams}\n columns={columns}\n hasCreate={hasCreate}\n data={data?.embedded || []}\n totalItems={data?.page?.totalElements ?? 0}\n loading={loading}\n setTableFilter={onSetTableFilter}\n {...props}\n />\n </div>\n );\n};\n\nexport default RestList;\n","/**************************************************************************/\n/* index.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 UserWrapper from './UserWrapper';\n\nconst UserInfo = ({ path, ...props }) => {\n return <UserWrapper path={path} {...props} />\n};\n\nexport default UserInfo;\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","/**************************************************************************/\n/* useCollapseSidebar.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 { useCallback } from 'react';\nimport { useStore } from '@/DataContext';\nimport { ACTIONS } from '@/configs';\n\nfunction useCollapseSidebar() {\n const { isCollapse, dispatch } = useStore();\n const toggleCollapse = useCallback(() => {\n dispatch({ type: ACTIONS.TOOGLE_COLLAPSE, data: !isCollapse });\n }, [isCollapse, dispatch]);\n\n return {\n isCollapseSidebar: isCollapse,\n toggleCollapse,\n };\n}\n\nexport default useCollapseSidebar;\n","/**************************************************************************/\n/* useDeleteMutation.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 { useState } from \"react\";\nimport { InAppEvent } from \"@/utils/FuseUtils\";\nimport RequestUtils from \"@/utils/RequestUtils\";\n\nconst useDeleteMutation = () => {\n\n const [loading, setLoading] = useState(false);\n const deleteRecord = async ({ api, input, update }) => {\n setLoading(true);\n const { success, message, data } = await RequestUtils.Post('/'.concat(api), {}, input);\n if (!success) {\n InAppEvent.normalError(\"Lỗi xoá nội dung .!\");\n return;\n }\n setLoading(false);\n update && update(data);\n InAppEvent.normalSuccess(message);\n }\n\n return [\n deleteRecord,\n loading\n ]\n}\n\nexport default useDeleteMutation;","/**************************************************************************/\n/* useGetIdFromHash.js \t*/\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 { HASH_MODAL } from '@/configs/constant';\nimport { useLocation } from 'react-router';\n\nconst useGetIdFromHash = (resource, suffix = 'edit') => {\n const { hash } = useLocation();\n const idFromHash = hash.match(`${HASH_MODAL}/${resource}/(.*)/${suffix}`);\n return idFromHash && idFromHash[1];\n};\n\nexport default useGetIdFromHash;\n","/**************************************************************************/\n/* useGetOneQuery.js \t */\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 { useCallback, useEffect, useState } from \"react\";\nimport RequestUtils from \"@/utils/RequestUtils\";\n\nfunction useGetOneQuery({ filter, uri, onBeforeProcessData }) {\n\n const [loading, setLoading] = useState(false);\n const [data, setData] = useState({});\n\n const fetchResource = useCallback(() => {\n if (loading) {\n return Promise.reject(\"===== fetch api on loading .!\");\n }\n setLoading(true);\n if (uri) {\n RequestUtils.Get('/'.concat(uri), filter).then(({ data, success }) => success && setData(data));\n }\n setLoading(false);\n }, [filter, uri, loading]);\n\n useEffect(() => {\n fetchResource();\n /* eslint-disable-next-line */\n }, []);\n\n return {\n loading,\n record: onBeforeProcessData ? onBeforeProcessData(data) : data,\n refetch: () => fetchResource(filter)\n };\n}\n\nexport default useGetOneQuery;\n","/**************************************************************************/\n/* useGetRestApi.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 { useCallback, useContext, useEffect, useState } from \"react\";\nimport RequestUtils from \"@/utils/RequestUtils\";\nimport MyContext from '@/DataContext';\nimport { useUpdateEffect } from \"@/hooks/MyHooks\";\n\nfunction useGetRestApi({\n queryParams: filter,\n onData = (values) => values\n}) {\n\n const { f5List } = useContext(MyContext)\n const [loading, setLoading] = useState(false);\n const [data, setData] = useState({});\n const fetchResource = useCallback(async (values) => {\n if (loading) {\n return Promise.reject(\"===== fetch api on loading .!\");\n }\n const { resource, ...params } = values;\n if (!resource) {\n return Promise.reject(\"Call api without apiPath .!\");\n }\n setLoading(true);\n RequestUtils.Get(`/${resource}`, params).then(async ({ data, success }) => {\n if (success) {\n Promise.resolve(onData(data)).then(setData);\n }\n setLoading(false);\n }).catch(e => {\n console.log('[hooks.useGetApi] ', e);\n setLoading(false);\n });\n }, [onData, loading]);\n\n useEffect(() => {\n fetchResource(filter);\n /* eslint-disable-next-line */\n }, []);\n\n useUpdateEffect(() => {\n fetchResource(filter);\n }, [f5List, filter]);\n\n return {\n data,\n loading\n };\n}\n\nexport default useGetRestApi;\n","/**************************************************************************/\n/* useLogin.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 { useState } from 'react';\nimport RequestUtils from '@/utils/RequestUtils';\nimport jwtService from '@/utils/jwtService';\n\n/* const log = (key, val) => console.log('[hooks.useLogin] ' + key, val); */\nfunction useLogin() {\n\n const [loading, setLoading] = useState(false);\n const login = (payload) => {\n setLoading(true);\n RequestUtils.Post('/auth/sign-in', payload).then(({ data, success }) => {\n if (success) {\n jwtService.setSession(data);\n }\n setLoading(false);\n }).catch(e => {\n setLoading(false);\n })\n };\n\n return { login, loading };\n}\n\nexport default useLogin;\n","/**************************************************************************/\n/* useNavigateSearch.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 { useNavigate } from 'react-router';\nimport { convertObjToSearchStr } from '@/utils/tools';\n\nconst getPath = (name) => name.startsWith('/') ? name : '/'.concat(name);\n\nexport const useNavigateSearch = () => {\n const navigate = useNavigate();\n return (pathname, params) => navigate({\n pathname: getPath(pathname),\n search: `?${convertObjToSearchStr(params)}`\n });\n};\n","/**************************************************************************/\n/* useQueryParams.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 { useLocation } from \"react-router-dom\";\n\nexport function useQueryParams() {\n\n const { search } = useLocation();\n\n const get = (key) => {\n return new URLSearchParams(search).get(key);\n };\n\n const getAll = () => {\n const params = new URLSearchParams(search);\n const result = {};\n for (const [key, value] of params.entries()) {\n result[key] = value;\n }\n return result;\n };\n\n return { get, getAll };\n}\n","/**************************************************************************/\n/* useQueryParamsOnHeader.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 { useState, useCallback } from \"react\";\n\nfunction useQueryParamsOnHeader() {\n\n const [data, setData] = useState();\n const setQueryParamsOnHeader = useCallback((params) => {\n setData(pre => ({ ...pre, ...params }))\n }, []);\n\n return {\n queryParamsOnHeader: data?.queryParamsOnHeader,\n setQueryParamsOnHeader,\n };\n}\n\nexport default useQueryParamsOnHeader;\n"],"names":["BreadcrumbWrapper","styled","div","_templateObject","_taggedTemplateLiteral","_ref","theme","palette","primary","_ref2","BreadcrumbCustom","data","t","useTranslation","_jsx","children","Breadcrumb","separator","map","index","Item","path","Link","to","className","title","String","propTypes","CustomButtonStyles","background","disabled","subscriptions","colorIcon","CustomButton","_ref$title","_ref$color","color","_ref$variant","variant","_ref$inRigth","inRigth","style","props","_objectWithoutProperties","_excluded","_objectSpread","display","justifyContent","Button","DrawerWrapper","Drawer","scrollbar","thumb","input","_ref3","_ref4","_ref5","HeaderStyles","_templateObject2","_ref6","_ref7","text","primaryButtonTextColor","Header","onClose","_jsxs","CloseSquareOutlined","onClick","type","DrawerContent","id","DrawerRoute","_ref$width","width","styles","wrapper","maxWidth","destroyOnClose","closable","footer","CreateButton","handleClick","icon","PlusOutlined","ButtonIcon","buttonProps","_ref$icon","SyncOutlined","Tooltip","I18n","CustomButtonIconWrapper","getQueryParamsFromUrl","url","query","substr","result","split","forEach","part","item","decodeURIComponent","convertObjToSearchStr","params","newParams","pickBy","identity","resource","URLSearchParams","toString","onSearch","inputValue","_data$toLowerCase","toLowerCase","search","formatterInputNumber","value","concat","replace","parserInputNumber","isPositiveInteger","Number","isInteger","ListLayoutStyles","table","headerBackground","QUERY_PARAMS_PROPERTY","outsideFilter","filters","extraFilters","STATUS_LEAD","CREATE_DATA","DO_NOT_MANUFACTORY","IS_CONTACT","CONTACT_LATER","KO_LIEN_HE_DUOC","THANH_CO_HOI","NGHI_PHEP_STATUS_TEXT","name","APP_STATUS_TEXT","IMAGE_TYPES","CHANNEL_SOURCE","CHANNEL_SOURCE_MAP_KEYS","mapKeys","CHANNEL_STATUS","CHANNEL_STATUS_MAP_KEYS","KPI_TYPE","KPI_TYPE_MAP_KEYS","PRIORITY_TYPE_TAGS","PRIORITY_TYPE_TAGS_MAP_KEYS","DEPARTMENT","DEPARTMENT_MAP_KEYS_VALUE","HOTEL_ROOM_PAY_TYPE","FLIGHT_WAY_TYPE","SUCCESS_CODE","CHANGE_STORE","ACTIONS","ADD_USER","REMOVE_USER","TOOGLE_COLLAPSE","F5_LIST","SET_ROUTES","INAPP_NOTIFICATION_EMITTER","HASH_MODAL","_config","GATEWAY","getGateway","ListLayout","columns","xScroll","_ref$pagination","pagination","_ref$rowKey","rowKey","_ref$hasCreate","hasCreate","_ref$handleChangeQuer","handleChangeQueryParams","queryParams","totalItems","setTableFilter","customClickCreate","customActions","expandable","location","useLocation","navigate","useNavigate","showTotal","useCallback","total","range","paginationResult","pageSize","limit","current","page","showSizeChanger","showQuickJumper","onChangePagination","Pagination","onChange","Space","size","handleClickCreate","hash","Table","dataSource","scroll","x","onChangeTable","sorter","FormContextCustom","createContext","RestFilterStyles","content","RestFilter","greyInput","_ref$onSubmitFilter","onSubmitFilter","_ref$onClearFilter","onClearFilter","_ref$responsiveFilter","responsiveFilter","xxl","xl","lg","md","xs","_ref$responsiveAction","responsiveAction","defaultQueryParams","_Form$useForm","Form","useForm","form","_slicedToArray","onFilter","validateFields","then","useEffect","setFieldsValue","autoComplete","Provider","allowPressEnter","handleSubmit","Row","gutter","Col","onClear","resetFields","useMount","callback","useUpdateEffect","effectCallback","deps","arguments","length","undefined","isFirstMount","React","useRef","useEffectAsync","effect","inputs","isMounted","async","run","RequestUtils","encodeQueryData","ret","d","push","encodeURIComponent","join","generateUrlGetParams","enpoint","this","httpRequest","service","method","_uri","getOrPost","axios","get","post","catch","response","Get","GetAsList","_await$this$httpReque","errorCode","Post","getJsonFromUrl","_defineProperty","onSuccess","onError","file","_ref2$onProgress","onProgress","progress","_ref2$onSuccessUpload","onSuccessUploadServer","values","api","fmData","FormData","config","headers","onUploadProgress","event","percent","loaded","append","fileName","err","error","Error","message","EventEmitter","constructor","events","_getEventListByName","eventName","Set","on","fn","add","once","self","onceFn","removeListener","_len","args","Array","_key","apply","emit","_len2","_key2","bind","addEventListener","delete","FuseUtils","hasPermission","authArr","enabled","generateRoutesFromConfigs","configs","defaultAuth","allRoutes","setRoutes","routes","settings","auth","route","InAppEvent","super","rest","normalSuccess","normalInfo","normalError","modal","cate","changeStore","DataContext","actions","storeReducer","state","action","varible","useStore","context","useContext","LOGGER_TAG","useGetList","filter","onData","f5List","MyContext","_useState","useState","_useState2","loading","setLoading","_useState3","embedded","_useState4","setData","fetchResource","apiPath","Promise","resolve","console","e","arrayNotEmpty","isArray","arrayEmpty","dateFormatOnSubmit","entity","propertes","format","dayjs","k","CustomImage","src","_ref$fallbackSrc","fallbackSrc","imgSrc","setImgSrc","Image","handleError","Text","Typography","StyledNotFound","NotFoundImage","img","NotFoundSubtitle","p","_templateObject3","NotFoundDescription","_templateObject4","BackHomeButton","a","_templateObject5","UserInfoStyles","mainL1","UserWrapper","_ref$avatarProp","avatarProp","_ref$nameProp","nameProp","noteProp","customNote","element","Avatar","UserOutlined","instance","access_token","getAccessToken","isAuthTokenValid","setSession","_await$RequestUtils$P","token","success","jwtToken","user","localStorage","setItem","defaults","common","removeItem","window","getItem","init","handleAuthentication","FormInput","label","required","_ref$messageRequire","messageRequire","placeholder","_ref$rules","rules","initialValue","formItemProps","_ref$ContentComponent","ContentComponent","Input","whitespace","isShowTooltip","minLength","maxLength","_useContext","minMaxRule","useMemo","ruleLengthArr","min","max","formItem","onPressEnter","Option","Select","FormSelect","_ref$label","_ref$placeholder","resourceData","_ref$valueProp","valueProp","_ref$titleProp","titleProp","_ref$isFilterOption","isFilterOption","_ref$formatText","formatText","_ref$formatValue","formatValue","_ref$searchKey","searchKey","onEnter","enableWaypoint","onChangeGetSelectedItem","_ref$isLimitWidth","isLimitWidth","onSelectOption","option","_option$children$prop","isObject","record","onChangeSearch","optionWaypoint","height","Waypoint","optionLoading","Spin","filterOption","popupMatchSelectWidth","findItem","find","TextArea","AutoComplete","FormAutoComplete","customGetValueFromEvent","getValueFromEvent","SHOW_CHILD","Cascader","useData","_ref$onCompleted","onCompleted","refetch","eMsg","_await$RequestUtils$G","myData","fetchMore","filterField","defaultValue","val","key","log","_await$RequestUtils$G2","useGetAllCustomersSimpleQuery","useGetAllBusinessUsersQuery","useGetAllProductQuery","useGetAllProviderQuery","useGetAllProvinceQuery","useGetAllStockQuery","_ref8","useGetAllCategoryQuery","_ref9","useGetShipStatusQuery","_ref1","useGetOrderCodeQuery","_ref10","useGetServiceQuery","_ref11","useGetMaterialQuery","_ref12","useGetAllFaq","_ref13","useInfinite","_data$embedded","_data$page4","_ref$initialFilter","initialFilter","useGetAllQuery","handleSelectedDefault","setQueryParams","isSetDefaultValue","isSetSetDefaultValue","_useState5","_useState6","currentPage","setCurrentPage","_useState7","_useState8","setResourceData","_useGetAllQuery","res","_res$embedded","onLoadMore","_data$page","_data$page2","totalPages","_data$page3","mergedData","unionBy","q","trim","fetchMoreDefaultValue","_fetchMore","FormSelectInfinite","ref","_ref$filterField","customValue","defaultPropName","_useInfinite","useImperativeHandle","refetchList","debounce","showSearch","FormSelectInfinite$1","forwardRef","FormSelectInfiniteProvince","FormWard","memo","parentId","datas","wards","FormJoditEditor","_ref$initContent","initContent","editorValue","setEditorValue","joditInstance","minHeight","spellcheck","enter","handleChange","newContent","setFieldValue","insertImage","imageUrl","editor","imgHtml","selection","insertHTML","JoditEditor","FormStyles","border","default","FormAutoCompleteInfinite","showErrorDownloadFile","notification","i18next","description","duration","getFileNameFromUrl","_url$split","pop","getExtensionFile","indexOf","formatSorter","field","order","groupByName","acc","_acc$key","Map","set","toMSkuGroup","group","from","sort","b","validateRegex","phone","password","username","editBookingId","fullName","number","accountNo","customerName","email","textColor","SINGIN","_ref$apiPath","_ref$filter","_ref$grid","grid","_ref$onClickCreate","onClickCreate","_ref$renderItem","renderItem","_ref$onData","filterFormValues","setFilterFormValues","_useGetList","_useGetList$data","onFinish","allValues","formattedValues","pre","align","htmlType","resetFilter","submit","List","marginTop","sm","totalElements","handlePageChange","CONTRACT_FORM","_ref$initialRoutes","initialRoutes","_useReducer","useReducer","isCollapse","_useReducer2","dispatch","handleEventChange","_ref$files","files","multiPathFile","_ref$onRemoveFile","onRemoveFile","_ref$onRemoveMultiPat","onRemoveMultiPathFile","multiPaths","setmultiPaths","f","span","Tag","Popconfirm","onConfirm","onDelete","startsWith","okText","cancelText","DeleteOutlined","open","Boolean","FormAddress","_Fragment","noStyle","shouldUpdate","prevValues","curValues","provinceId","getFieldValue","_ref$resourcesData","resourcesData","options","multiple","maxTagCount","showCheckedStrategy","_ref$name","valuePropName","Checkbox","_ref$disabled","_ref$format","normalize","getValueProps","DatePicker","hidden","InputNumber","formatter","parser","_ref$showBtnInLeft","showBtnInLeft","_ref$textAddNew","textAddNew","_ref$formatInitialVal","formatInitialValue","defaultValueItem","isEmpty","Title","level","fields","remove","errors","cloneElement","CloseCircleFilled","ErrorList","_ref$resourceData","Radio","Group","_ref$apiAddNewItem","apiAddNewItem","_ref$isFetchOnMount","isFetchOnMount","isShowModalCreateNewItem","_ref$onCreateNewItem","onCreateNewItem","createDefaultValues","fnLoadData","localFilter","setLocalFilter","setValue","reject","_localFilter$forceUpd","forceUpdate","addItem","dataPost","msg","newData","info","handleValueInput","target","dropdownRender","menu","Divider","margin","padding","alignItems","onKeyDown","stopPropagation","marginLeft","TimePicker","HeaderCompany","justify","alt","maxHeight","apiUploadMultiPart","_ref$apiUploadUrlFile","apiUploadUrlFile","_ref$apiRemoveFile","apiRemoveFile","_ref$showImgSlide","showImgSlide","_ref$imageSize","imageSize","_ref$onBeforeSubmitMu","onBeforeSubmitMultiPart","_ref$onBeforeSubmitUr","onBeforeSubmitUrl","_ref$onClickAddImageT","onClickAddImageToContent","_ref$onToggleFeatured","onToggleFeatured","_ref$onToggleSlideSho","onToggleSlideShow","checked","images","setImages","showUrlInput","setShowUrlInput","urlInputValue","setUrlInputValue","_record$images","handleUrlSubmit","warning","newImage","isFeatured","isSlideshow","fromUpload","body","prev","uploadToServer","formData","image","originFile","fetch","Authorization","jwtService","ok","_await$response$json","json","MSG","mImage","URL","revokeObjectURL","fontFamily","borderRadius","marginBottom","Upload","showUploadList","beforeUpload","fileList","Date","now","createObjectURL","some","backgroundColor","borderColor","handleAddByUrl","borderBottom","preview","objectFit","paddingLeft","overflow","whiteSpace","textOverflow","handleToggleFeatured","marginRight","handleToggleSlide","textAlign","UploadOutlined","handleUpload","danger","handleRemove","Loading","flex","NoFooter","href","externalForm","_ref$isMergeRecordOnS","isMergeRecordOnSubmit","_ref$formatOnSubmit","formatOnSubmit","_ref$updateRecord","updateRecord","_ref$formatDefaultVal","formatDefaultValues","onSubmit","innerForm","layout","_data$page$totalEleme","_ref$beforeSubmitFilt","beforeSubmitFilter","tabKey","tabProps","restQueryParams","urlParams","_excluded2","initFilter","_excluded3","v","discountValue","discountUnit","vatPercent","_file$type","checkValidFileSize","LIST_IGNORE","skuDetails","Object","reduce","decodeProperty","obj","propertys","elm","JSON","parse","responseType","blob","restFileName","document","createElement","download","click","stringify","random","moment","formatDataI18n","displayName","language","pattern","dateTime","formatTime","minutes","isSame","date","showTime","isAfter","diff","startOf","fromNow","restFilters","splitArr","operator","last","head","slice","toLocaleString","match","fm","getConfig","validator","_","_file$split$pop","splice","getPasswordRules","gateway","assign","extension","includes","toLocaleLowerCase","splitUrl","fileType","_useStore","toggleCollapse","isCollapseSidebar","useDeleteMutation","update","suffix","idFromHash","uri","onBeforeProcessData","login","payload","useNavigateSearch","pathname","getAll","entries","setQueryParamsOnHeader","queryParamsOnHeader","useServiceId","setServiceId","serviceId","initState","_React$useState","_React$useState2","setState","prevValue","newValue","callbackRef"],"mappings":"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"}
|