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.
Files changed (242) hide show
  1. package/dist/api/apiFactory.ts +46 -0
  2. package/dist/api/baseAxios.ts +22 -0
  3. package/dist/app/admin/(core)/core12196/page.tsx +13 -0
  4. package/dist/app/admin/(core)/core16209/page.tsx +13 -0
  5. package/dist/app/admin/(core)/core18256/page.tsx +12 -0
  6. package/dist/app/admin/(core)/core26965/page.tsx +13 -0
  7. package/dist/app/admin/(core)/core27311/page.tsx +13 -0
  8. package/dist/app/admin/(core)/core38677/page.tsx +13 -0
  9. package/dist/app/admin/(core)/core40207/page.tsx +13 -0
  10. package/dist/app/admin/(core)/core60524/page.tsx +11 -0
  11. package/dist/app/admin/(core)/core64229/page.tsx +12 -0
  12. package/dist/app/admin/(core)/core71678/page.tsx +11 -0
  13. package/dist/app/admin/(core)/core76318/page.tsx +13 -0
  14. package/dist/app/admin/(core)/core83092/page.tsx +13 -0
  15. package/dist/app/admin/[...slug]/page.tsx +7 -0
  16. package/dist/app/admin/error.tsx +42 -0
  17. package/dist/app/admin/layout.tsx +21 -0
  18. package/dist/app/admin/test/page.tsx +44 -0
  19. package/dist/app/auth/login/page.tsx +14 -0
  20. package/dist/app/globals.css +59 -0
  21. package/dist/app/layout.tsx +39 -0
  22. package/dist/app/page.tsx +18 -0
  23. package/dist/{chunk-PAHZ57DT.mjs → chunk-JLT4BL7I.mjs} +1 -1
  24. package/dist/components/Aceternity/BoxesBackground/MyBoxes.tsx +66 -0
  25. package/dist/components/Aceternity/BoxesBackground/MyBoxesBackground.tsx +31 -0
  26. package/dist/components/ActionIcons/ActionIcon/MyActionIcon.tsx +47 -0
  27. package/dist/components/ActionIcons/ActionIconCRUD/MyActionIconDelete.tsx +81 -0
  28. package/dist/components/ActionIcons/ActionIconCRUD/MyActionIconUpdate.tsx +68 -0
  29. package/dist/components/ActionIcons/ActionIconCheck/MyActionIconCheck.tsx +50 -0
  30. package/dist/components/ActionIcons/ActionIconDownloadPDF/MyActionIconDownloadPDF.tsx +13 -0
  31. package/dist/components/ActionIcons/ActionIconModal/MyActionIconModal.tsx +113 -0
  32. package/dist/components/ActionIcons/ActionIconUpload/MyActionIconUpload.tsx +19 -0
  33. package/dist/components/ActionIcons/ActionIconViewPdf/MyActionIconViewPDF.tsx +63 -0
  34. package/dist/components/ActionIcons/SwitchTheme/MySwitchTheme.tsx +36 -0
  35. package/dist/components/AppSpotlight/MyAppSpotlight.tsx +112 -0
  36. package/dist/components/Buttons/Anchor/MyAnchorViewPDF.tsx +46 -0
  37. package/dist/components/Buttons/Button/MyButton.tsx +90 -0
  38. package/dist/components/Buttons/ButtonCRUD/AQButtonCreateByImportFile.tsx +81 -0
  39. package/dist/components/Buttons/ButtonCRUD/AQButtonExportData.tsx +75 -0
  40. package/dist/components/Buttons/ButtonCRUD/MyButtonCreate.tsx +68 -0
  41. package/dist/components/Buttons/ButtonImport/MyButtonImport.tsx +29 -0
  42. package/dist/components/Buttons/ButtonImport/SelectFieldModal.tsx +100 -0
  43. package/dist/components/Buttons/ButtonImport/SelectFileModal.tsx +81 -0
  44. package/dist/components/Buttons/ButtonImport/useS_ButtonImport.ts +196 -0
  45. package/dist/components/Buttons/ButtonModal/AQSelectTableByOpenModal.tsx +71 -0
  46. package/dist/components/Buttons/ButtonModal/MyButtonModal.tsx +117 -0
  47. package/dist/components/Buttons/ButtonPrintPDF/MyButtonPrintPDF.tsx +37 -0
  48. package/dist/components/Buttons/ButtonPrintPDFTable/MyButtonPrintTablePDF.tsx +174 -0
  49. package/dist/components/Buttons/ButtonRouterBack/MyButtonRouterBack.tsx +29 -0
  50. package/dist/components/Buttons/ButtonViewPDF/MyButtonViewPDF.tsx +121 -0
  51. package/dist/components/Calendar/MyCalendar.tsx +118 -0
  52. package/dist/components/CenterFull/MyCenterFull.tsx +10 -0
  53. package/dist/components/Checkbox/MyCheckbox.tsx +9 -0
  54. package/dist/components/Combobox/Select/MySelect.tsx +12 -0
  55. package/dist/components/DataDisplay/Card/AQCard.tsx +49 -0
  56. package/dist/components/DataDisplay/CardInformation/MyCardInformation.tsx +77 -0
  57. package/dist/components/DataDisplay/DataTable/MyDataTable.tsx +184 -0
  58. package/dist/components/DataDisplay/IconText/MyIconText.tsx +17 -0
  59. package/dist/components/DataDisplay/KeyLabel/MyKeyLabel.tsx +15 -0
  60. package/dist/components/DataDisplay/NumberFormatter/MyNumberFormatter.tsx +9 -0
  61. package/dist/components/DataDisplay/StatCard/AQStatCard1.tsx +68 -0
  62. package/dist/components/FaviconSetter/FaviconSetter.tsx +33 -0
  63. package/dist/components/Inputs/DateInput/MyDateInput.tsx +11 -0
  64. package/dist/components/Inputs/Fieldset/MyFieldset.tsx +32 -0
  65. package/dist/components/Inputs/FileInput/MyFileInput.tsx +12 -0
  66. package/dist/components/Inputs/NumberInput/MyNumberInput.tsx +12 -0
  67. package/dist/components/Inputs/TextArea/MyTextArea.tsx +11 -0
  68. package/dist/components/Inputs/TextEditor/MyTextEditor.tsx +191 -0
  69. package/dist/components/Inputs/TextInput/MyTextInput.tsx +30 -0
  70. package/dist/components/Layouts/BasicAppShell/BasicAppShell.tsx +357 -0
  71. package/dist/components/Layouts/BasicAppShell/css.module.css +62 -0
  72. package/dist/components/Layouts/BasicAppShell/useS_BasicAppShell.ts +64 -0
  73. package/dist/components/Layouts/Container/MyContainer.tsx +16 -0
  74. package/dist/components/Layouts/FlexColumn/MyFlexColumn.tsx +14 -0
  75. package/dist/components/Layouts/FlexEnd/MyFlexEnd.tsx +14 -0
  76. package/dist/components/Layouts/FlexRow/MyFlexRow.tsx +14 -0
  77. package/dist/components/Layouts/HeaderMegaMenu/HeaderMegaMenu.tsx +147 -0
  78. package/dist/components/Layouts/HeaderMegaMenu/HeaderMegaMenuStore.ts +19 -0
  79. package/dist/components/Layouts/HeaderMegaMenu/css.module.css +50 -0
  80. package/dist/components/Layouts/HtmlWrapper/MyHtmlWrapper.tsx +29 -0
  81. package/dist/components/Layouts/PageContent/MyPageContent.tsx +67 -0
  82. package/dist/components/Layouts/Tab/MyTab.tsx +33 -0
  83. package/dist/components/Loaders/MyCardioLoader.tsx +12 -0
  84. package/dist/components/RESTAPIComponents/DataTableSelect/MyDataTableSelect.tsx +61 -0
  85. package/dist/components/RESTAPIComponents/SelectAPIGet/MySelectAPIGet.tsx +37 -0
  86. package/dist/components/ScheduleX/MyScheduleX.tsx +58 -0
  87. package/dist/components/Skeletons/SkeletonTable/MySkeletonTable.tsx +9 -0
  88. package/dist/components/index.mjs +1 -1
  89. package/dist/components/index.ts +62 -0
  90. package/dist/constants/array/daysOfWeek.ts +9 -0
  91. package/dist/constants/enum/ENUM_EMAILCONFIG.ts +6 -0
  92. package/dist/constants/enum/global.ts +26 -0
  93. package/dist/constants/object/color.ts +5 -0
  94. package/dist/constants/object/documentTypes.ts +8 -0
  95. package/dist/{components/index.css → css.module-4ICLUKPO.module.css} +29 -16
  96. package/dist/css.module-P45UW6UZ.module.css +4 -0
  97. package/dist/data/menuData.ts +31 -0
  98. package/dist/hooks/custom-hooks/useC_MutationAction.tsx +36 -0
  99. package/dist/hooks/index.ts +2 -0
  100. package/dist/hooks/query/AQ/useQ_AQ_GetAQModule.ts +14 -0
  101. package/dist/interfaces/EmailConfig.ts +10 -0
  102. package/dist/interfaces/IAQModule.ts +21 -0
  103. package/dist/interfaces/base.ts +9 -0
  104. package/dist/interfaces/global-interface/IAQSSO.ts +15 -0
  105. package/dist/interfaces/global-interface/IAQSyncData.ts +9 -0
  106. package/dist/interfaces/global-interface/IAcademicYear.ts +12 -0
  107. package/dist/interfaces/global-interface/IChangePassWord.ts +8 -0
  108. package/dist/interfaces/global-interface/IComplaintProccess.ts +9 -0
  109. package/dist/interfaces/global-interface/ICreateAccount.ts +24 -0
  110. package/dist/interfaces/global-interface/IDocument.ts +25 -0
  111. package/dist/interfaces/global-interface/IDocumentAttribute.ts +12 -0
  112. package/dist/interfaces/global-interface/IEvent.ts +30 -0
  113. package/dist/interfaces/global-interface/IEventComplaint.ts +20 -0
  114. package/dist/interfaces/global-interface/IEventFillter.ts +14 -0
  115. package/dist/interfaces/global-interface/IFile.ts +8 -0
  116. package/dist/interfaces/global-interface/IImportStudentPaticipation.ts +8 -0
  117. package/dist/interfaces/global-interface/IPagePermission.ts +12 -0
  118. package/dist/interfaces/global-interface/IRolePermission.ts +7 -0
  119. package/dist/interfaces/global-interface/ISRMUserinfo.ts +35 -0
  120. package/dist/interfaces/global-interface/IScientificProfileProjectUser.ts +15 -0
  121. package/dist/interfaces/global-interface/IScientificProfileResearchGroup.ts +15 -0
  122. package/dist/interfaces/global-interface/IScientificProfileResearchGroupUser.ts +14 -0
  123. package/dist/interfaces/global-interface/IScientificProfileResearchProject.ts +21 -0
  124. package/dist/interfaces/global-interface/ISignIn.ts +7 -0
  125. package/dist/interfaces/global-interface/ISystemCatalogAcademicYear.ts +15 -0
  126. package/dist/interfaces/global-interface/ISystemCatalogDomainCategory.ts +11 -0
  127. package/dist/interfaces/global-interface/ISystemCatalogProjectLevelCategory.ts +11 -0
  128. package/dist/interfaces/global-interface/ISystemCatalogProjectTypeCategory.ts +11 -0
  129. package/dist/interfaces/global-interface/ISystemCatalogRoleActivity.ts +11 -0
  130. package/dist/interfaces/global-interface/ISystemCatalogTaskCategory.ts +11 -0
  131. package/dist/interfaces/global-interface/ISystemManagementAcademicHistory.ts +31 -0
  132. package/dist/interfaces/global-interface/ISystemManagementProfessionalWorkHistory.ts +14 -0
  133. package/dist/interfaces/global-interface/ISystemManagementPublishedScientificWork.ts +14 -0
  134. package/dist/interfaces/global-interface/ISystemManagementRoleGroup.ts +12 -0
  135. package/dist/interfaces/global-interface/ISystemManagementRoleGroupMenuPermission.ts +18 -0
  136. package/dist/interfaces/global-interface/ISystemManagementScientificResearchProject.ts +16 -0
  137. package/dist/interfaces/global-interface/ISystemManagementUserMenuPermission.ts +18 -0
  138. package/dist/interfaces/global-interface/IUpdateAccount.ts +15 -0
  139. package/dist/interfaces/global-interface/IUser.ts +21 -0
  140. package/dist/interfaces/global-interface/IUserPermission.ts +7 -0
  141. package/dist/lib/utils.ts +6 -0
  142. package/dist/modules-features/admin/core/MainDashboard/BarChart_CourseStatus.tsx +87 -0
  143. package/dist/modules-features/admin/core/MainDashboard/BarChart_ExamStatus.tsx +65 -0
  144. package/dist/modules-features/admin/core/MainDashboard/BarChart_RevenueByAcademicYear.tsx +82 -0
  145. package/dist/modules-features/admin/core/MainDashboard/BarChart_StudentStatusIn30Days.tsx +67 -0
  146. package/dist/modules-features/admin/core/MainDashboard/HBarChart_CourseDropOutPercentage.tsx +77 -0
  147. package/dist/modules-features/admin/core/MainDashboard/HBarChart_CourseProgressPercentage.tsx +77 -0
  148. package/dist/modules-features/admin/core/MainDashboard/LineChart_RevenueIn12Months.tsx +78 -0
  149. package/dist/modules-features/admin/core/MainDashboard/LineChart_TotalRevenueByDiscountIn3Months.tsx +69 -0
  150. package/dist/modules-features/admin/core/MainDashboard/LineChart_TotalRevenueByVoucherIn3Months.tsx +69 -0
  151. package/dist/modules-features/admin/core/MainDashboard/LineChart_TotalStudentIn12Months.tsx +64 -0
  152. package/dist/modules-features/admin/core/MainDashboard/ViewDiscountStat.tsx +311 -0
  153. package/dist/modules-features/admin/core/MainDashboard/ViewVoucherStat.tsx +311 -0
  154. package/dist/modules-features/admin/core/core12196/F_core12196.tsx +20 -0
  155. package/dist/modules-features/admin/core/core12196/F_core12196_Create.tsx +101 -0
  156. package/dist/modules-features/admin/core/core12196/F_core12196_Delete.tsx +19 -0
  157. package/dist/modules-features/admin/core/core12196/F_core12196_Read.tsx +165 -0
  158. package/dist/modules-features/admin/core/core12196/F_core12196_Update.tsx +112 -0
  159. package/dist/modules-features/admin/core/core16209/F_core16209.tsx +108 -0
  160. package/dist/modules-features/admin/core/core16209/F_core16209_Create.tsx +112 -0
  161. package/dist/modules-features/admin/core/core16209/F_core16209_Delete.tsx +17 -0
  162. package/dist/modules-features/admin/core/core16209/F_core16209_Update.tsx +114 -0
  163. package/dist/modules-features/admin/core/core18256/F_core18256.tsx +29 -0
  164. package/dist/modules-features/admin/core/core18256/F_core18256_Create.tsx +34 -0
  165. package/dist/modules-features/admin/core/core18256/F_core18256_Delete.tsx +14 -0
  166. package/dist/modules-features/admin/core/core18256/F_core18256_Read.tsx +59 -0
  167. package/dist/modules-features/admin/core/core18256/F_core18256_Select.tsx +40 -0
  168. package/dist/modules-features/admin/core/core18256/F_core18256_Update.tsx +22 -0
  169. package/dist/modules-features/admin/core/core26965/F_core26965.tsx +17 -0
  170. package/dist/modules-features/admin/core/core26965/F_core26965_Create.tsx +106 -0
  171. package/dist/modules-features/admin/core/core26965/F_core26965_Delete.tsx +19 -0
  172. package/dist/modules-features/admin/core/core26965/F_core26965_Read.tsx +165 -0
  173. package/dist/modules-features/admin/core/core26965/F_core26965_Update.tsx +112 -0
  174. package/dist/modules-features/admin/core/core27311/F_core27311.tsx +21 -0
  175. package/dist/modules-features/admin/core/core27311/F_core27311_Create.tsx +109 -0
  176. package/dist/modules-features/admin/core/core27311/F_core27311_Delete.tsx +19 -0
  177. package/dist/modules-features/admin/core/core27311/F_core27311_Read.tsx +165 -0
  178. package/dist/modules-features/admin/core/core27311/F_core27311_Update.tsx +113 -0
  179. package/dist/modules-features/admin/core/core35923/F_core35923.tsx +46 -0
  180. package/dist/modules-features/admin/core/core38677/F_core38677.tsx +28 -0
  181. package/dist/modules-features/admin/core/core38677/F_core38677_ReadUser.tsx +79 -0
  182. package/dist/modules-features/admin/core/core38677/F_core38677_Save.tsx +52 -0
  183. package/dist/modules-features/admin/core/core38677/F_core38677_ViewMenuPermissions.tsx +264 -0
  184. package/dist/modules-features/admin/core/core40207/F_core40207.tsx +9 -0
  185. package/dist/modules-features/admin/core/core40207/F_core40207_Create.tsx +81 -0
  186. package/dist/modules-features/admin/core/core40207/F_core40207_Delete.tsx +17 -0
  187. package/dist/modules-features/admin/core/core40207/F_core40207_Read.tsx +98 -0
  188. package/dist/modules-features/admin/core/core40207/F_core40207_Update.tsx +83 -0
  189. package/dist/modules-features/admin/core/core47643/F_core47643.tsx +10 -0
  190. package/dist/modules-features/admin/core/core47643/F_core47643_Delete.tsx +13 -0
  191. package/dist/modules-features/admin/core/core47643/F_core47643_Form.tsx +34 -0
  192. package/dist/modules-features/admin/core/core47643/F_core47643_Read.tsx +57 -0
  193. package/dist/modules-features/admin/core/core60524/F_core60524.tsx +13 -0
  194. package/dist/modules-features/admin/core/core60524/F_core60524_Form.tsx +111 -0
  195. package/dist/modules-features/admin/core/core60524/F_core60524_Save.tsx +56 -0
  196. package/dist/modules-features/admin/core/core60524/useS_core60524.ts +16 -0
  197. package/dist/modules-features/admin/core/core64229/F_core64229.tsx +7 -0
  198. package/dist/modules-features/admin/core/core64229/F_core64229_Delete.tsx +21 -0
  199. package/dist/modules-features/admin/core/core64229/F_core64229_Form.tsx +95 -0
  200. package/dist/modules-features/admin/core/core64229/F_core64229_Read.tsx +67 -0
  201. package/dist/modules-features/admin/core/core71678/F_core71678.tsx +8 -0
  202. package/dist/modules-features/admin/core/core71678/F_core71678_ChangePermission.tsx +117 -0
  203. package/dist/modules-features/admin/core/core71678/F_core71678_Create.tsx +61 -0
  204. package/dist/modules-features/admin/core/core71678/F_core71678_Delete.tsx +16 -0
  205. package/dist/modules-features/admin/core/core71678/F_core71678_Read.tsx +92 -0
  206. package/dist/modules-features/admin/core/core71678/F_core71678_Update.tsx +49 -0
  207. package/dist/modules-features/admin/core/core76318/F_core76318.tsx +9 -0
  208. package/dist/modules-features/admin/core/core76318/F_core76318_Create.tsx +89 -0
  209. package/dist/modules-features/admin/core/core76318/F_core76318_Delete.tsx +17 -0
  210. package/dist/modules-features/admin/core/core76318/F_core76318_Read.tsx +104 -0
  211. package/dist/modules-features/admin/core/core76318/F_core76318_Update.tsx +89 -0
  212. package/dist/modules-features/admin/core/core83092/F_core83092.tsx +27 -0
  213. package/dist/modules-features/admin/core/core83092/F_core83092_ReadUser.tsx +85 -0
  214. package/dist/modules-features/admin/core/core83092/F_core83092_Save.tsx +52 -0
  215. package/dist/modules-features/admin/core/core83092/F_core83092_ViewMenuPermissions.tsx +263 -0
  216. package/dist/modules-features/admin/core/core83092/useS_core83092.tsx +70 -0
  217. package/dist/modules-features/authenticate/F_authenticate_Login/F_authenticate_Login.tsx +154 -0
  218. package/dist/modules-features/authenticate/F_authenticate_Login/css.module.css +4 -0
  219. package/dist/modules-features/authenticate/F_authenticate_Logout.tsx +22 -0
  220. package/dist/modules-features/authenticate/F_authenticate_SplashPage.tsx +21 -0
  221. package/dist/modules-features/authenticate/useS_authenticate.ts +23 -0
  222. package/dist/modules-features/index.mjs +2 -2
  223. package/dist/modules-features/index.ts +79 -0
  224. package/dist/providers/MyMantineProvider.tsx +140 -0
  225. package/dist/providers/MyReactQueryProvider.tsx +24 -0
  226. package/dist/providers/Provider.tsx +13 -0
  227. package/dist/providers/mantine.module.css +21 -0
  228. package/dist/stores/CreateGenericStore.ts +23 -0
  229. package/dist/stores/index.ts +1 -0
  230. package/dist/types/types.ts +16 -0
  231. package/dist/utils/index.ts +9 -0
  232. package/dist/utils/utils_converter.ts +39 -0
  233. package/dist/utils/utils_currency.ts +5 -0
  234. package/dist/utils/utils_date.ts +34 -0
  235. package/dist/utils/utils_excel.ts +128 -0
  236. package/dist/utils/utils_file.ts +61 -0
  237. package/dist/utils/utils_notification.ts +46 -0
  238. package/dist/utils/utils_pdf.ts +21 -0
  239. package/dist/utils/utils_time.ts +15 -0
  240. package/dist/utils/utils_validateForm.ts +9 -0
  241. package/package.json +1 -1
  242. package/dist/modules-features/index.css +0 -100
@@ -0,0 +1,196 @@
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
+ }
@@ -0,0 +1,71 @@
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
+ }
@@ -0,0 +1,117 @@
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
+ }
@@ -0,0 +1,37 @@
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
+ }
@@ -0,0 +1,174 @@
1
+ import { MyHtmlWrapper } from "@/components/Layouts/HtmlWrapper/MyHtmlWrapper";
2
+ import { Box, Table } from "@mantine/core";
3
+ import { MRT_RowData } from "mantine-react-table";
4
+ import { MyButtonPrintPDF } from "../ButtonPrintPDF/MyButtonPrintPDF";
5
+ interface FieldConfig {
6
+ fieldName: string; // Field name in the data
7
+ header: string; // Header name for the print
8
+ isCenter?: boolean; // Optional flag to center align content, default is true
9
+ formatFunction?: (value: any, row: any) => any; // Optional formatting function
10
+ }
11
+
12
+ interface PrintConfig {
13
+ fields: FieldConfig[]; // Array of field configurations
14
+ title?: string; // Optional title for the printed table
15
+ showRowNumbers?: boolean; // Optional flag to show row numbers
16
+ }
17
+
18
+ interface AQButtonPrintTableProps<TData extends MRT_RowData = any> extends React.ComponentPropsWithoutRef<typeof MyButtonPrintPDF> {
19
+ printConfig?: PrintConfig; // Optional print configuration
20
+ objectName?: string; // Name of the file to print
21
+ data?: TData[]; // Data to print
22
+ }
23
+
24
+ export function MyButtonPrintTablePDF<TData extends MRT_RowData = any>({
25
+ printConfig,
26
+ data,
27
+ ...rest
28
+ }: AQButtonPrintTableProps<TData>) {
29
+ const formatDate = (date: Date): string => {
30
+ const day = String(date.getDate()).padStart(2, '0');
31
+ const month = String(date.getMonth() + 1).padStart(2, '0');
32
+ const year = date.getFullYear();
33
+ return `${day}/${month}/${year}`;
34
+ };
35
+
36
+ // Hàm format giá trị theo kiểu dữ liệu
37
+ const formatValue = (value: any): string => {
38
+ if (value === undefined || value === null) {
39
+ return '';
40
+ }
41
+
42
+ // Xử lý định dạng ngày tháng
43
+ if (value instanceof Date) {
44
+ return formatDate(value);
45
+ }
46
+
47
+ // Xử lý các kiểu dữ liệu khác
48
+ return String(value);
49
+ };
50
+
51
+ const rows = data?.map((item, index) => {
52
+ if (!printConfig?.fields) return null;
53
+
54
+ return (
55
+ <Table.Tr key={index}>
56
+ {printConfig.showRowNumbers && (
57
+ <Table.Td ta="center" px="xs" style={{ border: "1px solid lightgray" }}>
58
+ {index + 1}
59
+ </Table.Td>
60
+ )}
61
+ {printConfig.fields.map((field) => {
62
+ let value = item[field.fieldName];
63
+
64
+ if (field.formatFunction) {
65
+ value = field.formatFunction(value, item);
66
+ } else {
67
+ value = formatValue(value);
68
+ }
69
+
70
+ const alignment = field.isCenter === false ? "left" : "center";
71
+
72
+ // Xử lý giá trị HTML
73
+ if (typeof value === 'string' && (value.includes('<') || value.includes('&lt;'))) {
74
+ return (
75
+ <Table.Td
76
+ key={field.fieldName}
77
+ px="xs"
78
+ ta={alignment}
79
+ style={{ border: "1px solid lightgray" }}
80
+ >
81
+ <MyHtmlWrapper html={value} />
82
+ </Table.Td>
83
+ );
84
+ }
85
+
86
+ // Xử lý giá trị boolean
87
+ if (value === 'true' || value === 'false') {
88
+ return (
89
+ <Table.Td
90
+ key={field.fieldName}
91
+ ta={alignment}
92
+ px="xs"
93
+ style={{ border: "1px solid lightgray" }}
94
+ >
95
+ <input type="checkbox" checked={value === 'true'} readOnly />
96
+ </Table.Td>
97
+ );
98
+ }
99
+
100
+ return (
101
+ <Table.Td
102
+ key={field.fieldName}
103
+ ta={alignment}
104
+ px="xs"
105
+ style={{ border: "1px solid lightgray" }}
106
+ >
107
+ {value}
108
+ </Table.Td>
109
+ );
110
+ })}
111
+ </Table.Tr>
112
+ );
113
+ });
114
+
115
+ const renderContent = () => {
116
+ if (!data || !printConfig?.fields) return null;
117
+
118
+ const today = new Date();
119
+ const formattedDate = today.toLocaleDateString('vi-VN', {
120
+ year: 'numeric',
121
+ month: 'long',
122
+ day: 'numeric',
123
+ hour: '2-digit',
124
+ minute: '2-digit'
125
+ });
126
+
127
+ const tableTitle = printConfig?.title || "Bảng dữ liệu";
128
+
129
+ return (
130
+ <Box p="lg" >
131
+ <div style={{ textAlign: 'center', marginTop: '10px', fontStyle: 'italic', color: '#666' }}>
132
+ Ngày in: {formattedDate}
133
+ </div>
134
+ <h2 style={{ textAlign: 'center', fontSize: '24px', fontWeight: 'bold', marginBottom: '20px' }}>
135
+ {tableTitle}
136
+ </h2>
137
+ <Table withColumnBorders highlightOnHover style={{ border: "1px solid lightgray" }}>
138
+ <Table.Thead>
139
+ <Table.Tr>
140
+ {printConfig.showRowNumbers && (
141
+ <Table.Th style={{ border: "1px solid lightgray" }} w="10%" ta="center" px="xs">
142
+ STT
143
+ </Table.Th>
144
+ )}
145
+ {printConfig.fields.map((field) => {
146
+ const alignment = field.isCenter === false ? "left" : "center";
147
+ return (
148
+ <Table.Th
149
+ key={field.fieldName}
150
+ style={{ border: "1px solid lightgray" }}
151
+ ta={alignment}
152
+ px="xs"
153
+ >
154
+ {field.header}
155
+ </Table.Th>
156
+ );
157
+ })}
158
+ </Table.Tr>
159
+ </Table.Thead>
160
+ <Table.Tbody>
161
+ {rows}
162
+ </Table.Tbody>
163
+ </Table>
164
+ </Box>
165
+ );
166
+ };
167
+ return (
168
+ <MyButtonPrintPDF
169
+ contentToPrint={renderContent()}
170
+ {...rest}
171
+ />
172
+ );
173
+ }
174
+
@@ -0,0 +1,29 @@
1
+ "use client";
2
+ import { Button, ButtonProps } from "@mantine/core";
3
+ import { IconArrowBack } from "@tabler/icons-react";
4
+ import { useRouter } from "next/navigation";
5
+
6
+ interface IMyButtonRouterBack extends ButtonProps {
7
+ url?: string;
8
+ label?: string;
9
+ }
10
+
11
+ export function MyButtonRouterBack({ url, label, ...rest }: IMyButtonRouterBack) {
12
+ const router = useRouter();
13
+ return (
14
+ <Button
15
+ variant="light"
16
+ leftSection={<IconArrowBack stroke={2} />}
17
+ onClick={() => {
18
+ if (url) {
19
+ router.replace(url);
20
+ return;
21
+ }
22
+ router.back();
23
+ }}
24
+ {...rest}
25
+ >
26
+ {label ? label : "Trở về"}
27
+ </Button>
28
+ );
29
+ }