aq-fe-framework 0.1.155 → 0.1.156
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/api/apiFactory.ts +46 -0
- package/dist/api/baseAxios.ts +22 -0
- package/dist/app/admin/(core)/core12196/page.tsx +13 -0
- package/dist/app/admin/(core)/core16209/page.tsx +13 -0
- package/dist/app/admin/(core)/core18256/page.tsx +12 -0
- package/dist/app/admin/(core)/core26965/page.tsx +13 -0
- package/dist/app/admin/(core)/core27311/page.tsx +13 -0
- package/dist/app/admin/(core)/core38677/page.tsx +13 -0
- package/dist/app/admin/(core)/core40207/page.tsx +13 -0
- package/dist/app/admin/(core)/core60524/page.tsx +11 -0
- package/dist/app/admin/(core)/core64229/page.tsx +12 -0
- package/dist/app/admin/(core)/core71678/page.tsx +11 -0
- package/dist/app/admin/(core)/core76318/page.tsx +13 -0
- package/dist/app/admin/(core)/core83092/page.tsx +13 -0
- package/dist/app/admin/[...slug]/page.tsx +7 -0
- package/dist/app/admin/error.tsx +42 -0
- package/dist/app/admin/layout.tsx +21 -0
- package/dist/app/admin/test/page.tsx +44 -0
- package/dist/app/auth/login/page.tsx +14 -0
- package/dist/app/globals.css +59 -0
- package/dist/app/layout.tsx +39 -0
- package/dist/app/page.tsx +18 -0
- package/dist/{chunk-PAHZ57DT.mjs → chunk-JLT4BL7I.mjs} +1 -1
- package/dist/components/Aceternity/BoxesBackground/MyBoxes.tsx +66 -0
- package/dist/components/Aceternity/BoxesBackground/MyBoxesBackground.tsx +31 -0
- package/dist/components/ActionIcons/ActionIcon/MyActionIcon.tsx +47 -0
- package/dist/components/ActionIcons/ActionIconCRUD/MyActionIconDelete.tsx +81 -0
- package/dist/components/ActionIcons/ActionIconCRUD/MyActionIconUpdate.tsx +68 -0
- package/dist/components/ActionIcons/ActionIconCheck/MyActionIconCheck.tsx +50 -0
- package/dist/components/ActionIcons/ActionIconDownloadPDF/MyActionIconDownloadPDF.tsx +13 -0
- package/dist/components/ActionIcons/ActionIconModal/MyActionIconModal.tsx +113 -0
- package/dist/components/ActionIcons/ActionIconUpload/MyActionIconUpload.tsx +19 -0
- package/dist/components/ActionIcons/ActionIconViewPdf/MyActionIconViewPDF.tsx +63 -0
- package/dist/components/ActionIcons/SwitchTheme/MySwitchTheme.tsx +36 -0
- package/dist/components/AppSpotlight/MyAppSpotlight.tsx +112 -0
- package/dist/components/Buttons/Anchor/MyAnchorViewPDF.tsx +46 -0
- package/dist/components/Buttons/Button/MyButton.tsx +90 -0
- package/dist/components/Buttons/ButtonCRUD/AQButtonCreateByImportFile.tsx +81 -0
- package/dist/components/Buttons/ButtonCRUD/AQButtonExportData.tsx +75 -0
- package/dist/components/Buttons/ButtonCRUD/MyButtonCreate.tsx +68 -0
- package/dist/components/Buttons/ButtonImport/MyButtonImport.tsx +29 -0
- package/dist/components/Buttons/ButtonImport/SelectFieldModal.tsx +100 -0
- package/dist/components/Buttons/ButtonImport/SelectFileModal.tsx +81 -0
- package/dist/components/Buttons/ButtonImport/useS_ButtonImport.ts +196 -0
- package/dist/components/Buttons/ButtonModal/AQSelectTableByOpenModal.tsx +71 -0
- package/dist/components/Buttons/ButtonModal/MyButtonModal.tsx +117 -0
- package/dist/components/Buttons/ButtonPrintPDF/MyButtonPrintPDF.tsx +37 -0
- package/dist/components/Buttons/ButtonPrintPDFTable/MyButtonPrintTablePDF.tsx +174 -0
- package/dist/components/Buttons/ButtonRouterBack/MyButtonRouterBack.tsx +29 -0
- package/dist/components/Buttons/ButtonViewPDF/MyButtonViewPDF.tsx +121 -0
- package/dist/components/Calendar/MyCalendar.tsx +118 -0
- package/dist/components/CenterFull/MyCenterFull.tsx +10 -0
- package/dist/components/Checkbox/MyCheckbox.tsx +9 -0
- package/dist/components/Combobox/Select/MySelect.tsx +12 -0
- package/dist/components/DataDisplay/Card/AQCard.tsx +49 -0
- package/dist/components/DataDisplay/CardInformation/MyCardInformation.tsx +77 -0
- package/dist/components/DataDisplay/DataTable/MyDataTable.tsx +184 -0
- package/dist/components/DataDisplay/IconText/MyIconText.tsx +17 -0
- package/dist/components/DataDisplay/KeyLabel/MyKeyLabel.tsx +15 -0
- package/dist/components/DataDisplay/NumberFormatter/MyNumberFormatter.tsx +9 -0
- package/dist/components/DataDisplay/StatCard/AQStatCard1.tsx +68 -0
- package/dist/components/FaviconSetter/FaviconSetter.tsx +33 -0
- package/dist/components/Inputs/DateInput/MyDateInput.tsx +11 -0
- package/dist/components/Inputs/Fieldset/MyFieldset.tsx +32 -0
- package/dist/components/Inputs/FileInput/MyFileInput.tsx +12 -0
- package/dist/components/Inputs/NumberInput/MyNumberInput.tsx +12 -0
- package/dist/components/Inputs/TextArea/MyTextArea.tsx +11 -0
- package/dist/components/Inputs/TextEditor/MyTextEditor.tsx +191 -0
- package/dist/components/Inputs/TextInput/MyTextInput.tsx +30 -0
- package/dist/components/Layouts/BasicAppShell/BasicAppShell.tsx +357 -0
- package/dist/components/Layouts/BasicAppShell/css.module.css +62 -0
- package/dist/components/Layouts/BasicAppShell/useS_BasicAppShell.ts +64 -0
- package/dist/components/Layouts/Container/MyContainer.tsx +16 -0
- package/dist/components/Layouts/FlexColumn/MyFlexColumn.tsx +14 -0
- package/dist/components/Layouts/FlexEnd/MyFlexEnd.tsx +14 -0
- package/dist/components/Layouts/FlexRow/MyFlexRow.tsx +14 -0
- package/dist/components/Layouts/HeaderMegaMenu/HeaderMegaMenu.tsx +147 -0
- package/dist/components/Layouts/HeaderMegaMenu/HeaderMegaMenuStore.ts +19 -0
- package/dist/components/Layouts/HeaderMegaMenu/css.module.css +50 -0
- package/dist/components/Layouts/HtmlWrapper/MyHtmlWrapper.tsx +29 -0
- package/dist/components/Layouts/PageContent/MyPageContent.tsx +67 -0
- package/dist/components/Layouts/Tab/MyTab.tsx +33 -0
- package/dist/components/Loaders/MyCardioLoader.tsx +12 -0
- package/dist/components/RESTAPIComponents/DataTableSelect/MyDataTableSelect.tsx +61 -0
- package/dist/components/RESTAPIComponents/SelectAPIGet/MySelectAPIGet.tsx +37 -0
- package/dist/components/ScheduleX/MyScheduleX.tsx +58 -0
- package/dist/components/Skeletons/SkeletonTable/MySkeletonTable.tsx +9 -0
- package/dist/components/index.mjs +1 -1
- package/dist/components/index.ts +62 -0
- package/dist/constants/array/daysOfWeek.ts +9 -0
- package/dist/constants/enum/ENUM_EMAILCONFIG.ts +6 -0
- package/dist/constants/enum/global.ts +26 -0
- package/dist/constants/object/color.ts +5 -0
- package/dist/constants/object/documentTypes.ts +8 -0
- package/dist/{components/index.css → css.module-4ICLUKPO.module.css} +29 -16
- package/dist/css.module-P45UW6UZ.module.css +4 -0
- package/dist/data/menuData.ts +31 -0
- package/dist/hooks/custom-hooks/useC_MutationAction.tsx +36 -0
- package/dist/hooks/index.ts +2 -0
- package/dist/hooks/query/AQ/useQ_AQ_GetAQModule.ts +14 -0
- package/dist/interfaces/EmailConfig.ts +10 -0
- package/dist/interfaces/IAQModule.ts +21 -0
- package/dist/interfaces/base.ts +9 -0
- package/dist/interfaces/global-interface/IAQSSO.ts +15 -0
- package/dist/interfaces/global-interface/IAQSyncData.ts +9 -0
- package/dist/interfaces/global-interface/IAcademicYear.ts +12 -0
- package/dist/interfaces/global-interface/IChangePassWord.ts +8 -0
- package/dist/interfaces/global-interface/IComplaintProccess.ts +9 -0
- package/dist/interfaces/global-interface/ICreateAccount.ts +24 -0
- package/dist/interfaces/global-interface/IDocument.ts +25 -0
- package/dist/interfaces/global-interface/IDocumentAttribute.ts +12 -0
- package/dist/interfaces/global-interface/IEvent.ts +30 -0
- package/dist/interfaces/global-interface/IEventComplaint.ts +20 -0
- package/dist/interfaces/global-interface/IEventFillter.ts +14 -0
- package/dist/interfaces/global-interface/IFile.ts +8 -0
- package/dist/interfaces/global-interface/IImportStudentPaticipation.ts +8 -0
- package/dist/interfaces/global-interface/IPagePermission.ts +12 -0
- package/dist/interfaces/global-interface/IRolePermission.ts +7 -0
- package/dist/interfaces/global-interface/ISRMUserinfo.ts +35 -0
- package/dist/interfaces/global-interface/IScientificProfileProjectUser.ts +15 -0
- package/dist/interfaces/global-interface/IScientificProfileResearchGroup.ts +15 -0
- package/dist/interfaces/global-interface/IScientificProfileResearchGroupUser.ts +14 -0
- package/dist/interfaces/global-interface/IScientificProfileResearchProject.ts +21 -0
- package/dist/interfaces/global-interface/ISignIn.ts +7 -0
- package/dist/interfaces/global-interface/ISystemCatalogAcademicYear.ts +15 -0
- package/dist/interfaces/global-interface/ISystemCatalogDomainCategory.ts +11 -0
- package/dist/interfaces/global-interface/ISystemCatalogProjectLevelCategory.ts +11 -0
- package/dist/interfaces/global-interface/ISystemCatalogProjectTypeCategory.ts +11 -0
- package/dist/interfaces/global-interface/ISystemCatalogRoleActivity.ts +11 -0
- package/dist/interfaces/global-interface/ISystemCatalogTaskCategory.ts +11 -0
- package/dist/interfaces/global-interface/ISystemManagementAcademicHistory.ts +31 -0
- package/dist/interfaces/global-interface/ISystemManagementProfessionalWorkHistory.ts +14 -0
- package/dist/interfaces/global-interface/ISystemManagementPublishedScientificWork.ts +14 -0
- package/dist/interfaces/global-interface/ISystemManagementRoleGroup.ts +12 -0
- package/dist/interfaces/global-interface/ISystemManagementRoleGroupMenuPermission.ts +18 -0
- package/dist/interfaces/global-interface/ISystemManagementScientificResearchProject.ts +16 -0
- package/dist/interfaces/global-interface/ISystemManagementUserMenuPermission.ts +18 -0
- package/dist/interfaces/global-interface/IUpdateAccount.ts +15 -0
- package/dist/interfaces/global-interface/IUser.ts +21 -0
- package/dist/interfaces/global-interface/IUserPermission.ts +7 -0
- package/dist/lib/utils.ts +6 -0
- package/dist/modules-features/admin/core/MainDashboard/BarChart_CourseStatus.tsx +87 -0
- package/dist/modules-features/admin/core/MainDashboard/BarChart_ExamStatus.tsx +65 -0
- package/dist/modules-features/admin/core/MainDashboard/BarChart_RevenueByAcademicYear.tsx +82 -0
- package/dist/modules-features/admin/core/MainDashboard/BarChart_StudentStatusIn30Days.tsx +67 -0
- package/dist/modules-features/admin/core/MainDashboard/HBarChart_CourseDropOutPercentage.tsx +77 -0
- package/dist/modules-features/admin/core/MainDashboard/HBarChart_CourseProgressPercentage.tsx +77 -0
- package/dist/modules-features/admin/core/MainDashboard/LineChart_RevenueIn12Months.tsx +78 -0
- package/dist/modules-features/admin/core/MainDashboard/LineChart_TotalRevenueByDiscountIn3Months.tsx +69 -0
- package/dist/modules-features/admin/core/MainDashboard/LineChart_TotalRevenueByVoucherIn3Months.tsx +69 -0
- package/dist/modules-features/admin/core/MainDashboard/LineChart_TotalStudentIn12Months.tsx +64 -0
- package/dist/modules-features/admin/core/MainDashboard/ViewDiscountStat.tsx +311 -0
- package/dist/modules-features/admin/core/MainDashboard/ViewVoucherStat.tsx +311 -0
- package/dist/modules-features/admin/core/core12196/F_core12196.tsx +20 -0
- package/dist/modules-features/admin/core/core12196/F_core12196_Create.tsx +101 -0
- package/dist/modules-features/admin/core/core12196/F_core12196_Delete.tsx +19 -0
- package/dist/modules-features/admin/core/core12196/F_core12196_Read.tsx +165 -0
- package/dist/modules-features/admin/core/core12196/F_core12196_Update.tsx +112 -0
- package/dist/modules-features/admin/core/core16209/F_core16209.tsx +108 -0
- package/dist/modules-features/admin/core/core16209/F_core16209_Create.tsx +112 -0
- package/dist/modules-features/admin/core/core16209/F_core16209_Delete.tsx +17 -0
- package/dist/modules-features/admin/core/core16209/F_core16209_Update.tsx +114 -0
- package/dist/modules-features/admin/core/core18256/F_core18256.tsx +29 -0
- package/dist/modules-features/admin/core/core18256/F_core18256_Create.tsx +34 -0
- package/dist/modules-features/admin/core/core18256/F_core18256_Delete.tsx +14 -0
- package/dist/modules-features/admin/core/core18256/F_core18256_Read.tsx +59 -0
- package/dist/modules-features/admin/core/core18256/F_core18256_Select.tsx +40 -0
- package/dist/modules-features/admin/core/core18256/F_core18256_Update.tsx +22 -0
- package/dist/modules-features/admin/core/core26965/F_core26965.tsx +17 -0
- package/dist/modules-features/admin/core/core26965/F_core26965_Create.tsx +106 -0
- package/dist/modules-features/admin/core/core26965/F_core26965_Delete.tsx +19 -0
- package/dist/modules-features/admin/core/core26965/F_core26965_Read.tsx +165 -0
- package/dist/modules-features/admin/core/core26965/F_core26965_Update.tsx +112 -0
- package/dist/modules-features/admin/core/core27311/F_core27311.tsx +21 -0
- package/dist/modules-features/admin/core/core27311/F_core27311_Create.tsx +109 -0
- package/dist/modules-features/admin/core/core27311/F_core27311_Delete.tsx +19 -0
- package/dist/modules-features/admin/core/core27311/F_core27311_Read.tsx +165 -0
- package/dist/modules-features/admin/core/core27311/F_core27311_Update.tsx +113 -0
- package/dist/modules-features/admin/core/core35923/F_core35923.tsx +46 -0
- package/dist/modules-features/admin/core/core38677/F_core38677.tsx +28 -0
- package/dist/modules-features/admin/core/core38677/F_core38677_ReadUser.tsx +79 -0
- package/dist/modules-features/admin/core/core38677/F_core38677_Save.tsx +52 -0
- package/dist/modules-features/admin/core/core38677/F_core38677_ViewMenuPermissions.tsx +264 -0
- package/dist/modules-features/admin/core/core40207/F_core40207.tsx +9 -0
- package/dist/modules-features/admin/core/core40207/F_core40207_Create.tsx +81 -0
- package/dist/modules-features/admin/core/core40207/F_core40207_Delete.tsx +17 -0
- package/dist/modules-features/admin/core/core40207/F_core40207_Read.tsx +98 -0
- package/dist/modules-features/admin/core/core40207/F_core40207_Update.tsx +83 -0
- package/dist/modules-features/admin/core/core47643/F_core47643.tsx +10 -0
- package/dist/modules-features/admin/core/core47643/F_core47643_Delete.tsx +13 -0
- package/dist/modules-features/admin/core/core47643/F_core47643_Form.tsx +34 -0
- package/dist/modules-features/admin/core/core47643/F_core47643_Read.tsx +57 -0
- package/dist/modules-features/admin/core/core60524/F_core60524.tsx +13 -0
- package/dist/modules-features/admin/core/core60524/F_core60524_Form.tsx +111 -0
- package/dist/modules-features/admin/core/core60524/F_core60524_Save.tsx +56 -0
- package/dist/modules-features/admin/core/core60524/useS_core60524.ts +16 -0
- package/dist/modules-features/admin/core/core64229/F_core64229.tsx +7 -0
- package/dist/modules-features/admin/core/core64229/F_core64229_Delete.tsx +21 -0
- package/dist/modules-features/admin/core/core64229/F_core64229_Form.tsx +95 -0
- package/dist/modules-features/admin/core/core64229/F_core64229_Read.tsx +67 -0
- package/dist/modules-features/admin/core/core71678/F_core71678.tsx +8 -0
- package/dist/modules-features/admin/core/core71678/F_core71678_ChangePermission.tsx +117 -0
- package/dist/modules-features/admin/core/core71678/F_core71678_Create.tsx +61 -0
- package/dist/modules-features/admin/core/core71678/F_core71678_Delete.tsx +16 -0
- package/dist/modules-features/admin/core/core71678/F_core71678_Read.tsx +92 -0
- package/dist/modules-features/admin/core/core71678/F_core71678_Update.tsx +49 -0
- package/dist/modules-features/admin/core/core76318/F_core76318.tsx +9 -0
- package/dist/modules-features/admin/core/core76318/F_core76318_Create.tsx +89 -0
- package/dist/modules-features/admin/core/core76318/F_core76318_Delete.tsx +17 -0
- package/dist/modules-features/admin/core/core76318/F_core76318_Read.tsx +104 -0
- package/dist/modules-features/admin/core/core76318/F_core76318_Update.tsx +89 -0
- package/dist/modules-features/admin/core/core83092/F_core83092.tsx +27 -0
- package/dist/modules-features/admin/core/core83092/F_core83092_ReadUser.tsx +85 -0
- package/dist/modules-features/admin/core/core83092/F_core83092_Save.tsx +52 -0
- package/dist/modules-features/admin/core/core83092/F_core83092_ViewMenuPermissions.tsx +263 -0
- package/dist/modules-features/admin/core/core83092/useS_core83092.tsx +70 -0
- package/dist/modules-features/authenticate/F_authenticate_Login/F_authenticate_Login.tsx +154 -0
- package/dist/modules-features/authenticate/F_authenticate_Login/css.module.css +4 -0
- package/dist/modules-features/authenticate/F_authenticate_Logout.tsx +22 -0
- package/dist/modules-features/authenticate/F_authenticate_SplashPage.tsx +21 -0
- package/dist/modules-features/authenticate/useS_authenticate.ts +23 -0
- package/dist/modules-features/index.mjs +2 -2
- package/dist/modules-features/index.ts +79 -0
- package/dist/providers/MyMantineProvider.tsx +140 -0
- package/dist/providers/MyReactQueryProvider.tsx +24 -0
- package/dist/providers/Provider.tsx +13 -0
- package/dist/providers/mantine.module.css +21 -0
- package/dist/stores/CreateGenericStore.ts +23 -0
- package/dist/stores/index.ts +1 -0
- package/dist/types/types.ts +16 -0
- package/dist/utils/index.ts +9 -0
- package/dist/utils/utils_converter.ts +39 -0
- package/dist/utils/utils_currency.ts +5 -0
- package/dist/utils/utils_date.ts +34 -0
- package/dist/utils/utils_excel.ts +128 -0
- package/dist/utils/utils_file.ts +61 -0
- package/dist/utils/utils_notification.ts +46 -0
- package/dist/utils/utils_pdf.ts +21 -0
- package/dist/utils/utils_time.ts +15 -0
- package/dist/utils/utils_validateForm.ts +9 -0
- package/package.json +1 -1
- package/dist/modules-features/index.css +0 -100
@@ -0,0 +1,81 @@
|
|
1
|
+
import { MyButton } from "@/components/Buttons/Button/MyButton";
|
2
|
+
import { utils_notification_show } from "@/utils/utils_notification";
|
3
|
+
import { Group, Highlight } from "@mantine/core";
|
4
|
+
import { useDisclosure } from "@mantine/hooks";
|
5
|
+
import { useMutation, useQueryClient } from "@tanstack/react-query";
|
6
|
+
import { ComponentProps, useState } from "react";
|
7
|
+
import { MyActionIconModal } from "../ActionIconModal/MyActionIconModal";
|
8
|
+
interface IActionIconDelete extends Omit<ComponentProps<typeof MyActionIconModal>, "disclosure"> {
|
9
|
+
onSubmit: () => void;
|
10
|
+
onSuccess?: () => void;
|
11
|
+
onError?: () => void;
|
12
|
+
contextData?: string;
|
13
|
+
loading?: boolean;
|
14
|
+
}
|
15
|
+
|
16
|
+
export function MyActionIconDelete({
|
17
|
+
onSubmit,
|
18
|
+
onSuccess,
|
19
|
+
onError,
|
20
|
+
contextData,
|
21
|
+
...rest
|
22
|
+
}: IActionIconDelete) {
|
23
|
+
const queryClient = useQueryClient();
|
24
|
+
const disc = useDisclosure();
|
25
|
+
const loadingState = useState<boolean>()
|
26
|
+
|
27
|
+
|
28
|
+
const mutation = useMutation({
|
29
|
+
mutationFn: async () => await onSubmit(),
|
30
|
+
onSuccess: () => {
|
31
|
+
if (onSuccess) {
|
32
|
+
onSuccess()
|
33
|
+
return
|
34
|
+
}
|
35
|
+
queryClient.invalidateQueries();
|
36
|
+
utils_notification_show({ crudType: "delete" });
|
37
|
+
disc[1].close();
|
38
|
+
},
|
39
|
+
onError: () => {
|
40
|
+
if (onError) {
|
41
|
+
onError()
|
42
|
+
return
|
43
|
+
}
|
44
|
+
},
|
45
|
+
});
|
46
|
+
|
47
|
+
function handleCLick() {
|
48
|
+
loadingState[1](true)
|
49
|
+
mutation.mutate();
|
50
|
+
}
|
51
|
+
return (
|
52
|
+
<MyActionIconModal
|
53
|
+
disclosure={disc}
|
54
|
+
crudType="delete"
|
55
|
+
{...rest}
|
56
|
+
>
|
57
|
+
<Highlight
|
58
|
+
highlight={contextData || []}
|
59
|
+
color="red.6"
|
60
|
+
highlightStyles={{
|
61
|
+
fontWeight: 700,
|
62
|
+
WebkitBackgroundClip: 'text',
|
63
|
+
WebkitTextFillColor: 'transparent',
|
64
|
+
}}
|
65
|
+
>
|
66
|
+
{`Bạn sắp xóa dữ liệu ${contextData || ""}. Hành động này không thể hoàn tác. Bạn có chắc chắn muốn tiếp tục?`}
|
67
|
+
</Highlight>
|
68
|
+
<Group grow>
|
69
|
+
<MyButton
|
70
|
+
crudType="delete"
|
71
|
+
onClick={handleCLick}
|
72
|
+
loading={loadingState[0]}
|
73
|
+
/>
|
74
|
+
<MyButton
|
75
|
+
crudType="cancel"
|
76
|
+
onClick={disc[1].close}
|
77
|
+
/>
|
78
|
+
</Group>
|
79
|
+
</MyActionIconModal>
|
80
|
+
);
|
81
|
+
}
|
@@ -0,0 +1,68 @@
|
|
1
|
+
import { MyButton } from "@/components/Buttons/Button/MyButton"
|
2
|
+
import { MyFlexColumn } from "@/components/Layouts/FlexColumn/MyFlexColumn"
|
3
|
+
import { utils_notification_show } from "@/utils/utils_notification"
|
4
|
+
import { UseFormReturnType } from "@mantine/form"
|
5
|
+
import { useDisclosure } from "@mantine/hooks"
|
6
|
+
import { useMutation, useQueryClient } from "@tanstack/react-query"
|
7
|
+
import { ComponentProps, useEffect } from "react"
|
8
|
+
import { MyActionIconModal } from "../ActionIconModal/MyActionIconModal"
|
9
|
+
|
10
|
+
interface IActionIconUpdate<T> extends Omit<ComponentProps<typeof MyActionIconModal>, "form" | "disclosure" | "onSubmit"> {
|
11
|
+
resetFormWhenclose?: boolean
|
12
|
+
onSubmit: (values: T) => void
|
13
|
+
onSuccess?: () => void; // Custom callback for success handling
|
14
|
+
onError?: () => void; // Custom callback for error handling
|
15
|
+
form: UseFormReturnType<T>;
|
16
|
+
disclosure?: ReturnType<typeof useDisclosure>;
|
17
|
+
}
|
18
|
+
|
19
|
+
export function MyActionIconUpdate<T>({
|
20
|
+
resetFormWhenclose,
|
21
|
+
form,
|
22
|
+
onSubmit,
|
23
|
+
onSuccess,
|
24
|
+
onError,
|
25
|
+
children,
|
26
|
+
...rest
|
27
|
+
}: IActionIconUpdate<T>) {
|
28
|
+
const disc = useDisclosure()
|
29
|
+
const queryClient = useQueryClient()
|
30
|
+
|
31
|
+
const mutation = useMutation({
|
32
|
+
mutationFn: async (values: T) => {
|
33
|
+
await onSubmit(values);
|
34
|
+
},
|
35
|
+
onSuccess: () => {
|
36
|
+
if (onSuccess) {
|
37
|
+
onSuccess()
|
38
|
+
}
|
39
|
+
queryClient.invalidateQueries()
|
40
|
+
utils_notification_show({ crudType: "update" });
|
41
|
+
disc[1].close();
|
42
|
+
|
43
|
+
},
|
44
|
+
onError: () => {
|
45
|
+
if (onError) onError();
|
46
|
+
},
|
47
|
+
})
|
48
|
+
useEffect(() => {
|
49
|
+
if (!resetFormWhenclose) return
|
50
|
+
if (disc[0] == true) return
|
51
|
+
form.reset()
|
52
|
+
}, [disc[0]])
|
53
|
+
return (
|
54
|
+
<MyActionIconModal disclosure={disc} crudType="update" {...rest}>
|
55
|
+
<form onSubmit={form.onSubmit((values) => {
|
56
|
+
mutation.mutate(values);
|
57
|
+
})}>
|
58
|
+
<MyFlexColumn>
|
59
|
+
{children}
|
60
|
+
<MyButton
|
61
|
+
type="submit"
|
62
|
+
crudType="save"
|
63
|
+
/>
|
64
|
+
</MyFlexColumn>
|
65
|
+
</form>
|
66
|
+
</MyActionIconModal>
|
67
|
+
)
|
68
|
+
}
|
@@ -0,0 +1,50 @@
|
|
1
|
+
"use client";
|
2
|
+
import { MyTextInput } from "@/components/Inputs/TextInput/MyTextInput";
|
3
|
+
import { MyFlexColumn } from "@/components/Layouts/FlexColumn/MyFlexColumn";
|
4
|
+
import { ActionIcon, ActionIconProps, Button, Checkbox, Modal, Switch, Text, Tooltip } from "@mantine/core";
|
5
|
+
import { useDisclosure } from "@mantine/hooks";
|
6
|
+
import { IconChecklist } from "@tabler/icons-react";
|
7
|
+
import { useState } from "react";
|
8
|
+
|
9
|
+
|
10
|
+
interface IActionIconCheck extends ActionIconProps {
|
11
|
+
modalSize?: string; comment?: string
|
12
|
+
}
|
13
|
+
|
14
|
+
export function MyActionIconCheck({ modalSize = "50%", comment = "", ...rest }: IActionIconCheck) {
|
15
|
+
const disc = useDisclosure(false);
|
16
|
+
const fullScreen = useState(false);
|
17
|
+
const hSize = useState("50vh");
|
18
|
+
return (
|
19
|
+
<>
|
20
|
+
<Tooltip label="Xem tài liệu trực tiếp" >
|
21
|
+
<ActionIcon color="cyan" onClick={disc[1].open} {...rest}>
|
22
|
+
<IconChecklist size={24} color="blue" />
|
23
|
+
</ActionIcon>
|
24
|
+
</Tooltip>
|
25
|
+
|
26
|
+
<Modal
|
27
|
+
fullScreen={fullScreen[0]}
|
28
|
+
opened={disc[0]}
|
29
|
+
onClose={disc[1].close}
|
30
|
+
size={modalSize}
|
31
|
+
title={
|
32
|
+
<Text>Kiểm tra hồ sơ đã đăng ký</Text>
|
33
|
+
|
34
|
+
}>
|
35
|
+
<Switch
|
36
|
+
defaultChecked
|
37
|
+
label="Đạt yêu cầu"
|
38
|
+
/>
|
39
|
+
<MyFlexColumn>
|
40
|
+
<MyTextInput label="Nhận xét" />
|
41
|
+
<Checkbox label="Gửi mail thông báo" />
|
42
|
+
<Button>Cập nhập</Button>
|
43
|
+
</MyFlexColumn>
|
44
|
+
|
45
|
+
</Modal>
|
46
|
+
|
47
|
+
|
48
|
+
</>
|
49
|
+
);
|
50
|
+
}
|
@@ -0,0 +1,13 @@
|
|
1
|
+
import { utils_pdf_download } from "@/utils/utils_pdf";
|
2
|
+
import { ActionIcon, Tooltip } from "@mantine/core";
|
3
|
+
import { IconDownload } from "@tabler/icons-react";
|
4
|
+
|
5
|
+
export function MyActionIconDownloadPDF({ pdfLink = "https://datafiles.chinhphu.vn/cpp/files/vbpq/2021/07/17-bgd.signed.pdf" }: { pdfLink: string }) {
|
6
|
+
return (
|
7
|
+
<Tooltip label="Nhấp để tải xuống">
|
8
|
+
<ActionIcon onClick={async () => await utils_pdf_download(pdfLink)} color="red">
|
9
|
+
<IconDownload />
|
10
|
+
</ActionIcon>
|
11
|
+
</Tooltip>
|
12
|
+
);
|
13
|
+
}
|
@@ -0,0 +1,113 @@
|
|
1
|
+
import { MyFlexColumn } from "@/components/Layouts/FlexColumn/MyFlexColumn";
|
2
|
+
import { TYPES_CRUD, TYPES_MANTINE_SIZE } from "@/types/types";
|
3
|
+
import { ActionIcon, ActionIconProps, Modal } from "@mantine/core";
|
4
|
+
import { useDisclosure } from "@mantine/hooks";
|
5
|
+
import { IconEdit, IconPlus, IconTrash } from "@tabler/icons-react";
|
6
|
+
import { ReactNode } from "react";
|
7
|
+
|
8
|
+
interface IMyActionIconModal extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, "color" | "style">, ActionIconProps {
|
9
|
+
title?: string;
|
10
|
+
children?: ReactNode;
|
11
|
+
crudType?: TYPES_CRUD;
|
12
|
+
modalSize?: TYPES_MANTINE_SIZE;
|
13
|
+
disclosure: ReturnType<typeof useDisclosure>;
|
14
|
+
fullScreen?: boolean;
|
15
|
+
icon?: ReactNode;
|
16
|
+
}
|
17
|
+
|
18
|
+
export function MyActionIconModal({
|
19
|
+
fullScreen = false,
|
20
|
+
crudType = "default",
|
21
|
+
disclosure,
|
22
|
+
modalSize,
|
23
|
+
title,
|
24
|
+
children,
|
25
|
+
icon,
|
26
|
+
...rest
|
27
|
+
}: IMyActionIconModal) {
|
28
|
+
if (crudType == "default") {
|
29
|
+
return (
|
30
|
+
<>
|
31
|
+
<ActionIcon onClick={disclosure?.[1].open} color="indigo" {...rest}>
|
32
|
+
{icon}
|
33
|
+
</ActionIcon>
|
34
|
+
<Modal
|
35
|
+
fullScreen={fullScreen}
|
36
|
+
size={modalSize}
|
37
|
+
title={title}
|
38
|
+
opened={disclosure?.[0]}
|
39
|
+
onClose={disclosure[1].close}>
|
40
|
+
<MyFlexColumn>{children}</MyFlexColumn>
|
41
|
+
</Modal>
|
42
|
+
</>
|
43
|
+
);
|
44
|
+
}
|
45
|
+
if (crudType == "create") {
|
46
|
+
return (
|
47
|
+
<>
|
48
|
+
<ActionIcon onClick={disclosure?.[1].open} {...rest}>
|
49
|
+
{icon ? icon : <IconPlus />}
|
50
|
+
</ActionIcon>
|
51
|
+
<Modal
|
52
|
+
fullScreen={fullScreen}
|
53
|
+
size={modalSize}
|
54
|
+
title={title ? title : "Tạo dữ liệu mới"}
|
55
|
+
opened={disclosure?.[0]}
|
56
|
+
onClose={disclosure[1].close}>
|
57
|
+
<MyFlexColumn>{children}</MyFlexColumn>
|
58
|
+
</Modal>
|
59
|
+
</>
|
60
|
+
);
|
61
|
+
}
|
62
|
+
if (crudType == "update") {
|
63
|
+
return (
|
64
|
+
<>
|
65
|
+
<ActionIcon onClick={disclosure?.[1].open} color="yellow" {...rest}>
|
66
|
+
{icon ? icon : <IconEdit />}
|
67
|
+
</ActionIcon>
|
68
|
+
<Modal
|
69
|
+
fullScreen={fullScreen}
|
70
|
+
size={modalSize}
|
71
|
+
title={title ? title : "Sửa dữ liệu"}
|
72
|
+
opened={disclosure?.[0]}
|
73
|
+
onClose={disclosure[1].close}>
|
74
|
+
<MyFlexColumn>{children}</MyFlexColumn>
|
75
|
+
</Modal>
|
76
|
+
</>
|
77
|
+
);
|
78
|
+
}
|
79
|
+
if (crudType == "delete") {
|
80
|
+
return (
|
81
|
+
<>
|
82
|
+
<ActionIcon onClick={disclosure?.[1].open} color="red" {...rest}>
|
83
|
+
{icon ? icon : <IconTrash />}
|
84
|
+
</ActionIcon>
|
85
|
+
<Modal
|
86
|
+
fullScreen={fullScreen}
|
87
|
+
size={modalSize}
|
88
|
+
title={title ? title : "Xóa dữ liệu"}
|
89
|
+
opened={disclosure?.[0]}
|
90
|
+
onClose={disclosure[1].close}>
|
91
|
+
<MyFlexColumn>{children}</MyFlexColumn>
|
92
|
+
</Modal>
|
93
|
+
</>
|
94
|
+
);
|
95
|
+
}
|
96
|
+
if (crudType == "check") {
|
97
|
+
return (
|
98
|
+
<>
|
99
|
+
<ActionIcon onClick={disclosure?.[1].open} color="green" {...rest}>
|
100
|
+
{icon ? icon : <IconTrash />}
|
101
|
+
</ActionIcon>
|
102
|
+
<Modal
|
103
|
+
fullScreen={fullScreen}
|
104
|
+
size={modalSize}
|
105
|
+
title={title ? title : "Kiểm tra"}
|
106
|
+
opened={disclosure?.[0]}
|
107
|
+
onClose={disclosure[1].close}>
|
108
|
+
<MyFlexColumn>{children}</MyFlexColumn>
|
109
|
+
</Modal>
|
110
|
+
</>
|
111
|
+
);
|
112
|
+
}
|
113
|
+
}
|
@@ -0,0 +1,19 @@
|
|
1
|
+
import { ActionIcon } from "@mantine/core";
|
2
|
+
import { Dropzone, MIME_TYPES } from "@mantine/dropzone";
|
3
|
+
import { IconCloudUpload } from "@tabler/icons-react";
|
4
|
+
import { useRef } from "react";
|
5
|
+
|
6
|
+
export function MyActionIconUpload() {
|
7
|
+
const openRef = useRef<() => void>(null);
|
8
|
+
return (
|
9
|
+
<Dropzone
|
10
|
+
openRef={openRef}
|
11
|
+
onDrop={() => { }}
|
12
|
+
radius="md"
|
13
|
+
|
14
|
+
accept={[MIME_TYPES.pdf]}
|
15
|
+
>
|
16
|
+
<ActionIcon><IconCloudUpload /></ActionIcon>
|
17
|
+
</Dropzone>
|
18
|
+
)
|
19
|
+
}
|
@@ -0,0 +1,63 @@
|
|
1
|
+
"use client";
|
2
|
+
import { ActionIcon, ActionIconProps, Group, Modal, Paper, Text, Tooltip } from "@mantine/core";
|
3
|
+
import { useDisclosure } from "@mantine/hooks";
|
4
|
+
import { IconLivePhoto, IconMaximize, IconMinimize } from "@tabler/icons-react";
|
5
|
+
import { useState } from "react";
|
6
|
+
|
7
|
+
interface IActionIconViewPDF extends ActionIconProps {
|
8
|
+
modalSize?: string;
|
9
|
+
pdfLink: string;
|
10
|
+
}
|
11
|
+
|
12
|
+
export function MyActionIconViewPDF({
|
13
|
+
modalSize = "80%",
|
14
|
+
pdfLink = "https://datafiles.chinhphu.vn/cpp/files/vbpq/2021/07/17-bgd.signed.pdf",
|
15
|
+
...rest
|
16
|
+
}: IActionIconViewPDF) {
|
17
|
+
const disc = useDisclosure(false);
|
18
|
+
const fullScreen = useState(false);
|
19
|
+
const hSize = useState("80vh");
|
20
|
+
return (
|
21
|
+
<>
|
22
|
+
<Tooltip label="Xem tài liệu trực tiếp">
|
23
|
+
<ActionIcon color="cyan" onClick={disc[1].open} {...rest}>
|
24
|
+
<IconLivePhoto />
|
25
|
+
</ActionIcon>
|
26
|
+
</Tooltip>
|
27
|
+
<Modal
|
28
|
+
fullScreen={fullScreen[0]}
|
29
|
+
opened={disc[0]}
|
30
|
+
onClose={disc[1].close}
|
31
|
+
size={modalSize}
|
32
|
+
title={
|
33
|
+
<Group>
|
34
|
+
<Text>Xem tài liệu trực tiếp</Text>
|
35
|
+
{fullScreen[0] ? (
|
36
|
+
<ActionIcon
|
37
|
+
onClick={() => {
|
38
|
+
fullScreen[1](false);
|
39
|
+
hSize[1]("80vh");
|
40
|
+
}}
|
41
|
+
>
|
42
|
+
<IconMinimize />
|
43
|
+
</ActionIcon>
|
44
|
+
) : (
|
45
|
+
<ActionIcon
|
46
|
+
onClick={() => {
|
47
|
+
fullScreen[1](true);
|
48
|
+
hSize[1]("90vh");
|
49
|
+
}}
|
50
|
+
>
|
51
|
+
<IconMaximize />
|
52
|
+
</ActionIcon>
|
53
|
+
)}
|
54
|
+
</Group>
|
55
|
+
}
|
56
|
+
>
|
57
|
+
<Paper h={hSize[0]} p={"lg"}>
|
58
|
+
<iframe src={pdfLink} width={"100%"} height={"100%"} />
|
59
|
+
</Paper>
|
60
|
+
</Modal>
|
61
|
+
</>
|
62
|
+
);
|
63
|
+
}
|
@@ -0,0 +1,36 @@
|
|
1
|
+
import { useEffect, useState } from 'react';
|
2
|
+
import { ActionIcon, useComputedColorScheme, useMantineColorScheme } from '@mantine/core';
|
3
|
+
import { IconMoon, IconSun } from '@tabler/icons-react';
|
4
|
+
|
5
|
+
export function MySwitchTheme() {
|
6
|
+
const { setColorScheme } = useMantineColorScheme();
|
7
|
+
const computedColorScheme = useComputedColorScheme('light', {
|
8
|
+
getInitialValueInEffect: true,
|
9
|
+
});
|
10
|
+
|
11
|
+
const [mounted, setMounted] = useState(false);
|
12
|
+
|
13
|
+
useEffect(() => {
|
14
|
+
setMounted(true);
|
15
|
+
}, []);
|
16
|
+
|
17
|
+
if (!mounted) return null; // hoặc <Skeleton /> nếu bạn muốn placeholder
|
18
|
+
|
19
|
+
return (
|
20
|
+
<ActionIcon
|
21
|
+
onClick={() =>
|
22
|
+
setColorScheme(computedColorScheme === 'light' ? 'dark' : 'light')
|
23
|
+
}
|
24
|
+
variant="default"
|
25
|
+
size="lg"
|
26
|
+
radius="md"
|
27
|
+
aria-label="Toggle color scheme"
|
28
|
+
>
|
29
|
+
{computedColorScheme === 'dark' ? (
|
30
|
+
<IconSun width="22px" height="22px" stroke={1.5} />
|
31
|
+
) : (
|
32
|
+
<IconMoon width="22px" height="22px" stroke={1.5} />
|
33
|
+
)}
|
34
|
+
</ActionIcon>
|
35
|
+
);
|
36
|
+
}
|
@@ -0,0 +1,112 @@
|
|
1
|
+
"use client";
|
2
|
+
|
3
|
+
import { Spotlight, spotlight } from "@mantine/spotlight";
|
4
|
+
import { IconSearch } from "@tabler/icons-react";
|
5
|
+
import { usePathname, useRouter } from "next/navigation";
|
6
|
+
import { useMemo, useState } from "react";
|
7
|
+
import { I_BasicAppShell_LinkItem } from "../Layouts/BasicAppShell/BasicAppShell";
|
8
|
+
import { useS_BasicAppShell } from "../Layouts/BasicAppShell/useS_BasicAppShell";
|
9
|
+
|
10
|
+
// Hàm đệ quy để chuyển đổi menu thành các action cho Spotlight
|
11
|
+
function convertMenuToSpotlightActions(
|
12
|
+
items: I_BasicAppShell_LinkItem[],
|
13
|
+
router: any,
|
14
|
+
parentPath: string = "",
|
15
|
+
sideBarStore: any,
|
16
|
+
pathName: string
|
17
|
+
): any[] {
|
18
|
+
let actions: any[] = [];
|
19
|
+
|
20
|
+
items.forEach((item) => {
|
21
|
+
// Nếu có link, thêm action cho item này
|
22
|
+
if (item.link) {
|
23
|
+
actions.push({
|
24
|
+
id: item.label.toLowerCase().replace(/\s+/g, "-"),
|
25
|
+
label: item.label,
|
26
|
+
description: `Chuyển đến ${item.label} (Code: ${item.link})`,
|
27
|
+
onClick: () => {
|
28
|
+
sideBarStore.setProperty("title", item.label);
|
29
|
+
sideBarStore.setProperty("menuCode", item.link);
|
30
|
+
router.push(
|
31
|
+
pathName.split("/")[0] + "/" + pathName.split("/")[1] + "/" + item.link
|
32
|
+
);
|
33
|
+
spotlight.close();
|
34
|
+
},
|
35
|
+
rightSection: item.status
|
36
|
+
? item.status === "Prototype"
|
37
|
+
? "P"
|
38
|
+
: item.status === "New"
|
39
|
+
? "N"
|
40
|
+
: item.status === "Menu"
|
41
|
+
? "M"
|
42
|
+
: null
|
43
|
+
: null,
|
44
|
+
});
|
45
|
+
}
|
46
|
+
|
47
|
+
// Nếu có submenu, gọi đệ quy để thêm các action con
|
48
|
+
if (item.links) {
|
49
|
+
actions = actions.concat(
|
50
|
+
convertMenuToSpotlightActions(
|
51
|
+
item.links,
|
52
|
+
router,
|
53
|
+
item.link || "",
|
54
|
+
sideBarStore,
|
55
|
+
pathName
|
56
|
+
)
|
57
|
+
);
|
58
|
+
}
|
59
|
+
});
|
60
|
+
|
61
|
+
return actions;
|
62
|
+
}
|
63
|
+
|
64
|
+
export function MyAppSpotlight({ menu }: { menu: I_BasicAppShell_LinkItem[] }) {
|
65
|
+
const [query, setQuery] = useState("");
|
66
|
+
const router = useRouter();
|
67
|
+
const pathName = usePathname();
|
68
|
+
const basicAppShellStore = useS_BasicAppShell(); // Get the sidebar store here
|
69
|
+
|
70
|
+
// Chuyển đổi menu thành các action một lần để tối ưu hiệu suất
|
71
|
+
const spotlightActions = useMemo(
|
72
|
+
() => convertMenuToSpotlightActions(menu, router, "", basicAppShellStore, pathName),
|
73
|
+
[menu, router, basicAppShellStore] // Add sideBarStore to the dependency array
|
74
|
+
);
|
75
|
+
|
76
|
+
return (
|
77
|
+
<Spotlight
|
78
|
+
actions={spotlightActions}
|
79
|
+
query={query}
|
80
|
+
scrollable
|
81
|
+
maxHeight={800}
|
82
|
+
onQueryChange={setQuery}
|
83
|
+
shortcut={["mod + K", "/"]} // Hỗ trợ Ctrl/Cmd + K và phím /
|
84
|
+
nothingFound="Không tìm thấy trang"
|
85
|
+
highlightQuery
|
86
|
+
searchProps={{
|
87
|
+
leftSection: <IconSearch stroke={1.5} />,
|
88
|
+
placeholder: "Tìm kiếm trang...",
|
89
|
+
}}
|
90
|
+
/>
|
91
|
+
);
|
92
|
+
}
|
93
|
+
|
94
|
+
// Nếu muốn thêm nút mở Spotlight
|
95
|
+
export function SpotlightTrigger() {
|
96
|
+
return (
|
97
|
+
<button
|
98
|
+
onClick={spotlight.open}
|
99
|
+
style={{
|
100
|
+
background: "none",
|
101
|
+
border: "none",
|
102
|
+
cursor: "pointer",
|
103
|
+
display: "flex",
|
104
|
+
alignItems: "center",
|
105
|
+
gap: "8px",
|
106
|
+
}}
|
107
|
+
>
|
108
|
+
<IconSearch stroke={1.5} />
|
109
|
+
Tìm kiếm (Ctrl + K)
|
110
|
+
</button>
|
111
|
+
);
|
112
|
+
}
|
@@ -0,0 +1,46 @@
|
|
1
|
+
import { ActionIcon, Anchor, Group, Modal, Paper, Text } from "@mantine/core";
|
2
|
+
import { useDisclosure } from "@mantine/hooks";
|
3
|
+
import { IconMaximize, IconMinimize } from "@tabler/icons-react";
|
4
|
+
import { useState } from "react";
|
5
|
+
|
6
|
+
export function MyAnchorViewPDF({ label, pdfLink }: { label: string; pdfLink: string }) {
|
7
|
+
const disc = useDisclosure(false);
|
8
|
+
const fullScreen = useState(false);
|
9
|
+
const hSize = useState("80vh");
|
10
|
+
return (
|
11
|
+
<>
|
12
|
+
<Anchor onClick={disc[1].open}>{label}</Anchor>
|
13
|
+
<Modal
|
14
|
+
fullScreen={fullScreen[0]}
|
15
|
+
opened={disc[0]}
|
16
|
+
onClose={disc[1].close}
|
17
|
+
size={"80%"}
|
18
|
+
title={
|
19
|
+
<Group>
|
20
|
+
<Text>Xem tài liệu trực tiếp</Text>
|
21
|
+
{fullScreen[0] ? (
|
22
|
+
<ActionIcon
|
23
|
+
onClick={() => {
|
24
|
+
fullScreen[1](false);
|
25
|
+
hSize[1]("80vh");
|
26
|
+
}}>
|
27
|
+
<IconMinimize />
|
28
|
+
</ActionIcon>
|
29
|
+
) : (
|
30
|
+
<ActionIcon
|
31
|
+
onClick={() => {
|
32
|
+
fullScreen[1](true);
|
33
|
+
hSize[1]("90vh");
|
34
|
+
}}>
|
35
|
+
<IconMaximize />
|
36
|
+
</ActionIcon>
|
37
|
+
)}
|
38
|
+
</Group>
|
39
|
+
}>
|
40
|
+
<Paper h={hSize[0]}>
|
41
|
+
<iframe src={pdfLink} width={"100%"} height={"100%"} />
|
42
|
+
</Paper>
|
43
|
+
</Modal>
|
44
|
+
</>
|
45
|
+
);
|
46
|
+
}
|