nexus-shared 1.1.18 → 1.1.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.
- package/package.json +1 -1
- package/src/api-services/authentication-service.tsx +23 -0
- package/src/api-services/system-service.tsx +28 -315
- package/src/client.ts +2 -2
- package/src/components/documents/button.tsx +17 -11
- package/src/components/documents/icon-box.tsx +1 -1
- package/src/components/documents/tab-button.tsx +2 -2
- package/src/components/documents/tag.tsx +30 -0
- package/src/components/inputs/input-box.tsx +4 -2
- package/src/components/inputs/input-element.tsx +1 -1
- package/src/components/inputs/input-form.tsx +126 -14
- package/src/components/layouts/global-dialogbox.tsx +5 -9
- package/src/components/layouts/global-layout.tsx +3 -0
- package/src/components/layouts/layout-helpers.tsx +1 -4
- package/src/components/layouts/panels/user-panel.tsx +112 -0
- package/src/components/layouts/utility-menu.tsx +9 -29
- package/src/components/panels/theme-panel.tsx +2 -2
- package/src/helpers/browser-helpers.tsx +88 -3
- package/src/helpers/input-helpers.tsx +34 -4
- package/src/helpers/validation-helpers.tsx +302 -0
- package/src/index.ts +2 -18
- package/src/interface.ts +5 -1
- package/src/interfaces/auth-token-interfaces.tsx +6 -0
- package/src/interfaces/browser-interfaces.tsx +13 -0
- package/src/interfaces/button-interfaces.tsx +2 -2
- package/src/interfaces/http-interfaces.tsx +86 -8
- package/src/interfaces/icon-interfaces.tsx +3 -0
- package/src/interfaces/input-interfaces.tsx +61 -11
- package/src/interfaces/menu-interfaces.tsx +13 -0
- package/src/interfaces/message-interfaces.tsx +32 -0
- package/src/interfaces/storage-interfaces.tsx +2 -0
- package/src/interfaces/theme-interfaces.tsx +43 -129
- package/src/interfaces/type-interfaces.tsx +8 -2
- package/src/interfaces/user-interfaces.tsx +47 -0
- package/src/nexus.environments.tsx +41 -24
- package/src/proxy-api/proxy-backend.tsx +60 -0
- package/src/proxy-api/proxy-constants.tsx +28 -0
- package/src/proxy-api/proxy-helpers.tsx +91 -0
- package/src/proxy-api-client.tsx +1 -0
- package/src/proxy-api-server.tsx +2 -0
- package/src/services/http-client-services.tsx +26 -11
- package/src/services/http-services.tsx +42 -27
- package/src/services/loader-service.tsx +34 -17
- package/src/services/localstorage-service.tsx +81 -5
- package/src/services/message-services.tsx +383 -0
- package/src/services/theme-service.tsx +30 -16
- package/src/services/user-services.tsx +10 -0
- package/src/sso-config/auth-token-validation.ts +16 -0
- package/src/sso-config/callback-route.tsx +35 -0
- package/src/sso-config/cookie-encryption.ts +51 -0
- package/src/sso-config/cookie-helpers.tsx +102 -0
- package/src/sso-config/forgot-password-route.tsx +36 -0
- package/src/sso-config/oauth-callback-state.ts +61 -0
- package/src/sso-config/pkce-helpers.ts +9 -0
- package/src/sso-config/provider-complete-route.tsx +18 -0
- package/src/sso-config/redirect-context-actions.tsx +45 -0
- package/src/sso-config/redirect-context-helpers.tsx +159 -0
- package/src/sso-config/redirect-context-persist.tsx +18 -0
- package/src/sso-config/redirect-context-route.tsx +45 -0
- package/src/sso-config/refresh-route.tsx +23 -0
- package/src/sso-config/sign-in-route.tsx +74 -0
- package/src/sso-config/sign-out-route.tsx +57 -0
- package/src/sso-config/sign-up-route.tsx +57 -0
- package/src/sso-config/sso-backend-flow.ts +38 -0
- package/src/sso-config/sso-complete-route.tsx +50 -0
- package/src/sso-config/sso-config.ts +59 -0
- package/src/sso-config/sso-interfaces.tsx +99 -0
- package/src/sso-config/sso-response-helpers.tsx +20 -0
- package/src/sso-server.tsx +21 -1
- package/src/styles/nexus.dialog.css +3 -0
- package/src/styles/nexus.icon.css +1 -0
- package/src/styles/nexus.logic.css +34 -5
- package/src/interfaces/sso-interfaces.tsx +0 -52
- package/src/load-env.ts +0 -2
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { EButtonTypes, ETargets } from "./button-interfaces";
|
|
2
2
|
import { DatasourceTypes } from "./datasource-interfaces";
|
|
3
3
|
import { IColumn } from "./datatable-interfaces";
|
|
4
|
+
import { EActions, IApiInformations, IErrorRespose, ISuccessResponse } from "./http-interfaces";
|
|
4
5
|
import { EIcons, EIconTypes } from "./icon-interfaces";
|
|
5
6
|
import { EFlexPositions, EOpacity, ESizes } from "./layout-interfaces";
|
|
6
7
|
import { EBackgrounds } from "./theme-interfaces";
|
|
@@ -11,11 +12,16 @@ export type OnElementLoad = (inputBox: HTMLElement | null, inputWrapper: HTMLEle
|
|
|
11
12
|
export type AutoCompletes = "on" | "off";
|
|
12
13
|
export type ForceChangeDefaultValue<T> = (defaultValue: T, type?: EValueChangeTypes, invokeOnChanged?: boolean | UN) => boolean;
|
|
13
14
|
export type OnFormChangeHandler = (currentValue: any, isInitilizing: boolean, isForcedChanged: boolean, isDisposed: boolean, currentKey: string, index: number, type?: EValueChangeTypes, dataSource?: any | any[]) => void;
|
|
15
|
+
export type OnFormSubmitHandler = (currentValue: any, isValidForm: boolean, event: Event, form: IFormCreateResults, defaultValue: any | UN) => void;
|
|
16
|
+
export type OnApiFormSubmitHandler = (currentValue: any, apiResponse: ISuccessResponse | IErrorRespose, formResults: ISubmitFormCreateResults, defaultValue: any | UN) => void;
|
|
17
|
+
export type OverrideValidation = (currentValue: any, isValidForm: boolean, formReference: IFormCreateResults | null, action?: EActions | UN) => boolean;
|
|
18
|
+
export type RegexTypes = ERegexs | string[] | UN;
|
|
14
19
|
|
|
15
20
|
export const DEFAULT_INPUT_BACKGROUND = EBackgrounds.Background1;
|
|
16
21
|
export const MAX_INPUT_TYPE = 1900;
|
|
17
22
|
export const DEFAULT_INPUT_BORDER_SIZE = 1;
|
|
18
23
|
export const DEFAULT_TEXTAREA_ROWS = 3;
|
|
24
|
+
export const DEFAULT_ROW_GAP = 3;
|
|
19
25
|
|
|
20
26
|
export const REQUIRED_TEXT1 = "✲";
|
|
21
27
|
|
|
@@ -28,18 +34,20 @@ export enum EValueChangeTypes {
|
|
|
28
34
|
}
|
|
29
35
|
export enum ERegexs {
|
|
30
36
|
Fullname = "^[A-Za-z]+(?: [A-Za-z]+)*[0-9]?$",
|
|
31
|
-
Username = "^[A-Za-z0-9]{7,30}$",
|
|
32
|
-
ContactNumber = "^[0-9]{10}$",
|
|
33
|
-
/** Allow Null */
|
|
34
|
-
ContactNumber_NULL = "^$|^[0-9]{10}$",
|
|
35
37
|
Email = "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$",
|
|
36
38
|
/** Allow Null */
|
|
37
39
|
Email_NULL = "^$|^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+.[a-zA-Z]{2,}$",
|
|
38
40
|
EmailUsername = "^(?=.*[a-zA-Z0-9])[a-zA-Z0-9]+@[a-zA-Z0-9]+\\.[a-zA-Z]{2,}$|[a-zA-Z0-9]{8,100}$",
|
|
39
41
|
Password = "^(?=.*[a-z])(?=.*[A-Z])(?=.*[0-9])(?=.*[!@#$%^&*()_+{}|:,.<>?/~]).{8,30}$",
|
|
40
|
-
EmailUsernameContact = "^(?:[A-Za-z]+[A-Za-z0-9]{2,30}|[0-9]{10}|[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,})$",
|
|
41
42
|
Hexadecimal = "^[0-9A-Fa-f]{8}$",
|
|
42
43
|
ContactEmail = "^(?:[0-9]{10}|[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,})$",
|
|
44
|
+
|
|
45
|
+
/** Allow Null */
|
|
46
|
+
ContactNumber_NULL = "^$|^[0-9]{10}$",
|
|
47
|
+
|
|
48
|
+
ContactNumber = "^[0-9]{10}$",
|
|
49
|
+
Username = "^(?!.*[._-]{2})[a-zA-Z0-9]+(?:[._-][a-zA-Z0-9]+)*$",
|
|
50
|
+
EmailUsernameMobile = "^(?:[0-9]{10}|(?!.*[._-]{2})[a-zA-Z0-9]+(?:[._-][a-zA-Z0-9]+)*|[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[A-Za-z]{2,})$",
|
|
43
51
|
}
|
|
44
52
|
export enum EInputTypes {
|
|
45
53
|
Textbox = 1,
|
|
@@ -119,7 +127,7 @@ export interface ISubmitbutton extends IElement {
|
|
|
119
127
|
}
|
|
120
128
|
export interface ITextbox extends IInputParameters<string | null> {
|
|
121
129
|
isPassword?: boolean | UN;
|
|
122
|
-
regexKey?:
|
|
130
|
+
regexKey?: RegexTypes | UN;
|
|
123
131
|
}
|
|
124
132
|
export interface ISlider extends IInputParameters<number | null> {
|
|
125
133
|
step?: number | UN;
|
|
@@ -133,7 +141,7 @@ export interface IRadiobox extends ICheckbox {}
|
|
|
133
141
|
export interface ITextarea extends IInputParameters<string | null> {
|
|
134
142
|
isShowPreview?: boolean | UN;
|
|
135
143
|
rows?: number | UN;
|
|
136
|
-
regexKey?:
|
|
144
|
+
regexKey?: RegexTypes | UN;
|
|
137
145
|
}
|
|
138
146
|
export interface INumber extends IInputParameters<number | null> {
|
|
139
147
|
floatingPoint?: number | UN;
|
|
@@ -176,18 +184,60 @@ export interface IForm {
|
|
|
176
184
|
onChanged: OnFormChangeHandler;
|
|
177
185
|
index: number;
|
|
178
186
|
isTabularForm: boolean;
|
|
179
|
-
parentIdentifier: HTMLElement | UN | string;
|
|
180
187
|
defaultValue?: any | UN;
|
|
181
188
|
}
|
|
189
|
+
export interface ISubmitForm {
|
|
190
|
+
inputs: IInputRootParameters<any>[];
|
|
191
|
+
onChanged: OnFormChangeHandler | UN;
|
|
192
|
+
defaultValue?: DatasourceTypes | UN;
|
|
193
|
+
onSubmit: OnFormSubmitHandler;
|
|
194
|
+
onCancelClick?: ClickHandler | UN;
|
|
195
|
+
overrideValidation?: OverrideValidation | UN;
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
export interface IApiForm {
|
|
199
|
+
inputs: IInputRootParameters<any>[];
|
|
200
|
+
api: IApiInformations;
|
|
201
|
+
onApiSubmit: OnApiFormSubmitHandler;
|
|
202
|
+
onChanged: OnFormChangeHandler | UN;
|
|
203
|
+
onSubmit: OnFormSubmitHandler | UN;
|
|
204
|
+
defaultValue?: DatasourceTypes | UN;
|
|
205
|
+
onCancelClick?: ClickHandler | UN;
|
|
206
|
+
overrideValidation?: OverrideValidation | UN;
|
|
207
|
+
}
|
|
208
|
+
|
|
182
209
|
export interface IFormCreateResults {
|
|
183
210
|
inputResults: IInputCreateResults[];
|
|
184
211
|
formElement: HTMLElement;
|
|
185
212
|
dispose: (invokeOnChanged?: boolean) => void;
|
|
186
213
|
forceChangeDefaultValue: ForceChangeDefaultValue<any> | null;
|
|
187
214
|
}
|
|
215
|
+
export interface ISubmitFormCreateResults {
|
|
216
|
+
formElement: HTMLElement;
|
|
217
|
+
dispose: () => void;
|
|
218
|
+
formObject: IFormCreateResults;
|
|
219
|
+
}
|
|
188
220
|
|
|
189
221
|
export const GetForms = {
|
|
190
|
-
FORM: (inputs: IInputRootParameters<any>[],
|
|
222
|
+
FORM: (inputs: IInputRootParameters<any>[], onChanged: OnFormChangeHandler, defaultValue?: any | UN, index?: number | UN, isTabularForm?: boolean | UN): IForm => ({ inputs, onChanged, index: index ?? 0, isTabularForm: isTabularForm ?? false, defaultValue }),
|
|
223
|
+
SUBMITFORM: (inputs: IInputRootParameters<any>[], onSubmit: OnFormSubmitHandler, defaultValue?: DatasourceTypes | UN, overrideValidation?: OverrideValidation | UN, onChanged?: OnFormChangeHandler | UN, onCancelClick?: ClickHandler | UN): ISubmitForm => ({
|
|
224
|
+
inputs,
|
|
225
|
+
onChanged,
|
|
226
|
+
defaultValue,
|
|
227
|
+
onSubmit,
|
|
228
|
+
onCancelClick,
|
|
229
|
+
overrideValidation,
|
|
230
|
+
}),
|
|
231
|
+
APIFORM: (inputs: IInputRootParameters<any>[], api: IApiInformations, onApiSubmit: OnApiFormSubmitHandler, defaultValue?: DatasourceTypes | UN, onSubmit?: OnFormSubmitHandler | UN, overrideValidation?: OverrideValidation | UN, onCancelClick?: ClickHandler | UN, onChanged?: OnFormChangeHandler | UN): IApiForm => ({
|
|
232
|
+
inputs,
|
|
233
|
+
api,
|
|
234
|
+
onApiSubmit,
|
|
235
|
+
onChanged,
|
|
236
|
+
defaultValue,
|
|
237
|
+
onSubmit,
|
|
238
|
+
onCancelClick,
|
|
239
|
+
overrideValidation,
|
|
240
|
+
}),
|
|
191
241
|
};
|
|
192
242
|
export const GetInputs = {
|
|
193
243
|
ICON: (icon: EIcons, iconSize?: ESizes | UN, boxSize?: ESizes | UN, opacity?: EOpacity | UN, type?: EIconTypes | UN, background?: EBackgrounds | UN, onClicked?: ClickHandler | UN, onMouseEnter?: ClickHandler | UN): IInputIcon => ({
|
|
@@ -200,7 +250,7 @@ export const GetInputs = {
|
|
|
200
250
|
onClicked: onClicked,
|
|
201
251
|
onMouseEnter: onMouseEnter,
|
|
202
252
|
}),
|
|
203
|
-
TEXTBOX: (id: string, columnSize: number, displayOrder: number, label?: string | UN, placeholder?: string | UN, validatorKey?: string | UN, minLength?: number | UN, maxLength?: number | UN, regexKey?:
|
|
253
|
+
TEXTBOX: (id: string, columnSize: number, displayOrder: number, label?: string | UN, placeholder?: string | UN, validatorKey?: string | UN, minLength?: number | UN, maxLength?: number | UN, regexKey?: RegexTypes | UN, isPassword?: boolean | UN, isReadonly?: boolean | UN, isAutoComplete?: boolean | UN, defaultValue?: string | UN, background?: EBackgrounds | UN, borderSize?: number | UN, inputSize?: ESizes | UN, icon?: IInputIcon | UN, defaultClass?: string | UN, onChanged?: OnInputChangeHandler<string | null> | UN): ITextbox => ({
|
|
204
254
|
id: id,
|
|
205
255
|
columnSize: columnSize,
|
|
206
256
|
displayOrder: displayOrder,
|
|
@@ -223,7 +273,7 @@ export const GetInputs = {
|
|
|
223
273
|
inputType: EInputTypes.Textbox,
|
|
224
274
|
autoComplete: isAutoComplete !== false ? undefined : "off",
|
|
225
275
|
}),
|
|
226
|
-
TEXTAREA: (id: string, columnSize: number, displayOrder: number, label?: string | UN, placeholder?: string | UN, validatorKey?: string | UN, minLength?: number | UN, maxLength?: number | UN, rows?: number | UN, isShowPreview?: boolean | UN, defaultValue?: string | UN, regexKey?:
|
|
276
|
+
TEXTAREA: (id: string, columnSize: number, displayOrder: number, label?: string | UN, placeholder?: string | UN, validatorKey?: string | UN, minLength?: number | UN, maxLength?: number | UN, rows?: number | UN, isShowPreview?: boolean | UN, defaultValue?: string | UN, regexKey?: RegexTypes | UN, isReadonly?: boolean | UN, isAutoComplete?: boolean | UN, background?: EBackgrounds | UN, borderSize?: number | UN, inputSize?: ESizes | UN, icon?: IInputIcon | UN, defaultClass?: string | UN, onChanged?: OnInputChangeHandler<string | null> | UN): ITextarea => ({
|
|
227
277
|
id: id,
|
|
228
278
|
columnSize: columnSize,
|
|
229
279
|
displayOrder: displayOrder,
|
|
@@ -34,3 +34,16 @@ export interface IClientMenu extends IMenuBase {
|
|
|
34
34
|
pageTitle: string;
|
|
35
35
|
breadcrumbTitle?: string;
|
|
36
36
|
}
|
|
37
|
+
export const BUTTON_IDENTITY = (isneedPrefix: boolean) => {
|
|
38
|
+
const _ = isneedPrefix ? UTILITIES_BUTTON_PREFIX : "";
|
|
39
|
+
return {
|
|
40
|
+
PROFILE_BOX: `${_}profile`,
|
|
41
|
+
SEARCH_BOX: `${_}root-search`,
|
|
42
|
+
FAVORITE_BOX: `${_}favorite-menu`,
|
|
43
|
+
CARD_BOX: `${_}cart-menu`,
|
|
44
|
+
THEME_BOX: `${_}switch-theme`,
|
|
45
|
+
MEGA_BOX: `${_}mega-menu`,
|
|
46
|
+
SIGN_IN_BUTTON: `${_}sign-in`,
|
|
47
|
+
SIGN_OUT_BUTTON: `${_}sign-out`,
|
|
48
|
+
};
|
|
49
|
+
};
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { EIcons } from "./icon-interfaces";
|
|
2
|
+
import { EBackgrounds } from "./theme-interfaces";
|
|
3
|
+
|
|
4
|
+
export enum EMessageTypes {
|
|
5
|
+
Information = EBackgrounds.InfoColor,
|
|
6
|
+
Success = EBackgrounds.SuccessColor,
|
|
7
|
+
Warning = EBackgrounds.WarningColor,
|
|
8
|
+
Error = EBackgrounds.ErrorColor,
|
|
9
|
+
}
|
|
10
|
+
export enum EMessageIcons {
|
|
11
|
+
Information = EIcons.INFORMATION,
|
|
12
|
+
Success = EIcons.CHECKMARK_DOUBLE,
|
|
13
|
+
Warning = EIcons.WARNING,
|
|
14
|
+
Error = EIcons.CLOSE,
|
|
15
|
+
Question = EIcons.HELP,
|
|
16
|
+
Delete = EIcons.TRASH,
|
|
17
|
+
Bin = EIcons.TRASH_BIN,
|
|
18
|
+
}
|
|
19
|
+
export enum EMessageResult {
|
|
20
|
+
OK = "OK",
|
|
21
|
+
Yes = "Yes",
|
|
22
|
+
No = "No",
|
|
23
|
+
Cancel = "Cancel",
|
|
24
|
+
Undefined = "Undefined",
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export enum EMessageBoxButtons {
|
|
28
|
+
OK = "OK",
|
|
29
|
+
YES_NO = "Yes_No",
|
|
30
|
+
YES_CANCEL = "Yes_Cancel",
|
|
31
|
+
YES_NO_CANCEL = "Yes_No_Cancel",
|
|
32
|
+
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { EIcons } from "./icon-interfaces";
|
|
2
|
+
import { UN } from "./type-interfaces";
|
|
2
3
|
|
|
3
4
|
export const DEFAULT_THEME_NAME = "light";
|
|
4
5
|
|
|
@@ -43,25 +44,57 @@ export enum EBackgrounds {
|
|
|
43
44
|
ThemeColor800 = "bg800",
|
|
44
45
|
ThemeColor950 = "bg950",
|
|
45
46
|
}
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
47
|
+
export enum ETextColors {
|
|
48
|
+
TextColor1 = "var(--T1)",
|
|
49
|
+
TextColor2 = "var(--T2)",
|
|
50
|
+
TextColor3 = "var(--T3)",
|
|
51
|
+
TextColor10 = "var(--T10)",
|
|
52
|
+
TextColor11 = "var(--T11)",
|
|
53
|
+
TextColor12 = "var(--T12)",
|
|
54
|
+
TextColor13 = "var(--T13)",
|
|
55
|
+
TextColor20 = "var(--T20)",
|
|
56
|
+
TextColor30 = "var(--T30)",
|
|
57
|
+
TextColor41 = "var(--T41)",
|
|
58
|
+
TextColor51 = "var(--T51)",
|
|
59
|
+
TextColor52 = "var(--T52)",
|
|
60
|
+
TextColor100 = "var(--T100)",
|
|
61
|
+
TextColor200 = "var(--T200)",
|
|
62
|
+
TextColor400 = "var(--T400)",
|
|
63
|
+
TextColor600 = "var(--T600)",
|
|
64
|
+
TextColor800 = "var(--T800)",
|
|
65
|
+
TextColor950 = "var(--T950)",
|
|
66
|
+
}
|
|
67
|
+
export enum EColorTypes {
|
|
68
|
+
Background = "--B",
|
|
69
|
+
Hover = "--H",
|
|
70
|
+
Focus = "--F",
|
|
71
|
+
Text = "--T",
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
export interface IThemeInformation {
|
|
75
|
+
displayName: string;
|
|
76
|
+
systemName: string;
|
|
77
|
+
displayOrder: number;
|
|
78
|
+
iconName: EIcons;
|
|
79
|
+
id?: string | UN;
|
|
80
|
+
|
|
81
|
+
/** Background Color 1 */
|
|
49
82
|
C1: string;
|
|
50
|
-
|
|
83
|
+
/** Background Color 2 */
|
|
51
84
|
C2: string;
|
|
52
|
-
|
|
85
|
+
/** Background Color 3 */
|
|
53
86
|
C3: string;
|
|
54
87
|
|
|
55
|
-
|
|
88
|
+
/** Success Color */
|
|
56
89
|
C10: string;
|
|
57
|
-
|
|
90
|
+
/** Warning/Reset/Clear Color */
|
|
58
91
|
C11: string;
|
|
59
|
-
|
|
92
|
+
/** Info Color */
|
|
60
93
|
C12: string;
|
|
61
|
-
|
|
94
|
+
/** Error/Delete/Remove Color */
|
|
62
95
|
C13: string;
|
|
63
96
|
|
|
64
|
-
|
|
97
|
+
/** Primary/Submit/Link Button Color */
|
|
65
98
|
C20: string;
|
|
66
99
|
|
|
67
100
|
/** Border Color 1 */
|
|
@@ -88,122 +121,3 @@ export interface IThemeColors {
|
|
|
88
121
|
/** Theme Color 950 */
|
|
89
122
|
C950: string;
|
|
90
123
|
}
|
|
91
|
-
export interface IThemeInformation {
|
|
92
|
-
displayName: string;
|
|
93
|
-
systemName: string;
|
|
94
|
-
displayOrder: number;
|
|
95
|
-
icon: EIcons;
|
|
96
|
-
themeColors: IThemeColors;
|
|
97
|
-
isSystemTheme: boolean;
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
export const DEFAULT_THEME_INFORMATIONS: IThemeInformation[] = [
|
|
101
|
-
{
|
|
102
|
-
displayName: "Light",
|
|
103
|
-
systemName: DEFAULT_THEME_NAME,
|
|
104
|
-
displayOrder: 0,
|
|
105
|
-
icon: EIcons.SUNNY,
|
|
106
|
-
themeColors: {
|
|
107
|
-
C1: "rgb(255, 255, 255)|rgb(240, 240, 240)|rgb(225, 225, 225)|rgb(0, 0, 0)",
|
|
108
|
-
C2: "rgb(245, 245, 245)|rgb(230, 230, 230)|rgb(215, 215, 215)|rgb(0, 0, 0)",
|
|
109
|
-
C3: "rgb(230, 230, 230)|rgb(200, 200, 200)|rgb(185, 185, 185)|rgb(0, 0, 0)",
|
|
110
|
-
C10: "rgb(34, 187, 51)|rgb(0, 150, 80)|rgb(20, 120, 40)|rgb(255, 255, 255)",
|
|
111
|
-
C11: "rgb(240, 173, 78)|rgb(210, 140, 50)|rgb(180, 110, 20)|rgb(255, 255, 255)",
|
|
112
|
-
C12: "rgb(76, 185, 255)|rgb(100, 180, 255)|rgb(80, 160, 220)|rgb(255, 255, 255)",
|
|
113
|
-
C13: "rgb(255, 102, 102)|rgb(220, 80, 80)|rgb(190, 60, 60)|rgb(255, 255, 255)",
|
|
114
|
-
C20: "rgb(47, 81, 255)|rgb(30, 60, 220)|rgb(20, 40, 180)|rgb(255, 255, 255)",
|
|
115
|
-
C30: "rgb(200, 200, 200)|rgb(180, 180, 180)|rgb(160, 160, 160)|rgb(0, 0, 0)",
|
|
116
|
-
C41: "rgba(0, 0, 0, 0.4)|rgb(150, 150, 150)|rgb(120, 120, 120)|rgb(0, 0, 0)",
|
|
117
|
-
C51: "rgba(0, 0, 0, 0.6)|rgb(0, 0, 0, 0.8)|rgb(0, 0, 0, 0.9)|rgb(255, 255, 255)",
|
|
118
|
-
C52: "rgb(60, 60, 60)|rgb(85, 85, 85)|rgb(35, 35, 35)|rgb(255, 255, 255)",
|
|
119
|
-
C100: "rgb(213, 228, 255)|rgb(200, 210, 255)|rgb(185, 200, 220)|rgb(0, 0, 0)",
|
|
120
|
-
C200: "rgb(179, 205, 255)|rgb(160, 180, 255)|rgb(140, 160, 220)|rgb(0, 0, 0)",
|
|
121
|
-
C400: "rgb(86, 126, 255)|rgb(60, 90, 220)|rgb(40, 60, 180)|rgb(255, 255, 255)",
|
|
122
|
-
C600: "rgb(12, 33, 255)|rgb(10, 20, 220)|rgb(8, 15, 180)|rgb(255, 255, 255)",
|
|
123
|
-
C800: "rgb(6, 22, 205)|rgb(4, 15, 180)|rgb(2, 10, 120)|rgb(255, 255, 255)",
|
|
124
|
-
C950: "rgb(10, 17, 92)|rgb(8, 12, 70)|rgb(6, 9, 40)|rgb(255, 255, 255)",
|
|
125
|
-
},
|
|
126
|
-
isSystemTheme: true,
|
|
127
|
-
},
|
|
128
|
-
{
|
|
129
|
-
displayName: "Dark",
|
|
130
|
-
displayOrder: 1,
|
|
131
|
-
icon: EIcons.MOON,
|
|
132
|
-
systemName: "dark",
|
|
133
|
-
themeColors: {
|
|
134
|
-
C1: "rgb(50, 50, 50)|rgb(40, 40, 40)|rgb(30, 30, 30)|rgb(220, 220, 220)",
|
|
135
|
-
C2: "rgb(65, 65, 65)|rgb(55, 55, 55)|rgb(45, 45, 45)|rgb(220, 220, 220)",
|
|
136
|
-
C3: "rgb(70, 70, 70)|rgb(60, 60, 60)|rgb(50, 50, 50)|rgb(220, 220, 220)",
|
|
137
|
-
C10: "rgb(34, 187, 51)|rgb(0, 150, 80)|rgb(20, 120, 40)|rgb(255, 255, 255)",
|
|
138
|
-
C11: "rgb(240, 173, 78)|rgb(210, 140, 50)|rgb(180, 110, 20)|rgb(255, 255, 255)",
|
|
139
|
-
C12: "rgb(76, 185, 255)|rgb(100, 180, 255)|rgb(80, 160, 220)|rgb(255, 255, 255)",
|
|
140
|
-
C13: "rgb(255, 102, 102)|rgb(220, 80, 80)|rgb(190, 60, 60)|rgb(255, 255, 255)",
|
|
141
|
-
C20: "rgb(47, 81, 255)|rgb(30, 60, 220)|rgb(20, 40, 180)|rgb(255, 255, 255)",
|
|
142
|
-
C30: "rgb(100, 100, 100)|rgb(90, 90, 90)|rgb(80, 80, 80)|rgb(220, 220, 220)",
|
|
143
|
-
C41: "rgb(100, 100, 100)|rgb(255, 255, 255)|rgb(120, 120, 120)|rgb(0, 0, 0)",
|
|
144
|
-
C51: "rgba(0, 0, 0, 0.6)|rgb(0, 0, 0, 0.8)|rgb(0, 0, 0, 0.9)|rgb(255, 255, 255)",
|
|
145
|
-
C52: "rgb(60, 60, 60)|rgb(85, 85, 85)|rgb(35, 35, 35)|rgb(255, 255, 255)",
|
|
146
|
-
C100: "rgb(213, 228, 255)|rgb(200, 210, 255)|rgb(185, 200, 220)|rgb(0, 0, 0)",
|
|
147
|
-
C200: "rgb(179, 205, 255)|rgb(160, 180, 255)|rgb(140, 160, 220)|rgb(0, 0, 0)",
|
|
148
|
-
C400: "rgb(86, 126, 255)|rgb(60, 90, 220)|rgb(40, 60, 180)|rgb(255, 255, 255)",
|
|
149
|
-
C600: "rgb(12, 33, 255)|rgb(10, 20, 220)|rgb(8, 15, 180)|rgb(255, 255, 255)",
|
|
150
|
-
C800: "rgb(6, 22, 205)|rgb(4, 15, 180)|rgb(2, 10, 120)|rgb(255, 255, 255)",
|
|
151
|
-
C950: "rgb(10, 17, 92)|rgb(8, 12, 70)|rgb(6, 9, 40)|rgb(255, 255, 255)",
|
|
152
|
-
},
|
|
153
|
-
isSystemTheme: true,
|
|
154
|
-
},
|
|
155
|
-
{
|
|
156
|
-
displayName: "Light2",
|
|
157
|
-
systemName: "light2",
|
|
158
|
-
displayOrder: 0,
|
|
159
|
-
icon: EIcons.SUNNY,
|
|
160
|
-
themeColors: {
|
|
161
|
-
C1: "rgb(255, 255, 255)|rgb(240, 240, 240)|rgb(225, 225, 225)|rgb(0, 0, 0)",
|
|
162
|
-
C2: "rgb(245, 245, 245)|rgb(230, 230, 230)|rgb(215, 215, 215)|rgb(0, 0, 0)",
|
|
163
|
-
C3: "rgb(230, 230, 230)|rgb(200, 200, 200)|rgb(185, 185, 185)|rgb(0, 0, 0)",
|
|
164
|
-
C10: "rgb(34, 187, 51)|rgb(0, 150, 80)|rgb(20, 120, 40)|rgb(255, 255, 255)",
|
|
165
|
-
C11: "rgb(240, 173, 78)|rgb(210, 140, 50)|rgb(180, 110, 20)|rgb(255, 255, 255)",
|
|
166
|
-
C12: "rgb(76, 185, 255)|rgb(100, 180, 255)|rgb(80, 160, 220)|rgb(255, 255, 255)",
|
|
167
|
-
C13: "rgb(255, 102, 102)|rgb(220, 80, 80)|rgb(190, 60, 60)|rgb(255, 255, 255)",
|
|
168
|
-
C20: "rgb(47, 81, 255)|rgb(30, 60, 220)|rgb(20, 40, 180)|rgb(255, 255, 255)",
|
|
169
|
-
C30: "rgb(200, 200, 200)|rgb(180, 180, 180)|rgb(160, 160, 160)|rgb(0, 0, 0)",
|
|
170
|
-
C41: "rgba(0, 0, 0, 0.4)|rgb(150, 150, 150)|rgb(120, 120, 120)|rgb(0, 0, 0)",
|
|
171
|
-
C51: "rgba(0, 0, 0, 0.6)|rgb(0, 0, 0, 0.8)|rgb(0, 0, 0, 0.9)|rgb(255, 255, 255)",
|
|
172
|
-
C52: "rgb(60, 60, 60)|rgb(85, 85, 85)|rgb(35, 35, 35)|rgb(255, 255, 255)",
|
|
173
|
-
C100: "rgb(213, 228, 255)|rgb(200, 210, 255)|rgb(185, 200, 220)|rgb(0, 0, 0)",
|
|
174
|
-
C200: "rgb(179, 205, 255)|rgb(160, 180, 255)|rgb(140, 160, 220)|rgb(0, 0, 0)",
|
|
175
|
-
C400: "rgb(86, 126, 255)|rgb(60, 90, 220)|rgb(40, 60, 180)|rgb(255, 255, 255)",
|
|
176
|
-
C600: "rgb(12, 33, 255)|rgb(10, 20, 220)|rgb(8, 15, 180)|rgb(255, 255, 255)",
|
|
177
|
-
C800: "rgb(6, 22, 205)|rgb(4, 15, 180)|rgb(2, 10, 120)|rgb(255, 255, 255)",
|
|
178
|
-
C950: "rgb(10, 17, 92)|rgb(8, 12, 70)|rgb(6, 9, 40)|rgb(255, 255, 255)",
|
|
179
|
-
},
|
|
180
|
-
isSystemTheme: true,
|
|
181
|
-
},
|
|
182
|
-
{
|
|
183
|
-
displayName: "Dark2",
|
|
184
|
-
displayOrder: 1,
|
|
185
|
-
icon: EIcons.MOON,
|
|
186
|
-
systemName: "dark2",
|
|
187
|
-
themeColors: {
|
|
188
|
-
C1: "rgb(50, 50, 50)|rgb(40, 40, 40)|rgb(30, 30, 30)|rgb(220, 220, 220)",
|
|
189
|
-
C2: "rgb(65, 65, 65)|rgb(55, 55, 55)|rgb(45, 45, 45)|rgb(220, 220, 220)",
|
|
190
|
-
C3: "rgb(70, 70, 70)|rgb(60, 60, 60)|rgb(50, 50, 50)|rgb(220, 220, 220)",
|
|
191
|
-
C10: "rgb(34, 187, 51)|rgb(0, 150, 80)|rgb(20, 120, 40)|rgb(255, 255, 255)",
|
|
192
|
-
C11: "rgb(240, 173, 78)|rgb(210, 140, 50)|rgb(180, 110, 20)|rgb(255, 255, 255)",
|
|
193
|
-
C12: "rgb(76, 185, 255)|rgb(100, 180, 255)|rgb(80, 160, 220)|rgb(255, 255, 255)",
|
|
194
|
-
C13: "rgb(255, 102, 102)|rgb(220, 80, 80)|rgb(190, 60, 60)|rgb(255, 255, 255)",
|
|
195
|
-
C20: "rgb(47, 81, 255)|rgb(30, 60, 220)|rgb(20, 40, 180)|rgb(255, 255, 255)",
|
|
196
|
-
C30: "rgb(100, 100, 100)|rgb(90, 90, 90)|rgb(80, 80, 80)|rgb(220, 220, 220)",
|
|
197
|
-
C41: "rgb(100, 100, 100)|rgb(255, 255, 255)|rgb(120, 120, 120)|rgb(0, 0, 0)",
|
|
198
|
-
C51: "rgba(0, 0, 0, 0.6)|rgb(0, 0, 0, 0.8)|rgb(0, 0, 0, 0.9)|rgb(255, 255, 255)",
|
|
199
|
-
C52: "rgb(60, 60, 60)|rgb(85, 85, 85)|rgb(35, 35, 35)|rgb(255, 255, 255)",
|
|
200
|
-
C100: "rgb(213, 228, 255)|rgb(200, 210, 255)|rgb(185, 200, 220)|rgb(0, 0, 0)",
|
|
201
|
-
C200: "rgb(179, 205, 255)|rgb(160, 180, 255)|rgb(140, 160, 220)|rgb(0, 0, 0)",
|
|
202
|
-
C400: "rgb(86, 126, 255)|rgb(60, 90, 220)|rgb(40, 60, 180)|rgb(255, 255, 255)",
|
|
203
|
-
C600: "rgb(12, 33, 255)|rgb(10, 20, 220)|rgb(8, 15, 180)|rgb(255, 255, 255)",
|
|
204
|
-
C800: "rgb(6, 22, 205)|rgb(4, 15, 180)|rgb(2, 10, 120)|rgb(255, 255, 255)",
|
|
205
|
-
C950: "rgb(10, 17, 92)|rgb(8, 12, 70)|rgb(6, 9, 40)|rgb(255, 255, 255)",
|
|
206
|
-
},
|
|
207
|
-
isSystemTheme: true,
|
|
208
|
-
},
|
|
209
|
-
];
|
|
@@ -15,8 +15,14 @@ export type ObjectCallbackHandler<T> = CallbackHandler<T, T>;
|
|
|
15
15
|
export type ObjectNullCallbackHandler<T> = CallbackHandler<T | UN, T | UN>;
|
|
16
16
|
export type ArrayCallbackHandler<T> = CallbackHandler<T[], T[]>;
|
|
17
17
|
export type ArrayNullCallbackHandler<T> = CallbackHandler<T[] | UN, T[] | UN>;
|
|
18
|
-
export type VoidCallbackHandler = CallbackHandler<void, void>;
|
|
19
|
-
|
|
18
|
+
export type VoidCallbackHandler = CallbackHandler<void | any | any[] | UN, void>;
|
|
19
|
+
export type PopupMessageCallback = (type: ECallbackTypes) => void;
|
|
20
20
|
export interface IInterface {
|
|
21
21
|
// Blank Interface
|
|
22
22
|
}
|
|
23
|
+
|
|
24
|
+
export enum ECallbackTypes {
|
|
25
|
+
Initialize = 0,
|
|
26
|
+
Destroy = 1,
|
|
27
|
+
ForceChangeValue = 2,
|
|
28
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { EModules } from "./system-interfaces";
|
|
2
|
+
import { UN } from "./type-interfaces";
|
|
3
|
+
|
|
4
|
+
export enum EUserRoles {
|
|
5
|
+
Guest = 0,
|
|
6
|
+
User = 1,
|
|
7
|
+
Admin = 2,
|
|
8
|
+
SuperAdmin = 3,
|
|
9
|
+
}
|
|
10
|
+
export const IsAdmin = (userRole: EUserRoles | string | UN) => userRole === EUserRoles.Admin || EUserRoles[EUserRoles.Admin] === userRole;
|
|
11
|
+
export const IsSuperAdmin = (userRole: EUserRoles | string | UN) => userRole === EUserRoles.SuperAdmin || EUserRoles[EUserRoles.SuperAdmin] === userRole;
|
|
12
|
+
export const IsAdmin_SuperAdmin = (userRole: EUserRoles | string | UN) => IsAdmin(userRole) || IsSuperAdmin(userRole);
|
|
13
|
+
export const IsUser = (userRole: EUserRoles | string | UN) => userRole === EUserRoles.User || EUserRoles[EUserRoles.User] === userRole;
|
|
14
|
+
export const IsGuest = (userRole: EUserRoles | string | UN) => userRole === EUserRoles.Guest || EUserRoles[EUserRoles.Guest] === userRole;
|
|
15
|
+
export const IsUser_Guest = (userRole: EUserRoles | string | UN) => IsUser(userRole) || IsGuest(userRole);
|
|
16
|
+
|
|
17
|
+
export interface IUserValidationResponse {
|
|
18
|
+
isValidUser: boolean;
|
|
19
|
+
isValidCompany: boolean;
|
|
20
|
+
isValidBranch: boolean;
|
|
21
|
+
isValidFiscalYear: boolean;
|
|
22
|
+
userRole: EUserRoles;
|
|
23
|
+
assignedModules: EModules;
|
|
24
|
+
}
|
|
25
|
+
export interface ICurrentUser {
|
|
26
|
+
id: string;
|
|
27
|
+
fullname: string;
|
|
28
|
+
username: string;
|
|
29
|
+
roleName: string;
|
|
30
|
+
profilePicture: string | UN;
|
|
31
|
+
emailAddress: string | UN;
|
|
32
|
+
contactNumber: string | UN;
|
|
33
|
+
isImpersonating: boolean | UN;
|
|
34
|
+
isMultiTenant: boolean | UN;
|
|
35
|
+
enableAuditHistory: boolean | UN;
|
|
36
|
+
rootAccess: boolean | UN;
|
|
37
|
+
branchId: string | UN;
|
|
38
|
+
companyId: string | UN;
|
|
39
|
+
fiscalYearId: string | UN;
|
|
40
|
+
modules: EModules | UN;
|
|
41
|
+
}
|
|
42
|
+
export enum ESigninRequestMode {
|
|
43
|
+
DEFAULT = "0",
|
|
44
|
+
SIGN_OUT = "1",
|
|
45
|
+
SWITCH_BRANCH = "2",
|
|
46
|
+
SWITCH_FISCAL_YEAR = "3",
|
|
47
|
+
}
|
|
@@ -1,49 +1,66 @@
|
|
|
1
1
|
import { EModules } from "./interfaces/system-interfaces";
|
|
2
2
|
import { EBackgrounds } from "./interfaces/theme-interfaces";
|
|
3
3
|
|
|
4
|
+
// @ts-ignore
|
|
5
|
+
const processEnv = process.env;
|
|
6
|
+
|
|
4
7
|
export const APIS = {
|
|
5
|
-
DRIVE:
|
|
6
|
-
AUTHENTICATION:
|
|
7
|
-
CONFIGURATION:
|
|
8
|
-
CURRENT:
|
|
9
|
-
ENTERPRISE:
|
|
10
|
-
MESSAGE:
|
|
11
|
-
ACCOUNTING:
|
|
12
|
-
REPORT:
|
|
8
|
+
DRIVE: processEnv.API_DRIVE as string,
|
|
9
|
+
AUTHENTICATION: processEnv.API_AUTHENTICATION as string,
|
|
10
|
+
CONFIGURATION: processEnv.API_CONFIGURATION as string,
|
|
11
|
+
CURRENT: processEnv.API_CURRENT as string,
|
|
12
|
+
ENTERPRISE: processEnv.API_ENTERPRISE as string,
|
|
13
|
+
MESSAGE: processEnv.API_MESSAGE as string,
|
|
14
|
+
ACCOUNTING: processEnv.API_ACCOUNTING as string,
|
|
15
|
+
REPORT: processEnv.API_REPORT as string,
|
|
13
16
|
};
|
|
14
17
|
|
|
15
18
|
export const URLS = {
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
+
GLOBAL_SIGNIN: `${processEnv.URL_AUTHENTICATION}/api/auth/redirect-context`,
|
|
20
|
+
CURRENT: processEnv.URL_CURRENT as string,
|
|
21
|
+
AUTHENTICATION: processEnv.URL_AUTHENTICATION as string,
|
|
22
|
+
SIGN_IN: processEnv.URL_AUTHENTICATION_SIGN_IN as string,
|
|
23
|
+
ALLOWED_ORIGINS: (processEnv.ALLOWED_ORIGINS ?? "")
|
|
24
|
+
.split(",")
|
|
25
|
+
.map((origin: string) => origin.trim())
|
|
26
|
+
.filter(Boolean),
|
|
19
27
|
};
|
|
20
|
-
const FILE = (apiName: string, filePath: string, fileName: string) => `${
|
|
28
|
+
const FILE = (apiName: string, filePath: string, fileName: string) => `${processEnv.API_RESOURCES_BASE_PATH ?? `/api/app/${EModules.Drive}/Resources`}/${apiName}/${encodeURIComponent(filePath)}/${encodeURIComponent(fileName)}`;
|
|
21
29
|
export const FILES = {
|
|
22
30
|
LOGO: {
|
|
23
31
|
ICON: FILE("Image", "logos", "icon-logo"),
|
|
24
32
|
FULL: FILE("Image", "logos", "full-logo"),
|
|
25
33
|
FULL_TEXT: FILE("Image", "logos", "full-text-logo"),
|
|
26
34
|
},
|
|
35
|
+
ICONS: {
|
|
36
|
+
USER: FILE("Image", "icons", "user"),
|
|
37
|
+
NO_IMAGE: FILE("Image", "icons", "no-image"),
|
|
38
|
+
},
|
|
27
39
|
SCRIPT: (fileName: string, isStyles: boolean = false) => FILE("Script", isStyles ? "css" : "js", fileName),
|
|
28
40
|
};
|
|
29
41
|
export const NEXUS_INFO = {
|
|
30
|
-
IS_ADMIN_MODULE:
|
|
31
|
-
CURRENT_MODULE:
|
|
32
|
-
CURRENT_MODULE_NAME:
|
|
33
|
-
CURRENT_MODULE_SHORT_NAME:
|
|
34
|
-
IS_PRODUCTION:
|
|
35
|
-
SOFTWARE_COMPANY_SHORT_NAME:
|
|
36
|
-
SOFTWARE_COMPANY_FULL_NAME:
|
|
37
|
-
SOFTWARE_VERSION:
|
|
38
|
-
SOFTWARE_LAST_UPDATE_DATE:
|
|
39
|
-
SOFTWARE_COMPANY_WEBSITE:
|
|
42
|
+
IS_ADMIN_MODULE: processEnv.IS_ADMIN_MODULE !== "false",
|
|
43
|
+
CURRENT_MODULE: processEnv.CURRENT_MODULE !== undefined ? (parseInt(processEnv.CURRENT_MODULE) as EModules) : undefined,
|
|
44
|
+
CURRENT_MODULE_NAME: processEnv.CURRENT_MODULE_NAME as string,
|
|
45
|
+
CURRENT_MODULE_SHORT_NAME: processEnv.CURRENT_MODULE_SHORT_NAME as string,
|
|
46
|
+
IS_PRODUCTION: processEnv.NODE_ENV === "production",
|
|
47
|
+
SOFTWARE_COMPANY_SHORT_NAME: processEnv.SOFTWARE_COMPANY_SHORT_NAME as string,
|
|
48
|
+
SOFTWARE_COMPANY_FULL_NAME: processEnv.SOFTWARE_COMPANY_FULL_NAME as string,
|
|
49
|
+
SOFTWARE_VERSION: processEnv.SOFTWARE_VERSION as string,
|
|
50
|
+
SOFTWARE_LAST_UPDATE_DATE: processEnv.SOFTWARE_LAST_UPDATE_DATE as string,
|
|
51
|
+
SOFTWARE_COMPANY_WEBSITE: processEnv.SOFTWARE_COMPANY_WEBSITE as string,
|
|
52
|
+
IS_PROXY_SERVER: processEnv.IS_PROXY_SERVER !== "false",
|
|
40
53
|
};
|
|
41
54
|
export const NEXUS_CONFIG = {
|
|
42
55
|
/** Default revalidate time for static generation (in minutes) */
|
|
43
56
|
DEFAULT_REVALIDATE_TIME: NEXUS_INFO.IS_PRODUCTION ? 60 * 24 : 0,
|
|
44
|
-
|
|
57
|
+
DEFAULT_REVALIDATE_TIME_ONE_HOUR: NEXUS_INFO.IS_PRODUCTION ? 60 : 0,
|
|
58
|
+
DEFAULT_REVALIDATE_TIME_ONE_DAY: NEXUS_INFO.IS_PRODUCTION ? 60 * 24 : 0,
|
|
59
|
+
DEFAULT_REVALIDATE_TIME_ONE_WEEK: NEXUS_INFO.IS_PRODUCTION ? 60 * 24 * 7 : 0,
|
|
60
|
+
DEFAULT_REVALIDATE_TIME_ONE_MONTH: NEXUS_INFO.IS_PRODUCTION ? 60 * 24 * 30 : 0,
|
|
61
|
+
DEFAULT_REVALIDATE_TIME_ONE_YEAR: NEXUS_INFO.IS_PRODUCTION ? 60 * 24 * 365 : 0,
|
|
45
62
|
/** Default timeout for HTTP requests (in milliseconds) */
|
|
46
63
|
DEFAULT_HTTP_REQUEST_TIMEOUT: NEXUS_INFO.IS_PRODUCTION ? 60000 : 1000000,
|
|
47
64
|
|
|
48
|
-
DEFAULT_BACKGROUND: (
|
|
65
|
+
DEFAULT_BACKGROUND: (processEnv.DEFAULT_BACKGROUND as EBackgrounds) ?? EBackgrounds.Background1,
|
|
49
66
|
};
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { NextRequest, NextResponse } from "next/server";
|
|
2
|
+
import { EErrorCodes } from "../interfaces/exception-interfaces";
|
|
3
|
+
import { GetRootApi } from "../services/http-services";
|
|
4
|
+
import { DecryptCookieValue } from "../sso-config/cookie-encryption";
|
|
5
|
+
import { ALLOWED_MODULES, PROXY_ALLOWED_METHODS } from "./proxy-constants";
|
|
6
|
+
import { BuildBackendUrl, BuildForwardHeaders, ProxyErrorResponse, ReadRequestBody, SanitizeResponseHeaders } from "./proxy-helpers";
|
|
7
|
+
|
|
8
|
+
const GENERIC_PROXY_ERROR = "Unable to reach the backend service.";
|
|
9
|
+
const MODULE_NOT_ALLOWED_ERROR = "This module is not allowed for proxy requests.";
|
|
10
|
+
|
|
11
|
+
const ACCESS_TOKEN_COOKIE = "access_token";
|
|
12
|
+
|
|
13
|
+
export async function ProxyToBackend(req: NextRequest, moduleParam: string, pathSegments: string[]): Promise<NextResponse> {
|
|
14
|
+
const method = req.method.toUpperCase();
|
|
15
|
+
|
|
16
|
+
if (!PROXY_ALLOWED_METHODS.has(method)) {
|
|
17
|
+
return ProxyErrorResponse(`Method ${method} is not supported.`, 405, "METHOD_NOT_SUPPORTED", EErrorCodes.Forbidden);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
const module = ALLOWED_MODULES.includes(moduleParam) ? parseInt(moduleParam) : null;
|
|
21
|
+
if (!module) return ProxyErrorResponse(MODULE_NOT_ALLOWED_ERROR, 400, "INVALID_MODULE");
|
|
22
|
+
const backendBase = GetRootApi(module);
|
|
23
|
+
const backendUrl = BuildBackendUrl(backendBase, pathSegments, req.nextUrl.searchParams);
|
|
24
|
+
|
|
25
|
+
return ProxyToBackendRequest(backendUrl, backendBase, module, method, req);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export async function ProxyToBackendRequest(backendFullUrl: string, backendUrlBase: string, module: number, method: string, req: NextRequest): Promise<NextResponse> {
|
|
29
|
+
// BuildForwardHeaders already strips the Cookie header (see PROXY_REQUEST_HEADERS_TO_SKIP).
|
|
30
|
+
const headers = BuildForwardHeaders(req);
|
|
31
|
+
|
|
32
|
+
// Decrypt the access token from the httpOnly cookie and inject it as a Bearer token.
|
|
33
|
+
// The raw encrypted blob is never forwarded — only the plaintext token reaches the backend.
|
|
34
|
+
const encryptedToken = req.cookies.get(ACCESS_TOKEN_COOKIE)?.value;
|
|
35
|
+
if (encryptedToken) {
|
|
36
|
+
const token = DecryptCookieValue(encryptedToken);
|
|
37
|
+
if (token) headers.set("Authorization", `Bearer ${token}`);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
const body = await ReadRequestBody(req, method);
|
|
41
|
+
|
|
42
|
+
let backendResponse: Response;
|
|
43
|
+
try {
|
|
44
|
+
backendResponse = await fetch(backendFullUrl, {
|
|
45
|
+
method,
|
|
46
|
+
headers,
|
|
47
|
+
body,
|
|
48
|
+
redirect: "manual",
|
|
49
|
+
});
|
|
50
|
+
} catch {
|
|
51
|
+
return ProxyErrorResponse(GENERIC_PROXY_ERROR, 502, "BACKEND_UNREACHABLE");
|
|
52
|
+
}
|
|
53
|
+
const responseHeaders = SanitizeResponseHeaders(backendResponse.headers, backendUrlBase, module);
|
|
54
|
+
const responseBody = await backendResponse.arrayBuffer();
|
|
55
|
+
|
|
56
|
+
return new NextResponse(responseBody, {
|
|
57
|
+
status: backendResponse.status,
|
|
58
|
+
headers: responseHeaders,
|
|
59
|
+
});
|
|
60
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { EModules } from "../interfaces/system-interfaces";
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
/** HTTP methods supported by the backend proxy. */
|
|
5
|
+
export const PROXY_ALLOWED_METHODS = new Set(["GET", "POST", "PUT", "DELETE", "PATCH"]);
|
|
6
|
+
|
|
7
|
+
/** Request headers that must not be forwarded to the backend. */
|
|
8
|
+
export const PROXY_REQUEST_HEADERS_TO_SKIP = new Set(["host", "connection", "content-length", "transfer-encoding", "keep-alive", "upgrade", "cookie"]);
|
|
9
|
+
|
|
10
|
+
/** Response headers that must not be forwarded to the browser. */
|
|
11
|
+
export const PROXY_RESPONSE_HEADERS_TO_SKIP = new Set(["connection", "transfer-encoding", "keep-alive", "proxy-authenticate", "proxy-authorization", "te", "trailer", "upgrade"]);
|
|
12
|
+
|
|
13
|
+
/** Public path prefix the browser uses to reach the proxy. */
|
|
14
|
+
|
|
15
|
+
/** Allowed modules for proxy requests. */
|
|
16
|
+
|
|
17
|
+
export const ALLOWED_MODULES = [
|
|
18
|
+
EModules.Authentication.toString(),
|
|
19
|
+
EModules.Configuration.toString(),
|
|
20
|
+
EModules.Enterprise.toString(),
|
|
21
|
+
EModules.Drive.toString(),
|
|
22
|
+
EModules.Message.toString(),
|
|
23
|
+
EModules.Accounting.toString(),
|
|
24
|
+
EModules.Report.toString(),
|
|
25
|
+
EModules.Portfolio.toString(),
|
|
26
|
+
EModules.Subscription.toString(),
|
|
27
|
+
EModules.Reservation.toString(),
|
|
28
|
+
]
|