@syzy/apphost 1.0.1 → 1.0.3

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 (213) hide show
  1. package/dist/App.d.ts +4 -0
  2. package/dist/App.js +83 -0
  3. package/dist/AppHostProvider.d.ts +6 -0
  4. package/dist/AppHostProvider.js +4 -0
  5. package/dist/AppHostRoutes.d.ts +1 -0
  6. package/dist/AppHostRoutes.js +7 -0
  7. package/dist/api/image-api.d.ts +8 -0
  8. package/dist/api/image-api.js +45 -0
  9. package/dist/api/mapping-api.d.ts +80 -0
  10. package/dist/api/mapping-api.js +427 -0
  11. package/dist/bookingModule/components/AmenityForm.d.ts +3 -0
  12. package/dist/bookingModule/components/AmenityForm.js +19 -0
  13. package/dist/bookingModule/components/BillingManagement.d.ts +3 -0
  14. package/dist/bookingModule/components/BillingManagement.js +17 -0
  15. package/dist/bookingModule/components/CreateRoomForm.d.ts +3 -0
  16. package/dist/bookingModule/components/CreateRoomForm.js +19 -0
  17. package/dist/bookingModule/components/ExtraRequirementForm.d.ts +3 -0
  18. package/dist/bookingModule/components/ExtraRequirementForm.js +19 -0
  19. package/dist/bookingModule/components/ReservationForm.d.ts +3 -0
  20. package/dist/bookingModule/components/ReservationForm.js +18 -0
  21. package/dist/bookingModule/components/RoomCategoryForm.d.ts +3 -0
  22. package/dist/bookingModule/components/RoomCategoryForm.js +19 -0
  23. package/dist/bookingModule/components/RoomCategoryPriceForm.d.ts +3 -0
  24. package/dist/bookingModule/components/RoomCategoryPriceForm.js +20 -0
  25. package/dist/bookingModule/components/RoomExtraRequirementCapture.d.ts +3 -0
  26. package/dist/bookingModule/components/RoomExtraRequirementCapture.js +18 -0
  27. package/dist/bookingModule/components/RoomFacilityForm.d.ts +3 -0
  28. package/dist/bookingModule/components/RoomFacilityForm.js +19 -0
  29. package/dist/bookingModule/components/RoomReservationAction.d.ts +3 -0
  30. package/dist/bookingModule/components/RoomReservationAction.js +18 -0
  31. package/dist/components/Home/Home.d.ts +3 -0
  32. package/dist/components/Home/Home.js +14 -0
  33. package/dist/components/Loader/Loader.d.ts +2 -0
  34. package/dist/components/Loader/Loader.js +5 -0
  35. package/dist/components/Login/Login.d.ts +7 -0
  36. package/dist/components/Login/Login.js +149 -0
  37. package/dist/components/Login/loginSchema.d.ts +27 -0
  38. package/dist/components/Login/loginSchema.js +41 -0
  39. package/dist/components/Mappings/BranchMapping/Branch.d.ts +5 -0
  40. package/dist/components/Mappings/BranchMapping/Branch.js +135 -0
  41. package/dist/components/Mappings/BranchMapping/BranchTableColumns.d.ts +10 -0
  42. package/dist/components/Mappings/BranchMapping/BranchTableColumns.js +21 -0
  43. package/dist/components/Mappings/BranchMapping/MappingFormBranchUser.d.ts +3 -0
  44. package/dist/components/Mappings/BranchMapping/MappingFormBranchUser.js +150 -0
  45. package/dist/components/Mappings/BranchMapping/MappingTableColumns.d.ts +14 -0
  46. package/dist/components/Mappings/BranchMapping/MappingTableColumns.js +29 -0
  47. package/dist/components/Mappings/BranchMapping/branchSchema.d.ts +37 -0
  48. package/dist/components/Mappings/BranchMapping/branchSchema.js +34 -0
  49. package/dist/components/Mappings/ComponentMapping/ComponentRoleMapping.d.ts +3 -0
  50. package/dist/components/Mappings/ComponentMapping/ComponentRoleMapping.js +98 -0
  51. package/dist/components/Mappings/ComponentMapping/componentRoleColumns.d.ts +3 -0
  52. package/dist/components/Mappings/ComponentMapping/componentRoleColumns.js +29 -0
  53. package/dist/components/Mappings/MappingForm/MappingForm.d.ts +35 -0
  54. package/dist/components/Mappings/MappingForm/MappingForm.js +142 -0
  55. package/dist/components/Mappings/MappingForm/mappingSchema.d.ts +23 -0
  56. package/dist/components/Mappings/MappingForm/mappingSchema.js +32 -0
  57. package/dist/components/Mappings/RoleMapping/MappingFormUserRole.d.ts +5 -0
  58. package/dist/components/Mappings/RoleMapping/MappingFormUserRole.js +194 -0
  59. package/dist/components/Mappings/RoleMapping/UserRoleTableColumns.d.ts +3 -0
  60. package/dist/components/Mappings/RoleMapping/UserRoleTableColumns.js +33 -0
  61. package/dist/components/NavBar/Sidebar.d.ts +4 -0
  62. package/dist/components/NavBar/Sidebar.js +56 -0
  63. package/dist/components/ProfileForm/ProfileForm.d.ts +3 -0
  64. package/dist/components/ProfileForm/ProfileForm.js +190 -0
  65. package/dist/components/ProfileForm/ProfileList.d.ts +3 -0
  66. package/dist/components/ProfileForm/ProfileList.js +33 -0
  67. package/dist/components/ProfileForm/profileColumns.d.ts +3 -0
  68. package/dist/components/ProfileForm/profileColumns.js +67 -0
  69. package/dist/components/ProfileForm/profileSchema.d.ts +52 -0
  70. package/dist/components/ProfileForm/profileSchema.js +50 -0
  71. package/dist/components/SettingsPage/SettingsPage.d.ts +3 -0
  72. package/dist/components/SettingsPage/SettingsPage.js +240 -0
  73. package/dist/components/api/settings-api.d.ts +26 -0
  74. package/dist/components/api/settings-api.js +131 -0
  75. package/dist/components/common/Form/FormActionButtons.d.ts +11 -0
  76. package/dist/components/common/Form/FormActionButtons.js +6 -0
  77. package/dist/components/common/Form/FormLabel.d.ts +8 -0
  78. package/dist/components/common/Form/FormLabel.js +6 -0
  79. package/dist/components/common/ListTable/ListHeader.d.ts +8 -0
  80. package/dist/components/common/ListTable/ListHeader.js +5 -0
  81. package/dist/components/common/ListTable/ListTable.d.ts +17 -0
  82. package/dist/components/common/ListTable/ListTable.js +31 -0
  83. package/dist/components/common/Modal/Modal.d.ts +11 -0
  84. package/dist/components/common/Modal/Modal.js +6 -0
  85. package/dist/config/EnvConfig.d.ts +13 -0
  86. package/dist/config/EnvConfig.js +13 -0
  87. package/dist/config/amplifyConfig.d.ts +1 -0
  88. package/dist/config/amplifyConfig.js +45 -0
  89. package/dist/configureAppHost.d.ts +6 -0
  90. package/dist/configureAppHost.js +5 -0
  91. package/dist/customGraphQL/customMutations.d.ts +3 -0
  92. package/dist/customGraphQL/customMutations.js +53 -0
  93. package/dist/customGraphQL/customQueries.d.ts +7 -0
  94. package/dist/customGraphQL/customQueries.js +104 -0
  95. package/dist/domain/input/input-types.d.ts +47 -0
  96. package/dist/domain/input/input-types.js +1 -0
  97. package/dist/domain/model/BranchDto.d.ts +9 -0
  98. package/dist/domain/model/BranchDto.js +8 -0
  99. package/dist/domain/model/ComponentMappingDto.d.ts +24 -0
  100. package/dist/domain/model/ComponentMappingDto.js +19 -0
  101. package/dist/domain/model/MappingDto.d.ts +30 -0
  102. package/dist/domain/model/MappingDto.js +16 -0
  103. package/dist/domain/model/PrefixDescriptionDto.d.ts +16 -0
  104. package/dist/domain/model/PrefixDescriptionDto.js +13 -0
  105. package/dist/domain/model/ProfileDto.d.ts +21 -0
  106. package/dist/domain/model/ProfileDto.js +20 -0
  107. package/dist/domain/model/RoleMappingDto.d.ts +14 -0
  108. package/dist/domain/model/RoleMappingDto.js +19 -0
  109. package/dist/domain/model/SettingsDto.d.ts +8 -0
  110. package/dist/domain/model/SettingsDto.js +7 -0
  111. package/dist/domain/model/UserMappingDto.d.ts +14 -0
  112. package/dist/domain/model/UserMappingDto.js +28 -0
  113. package/dist/domain/model/imageDto.d.ts +4 -0
  114. package/dist/domain/model/imageDto.js +1 -0
  115. package/dist/domain/type/EntityTypes.d.ts +5 -0
  116. package/dist/domain/type/EntityTypes.js +6 -0
  117. package/dist/domain/type/MappingOptions.d.ts +5 -0
  118. package/dist/domain/type/MappingOptions.js +1 -0
  119. package/dist/domain/type/MappingTypes.d.ts +6 -0
  120. package/dist/domain/type/MappingTypes.js +7 -0
  121. package/dist/domain/type/Nullable.d.ts +13 -0
  122. package/dist/domain/type/Nullable.js +1 -0
  123. package/dist/domain/type/ResettingPeriodOptions.d.ts +2 -0
  124. package/dist/domain/type/ResettingPeriodOptions.js +8 -0
  125. package/dist/domain/type/RolesEnum.d.ts +6 -0
  126. package/dist/domain/type/RolesEnum.js +7 -0
  127. package/dist/domain/type/SelectType.d.ts +16 -0
  128. package/dist/domain/type/SelectType.js +1 -0
  129. package/dist/domain/type/StatusEnum.d.ts +5 -0
  130. package/dist/domain/type/StatusEnum.js +6 -0
  131. package/dist/domain/type/signUpOptions.d.ts +2 -0
  132. package/dist/domain/type/signUpOptions.js +4 -0
  133. package/dist/domain/type/statusOptions.d.ts +2 -0
  134. package/dist/domain/type/statusOptions.js +4 -0
  135. package/dist/graphql/profileQueries.d.ts +4 -0
  136. package/dist/graphql/profileQueries.js +89 -0
  137. package/dist/hoc/withSyzyAuth.d.ts +2 -0
  138. package/dist/hoc/withSyzyAuth.js +87 -0
  139. package/dist/hooks/useCurrentUser.d.ts +3 -0
  140. package/dist/hooks/useCurrentUser.js +6 -0
  141. package/dist/hooks/useDispatch.d.ts +3 -0
  142. package/dist/hooks/useDispatch.js +7 -0
  143. package/dist/hooks/usePermission.d.ts +1 -0
  144. package/dist/hooks/usePermission.js +7 -0
  145. package/dist/index.d.ts +3 -0
  146. package/dist/index.js +3 -15
  147. package/dist/main.d.ts +4 -0
  148. package/dist/main.js +60 -0
  149. package/dist/services/Client.Service.d.ts +12 -0
  150. package/dist/services/Client.Service.js +96 -0
  151. package/dist/services/Storage-service.d.ts +2 -0
  152. package/dist/services/Storage-service.js +26 -0
  153. package/dist/services/navigationMenu.d.ts +1 -0
  154. package/dist/services/navigationMenu.js +9 -0
  155. package/dist/static/constants.d.ts +34 -0
  156. package/dist/static/constants.js +34 -0
  157. package/dist/store/AppAction.d.ts +11 -0
  158. package/dist/store/AppAction.js +5 -0
  159. package/dist/store/AppContext.d.ts +3 -0
  160. package/dist/store/AppContext.js +3 -0
  161. package/dist/store/AppContextType.d.ts +12 -0
  162. package/dist/store/AppContextType.js +6 -0
  163. package/dist/store/AppProvider.d.ts +7 -0
  164. package/dist/store/AppProvider.js +32 -0
  165. package/dist/store/HostedInContainerContext.d.ts +5 -0
  166. package/dist/store/HostedInContainerContext.js +11 -0
  167. package/dist/store/SesssionReducer.d.ts +4 -0
  168. package/dist/store/SesssionReducer.js +16 -0
  169. package/dist/types.d.ts +26 -0
  170. package/dist/types.js +14 -0
  171. package/dist/util/AuthUtils.d.ts +1 -0
  172. package/dist/util/AuthUtils.js +10 -0
  173. package/dist/util/LogEnum.d.ts +6 -0
  174. package/dist/util/LogEnum.js +7 -0
  175. package/dist/util/Logger.d.ts +6 -0
  176. package/dist/util/Logger.js +18 -0
  177. package/dist/util/SyzyDate.d.ts +69 -0
  178. package/dist/util/SyzyDate.js +265 -0
  179. package/dist/util/dateUtils.d.ts +10 -0
  180. package/dist/util/dateUtils.js +24 -0
  181. package/dist/util/hostedinContainer.d.ts +1 -0
  182. package/dist/util/hostedinContainer.js +9 -0
  183. package/dist/util/model-types.d.ts +96 -0
  184. package/dist/util/model-types.js +18 -0
  185. package/dist/util/prefixAndResettingValidation.d.ts +9 -0
  186. package/dist/util/prefixAndResettingValidation.js +54 -0
  187. package/dist/util/transformToData.d.ts +1 -0
  188. package/dist/util/transformToData.js +9 -0
  189. package/package.json +14 -9
  190. package/dist/__federation_shared_@tanstack/react-query-DHuUsaNz.js +0 -2517
  191. package/dist/__federation_shared_react-CikWE6qG.js +0 -7
  192. package/dist/__federation_shared_react-bootstrap-BKlZRvMR.js +0 -7516
  193. package/dist/__federation_shared_react-dom-vrQ70Ay8.js +0 -372
  194. package/dist/__federation_shared_react-router-dom-BKminmS4.js +0 -10448
  195. package/dist/__federation_shared_react-select-B6kehBDI.js +0 -4056
  196. package/dist/__federation_shared_react-toastify-B0S0UGr3.js +0 -412
  197. package/dist/_commonjsHelpers-C6fGbg64.js +0 -6
  198. package/dist/_virtual___federation_fn_import-XZCKozko.js +0 -217
  199. package/dist/favicon.ico +0 -0
  200. package/dist/index-DgtWMtjZ.js +0 -184
  201. package/dist/index-eZknuYwc.js +0 -1219
  202. package/dist/jsx-runtime-D_t4bG-_.js +0 -264
  203. package/dist/manifest.webmanifest +0 -1
  204. package/dist/pwa/Hotel-icon.jpg +0 -0
  205. package/dist/pwa/apple-touch-icon-180x180.png +0 -0
  206. package/dist/pwa/favicon.ico +0 -0
  207. package/dist/pwa/maskable-icon-512x512.png +0 -0
  208. package/dist/pwa/pwa-192x192.png +0 -0
  209. package/dist/pwa/pwa-512x512.png +0 -0
  210. package/dist/pwa/pwa-64x64.png +0 -0
  211. package/dist/registerSW.js +0 -1
  212. package/dist/sw.js +0 -1
  213. package/dist/workbox-1ef09536.js +0 -1
@@ -0,0 +1,240 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { useContext, useEffect, useState } from "react";
3
+ import { transformdToPrefixDescription, useGetSettingsByPk, useUpdateSettingsMutation } from "../api/settings-api";
4
+ import { Button, Card, Col, Container, Form, Modal, Row } from "react-bootstrap";
5
+ import { toast } from "react-toastify";
6
+ import { BsPencilSquare, BsCheckCircle, BsXCircle, BsInfoCircle } from "react-icons/bs";
7
+ import './SettingsPage.css';
8
+ import { ALL, BOOKING_RECEIPT_PREFIX_FORMAT, BOOKING_RECEIPT_RESETTING_PERIOD, BOOKING_RECEIPT_SEQUENCE_PADDING, BOOKING_RECEIPT_SERIES_NUMBER, HIDE_SIGN_UP, INVOICE_PREFIX_FORMAT, INVOICE_RESETTING_PERIOD, INVOICE_SEQUENCE_PADDING, INVOICE_SERIES_NUMBER, NEVER, PURCHASE_ORDER_PREFIX_FORMAT, PURCHASE_ORDER_RESETTING_PERIOD, PURCHASE_ORDER_SEQUENCE_PADDING, RESERVATION_PREFIX_FORMAT, RESERVATION_RESETTING_PERIOD, RESERVATION_SEQUENCE_PADDING } from "../../static/constants";
9
+ import Select from "react-select";
10
+ import { ResettingPeriodOptions } from "../../domain/type/ResettingPeriodOptions";
11
+ import { initPrefixDescription } from "../../domain/model/PrefixDescriptionDto";
12
+ import { resettingOptions, validateFirstOccurance, validateFullWrapper } from "../../util/prefixAndResettingValidation";
13
+ import { logger } from "../../util/Logger";
14
+ import AppContext from "../../store/AppContext";
15
+ import { sighUpOptions } from "../../domain/type/signUpOptions";
16
+ import { Roles } from "../../domain/type/RolesEnum";
17
+ const SettingsPage = () => {
18
+ const { user } = useContext(AppContext) ?? { user: undefined };
19
+ const rawBranch = user?.branchId ?? "";
20
+ const parts = rawBranch.split("#");
21
+ const branchId = parts[1];
22
+ const userRoles = user?.roles ?? [];
23
+ const { settingsByPK } = useGetSettingsByPk(branchId);
24
+ const updateSettingsMutation = useUpdateSettingsMutation();
25
+ const [editStates, setEditStates] = useState({});
26
+ const [activeEditKey, setActiveEditKey] = useState(null);
27
+ const defaultInvResettingPeriodOption = ResettingPeriodOptions.find(option => option.value === "");
28
+ const [selectedInvResettingPeriod, setSelectedInvResettingPeriod] = useState(defaultInvResettingPeriodOption);
29
+ const defaultPurchaseOrderResetPeriodOption = ResettingPeriodOptions.find(option => option.value === "");
30
+ const [selectedPurchaseOrderResettingPeriod, setSelectedPurchaseOrdResettingPeriod] = useState(defaultPurchaseOrderResetPeriodOption);
31
+ const defaultReservationResetPeriodOption = ResettingPeriodOptions.find(option => option.value === "");
32
+ const [selectedReservationResettingPeriod, setSelectedReservationResettingPeriod] = useState(defaultReservationResetPeriodOption);
33
+ const defaultBookingReceiptResetPeriodOption = ResettingPeriodOptions.find(option => option.value === "");
34
+ const [selectedBookingReceiptResettingPeriod, setSelectedBookingReceiptResettingPeriod] = useState(defaultBookingReceiptResetPeriodOption);
35
+ const [showPrefixInfo, setShowPrefixInfo] = useState(false);
36
+ const [prefixDescription, setPrefixDescription] = useState(initPrefixDescription);
37
+ const defaultSignUpOption = sighUpOptions.find(option => option.value === "");
38
+ const [selectedSignUpOption, setSelectedSighUpOPtion] = useState(defaultSignUpOption);
39
+ useEffect(() => {
40
+ if (settingsByPK && settingsByPK.length > 0) {
41
+ const invResetPeriod = settingsByPK.find((setting) => setting.sk === INVOICE_RESETTING_PERIOD);
42
+ const purchaseOrdResetPeriod = settingsByPK.find((setting) => setting.sk === PURCHASE_ORDER_RESETTING_PERIOD);
43
+ const reservationResetPeriod = settingsByPK.find((setting) => setting.sk === RESERVATION_RESETTING_PERIOD);
44
+ const bookingReceiptResetPeriod = settingsByPK.find((setting) => setting.sk === BOOKING_RECEIPT_RESETTING_PERIOD);
45
+ const hideSignUp = settingsByPK.find((setting) => setting.sk === HIDE_SIGN_UP);
46
+ setSelectedInvResettingPeriod({ label: invResetPeriod?.value ?? '', value: invResetPeriod?.sk ?? '' });
47
+ setSelectedPurchaseOrdResettingPeriod({ label: purchaseOrdResetPeriod?.value ?? '', value: purchaseOrdResetPeriod?.sk ?? '' });
48
+ setSelectedReservationResettingPeriod({ label: reservationResetPeriod?.value ?? '', value: reservationResetPeriod?.sk ?? '' });
49
+ setSelectedBookingReceiptResettingPeriod({ label: bookingReceiptResetPeriod?.value ?? '', value: bookingReceiptResetPeriod?.sk ?? '' });
50
+ setSelectedSighUpOPtion({ label: hideSignUp?.value ?? '', value: hideSignUp?.sk ?? '' });
51
+ }
52
+ }, [settingsByPK]);
53
+ const handleEdit = (sk, currentValue) => {
54
+ setActiveEditKey(sk);
55
+ setEditStates((prev) => ({
56
+ ...prev,
57
+ [sk]: { isEditing: true, value: currentValue }
58
+ }));
59
+ };
60
+ const handleCancel = (sk) => {
61
+ setActiveEditKey(null);
62
+ setEditStates((prev) => ({
63
+ ...prev,
64
+ [sk]: { isEditing: false, value: prev[sk]?.value || "" },
65
+ }));
66
+ };
67
+ const handleChange = (sk, newValue) => {
68
+ setEditStates((prev) => ({ ...prev, [sk]: { ...prev[sk], value: newValue }, }));
69
+ };
70
+ const handleResettingPeriodChange = (sk, selectedOption) => {
71
+ if (selectedOption) {
72
+ const selectedVal = selectedOption.value;
73
+ setEditStates((prev) => ({ ...prev, [sk]: { ...prev[sk], value: selectedVal }, }));
74
+ if (sk === INVOICE_RESETTING_PERIOD) {
75
+ setSelectedInvResettingPeriod({ label: selectedVal, value: sk ?? '' });
76
+ }
77
+ else if (sk === PURCHASE_ORDER_RESETTING_PERIOD) {
78
+ setSelectedPurchaseOrdResettingPeriod({ label: selectedVal, value: sk ?? '' });
79
+ }
80
+ else if (sk === RESERVATION_RESETTING_PERIOD) {
81
+ setSelectedReservationResettingPeriod({ label: selectedVal, value: sk ?? '' });
82
+ }
83
+ else if (sk === BOOKING_RECEIPT_RESETTING_PERIOD) {
84
+ setSelectedBookingReceiptResettingPeriod({ label: selectedVal, value: sk ?? '' });
85
+ }
86
+ }
87
+ };
88
+ const upsertSettingsMutationFn = (settingsData) => {
89
+ try {
90
+ return new Promise((resolve, reject) => {
91
+ updateSettingsMutation.mutate(settingsData, {
92
+ onSuccess: (_res) => {
93
+ toast.success("Settings update successfully!");
94
+ resolve();
95
+ },
96
+ onError: (err) => {
97
+ toast.error("Error while request the Product");
98
+ reject(err);
99
+ }
100
+ });
101
+ });
102
+ }
103
+ catch (err) {
104
+ logger.error("error at product request updation", err);
105
+ }
106
+ };
107
+ const validatePrefixResetting = (prefixSk, resetSk) => {
108
+ const prefix = editStates[prefixSk]?.value ||
109
+ settingsByPK?.find(s => s.sk === prefixSk)?.value || "";
110
+ const resettingPeriod = editStates[resetSk]?.value ||
111
+ settingsByPK?.find(s => s.sk === resetSk)?.value || "";
112
+ const allowedPrefix = /^[a-zA-Z]+$/.test(prefix);
113
+ if (allowedPrefix) {
114
+ return true; // bypass resetting validation for custom prefixes
115
+ }
116
+ const allowedPeriods = getAllowedResettingPeriods(prefix).map(opt => opt.value);
117
+ if (!allowedPeriods.includes(resettingPeriod)) {
118
+ toast.info("Resetting period is not suitable for prefix format. Please select other resetting options before updating prefix.");
119
+ return false;
120
+ }
121
+ return true;
122
+ };
123
+ const handleUpdate = (settingData) => {
124
+ const newValue = editStates[settingData.sk]?.value;
125
+ // ✅ Series number validation (must be greater than existing)
126
+ if (settingData.sk === INVOICE_SERIES_NUMBER ||
127
+ settingData.sk === BOOKING_RECEIPT_SERIES_NUMBER) {
128
+ const existingValue = Number(settingData.value);
129
+ const enteredValue = Number(newValue);
130
+ if (isNaN(enteredValue)) {
131
+ toast.error("Please enter a valid number.");
132
+ return;
133
+ }
134
+ if (enteredValue <= existingValue) {
135
+ toast.error(`New series number must be greater than existing value (${existingValue}).`);
136
+ return;
137
+ }
138
+ }
139
+ const allowedPrefix = (settingData.sk === INVOICE_PREFIX_FORMAT || settingData.sk === BOOKING_RECEIPT_PREFIX_FORMAT) && /^[a-zA-Z]+$/.test(newValue);
140
+ // check allowed predefined constant usage -----
141
+ if (settingData.sk === INVOICE_PREFIX_FORMAT || settingData.sk === PURCHASE_ORDER_PREFIX_FORMAT || settingData.sk === RESERVATION_PREFIX_FORMAT || settingData.sk === BOOKING_RECEIPT_PREFIX_FORMAT) {
142
+ const invalidWrapper = validateFullWrapper(newValue);
143
+ if (invalidWrapper && !allowedPrefix) {
144
+ toast.info("Predefined constants only allowed. Please check the prefix format.");
145
+ return; // stop update
146
+ }
147
+ }
148
+ // first occurance check-------------
149
+ if (settingData.sk === INVOICE_PREFIX_FORMAT || settingData.sk === PURCHASE_ORDER_PREFIX_FORMAT || settingData.sk === RESERVATION_PREFIX_FORMAT || settingData.sk === BOOKING_RECEIPT_PREFIX_FORMAT) {
150
+ const { firstWrapper, validTokens } = validateFirstOccurance(newValue);
151
+ if (!allowedPrefix) {
152
+ if (!firstWrapper || !validTokens.includes(firstWrapper)) {
153
+ toast.info("Predefined constant must start with {FY}, {fy}, {Y}, {y}, {M}, or {D}.");
154
+ return;
155
+ }
156
+ }
157
+ }
158
+ // check prefix and resetting combination ----------
159
+ if (settingData.sk === INVOICE_PREFIX_FORMAT || settingData.sk === INVOICE_RESETTING_PERIOD) {
160
+ if (!validatePrefixResetting(INVOICE_PREFIX_FORMAT, INVOICE_RESETTING_PERIOD))
161
+ return;
162
+ }
163
+ if (settingData.sk === PURCHASE_ORDER_PREFIX_FORMAT || settingData.sk === PURCHASE_ORDER_RESETTING_PERIOD) {
164
+ if (!validatePrefixResetting(PURCHASE_ORDER_PREFIX_FORMAT, PURCHASE_ORDER_RESETTING_PERIOD))
165
+ return;
166
+ }
167
+ if (settingData.sk === RESERVATION_PREFIX_FORMAT || settingData.sk === RESERVATION_RESETTING_PERIOD) {
168
+ if (!validatePrefixResetting(RESERVATION_PREFIX_FORMAT, RESERVATION_RESETTING_PERIOD))
169
+ return;
170
+ }
171
+ if (settingData.sk === BOOKING_RECEIPT_PREFIX_FORMAT || settingData.sk === BOOKING_RECEIPT_RESETTING_PERIOD) {
172
+ if (!validatePrefixResetting(BOOKING_RECEIPT_PREFIX_FORMAT, BOOKING_RECEIPT_RESETTING_PERIOD))
173
+ return;
174
+ }
175
+ setActiveEditKey(null);
176
+ setEditStates((prev) => ({
177
+ ...prev,
178
+ [settingData.sk]: { isEditing: false, value: newValue || "" }
179
+ }));
180
+ settingData.value = newValue;
181
+ // don't change pk for sign up option if super admin
182
+ settingData.pk = (settingData.pk === ALL && settingData.sk === HIDE_SIGN_UP && userRoles.includes(Roles.SuperAdmin)) ? settingData.pk : branchId;
183
+ upsertSettingsMutationFn(settingData);
184
+ };
185
+ const getAllowedResettingPeriods = (prefix) => {
186
+ if (!prefix) {
187
+ return ResettingPeriodOptions.filter(opt => opt.value === NEVER);
188
+ }
189
+ const firstMatch = resettingOptions(prefix);
190
+ if (firstMatch) {
191
+ return ResettingPeriodOptions.filter(opt => firstMatch.periods.includes(opt.value));
192
+ }
193
+ // NONE prefix → only NEVER
194
+ return ResettingPeriodOptions.filter(opt => opt.value === NEVER);
195
+ };
196
+ const handleSignUpOptionChange = (sk, selectedOption) => {
197
+ if (selectedOption) {
198
+ const selectedVal = selectedOption.value;
199
+ setEditStates((prev) => ({ ...prev, [sk]: { ...prev[sk], value: selectedVal }, }));
200
+ setSelectedSighUpOPtion({ label: selectedVal, value: sk ?? '' });
201
+ }
202
+ };
203
+ return (_jsxs(Container, { className: "mt-4", children: [settingsByPK && settingsByPK.length > 0 && (_jsxs(Card, { className: "shadow-lg settings-card", children: [_jsx(Card.Header, { className: "fw-bold", children: "Settings" }), _jsx(Card.Body, { children: settingsByPK.map((setting) => {
204
+ const editState = editStates[setting.sk] || { isEditing: false, value: setting.value };
205
+ const isActive = activeEditKey === setting.sk;
206
+ return (_jsxs(Row, { className: "align-items-center mb-3", children: [_jsxs(Col, { xs: 3, sm: 3, md: 3, lg: 5, xl: 5, className: "fw-bold settings-key-col", children: [setting.pk === ALL && setting.sk === HIDE_SIGN_UP && !userRoles.includes(Roles.SuperAdmin) ? "" : setting.sk, (setting.sk === INVOICE_PREFIX_FORMAT || setting.sk === PURCHASE_ORDER_PREFIX_FORMAT || setting.sk === RESERVATION_PREFIX_FORMAT || setting.sk === BOOKING_RECEIPT_PREFIX_FORMAT) && (_jsx(Button, { size: "sm", variant: "link", className: "ms-2 p-0 text-info mb-1", onClick: () => {
207
+ setShowPrefixInfo(true);
208
+ setPrefixDescription(transformdToPrefixDescription(setting.description));
209
+ }, children: _jsx(BsInfoCircle, { className: "info-icon" }) }))] }), _jsx(Col, { xs: 3, sm: 3, md: 5, lg: 5, xl: 5, className: "settings-value-col", children: !isActive ? (_jsx("span", { children: setting.pk === ALL && setting.sk === HIDE_SIGN_UP && !userRoles.includes(Roles.SuperAdmin) ? "" : setting.value })) : (_jsxs(_Fragment, { children: [(setting.sk === INVOICE_RESETTING_PERIOD || setting.sk === PURCHASE_ORDER_RESETTING_PERIOD || setting.sk === RESERVATION_RESETTING_PERIOD || setting.sk === BOOKING_RECEIPT_RESETTING_PERIOD) ?
210
+ _jsx(Select, { options: getAllowedResettingPeriods(setting.sk === INVOICE_RESETTING_PERIOD
211
+ ? settingsByPK.find(s => s.sk === INVOICE_PREFIX_FORMAT)?.value ?? ""
212
+ : setting.sk === PURCHASE_ORDER_RESETTING_PERIOD
213
+ ? settingsByPK.find(s => s.sk === PURCHASE_ORDER_PREFIX_FORMAT)?.value ?? ""
214
+ : setting.sk === RESERVATION_RESETTING_PERIOD
215
+ ? settingsByPK.find(s => s.sk === RESERVATION_PREFIX_FORMAT)?.value ?? ""
216
+ : settingsByPK.find(s => s.sk === BOOKING_RECEIPT_PREFIX_FORMAT)?.value ?? ""), value: setting.sk === INVOICE_RESETTING_PERIOD
217
+ ? selectedInvResettingPeriod
218
+ : setting.sk === PURCHASE_ORDER_RESETTING_PERIOD
219
+ ? selectedPurchaseOrderResettingPeriod
220
+ : setting.sk === RESERVATION_RESETTING_PERIOD
221
+ ? selectedReservationResettingPeriod
222
+ : selectedBookingReceiptResettingPeriod, onChange: (selectedOption) => selectedOption && handleResettingPeriodChange(setting.sk, selectedOption), placeholder: "Select resetting period", className: "resetting-period-select", maxMenuHeight: 200 }) : (setting.pk === ALL && setting.sk === HIDE_SIGN_UP && userRoles.includes(Roles.SuperAdmin)) ?
223
+ _jsx(Select, { options: sighUpOptions, value: selectedSignUpOption, onChange: (selectedOption) => selectedOption && handleSignUpOptionChange(setting.sk, selectedOption), placeholder: "Select Sign up option", className: "resetting-period-select", maxMenuHeight: 200 }) :
224
+ (setting.sk === INVOICE_PREFIX_FORMAT ||
225
+ setting.sk === PURCHASE_ORDER_PREFIX_FORMAT ||
226
+ setting.sk === RESERVATION_PREFIX_FORMAT ||
227
+ setting.sk === BOOKING_RECEIPT_PREFIX_FORMAT ||
228
+ setting.sk === INVOICE_SEQUENCE_PADDING ||
229
+ setting.sk === PURCHASE_ORDER_SEQUENCE_PADDING ||
230
+ setting.sk === RESERVATION_SEQUENCE_PADDING ||
231
+ setting.sk === BOOKING_RECEIPT_SEQUENCE_PADDING ||
232
+ setting.sk === INVOICE_SERIES_NUMBER ||
233
+ setting.sk === BOOKING_RECEIPT_SERIES_NUMBER) ?
234
+ _jsx(Form.Control, { type: (setting.sk === INVOICE_SEQUENCE_PADDING || setting.sk === PURCHASE_ORDER_SEQUENCE_PADDING || setting.sk === RESERVATION_SEQUENCE_PADDING || setting.sk === BOOKING_RECEIPT_SEQUENCE_PADDING) ? 'number' : 'text', value: editState.value, onChange: (e) => handleChange(setting.sk, e.target.value), className: "settings-value-form-control" })
235
+ : null, ((setting.sk === INVOICE_SEQUENCE_PADDING) || (setting.sk === PURCHASE_ORDER_SEQUENCE_PADDING) || (setting.sk === RESERVATION_SEQUENCE_PADDING) || (setting.sk === BOOKING_RECEIPT_SEQUENCE_PADDING)) &&
236
+ _jsx("label", { className: "seq-pad-info text-primary", children: setting.description })] })) }), setting.pk === ALL && setting.sk === HIDE_SIGN_UP && !userRoles.includes(Roles.SuperAdmin) ? null :
237
+ _jsx(Col, { xs: 3, sm: 3, md: 4, lg: 5, xl: 5, className: "text-end settings-btns", children: !isActive ? (_jsx(Button, { size: "sm", variant: "outline-primary", className: "edit-btn", onClick: () => handleEdit(setting.sk, setting.value), children: _jsx(BsPencilSquare, {}) })) : (_jsxs(_Fragment, { children: [_jsx(Button, { size: "sm", variant: "success", className: "me-2 update-btn", onClick: () => handleUpdate(setting), children: _jsx(BsCheckCircle, {}) }), _jsx(Button, { size: "sm", variant: "secondary", className: "cancel-btn", onClick: () => handleCancel(setting.sk), children: _jsx(BsXCircle, {}) })] })) })] }, setting.sk));
238
+ }) })] })), _jsxs(Modal, { show: showPrefixInfo, onHide: () => setShowPrefixInfo(false), size: "lg", centered: true, children: [_jsx(Modal.Header, { closeButton: true, children: _jsx(Modal.Title, { children: "Prefix Format Info" }) }), _jsxs(Modal.Body, { children: [_jsx("p", { className: "fw-bold", children: prefixDescription.message }), prefixDescription.constants.map((constant, index) => (_jsxs("p", { children: [constant.constant, " - ", constant.description] }, index))), _jsx("b", { className: "text-success", children: "Example:" }), _jsxs("p", { children: [_jsx("strong", { children: "Prefix:" }), " ", prefixDescription.example.prefixFormat] }), _jsxs("p", { children: [_jsx("strong", { children: "Result:" }), " ", prefixDescription.example.outputValue] })] }), _jsx(Modal.Footer, { children: _jsx(Button, { variant: "secondary", onClick: () => setShowPrefixInfo(false), children: "Close" }) })] })] }));
239
+ };
240
+ export default SettingsPage;
@@ -0,0 +1,26 @@
1
+ import { SettingsDto } from "../../domain/model/SettingsDto";
2
+ import { UndefinedString } from "../../domain/type/Nullable";
3
+ import { PrefixDescription } from "../../domain/model/PrefixDescriptionDto";
4
+ export declare const GET_SETTINGS_BY_PK: string;
5
+ export declare const GET_SETTINGS_BY_PK_AND_SK: string;
6
+ export declare const listSettings = "query listSettings(\n $pk: ID\n $sk: ModelStringKeyConditionInput\n $filter: ModelSettingsFilterInput\n) {\n listSettings(pk: $pk, sk: $sk, filter: $filter) {\n pk\n sk\n value\n description\n createdDt\n __typename\n }\n}";
7
+ export declare const updateSettings = "mutation updateSettings($input: SettingsInput!) {\n updateSettings(input: $input) {\n pk\n sk\n value\n description\n createdDt\n __typename\n }\n}";
8
+ export declare const transformtoSettingsDto: (interviewProspectData: any) => SettingsDto;
9
+ export declare const transformdToPrefixDescription: (description: string) => PrefixDescription;
10
+ export declare const getSettingsByPkFun: (pk: UndefinedString) => Promise<SettingsDto[]>;
11
+ export declare const useGetSettingsByPk: (pk: string) => {
12
+ settingsByPK: SettingsDto[] | undefined;
13
+ settingsByPKError: Error | null;
14
+ settingsByPKLoading: boolean;
15
+ settingsByPKFetching: boolean;
16
+ settingsByPKSuccess: boolean;
17
+ };
18
+ export declare const getSettingsByPkAndSKFun: (pk: UndefinedString, sk: UndefinedString) => Promise<SettingsDto>;
19
+ export declare const useGetSettingsByPkAndSk: (pk: string, sk: string) => {
20
+ settingsByPkAndSk: SettingsDto | undefined;
21
+ settingsByPkAndSkError: Error | null;
22
+ settingsByPkAndSkLoading: boolean;
23
+ settingsByPkAndSkFetching: boolean;
24
+ settingsByPkAndSkSuccess: boolean;
25
+ };
26
+ export declare const useUpdateSettingsMutation: () => import("@tanstack/react-query").UseMutationResult<import("@aws-amplify/api-graphql").GraphQLResult<any> | import("@aws-amplify/api-graphql").GraphqlSubscriptionResult<any>, Error, SettingsDto, unknown>;
@@ -0,0 +1,131 @@
1
+ import { keepPreviousData, useMutation, useQuery, useQueryClient } from "@tanstack/react-query";
2
+ import { EnvConfig } from "../../config/EnvConfig";
3
+ import { initSettings } from "../../domain/model/SettingsDto";
4
+ import { Client } from "../../services/Client.Service";
5
+ import { transformToData } from "../../util/transformToData";
6
+ import { logger } from "../../util/Logger";
7
+ import { ALL } from "../../static/constants";
8
+ export const GET_SETTINGS_BY_PK = "settingsbypk";
9
+ export const GET_SETTINGS_BY_PK_AND_SK = "settingsbypkandsk";
10
+ const endpoint = EnvConfig.appHostAPi;
11
+ export const listSettings = `query listSettings(
12
+ $pk: ID
13
+ $sk: ModelStringKeyConditionInput
14
+ $filter: ModelSettingsFilterInput
15
+ ) {
16
+ listSettings(pk: $pk, sk: $sk, filter: $filter) {
17
+ pk
18
+ sk
19
+ value
20
+ description
21
+ createdDt
22
+ __typename
23
+ }
24
+ }`;
25
+ export const updateSettings = `mutation updateSettings($input: SettingsInput!) {
26
+ updateSettings(input: $input) {
27
+ pk
28
+ sk
29
+ value
30
+ description
31
+ createdDt
32
+ __typename
33
+ }
34
+ }`;
35
+ export const transformtoSettingsDto = (interviewProspectData) => transformToData(interviewProspectData);
36
+ export const transformdToPrefixDescription = (description) => {
37
+ return JSON.parse(description);
38
+ };
39
+ export const getSettingsByPkFun = async (pk) => {
40
+ try {
41
+ const client = await Client.getCustomGraphqlClient(endpoint);
42
+ const variables = {
43
+ filter: {
44
+ or: [
45
+ { pk: { eq: pk } },
46
+ { pk: { eq: ALL } }
47
+ ]
48
+ }
49
+ };
50
+ const response = await client.request(listSettings, variables);
51
+ const settingsData = response.listSettings;
52
+ return (settingsData && settingsData.length > 0) ? settingsData.map((eventSchedule) => transformtoSettingsDto(eventSchedule)) : [];
53
+ }
54
+ catch (error) {
55
+ return [];
56
+ }
57
+ };
58
+ export const useGetSettingsByPk = (pk) => {
59
+ const { data, isLoading, error, isFetching, isSuccess } = useQuery({
60
+ queryKey: [GET_SETTINGS_BY_PK, pk],
61
+ queryFn: () => getSettingsByPkFun(pk),
62
+ placeholderData: keepPreviousData,
63
+ staleTime: 1000 * 5 * 60,
64
+ enabled: pk !== "" && pk !== undefined,
65
+ });
66
+ return {
67
+ settingsByPK: data,
68
+ settingsByPKError: error,
69
+ settingsByPKLoading: isLoading,
70
+ settingsByPKFetching: isFetching,
71
+ settingsByPKSuccess: isSuccess,
72
+ };
73
+ };
74
+ export const getSettingsByPkAndSKFun = async (pk, sk) => {
75
+ try {
76
+ const client = await Client.getCustomGraphqlClient(endpoint);
77
+ const variables = {
78
+ pk: pk,
79
+ sk: {
80
+ eq: sk
81
+ }
82
+ };
83
+ const response = await client.request(listSettings, variables);
84
+ const settingsData = response.listSettings;
85
+ return (settingsData && settingsData.length > 0) ? transformtoSettingsDto(settingsData[0]) : initSettings;
86
+ }
87
+ catch (error) {
88
+ return initSettings;
89
+ }
90
+ };
91
+ export const useGetSettingsByPkAndSk = (pk, sk) => {
92
+ const { data, isLoading, error, isFetching, isSuccess } = useQuery({
93
+ queryKey: [GET_SETTINGS_BY_PK_AND_SK, pk, sk],
94
+ queryFn: () => getSettingsByPkAndSKFun(pk, sk),
95
+ placeholderData: keepPreviousData,
96
+ staleTime: 1000 * 5 * 60,
97
+ enabled: pk !== "" && pk !== undefined && sk !== "" && sk !== undefined,
98
+ });
99
+ return {
100
+ settingsByPkAndSk: data,
101
+ settingsByPkAndSkError: error,
102
+ settingsByPkAndSkLoading: isLoading,
103
+ settingsByPkAndSkFetching: isFetching,
104
+ settingsByPkAndSkSuccess: isSuccess,
105
+ };
106
+ };
107
+ export const useUpdateSettingsMutation = () => {
108
+ async function createVersionFn(settingsData) {
109
+ const client = await Client.getClient();
110
+ const response = await client.graphql({
111
+ query: updateSettings,
112
+ variables: {
113
+ input: settingsData
114
+ },
115
+ });
116
+ return response;
117
+ }
118
+ const queryClient = useQueryClient();
119
+ return useMutation({
120
+ mutationFn: createVersionFn,
121
+ onSuccess: (_data, variables) => {
122
+ const settingsByPKQueryKey = [GET_SETTINGS_BY_PK, variables.pk];
123
+ queryClient.invalidateQueries({ queryKey: settingsByPKQueryKey });
124
+ const settingsByPKAndSKQueryKey = [GET_SETTINGS_BY_PK_AND_SK, variables.pk, variables.sk];
125
+ queryClient.invalidateQueries({ queryKey: settingsByPKAndSKQueryKey });
126
+ },
127
+ onError: (err) => {
128
+ logger.error("Error while settings updating", err);
129
+ }
130
+ });
131
+ };
@@ -0,0 +1,11 @@
1
+ import React from "react";
2
+ interface FormActionButtonsProps {
3
+ isEditMode?: boolean;
4
+ loading?: boolean;
5
+ onClear: () => void;
6
+ submitLabel?: string;
7
+ updateLabel?: string;
8
+ disableSubmit?: boolean;
9
+ }
10
+ declare const FormActionButtons: React.FC<FormActionButtonsProps>;
11
+ export default FormActionButtons;
@@ -0,0 +1,6 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ const FormActionButtons = ({ isEditMode = false, loading = false, onClear, submitLabel = "Submit", updateLabel = "Update", disableSubmit = false, }) => {
3
+ const isSubmitDisabled = loading || disableSubmit;
4
+ return (_jsxs("div", { className: "mt-4 d-flex gap-4 justify-content-center", children: [_jsx("button", { type: "submit", className: "btn-primary-global m-0 py-2 px-4 fs-6", disabled: isSubmitDisabled, children: isEditMode ? updateLabel : submitLabel }), _jsx("button", { type: "button", className: "btn-secondary-global m-0 py-2 px-4 fs-6", onClick: onClear, children: "Clear" })] }));
5
+ };
6
+ export default FormActionButtons;
@@ -0,0 +1,8 @@
1
+ import React from "react";
2
+ interface FormLabelProps {
3
+ label: string;
4
+ required?: boolean;
5
+ className?: string;
6
+ }
7
+ declare const FormLabel: React.FC<FormLabelProps>;
8
+ export default FormLabel;
@@ -0,0 +1,6 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Form } from "react-bootstrap";
3
+ const FormLabel = ({ label, required = false, className = "mt-2 mb-1 form-label", }) => {
4
+ return (_jsxs(Form.Label, { className: className, children: [label, required && _jsx("span", { className: "text-danger ms-1", children: "*" })] }));
5
+ };
6
+ export default FormLabel;
@@ -0,0 +1,8 @@
1
+ import React from "react";
2
+ interface ListHeaderProps {
3
+ title: string;
4
+ buttonLabel?: string;
5
+ onButtonClick?: () => void;
6
+ }
7
+ declare const ListHeader: React.FC<ListHeaderProps>;
8
+ export default ListHeader;
@@ -0,0 +1,5 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ const ListHeader = ({ title, buttonLabel, onButtonClick, }) => {
3
+ return (_jsxs("div", { className: "mb-3", children: [buttonLabel && onButtonClick && (_jsx("div", { className: "d-flex justify-content-center", children: _jsx("button", { className: "btn-primary-global", onClick: onButtonClick, children: buttonLabel }) })), _jsx("h5", { className: "text-start text-md-center font-title", children: title })] }));
4
+ };
5
+ export default ListHeader;
@@ -0,0 +1,17 @@
1
+ import React from "react";
2
+ export interface TableColumn<T> {
3
+ header: string;
4
+ accessor: keyof T | ((row: T, index?: number) => React.ReactNode);
5
+ align?: "left" | "center" | "right";
6
+ }
7
+ interface GlobalTableProps<T> {
8
+ columns: TableColumn<T>[];
9
+ data: T[];
10
+ emptyMessage?: string;
11
+ onEdit?: (row: T) => void;
12
+ pageSize?: number;
13
+ loading?: boolean;
14
+ pageSizeOptions?: number[];
15
+ }
16
+ declare function ListTable<T>({ columns, data, emptyMessage, onEdit, pageSize, loading, pageSizeOptions, }: GlobalTableProps<T>): import("react/jsx-runtime").JSX.Element;
17
+ export default ListTable;
@@ -0,0 +1,31 @@
1
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { useMemo, useState } from "react";
3
+ import { Table, Pagination } from "react-bootstrap";
4
+ import LoadingSpinner from "../../Loader/Loader";
5
+ function ListTable({ columns, data, emptyMessage = "No records found", onEdit, pageSize = 10, loading = false, pageSizeOptions = [10, 25, 50, 100], }) {
6
+ const [currentPage, setCurrentPage] = useState(1);
7
+ const [rowsPerPage, setRowsPerPage] = useState(pageSize);
8
+ const hasData = data && data.length > 0;
9
+ const totalPages = Math.ceil(data.length / rowsPerPage);
10
+ const paginatedData = useMemo(() => {
11
+ const start = (currentPage - 1) * rowsPerPage;
12
+ return data.slice(start, start + rowsPerPage);
13
+ }, [data, currentPage, rowsPerPage]);
14
+ const handlePageChange = (page) => {
15
+ if (page >= 1 && page <= totalPages) {
16
+ setCurrentPage(page);
17
+ }
18
+ };
19
+ const handleRowsPerPageChange = (value) => {
20
+ setRowsPerPage(value);
21
+ setCurrentPage(1);
22
+ };
23
+ const colSpan = columns.length + (onEdit ? 1 : 0);
24
+ return (_jsxs(_Fragment, { children: [_jsx("div", { className: "table-responsive", children: _jsxs(Table, { bordered: true, hover: true, className: "mb-0", children: [_jsx("thead", { className: "table-head", children: _jsxs("tr", { children: [columns.map((col, index) => (_jsx("th", { className: `text-${col.align ?? "left"}`, children: col.header }, index))), onEdit && _jsx("th", { className: "text-center", children: "Actions" })] }) }), _jsx("tbody", { children: loading ? (_jsx("tr", { children: _jsx("td", { colSpan: colSpan, className: "text-center py-5", children: _jsx(LoadingSpinner, {}) }) })) : !hasData ? (_jsx("tr", { children: _jsx("td", { colSpan: colSpan, className: "text-center fs-5 text-danger py-3", children: emptyMessage }) })) : (paginatedData.map((row, rowIndex) => (_jsxs("tr", { children: [columns.map((col, colIndex) => (_jsx("td", { className: `text-${col.align ?? "left"}`, children: typeof col.accessor === "function"
25
+ ? col.accessor(row, rowIndex)
26
+ : row[col.accessor] }, colIndex))), onEdit && (_jsx("td", { className: "text-center", children: _jsx("button", { className: "btn-primary-global table-edit-btn m-0 py-1 px-3 fs-6", onClick: () => onEdit(row), children: "Edit" }) }))] }, rowIndex)))) })] }) }), hasData && !loading && (_jsxs("div", { className: "d-flex justify-content-center gap-5 align-items-center mt-3 flex-wrap gap-2", children: [_jsxs(Pagination, { className: "mb-0", children: [_jsx(Pagination.Prev, { disabled: currentPage === 1 || totalPages <= 1, onClick: () => handlePageChange(currentPage - 1) }), [...Array(totalPages)].map((_, index) => {
27
+ const page = index + 1;
28
+ return (_jsx(Pagination.Item, { active: page === currentPage, disabled: totalPages <= 1, onClick: () => handlePageChange(page), children: page }, page));
29
+ }), _jsx(Pagination.Next, { disabled: currentPage === totalPages || totalPages <= 1, onClick: () => handlePageChange(currentPage + 1) })] }), _jsxs("div", { className: "d-flex align-items-center gap-2", children: [_jsx("span", { className: "fw-semibold", children: "Rows per page:" }), _jsx("select", { className: "form-select form-select-sm w-auto", value: rowsPerPage, onChange: (e) => handleRowsPerPageChange(Number(e.target.value)), children: pageSizeOptions.map((size) => (_jsx("option", { value: size, children: size }, size))) })] })] }))] }));
30
+ }
31
+ export default ListTable;
@@ -0,0 +1,11 @@
1
+ import React from "react";
2
+ interface ModalProps {
3
+ show: boolean;
4
+ title: string;
5
+ onClose: () => void;
6
+ children: React.ReactNode;
7
+ size?: "sm" | "lg" | "xl";
8
+ backdrop?: "static" | true;
9
+ }
10
+ declare const FormModal: React.FC<ModalProps>;
11
+ export default FormModal;
@@ -0,0 +1,6 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Modal } from "react-bootstrap";
3
+ const FormModal = ({ show, title, onClose, children, size = "lg", backdrop = "static", }) => {
4
+ return (_jsxs(Modal, { show: show, onHide: onClose, centered: true, size: size, backdrop: backdrop, children: [_jsx(Modal.Header, { className: "py-0 px-4 px-md-5", closeButton: true, children: _jsx(Modal.Title, { className: "font-title", children: title }) }), _jsx(Modal.Body, { className: "py-3 py-md-4 px-4 px-md-5", children: children })] }));
5
+ };
6
+ export default FormModal;
@@ -0,0 +1,13 @@
1
+ export declare const EnvConfig: {
2
+ env: any;
3
+ appHostAPi: any;
4
+ region: any;
5
+ userPoolId: any;
6
+ userPoolClientId: any;
7
+ identityPoolId: any;
8
+ storage: any;
9
+ apiKey: any;
10
+ template: any;
11
+ imageStorageBucketUrl: any;
12
+ applicationName: any;
13
+ };
@@ -0,0 +1,13 @@
1
+ export const EnvConfig = {
2
+ env: import.meta.env.VITE_SERVER_ENV || "local",
3
+ appHostAPi: import.meta.env.VITE_HMS_SERVICE_SERVER_URL || "",
4
+ region: import.meta.env.VITE_AWS_REGION || "",
5
+ userPoolId: import.meta.env.VITE_USERPOOL_ID || "",
6
+ userPoolClientId: import.meta.env.VITE_USERPOOL_CLIENT_ID || "",
7
+ identityPoolId: import.meta.env.VITE_IDPOOL_ID || "",
8
+ storage: import.meta.env.VITE_STORAGE_NAME || "",
9
+ apiKey: import.meta.env.VITE_API_KEY || undefined,
10
+ template: import.meta.env.VITE_TEMPLATE || undefined,
11
+ imageStorageBucketUrl: import.meta.env.VITE_IMAGE_STORAGE_BUCKET_URL || "",
12
+ applicationName: import.meta.env.VITE_APPLICATION_NAME || "",
13
+ };
@@ -0,0 +1 @@
1
+ export declare function configureAmplify(): void;
@@ -0,0 +1,45 @@
1
+ import { Amplify } from 'aws-amplify';
2
+ import { EnvConfig } from './EnvConfig';
3
+ import { VITE_API_AUTHMODE } from "../static/constants";
4
+ // Optional global marker for debugging
5
+ const AMPLIFY_INIT_FLAG = '__AMPLIFY_INITIALIZED__';
6
+ export function configureAmplify() {
7
+ const apiConfig = {
8
+ GraphQL: {
9
+ endpoint: EnvConfig.appHostAPi,
10
+ region: EnvConfig.region,
11
+ defaultAuthMode: VITE_API_AUTHMODE,
12
+ apiKey: EnvConfig.apiKey,
13
+ },
14
+ };
15
+ const authConfig = {
16
+ Cognito: {
17
+ allowGuestAccess: true,
18
+ userPoolId: EnvConfig.userPoolId,
19
+ userPoolClientId: EnvConfig.userPoolClientId,
20
+ identityPoolId: EnvConfig.identityPoolId,
21
+ signUpVerificationMethod: 'code',
22
+ loginWith: { email: true },
23
+ },
24
+ };
25
+ const storageConfig = {
26
+ S3: {
27
+ bucket: EnvConfig.storage,
28
+ region: EnvConfig.region,
29
+ },
30
+ };
31
+ // 1️⃣ If running inside a host, do nothing — assume host already configured Amplify
32
+ if (window.hosted_in_container === true) {
33
+ return;
34
+ }
35
+ // 2️⃣ If already initialized (e.g. hot reload), skip
36
+ if (window[AMPLIFY_INIT_FLAG]) {
37
+ return;
38
+ }
39
+ Amplify.configure({
40
+ API: apiConfig,
41
+ Auth: authConfig,
42
+ Storage: storageConfig,
43
+ });
44
+ window[AMPLIFY_INIT_FLAG] = true;
45
+ }
@@ -0,0 +1,6 @@
1
+ export interface AppHostConfig {
2
+ apiBaseUrl?: string;
3
+ appName?: string;
4
+ }
5
+ export declare const configureAppHost: (newConfig: AppHostConfig) => void;
6
+ export declare const getAppHostConfig: () => AppHostConfig;
@@ -0,0 +1,5 @@
1
+ let config = {};
2
+ export const configureAppHost = (newConfig) => {
3
+ config = { ...config, ...newConfig };
4
+ };
5
+ export const getAppHostConfig = () => config;
@@ -0,0 +1,3 @@
1
+ export declare const createBranchMutationGQL = "\n mutation CreateBranch($input: BranchInput!) {\n createBranch(input: $input) {\n pk\n sk\n branchAddress\n branchContactNumber\n createdDt\n status\n __typename\n }\n }\n";
2
+ export declare const createMapping = "mutation CreateMapping($input: MappingInput!) {\n createMapping(input: $input) {\n pk\n sk\n branchName\n entity\n userId\n userName\n roleId\n roleName\n componentId\n componentTitle\n disabledDt\n createdDt\n createdBy\n status\n __typename\n }\n}\n";
3
+ export declare const updateMapping = "mutation UpdateMapping($input: MappingInput!) {\n updateMapping(input: $input) {\n pk\n sk\n entity\n userId\n userName\n roleId\n roleName\n componentId\n componentTitle\n disabledDt\n createdDt\n createdBy\n status\n __typename\n }\n}\n";