@syzy/apphost 1.0.18 → 1.0.20

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.
@@ -1 +1,3 @@
1
- export declare const AppHostRoutes: () => import("react/jsx-runtime").JSX.Element;
1
+ export { default as LoginForm } from "./components/Login/Login";
2
+ export { default as MappingFormUserRole } from "./components/Mappings/RoleMapping/MappingFormUserRole";
3
+ export { default as ComponentRoleMapping } from "./components/Mappings/ComponentMapping/ComponentRoleMapping";
@@ -1,16 +1,3 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { Routes, Route } from "react-router-dom";
3
- // import Home from "./components/Home/Home";
4
- // import ProfileForm from "./components/ProfileForm/ProfileForm";
5
- import LoginForm from "./components/Login/Login";
6
- // import BranchMapping from "./components/Mappings/BranchMapping/Branch";
7
- // import MappingFormBranchUser from "./components/Mappings/BranchMapping/MappingFormBranchUser";
8
- import ComponentRoleMapping from "./components/Mappings/ComponentMapping/ComponentRoleMapping";
9
- import MappingFormUserRole from "./components/Mappings/RoleMapping/MappingFormUserRole";
10
- export const AppHostRoutes = () => {
11
- const handleLogin = (isLoggedIn) => {
12
- // Handle login logic here
13
- console.log("User logged in:", isLoggedIn);
14
- };
15
- return (_jsxs(Routes, { children: [_jsx(Route, { path: "/apphost/login-form", element: _jsx(LoginForm, { login: handleLogin }) }), _jsx(Route, { path: "/apphost/mapping-user-role", element: _jsx(MappingFormUserRole, {}) }), _jsx(Route, { path: "/apphost/component-role-mapping", element: _jsx(ComponentRoleMapping, {}) })] }));
16
- };
1
+ export { default as LoginForm } from "./components/Login/Login";
2
+ export { default as MappingFormUserRole } from "./components/Mappings/RoleMapping/MappingFormUserRole";
3
+ export { default as ComponentRoleMapping } from "./components/Mappings/ComponentMapping/ComponentRoleMapping";
@@ -14,7 +14,7 @@ import { Status } from "../domain/type/StatusEnum";
14
14
  export const MAPPING_RESOURCE = "mapping";
15
15
  export const GET_MAPPING_BY_USERID_QUERYKEY = "mappingbyuserid";
16
16
  export const LIST_BRANCHES_RESOURCE = "branches";
17
- const endpoint = EnvConfig.hmsAPi;
17
+ const endpoint = EnvConfig.appHostAPi;
18
18
  export const transformtoMappingDto = (mappingData) => {
19
19
  logger.info("transform to MappingDto:", mappingData);
20
20
  const { __typename, createdAt, updatedAt, ...itm } = mappingData;
@@ -367,7 +367,7 @@ export const useUpdateBranchMutation = () => {
367
367
  });
368
368
  };
369
369
  export const fetchBranchUserMappings = async (branchesMap) => {
370
- const endpoint = EnvConfig.hmsAPi;
370
+ const endpoint = EnvConfig.appHostAPi;
371
371
  const client = await Client.getCustomGraphqlClient(endpoint);
372
372
  const response = await client.request(ListBranchUserMappings);
373
373
  return response.listMapping.map((m) => {
@@ -385,7 +385,7 @@ export const fetchBranchUserMappings = async (branchesMap) => {
385
385
  });
386
386
  };
387
387
  export const fetchUserRoleMappings = async () => {
388
- const endpoint = EnvConfig.hmsAPi;
388
+ const endpoint = EnvConfig.appHostAPi;
389
389
  const client = await Client.getCustomGraphqlClient(endpoint);
390
390
  const response = await client.request(ListUserRoleMapping);
391
391
  return response.listMapping.map(m => ({
@@ -402,7 +402,7 @@ export const useUserRoleMappings = () => {
402
402
  });
403
403
  };
404
404
  export const fetchComponentRoleMappings = async () => {
405
- const client = await Client.getCustomGraphqlClient(EnvConfig.hmsAPi);
405
+ const client = await Client.getCustomGraphqlClient(EnvConfig.appHostAPi);
406
406
  const response = await client.request(ListComponentRoleMappings);
407
407
  return response.listMapping.map((m) => {
408
408
  const transformed = transformtoMappingDto(m);
@@ -6,15 +6,17 @@ import { toast } from "react-toastify";
6
6
  import "react-toastify/dist/ReactToastify.css";
7
7
  import { useNavigate } from "react-router-dom";
8
8
  import { FaEye, FaEyeSlash } from "react-icons/fa";
9
- // import logo from "../../../src/assets/images/Hotel-Logo.jpg"
9
+ import logo from "../../../src/assets/images/Hotel-Logo.jpg";
10
10
  import { signIn, signUp, confirmSignUp, confirmResetPassword, getCurrentUser, confirmSignIn, resetPassword } from "aws-amplify/auth";
11
11
  import { signInSchema, registerSchema, confirmSignUpSchema, resetPasswordSchema, forceResetSchema, forgotPasswordSchema, } from "./loginSchema";
12
+ import { ALL, HIDE_SIGN_UP, HIDE_SIGN_UP_IS_NO } from "../../static/constants";
13
+ import { useGetSettingsByPkAndSk } from "../api/settings-api";
12
14
  const LoginForm = ({ login }) => {
13
15
  const [authMode, setAuthMode] = useState("signin");
14
16
  const navigate = useNavigate();
15
17
  const [tempUsername, setTempUsername] = useState("");
16
18
  const [showPassword, setShowPassword] = useState(false);
17
- // const { settingsByPkAndSk } = useGetSettingsByPkAndSk(ALL, HIDE_SIGN_UP);
19
+ const { settingsByPkAndSk } = useGetSettingsByPkAndSk(ALL, HIDE_SIGN_UP);
18
20
  const getSchema = () => {
19
21
  switch (authMode) {
20
22
  case "signin":
@@ -141,6 +143,7 @@ const LoginForm = ({ login }) => {
141
143
  const isPassword = type === "password";
142
144
  return (_jsxs("div", { className: "mb-3 position-relative", children: [_jsxs("div", { className: "input-group", children: [_jsx("input", { type: isPassword ? (showPassword ? "text" : "password") : type, placeholder: label, ...register(name), className: `form-control ${errors[name] ? "is-invalid" : ""}` }), isPassword && (_jsx("span", { className: "input-group-text bg-white", style: { cursor: "pointer" }, onClick: () => setShowPassword((prev) => !prev), children: showPassword ? _jsx(FaEye, { size: 18 }) : _jsx(FaEyeSlash, { size: 18 }) }))] }), errors[name] && (_jsx("div", { className: "invalid-feedback d-block", children: errors[name]?.message }))] }));
143
145
  };
144
- return (_jsx("div", { className: "d-flex justify-content-center align-items-center vh-100 bg-light", children: _jsx("div", { className: "card shadow-sm p-4 p-md-5 w-100", style: { maxWidth: "420px" }, children: _jsxs("form", { onSubmit: handleSubmit(onSubmit), children: [_jsx("div", { className: "d-flex justify-content-center", children: _jsx("img", { className: "w-75 mx-auto mb-4", src: "logo" }) }), _jsxs("h4", { className: "text-center mb-4 fw-bold", children: [authMode === "signin" && "Sign in to your account", authMode === "register" && "Create a new account", authMode === "confirm" && "Verify your email", authMode === "forgot" && "Forgot Password?", authMode === "reset" && "Reset Password", authMode === "forceReset" && "Set New Password"] }), authMode === "signin" && (_jsxs(_Fragment, { children: [renderInput("Username", "text", "username"), renderInput("Password", "password", "password"), _jsx("button", { type: "submit", className: "btn btn-primary w-100 mb-2", children: "Sign In" }), _jsx("div", { className: "d-flex justify-content-between", children: _jsx("button", { type: "button", className: "btn btn-link p-0", onClick: () => setAuthMode("forgot"), children: "Forgot Password?" }) })] })), authMode === "register" && (_jsxs(_Fragment, { children: [renderInput("Username", "text", "username"), renderInput("Email", "email", "email"), renderInput("Password", "password", "password"), renderInput("Confirm Password", "password", "confirmPassword"), _jsx("button", { type: "submit", className: "btn btn-success w-100 mb-2", children: "Register" }), _jsx("button", { type: "button", className: "btn btn-link w-100", onClick: () => setAuthMode("signin"), children: "Back to Sign In" })] })), authMode === "confirm" && (_jsxs(_Fragment, { children: [renderInput("Verification Code", "text", "confirmationCode"), _jsx("button", { type: "submit", className: "btn btn-primary w-100 mb-2", children: "Confirm" }), _jsx("button", { type: "button", className: "btn btn-link w-100", onClick: () => setAuthMode("signin"), children: "Back to Sign In" })] })), authMode === "forgot" && (_jsxs(_Fragment, { children: [renderInput("Username", "text", "username"), _jsx("button", { type: "submit", className: "btn btn-warning w-100 mb-2", children: "Send Reset Code" }), _jsx("button", { type: "button", className: "btn btn-link w-100", onClick: () => setAuthMode("signin"), children: "Back to Sign In" })] })), authMode === "reset" && (_jsxs(_Fragment, { children: [renderInput("Verification Code", "text", "confirmationCode"), renderInput("New Password", "password", "password"), renderInput("Confirm New Password", "password", "confirmPassword"), _jsx("button", { type: "submit", className: "btn btn-success w-100 mb-2", children: "Reset Password" }), _jsx("button", { type: "button", className: "btn btn-link w-100", onClick: () => setAuthMode("signin"), children: "Back to Sign In" })] })), authMode === "forceReset" && (_jsxs(_Fragment, { children: [renderInput("New Password", "password", "password"), renderInput("Confirm New Password", "password", "confirmPassword"), _jsx("button", { type: "submit", className: "btn btn-success w-100 mb-2", children: "Update Password" }), _jsx("button", { type: "button", className: "btn btn-link w-100", onClick: () => setAuthMode("signin"), children: "Back to Sign In" })] }))] }) }) }));
146
+ return (_jsx("div", { className: "d-flex justify-content-center align-items-center vh-100 bg-light", children: _jsx("div", { className: "card shadow-sm p-4 p-md-5 w-100", style: { maxWidth: "420px" }, children: _jsxs("form", { onSubmit: handleSubmit(onSubmit), children: [_jsx("div", { className: "d-flex justify-content-center", children: _jsx("img", { className: "w-75 mx-auto mb-4", src: logo }) }), _jsxs("h4", { className: "text-center mb-4 fw-bold", children: [authMode === "signin" && "Sign in to your account", authMode === "register" && "Create a new account", authMode === "confirm" && "Verify your email", authMode === "forgot" && "Forgot Password?", authMode === "reset" && "Reset Password", authMode === "forceReset" && "Set New Password"] }), authMode === "signin" && (_jsxs(_Fragment, { children: [renderInput("Username", "text", "username"), renderInput("Password", "password", "password"), _jsx("button", { type: "submit", className: "btn btn-primary w-100 mb-2", children: "Sign In" }), _jsxs("div", { className: "d-flex justify-content-between", children: [(settingsByPkAndSk && settingsByPkAndSk?.value === HIDE_SIGN_UP_IS_NO) &&
147
+ _jsx("button", { type: "button", className: "btn btn-link p-0", onClick: () => setAuthMode("register"), children: "Create Account" }), _jsx("button", { type: "button", className: "btn btn-link p-0", onClick: () => setAuthMode("forgot"), children: "Forgot Password?" })] })] })), authMode === "register" && (_jsxs(_Fragment, { children: [renderInput("Username", "text", "username"), renderInput("Email", "email", "email"), renderInput("Password", "password", "password"), renderInput("Confirm Password", "password", "confirmPassword"), _jsx("button", { type: "submit", className: "btn btn-success w-100 mb-2", children: "Register" }), _jsx("button", { type: "button", className: "btn btn-link w-100", onClick: () => setAuthMode("signin"), children: "Back to Sign In" })] })), authMode === "confirm" && (_jsxs(_Fragment, { children: [renderInput("Verification Code", "text", "confirmationCode"), _jsx("button", { type: "submit", className: "btn btn-primary w-100 mb-2", children: "Confirm" }), _jsx("button", { type: "button", className: "btn btn-link w-100", onClick: () => setAuthMode("signin"), children: "Back to Sign In" })] })), authMode === "forgot" && (_jsxs(_Fragment, { children: [renderInput("Username", "text", "username"), _jsx("button", { type: "submit", className: "btn btn-warning w-100 mb-2", children: "Send Reset Code" }), _jsx("button", { type: "button", className: "btn btn-link w-100", onClick: () => setAuthMode("signin"), children: "Back to Sign In" })] })), authMode === "reset" && (_jsxs(_Fragment, { children: [renderInput("Verification Code", "text", "confirmationCode"), renderInput("New Password", "password", "password"), renderInput("Confirm New Password", "password", "confirmPassword"), _jsx("button", { type: "submit", className: "btn btn-success w-100 mb-2", children: "Reset Password" }), _jsx("button", { type: "button", className: "btn btn-link w-100", onClick: () => setAuthMode("signin"), children: "Back to Sign In" })] })), authMode === "forceReset" && (_jsxs(_Fragment, { children: [renderInput("New Password", "password", "password"), renderInput("Confirm New Password", "password", "confirmPassword"), _jsx("button", { type: "submit", className: "btn btn-success w-100 mb-2", children: "Update Password" }), _jsx("button", { type: "button", className: "btn btn-link w-100", onClick: () => setAuthMode("signin"), children: "Back to Sign In" })] }))] }) }) }));
145
148
  };
146
149
  export default LoginForm;
@@ -1,5 +1,3 @@
1
1
  import React from "react";
2
- import "../../../styles/button.css";
3
- import "../../Mappings/MappingForm/MappingForm.css";
4
2
  declare const BranchMapping: React.FC;
5
3
  export default BranchMapping;
@@ -7,8 +7,8 @@ import { toast, ToastContainer } from "react-toastify";
7
7
  import { useBranchSchema } from "./branchSchema";
8
8
  import { useCreateBranchMutation, useUpdateBranchMutation, useListBranches } from "../../../api/mapping-api";
9
9
  import { logger } from "../../../util/Logger";
10
- import "../../../styles/button.css";
11
- import "../../Mappings/MappingForm/MappingForm.css";
10
+ // import "../../../styles/button.css";
11
+ // import "../../Mappings/MappingForm/MappingForm.css";
12
12
  import { SyzyDate } from "../../../util/SyzyDate";
13
13
  import { DATE_FORMAT_ISO_YYYY_MM_DD_HH_MM } from "../../../util/dateUtils";
14
14
  import FormModal from "../../common/Modal/Modal";
@@ -0,0 +1,3 @@
1
+ import './SettingsPage.css';
2
+ declare const SettingsPage: () => import("react/jsx-runtime").JSX.Element;
3
+ export default SettingsPage;
@@ -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
+ };
@@ -1,15 +1,13 @@
1
1
  export declare const EnvConfig: {
2
2
  env: any;
3
- bookingAPi: any;
4
- hmsapi: any;
3
+ appHostAPi: any;
5
4
  region: any;
6
5
  userPoolId: any;
7
6
  userPoolClientId: any;
8
7
  identityPoolId: any;
9
8
  storage: any;
10
- imageStorageBucketUrl: any;
11
- keyId: any;
12
- recordLimit: any;
13
- authMode: any;
14
9
  apiKey: any;
10
+ template: any;
11
+ imageStorageBucketUrl: any;
12
+ applicationName: any;
15
13
  };
@@ -1,15 +1,13 @@
1
1
  export const EnvConfig = {
2
2
  env: import.meta.env.VITE_SERVER_ENV || "local",
3
- bookingAPi: import.meta.env.VITE_BOOKING_SERVICE_SERVER_URL || "",
4
- hmsapi: import.meta.env.VITE_HMS_SERVICE_SERVER_URL || "",
3
+ appHostAPi: import.meta.env.VITE_HMS_SERVICE_SERVER_URL || "",
5
4
  region: import.meta.env.VITE_AWS_REGION || "",
6
5
  userPoolId: import.meta.env.VITE_USERPOOL_ID || "",
7
6
  userPoolClientId: import.meta.env.VITE_USERPOOL_CLIENT_ID || "",
8
7
  identityPoolId: import.meta.env.VITE_IDPOOL_ID || "",
9
8
  storage: import.meta.env.VITE_STORAGE_NAME || "",
10
- imageStorageBucketUrl: import.meta.env.VITE_IMAGE_STORAGE_BUCKET_URL || "",
11
- keyId: import.meta.env.VITE_KEY_ID || "",
12
- recordLimit: import.meta.env.VITE_RECORD_LIMIT || 1000,
13
- authMode: import.meta.env.VITE_API_AUTHMODE,
14
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 || "",
15
13
  };
package/dist/index.d.ts CHANGED
@@ -1 +0,0 @@
1
- export { AppHostRoutes } from "./AppHostRoutes";
package/dist/index.js CHANGED
@@ -1 +1,2 @@
1
- export { AppHostRoutes } from "./AppHostRoutes";
1
+ "use strict";
2
+ // export { AppHostRoutes } from "./AppHostRoutes";
package/dist/main.js CHANGED
@@ -3,7 +3,6 @@ import { StrictMode, useEffect, useState } from 'react';
3
3
  import './index.css';
4
4
  import 'bootstrap/dist/css/bootstrap.min.css';
5
5
  import 'react-toastify/dist/ReactToastify.css';
6
- // import AppProvider from './store/AppProvider.tsx';
7
6
  import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
8
7
  // import { HostedInContainerProvider } from "./store/HostedInContainerContext.tsx";
9
8
  import { ToastContainer } from 'react-toastify';
@@ -11,6 +10,7 @@ import { BrowserRouter as Router } from 'react-router-dom';
11
10
  import './styles/typography.css';
12
11
  import * as ReactDOM from 'react-dom/client';
13
12
  import App from './App';
13
+ import AppProvider from './store/AppProvider';
14
14
  function registerValidSW(swUrl, config) {
15
15
  navigator.serviceWorker
16
16
  .register(swUrl)
@@ -52,7 +52,7 @@ const AppWithServiceWorker = () => {
52
52
  onUpdate: handleUpdate,
53
53
  });
54
54
  }, []);
55
- return (_jsxs(StrictMode, { children: [_jsxs(QueryClientProvider, { client: queryClient, children: [_jsx(ToastContainer, { position: "top-right", autoClose: 3000, hideProgressBar: false, newestOnTop: true, closeOnClick: true, pauseOnHover: true, theme: "light", limit: 1 }), _jsx(Router, { children: _jsx(App, {}) })] }), showUpdatePrompt && (_jsxs("div", { className: "update-prompt", children: [_jsx("p", { children: "A new version of the app is available. Please refresh to update." }), _jsx("button", { onClick: () => {
55
+ return (_jsxs(StrictMode, { children: [_jsx(AppProvider, { children: _jsxs(QueryClientProvider, { client: queryClient, children: [_jsx(ToastContainer, { position: "top-right", autoClose: 3000, hideProgressBar: false, newestOnTop: true, closeOnClick: true, pauseOnHover: true, theme: "light", limit: 1 }), _jsx(Router, { children: _jsx(App, {}) })] }) }), showUpdatePrompt && (_jsxs("div", { className: "update-prompt", children: [_jsx("p", { children: "A new version of the app is available. Please refresh to update." }), _jsx("button", { onClick: () => {
56
56
  swRegistration?.waiting?.postMessage({ type: 'SKIP_WAITING' });
57
57
  window.location.reload();
58
58
  }, children: "Refresh" })] }))] }));
@@ -0,0 +1,2 @@
1
+ export declare const getImageUrl: (imageKey: string | undefined | null) => Promise<string | undefined>;
2
+ export declare const uploadImage: (imageKey: string, image: File) => Promise<void>;
@@ -0,0 +1,26 @@
1
+ import { uploadData } from 'aws-amplify/storage';
2
+ import { LogCategoryEnum } from '../util/LogEnum';
3
+ import { logger } from '../util/Logger';
4
+ import { EnvConfig } from '../config/EnvConfig';
5
+ export const getImageUrl = async (imageKey) => {
6
+ logger.debug(LogCategoryEnum.Info, "imageKey passed", imageKey);
7
+ let returnString = undefined;
8
+ if (imageKey) {
9
+ //Below for hms-ck-dev env image bucket url -------------
10
+ returnString = `${EnvConfig.imageStorageBucketUrl}/${imageKey}`;
11
+ }
12
+ return returnString;
13
+ };
14
+ export const uploadImage = async (imageKey, image) => {
15
+ logger.debug(LogCategoryEnum.Info, "inside upload image function", imageKey);
16
+ logger.debug(LogCategoryEnum.Info, "inside upload image function", image);
17
+ await uploadData({
18
+ key: imageKey,
19
+ data: image,
20
+ options: {
21
+ accessLevel: 'guest',
22
+ contentType: image.type,
23
+ }
24
+ });
25
+ logger.debug(LogCategoryEnum.Info, "image key", imageKey);
26
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@syzy/apphost",
3
- "version": "1.0.18",
3
+ "version": "1.0.20",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
package/dist/index.css DELETED
@@ -1 +0,0 @@
1
- :root{--toastify-color-light: #fff;--toastify-color-dark: #121212;--toastify-color-info: #3498db;--toastify-color-success: #07bc0c;--toastify-color-warning: #f1c40f;--toastify-color-error: hsl(6, 78%, 57%);--toastify-color-transparent: rgba(255, 255, 255, .7);--toastify-icon-color-info: var(--toastify-color-info);--toastify-icon-color-success: var(--toastify-color-success);--toastify-icon-color-warning: var(--toastify-color-warning);--toastify-icon-color-error: var(--toastify-color-error);--toastify-container-width: fit-content;--toastify-toast-width: 320px;--toastify-toast-offset: 16px;--toastify-toast-top: max(var(--toastify-toast-offset), env(safe-area-inset-top));--toastify-toast-right: max(var(--toastify-toast-offset), env(safe-area-inset-right));--toastify-toast-left: max(var(--toastify-toast-offset), env(safe-area-inset-left));--toastify-toast-bottom: max(var(--toastify-toast-offset), env(safe-area-inset-bottom));--toastify-toast-background: #fff;--toastify-toast-padding: 14px;--toastify-toast-min-height: 64px;--toastify-toast-max-height: 800px;--toastify-toast-bd-radius: 6px;--toastify-toast-shadow: 0px 4px 12px rgba(0, 0, 0, .1);--toastify-font-family: sans-serif;--toastify-z-index: 9999;--toastify-text-color-light: #757575;--toastify-text-color-dark: #fff;--toastify-text-color-info: #fff;--toastify-text-color-success: #fff;--toastify-text-color-warning: #fff;--toastify-text-color-error: #fff;--toastify-spinner-color: #616161;--toastify-spinner-color-empty-area: #e0e0e0;--toastify-color-progress-light: linear-gradient(to right, #4cd964, #5ac8fa, #007aff, #34aadc, #5856d6, #ff2d55);--toastify-color-progress-dark: #bb86fc;--toastify-color-progress-info: var(--toastify-color-info);--toastify-color-progress-success: var(--toastify-color-success);--toastify-color-progress-warning: var(--toastify-color-warning);--toastify-color-progress-error: var(--toastify-color-error);--toastify-color-progress-bgo: .2}.Toastify__toast-container{z-index:var(--toastify-z-index);-webkit-transform:translate3d(0,0,var(--toastify-z-index));position:fixed;width:var(--toastify-container-width);box-sizing:border-box;color:#fff;display:flex;flex-direction:column}.Toastify__toast-container--top-left{top:var(--toastify-toast-top);left:var(--toastify-toast-left)}.Toastify__toast-container--top-center{top:var(--toastify-toast-top);left:50%;transform:translate(-50%);align-items:center}.Toastify__toast-container--top-right{top:var(--toastify-toast-top);right:var(--toastify-toast-right);align-items:end}.Toastify__toast-container--bottom-left{bottom:var(--toastify-toast-bottom);left:var(--toastify-toast-left)}.Toastify__toast-container--bottom-center{bottom:var(--toastify-toast-bottom);left:50%;transform:translate(-50%);align-items:center}.Toastify__toast-container--bottom-right{bottom:var(--toastify-toast-bottom);right:var(--toastify-toast-right);align-items:end}.Toastify__toast{--y: 0;position:relative;touch-action:none;width:var(--toastify-toast-width);min-height:var(--toastify-toast-min-height);box-sizing:border-box;margin-bottom:1rem;padding:var(--toastify-toast-padding);border-radius:var(--toastify-toast-bd-radius);box-shadow:var(--toastify-toast-shadow);max-height:var(--toastify-toast-max-height);font-family:var(--toastify-font-family);z-index:0;display:flex;flex:1 auto;align-items:center;word-break:break-word}@media only screen and (max-width: 480px){.Toastify__toast-container{width:100vw;left:env(safe-area-inset-left);margin:0}.Toastify__toast-container--top-left,.Toastify__toast-container--top-center,.Toastify__toast-container--top-right{top:env(safe-area-inset-top);transform:translate(0)}.Toastify__toast-container--bottom-left,.Toastify__toast-container--bottom-center,.Toastify__toast-container--bottom-right{bottom:env(safe-area-inset-bottom);transform:translate(0)}.Toastify__toast-container--rtl{right:env(safe-area-inset-right);left:initial}.Toastify__toast{--toastify-toast-width: 100%;margin-bottom:0;border-radius:0}}.Toastify__toast-container[data-stacked=true]{width:var(--toastify-toast-width)}.Toastify__toast--stacked{position:absolute;width:100%;transform:translate3d(0,var(--y),0) scale(var(--s));transition:transform .3s}.Toastify__toast--stacked[data-collapsed] .Toastify__toast-body,.Toastify__toast--stacked[data-collapsed] .Toastify__close-button{transition:opacity .1s}.Toastify__toast--stacked[data-collapsed=false]{overflow:visible}.Toastify__toast--stacked[data-collapsed=true]:not(:last-child)>*{opacity:0}.Toastify__toast--stacked:after{content:"";position:absolute;left:0;right:0;height:calc(var(--g) * 1px);bottom:100%}.Toastify__toast--stacked[data-pos=top]{top:0}.Toastify__toast--stacked[data-pos=bot]{bottom:0}.Toastify__toast--stacked[data-pos=bot].Toastify__toast--stacked:before{transform-origin:top}.Toastify__toast--stacked[data-pos=top].Toastify__toast--stacked:before{transform-origin:bottom}.Toastify__toast--stacked:before{content:"";position:absolute;left:0;right:0;bottom:0;height:100%;transform:scaleY(3);z-index:-1}.Toastify__toast--rtl{direction:rtl}.Toastify__toast--close-on-click{cursor:pointer}.Toastify__toast-icon{margin-inline-end:10px;width:22px;flex-shrink:0;display:flex}.Toastify--animate{animation-fill-mode:both;animation-duration:.5s}.Toastify--animate-icon{animation-fill-mode:both;animation-duration:.3s}.Toastify__toast-theme--dark{background:var(--toastify-color-dark);color:var(--toastify-text-color-dark)}.Toastify__toast-theme--light,.Toastify__toast-theme--colored.Toastify__toast--default{background:var(--toastify-color-light);color:var(--toastify-text-color-light)}.Toastify__toast-theme--colored.Toastify__toast--info{color:var(--toastify-text-color-info);background:var(--toastify-color-info)}.Toastify__toast-theme--colored.Toastify__toast--success{color:var(--toastify-text-color-success);background:var(--toastify-color-success)}.Toastify__toast-theme--colored.Toastify__toast--warning{color:var(--toastify-text-color-warning);background:var(--toastify-color-warning)}.Toastify__toast-theme--colored.Toastify__toast--error{color:var(--toastify-text-color-error);background:var(--toastify-color-error)}.Toastify__progress-bar-theme--light{background:var(--toastify-color-progress-light)}.Toastify__progress-bar-theme--dark{background:var(--toastify-color-progress-dark)}.Toastify__progress-bar--info{background:var(--toastify-color-progress-info)}.Toastify__progress-bar--success{background:var(--toastify-color-progress-success)}.Toastify__progress-bar--warning{background:var(--toastify-color-progress-warning)}.Toastify__progress-bar--error{background:var(--toastify-color-progress-error)}.Toastify__progress-bar-theme--colored.Toastify__progress-bar--info,.Toastify__progress-bar-theme--colored.Toastify__progress-bar--success,.Toastify__progress-bar-theme--colored.Toastify__progress-bar--warning,.Toastify__progress-bar-theme--colored.Toastify__progress-bar--error{background:var(--toastify-color-transparent)}.Toastify__close-button{color:#fff;position:absolute;top:6px;right:6px;background:transparent;outline:none;border:none;padding:0;cursor:pointer;opacity:.7;transition:.3s ease;z-index:1}.Toastify__toast--rtl .Toastify__close-button{left:6px;right:unset}.Toastify__close-button--light{color:#000;opacity:.3}.Toastify__close-button>svg{fill:currentColor;height:16px;width:14px}.Toastify__close-button:hover,.Toastify__close-button:focus{opacity:1}@keyframes Toastify__trackProgress{0%{transform:scaleX(1)}to{transform:scaleX(0)}}.Toastify__progress-bar{position:absolute;bottom:0;left:0;width:100%;height:100%;z-index:1;opacity:.7;transform-origin:left}.Toastify__progress-bar--animated{animation:Toastify__trackProgress linear 1 forwards}.Toastify__progress-bar--controlled{transition:transform .2s}.Toastify__progress-bar--rtl{right:0;left:initial;transform-origin:right;border-bottom-left-radius:initial}.Toastify__progress-bar--wrp{position:absolute;overflow:hidden;bottom:0;left:0;width:100%;height:5px;border-bottom-left-radius:var(--toastify-toast-bd-radius);border-bottom-right-radius:var(--toastify-toast-bd-radius)}.Toastify__progress-bar--wrp[data-hidden=true]{opacity:0}.Toastify__progress-bar--bg{opacity:var(--toastify-color-progress-bgo);width:100%;height:100%}.Toastify__spinner{width:20px;height:20px;box-sizing:border-box;border:2px solid;border-radius:100%;border-color:var(--toastify-spinner-color-empty-area);border-right-color:var(--toastify-spinner-color);animation:Toastify__spin .65s linear infinite}@keyframes Toastify__bounceInRight{0%,60%,75%,90%,to{animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;transform:translate3d(3000px,0,0)}60%{opacity:1;transform:translate3d(-25px,0,0)}75%{transform:translate3d(10px,0,0)}90%{transform:translate3d(-5px,0,0)}to{transform:none}}@keyframes Toastify__bounceOutRight{20%{opacity:1;transform:translate3d(-20px,var(--y),0)}to{opacity:0;transform:translate3d(2000px,var(--y),0)}}@keyframes Toastify__bounceInLeft{0%,60%,75%,90%,to{animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;transform:translate3d(-3000px,0,0)}60%{opacity:1;transform:translate3d(25px,0,0)}75%{transform:translate3d(-10px,0,0)}90%{transform:translate3d(5px,0,0)}to{transform:none}}@keyframes Toastify__bounceOutLeft{20%{opacity:1;transform:translate3d(20px,var(--y),0)}to{opacity:0;transform:translate3d(-2000px,var(--y),0)}}@keyframes Toastify__bounceInUp{0%,60%,75%,90%,to{animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;transform:translate3d(0,3000px,0)}60%{opacity:1;transform:translate3d(0,-20px,0)}75%{transform:translate3d(0,10px,0)}90%{transform:translate3d(0,-5px,0)}to{transform:translateZ(0)}}@keyframes Toastify__bounceOutUp{20%{transform:translate3d(0,calc(var(--y) - 10px),0)}40%,45%{opacity:1;transform:translate3d(0,calc(var(--y) + 20px),0)}to{opacity:0;transform:translate3d(0,-2000px,0)}}@keyframes Toastify__bounceInDown{0%,60%,75%,90%,to{animation-timing-function:cubic-bezier(.215,.61,.355,1)}0%{opacity:0;transform:translate3d(0,-3000px,0)}60%{opacity:1;transform:translate3d(0,25px,0)}75%{transform:translate3d(0,-10px,0)}90%{transform:translate3d(0,5px,0)}to{transform:none}}@keyframes Toastify__bounceOutDown{20%{transform:translate3d(0,calc(var(--y) - 10px),0)}40%,45%{opacity:1;transform:translate3d(0,calc(var(--y) + 20px),0)}to{opacity:0;transform:translate3d(0,2000px,0)}}.Toastify__bounce-enter--top-left,.Toastify__bounce-enter--bottom-left{animation-name:Toastify__bounceInLeft}.Toastify__bounce-enter--top-right,.Toastify__bounce-enter--bottom-right{animation-name:Toastify__bounceInRight}.Toastify__bounce-enter--top-center{animation-name:Toastify__bounceInDown}.Toastify__bounce-enter--bottom-center{animation-name:Toastify__bounceInUp}.Toastify__bounce-exit--top-left,.Toastify__bounce-exit--bottom-left{animation-name:Toastify__bounceOutLeft}.Toastify__bounce-exit--top-right,.Toastify__bounce-exit--bottom-right{animation-name:Toastify__bounceOutRight}.Toastify__bounce-exit--top-center{animation-name:Toastify__bounceOutUp}.Toastify__bounce-exit--bottom-center{animation-name:Toastify__bounceOutDown}@keyframes Toastify__zoomIn{0%{opacity:0;transform:scale3d(.3,.3,.3)}50%{opacity:1}}@keyframes Toastify__zoomOut{0%{opacity:1}50%{opacity:0;transform:translate3d(0,var(--y),0) scale3d(.3,.3,.3)}to{opacity:0}}.Toastify__zoom-enter{animation-name:Toastify__zoomIn}.Toastify__zoom-exit{animation-name:Toastify__zoomOut}@keyframes Toastify__flipIn{0%{transform:perspective(400px) rotateX(90deg);animation-timing-function:ease-in;opacity:0}40%{transform:perspective(400px) rotateX(-20deg);animation-timing-function:ease-in}60%{transform:perspective(400px) rotateX(10deg);opacity:1}80%{transform:perspective(400px) rotateX(-5deg)}to{transform:perspective(400px)}}@keyframes Toastify__flipOut{0%{transform:translate3d(0,var(--y),0) perspective(400px)}30%{transform:translate3d(0,var(--y),0) perspective(400px) rotateX(-20deg);opacity:1}to{transform:translate3d(0,var(--y),0) perspective(400px) rotateX(90deg);opacity:0}}.Toastify__flip-enter{animation-name:Toastify__flipIn}.Toastify__flip-exit{animation-name:Toastify__flipOut}@keyframes Toastify__slideInRight{0%{transform:translate3d(110%,0,0);visibility:visible}to{transform:translate3d(0,var(--y),0)}}@keyframes Toastify__slideInLeft{0%{transform:translate3d(-110%,0,0);visibility:visible}to{transform:translate3d(0,var(--y),0)}}@keyframes Toastify__slideInUp{0%{transform:translate3d(0,110%,0);visibility:visible}to{transform:translate3d(0,var(--y),0)}}@keyframes Toastify__slideInDown{0%{transform:translate3d(0,-110%,0);visibility:visible}to{transform:translate3d(0,var(--y),0)}}@keyframes Toastify__slideOutRight{0%{transform:translate3d(0,var(--y),0)}to{visibility:hidden;transform:translate3d(110%,var(--y),0)}}@keyframes Toastify__slideOutLeft{0%{transform:translate3d(0,var(--y),0)}to{visibility:hidden;transform:translate3d(-110%,var(--y),0)}}@keyframes Toastify__slideOutDown{0%{transform:translate3d(0,var(--y),0)}to{visibility:hidden;transform:translate3d(0,500px,0)}}@keyframes Toastify__slideOutUp{0%{transform:translate3d(0,var(--y),0)}to{visibility:hidden;transform:translate3d(0,-500px,0)}}.Toastify__slide-enter--top-left,.Toastify__slide-enter--bottom-left{animation-name:Toastify__slideInLeft}.Toastify__slide-enter--top-right,.Toastify__slide-enter--bottom-right{animation-name:Toastify__slideInRight}.Toastify__slide-enter--top-center{animation-name:Toastify__slideInDown}.Toastify__slide-enter--bottom-center{animation-name:Toastify__slideInUp}.Toastify__slide-exit--top-left,.Toastify__slide-exit--bottom-left{animation-name:Toastify__slideOutLeft;animation-timing-function:ease-in;animation-duration:.3s}.Toastify__slide-exit--top-right,.Toastify__slide-exit--bottom-right{animation-name:Toastify__slideOutRight;animation-timing-function:ease-in;animation-duration:.3s}.Toastify__slide-exit--top-center{animation-name:Toastify__slideOutUp;animation-timing-function:ease-in;animation-duration:.3s}.Toastify__slide-exit--bottom-center{animation-name:Toastify__slideOutDown;animation-timing-function:ease-in;animation-duration:.3s}@keyframes Toastify__spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.btn-primary-global{color:var(--color-white);background-color:Var(--color-martinique);font-weight:var(--font-weight-500);font-size:var(--font-size-16px);border:none;margin-inline-end:10px;margin-top:20px;padding:6px 22px;border-radius:6px;cursor:pointer;transition:all .2s ease-in-out}.btn-primary-global:hover{color:var(--color-white);background-color:var(--hover-color-martinique)}.btn-primary-global:active{transform:scale(.96);background-color:var(--active-color-martinique)}.btn-secondary-global{color:var(--color-white);background-color:var(--color-black);font-weight:var(--font-weight-500);font-size:var(--font-size-16px);border:none;margin-inline-start:10px;margin-top:20px;padding:6px 22px;border-radius:6px;cursor:pointer;transition:all .2s ease-in-out}.btn-secondary-global:hover{color:var(--color-white);background-color:var(--hover-color-black)}.btn-secondary-global:active{transform:scale(.96);background-color:var(--active-color-black)}@media (max-width: 576px){.btn-primary-global,.btn-secondary-global{font-size:var(--font-size-12px);padding:5px 14px;margin-top:12px}}@media (min-width: 577px) and (max-width: 768px){.btn-primary-global,.btn-secondary-global{font-size:var(--font-size-14px);padding:5px 16px}}@media (min-width: 769px) and (max-width: 992px){.btn-primary-global,.btn-secondary-global{font-size:var(--font-size-14px);padding:6px 20px}}@media (min-width: 993px) and (max-width: 1200px){.btn-primary-global,.btn-secondary-global{font-size:var(--font-size-16px);padding:7px 22px}}@media (min-width: 1201px){.btn-primary-global,.btn-secondary-global{font-size:var(--font-size-18px);padding:8px 24px}}.btn-primary-global:disabled{pointer-events:none;opacity:.6;cursor:not-allowed}.mapping-form .mapping-sections{display:flex}.mapping-form label,.branch-form label{font-weight:600;margin-bottom:.5rem}.mapping-form .mapping-submit-btn{align-self:flex-start;margin-top:1rem;margin-inline-end:10px;width:100px;background-color:#009e9c;color:#fff;padding:5px 10px;border:none;border-radius:10px;cursor:pointer;transition:background-color .3s ease,transform .2s ease}.mapping-form .mapping-submit-btn:hover{background-color:#009e9c;color:#fff}.mapping-form .mapping-submit-btn:active{background-color:#009e9c;color:#fff;transform:scale(.95)}.mapping-form .mapping-clear-btn{align-self:flex-start;margin-top:1rem;margin-inline-start:10px;width:100px;background:#1d2d52;color:#fff;padding:5px 10px;border:none;border-radius:10px;cursor:pointer;transition:background-color .3s ease,transform .2s ease}.mapping-form .mapping-clear-btn:hover{background:#1d2d52;color:#fff}.mapping-form .mapping-clear-btn:active{background:#1d2d52;color:#fff;transform:scale(.95)}@media (min-width: 320px) and (max-width: 576px){.mapping-select .rs__control,.mapping-select .rs__menu{font-size:12px}.mapping-form .mapping-submit-btn,.mapping-form .mapping-clear-btn{font-size:13px}.mapping-form input,.branch-form input{padding:4px 7px}.branch-form input::placeholder,.mapping-form input::placeholder{font-size:14px}}@media (min-width: 577px) and (max-width: 768px){.mapping-select .rs__control,.mapping-select .rs__menu{font-size:13px}.mapping-form .mapping-submit-btn,.mapping-form .mapping-clear-btn{font-size:14px}.mapping-form,.branch-form{padding:10px}.mapping-form input,.branch-form input{padding:6px 7px}.branch-form input::placeholder,.mapping-form input::placeholder{font-size:14px}}@media (min-width: 769px) and (max-width: 1024px){.mapping-select .rs__control,.mapping-select .rs__menu{font-size:15px}.mapping-form .mapping-submit-btn{font-size:16px}.mapping-form .mapping-clear-btn{font-size:14px}}