@cayuse-test/react 1.0.0
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/README.md +346 -0
- package/dist/chunk-2K3CWMLR.js +108 -0
- package/dist/chunk-2K3CWMLR.js.map +1 -0
- package/dist/chunk-B2Z63U4D.js +10398 -0
- package/dist/chunk-B2Z63U4D.js.map +1 -0
- package/dist/chunk-EPGO6B3U.js +3 -0
- package/dist/chunk-EPGO6B3U.js.map +1 -0
- package/dist/chunk-LFWPG3ND.js +97 -0
- package/dist/chunk-LFWPG3ND.js.map +1 -0
- package/dist/chunk-M2L7SQBQ.js +205 -0
- package/dist/chunk-M2L7SQBQ.js.map +1 -0
- package/dist/chunk-MJBMK4OG.js +143 -0
- package/dist/chunk-MJBMK4OG.js.map +1 -0
- package/dist/chunk-RG4GEORO.js +194 -0
- package/dist/chunk-RG4GEORO.js.map +1 -0
- package/dist/chunk-SZMEZFAR.js +193 -0
- package/dist/chunk-SZMEZFAR.js.map +1 -0
- package/dist/chunk-TYZPOXN5.js +243 -0
- package/dist/chunk-TYZPOXN5.js.map +1 -0
- package/dist/chunk-XRUFEGUC.js +225 -0
- package/dist/chunk-XRUFEGUC.js.map +1 -0
- package/dist/components/index.d.ts +1471 -0
- package/dist/components/index.js +144 -0
- package/dist/components/index.js.map +1 -0
- package/dist/context/tenant/index.d.ts +200 -0
- package/dist/context/tenant/index.js +14 -0
- package/dist/context/tenant/index.js.map +1 -0
- package/dist/globals/constants/index.d.ts +83 -0
- package/dist/globals/constants/index.js +31 -0
- package/dist/globals/constants/index.js.map +1 -0
- package/dist/globals/css/index.d.ts +2 -0
- package/dist/globals/css/index.js +2 -0
- package/dist/globals/css/index.js.map +1 -0
- package/dist/hooks/index.d.ts +125 -0
- package/dist/hooks/index.js +30 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/index-4NH7IW34.css +47 -0
- package/dist/index.d.ts +16 -0
- package/dist/index.js +302 -0
- package/dist/index.js.map +1 -0
- package/dist/modal-dialog-IH5SI4CF.css +93 -0
- package/dist/services/upload-s3/index.d.ts +35 -0
- package/dist/services/upload-s3/index.js +11 -0
- package/dist/services/upload-s3/index.js.map +1 -0
- package/dist/styles-2WZORUGA.css +106 -0
- package/dist/styles-32VHTPIA.css +20 -0
- package/dist/styles-3A5DZ5R7.css +70 -0
- package/dist/styles-3PFCZALV.css +60 -0
- package/dist/styles-3SNYRDO2.css +100 -0
- package/dist/styles-4FHUBUVF.css +150 -0
- package/dist/styles-4KAVAZFG.css +5 -0
- package/dist/styles-4OFM6DY5.css +22 -0
- package/dist/styles-5OXZHQGW.css +14 -0
- package/dist/styles-6XZTUN3B.css +68 -0
- package/dist/styles-73WOPK6M.css +6 -0
- package/dist/styles-7AV26IBF.css +35 -0
- package/dist/styles-7DWK55L2.css +71 -0
- package/dist/styles-7GWPZSR2.css +222 -0
- package/dist/styles-7QBPXFSY.css +6 -0
- package/dist/styles-7T6DSZIY.css +27 -0
- package/dist/styles-AUI7W2SW.css +408 -0
- package/dist/styles-AZSHBXJQ.css +85 -0
- package/dist/styles-BTXJVGNW.css +99 -0
- package/dist/styles-BUPIQG5C.css +74 -0
- package/dist/styles-CLK36LUK.css +27 -0
- package/dist/styles-CSKYCMD4.css +123 -0
- package/dist/styles-CWCX26BQ.css +13 -0
- package/dist/styles-GAIKDZU6.css +47 -0
- package/dist/styles-GB7S5BAZ.css +36 -0
- package/dist/styles-GVPT6A2Z.css +45 -0
- package/dist/styles-IUBOTHBR.css +581 -0
- package/dist/styles-IZPTZRKW.css +78 -0
- package/dist/styles-LS2YWO5W.css +39 -0
- package/dist/styles-M5BEFS4G.css +148 -0
- package/dist/styles-MHNICXOS.css +18 -0
- package/dist/styles-P6IOJDNI.css +47 -0
- package/dist/styles-Q7XE2QVU.css +55 -0
- package/dist/styles-R7IS5IGF.css +7 -0
- package/dist/styles-RDYYTTBU.css +218 -0
- package/dist/styles-RTHIZL5W.css +48 -0
- package/dist/styles-RUY4EKZW.css +9 -0
- package/dist/styles-T5QJAAUY.css +184 -0
- package/dist/styles-VBXWGFCK.css +96 -0
- package/dist/styles-VE76CGRO.css +6 -0
- package/dist/styles-VLCZ7JYV.css +140 -0
- package/dist/styles-W5HDD3YQ.css +71 -0
- package/dist/styles-X7BJCSFV.css +86 -0
- package/dist/styles-XVRR5GIG.css +42 -0
- package/dist/styles-YBC6BJBD.css +83 -0
- package/dist/styles-YXNJHPDZ.css +74 -0
- package/dist/styles-Z276IEVM.css +264 -0
- package/dist/utils/index.d.ts +145 -0
- package/dist/utils/index.js +98 -0
- package/dist/utils/index.js.map +1 -0
- package/package.json +113 -0
- package/packages/eslint-config/README.md +69 -0
- package/packages/eslint-config/base.js +25 -0
- package/packages/eslint-config/next.js +49 -0
- package/packages/eslint-config/react-internal.js +44 -0
- package/packages/typescript-config/README.md +70 -0
- package/packages/typescript-config/base.json +21 -0
- package/packages/typescript-config/nextjs.json +12 -0
- package/packages/typescript-config/react-library.json +7 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../packages/globals/css/index.ts"],"sourcesContent":["import './index.css';\n"],"mappings":";AAAA,OAAO;","names":[]}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import {
|
|
2
|
+
isFunction
|
|
3
|
+
} from "./chunk-SZMEZFAR.js";
|
|
4
|
+
|
|
5
|
+
// packages/hooks/use-dictionary/use-dictionary.tsx
|
|
6
|
+
import { useMemo } from "react";
|
|
7
|
+
import { useSelector } from "react-redux";
|
|
8
|
+
import { get } from "lodash-es";
|
|
9
|
+
var useDictionary = (key) => {
|
|
10
|
+
const dictionaryStore = useSelector((state) => state.dictionary);
|
|
11
|
+
return useMemo(() => {
|
|
12
|
+
return get(dictionaryStore, key, dictionaryStore);
|
|
13
|
+
}, [dictionaryStore, key]);
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
// packages/hooks/use-confirm-navigation/use-confirm-navigation.tsx
|
|
17
|
+
import { useEffect, useRef, useCallback } from "react";
|
|
18
|
+
import { useHistory } from "react-router-dom";
|
|
19
|
+
var useConfirmNavigation = (onBlock, onConfirm, onCancel, shouldBlock = false) => {
|
|
20
|
+
const history = useHistory();
|
|
21
|
+
const unblock = useRef(null);
|
|
22
|
+
const doNavigation = useRef(null);
|
|
23
|
+
useEffect(() => {
|
|
24
|
+
if (isFunction(unblock.current)) {
|
|
25
|
+
unblock.current();
|
|
26
|
+
}
|
|
27
|
+
if (shouldBlock) {
|
|
28
|
+
unblock.current = history.block((targetLocation) => {
|
|
29
|
+
doNavigation.current = () => {
|
|
30
|
+
if (isFunction(unblock.current)) {
|
|
31
|
+
unblock.current();
|
|
32
|
+
}
|
|
33
|
+
history.push(targetLocation);
|
|
34
|
+
};
|
|
35
|
+
if (isFunction(onBlock)) {
|
|
36
|
+
onBlock();
|
|
37
|
+
}
|
|
38
|
+
return false;
|
|
39
|
+
});
|
|
40
|
+
} else {
|
|
41
|
+
doNavigation.current = null;
|
|
42
|
+
}
|
|
43
|
+
}, [history, onBlock, shouldBlock]);
|
|
44
|
+
const confirm = useCallback(() => {
|
|
45
|
+
if (isFunction(onConfirm)) {
|
|
46
|
+
onConfirm();
|
|
47
|
+
}
|
|
48
|
+
if (isFunction(doNavigation.current)) {
|
|
49
|
+
doNavigation.current();
|
|
50
|
+
}
|
|
51
|
+
doNavigation.current = null;
|
|
52
|
+
}, [onConfirm]);
|
|
53
|
+
const cancel = useCallback(() => {
|
|
54
|
+
if (isFunction(onCancel)) {
|
|
55
|
+
onCancel();
|
|
56
|
+
}
|
|
57
|
+
doNavigation.current = null;
|
|
58
|
+
}, [onCancel]);
|
|
59
|
+
return { confirm, cancel };
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
// packages/hooks/use-debounce-callback/use-debounce-callback.tsx
|
|
63
|
+
import { useCallback as useCallback2, useRef as useRef2 } from "react";
|
|
64
|
+
var useDebounceCallback = (callback, delayInMs = 300) => {
|
|
65
|
+
const timeout = useRef2();
|
|
66
|
+
return useCallback2(
|
|
67
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
68
|
+
(...args) => {
|
|
69
|
+
clearTimeout(timeout?.current);
|
|
70
|
+
if (isFunction(callback)) {
|
|
71
|
+
timeout.current = setTimeout(() => callback(...args), delayInMs);
|
|
72
|
+
}
|
|
73
|
+
},
|
|
74
|
+
[callback, delayInMs]
|
|
75
|
+
);
|
|
76
|
+
};
|
|
77
|
+
|
|
78
|
+
// packages/hooks/use-modal-state/use-modal-state.tsx
|
|
79
|
+
import { useCallback as useCallback3, useState } from "react";
|
|
80
|
+
var useModalState = (initialIsOpen) => {
|
|
81
|
+
const [isOpen, setOpen] = useState(initialIsOpen ?? false);
|
|
82
|
+
const openModal = useCallback3(() => setOpen(true), []);
|
|
83
|
+
const closeModal = useCallback3(() => setOpen(false), []);
|
|
84
|
+
return {
|
|
85
|
+
openModal,
|
|
86
|
+
closeModal,
|
|
87
|
+
isOpen
|
|
88
|
+
};
|
|
89
|
+
};
|
|
90
|
+
|
|
91
|
+
export {
|
|
92
|
+
useDictionary,
|
|
93
|
+
useConfirmNavigation,
|
|
94
|
+
useDebounceCallback,
|
|
95
|
+
useModalState
|
|
96
|
+
};
|
|
97
|
+
//# sourceMappingURL=chunk-LFWPG3ND.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../packages/hooks/use-dictionary/use-dictionary.tsx","../packages/hooks/use-confirm-navigation/use-confirm-navigation.tsx","../packages/hooks/use-debounce-callback/use-debounce-callback.tsx","../packages/hooks/use-modal-state/use-modal-state.tsx"],"sourcesContent":["import { useMemo } from 'react';\nimport { useSelector } from 'react-redux';\nimport { get } from 'lodash-es';\n\n/**\n * key is a string \"path\" to the desired dictionary. Separate \"levels\" with a period.\n * Example: \"common.assignSelected\"\n * NOTE: This depends on having a dictionary key in your redux store\n */\nexport const useDictionary = (key: string) => {\n\t// @ts-expect-error state is unknown, but we know it has a dictionary property\n\tconst dictionaryStore = useSelector((state) => state.dictionary);\n\n\treturn useMemo(() => {\n\t\treturn get(dictionaryStore, key, dictionaryStore);\n\t}, [dictionaryStore, key]);\n};\n","import { useEffect, useRef, useCallback } from 'react';\nimport { useHistory } from 'react-router-dom';\nimport { isFunction } from '@/utils/type-checks';\n\nexport const useConfirmNavigation = (\n\tonBlock: () => void,\n\tonConfirm: () => void,\n\tonCancel: () => void,\n\tshouldBlock = false,\n) => {\n\tconst history = useHistory();\n\t// eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\n\tconst unblock = useRef<Function | null>(null);\n\t// eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\n\tconst doNavigation = useRef<Function | null>(null);\n\n\tuseEffect(() => {\n\t\tif (isFunction(unblock.current)) {\n\t\t\tunblock.current();\n\t\t}\n\n\t\tif (shouldBlock) {\n\t\t\t// eslint-disable-next-line @typescript-eslint/no-explicit-any\n\t\t\tunblock.current = history.block((targetLocation: any) => {\n\t\t\t\tdoNavigation.current = () => {\n\t\t\t\t\tif (isFunction(unblock.current)) {\n\t\t\t\t\t\tunblock.current();\n\t\t\t\t\t}\n\n\t\t\t\t\thistory.push(targetLocation);\n\t\t\t\t};\n\n\t\t\t\tif (isFunction(onBlock)) {\n\t\t\t\t\tonBlock();\n\t\t\t\t}\n\n\t\t\t\treturn false;\n\t\t\t});\n\t\t} else {\n\t\t\tdoNavigation.current = null;\n\t\t}\n\t}, [history, onBlock, shouldBlock]);\n\n\tconst confirm = useCallback(() => {\n\t\tif (isFunction(onConfirm)) {\n\t\t\tonConfirm();\n\t\t}\n\n\t\tif (isFunction(doNavigation.current)) {\n\t\t\tdoNavigation.current();\n\t\t}\n\n\t\tdoNavigation.current = null;\n\t}, [onConfirm]);\n\n\tconst cancel = useCallback(() => {\n\t\tif (isFunction(onCancel)) {\n\t\t\tonCancel();\n\t\t}\n\n\t\tdoNavigation.current = null;\n\t}, [onCancel]);\n\n\treturn { confirm, cancel };\n};\n","import { useCallback, useRef } from 'react';\nimport { isFunction } from '@/utils/type-checks';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport const useDebounceCallback = (callback: any, delayInMs = 300) => {\n\tconst timeout = useRef<NodeJS.Timeout>();\n\n\treturn useCallback(\n\t\t// eslint-disable-next-line @typescript-eslint/no-explicit-any\n\t\t(...args: any[]) => {\n\t\t\tclearTimeout(timeout?.current);\n\n\t\t\tif (isFunction(callback)) {\n\t\t\t\ttimeout.current = setTimeout(() => callback(...args), delayInMs);\n\t\t\t}\n\t\t},\n\t\t[callback, delayInMs],\n\t);\n};\n","import { useCallback, useState } from 'react';\n\nexport const useModalState = (initialIsOpen?: boolean) => {\n\tconst [isOpen, setOpen] = useState(initialIsOpen ?? false);\n\n\tconst openModal = useCallback(() => setOpen(true), []);\n\n\tconst closeModal = useCallback(() => setOpen(false), []);\n\n\treturn {\n\t\topenModal,\n\t\tcloseModal,\n\t\tisOpen,\n\t};\n};\n"],"mappings":";;;;;AAAA,SAAS,eAAe;AACxB,SAAS,mBAAmB;AAC5B,SAAS,WAAW;AAOb,IAAM,gBAAgB,CAAC,QAAgB;AAE7C,QAAM,kBAAkB,YAAY,CAAC,UAAU,MAAM,UAAU;AAE/D,SAAO,QAAQ,MAAM;AACpB,WAAO,IAAI,iBAAiB,KAAK,eAAe;AAAA,EACjD,GAAG,CAAC,iBAAiB,GAAG,CAAC;AAC1B;;;AChBA,SAAS,WAAW,QAAQ,mBAAmB;AAC/C,SAAS,kBAAkB;AAGpB,IAAM,uBAAuB,CACnC,SACA,WACA,UACA,cAAc,UACV;AACJ,QAAM,UAAU,WAAW;AAE3B,QAAM,UAAU,OAAwB,IAAI;AAE5C,QAAM,eAAe,OAAwB,IAAI;AAEjD,YAAU,MAAM;AACf,QAAI,WAAW,QAAQ,OAAO,GAAG;AAChC,cAAQ,QAAQ;AAAA,IACjB;AAEA,QAAI,aAAa;AAEhB,cAAQ,UAAU,QAAQ,MAAM,CAAC,mBAAwB;AACxD,qBAAa,UAAU,MAAM;AAC5B,cAAI,WAAW,QAAQ,OAAO,GAAG;AAChC,oBAAQ,QAAQ;AAAA,UACjB;AAEA,kBAAQ,KAAK,cAAc;AAAA,QAC5B;AAEA,YAAI,WAAW,OAAO,GAAG;AACxB,kBAAQ;AAAA,QACT;AAEA,eAAO;AAAA,MACR,CAAC;AAAA,IACF,OAAO;AACN,mBAAa,UAAU;AAAA,IACxB;AAAA,EACD,GAAG,CAAC,SAAS,SAAS,WAAW,CAAC;AAElC,QAAM,UAAU,YAAY,MAAM;AACjC,QAAI,WAAW,SAAS,GAAG;AAC1B,gBAAU;AAAA,IACX;AAEA,QAAI,WAAW,aAAa,OAAO,GAAG;AACrC,mBAAa,QAAQ;AAAA,IACtB;AAEA,iBAAa,UAAU;AAAA,EACxB,GAAG,CAAC,SAAS,CAAC;AAEd,QAAM,SAAS,YAAY,MAAM;AAChC,QAAI,WAAW,QAAQ,GAAG;AACzB,eAAS;AAAA,IACV;AAEA,iBAAa,UAAU;AAAA,EACxB,GAAG,CAAC,QAAQ,CAAC;AAEb,SAAO,EAAE,SAAS,OAAO;AAC1B;;;AChEA,SAAS,eAAAA,cAAa,UAAAC,eAAc;AAI7B,IAAM,sBAAsB,CAAC,UAAe,YAAY,QAAQ;AACtE,QAAM,UAAUC,QAAuB;AAEvC,SAAOC;AAAA;AAAA,IAEN,IAAI,SAAgB;AACnB,mBAAa,SAAS,OAAO;AAE7B,UAAI,WAAW,QAAQ,GAAG;AACzB,gBAAQ,UAAU,WAAW,MAAM,SAAS,GAAG,IAAI,GAAG,SAAS;AAAA,MAChE;AAAA,IACD;AAAA,IACA,CAAC,UAAU,SAAS;AAAA,EACrB;AACD;;;AClBA,SAAS,eAAAC,cAAa,gBAAgB;AAE/B,IAAM,gBAAgB,CAAC,kBAA4B;AACzD,QAAM,CAAC,QAAQ,OAAO,IAAI,SAAS,iBAAiB,KAAK;AAEzD,QAAM,YAAYA,aAAY,MAAM,QAAQ,IAAI,GAAG,CAAC,CAAC;AAErD,QAAM,aAAaA,aAAY,MAAM,QAAQ,KAAK,GAAG,CAAC,CAAC;AAEvD,SAAO;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,EACD;AACD;","names":["useCallback","useRef","useRef","useCallback","useCallback"]}
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
// packages/services/upload-s3/UploadService.ts
|
|
2
|
+
import pLimit from "p-limit";
|
|
3
|
+
var UploadError = class extends Error {
|
|
4
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
5
|
+
cause;
|
|
6
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
7
|
+
constructor(message, e) {
|
|
8
|
+
super(message);
|
|
9
|
+
this.name = "UploadError";
|
|
10
|
+
this.cause = e;
|
|
11
|
+
this.stack = e?.stack;
|
|
12
|
+
}
|
|
13
|
+
};
|
|
14
|
+
var DefaultProps = {
|
|
15
|
+
shouldUseMultipart: (fileSize) => fileSize > 10 * 2 ** 20,
|
|
16
|
+
maxConcurrentUploads: 5,
|
|
17
|
+
request: fetch
|
|
18
|
+
};
|
|
19
|
+
var throwIfFalse = (condition, message) => {
|
|
20
|
+
if (!condition) {
|
|
21
|
+
throw new UploadError(message);
|
|
22
|
+
}
|
|
23
|
+
};
|
|
24
|
+
var createUploadService = (props) => {
|
|
25
|
+
const options = { ...DefaultProps, ...props || {} };
|
|
26
|
+
const limit = pLimit(options.maxConcurrentUploads);
|
|
27
|
+
const calcNumberOfParts = (fileSize) => Math.floor(fileSize / (5 * 2 ** 20));
|
|
28
|
+
const createMultipartPresignedUrls = async (fileName, fileSize) => {
|
|
29
|
+
const numberOfParts = calcNumberOfParts(fileSize);
|
|
30
|
+
const response = await options.request("/api/v2/attachments/multipart/upload", {
|
|
31
|
+
method: "POST",
|
|
32
|
+
headers: { "Content-Type": "application/json" },
|
|
33
|
+
body: JSON.stringify({ fileName, fileSize, numberOfParts })
|
|
34
|
+
});
|
|
35
|
+
return await response.json();
|
|
36
|
+
};
|
|
37
|
+
const downloadUrl = async (fileId) => {
|
|
38
|
+
const response = await options.request(
|
|
39
|
+
`/api/v2/attachments/download?uploadMetadataId=${fileId}`
|
|
40
|
+
);
|
|
41
|
+
return response.json();
|
|
42
|
+
};
|
|
43
|
+
const download = async (fileId, fileName) => {
|
|
44
|
+
const url = await downloadUrl(fileId);
|
|
45
|
+
const link = document.createElement("a");
|
|
46
|
+
link.href = url;
|
|
47
|
+
link.download = fileName;
|
|
48
|
+
link.click();
|
|
49
|
+
};
|
|
50
|
+
const createSinglePresignedUrl = async (fileName, fileSize) => {
|
|
51
|
+
const response = await options.request("/api/v2/attachments/upload", {
|
|
52
|
+
method: "POST",
|
|
53
|
+
headers: { "Content-Type": "application/json" },
|
|
54
|
+
body: JSON.stringify({ fileName, fileSize })
|
|
55
|
+
});
|
|
56
|
+
return await response.json();
|
|
57
|
+
};
|
|
58
|
+
const preparePart = (blob, partNumber, partSize) => {
|
|
59
|
+
const start = (partNumber - 1) * partSize;
|
|
60
|
+
const end = Math.min(start + partSize, blob.size);
|
|
61
|
+
return blob.slice(start, end);
|
|
62
|
+
};
|
|
63
|
+
const uploadPart = async (uploadUrl, part) => {
|
|
64
|
+
const response = await fetch(uploadUrl, {
|
|
65
|
+
method: "PUT",
|
|
66
|
+
headers: {
|
|
67
|
+
"Content-Type": "application/octet-stream"
|
|
68
|
+
},
|
|
69
|
+
body: part
|
|
70
|
+
});
|
|
71
|
+
return response.headers.get("ETag");
|
|
72
|
+
};
|
|
73
|
+
const completeUpload = async (uploadData, eTags) => {
|
|
74
|
+
const handle = async (response2) => {
|
|
75
|
+
const obj = await response2.json();
|
|
76
|
+
if (!response2.ok) {
|
|
77
|
+
throw new UploadError(obj?.message || "Unknown error occured");
|
|
78
|
+
}
|
|
79
|
+
return obj;
|
|
80
|
+
};
|
|
81
|
+
if (eTags && eTags.length > 1) {
|
|
82
|
+
const response2 = await options.request(
|
|
83
|
+
`/api/v2/attachments/multipart/upload/${uploadData.uploadMetadataId}/complete`,
|
|
84
|
+
{
|
|
85
|
+
method: "POST",
|
|
86
|
+
headers: { "Content-Type": "application/json" },
|
|
87
|
+
body: JSON.stringify({
|
|
88
|
+
uploadId: uploadData.uploadId,
|
|
89
|
+
etags: eTags
|
|
90
|
+
})
|
|
91
|
+
}
|
|
92
|
+
);
|
|
93
|
+
return await handle(response2);
|
|
94
|
+
}
|
|
95
|
+
const response = await options.request(
|
|
96
|
+
`/api/v2/attachments/upload/${uploadData.uploadMetadataId}/complete`,
|
|
97
|
+
{
|
|
98
|
+
method: "POST"
|
|
99
|
+
}
|
|
100
|
+
);
|
|
101
|
+
return await handle(response);
|
|
102
|
+
};
|
|
103
|
+
const createPresignedUrls = async (file) => {
|
|
104
|
+
if (options.shouldUseMultipart(file.size)) {
|
|
105
|
+
return await createMultipartPresignedUrls(file.name, file.size);
|
|
106
|
+
}
|
|
107
|
+
const data = await createSinglePresignedUrl(file.name, file.size);
|
|
108
|
+
return {
|
|
109
|
+
uploadMetadataId: data.uploadMetadataId,
|
|
110
|
+
uploadUrls: [data.preSignedUrl]
|
|
111
|
+
};
|
|
112
|
+
};
|
|
113
|
+
const createState = (initialState, onStateChange) => {
|
|
114
|
+
const state = {};
|
|
115
|
+
const setState = (newState) => {
|
|
116
|
+
Object.assign(state, newState);
|
|
117
|
+
onStateChange({ ...state });
|
|
118
|
+
};
|
|
119
|
+
setState(initialState);
|
|
120
|
+
return [state, setState];
|
|
121
|
+
};
|
|
122
|
+
const uploadFile = async (file, onProgress) => {
|
|
123
|
+
const initialState = {
|
|
124
|
+
uploaded: 0,
|
|
125
|
+
totalSize: file.size,
|
|
126
|
+
status: "ready"
|
|
127
|
+
};
|
|
128
|
+
const [state, setState] = createState(initialState, onProgress);
|
|
129
|
+
setState({ status: "preparing" });
|
|
130
|
+
try {
|
|
131
|
+
const uploadData = await createPresignedUrls(file);
|
|
132
|
+
setState({ status: "uploading" });
|
|
133
|
+
const numberOfParts = uploadData.uploadUrls.length;
|
|
134
|
+
const partSize = Math.ceil(file.size / numberOfParts);
|
|
135
|
+
const queuedParts = uploadData.uploadUrls.map(
|
|
136
|
+
(uploadUrl, index) => limit(async () => {
|
|
137
|
+
const partNumber = index + 1;
|
|
138
|
+
const part = preparePart(file, partNumber, partSize);
|
|
139
|
+
const etagId = await uploadPart(uploadUrl, part);
|
|
140
|
+
setState({
|
|
141
|
+
uploaded: Math.min(state.uploaded + partSize, state.totalSize)
|
|
142
|
+
});
|
|
143
|
+
return { partNumber, etagId };
|
|
144
|
+
})
|
|
145
|
+
);
|
|
146
|
+
const results = await Promise.all(queuedParts);
|
|
147
|
+
const parts = results.filter((x) => !!x.etagId);
|
|
148
|
+
const fileMetadata = await completeUpload(uploadData, parts);
|
|
149
|
+
setState({ status: "completed" });
|
|
150
|
+
return fileMetadata;
|
|
151
|
+
} catch (e) {
|
|
152
|
+
if (e instanceof UploadError) {
|
|
153
|
+
setState({ status: "error", error: e });
|
|
154
|
+
throw e;
|
|
155
|
+
} else {
|
|
156
|
+
const overrideErr = new UploadError(
|
|
157
|
+
"An error occurred while uploading the file",
|
|
158
|
+
e
|
|
159
|
+
);
|
|
160
|
+
setState({ status: "error", error: overrideErr });
|
|
161
|
+
throw overrideErr;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
};
|
|
165
|
+
const getFilextension = (filename) => {
|
|
166
|
+
const parts = filename.toLocaleLowerCase().split(".");
|
|
167
|
+
if (parts.length === 1) return;
|
|
168
|
+
return parts.pop();
|
|
169
|
+
};
|
|
170
|
+
const upload = (file, onProgress) => {
|
|
171
|
+
throwIfFalse(file.name.length > 0, "File name must not be blank");
|
|
172
|
+
throwIfFalse(file.size > 0, "File must not be blank");
|
|
173
|
+
throwIfFalse(file.size <= 75 * 2 ** 20, "File size must be less than 75MB");
|
|
174
|
+
throwIfFalse(
|
|
175
|
+
getFilextension(file.name) !== "exe",
|
|
176
|
+
"Attachments with filetype .exe cannot be accepted. Please try a different file type."
|
|
177
|
+
);
|
|
178
|
+
return uploadFile(file, onProgress);
|
|
179
|
+
};
|
|
180
|
+
return {
|
|
181
|
+
downloadUrl,
|
|
182
|
+
download,
|
|
183
|
+
upload
|
|
184
|
+
};
|
|
185
|
+
};
|
|
186
|
+
var UploadService = createUploadService({
|
|
187
|
+
request: (url, options) => {
|
|
188
|
+
const storedToken = localStorage?.getItem("fk_accessToken");
|
|
189
|
+
const opt = { headers: {}, ...options ?? {} };
|
|
190
|
+
return fetch(url, {
|
|
191
|
+
...opt,
|
|
192
|
+
headers: {
|
|
193
|
+
...opt.headers,
|
|
194
|
+
Authorization: `Bearer ${storedToken}`
|
|
195
|
+
}
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
});
|
|
199
|
+
|
|
200
|
+
export {
|
|
201
|
+
UploadError,
|
|
202
|
+
createUploadService,
|
|
203
|
+
UploadService
|
|
204
|
+
};
|
|
205
|
+
//# sourceMappingURL=chunk-M2L7SQBQ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../packages/services/upload-s3/UploadService.ts"],"sourcesContent":["import pLimit from 'p-limit';\n\nexport class UploadError extends Error {\n\t// eslint-disable-next-line @typescript-eslint/no-explicit-any\n\tcause: any;\n\n\t// eslint-disable-next-line @typescript-eslint/no-explicit-any\n\tconstructor(message: string, e?: any) {\n\t\tsuper(message);\n\t\tthis.name = 'UploadError';\n\t\tthis.cause = e;\n\t\tthis.stack = e?.stack;\n\t}\n}\n\ntype SimpleUploadData = {\n\tpreSignedUrl: string;\n\tuploadMetadataId: string;\n};\n\ntype UploadData = {\n\tuploadMetadataId: string;\n\tuploadUrls: string[];\n\tuploadId?: string;\n};\n\ntype ETag = {\n\tpartNumber: number;\n\tetagId: string;\n};\n\nexport type UploadMetadataResource = {\n\tid: string;\n\ttenantId: string;\n\tfileName: string;\n\tcreatedAt: Date;\n\tfinalizedAt: Date;\n\tcompletedAt: Date;\n\tuploadedBy: string;\n\tfileSize: number;\n};\n\nexport type ProgressState = {\n\tstatus:\n\t\t| 'ready'\n\t\t| 'preparing'\n\t\t| 'uploading'\n\t\t| 'finalizing'\n\t\t| 'completed'\n\t\t| 'error'\n\t\t| 'cancelled';\n\tuploaded: number;\n\ttotalSize: number;\n\terror?: UploadError;\n};\n\nexport type IUploadService = {\n\tupload: (\n\t\tfile: File,\n\t\tonProgress: (progress: ProgressState) => void,\n\t) => Promise<UploadMetadataResource>;\n\tdownloadUrl: (fileId: string) => Promise<string>;\n\tdownload: (fileId: string, fileName: string) => Promise<void>;\n};\n\nconst DefaultProps = {\n\tshouldUseMultipart: (fileSize: number) => fileSize > 10 * 2 ** 20,\n\tmaxConcurrentUploads: 5,\n\trequest: fetch,\n};\n\nexport type UploadServiceProps = Partial<typeof DefaultProps>;\n\nconst throwIfFalse = (condition: boolean, message: string) => {\n\tif (!condition) {\n\t\tthrow new UploadError(message);\n\t}\n};\n\nexport const createUploadService = (props?: UploadServiceProps): IUploadService => {\n\tconst options = { ...DefaultProps, ...(props || {}) };\n\n\tconst limit = pLimit(options.maxConcurrentUploads);\n\tconst calcNumberOfParts = (fileSize: number) =>\n\t\tMath.floor(fileSize / (5 * 2 ** 20));\n\n\tconst createMultipartPresignedUrls = async (\n\t\tfileName: string,\n\t\tfileSize: number,\n\t): Promise<UploadData> => {\n\t\tconst numberOfParts = calcNumberOfParts(fileSize);\n\n\t\tconst response = await options.request('/api/v2/attachments/multipart/upload', {\n\t\t\tmethod: 'POST',\n\t\t\theaders: { 'Content-Type': 'application/json' },\n\t\t\tbody: JSON.stringify({ fileName, fileSize, numberOfParts }),\n\t\t});\n\n\t\treturn await response.json();\n\t};\n\n\tconst downloadUrl = async (fileId: string): Promise<string> => {\n\t\tconst response = await options.request(\n\t\t\t`/api/v2/attachments/download?uploadMetadataId=${fileId}`,\n\t\t);\n\n\t\treturn response.json();\n\t};\n\n\tconst download = async (fileId: string, fileName: string): Promise<void> => {\n\t\tconst url = await downloadUrl(fileId);\n\t\tconst link = document.createElement('a');\n\t\tlink.href = url;\n\t\tlink.download = fileName;\n\t\tlink.click();\n\t};\n\n\tconst createSinglePresignedUrl = async (\n\t\tfileName: string,\n\t\tfileSize: number,\n\t): Promise<SimpleUploadData> => {\n\t\tconst response = await options.request('/api/v2/attachments/upload', {\n\t\t\tmethod: 'POST',\n\t\t\theaders: { 'Content-Type': 'application/json' },\n\t\t\tbody: JSON.stringify({ fileName, fileSize }),\n\t\t});\n\n\t\treturn await response.json();\n\t};\n\n\tconst preparePart = (blob: Blob, partNumber: number, partSize: number): Blob => {\n\t\tconst start = (partNumber - 1) * partSize;\n\t\tconst end = Math.min(start + partSize, blob.size);\n\n\t\treturn blob.slice(start, end);\n\t};\n\n\tconst uploadPart = async (uploadUrl: string, part: Blob) => {\n\t\tconst response = await fetch(uploadUrl, {\n\t\t\tmethod: 'PUT',\n\t\t\theaders: {\n\t\t\t\t'Content-Type': 'application/octet-stream',\n\t\t\t},\n\t\t\tbody: part,\n\t\t});\n\n\t\treturn response.headers.get('ETag');\n\t};\n\n\tconst completeUpload = async (\n\t\tuploadData: UploadData,\n\t\teTags: ETag[],\n\t): Promise<UploadMetadataResource> => {\n\t\tconst handle = async (response: Response) => {\n\t\t\tconst obj = await response.json();\n\t\t\tif (!response.ok) {\n\t\t\t\tthrow new UploadError(obj?.message || 'Unknown error occured');\n\t\t\t}\n\n\t\t\treturn obj;\n\t\t};\n\n\t\tif (eTags && eTags.length > 1) {\n\t\t\tconst response = await options.request(\n\t\t\t\t`/api/v2/attachments/multipart/upload/${uploadData.uploadMetadataId}/complete`,\n\t\t\t\t{\n\t\t\t\t\tmethod: 'POST',\n\t\t\t\t\theaders: { 'Content-Type': 'application/json' },\n\t\t\t\t\tbody: JSON.stringify({\n\t\t\t\t\t\tuploadId: uploadData.uploadId,\n\t\t\t\t\t\tetags: eTags,\n\t\t\t\t\t}),\n\t\t\t\t},\n\t\t\t);\n\n\t\t\treturn await handle(response);\n\t\t}\n\t\tconst response = await options.request(\n\t\t\t`/api/v2/attachments/upload/${uploadData.uploadMetadataId}/complete`,\n\t\t\t{\n\t\t\t\tmethod: 'POST',\n\t\t\t},\n\t\t);\n\n\t\treturn await handle(response);\n\t};\n\n\tconst createPresignedUrls = async (file: File): Promise<UploadData> => {\n\t\tif (options.shouldUseMultipart(file.size)) {\n\t\t\treturn await createMultipartPresignedUrls(file.name, file.size);\n\t\t}\n\t\tconst data = await createSinglePresignedUrl(file.name, file.size);\n\n\t\treturn {\n\t\t\tuploadMetadataId: data.uploadMetadataId,\n\t\t\tuploadUrls: [data.preSignedUrl],\n\t\t};\n\t};\n\n\tconst createState = <T>(\n\t\tinitialState: T,\n\t\tonStateChange: (state: T) => void,\n\t): [T, (s: Partial<T>) => void] => {\n\t\tconst state = {};\n\n\t\tconst setState = (newState: Partial<T>): void => {\n\t\t\tObject.assign(state, newState);\n\t\t\tonStateChange({ ...(state as T) });\n\t\t};\n\n\t\tsetState(initialState); // initial state\n\n\t\treturn [state as T, setState];\n\t};\n\n\tconst uploadFile = async (\n\t\tfile: File,\n\t\tonProgress: (progress: ProgressState) => void,\n\t): Promise<UploadMetadataResource> => {\n\t\tconst initialState: ProgressState = {\n\t\t\tuploaded: 0,\n\t\t\ttotalSize: file.size,\n\t\t\tstatus: 'ready',\n\t\t};\n\t\tconst [state, setState] = createState(initialState, onProgress);\n\n\t\tsetState({ status: 'preparing' });\n\n\t\ttry {\n\t\t\tconst uploadData = await createPresignedUrls(file);\n\t\t\tsetState({ status: 'uploading' });\n\n\t\t\tconst numberOfParts = uploadData.uploadUrls.length;\n\t\t\tconst partSize = Math.ceil(file.size / numberOfParts);\n\n\t\t\t// prepare parts\n\t\t\tconst queuedParts = uploadData.uploadUrls.map((uploadUrl, index) =>\n\t\t\t\tlimit(async () => {\n\t\t\t\t\tconst partNumber = index + 1;\n\t\t\t\t\tconst part = preparePart(file, partNumber, partSize);\n\t\t\t\t\tconst etagId = await uploadPart(uploadUrl, part);\n\t\t\t\t\tsetState({\n\t\t\t\t\t\tuploaded: Math.min(state.uploaded + partSize, state.totalSize),\n\t\t\t\t\t});\n\n\t\t\t\t\treturn { partNumber, etagId };\n\t\t\t\t}),\n\t\t\t);\n\n\t\t\tconst results = await Promise.all(queuedParts);\n\n\t\t\tconst parts = results.filter((x) => !!x.etagId) as ETag[];\n\n\t\t\t// complete upload\n\t\t\tconst fileMetadata = await completeUpload(uploadData, parts);\n\t\t\tsetState({ status: 'completed' });\n\n\t\t\treturn fileMetadata;\n\t\t} catch (e) {\n\t\t\tif (e instanceof UploadError) {\n\t\t\t\tsetState({ status: 'error', error: e });\n\t\t\t\tthrow e;\n\t\t\t} else {\n\t\t\t\tconst overrideErr = new UploadError(\n\t\t\t\t\t'An error occurred while uploading the file',\n\t\t\t\t\te,\n\t\t\t\t);\n\t\t\t\tsetState({ status: 'error', error: overrideErr });\n\t\t\t\tthrow overrideErr;\n\t\t\t}\n\t\t}\n\t};\n\n\tconst getFilextension = (filename: string) => {\n\t\tconst parts = filename.toLocaleLowerCase().split('.');\n\t\tif (parts.length === 1) return;\n\t\treturn parts.pop();\n\t};\n\n\tconst upload = (\n\t\tfile: File,\n\t\tonProgress: (progress: ProgressState) => void,\n\t): Promise<UploadMetadataResource> => {\n\t\tthrowIfFalse(file.name.length > 0, 'File name must not be blank');\n\t\tthrowIfFalse(file.size > 0, 'File must not be blank');\n\t\tthrowIfFalse(file.size <= 75 * 2 ** 20, 'File size must be less than 75MB');\n\t\tthrowIfFalse(\n\t\t\tgetFilextension(file.name) !== 'exe',\n\t\t\t'Attachments with filetype .exe cannot be accepted. Please try a different file type.',\n\t\t);\n\n\t\treturn uploadFile(file, onProgress);\n\t};\n\n\treturn {\n\t\tdownloadUrl,\n\t\tdownload,\n\t\tupload,\n\t};\n};\n\nexport const UploadService = createUploadService({\n\trequest: (url, options) => {\n\t\tconst storedToken = localStorage?.getItem('fk_accessToken');\n\n\t\tconst opt = { headers: {}, ...(options ?? {}) };\n\n\t\treturn fetch(url, {\n\t\t\t...opt,\n\t\t\theaders: {\n\t\t\t\t...opt.headers,\n\t\t\t\tAuthorization: `Bearer ${storedToken}`,\n\t\t\t},\n\t\t});\n\t},\n});\n\nexport default UploadService;\n"],"mappings":"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","names":["response"]}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
// packages/globals/constants/index.ts
|
|
2
|
+
var FIELD_TYPES = {
|
|
3
|
+
DATE: "date",
|
|
4
|
+
DATETIME: "datetime",
|
|
5
|
+
NUMBER: "number",
|
|
6
|
+
RADIO: "radio",
|
|
7
|
+
RESEARCH_TEAM: "researchTeam",
|
|
8
|
+
RICH_TEXT: "richText",
|
|
9
|
+
SELECT: "select",
|
|
10
|
+
STRING_LIST: "stringList",
|
|
11
|
+
SUBFORM: "subform",
|
|
12
|
+
TEXT: "text",
|
|
13
|
+
TEXTAREA: "textarea",
|
|
14
|
+
UPLOAD: "fileInput",
|
|
15
|
+
CURRENCY: "currency",
|
|
16
|
+
CAYUSE_CHECKBOXES: "cayuseCheckboxes",
|
|
17
|
+
ONE: "one",
|
|
18
|
+
DATE_STRING: "date string",
|
|
19
|
+
CLASSIFICATION_CODES: "classificationCodes",
|
|
20
|
+
FUNDING_PROGRAM: "fundingProgram",
|
|
21
|
+
CHECKBOX: "boolean"
|
|
22
|
+
};
|
|
23
|
+
var CAYUSE_TYPES = {
|
|
24
|
+
ORG_FINDER: "org-finder",
|
|
25
|
+
PERSON_FINDER: "person-finder",
|
|
26
|
+
UNIT_FINDER: "unit-finder",
|
|
27
|
+
RESEARCH_TEAM: "research-team",
|
|
28
|
+
FUNDING_PROGRAM: "funding-program",
|
|
29
|
+
CLASSIFICATION_CODES: "classification-codes",
|
|
30
|
+
HAZARD_SAFETY: "cayuse-hazard-safety",
|
|
31
|
+
HUMAN_ETHICS: "cayuse-human-ethics-study-search",
|
|
32
|
+
ANIMAL_OVERSIGHT: "cayuse-animal-oversight",
|
|
33
|
+
HAPLO_COSTING: "cayuse-haplo-costing-tool",
|
|
34
|
+
HAPLO_ETHICS: "cayuse-haplo-ethics-monitor",
|
|
35
|
+
HAPLO_REPOSITORY: "cayuse-haplo-repository",
|
|
36
|
+
CAYUSE_SUMMARY_BUDGET_IMPORTER: "cayuse-summary-budget-importer",
|
|
37
|
+
PROPOSALS_S2S: "cayuse-proposals-s2s-record"
|
|
38
|
+
};
|
|
39
|
+
var RULE_TYPES = {
|
|
40
|
+
AD_HOC_NOTIFICATION: "AD_HOC_NOTIFICATION",
|
|
41
|
+
AD_HOC_REVIEW: "AD_HOC_REVIEW",
|
|
42
|
+
DISPLAY_RULES: "DISPLAY_RULES",
|
|
43
|
+
RT_CERTIFICATION: "RT_CERTIFICATION",
|
|
44
|
+
RT_REVIEW: "RT_REVIEW",
|
|
45
|
+
UNIT_REVIEW: "UNIT_REVIEW",
|
|
46
|
+
INFOREADY_REVIEW: "INFOREADY_REVIEW",
|
|
47
|
+
DISCLOSURE: "DISCLOSURE",
|
|
48
|
+
NOTIFICATION: "NOTIFICATION"
|
|
49
|
+
};
|
|
50
|
+
var NEW_RULE_ID = "__add__";
|
|
51
|
+
var COLUMN_HEADER_KEYS = {
|
|
52
|
+
PROPOSAL: "PROPOSAL",
|
|
53
|
+
AWARD: "AWARD",
|
|
54
|
+
SUBAWARD: "SUBAWARD",
|
|
55
|
+
PROJECT: "PROJECT",
|
|
56
|
+
BUDGET: "BUDGET",
|
|
57
|
+
RULE: "RULE"
|
|
58
|
+
};
|
|
59
|
+
var SELECT_ANY_KEY = "*";
|
|
60
|
+
var KEY_CODES = {
|
|
61
|
+
TAB: 9,
|
|
62
|
+
ENTER: 13,
|
|
63
|
+
ESCAPE: 27,
|
|
64
|
+
LEFT_ARROW: 37,
|
|
65
|
+
UP_ARROW: 38,
|
|
66
|
+
RIGHT_ARROW: 39,
|
|
67
|
+
DOWN_ARROW: 40,
|
|
68
|
+
SPACE: 32,
|
|
69
|
+
PAGE_UP: 33,
|
|
70
|
+
PAGE_DOWN: 34
|
|
71
|
+
};
|
|
72
|
+
var DATETIME_FORMATS = /* @__PURE__ */ new Map([
|
|
73
|
+
[
|
|
74
|
+
"en-au",
|
|
75
|
+
{
|
|
76
|
+
date: "dd/MM/yyyy",
|
|
77
|
+
time: "hh:mm:ss a",
|
|
78
|
+
datePlaceholder: "DD/MM/YYYY"
|
|
79
|
+
}
|
|
80
|
+
],
|
|
81
|
+
[
|
|
82
|
+
"en-ca",
|
|
83
|
+
{
|
|
84
|
+
date: "yyyy-MM-dd",
|
|
85
|
+
time: "hh:mm:ss a",
|
|
86
|
+
datePlaceholder: "YYYY-MM-DD"
|
|
87
|
+
}
|
|
88
|
+
],
|
|
89
|
+
[
|
|
90
|
+
"en-nz",
|
|
91
|
+
{
|
|
92
|
+
date: "dd/MM/yyyy",
|
|
93
|
+
time: "hh:mm:ss a",
|
|
94
|
+
datePlaceholder: "DD/MM/YYYY"
|
|
95
|
+
}
|
|
96
|
+
],
|
|
97
|
+
[
|
|
98
|
+
"en-sg",
|
|
99
|
+
{
|
|
100
|
+
date: "d/M/yyyy",
|
|
101
|
+
time: "hh:mm:ss a",
|
|
102
|
+
datePlaceholder: "DD/MM/YYYY"
|
|
103
|
+
}
|
|
104
|
+
],
|
|
105
|
+
[
|
|
106
|
+
"en-gb",
|
|
107
|
+
{
|
|
108
|
+
date: "dd/MM/yyyy",
|
|
109
|
+
time: "hh:mm:ss a",
|
|
110
|
+
datePlaceholder: "DD/MM/YYYY"
|
|
111
|
+
}
|
|
112
|
+
],
|
|
113
|
+
[
|
|
114
|
+
"en-us",
|
|
115
|
+
{
|
|
116
|
+
date: "M/d/yyyy",
|
|
117
|
+
time: "hh:mm:ss a",
|
|
118
|
+
datePlaceholder: "MM/DD/YYYY"
|
|
119
|
+
}
|
|
120
|
+
]
|
|
121
|
+
]);
|
|
122
|
+
var NODE_ENV = process.env.NODE_ENV;
|
|
123
|
+
var APP_ENV = process.env.REACT_APP_ENVIRONMENT;
|
|
124
|
+
var FLOWABLE_BASE_URL = process.env.REACT_APP_FLOWABLE_ENGAGE_URL;
|
|
125
|
+
var AUTH_DOMAIN = process.env.REACT_APP_AUTH_DOMAIN;
|
|
126
|
+
var TARGET_WEB_COMPONENTS_BUCKET = process.env.REACT_TARGET_WEB_COMPONENTS_BUCKET;
|
|
127
|
+
|
|
128
|
+
export {
|
|
129
|
+
FIELD_TYPES,
|
|
130
|
+
CAYUSE_TYPES,
|
|
131
|
+
RULE_TYPES,
|
|
132
|
+
NEW_RULE_ID,
|
|
133
|
+
COLUMN_HEADER_KEYS,
|
|
134
|
+
SELECT_ANY_KEY,
|
|
135
|
+
KEY_CODES,
|
|
136
|
+
DATETIME_FORMATS,
|
|
137
|
+
NODE_ENV,
|
|
138
|
+
APP_ENV,
|
|
139
|
+
FLOWABLE_BASE_URL,
|
|
140
|
+
AUTH_DOMAIN,
|
|
141
|
+
TARGET_WEB_COMPONENTS_BUCKET
|
|
142
|
+
};
|
|
143
|
+
//# sourceMappingURL=chunk-MJBMK4OG.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../packages/globals/constants/index.ts"],"sourcesContent":["export const FIELD_TYPES = {\n\tDATE: 'date',\n\tDATETIME: 'datetime',\n\tNUMBER: 'number',\n\tRADIO: 'radio',\n\tRESEARCH_TEAM: 'researchTeam',\n\tRICH_TEXT: 'richText',\n\tSELECT: 'select',\n\tSTRING_LIST: 'stringList',\n\tSUBFORM: 'subform',\n\tTEXT: 'text',\n\tTEXTAREA: 'textarea',\n\tUPLOAD: 'fileInput',\n\tCURRENCY: 'currency',\n\tCAYUSE_CHECKBOXES: 'cayuseCheckboxes',\n\tONE: 'one',\n\tDATE_STRING: 'date string',\n\tCLASSIFICATION_CODES: 'classificationCodes',\n\tFUNDING_PROGRAM: 'fundingProgram',\n\tCHECKBOX: 'boolean',\n} as const;\n\nexport const CAYUSE_TYPES = {\n\tORG_FINDER: 'org-finder',\n\tPERSON_FINDER: 'person-finder',\n\tUNIT_FINDER: 'unit-finder',\n\tRESEARCH_TEAM: 'research-team',\n\tFUNDING_PROGRAM: 'funding-program',\n\tCLASSIFICATION_CODES: 'classification-codes',\n\tHAZARD_SAFETY: 'cayuse-hazard-safety',\n\tHUMAN_ETHICS: 'cayuse-human-ethics-study-search',\n\tANIMAL_OVERSIGHT: 'cayuse-animal-oversight',\n\tHAPLO_COSTING: 'cayuse-haplo-costing-tool',\n\tHAPLO_ETHICS: 'cayuse-haplo-ethics-monitor',\n\tHAPLO_REPOSITORY: 'cayuse-haplo-repository',\n\tCAYUSE_SUMMARY_BUDGET_IMPORTER: 'cayuse-summary-budget-importer',\n\tPROPOSALS_S2S: 'cayuse-proposals-s2s-record',\n} as const;\n\nexport const RULE_TYPES = {\n\tAD_HOC_NOTIFICATION: 'AD_HOC_NOTIFICATION',\n\tAD_HOC_REVIEW: 'AD_HOC_REVIEW',\n\tDISPLAY_RULES: 'DISPLAY_RULES',\n\tRT_CERTIFICATION: 'RT_CERTIFICATION',\n\tRT_REVIEW: 'RT_REVIEW',\n\tUNIT_REVIEW: 'UNIT_REVIEW',\n\tINFOREADY_REVIEW: 'INFOREADY_REVIEW',\n\tDISCLOSURE: 'DISCLOSURE',\n\tNOTIFICATION: 'NOTIFICATION',\n} as const;\n\nexport const NEW_RULE_ID = '__add__' as const;\n\nexport const COLUMN_HEADER_KEYS = {\n\tPROPOSAL: 'PROPOSAL',\n\tAWARD: 'AWARD',\n\tSUBAWARD: 'SUBAWARD',\n\tPROJECT: 'PROJECT',\n\tBUDGET: 'BUDGET',\n\tRULE: 'RULE',\n} as const;\n\nexport const SELECT_ANY_KEY = '*' as const;\n\nexport const KEY_CODES = {\n\tTAB: 9,\n\tENTER: 13,\n\tESCAPE: 27,\n\tLEFT_ARROW: 37,\n\tUP_ARROW: 38,\n\tRIGHT_ARROW: 39,\n\tDOWN_ARROW: 40,\n\tSPACE: 32,\n\tPAGE_UP: 33,\n\tPAGE_DOWN: 34,\n} as const;\n\nexport interface DateTimeFormat {\n\tdate: string;\n\ttime: string;\n\tdatePlaceholder: string;\n}\n\nexport const DATETIME_FORMATS: Map<string, DateTimeFormat> = new Map([\n\t[\n\t\t'en-au',\n\t\t{\n\t\t\tdate: 'dd/MM/yyyy',\n\t\t\ttime: 'hh:mm:ss a',\n\t\t\tdatePlaceholder: 'DD/MM/YYYY',\n\t\t},\n\t],\n\t[\n\t\t'en-ca',\n\t\t{\n\t\t\tdate: 'yyyy-MM-dd',\n\t\t\ttime: 'hh:mm:ss a',\n\t\t\tdatePlaceholder: 'YYYY-MM-DD',\n\t\t},\n\t],\n\t[\n\t\t'en-nz',\n\t\t{\n\t\t\tdate: 'dd/MM/yyyy',\n\t\t\ttime: 'hh:mm:ss a',\n\t\t\tdatePlaceholder: 'DD/MM/YYYY',\n\t\t},\n\t],\n\t[\n\t\t'en-sg',\n\t\t{\n\t\t\tdate: 'd/M/yyyy',\n\t\t\ttime: 'hh:mm:ss a',\n\t\t\tdatePlaceholder: 'DD/MM/YYYY',\n\t\t},\n\t],\n\t[\n\t\t'en-gb',\n\t\t{\n\t\t\tdate: 'dd/MM/yyyy',\n\t\t\ttime: 'hh:mm:ss a',\n\t\t\tdatePlaceholder: 'DD/MM/YYYY',\n\t\t},\n\t],\n\t[\n\t\t'en-us',\n\t\t{\n\t\t\tdate: 'M/d/yyyy',\n\t\t\ttime: 'hh:mm:ss a',\n\t\t\tdatePlaceholder: 'MM/DD/YYYY',\n\t\t},\n\t],\n]);\n\nexport const NODE_ENV = process.env.NODE_ENV;\n\nexport const APP_ENV = process.env.REACT_APP_ENVIRONMENT;\n\nexport const FLOWABLE_BASE_URL = process.env.REACT_APP_FLOWABLE_ENGAGE_URL;\n\nexport const AUTH_DOMAIN = process.env.REACT_APP_AUTH_DOMAIN;\n\nexport const TARGET_WEB_COMPONENTS_BUCKET =\n\tprocess.env.REACT_TARGET_WEB_COMPONENTS_BUCKET;\n"],"mappings":";AAAO,IAAM,cAAc;AAAA,EAC1B,MAAM;AAAA,EACN,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,eAAe;AAAA,EACf,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,aAAa;AAAA,EACb,SAAS;AAAA,EACT,MAAM;AAAA,EACN,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,mBAAmB;AAAA,EACnB,KAAK;AAAA,EACL,aAAa;AAAA,EACb,sBAAsB;AAAA,EACtB,iBAAiB;AAAA,EACjB,UAAU;AACX;AAEO,IAAM,eAAe;AAAA,EAC3B,YAAY;AAAA,EACZ,eAAe;AAAA,EACf,aAAa;AAAA,EACb,eAAe;AAAA,EACf,iBAAiB;AAAA,EACjB,sBAAsB;AAAA,EACtB,eAAe;AAAA,EACf,cAAc;AAAA,EACd,kBAAkB;AAAA,EAClB,eAAe;AAAA,EACf,cAAc;AAAA,EACd,kBAAkB;AAAA,EAClB,gCAAgC;AAAA,EAChC,eAAe;AAChB;AAEO,IAAM,aAAa;AAAA,EACzB,qBAAqB;AAAA,EACrB,eAAe;AAAA,EACf,eAAe;AAAA,EACf,kBAAkB;AAAA,EAClB,WAAW;AAAA,EACX,aAAa;AAAA,EACb,kBAAkB;AAAA,EAClB,YAAY;AAAA,EACZ,cAAc;AACf;AAEO,IAAM,cAAc;AAEpB,IAAM,qBAAqB;AAAA,EACjC,UAAU;AAAA,EACV,OAAO;AAAA,EACP,UAAU;AAAA,EACV,SAAS;AAAA,EACT,QAAQ;AAAA,EACR,MAAM;AACP;AAEO,IAAM,iBAAiB;AAEvB,IAAM,YAAY;AAAA,EACxB,KAAK;AAAA,EACL,OAAO;AAAA,EACP,QAAQ;AAAA,EACR,YAAY;AAAA,EACZ,UAAU;AAAA,EACV,aAAa;AAAA,EACb,YAAY;AAAA,EACZ,OAAO;AAAA,EACP,SAAS;AAAA,EACT,WAAW;AACZ;AAQO,IAAM,mBAAgD,oBAAI,IAAI;AAAA,EACpE;AAAA,IACC;AAAA,IACA;AAAA,MACC,MAAM;AAAA,MACN,MAAM;AAAA,MACN,iBAAiB;AAAA,IAClB;AAAA,EACD;AAAA,EACA;AAAA,IACC;AAAA,IACA;AAAA,MACC,MAAM;AAAA,MACN,MAAM;AAAA,MACN,iBAAiB;AAAA,IAClB;AAAA,EACD;AAAA,EACA;AAAA,IACC;AAAA,IACA;AAAA,MACC,MAAM;AAAA,MACN,MAAM;AAAA,MACN,iBAAiB;AAAA,IAClB;AAAA,EACD;AAAA,EACA;AAAA,IACC;AAAA,IACA;AAAA,MACC,MAAM;AAAA,MACN,MAAM;AAAA,MACN,iBAAiB;AAAA,IAClB;AAAA,EACD;AAAA,EACA;AAAA,IACC;AAAA,IACA;AAAA,MACC,MAAM;AAAA,MACN,MAAM;AAAA,MACN,iBAAiB;AAAA,IAClB;AAAA,EACD;AAAA,EACA;AAAA,IACC;AAAA,IACA;AAAA,MACC,MAAM;AAAA,MACN,MAAM;AAAA,MACN,iBAAiB;AAAA,IAClB;AAAA,EACD;AACD,CAAC;AAEM,IAAM,WAAW,QAAQ,IAAI;AAE7B,IAAM,UAAU,QAAQ,IAAI;AAE5B,IAAM,oBAAoB,QAAQ,IAAI;AAEtC,IAAM,cAAc,QAAQ,IAAI;AAEhC,IAAM,+BACZ,QAAQ,IAAI;","names":[]}
|