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,68 @@
1
+ import { Box, Button, Flex, Group, Paper, Text } from "@mantine/core";
2
+ import { IconArrowDownRight, IconArrowUpRight } from "@tabler/icons-react";
3
+ import { ReactNode } from "react";
4
+
5
+ export function AQStatCard1(
6
+ { title, value, unit = "", description, icons, diff }: { title: string, value: string, unit?: string, description: string, icons: ReactNode, diff: number }
7
+ ) {
8
+ return (
9
+ <>
10
+ <Paper withBorder
11
+ p="md"
12
+ radius="md"
13
+ key={title}>
14
+ <Group justify="space-between">
15
+ <Flex direction={"column"}>
16
+ <Text
17
+ tt="uppercase"
18
+ size="lg"
19
+ c="dimmed"
20
+ >
21
+ {title}
22
+ </Text>
23
+ {unit == "" ?
24
+ <Text size="xs" style={{ visibility: 'hidden' }}>Đơn vị: <strong>{unit}</strong></Text>
25
+ :
26
+ <Text size="xs">Đơn vị: <strong>{unit}</strong></Text>
27
+ }
28
+ </Flex>
29
+ <Box>
30
+ {icons}
31
+ </Box>
32
+ </Group>
33
+
34
+ <Group
35
+ mt={"5"}
36
+ align="flex-end"
37
+ gap={"xs"}
38
+ >
39
+ <Text
40
+ fw={700}
41
+ fz="h1"
42
+ >{value}
43
+ </Text>
44
+ <Text
45
+ mb={"2"}
46
+ c={diff > 0 ? 'teal' : 'red'}
47
+ fz="h2"
48
+ fw={500}
49
+ >
50
+ <span>{diff}%</span>{diff > 0 ? <IconArrowUpRight /> : <IconArrowDownRight />}
51
+ </Text>
52
+ </Group>
53
+
54
+ <Group justify="space-between">
55
+ <Text tt="uppercase" fz="xs" c="dimmed">
56
+ {description}
57
+ </Text>
58
+ <Button
59
+ variant="light"
60
+ size="xs"
61
+ >
62
+ Xem chi tiết
63
+ </Button>
64
+ </Group>
65
+ </Paper>
66
+ </>
67
+ );
68
+ }
@@ -0,0 +1,33 @@
1
+ 'use client';
2
+
3
+ import { useEffect } from 'react';
4
+ import { useS_BasicAppShell } from '../Layouts/BasicAppShell/useS_BasicAppShell';
5
+
6
+ export function FaviconSetter() {
7
+ const store = useS_BasicAppShell()
8
+ useEffect(() => {
9
+ if (!store.state.faviconFileDetail?.fileBase64String) return
10
+ try {
11
+ // Get base64 icon from localStorage
12
+ const base64Icon = `data:image/${store.state.faviconFileDetail.fileExtension?.replaceAll(".", "")};base64,${store.state.faviconFileDetail?.fileBase64String}`
13
+
14
+ if (base64Icon) {
15
+ // Find existing favicon or create a new link element
16
+ let link = document.querySelector("link[rel~='icon']") as HTMLLinkElement;
17
+ if (!link) {
18
+ link = document.createElement('link');
19
+ link.rel = 'icon';
20
+ document.head.appendChild(link);
21
+ }
22
+
23
+ // Set the href to the base64 data
24
+ link.href = base64Icon;
25
+ }
26
+ } catch (error) {
27
+ console.error('Error setting favicon from localStorage:', error);
28
+ }
29
+ }, [store.state.faviconFileDetail?.fileBase64String]);
30
+
31
+ // This component doesn't render anything visible
32
+ return null;
33
+ }
@@ -0,0 +1,11 @@
1
+ import { DateInput, DateInputProps } from '@mantine/dates';
2
+
3
+ interface IDateInput extends DateInputProps {
4
+ label?: string
5
+ }
6
+
7
+ export function MyDateInput({ label, ...rest }: IDateInput) {
8
+ return (
9
+ <DateInput label={label} placeholder={label ? `Chọn ${label?.toLowerCase()}` : ""} {...rest} />
10
+ )
11
+ }
@@ -0,0 +1,32 @@
1
+ import { Box, Fieldset, FieldsetProps, Text } from '@mantine/core'
2
+ import { ReactNode } from 'react'
3
+
4
+ interface MyFieldsetProps extends FieldsetProps {
5
+ chilren?: ReactNode,
6
+ title?: string
7
+ }
8
+
9
+ export function MyFieldset({
10
+ children,
11
+ title,
12
+ ...rest
13
+ }: MyFieldsetProps) {
14
+ return (
15
+ <Fieldset
16
+ {...rest}
17
+ legend={(
18
+ <Box
19
+ bg="blue.4"
20
+ px="xs"
21
+ py={2}
22
+ style={{ borderRadius: 4 }}
23
+ >
24
+ <Text c="white" fw={500}>
25
+ {title}
26
+ </Text>
27
+ </Box>
28
+ )}>
29
+ {children}
30
+ </Fieldset>
31
+ )
32
+ }
@@ -0,0 +1,12 @@
1
+ import { FileInput, FileInputProps } from '@mantine/core'
2
+
3
+ interface IFileInput extends FileInputProps {
4
+ label?: string
5
+ }
6
+
7
+
8
+ export function MyFileInput({ label, ...rest }: IFileInput) {
9
+ return (
10
+ <FileInput label={label} placeholder={label ? `Chọn ${label?.toLowerCase()}` : ""}{...rest} />
11
+ )
12
+ }
@@ -0,0 +1,12 @@
1
+ import { NumberInput, NumberInputProps } from '@mantine/core'
2
+
3
+ interface INumberInput extends NumberInputProps {
4
+ label?: string
5
+ }
6
+
7
+
8
+ export function MyNumberInput({ label, ...rest }: INumberInput) {
9
+ return (
10
+ <NumberInput label={label} placeholder={label ? `Nhập ${label?.toLowerCase()}` : ""}{...rest} />
11
+ )
12
+ }
@@ -0,0 +1,11 @@
1
+ import { Textarea, TextareaProps } from '@mantine/core';
2
+
3
+ interface IMyTextArea extends TextareaProps {
4
+ label?: string
5
+ }
6
+
7
+ export function MyTextArea({ label, ...rest }: IMyTextArea) {
8
+ return (
9
+ <Textarea label={label} placeholder={label ? `Nhập ${label?.toLowerCase()}` : ""}{...rest} />
10
+ )
11
+ }
@@ -0,0 +1,191 @@
1
+ 'use client'
2
+ import { Input, MantineSize, ScrollArea } from '@mantine/core';
3
+ import { Link, RichTextEditor } from '@mantine/tiptap';
4
+ import FileHandler from '@tiptap-pro/extension-file-handler';
5
+ import Highlight from '@tiptap/extension-highlight';
6
+ import Image from '@tiptap/extension-image';
7
+ import SubScript from '@tiptap/extension-subscript';
8
+ import Superscript from '@tiptap/extension-superscript';
9
+ import TextAlign from '@tiptap/extension-text-align';
10
+ import Underline from '@tiptap/extension-underline';
11
+ import { EditorOptions, useEditor } from '@tiptap/react';
12
+ import StarterKit from '@tiptap/starter-kit';
13
+ import { useEffect, useState } from 'react';
14
+ export interface IMyTextEditor extends Partial<EditorOptions> {
15
+ label?: string,
16
+ error?: string,
17
+ value?: string,
18
+ onChange?: any,
19
+ contentHeight?: MantineSize | string,
20
+ autoHiddenToolBar?: boolean
21
+ withAsterisk?: boolean
22
+ }
23
+
24
+
25
+ export function MyTextEditor({
26
+ autoHiddenToolBar = false,
27
+ contentHeight = "400px",
28
+ onChange,
29
+ value,
30
+ error,
31
+ label,
32
+ withAsterisk,
33
+ ...rest
34
+ }:
35
+ IMyTextEditor) {
36
+ const [hiddenToolBar, setHiddenToolBar] = useState(autoHiddenToolBar)
37
+ const editor = useEditor({
38
+ extensions: [
39
+ StarterKit,
40
+ Underline,
41
+ Link,
42
+ Superscript,
43
+ SubScript,
44
+ Highlight,
45
+ Image.extend({
46
+ addAttributes() {
47
+ return {
48
+ src: {
49
+ default: null,
50
+ },
51
+ alt: {
52
+ default: null,
53
+ },
54
+ };
55
+ },
56
+ parseHTML() {
57
+ return [
58
+ {
59
+ tag: 'img[src]',
60
+ },
61
+ ];
62
+ },
63
+ renderHTML({ HTMLAttributes }) {
64
+ return ['img', HTMLAttributes];
65
+ },
66
+ }),
67
+ TextAlign.configure({ types: ['heading', 'paragraph'] }),
68
+ FileHandler.configure({
69
+ allowedMimeTypes: ['image/png', 'image/jpeg', 'image/gif', 'image/webp'],
70
+ onDrop: (currentEditor, files, pos) => {
71
+ files.forEach(file => {
72
+ const fileReader = new FileReader()
73
+
74
+ fileReader.readAsDataURL(file)
75
+ fileReader.onload = () => {
76
+ currentEditor.chain().insertContentAt(pos, {
77
+ type: 'image',
78
+ attrs: {
79
+ src: fileReader.result,
80
+ },
81
+ }).focus().run()
82
+ }
83
+ })
84
+ },
85
+ onPaste: (currentEditor, files, htmlContent) => {
86
+ files.forEach(file => {
87
+ if (htmlContent) {
88
+ console.log(htmlContent)
89
+ return false
90
+ }
91
+ const fileReader = new FileReader()
92
+ fileReader.readAsDataURL(file)
93
+ fileReader.onload = () => {
94
+ currentEditor.chain().insertContentAt(currentEditor.state.selection.anchor, {
95
+ type: 'image',
96
+ attrs: {
97
+ src: fileReader.result,
98
+ },
99
+ }).focus().run()
100
+ }
101
+ })
102
+ },
103
+ }),
104
+ ],
105
+ content: value,
106
+ onUpdate: ({ editor }) => {
107
+ const content = editor.getHTML();
108
+ if (content === '<p></p>') {
109
+ onChange('');
110
+ } else {
111
+ onChange(content);
112
+ }
113
+ },
114
+ ...rest,
115
+
116
+ });
117
+ useEffect(() => {
118
+ if (editor && value !== editor.getHTML()) {
119
+ editor.commands.setContent(value!);
120
+ }
121
+ }, [value, editor]);
122
+ return (
123
+
124
+ <Input.Wrapper label={label} flex={1} error={error} withAsterisk={withAsterisk}>
125
+ <RichTextEditor editor={editor} style={{ border: error && '1px solid #e03131', }}>
126
+ <RichTextEditor.Toolbar hidden={hiddenToolBar} sticky stickyOffset={60}>
127
+ <RichTextEditor.ControlsGroup>
128
+ <RichTextEditor.Bold />
129
+ <RichTextEditor.Italic />
130
+ <RichTextEditor.Underline />
131
+ <RichTextEditor.Strikethrough />
132
+ <RichTextEditor.ClearFormatting />
133
+ <RichTextEditor.Highlight />
134
+ <RichTextEditor.Code />
135
+ </RichTextEditor.ControlsGroup>
136
+
137
+ <RichTextEditor.ControlsGroup>
138
+ <RichTextEditor.H1 />
139
+ <RichTextEditor.H2 />
140
+ <RichTextEditor.H3 />
141
+ <RichTextEditor.H4 />
142
+ </RichTextEditor.ControlsGroup>
143
+
144
+ <RichTextEditor.ControlsGroup>
145
+ <RichTextEditor.Blockquote />
146
+ <RichTextEditor.Hr />
147
+ <RichTextEditor.BulletList />
148
+ <RichTextEditor.OrderedList />
149
+ <RichTextEditor.Subscript />
150
+ <RichTextEditor.Superscript />
151
+ </RichTextEditor.ControlsGroup>
152
+
153
+ <RichTextEditor.ControlsGroup>
154
+ <RichTextEditor.Link />
155
+ <RichTextEditor.Unlink />
156
+ </RichTextEditor.ControlsGroup>
157
+
158
+ <RichTextEditor.ControlsGroup>
159
+ <RichTextEditor.AlignLeft />
160
+ <RichTextEditor.AlignCenter />
161
+ <RichTextEditor.AlignJustify />
162
+ <RichTextEditor.AlignRight />
163
+ </RichTextEditor.ControlsGroup>
164
+
165
+ {/* <RichTextEditor.ControlsGroup>
166
+ <RichTextEditor.Undo />
167
+ <RichTextEditor.Redo />
168
+ </RichTextEditor.ControlsGroup> */}
169
+ </RichTextEditor.Toolbar>
170
+
171
+ <ScrollArea.Autosize
172
+ onMouseDown={() => {
173
+ editor?.commands.focus();
174
+ }}
175
+ onBlur={() => {
176
+ if (autoHiddenToolBar == false) return
177
+ setHiddenToolBar(true);
178
+ }}
179
+ onFocus={() => {
180
+ if (autoHiddenToolBar == false) return
181
+ setHiddenToolBar(false);
182
+ }}
183
+ style={{ cursor: "text", maxHeight: "400px" }}
184
+ >
185
+ <RichTextEditor.Content mih={contentHeight} />
186
+ </ScrollArea.Autosize>
187
+
188
+ </RichTextEditor>
189
+ </Input.Wrapper>
190
+ );
191
+ }
@@ -0,0 +1,30 @@
1
+ import { TextInput, TextInputProps } from '@mantine/core';
2
+
3
+ interface IMyTextInput extends TextInputProps {
4
+ label?: string; defaultValue?: string,
5
+ isPhoneNumber?: boolean
6
+ }
7
+
8
+ export function MyTextInput({ label, defaultValue, isPhoneNumber, ...rest }: IMyTextInput) {
9
+ return (
10
+ <TextInput
11
+ onKeyDown={(e) => {
12
+ if (!isPhoneNumber) return
13
+ const allowedKeys = [
14
+ "Backspace", "Tab", "ArrowLeft", "ArrowRight", "Delete",
15
+ "+", "-", "(", ")", " ", // các ký tự đặc biệt cho số điện thoại
16
+ ]
17
+ if (
18
+ !/[0-9]/.test(e.key) &&
19
+ !allowedKeys.includes(e.key)
20
+ ) {
21
+ e.preventDefault()
22
+ }
23
+ }}
24
+ label={label}
25
+ defaultValue={defaultValue}
26
+ placeholder={label ? `Nhập ${label?.toLowerCase()}` : ""}
27
+ {...rest}
28
+ />
29
+ )
30
+ }