aq-fe-framework 0.1.156 → 0.1.157
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/dist/{chunk-JLT4BL7I.mjs → chunk-ZO7PLULO.mjs} +4 -4
- package/dist/{css.module-4ICLUKPO.module.css → components/index.css} +16 -29
- package/dist/components/index.mjs +2 -2
- package/dist/modules-features/index.css +100 -0
- package/dist/modules-features/index.mjs +5 -5
- package/package.json +1 -1
- package/dist/api/apiFactory.ts +0 -46
- package/dist/api/baseAxios.ts +0 -22
- package/dist/app/admin/(core)/core12196/page.tsx +0 -13
- package/dist/app/admin/(core)/core16209/page.tsx +0 -13
- package/dist/app/admin/(core)/core18256/page.tsx +0 -12
- package/dist/app/admin/(core)/core26965/page.tsx +0 -13
- package/dist/app/admin/(core)/core27311/page.tsx +0 -13
- package/dist/app/admin/(core)/core38677/page.tsx +0 -13
- package/dist/app/admin/(core)/core40207/page.tsx +0 -13
- package/dist/app/admin/(core)/core60524/page.tsx +0 -11
- package/dist/app/admin/(core)/core64229/page.tsx +0 -12
- package/dist/app/admin/(core)/core71678/page.tsx +0 -11
- package/dist/app/admin/(core)/core76318/page.tsx +0 -13
- package/dist/app/admin/(core)/core83092/page.tsx +0 -13
- package/dist/app/admin/[...slug]/page.tsx +0 -7
- package/dist/app/admin/error.tsx +0 -42
- package/dist/app/admin/layout.tsx +0 -21
- package/dist/app/admin/test/page.tsx +0 -44
- package/dist/app/auth/login/page.tsx +0 -14
- package/dist/app/globals.css +0 -59
- package/dist/app/layout.tsx +0 -39
- package/dist/app/page.tsx +0 -18
- package/dist/components/Aceternity/BoxesBackground/MyBoxes.tsx +0 -66
- package/dist/components/Aceternity/BoxesBackground/MyBoxesBackground.tsx +0 -31
- package/dist/components/ActionIcons/ActionIcon/MyActionIcon.tsx +0 -47
- package/dist/components/ActionIcons/ActionIconCRUD/MyActionIconDelete.tsx +0 -81
- package/dist/components/ActionIcons/ActionIconCRUD/MyActionIconUpdate.tsx +0 -68
- package/dist/components/ActionIcons/ActionIconCheck/MyActionIconCheck.tsx +0 -50
- package/dist/components/ActionIcons/ActionIconDownloadPDF/MyActionIconDownloadPDF.tsx +0 -13
- package/dist/components/ActionIcons/ActionIconModal/MyActionIconModal.tsx +0 -113
- package/dist/components/ActionIcons/ActionIconUpload/MyActionIconUpload.tsx +0 -19
- package/dist/components/ActionIcons/ActionIconViewPdf/MyActionIconViewPDF.tsx +0 -63
- package/dist/components/ActionIcons/SwitchTheme/MySwitchTheme.tsx +0 -36
- package/dist/components/AppSpotlight/MyAppSpotlight.tsx +0 -112
- package/dist/components/Buttons/Anchor/MyAnchorViewPDF.tsx +0 -46
- package/dist/components/Buttons/Button/MyButton.tsx +0 -90
- package/dist/components/Buttons/ButtonCRUD/AQButtonCreateByImportFile.tsx +0 -81
- package/dist/components/Buttons/ButtonCRUD/AQButtonExportData.tsx +0 -75
- package/dist/components/Buttons/ButtonCRUD/MyButtonCreate.tsx +0 -68
- package/dist/components/Buttons/ButtonImport/MyButtonImport.tsx +0 -29
- package/dist/components/Buttons/ButtonImport/SelectFieldModal.tsx +0 -100
- package/dist/components/Buttons/ButtonImport/SelectFileModal.tsx +0 -81
- package/dist/components/Buttons/ButtonImport/useS_ButtonImport.ts +0 -196
- package/dist/components/Buttons/ButtonModal/AQSelectTableByOpenModal.tsx +0 -71
- package/dist/components/Buttons/ButtonModal/MyButtonModal.tsx +0 -117
- package/dist/components/Buttons/ButtonPrintPDF/MyButtonPrintPDF.tsx +0 -37
- package/dist/components/Buttons/ButtonPrintPDFTable/MyButtonPrintTablePDF.tsx +0 -174
- package/dist/components/Buttons/ButtonRouterBack/MyButtonRouterBack.tsx +0 -29
- package/dist/components/Buttons/ButtonViewPDF/MyButtonViewPDF.tsx +0 -121
- package/dist/components/Calendar/MyCalendar.tsx +0 -118
- package/dist/components/CenterFull/MyCenterFull.tsx +0 -10
- package/dist/components/Checkbox/MyCheckbox.tsx +0 -9
- package/dist/components/Combobox/Select/MySelect.tsx +0 -12
- package/dist/components/DataDisplay/Card/AQCard.tsx +0 -49
- package/dist/components/DataDisplay/CardInformation/MyCardInformation.tsx +0 -77
- package/dist/components/DataDisplay/DataTable/MyDataTable.tsx +0 -184
- package/dist/components/DataDisplay/IconText/MyIconText.tsx +0 -17
- package/dist/components/DataDisplay/KeyLabel/MyKeyLabel.tsx +0 -15
- package/dist/components/DataDisplay/NumberFormatter/MyNumberFormatter.tsx +0 -9
- package/dist/components/DataDisplay/StatCard/AQStatCard1.tsx +0 -68
- package/dist/components/FaviconSetter/FaviconSetter.tsx +0 -33
- package/dist/components/Inputs/DateInput/MyDateInput.tsx +0 -11
- package/dist/components/Inputs/Fieldset/MyFieldset.tsx +0 -32
- package/dist/components/Inputs/FileInput/MyFileInput.tsx +0 -12
- package/dist/components/Inputs/NumberInput/MyNumberInput.tsx +0 -12
- package/dist/components/Inputs/TextArea/MyTextArea.tsx +0 -11
- package/dist/components/Inputs/TextEditor/MyTextEditor.tsx +0 -191
- package/dist/components/Inputs/TextInput/MyTextInput.tsx +0 -30
- package/dist/components/Layouts/BasicAppShell/BasicAppShell.tsx +0 -357
- package/dist/components/Layouts/BasicAppShell/css.module.css +0 -62
- package/dist/components/Layouts/BasicAppShell/useS_BasicAppShell.ts +0 -64
- package/dist/components/Layouts/Container/MyContainer.tsx +0 -16
- package/dist/components/Layouts/FlexColumn/MyFlexColumn.tsx +0 -14
- package/dist/components/Layouts/FlexEnd/MyFlexEnd.tsx +0 -14
- package/dist/components/Layouts/FlexRow/MyFlexRow.tsx +0 -14
- package/dist/components/Layouts/HeaderMegaMenu/HeaderMegaMenu.tsx +0 -147
- package/dist/components/Layouts/HeaderMegaMenu/HeaderMegaMenuStore.ts +0 -19
- package/dist/components/Layouts/HeaderMegaMenu/css.module.css +0 -50
- package/dist/components/Layouts/HtmlWrapper/MyHtmlWrapper.tsx +0 -29
- package/dist/components/Layouts/PageContent/MyPageContent.tsx +0 -67
- package/dist/components/Layouts/Tab/MyTab.tsx +0 -33
- package/dist/components/Loaders/MyCardioLoader.tsx +0 -12
- package/dist/components/RESTAPIComponents/DataTableSelect/MyDataTableSelect.tsx +0 -61
- package/dist/components/RESTAPIComponents/SelectAPIGet/MySelectAPIGet.tsx +0 -37
- package/dist/components/ScheduleX/MyScheduleX.tsx +0 -58
- package/dist/components/Skeletons/SkeletonTable/MySkeletonTable.tsx +0 -9
- package/dist/components/index.ts +0 -62
- package/dist/constants/array/daysOfWeek.ts +0 -9
- package/dist/constants/enum/ENUM_EMAILCONFIG.ts +0 -6
- package/dist/constants/enum/global.ts +0 -26
- package/dist/constants/object/color.ts +0 -5
- package/dist/constants/object/documentTypes.ts +0 -8
- package/dist/css.module-P45UW6UZ.module.css +0 -4
- package/dist/data/menuData.ts +0 -31
- package/dist/hooks/custom-hooks/useC_MutationAction.tsx +0 -36
- package/dist/hooks/index.ts +0 -2
- package/dist/hooks/query/AQ/useQ_AQ_GetAQModule.ts +0 -14
- package/dist/interfaces/EmailConfig.ts +0 -10
- package/dist/interfaces/IAQModule.ts +0 -21
- package/dist/interfaces/base.ts +0 -9
- package/dist/interfaces/global-interface/IAQSSO.ts +0 -15
- package/dist/interfaces/global-interface/IAQSyncData.ts +0 -9
- package/dist/interfaces/global-interface/IAcademicYear.ts +0 -12
- package/dist/interfaces/global-interface/IChangePassWord.ts +0 -8
- package/dist/interfaces/global-interface/IComplaintProccess.ts +0 -9
- package/dist/interfaces/global-interface/ICreateAccount.ts +0 -24
- package/dist/interfaces/global-interface/IDocument.ts +0 -25
- package/dist/interfaces/global-interface/IDocumentAttribute.ts +0 -12
- package/dist/interfaces/global-interface/IEvent.ts +0 -30
- package/dist/interfaces/global-interface/IEventComplaint.ts +0 -20
- package/dist/interfaces/global-interface/IEventFillter.ts +0 -14
- package/dist/interfaces/global-interface/IFile.ts +0 -8
- package/dist/interfaces/global-interface/IImportStudentPaticipation.ts +0 -8
- package/dist/interfaces/global-interface/IPagePermission.ts +0 -12
- package/dist/interfaces/global-interface/IRolePermission.ts +0 -7
- package/dist/interfaces/global-interface/ISRMUserinfo.ts +0 -35
- package/dist/interfaces/global-interface/IScientificProfileProjectUser.ts +0 -15
- package/dist/interfaces/global-interface/IScientificProfileResearchGroup.ts +0 -15
- package/dist/interfaces/global-interface/IScientificProfileResearchGroupUser.ts +0 -14
- package/dist/interfaces/global-interface/IScientificProfileResearchProject.ts +0 -21
- package/dist/interfaces/global-interface/ISignIn.ts +0 -7
- package/dist/interfaces/global-interface/ISystemCatalogAcademicYear.ts +0 -15
- package/dist/interfaces/global-interface/ISystemCatalogDomainCategory.ts +0 -11
- package/dist/interfaces/global-interface/ISystemCatalogProjectLevelCategory.ts +0 -11
- package/dist/interfaces/global-interface/ISystemCatalogProjectTypeCategory.ts +0 -11
- package/dist/interfaces/global-interface/ISystemCatalogRoleActivity.ts +0 -11
- package/dist/interfaces/global-interface/ISystemCatalogTaskCategory.ts +0 -11
- package/dist/interfaces/global-interface/ISystemManagementAcademicHistory.ts +0 -31
- package/dist/interfaces/global-interface/ISystemManagementProfessionalWorkHistory.ts +0 -14
- package/dist/interfaces/global-interface/ISystemManagementPublishedScientificWork.ts +0 -14
- package/dist/interfaces/global-interface/ISystemManagementRoleGroup.ts +0 -12
- package/dist/interfaces/global-interface/ISystemManagementRoleGroupMenuPermission.ts +0 -18
- package/dist/interfaces/global-interface/ISystemManagementScientificResearchProject.ts +0 -16
- package/dist/interfaces/global-interface/ISystemManagementUserMenuPermission.ts +0 -18
- package/dist/interfaces/global-interface/IUpdateAccount.ts +0 -15
- package/dist/interfaces/global-interface/IUser.ts +0 -21
- package/dist/interfaces/global-interface/IUserPermission.ts +0 -7
- package/dist/lib/utils.ts +0 -6
- package/dist/modules-features/admin/core/MainDashboard/BarChart_CourseStatus.tsx +0 -87
- package/dist/modules-features/admin/core/MainDashboard/BarChart_ExamStatus.tsx +0 -65
- package/dist/modules-features/admin/core/MainDashboard/BarChart_RevenueByAcademicYear.tsx +0 -82
- package/dist/modules-features/admin/core/MainDashboard/BarChart_StudentStatusIn30Days.tsx +0 -67
- package/dist/modules-features/admin/core/MainDashboard/HBarChart_CourseDropOutPercentage.tsx +0 -77
- package/dist/modules-features/admin/core/MainDashboard/HBarChart_CourseProgressPercentage.tsx +0 -77
- package/dist/modules-features/admin/core/MainDashboard/LineChart_RevenueIn12Months.tsx +0 -78
- package/dist/modules-features/admin/core/MainDashboard/LineChart_TotalRevenueByDiscountIn3Months.tsx +0 -69
- package/dist/modules-features/admin/core/MainDashboard/LineChart_TotalRevenueByVoucherIn3Months.tsx +0 -69
- package/dist/modules-features/admin/core/MainDashboard/LineChart_TotalStudentIn12Months.tsx +0 -64
- package/dist/modules-features/admin/core/MainDashboard/ViewDiscountStat.tsx +0 -311
- package/dist/modules-features/admin/core/MainDashboard/ViewVoucherStat.tsx +0 -311
- package/dist/modules-features/admin/core/core12196/F_core12196.tsx +0 -20
- package/dist/modules-features/admin/core/core12196/F_core12196_Create.tsx +0 -101
- package/dist/modules-features/admin/core/core12196/F_core12196_Delete.tsx +0 -19
- package/dist/modules-features/admin/core/core12196/F_core12196_Read.tsx +0 -165
- package/dist/modules-features/admin/core/core12196/F_core12196_Update.tsx +0 -112
- package/dist/modules-features/admin/core/core16209/F_core16209.tsx +0 -108
- package/dist/modules-features/admin/core/core16209/F_core16209_Create.tsx +0 -112
- package/dist/modules-features/admin/core/core16209/F_core16209_Delete.tsx +0 -17
- package/dist/modules-features/admin/core/core16209/F_core16209_Update.tsx +0 -114
- package/dist/modules-features/admin/core/core18256/F_core18256.tsx +0 -29
- package/dist/modules-features/admin/core/core18256/F_core18256_Create.tsx +0 -34
- package/dist/modules-features/admin/core/core18256/F_core18256_Delete.tsx +0 -14
- package/dist/modules-features/admin/core/core18256/F_core18256_Read.tsx +0 -59
- package/dist/modules-features/admin/core/core18256/F_core18256_Select.tsx +0 -40
- package/dist/modules-features/admin/core/core18256/F_core18256_Update.tsx +0 -22
- package/dist/modules-features/admin/core/core26965/F_core26965.tsx +0 -17
- package/dist/modules-features/admin/core/core26965/F_core26965_Create.tsx +0 -106
- package/dist/modules-features/admin/core/core26965/F_core26965_Delete.tsx +0 -19
- package/dist/modules-features/admin/core/core26965/F_core26965_Read.tsx +0 -165
- package/dist/modules-features/admin/core/core26965/F_core26965_Update.tsx +0 -112
- package/dist/modules-features/admin/core/core27311/F_core27311.tsx +0 -21
- package/dist/modules-features/admin/core/core27311/F_core27311_Create.tsx +0 -109
- package/dist/modules-features/admin/core/core27311/F_core27311_Delete.tsx +0 -19
- package/dist/modules-features/admin/core/core27311/F_core27311_Read.tsx +0 -165
- package/dist/modules-features/admin/core/core27311/F_core27311_Update.tsx +0 -113
- package/dist/modules-features/admin/core/core35923/F_core35923.tsx +0 -46
- package/dist/modules-features/admin/core/core38677/F_core38677.tsx +0 -28
- package/dist/modules-features/admin/core/core38677/F_core38677_ReadUser.tsx +0 -79
- package/dist/modules-features/admin/core/core38677/F_core38677_Save.tsx +0 -52
- package/dist/modules-features/admin/core/core38677/F_core38677_ViewMenuPermissions.tsx +0 -264
- package/dist/modules-features/admin/core/core40207/F_core40207.tsx +0 -9
- package/dist/modules-features/admin/core/core40207/F_core40207_Create.tsx +0 -81
- package/dist/modules-features/admin/core/core40207/F_core40207_Delete.tsx +0 -17
- package/dist/modules-features/admin/core/core40207/F_core40207_Read.tsx +0 -98
- package/dist/modules-features/admin/core/core40207/F_core40207_Update.tsx +0 -83
- package/dist/modules-features/admin/core/core47643/F_core47643.tsx +0 -10
- package/dist/modules-features/admin/core/core47643/F_core47643_Delete.tsx +0 -13
- package/dist/modules-features/admin/core/core47643/F_core47643_Form.tsx +0 -34
- package/dist/modules-features/admin/core/core47643/F_core47643_Read.tsx +0 -57
- package/dist/modules-features/admin/core/core60524/F_core60524.tsx +0 -13
- package/dist/modules-features/admin/core/core60524/F_core60524_Form.tsx +0 -111
- package/dist/modules-features/admin/core/core60524/F_core60524_Save.tsx +0 -56
- package/dist/modules-features/admin/core/core60524/useS_core60524.ts +0 -16
- package/dist/modules-features/admin/core/core64229/F_core64229.tsx +0 -7
- package/dist/modules-features/admin/core/core64229/F_core64229_Delete.tsx +0 -21
- package/dist/modules-features/admin/core/core64229/F_core64229_Form.tsx +0 -95
- package/dist/modules-features/admin/core/core64229/F_core64229_Read.tsx +0 -67
- package/dist/modules-features/admin/core/core71678/F_core71678.tsx +0 -8
- package/dist/modules-features/admin/core/core71678/F_core71678_ChangePermission.tsx +0 -117
- package/dist/modules-features/admin/core/core71678/F_core71678_Create.tsx +0 -61
- package/dist/modules-features/admin/core/core71678/F_core71678_Delete.tsx +0 -16
- package/dist/modules-features/admin/core/core71678/F_core71678_Read.tsx +0 -92
- package/dist/modules-features/admin/core/core71678/F_core71678_Update.tsx +0 -49
- package/dist/modules-features/admin/core/core76318/F_core76318.tsx +0 -9
- package/dist/modules-features/admin/core/core76318/F_core76318_Create.tsx +0 -89
- package/dist/modules-features/admin/core/core76318/F_core76318_Delete.tsx +0 -17
- package/dist/modules-features/admin/core/core76318/F_core76318_Read.tsx +0 -104
- package/dist/modules-features/admin/core/core76318/F_core76318_Update.tsx +0 -89
- package/dist/modules-features/admin/core/core83092/F_core83092.tsx +0 -27
- package/dist/modules-features/admin/core/core83092/F_core83092_ReadUser.tsx +0 -85
- package/dist/modules-features/admin/core/core83092/F_core83092_Save.tsx +0 -52
- package/dist/modules-features/admin/core/core83092/F_core83092_ViewMenuPermissions.tsx +0 -263
- package/dist/modules-features/admin/core/core83092/useS_core83092.tsx +0 -70
- package/dist/modules-features/authenticate/F_authenticate_Login/F_authenticate_Login.tsx +0 -154
- package/dist/modules-features/authenticate/F_authenticate_Login/css.module.css +0 -4
- package/dist/modules-features/authenticate/F_authenticate_Logout.tsx +0 -22
- package/dist/modules-features/authenticate/F_authenticate_SplashPage.tsx +0 -21
- package/dist/modules-features/authenticate/useS_authenticate.ts +0 -23
- package/dist/modules-features/index.ts +0 -79
- package/dist/providers/MyMantineProvider.tsx +0 -140
- package/dist/providers/MyReactQueryProvider.tsx +0 -24
- package/dist/providers/Provider.tsx +0 -13
- package/dist/providers/mantine.module.css +0 -21
- package/dist/stores/CreateGenericStore.ts +0 -23
- package/dist/stores/index.ts +0 -1
- package/dist/types/types.ts +0 -16
- package/dist/utils/index.ts +0 -9
- package/dist/utils/utils_converter.ts +0 -39
- package/dist/utils/utils_currency.ts +0 -5
- package/dist/utils/utils_date.ts +0 -34
- package/dist/utils/utils_excel.ts +0 -128
- package/dist/utils/utils_file.ts +0 -61
- package/dist/utils/utils_notification.ts +0 -46
- package/dist/utils/utils_pdf.ts +0 -21
- package/dist/utils/utils_time.ts +0 -15
- package/dist/utils/utils_validateForm.ts +0 -9
@@ -1,100 +0,0 @@
|
|
1
|
-
import { MySelect } from "@/components/Combobox/Select/MySelect";
|
2
|
-
import { MyFlexEnd } from "@/components/Layouts/FlexEnd/MyFlexEnd";
|
3
|
-
import { Button, Divider, Fieldset, Group, Modal, SimpleGrid, Space, Table, useModalsStack } from "@mantine/core";
|
4
|
-
import { IconArrowBackUp, IconArrowBigLeft, IconArrowBigRight, IconSquareRoundedX } from "@tabler/icons-react";
|
5
|
-
import { useS_ButtonImport } from "./useS_ButtonImport";
|
6
|
-
|
7
|
-
interface SelectFieldModalProps {
|
8
|
-
stack: ReturnType<typeof useModalsStack<"select-file-page" | "select-field-page" | "implement-page">>
|
9
|
-
onImport: () => void
|
10
|
-
}
|
11
|
-
export function SelectFieldModal({ stack, onImport }: SelectFieldModalProps) {
|
12
|
-
const store = useS_ButtonImport()
|
13
|
-
|
14
|
-
return (
|
15
|
-
<Modal fullScreen {...stack.register('select-field-page')} title="Import">
|
16
|
-
<SimpleGrid cols={{ base: 1, lg: 2 }}>
|
17
|
-
<Fieldset legend="Danh sách trường thông tin">
|
18
|
-
<Table stickyHeader stickyHeaderOffset={60}>
|
19
|
-
<Table.Thead bg={'cyan'}>
|
20
|
-
<Table.Tr>
|
21
|
-
<Table.Th>Mã field</Table.Th>
|
22
|
-
<Table.Th>Tên field</Table.Th>
|
23
|
-
</Table.Tr>
|
24
|
-
</Table.Thead>
|
25
|
-
<Table.Tbody>
|
26
|
-
{store.state.fieldConfig?.filter(item => item.isSelected == false || item.isSelected == undefined).map((item, idx) => (
|
27
|
-
<Table.Tr
|
28
|
-
key={idx}
|
29
|
-
style={{ cursor: "pointer" }}
|
30
|
-
>
|
31
|
-
<Table.Td onClick={() => store.changeSelected(item.fieldKey.toString(), true)}>{item.fieldKey.toString()}</Table.Td>
|
32
|
-
<Table.Td onClick={() => store.changeSelected(item.fieldKey.toString(), true)}>{item.fieldName}</Table.Td>
|
33
|
-
</Table.Tr>
|
34
|
-
))}
|
35
|
-
|
36
|
-
</Table.Tbody>
|
37
|
-
</Table>
|
38
|
-
<Space />
|
39
|
-
|
40
|
-
<Group>
|
41
|
-
<Button
|
42
|
-
onClick={() => { store.changeAllSelected(true) }}
|
43
|
-
leftSection={<IconArrowBigRight />}
|
44
|
-
>Chuyển tất cả</Button>
|
45
|
-
</Group>
|
46
|
-
</Fieldset>
|
47
|
-
|
48
|
-
<Fieldset legend="Danh sách trường thông tin được chọn">
|
49
|
-
<Table stickyHeader stickyHeaderOffset={60}>
|
50
|
-
<Table.Thead>
|
51
|
-
<Table.Tr>
|
52
|
-
<Table.Th>Mã field</Table.Th>
|
53
|
-
<Table.Th>Tên field</Table.Th>
|
54
|
-
<Table.Th>Cột map</Table.Th>
|
55
|
-
</Table.Tr>
|
56
|
-
</Table.Thead>
|
57
|
-
<Table.Tbody>
|
58
|
-
{store.state.fieldConfig?.filter(item => item.isSelected == true).map((item, idx) => (
|
59
|
-
<Table.Tr
|
60
|
-
key={idx}
|
61
|
-
style={{ cursor: "pointer" }}
|
62
|
-
>
|
63
|
-
<Table.Td onClick={() => store.changeSelected(item.fieldKey.toString(), false)}>{item.fieldKey.toString()}</Table.Td>
|
64
|
-
<Table.Td onClick={() => store.changeSelected(item.fieldKey.toString(), false)}>{item.fieldName}</Table.Td>
|
65
|
-
<Table.Td><MySelect data={store.state.title!} value={item.fieldToMap} onChange={(e) => store.setFieldToMap(item.fieldKey.toString(), e!)} /></Table.Td>
|
66
|
-
</Table.Tr>
|
67
|
-
))}
|
68
|
-
</Table.Tbody>
|
69
|
-
</Table>
|
70
|
-
<Space />
|
71
|
-
<Button
|
72
|
-
onClick={() => { store.changeAllSelected(false) }}
|
73
|
-
leftSection={<IconArrowBigLeft />}
|
74
|
-
>Chuyển tất cả về</Button>
|
75
|
-
</Fieldset>
|
76
|
-
</SimpleGrid>
|
77
|
-
<Divider></Divider>
|
78
|
-
<MyFlexEnd>
|
79
|
-
<Button
|
80
|
-
leftSection={<IconArrowBackUp />}
|
81
|
-
onClick={() => stack.close("select-field-page")}
|
82
|
-
color="gray.7">
|
83
|
-
Quay lại
|
84
|
-
</Button>
|
85
|
-
<Button
|
86
|
-
color="blue.8"
|
87
|
-
leftSection={<IconArrowBigRight />}
|
88
|
-
onClick={onImport}>
|
89
|
-
Tiếp tục / Import
|
90
|
-
</Button>
|
91
|
-
<Button
|
92
|
-
leftSection={<IconSquareRoundedX />}
|
93
|
-
onClick={() => stack.closeAll()}
|
94
|
-
color="red.6">
|
95
|
-
Đóng
|
96
|
-
</Button>
|
97
|
-
</MyFlexEnd>
|
98
|
-
</Modal >
|
99
|
-
)
|
100
|
-
}
|
@@ -1,81 +0,0 @@
|
|
1
|
-
import { MyDataTable } from "@/components/DataDisplay/DataTable/MyDataTable";
|
2
|
-
import { MyFlexEnd } from "@/components/Layouts/FlexEnd/MyFlexEnd";
|
3
|
-
import { Button, Fieldset, FileInput, Modal, NumberInput, Select, SimpleGrid, useModalsStack } from "@mantine/core";
|
4
|
-
import { IconArrowBigRight, IconSquareRoundedX } from "@tabler/icons-react";
|
5
|
-
import { useS_ButtonImport } from "./useS_ButtonImport";
|
6
|
-
|
7
|
-
export interface SelectFileModalProps {
|
8
|
-
onExportStructure?: () => void
|
9
|
-
stack: ReturnType<typeof useModalsStack<"select-file-page" | "select-field-page" | "implement-page">>
|
10
|
-
}
|
11
|
-
|
12
|
-
export function SelectFileModal({ onExportStructure, stack }: SelectFileModalProps) {
|
13
|
-
const store = useS_ButtonImport()
|
14
|
-
return (
|
15
|
-
<Modal
|
16
|
-
title="Import"
|
17
|
-
fullScreen
|
18
|
-
{...stack.register('select-file-page')}
|
19
|
-
>
|
20
|
-
<FileInput
|
21
|
-
value={store.state.file}
|
22
|
-
onChange={e => store.setProperty("file", e)}
|
23
|
-
label="File dữ liệu"
|
24
|
-
placeholder="Chọn file dữ liệu"
|
25
|
-
clearable
|
26
|
-
/>
|
27
|
-
<SimpleGrid cols={{ base: 1, md: 2, lg: 2, xl: 4 }}>
|
28
|
-
<NumberInput
|
29
|
-
label="Dòng tiêu đề bắt đầu từ"
|
30
|
-
value={(store.state.startTitleIndex)}
|
31
|
-
onChange={e => store.setProperty("startTitleIndex", e)}
|
32
|
-
/>
|
33
|
-
<NumberInput
|
34
|
-
label="Dòng dữ liệu bắt đầu từ"
|
35
|
-
value={(store.state.startDataIndex)}
|
36
|
-
onChange={e => store.setProperty("startDataIndex", e)}
|
37
|
-
/>
|
38
|
-
<Select
|
39
|
-
readOnly
|
40
|
-
label="Định dạng số"
|
41
|
-
data={["100.000"]}
|
42
|
-
defaultValue={"100.000"}
|
43
|
-
/>
|
44
|
-
<Select
|
45
|
-
readOnly
|
46
|
-
label="Định dạng ngày"
|
47
|
-
data={["dd/MM/yyyy"]}
|
48
|
-
defaultValue={"dd/MM/yyyy"}
|
49
|
-
/>
|
50
|
-
</SimpleGrid>
|
51
|
-
<Fieldset legend="Danh sách trường thông tin trong file dữ liệu">
|
52
|
-
{store.state.data &&
|
53
|
-
<MyDataTable
|
54
|
-
columns={store.columns}
|
55
|
-
data={store.state.data as any}
|
56
|
-
/>
|
57
|
-
}
|
58
|
-
</Fieldset>
|
59
|
-
<MyFlexEnd>
|
60
|
-
<Button
|
61
|
-
color="teal.8"
|
62
|
-
onClick={onExportStructure}>
|
63
|
-
Xuất file cấu trúc
|
64
|
-
</Button>
|
65
|
-
<Button
|
66
|
-
disabled={store.state.data?.length == 0}
|
67
|
-
color="blue.8"
|
68
|
-
leftSection={<IconArrowBigRight />}
|
69
|
-
onClick={() => stack.open('select-field-page')}>
|
70
|
-
Tiếp tục
|
71
|
-
</Button>
|
72
|
-
<Button
|
73
|
-
color="red.6"
|
74
|
-
leftSection={<IconSquareRoundedX />}
|
75
|
-
onClick={stack.closeAll}>
|
76
|
-
Đóng
|
77
|
-
</Button>
|
78
|
-
</MyFlexEnd>
|
79
|
-
</Modal>
|
80
|
-
)
|
81
|
-
}
|
@@ -1,196 +0,0 @@
|
|
1
|
-
import { createGenericStore } from "@/stores/CreateGenericStore";
|
2
|
-
import { IUtils_Excel_ColumnConfig } from "@/utils/utils_excel";
|
3
|
-
import { MRT_ColumnDef } from "mantine-react-table";
|
4
|
-
import { useEffect, useMemo } from "react";
|
5
|
-
import * as XLSX from 'xlsx';
|
6
|
-
|
7
|
-
interface IFieldConfig extends IUtils_Excel_ColumnConfig<any> {
|
8
|
-
isSelected?: boolean
|
9
|
-
fieldToMap?: string
|
10
|
-
}
|
11
|
-
|
12
|
-
interface I {
|
13
|
-
file?: File | null
|
14
|
-
title?: string[]
|
15
|
-
data?: any[]
|
16
|
-
startTitleIndex?: string | number
|
17
|
-
startDataIndex?: string | number
|
18
|
-
fieldConfig?: IFieldConfig[]
|
19
|
-
}
|
20
|
-
const useStore = createGenericStore<I>({
|
21
|
-
initialState: {
|
22
|
-
data: [],
|
23
|
-
title: [],
|
24
|
-
startTitleIndex: 2,
|
25
|
-
startDataIndex: 3,
|
26
|
-
},
|
27
|
-
})
|
28
|
-
|
29
|
-
export function useS_ButtonImport() {
|
30
|
-
const store = useStore()
|
31
|
-
|
32
|
-
function autoMap() {
|
33
|
-
if (!store.state.data || !store.state.data.length || !store.state.fieldConfig) return;
|
34
|
-
|
35
|
-
const sampleRow = store.state.data[0];
|
36
|
-
|
37
|
-
const updatedFieldConfig = store.state.fieldConfig.map((config) => {
|
38
|
-
const matchingKey = Object.keys(sampleRow).find((key) =>
|
39
|
-
key.toLowerCase().trim() === config.fieldKey.toString().toLowerCase().trim()
|
40
|
-
);
|
41
|
-
|
42
|
-
if (matchingKey) {
|
43
|
-
return {
|
44
|
-
...config,
|
45
|
-
fieldToMap: matchingKey,
|
46
|
-
isSelected: true,
|
47
|
-
};
|
48
|
-
}
|
49
|
-
|
50
|
-
return config;
|
51
|
-
});
|
52
|
-
|
53
|
-
store.setProperty("fieldConfig", updatedFieldConfig);
|
54
|
-
}
|
55
|
-
|
56
|
-
function getDataFinal<T>(): T[] {
|
57
|
-
const finalData: T[] = [];
|
58
|
-
|
59
|
-
store.state.data!.forEach((row) => {
|
60
|
-
const rowData: Record<string, any> = {};
|
61
|
-
|
62
|
-
store.state.fieldConfig!.forEach((colConfig) => {
|
63
|
-
if (colConfig.isSelected) {
|
64
|
-
const key = colConfig.fieldKey;
|
65
|
-
const sourceKey = colConfig.fieldToMap || key;
|
66
|
-
|
67
|
-
rowData[key as string] = row[sourceKey as string];
|
68
|
-
}
|
69
|
-
});
|
70
|
-
|
71
|
-
finalData.push(rowData as T);
|
72
|
-
});
|
73
|
-
|
74
|
-
return finalData;
|
75
|
-
}
|
76
|
-
|
77
|
-
function changeAllSelected(isSelected: boolean) {
|
78
|
-
store.setProperty("fieldConfig", store.state.fieldConfig?.map(item => ({
|
79
|
-
...item,
|
80
|
-
isSelected
|
81
|
-
})))
|
82
|
-
}
|
83
|
-
|
84
|
-
function changeSelected(fieldKey: string, isSelected: boolean) {
|
85
|
-
if (!store.state.fieldConfig) {
|
86
|
-
store.setProperty("fieldConfig", []);
|
87
|
-
}
|
88
|
-
|
89
|
-
const existingFieldConfigIndex = store.state.fieldConfig!.findIndex(
|
90
|
-
config => config.fieldKey === fieldKey
|
91
|
-
);
|
92
|
-
|
93
|
-
if (existingFieldConfigIndex !== -1) {
|
94
|
-
// Update existing field config
|
95
|
-
const updatedFieldConfig = [...store.state.fieldConfig!];
|
96
|
-
updatedFieldConfig[existingFieldConfigIndex] = {
|
97
|
-
...updatedFieldConfig[existingFieldConfigIndex],
|
98
|
-
isSelected
|
99
|
-
};
|
100
|
-
store.setProperty("fieldConfig", updatedFieldConfig);
|
101
|
-
} else {
|
102
|
-
// Field config doesn't exist yet, find the field name from titles
|
103
|
-
const fieldName = store.state.title?.find(title => title === fieldKey) || fieldKey;
|
104
|
-
|
105
|
-
// Create new field config
|
106
|
-
const updatedFieldConfig = [
|
107
|
-
...store.state.fieldConfig!,
|
108
|
-
{
|
109
|
-
fieldKey: fieldKey as any,
|
110
|
-
fieldName,
|
111
|
-
isSelected
|
112
|
-
}
|
113
|
-
];
|
114
|
-
store.setProperty("fieldConfig", updatedFieldConfig);
|
115
|
-
}
|
116
|
-
}
|
117
|
-
function setFieldToMap(fieldKey: string, fieldToMap: string) {
|
118
|
-
if (!store.state.fieldConfig) {
|
119
|
-
store.setProperty("fieldConfig", []);
|
120
|
-
}
|
121
|
-
|
122
|
-
const existingFieldConfigIndex = store.state.fieldConfig!.findIndex(
|
123
|
-
config => config.fieldKey === fieldKey
|
124
|
-
);
|
125
|
-
|
126
|
-
if (existingFieldConfigIndex !== -1) {
|
127
|
-
// Update existing field config
|
128
|
-
const updatedFieldConfig = [...store.state.fieldConfig!];
|
129
|
-
updatedFieldConfig[existingFieldConfigIndex] = {
|
130
|
-
...updatedFieldConfig[existingFieldConfigIndex],
|
131
|
-
fieldToMap
|
132
|
-
};
|
133
|
-
store.setProperty("fieldConfig", updatedFieldConfig);
|
134
|
-
} else {
|
135
|
-
// Field config doesn't exist yet, find the field name from titles
|
136
|
-
const fieldName = store.state.title?.find(title => title === fieldKey) || fieldKey;
|
137
|
-
|
138
|
-
// Create new field config
|
139
|
-
const updatedFieldConfig = [
|
140
|
-
...store.state.fieldConfig!,
|
141
|
-
{
|
142
|
-
fieldKey: fieldKey as any,
|
143
|
-
fieldName,
|
144
|
-
fieldToMap
|
145
|
-
}
|
146
|
-
];
|
147
|
-
store.setProperty("fieldConfig", updatedFieldConfig);
|
148
|
-
}
|
149
|
-
}
|
150
|
-
|
151
|
-
const columns = useMemo<MRT_ColumnDef<any>[]>(() => [
|
152
|
-
...(store.state.title?.map(item => ({
|
153
|
-
header: item!,
|
154
|
-
accessorKey: item!
|
155
|
-
}) as MRT_ColumnDef<any>) || [])
|
156
|
-
], [store.state.title])
|
157
|
-
useEffect(() => {
|
158
|
-
if (store.state.file == null) {
|
159
|
-
store.resetState()
|
160
|
-
}
|
161
|
-
// Handle file change
|
162
|
-
if (!store.state.file) return
|
163
|
-
|
164
|
-
const reader = new FileReader();
|
165
|
-
reader.onload = (event) => {
|
166
|
-
const binaryStr = event.target?.result;
|
167
|
-
if (!binaryStr) return
|
168
|
-
|
169
|
-
const workbook = XLSX.read(binaryStr, { type: 'binary' });
|
170
|
-
const sheetName = workbook.SheetNames[0]; // Lấy tên sheet đầu tiên
|
171
|
-
const sheet = workbook.Sheets[sheetName]; // Lấy sheet đầu tiên
|
172
|
-
|
173
|
-
const dataBook = XLSX.utils.sheet_to_json(sheet, { header: 1 }) as any[][]
|
174
|
-
const data = XLSX.utils.sheet_to_json(sheet, { range: 1 }) as any// Đọc dữ liệu dạng mảng 2D\
|
175
|
-
|
176
|
-
if (data.lenght == 0) return
|
177
|
-
store.setProperty("title", dataBook[1])
|
178
|
-
store.setProperty("data", data)
|
179
|
-
};
|
180
|
-
reader.readAsArrayBuffer(store.state.file!);
|
181
|
-
}, [store.state.file])
|
182
|
-
|
183
|
-
useEffect(() => {
|
184
|
-
if (store.state.data?.length == 0) return
|
185
|
-
autoMap()
|
186
|
-
}, [store.state.data])
|
187
|
-
return {
|
188
|
-
...store,
|
189
|
-
columns,
|
190
|
-
changeSelected,
|
191
|
-
setFieldToMap,
|
192
|
-
getDataFinal,
|
193
|
-
changeAllSelected,
|
194
|
-
autoMap
|
195
|
-
}
|
196
|
-
}
|
@@ -1,71 +0,0 @@
|
|
1
|
-
import { MyDataTable } from "@/components/DataDisplay/DataTable/MyDataTable";
|
2
|
-
import { MyFlexColumn } from "@/components/Layouts/FlexColumn/MyFlexColumn";
|
3
|
-
import { TYPES_MANTINE_SIZE } from "@/types/types";
|
4
|
-
import { Button, ButtonProps, Fieldset, Modal } from "@mantine/core";
|
5
|
-
import { useDisclosure } from "@mantine/hooks";
|
6
|
-
import { MRT_ColumnDef, MRT_RowData, MRT_TableOptions } from "mantine-react-table";
|
7
|
-
|
8
|
-
interface IAQSelectTableByOpenModal<TData extends MRT_RowData> extends Omit<MRT_TableOptions<TData>, "data">, Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, "color" | "style">, ButtonProps {
|
9
|
-
label?: string;
|
10
|
-
listLabel?: string;
|
11
|
-
title?: string;
|
12
|
-
modalSize?: TYPES_MANTINE_SIZE;
|
13
|
-
objectName?: string
|
14
|
-
fullScreen?: boolean;
|
15
|
-
setSelectedData: (data: any) => void;
|
16
|
-
data?: any;
|
17
|
-
columns: MRT_ColumnDef<TData>[];
|
18
|
-
API?: string;
|
19
|
-
closeAfterSelect?: boolean;
|
20
|
-
}
|
21
|
-
|
22
|
-
export function AQSelectTableByOpenModal<TData extends MRT_RowData>({
|
23
|
-
setSelectedData,
|
24
|
-
data,
|
25
|
-
columns,
|
26
|
-
API,
|
27
|
-
modalSize,
|
28
|
-
title,
|
29
|
-
label,
|
30
|
-
listLabel,
|
31
|
-
objectName,
|
32
|
-
fullScreen = false,
|
33
|
-
closeAfterSelect = true,
|
34
|
-
...rest
|
35
|
-
}: IAQSelectTableByOpenModal<TData>) {
|
36
|
-
const disclosure = useDisclosure(false)
|
37
|
-
return (
|
38
|
-
<>
|
39
|
-
<Button
|
40
|
-
onClick={disclosure[1].open}
|
41
|
-
{...rest}
|
42
|
-
>
|
43
|
-
{label ? label : `Chọn từ danh sách`}
|
44
|
-
</Button>
|
45
|
-
<Modal
|
46
|
-
fullScreen={fullScreen}
|
47
|
-
size={modalSize}
|
48
|
-
title={title}
|
49
|
-
opened={disclosure?.[0]}
|
50
|
-
onClose={disclosure[1].close}
|
51
|
-
>
|
52
|
-
<MyFlexColumn>
|
53
|
-
<Fieldset legend={listLabel ? listLabel : "Danh sách"}>
|
54
|
-
<MyDataTable
|
55
|
-
renderTopToolbarCustomActions={({ table }) => {
|
56
|
-
return <Button onClick={() => {
|
57
|
-
setSelectedData(table.getSelectedRowModel().rows.map((row) => row.original))
|
58
|
-
closeAfterSelect && disclosure[1].close()
|
59
|
-
}}>Chọn</Button>
|
60
|
-
}}
|
61
|
-
enableRowSelection
|
62
|
-
data={data!}
|
63
|
-
columns={columns}
|
64
|
-
{...rest}
|
65
|
-
/>
|
66
|
-
</Fieldset>
|
67
|
-
</MyFlexColumn>
|
68
|
-
</Modal>
|
69
|
-
</>
|
70
|
-
)
|
71
|
-
}
|
@@ -1,117 +0,0 @@
|
|
1
|
-
import { MyFlexColumn } from "@/components/Layouts/FlexColumn/MyFlexColumn";
|
2
|
-
import { TYPES_CRUD, TYPES_MANTINE_SIZE } from "@/types/types";
|
3
|
-
|
4
|
-
import { Button, ButtonProps, Modal } from "@mantine/core";
|
5
|
-
import { useDisclosure } from "@mantine/hooks";
|
6
|
-
import { IconEdit, IconPlus, IconTrash } from "@tabler/icons-react";
|
7
|
-
import { ReactNode } from "react";
|
8
|
-
|
9
|
-
interface IMyButtonModal extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, "color" | "style">, ButtonProps {
|
10
|
-
label?: string;
|
11
|
-
title?: string;
|
12
|
-
children?: ReactNode;
|
13
|
-
crudType?: TYPES_CRUD;
|
14
|
-
modalSize?: TYPES_MANTINE_SIZE;
|
15
|
-
objectName?: string
|
16
|
-
disclosure: ReturnType<typeof useDisclosure>;
|
17
|
-
fullScreen?: boolean;
|
18
|
-
}
|
19
|
-
|
20
|
-
export function MyButtonModal({
|
21
|
-
fullScreen = false,
|
22
|
-
crudType = "default",
|
23
|
-
disclosure,
|
24
|
-
modalSize,
|
25
|
-
title,
|
26
|
-
label,
|
27
|
-
children,
|
28
|
-
objectName = "",
|
29
|
-
...rest
|
30
|
-
}: IMyButtonModal) {
|
31
|
-
const objectNameLower = objectName?.toLowerCase()
|
32
|
-
if (crudType == "default") {
|
33
|
-
return (
|
34
|
-
<>
|
35
|
-
<Button onClick={disclosure?.[1].open} color="indigo" {...rest}>
|
36
|
-
{label}
|
37
|
-
</Button>
|
38
|
-
<Modal
|
39
|
-
fullScreen={fullScreen}
|
40
|
-
size={modalSize}
|
41
|
-
title={title}
|
42
|
-
opened={disclosure?.[0]}
|
43
|
-
onClose={disclosure[1].close}>
|
44
|
-
<MyFlexColumn>{children}</MyFlexColumn>
|
45
|
-
</Modal>
|
46
|
-
</>
|
47
|
-
);
|
48
|
-
}
|
49
|
-
if (crudType == "create") {
|
50
|
-
return (
|
51
|
-
<>
|
52
|
-
<Button onClick={disclosure?.[1].open} leftSection={<IconPlus />} {...rest}>
|
53
|
-
{label ? label : `Thêm`}
|
54
|
-
</Button>
|
55
|
-
<Modal
|
56
|
-
fullScreen={fullScreen}
|
57
|
-
size={modalSize}
|
58
|
-
title={title ? title : `Tạo ${objectNameLower} mới`}
|
59
|
-
opened={disclosure?.[0]}
|
60
|
-
onClose={disclosure[1].close}>
|
61
|
-
<MyFlexColumn>{children}</MyFlexColumn>
|
62
|
-
</Modal>
|
63
|
-
</>
|
64
|
-
);
|
65
|
-
}
|
66
|
-
if (crudType == "createMultiple") {
|
67
|
-
return (
|
68
|
-
<>
|
69
|
-
<Button onClick={disclosure?.[1].open} color="green" leftSection={<IconPlus />} {...rest}>
|
70
|
-
{label ? label : `Import ${objectNameLower}`}
|
71
|
-
</Button>
|
72
|
-
<Modal
|
73
|
-
fullScreen={fullScreen}
|
74
|
-
size={modalSize}
|
75
|
-
title={title ? title : `Thêm danh sách ${objectNameLower}`}
|
76
|
-
opened={disclosure?.[0]}
|
77
|
-
onClose={disclosure[1].close}>
|
78
|
-
<MyFlexColumn>{children}</MyFlexColumn>
|
79
|
-
</Modal>
|
80
|
-
</>
|
81
|
-
);
|
82
|
-
}
|
83
|
-
if (crudType == "update") {
|
84
|
-
return (
|
85
|
-
<>
|
86
|
-
<Button onClick={disclosure?.[1].open} color="yellow" leftSection={<IconEdit />} {...rest}>
|
87
|
-
{label ? label : `Chỉnh sửa ${objectNameLower}`}
|
88
|
-
</Button>
|
89
|
-
<Modal
|
90
|
-
fullScreen={fullScreen}
|
91
|
-
size={modalSize}
|
92
|
-
title={title ? title : `Chỉnh sửa ${objectNameLower}`}
|
93
|
-
opened={disclosure?.[0]}
|
94
|
-
onClose={disclosure[1].close}>
|
95
|
-
<MyFlexColumn>{children}</MyFlexColumn>
|
96
|
-
</Modal>
|
97
|
-
</>
|
98
|
-
);
|
99
|
-
}
|
100
|
-
if (crudType == "delete") {
|
101
|
-
return (
|
102
|
-
<>
|
103
|
-
<Button onClick={disclosure?.[1].open} color="red" leftSection={<IconTrash />} {...rest}>
|
104
|
-
{label ? label : `Xóa ${objectNameLower}`}
|
105
|
-
</Button>
|
106
|
-
<Modal
|
107
|
-
fullScreen={fullScreen}
|
108
|
-
size={modalSize}
|
109
|
-
title={title ? title : `Xóa ${objectNameLower}`}
|
110
|
-
opened={disclosure?.[0]}
|
111
|
-
onClose={disclosure[1].close}>
|
112
|
-
<MyFlexColumn>{children}</MyFlexColumn>
|
113
|
-
</Modal>
|
114
|
-
</>
|
115
|
-
);
|
116
|
-
}
|
117
|
-
}
|
@@ -1,37 +0,0 @@
|
|
1
|
-
"use client";
|
2
|
-
import { ReactNode, useRef } from "react";
|
3
|
-
import { Button, ButtonProps } from "@mantine/core";
|
4
|
-
import { IconPrinter } from "@tabler/icons-react";
|
5
|
-
import { useReactToPrint } from "react-to-print";
|
6
|
-
|
7
|
-
interface I extends ButtonProps {
|
8
|
-
contentToPrint?: ReactNode; // nội dung HTML để in
|
9
|
-
children?: ReactNode;
|
10
|
-
}
|
11
|
-
|
12
|
-
export function MyButtonPrintPDF({ contentToPrint, children, ...rest }: I) {
|
13
|
-
const printRef = useRef<HTMLDivElement>(null);
|
14
|
-
|
15
|
-
const handlePrint = useReactToPrint({
|
16
|
-
// Sử dụng documentTitle thay vì content
|
17
|
-
documentTitle: "In nội dung",
|
18
|
-
// Sử dụng contentRef thay vì content
|
19
|
-
contentRef: printRef,
|
20
|
-
});
|
21
|
-
|
22
|
-
function handleClick() {
|
23
|
-
if (!contentToPrint) return;
|
24
|
-
handlePrint();
|
25
|
-
}
|
26
|
-
|
27
|
-
return (
|
28
|
-
<>
|
29
|
-
<div style={{ display: "none" }}>
|
30
|
-
<div ref={printRef}>{contentToPrint}</div>
|
31
|
-
</div>
|
32
|
-
<Button color="orange" onClick={handleClick} leftSection={<IconPrinter />} {...rest}>
|
33
|
-
{children}
|
34
|
-
</Button>
|
35
|
-
</>
|
36
|
-
);
|
37
|
-
}
|