@kartverket/backstage-plugin-risk-scorecard 6.11.0 → 6.12.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/dist/components/riScInfo/RiScSelectionCard.esm.js +15 -1
- package/dist/components/riScInfo/RiScSelectionCard.esm.js.map +1 -1
- package/dist/contexts/RiScContext.esm.js +16 -13
- package/dist/contexts/RiScContext.esm.js.map +1 -1
- package/dist/utils/fetchRiScHelpers.esm.js +18 -68
- package/dist/utils/fetchRiScHelpers.esm.js.map +1 -1
- package/dist/utils/translations.esm.js +17 -1
- package/dist/utils/translations.esm.js.map +1 -1
- package/dist/utils/types.esm.js.map +1 -1
- package/package.json +1 -1
|
@@ -8,11 +8,13 @@ import ListSubheader from '@mui/material/ListSubheader';
|
|
|
8
8
|
import MenuItem from '@mui/material/MenuItem';
|
|
9
9
|
import MUISelect from '@mui/material/Select';
|
|
10
10
|
import riscStyles from './RiScSelectionCard.module.css.esm.js';
|
|
11
|
+
import { getUnavailableRiScReasonKey } from '../../utils/fetchRiScHelpers.esm.js';
|
|
11
12
|
|
|
12
13
|
function RiScSelectionCard() {
|
|
13
14
|
const {
|
|
14
15
|
riScs,
|
|
15
16
|
lockedRiScs,
|
|
17
|
+
unavailableRiScs,
|
|
16
18
|
systemRiScs,
|
|
17
19
|
selectedRiSc,
|
|
18
20
|
selectedLockedRiSc,
|
|
@@ -20,7 +22,7 @@ function RiScSelectionCard() {
|
|
|
20
22
|
selectRiSc
|
|
21
23
|
} = useRiScs();
|
|
22
24
|
const { t } = useTranslationRef(pluginRiScTranslationRef);
|
|
23
|
-
const hasOptions = riScs !== null && riScs.length !== 0 || systemRiScs.length !== 0 || lockedRiScs.length !== 0;
|
|
25
|
+
const hasOptions = riScs !== null && riScs.length !== 0 || systemRiScs.length !== 0 || lockedRiScs.length !== 0 || unavailableRiScs.length !== 0;
|
|
24
26
|
return /* @__PURE__ */ jsx(Flex, { direction: "column", gap: "24px", children: hasOptions && /* @__PURE__ */ jsx(FormControl, { fullWidth: true, size: "small", children: /* @__PURE__ */ jsxs(
|
|
25
27
|
MUISelect,
|
|
26
28
|
{
|
|
@@ -48,6 +50,18 @@ function RiScSelectionCard() {
|
|
|
48
50
|
lockedRiScs.map((riSc) => /* @__PURE__ */ jsxs(MenuItem, { value: riSc.id, children: [
|
|
49
51
|
"\u{1F512} ",
|
|
50
52
|
riSc.id
|
|
53
|
+
] }, riSc.id)),
|
|
54
|
+
unavailableRiScs.length > 0 && /* @__PURE__ */ jsx(
|
|
55
|
+
ListSubheader,
|
|
56
|
+
{
|
|
57
|
+
className: `${riscStyles.sectionHeader} ${riScs && riScs.length > 0 || systemRiScs.length > 0 || lockedRiScs.length > 0 ? riscStyles.sectionHeaderWithDivider : ""}`,
|
|
58
|
+
children: t("contentHeader.unavailableRiScsSection")
|
|
59
|
+
}
|
|
60
|
+
),
|
|
61
|
+
unavailableRiScs.map((riSc) => /* @__PURE__ */ jsxs(MenuItem, { value: riSc.id, disabled: true, children: [
|
|
62
|
+
riSc.id,
|
|
63
|
+
" \u2014 ",
|
|
64
|
+
t(getUnavailableRiScReasonKey(riSc.status), {})
|
|
51
65
|
] }, riSc.id))
|
|
52
66
|
]
|
|
53
67
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RiScSelectionCard.esm.js","sources":["../../../src/components/riScInfo/RiScSelectionCard.tsx"],"sourcesContent":["import { useRiScs } from '../../contexts/RiScContext.tsx';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { pluginRiScTranslationRef } from '../../utils/translations.ts';\nimport { Flex } from '@backstage/ui';\nimport FormControl from '@mui/material/FormControl';\nimport ListSubheader from '@mui/material/ListSubheader';\nimport MenuItem from '@mui/material/MenuItem';\nimport MUISelect from '@mui/material/Select';\nimport styles from './RiScSelectionCard.module.css';\n\nexport function RiScSelectionCard() {\n const {\n riScs,\n lockedRiScs,\n systemRiScs,\n selectedRiSc,\n selectedLockedRiSc,\n selectedSystemRiSc,\n selectRiSc,\n } = useRiScs();\n const { t } = useTranslationRef(pluginRiScTranslationRef);\n\n const hasOptions =\n (riScs !== null && riScs.length !== 0) ||\n systemRiScs.length !== 0 ||\n lockedRiScs.length !== 0;\n\n return (\n <Flex direction=\"column\" gap=\"24px\">\n {hasOptions && (\n <FormControl fullWidth size=\"small\">\n <MUISelect\n value={\n selectedRiSc?.id ??\n selectedSystemRiSc?.riScId ??\n selectedLockedRiSc?.id ??\n ''\n }\n onChange={e => selectRiSc(e.target.value)}\n inputProps={{ 'aria-label': t('contentHeader.multipleRiScs') }}\n MenuProps={{ disablePortal: true }}\n >\n {(riScs ?? []).map(riSc => (\n <MenuItem key={riSc.id} value={riSc.id}>\n {riSc.content.title}\n </MenuItem>\n ))}\n {systemRiScs.length > 0 && (\n <ListSubheader\n className={`${styles.sectionHeader} ${riScs && riScs.length > 0 ? styles.sectionHeaderWithDivider : ''}`}\n >\n {t('contentHeader.systemRiScsSection')}\n </ListSubheader>\n )}\n {systemRiScs.map(riSc => (\n <MenuItem key={riSc.riScId} value={riSc.riScId}>\n {riSc.riScId}\n </MenuItem>\n ))}\n {lockedRiScs.length > 0 && (\n <ListSubheader\n className={`${styles.sectionHeader} ${\n (riScs && riScs.length > 0) || systemRiScs.length > 0\n ? styles.sectionHeaderWithDivider\n : ''\n }`}\n >\n {t('contentHeader.lockedRiScsSection')}\n </ListSubheader>\n )}\n {lockedRiScs.map(riSc => (\n <MenuItem key={riSc.id} value={riSc.id}>\n 🔒 {riSc.id}\n </MenuItem>\n ))}\n </MUISelect>\n </FormControl>\n )}\n </Flex>\n );\n}\n"],"names":["styles"],"mappings":"
|
|
1
|
+
{"version":3,"file":"RiScSelectionCard.esm.js","sources":["../../../src/components/riScInfo/RiScSelectionCard.tsx"],"sourcesContent":["import { useRiScs } from '../../contexts/RiScContext.tsx';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { pluginRiScTranslationRef } from '../../utils/translations.ts';\nimport { Flex } from '@backstage/ui';\nimport FormControl from '@mui/material/FormControl';\nimport ListSubheader from '@mui/material/ListSubheader';\nimport MenuItem from '@mui/material/MenuItem';\nimport MUISelect from '@mui/material/Select';\nimport styles from './RiScSelectionCard.module.css';\nimport { getUnavailableRiScReasonKey } from '../../utils/fetchRiScHelpers.ts';\n\nexport function RiScSelectionCard() {\n const {\n riScs,\n lockedRiScs,\n unavailableRiScs,\n systemRiScs,\n selectedRiSc,\n selectedLockedRiSc,\n selectedSystemRiSc,\n selectRiSc,\n } = useRiScs();\n const { t } = useTranslationRef(pluginRiScTranslationRef);\n\n const hasOptions =\n (riScs !== null && riScs.length !== 0) ||\n systemRiScs.length !== 0 ||\n lockedRiScs.length !== 0 ||\n unavailableRiScs.length !== 0;\n\n return (\n <Flex direction=\"column\" gap=\"24px\">\n {hasOptions && (\n <FormControl fullWidth size=\"small\">\n <MUISelect\n value={\n selectedRiSc?.id ??\n selectedSystemRiSc?.riScId ??\n selectedLockedRiSc?.id ??\n ''\n }\n onChange={e => selectRiSc(e.target.value)}\n inputProps={{ 'aria-label': t('contentHeader.multipleRiScs') }}\n MenuProps={{ disablePortal: true }}\n >\n {(riScs ?? []).map(riSc => (\n <MenuItem key={riSc.id} value={riSc.id}>\n {riSc.content.title}\n </MenuItem>\n ))}\n {systemRiScs.length > 0 && (\n <ListSubheader\n className={`${styles.sectionHeader} ${riScs && riScs.length > 0 ? styles.sectionHeaderWithDivider : ''}`}\n >\n {t('contentHeader.systemRiScsSection')}\n </ListSubheader>\n )}\n {systemRiScs.map(riSc => (\n <MenuItem key={riSc.riScId} value={riSc.riScId}>\n {riSc.riScId}\n </MenuItem>\n ))}\n {lockedRiScs.length > 0 && (\n <ListSubheader\n className={`${styles.sectionHeader} ${\n (riScs && riScs.length > 0) || systemRiScs.length > 0\n ? styles.sectionHeaderWithDivider\n : ''\n }`}\n >\n {t('contentHeader.lockedRiScsSection')}\n </ListSubheader>\n )}\n {lockedRiScs.map(riSc => (\n <MenuItem key={riSc.id} value={riSc.id}>\n 🔒 {riSc.id}\n </MenuItem>\n ))}\n {unavailableRiScs.length > 0 && (\n <ListSubheader\n className={`${styles.sectionHeader} ${\n (riScs && riScs.length > 0) ||\n systemRiScs.length > 0 ||\n lockedRiScs.length > 0\n ? styles.sectionHeaderWithDivider\n : ''\n }`}\n >\n {t('contentHeader.unavailableRiScsSection')}\n </ListSubheader>\n )}\n {unavailableRiScs.map(riSc => (\n <MenuItem key={riSc.id} value={riSc.id} disabled>\n {riSc.id} — {t(getUnavailableRiScReasonKey(riSc.status), {})}\n </MenuItem>\n ))}\n </MUISelect>\n </FormControl>\n )}\n </Flex>\n );\n}\n"],"names":["styles"],"mappings":";;;;;;;;;;;;AAWO,SAAS,iBAAA,GAAoB;AAClC,EAAA,MAAM;AAAA,IACJ,KAAA;AAAA,IACA,WAAA;AAAA,IACA,gBAAA;AAAA,IACA,WAAA;AAAA,IACA,YAAA;AAAA,IACA,kBAAA;AAAA,IACA,kBAAA;AAAA,IACA;AAAA,MACE,QAAA,EAAS;AACb,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,iBAAA,CAAkB,wBAAwB,CAAA;AAExD,EAAA,MAAM,UAAA,GACH,KAAA,KAAU,IAAA,IAAQ,KAAA,CAAM,MAAA,KAAW,CAAA,IACpC,WAAA,CAAY,MAAA,KAAW,CAAA,IACvB,WAAA,CAAY,MAAA,KAAW,CAAA,IACvB,iBAAiB,MAAA,KAAW,CAAA;AAE9B,EAAA,uBACE,GAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAU,QAAA,EAAS,GAAA,EAAI,MAAA,EAC1B,QAAA,EAAA,UAAA,oBACC,GAAA,CAAC,WAAA,EAAA,EAAY,SAAA,EAAS,IAAA,EAAC,IAAA,EAAK,OAAA,EAC1B,QAAA,kBAAA,IAAA;AAAA,IAAC,SAAA;AAAA,IAAA;AAAA,MACC,OACE,YAAA,EAAc,EAAA,IACd,kBAAA,EAAoB,MAAA,IACpB,oBAAoB,EAAA,IACpB,EAAA;AAAA,MAEF,QAAA,EAAU,CAAA,CAAA,KAAK,UAAA,CAAW,CAAA,CAAE,OAAO,KAAK,CAAA;AAAA,MACxC,UAAA,EAAY,EAAE,YAAA,EAAc,CAAA,CAAE,6BAA6B,CAAA,EAAE;AAAA,MAC7D,SAAA,EAAW,EAAE,aAAA,EAAe,IAAA,EAAK;AAAA,MAE/B,QAAA,EAAA;AAAA,QAAA,CAAA,KAAA,IAAS,EAAC,EAAG,GAAA,CAAI,CAAA,IAAA,yBAChB,QAAA,EAAA,EAAuB,KAAA,EAAO,IAAA,CAAK,EAAA,EACjC,QAAA,EAAA,IAAA,CAAK,OAAA,CAAQ,KAAA,EAAA,EADD,IAAA,CAAK,EAEpB,CACD,CAAA;AAAA,QACA,WAAA,CAAY,SAAS,CAAA,oBACpB,GAAA;AAAA,UAAC,aAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAW,CAAA,EAAGA,UAAA,CAAO,aAAa,CAAA,CAAA,EAAI,KAAA,IAAS,KAAA,CAAM,MAAA,GAAS,CAAA,GAAIA,UAAA,CAAO,wBAAA,GAA2B,EAAE,CAAA,CAAA;AAAA,YAErG,YAAE,kCAAkC;AAAA;AAAA,SACvC;AAAA,QAED,WAAA,CAAY,GAAA,CAAI,CAAA,IAAA,qBACf,GAAA,CAAC,QAAA,EAAA,EAA2B,KAAA,EAAO,IAAA,CAAK,MAAA,EACrC,QAAA,EAAA,IAAA,CAAK,MAAA,EAAA,EADO,IAAA,CAAK,MAEpB,CACD,CAAA;AAAA,QACA,WAAA,CAAY,SAAS,CAAA,oBACpB,GAAA;AAAA,UAAC,aAAA;AAAA,UAAA;AAAA,YACC,SAAA,EAAW,CAAA,EAAGA,UAAA,CAAO,aAAa,IAC/B,KAAA,IAAS,KAAA,CAAM,MAAA,GAAS,CAAA,IAAM,WAAA,CAAY,MAAA,GAAS,CAAA,GAChDA,UAAA,CAAO,2BACP,EACN,CAAA,CAAA;AAAA,YAEC,YAAE,kCAAkC;AAAA;AAAA,SACvC;AAAA,QAED,YAAY,GAAA,CAAI,CAAA,IAAA,0BACd,QAAA,EAAA,EAAuB,KAAA,EAAO,KAAK,EAAA,EAAI,QAAA,EAAA;AAAA,UAAA,YAAA;AAAA,UAClC,IAAA,CAAK;AAAA,SAAA,EAAA,EADI,IAAA,CAAK,EAEpB,CACD,CAAA;AAAA,QACA,gBAAA,CAAiB,SAAS,CAAA,oBACzB,GAAA;AAAA,UAAC,aAAA;AAAA,UAAA;AAAA,YACC,WAAW,CAAA,EAAGA,UAAA,CAAO,aAAa,CAAA,CAAA,EAC/B,SAAS,KAAA,CAAM,MAAA,GAAS,CAAA,IACzB,WAAA,CAAY,SAAS,CAAA,IACrB,WAAA,CAAY,SAAS,CAAA,GACjBA,UAAA,CAAO,2BACP,EACN,CAAA,CAAA;AAAA,YAEC,YAAE,uCAAuC;AAAA;AAAA,SAC5C;AAAA,QAED,gBAAA,CAAiB,IAAI,CAAA,IAAA,qBACpB,IAAA,CAAC,YAAuB,KAAA,EAAO,IAAA,CAAK,EAAA,EAAI,QAAA,EAAQ,IAAA,EAC7C,QAAA,EAAA;AAAA,UAAA,IAAA,CAAK,EAAA;AAAA,UAAG,UAAA;AAAA,UAAI,EAAE,2BAAA,CAA4B,IAAA,CAAK,MAAM,CAAA,EAAG,EAAE;AAAA,SAAA,EAAA,EAD9C,IAAA,CAAK,EAEpB,CACD;AAAA;AAAA;AAAA,KAEL,CAAA,EAEJ,CAAA;AAEJ;;;;"}
|
|
@@ -7,7 +7,7 @@ import { getTranslationKey, requiresNewApproval } from '../utils/utilityfunction
|
|
|
7
7
|
import { riScRouteRef } from '../routes.esm.js';
|
|
8
8
|
import { useParams, useLocation, useNavigate } from 'react-router';
|
|
9
9
|
import { dtoToRiSc } from '../utils/DTOs.esm.js';
|
|
10
|
-
import { withLoginRejected, mapRiScDtoToRiScWithMetadata
|
|
10
|
+
import { withLoginRejected, mapRiScDtoToRiScWithMetadata } from '../utils/fetchRiScHelpers.esm.js';
|
|
11
11
|
import { useGithubRepositoryInformation, useSystemRiScsForCurrentEntity, useAuthenticatedFetch } from '../utils/hooks.esm.js';
|
|
12
12
|
import '../utils/constants.esm.js';
|
|
13
13
|
import { useTranslationRef } from '@backstage/core-plugin-api/alpha';
|
|
@@ -34,6 +34,9 @@ function RiScProvider({ children }) {
|
|
|
34
34
|
} = useAuthenticatedFetch();
|
|
35
35
|
const [riScs, setRiScs] = useState(null);
|
|
36
36
|
const [lockedRiScs, setLockedRiScs] = useState([]);
|
|
37
|
+
const [unavailableRiScs, setUnavailableRiScs] = useState(
|
|
38
|
+
[]
|
|
39
|
+
);
|
|
37
40
|
const [selectedRiSc, setSelectedRiSc] = useState(
|
|
38
41
|
null
|
|
39
42
|
);
|
|
@@ -146,6 +149,9 @@ function RiScProvider({ children }) {
|
|
|
146
149
|
const decryptionFailedRiScs = res.filter(
|
|
147
150
|
(risk) => risk.status === ContentStatus.DecryptionFailed
|
|
148
151
|
);
|
|
152
|
+
const failedRiScs = res.filter(
|
|
153
|
+
(risk) => risk.status !== ContentStatus.Success && risk.status !== ContentStatus.DecryptionFailed
|
|
154
|
+
);
|
|
149
155
|
const allFailed = res.length > 0 && res.every((r) => r.status === ContentStatus.DecryptionFailed);
|
|
150
156
|
setAllRiScsFailedDecryption(allFailed);
|
|
151
157
|
const fetchedRiScs = successfulRiScs.map(
|
|
@@ -157,26 +163,22 @@ function RiScProvider({ children }) {
|
|
|
157
163
|
encryptionKeyId: risk.encryptionKeyId ?? null
|
|
158
164
|
})
|
|
159
165
|
);
|
|
166
|
+
const fetchedUnavailableRiScs = failedRiScs.map(
|
|
167
|
+
(risk) => ({
|
|
168
|
+
id: risk.riScId,
|
|
169
|
+
status: risk.status,
|
|
170
|
+
errorCode: risk.errorCode
|
|
171
|
+
})
|
|
172
|
+
);
|
|
160
173
|
setRiScs(fetchedRiScs);
|
|
161
174
|
setLockedRiScs(fetchedLockedRiScs);
|
|
175
|
+
setUnavailableRiScs(fetchedUnavailableRiScs);
|
|
162
176
|
isFetchingRiScsRef.current = false;
|
|
163
177
|
setIsFetchingRiScs(isFetchingRiScsRef.current);
|
|
164
178
|
if (!isFetchingGcpCryptoKeysRef.current) {
|
|
165
179
|
isFetchingRef.current = false;
|
|
166
180
|
setIsFetching(isFetchingRef.current);
|
|
167
181
|
}
|
|
168
|
-
const errorRiScs = res.filter(
|
|
169
|
-
(risk) => risk.status !== ContentStatus.Success
|
|
170
|
-
);
|
|
171
|
-
if (errorRiScs.length > 0) {
|
|
172
|
-
dispatch({
|
|
173
|
-
type: "SET_RESPONSE",
|
|
174
|
-
response: {
|
|
175
|
-
statusMessage: buildFetchRiScErrorMessages(errorRiScs, t),
|
|
176
|
-
status: ProcessingStatus.ErrorWhenFetchingRiScs
|
|
177
|
-
}
|
|
178
|
-
});
|
|
179
|
-
}
|
|
180
182
|
if (!riScIdFromParams) {
|
|
181
183
|
if (fetchedRiScs.length > 0) {
|
|
182
184
|
navigate(getRiScPath({ riScId: fetchedRiScs[0].id }));
|
|
@@ -520,6 +522,7 @@ function RiScProvider({ children }) {
|
|
|
520
522
|
const value = {
|
|
521
523
|
riScs,
|
|
522
524
|
lockedRiScs,
|
|
525
|
+
unavailableRiScs,
|
|
523
526
|
systemRiScs,
|
|
524
527
|
selectRiSc,
|
|
525
528
|
selectedRiSc,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RiScContext.esm.js","sources":["../../src/contexts/RiScContext.tsx"],"sourcesContent":["import {\n createContext,\n ReactNode,\n useCallback,\n useContext,\n useEffect,\n useRef,\n useState,\n useReducer,\n} from 'react';\nimport {\n ContentStatus,\n LockedRiSc,\n ProcessingStatus,\n RiScStatus,\n RiScWithMetadata,\n SubmitResponseObject,\n SystemRiSc,\n} from '../utils/types';\nimport { useRouteRef } from '@backstage/core-plugin-api';\nimport {\n entityRouteParams,\n entityRouteRef,\n} from '@backstage/plugin-catalog-react';\nimport {\n getTranslationKey,\n requiresNewApproval,\n} from '../utils/utilityfunctions';\nimport { riScRouteRef } from '../routes';\nimport { useLocation, useNavigate, useParams } from 'react-router';\nimport {\n dtoToRiSc,\n GcpCryptoKeyObject,\n ProcessRiScResultDTO,\n RiScContentResultDTO,\n RiScDTO,\n} from '../utils/DTOs';\nimport {\n buildFetchRiScErrorMessages,\n mapRiScDtoToRiScWithMetadata,\n withLoginRejected,\n} from '../utils/fetchRiScHelpers';\nimport {\n useAuthenticatedFetch,\n useGithubRepositoryInformation,\n useSystemRiScsForCurrentEntity,\n} from '../utils/hooks';\nimport { latestSupportedVersion } from '../utils/constants';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { pluginRiScTranslationRef } from '../utils/translations';\n\nexport type UpdateStatus = {\n isLoading: boolean;\n isError: boolean;\n isSuccess: boolean;\n};\n\ntype RiScDrawerProps = {\n riScs: RiScWithMetadata[] | null;\n lockedRiScs: LockedRiSc[];\n systemRiScs: SystemRiSc[];\n selectRiSc: (id: string) => void;\n selectedRiSc: RiScWithMetadata | null;\n selectedLockedRiSc: LockedRiSc | null;\n selectedSystemRiSc: SystemRiSc | null;\n createNewRiSc: (\n riSc: RiScWithMetadata,\n generateInitialRisc: boolean,\n defaultRiScId: string | undefined,\n ) => void;\n deleteRiSc: (onSuccess?: () => void, onError?: () => void) => void;\n updateRiSc: (\n riSc: RiScWithMetadata,\n onSuccess?: () => void,\n onError?: () => void,\n ) => void;\n showBlockedUpdateError: () => void;\n approveRiSc: () => void;\n updateStatus: UpdateStatus;\n resetRiScStatus: () => void;\n resetResponse: () => void;\n isFetching: boolean;\n isFetchingGcpCryptoKeys: boolean;\n failedToFetchGcpCryptoKeys: boolean;\n allRiScsFailedDecryption: boolean;\n gcpCryptoKeys: GcpCryptoKeyObject[];\n response: SubmitResponseObject | null;\n};\n\nconst RiScContext = createContext<RiScDrawerProps | undefined>(undefined);\n\nexport function RiScProvider({ children }: { children: ReactNode }) {\n const { riScId: riScIdFromParams } = useParams();\n const location = useLocation();\n const navigate = useNavigate();\n const getRiScPath = useRouteRef(riScRouteRef);\n const getEntityPath = useRouteRef(entityRouteRef);\n const [isRequesting, setIsRequesting] = useState<boolean>(false);\n const { t } = useTranslationRef(pluginRiScTranslationRef);\n const repoInfo = useGithubRepositoryInformation();\n const { riScs: systemRiScs } = useSystemRiScsForCurrentEntity();\n\n const {\n fetchRiScs,\n fetchGcpCryptoKeys,\n postRiScs,\n deleteRiScs,\n putRiScs,\n publishRiScs,\n } = useAuthenticatedFetch();\n\n const [riScs, setRiScs] = useState<RiScWithMetadata[] | null>(null);\n const [lockedRiScs, setLockedRiScs] = useState<LockedRiSc[]>([]);\n const [selectedRiSc, setSelectedRiSc] = useState<RiScWithMetadata | null>(\n null,\n );\n const [selectedLockedRiSc, setSelectedLockedRiSc] =\n useState<LockedRiSc | null>(null);\n const [selectedSystemRiSc, setSelectedSystemRiSc] =\n useState<SystemRiSc | null>(null);\n const [isFetching, setIsFetching] = useState(true);\n const isFetchingRef = useRef(isFetching);\n const [isFetchingRiScs, setIsFetchingRiScs] = useState(true);\n const isFetchingRiScsRef = useRef(isFetchingRiScs);\n const [isFetchingGcpCryptoKeys, setIsFetchingGcpCryptoKeys] = useState(true);\n const isFetchingGcpCryptoKeysRef = useRef(isFetchingGcpCryptoKeys);\n const gcpCryptoKeysFailed = useRef(false);\n const [failedToFetchGcpCryptoKeys, setFailedToFetchGcpCryptoKeys] =\n useState(false);\n\n type LocalState = {\n updateStatus: UpdateStatus;\n response: SubmitResponseObject | null;\n };\n\n type Action =\n | { type: 'SET_STATUS'; updateStatus: UpdateStatus }\n | { type: 'SET_RESPONSE'; response: SubmitResponseObject | null }\n | {\n type: 'SET_BOTH';\n updateStatus: UpdateStatus;\n response: SubmitResponseObject | null;\n };\n\n const initialLocalState: LocalState = {\n updateStatus: { isLoading: false, isError: false, isSuccess: false },\n response: null,\n };\n\n function reducer(state: LocalState, action: Action): LocalState {\n switch (action.type) {\n case 'SET_STATUS':\n return { ...state, updateStatus: action.updateStatus };\n case 'SET_RESPONSE':\n return { ...state, response: action.response };\n case 'SET_BOTH':\n return { updateStatus: action.updateStatus, response: action.response };\n default:\n return state;\n }\n }\n\n const [localState, dispatch] = useReducer(reducer, initialLocalState);\n\n const [gcpCryptoKeys, setGcpCryptoKeys] = useState<GcpCryptoKeyObject[]>([]);\n\n const [allRiScsFailedDecryption, setAllRiScsFailedDecryption] =\n useState(false);\n\n // Auto-clear response after a short duration to avoid the Alert sticking around\n const responseTimerRef = useRef<number | null>(null);\n useEffect(() => {\n if (localState.response) {\n if (responseTimerRef.current) {\n window.clearTimeout(responseTimerRef.current);\n }\n responseTimerRef.current = window.setTimeout(() => {\n dispatch({ type: 'SET_RESPONSE', response: null });\n responseTimerRef.current = null;\n }, 10000);\n }\n\n return () => {\n if (responseTimerRef.current) {\n window.clearTimeout(responseTimerRef.current);\n responseTimerRef.current = null;\n }\n };\n }, [localState.response]);\n\n useEffect(() => {\n if (location.state) {\n dispatch({\n type: 'SET_RESPONSE',\n response: {\n statusMessage: location.state,\n status: ProcessingStatus.ErrorWhenFetchingRiScs,\n },\n });\n }\n }, [location, dispatch]);\n\n // Initial fetch of GCP crypto keys\n useEffect(() => {\n gcpCryptoKeysFailed.current = false;\n setFailedToFetchGcpCryptoKeys(false);\n dispatch({ type: 'SET_RESPONSE', response: null });\n fetchGcpCryptoKeys(\n res => {\n // Sorts the crypto keys by the number of permissions (descending)\n setGcpCryptoKeys(\n res.sort(\n (a, b) =>\n (b.userPermissions?.length ?? 0) -\n (a.userPermissions?.length ?? 0),\n ),\n );\n isFetchingGcpCryptoKeysRef.current = false;\n setIsFetchingGcpCryptoKeys(isFetchingGcpCryptoKeysRef.current);\n if (!isFetchingRiScsRef.current) {\n isFetchingRef.current = false;\n setIsFetching(isFetchingRef.current);\n }\n },\n (_error, loginRejected) => {\n gcpCryptoKeysFailed.current = true;\n setFailedToFetchGcpCryptoKeys(true);\n dispatch({\n type: 'SET_RESPONSE',\n response: {\n status: ProcessingStatus.ErrorWhenFetchingGcpCryptoKeys,\n statusMessage: withLoginRejected(\n t('errorMessages.ErrorWhenFetchingGcpCryptoKeys'),\n loginRejected,\n t,\n ),\n },\n });\n isFetchingGcpCryptoKeysRef.current = false;\n setIsFetchingGcpCryptoKeys(isFetchingGcpCryptoKeysRef.current);\n if (!isFetchingRiScsRef.current) {\n isFetchingRef.current = false;\n setIsFetching(isFetchingRef.current);\n }\n },\n );\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // Initial fetch of RiScs\n useEffect(() => {\n dispatch({ type: 'SET_RESPONSE', response: null });\n fetchRiScs(\n res => {\n const successfulRiScs = res.filter(\n risk => risk.status === ContentStatus.Success,\n );\n const decryptionFailedRiScs = res.filter(\n risk => risk.status === ContentStatus.DecryptionFailed,\n );\n\n // Check if all RiScs failed decryption (there are RiScs but all failed)\n const allFailed =\n res.length > 0 &&\n res.every(r => r.status === ContentStatus.DecryptionFailed);\n setAllRiScsFailedDecryption(allFailed);\n\n const fetchedRiScs: RiScWithMetadata[] = successfulRiScs.map(\n mapRiScDtoToRiScWithMetadata,\n );\n const fetchedLockedRiScs: LockedRiSc[] = decryptionFailedRiScs.map(\n risk => ({\n id: risk.riScId,\n encryptionKeyId: risk.encryptionKeyId ?? null,\n }),\n );\n setRiScs(fetchedRiScs);\n setLockedRiScs(fetchedLockedRiScs);\n isFetchingRiScsRef.current = false;\n setIsFetchingRiScs(isFetchingRiScsRef.current);\n if (!isFetchingGcpCryptoKeysRef.current) {\n isFetchingRef.current = false;\n setIsFetching(isFetchingRef.current);\n }\n\n const errorRiScs: RiScContentResultDTO[] = res.filter(\n risk => risk.status !== ContentStatus.Success,\n );\n\n if (errorRiScs.length > 0) {\n dispatch({\n type: 'SET_RESPONSE',\n response: {\n statusMessage: buildFetchRiScErrorMessages(errorRiScs, t),\n status: ProcessingStatus.ErrorWhenFetchingRiScs,\n },\n });\n }\n\n if (!riScIdFromParams) {\n // If there is no RiSc ID in the URL\n\n if (fetchedRiScs.length > 0) {\n navigate(getRiScPath({ riScId: fetchedRiScs[0].id }));\n } else if (fetchedLockedRiScs.length > 0) {\n navigate(getRiScPath({ riScId: fetchedLockedRiScs[0].id }));\n }\n\n // If there are system-RiScs the user will see a message that they need to choose since changing component automatically is not good UX.\n return;\n }\n\n const riSc = fetchedRiScs.find(r => r.id === riScIdFromParams);\n const isLockedRiSc = fetchedLockedRiScs.some(\n r => r.id === riScIdFromParams,\n );\n\n // If there is an invalid RiSc ID in the URL (not accessible and not locked), navigate to the first RiSc\n if (fetchedRiScs.length > 0 && !riSc && !isLockedRiSc) {\n navigate(getRiScPath({ riScId: fetchedRiScs[0].id }), {\n state: t('errorMessages.RiScDoesNotExist'),\n });\n }\n },\n loginRejected => {\n if (!gcpCryptoKeysFailed.current) {\n dispatch({\n type: 'SET_RESPONSE',\n response: {\n status: ProcessingStatus.ErrorWhenFetchingRiScs,\n statusMessage: withLoginRejected(\n t('errorMessages.ErrorWhenFetchingRiScs'),\n loginRejected,\n t,\n ),\n },\n });\n }\n isFetchingRiScsRef.current = false;\n setIsFetchingRiScs(isFetchingRiScsRef.current);\n if (!isFetchingGcpCryptoKeysRef.current) {\n isFetchingRef.current = false;\n setIsFetching(isFetchingRef.current);\n }\n },\n );\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // Set selected RiSc, system RiSc or locked RiSc based on URL\n useEffect(() => {\n if (!riScIdFromParams) return;\n const riSc = riScs?.find(r => r.id === riScIdFromParams);\n const lockedRiSc = lockedRiScs.find(r => r.id === riScIdFromParams);\n const systemRiSc = systemRiScs.find(r => r.riScId === riScIdFromParams);\n if (riSc) {\n setSelectedRiSc(riSc);\n setSelectedLockedRiSc(null);\n setSelectedSystemRiSc(null);\n } else if (lockedRiSc) {\n setSelectedLockedRiSc(lockedRiSc);\n setSelectedRiSc(null);\n setSelectedSystemRiSc(null);\n } else if (systemRiSc) {\n setSelectedSystemRiSc(systemRiSc);\n setSelectedRiSc(null);\n setSelectedLockedRiSc(null);\n }\n }, [riScs, systemRiScs, lockedRiScs, riScIdFromParams]);\n\n const resetRiScStatus = useCallback(() => {\n dispatch({\n type: 'SET_STATUS',\n updateStatus: { isLoading: false, isSuccess: false, isError: false },\n });\n }, [dispatch]);\n\n // use callback to avoid infinite loop\n const resetResponse = useCallback(() => {\n dispatch({ type: 'SET_RESPONSE', response: null });\n }, [dispatch]);\n\n const getTranslationContext = useCallback(\n (status: ProcessingStatus) => {\n return status === ProcessingStatus.ErrorWhenNoWriteAccessToRepository\n ? { owner: repoInfo.owner, name: repoInfo.name }\n : undefined;\n },\n [repoInfo.owner, repoInfo.name],\n );\n\n function getSystemRiScPath(systemRiSc: SystemRiSc): string {\n const routeEntityRef = systemRiSc.appliesTo[0];\n\n if (!routeEntityRef) {\n throw new Error(\n `System RiSc \"${systemRiSc.riScId}\" has no appliesTo entries`,\n );\n }\n\n const entityPath = getEntityPath(entityRouteParams(routeEntityRef));\n return `${entityPath}/risc/${encodeURIComponent(systemRiSc.riScId)}`;\n }\n\n function selectRiSc(id: string) {\n const systemRiSc = systemRiScs.find(riSc => riSc.riScId === id);\n\n if (systemRiSc) {\n navigate(getSystemRiScPath(systemRiSc));\n return;\n }\n\n navigate(getRiScPath({ riScId: id }));\n }\n\n function createNewRiSc(\n riSc: RiScWithMetadata,\n generateInitialRisc: boolean,\n defaultRiScId: string | undefined,\n ) {\n setIsFetching(true);\n setSelectedRiSc(null);\n setSelectedSystemRiSc(null);\n dispatch({\n type: 'SET_BOTH',\n updateStatus: { isLoading: true, isError: false, isSuccess: false },\n response: null,\n });\n const newRiSc: RiScWithMetadata = {\n ...riSc,\n schemaVersion: latestSupportedVersion,\n };\n postRiScs(\n newRiSc.content,\n generateInitialRisc,\n newRiSc.sopsConfig,\n defaultRiScId,\n res => {\n if (!res.riScId) throw new Error('No RiSc ID returned');\n if (!res.riScContent) throw new Error('No RiSc content returned');\n const json = JSON.parse(res.riScContent) as RiScDTO;\n const content = dtoToRiSc(json);\n const riScWithMetaData: RiScWithMetadata = {\n id: res.riScId,\n status: RiScStatus.Draft,\n content: content,\n sopsConfig: riSc.sopsConfig,\n schemaVersion: riSc.schemaVersion,\n lastPublished: riSc.lastPublished,\n };\n setRiScs(riScs ? [...riScs, riScWithMetaData] : [riScWithMetaData]);\n setIsFetching(false);\n navigate(getRiScPath({ riScId: res.riScId }));\n dispatch({\n type: 'SET_BOTH',\n updateStatus: { isLoading: false, isError: false, isSuccess: true },\n response: {\n ...res,\n statusMessage: getTranslationKey('info', res.status, t),\n },\n });\n },\n (error: ProcessRiScResultDTO, loginRejected: boolean) => {\n setSelectedRiSc(selectedRiSc);\n setIsFetching(false);\n\n const translationContext = getTranslationContext(error.status);\n\n dispatch({\n type: 'SET_BOTH',\n updateStatus: { isLoading: false, isError: true, isSuccess: false },\n response: {\n ...error,\n statusMessage: withLoginRejected(\n getTranslationKey('error', error.status, t, translationContext),\n loginRejected,\n t,\n ),\n },\n });\n },\n );\n }\n\n function deleteRiSc(onSuccess?: () => void, onError?: () => void) {\n if (selectedRiSc && riScs) {\n const updatedRiSc = {\n ...selectedRiSc,\n status: RiScStatus.DeletionDraft,\n };\n const originalRiSc = selectedRiSc;\n\n dispatch({\n type: 'SET_BOTH',\n updateStatus: { isLoading: true, isError: false, isSuccess: false },\n response: null,\n });\n deleteRiScs(\n selectedRiSc.id,\n res => {\n dispatch({\n type: 'SET_BOTH',\n updateStatus: { isLoading: false, isError: false, isSuccess: true },\n response: {\n ...res,\n statusMessage: getTranslationKey('info', res.status, t),\n },\n });\n setIsRequesting(false);\n if (res.status === ProcessingStatus.DeletedRiSc) {\n setSelectedRiSc(\n riScs.find(riSc => riSc.id !== selectedRiSc.id) || null,\n );\n setRiScs(riScs.filter(riSc => riSc.id !== updatedRiSc.id));\n if (onSuccess) onSuccess();\n } else {\n setSelectedRiSc(updatedRiSc);\n setRiScs(\n riScs.map(riSc =>\n riSc.id === selectedRiSc.id ? updatedRiSc : riSc,\n ),\n );\n }\n },\n (error, loginRejected) => {\n setSelectedRiSc(originalRiSc);\n\n const translationContext = getTranslationContext(error.status);\n\n dispatch({\n type: 'SET_BOTH',\n updateStatus: { isLoading: false, isError: true, isSuccess: false },\n response: {\n ...error,\n statusMessage: withLoginRejected(\n getTranslationKey('error', error.status, t, translationContext),\n loginRejected,\n t,\n ),\n },\n });\n setIsRequesting(false);\n if (onError) onError();\n },\n );\n }\n }\n\n const isRiScMarkedForDeletion =\n selectedRiSc?.status === RiScStatus.DeletionDraft ||\n selectedRiSc?.status === RiScStatus.DeletionSentForApproval;\n\n const showBlockedUpdateError = useCallback(() => {\n dispatch({\n type: 'SET_BOTH',\n updateStatus: { isLoading: false, isError: true, isSuccess: false },\n response: {\n status: ProcessingStatus.ErrorWhenUpdatingDeletedRiSc,\n statusMessage: t('errorMessages.ErrorWhenUpdatingDeletedRiSc'),\n },\n });\n }, [dispatch, t]);\n\n function updateRiSc(\n riSc: RiScWithMetadata,\n onSuccess?: () => void,\n onError?: () => void,\n ) {\n if (isRiScMarkedForDeletion) {\n showBlockedUpdateError();\n onError?.();\n return;\n }\n\n if (selectedRiSc && riScs) {\n const isRequiresNewApproval =\n selectedRiSc.migrationStatus?.migrationRequiresNewApproval ||\n requiresNewApproval(selectedRiSc.content, riSc.content);\n\n const updatedRiSc: RiScWithMetadata = {\n ...selectedRiSc,\n sopsConfig: riSc.sopsConfig,\n content: riSc.content,\n status:\n selectedRiSc.status !== RiScStatus.Draft && isRequiresNewApproval\n ? RiScStatus.Draft\n : selectedRiSc.status,\n isRequiresNewApproval: isRequiresNewApproval,\n schemaVersion: riSc.schemaVersion,\n migrationStatus: {\n migrationChanges: false,\n migrationRequiresNewApproval: false,\n },\n };\n const originalRiSc = selectedRiSc;\n setSelectedRiSc(updatedRiSc);\n dispatch({\n type: 'SET_BOTH',\n updateStatus: { isLoading: true, isError: false, isSuccess: false },\n response: null,\n });\n putRiScs(\n updatedRiSc,\n res => {\n dispatch({\n type: 'SET_BOTH',\n updateStatus: { isLoading: false, isError: false, isSuccess: true },\n response: {\n ...res,\n statusMessage: getTranslationKey('info', res.status, t),\n },\n });\n if ('pendingApproval' in res && res.pendingApproval?.pullRequestUrl) {\n updatedRiSc.pullRequestUrl = res.pendingApproval.pullRequestUrl;\n updatedRiSc.status = RiScStatus.SentForApproval;\n }\n setSelectedRiSc(updatedRiSc);\n setRiScs(\n riScs.map(r => (r.id === selectedRiSc.id ? updatedRiSc : r)),\n );\n setIsRequesting(false);\n if (onSuccess) onSuccess();\n },\n (error, loginRejected) => {\n const translationContext = getTranslationContext(error.status);\n\n dispatch({\n type: 'SET_BOTH',\n updateStatus: { isLoading: false, isError: true, isSuccess: false },\n response: {\n ...error,\n statusMessage: withLoginRejected(\n getTranslationKey('error', error.status, t, translationContext),\n loginRejected,\n t,\n ),\n },\n });\n setIsRequesting(false);\n if (onError) onError();\n setSelectedRiSc(originalRiSc);\n },\n );\n }\n }\n\n function approveRiSc() {\n if (selectedRiSc && riScs) {\n dispatch({\n type: 'SET_STATUS',\n updateStatus: { isLoading: true, isError: false, isSuccess: false },\n });\n publishRiScs(\n selectedRiSc.id,\n res => {\n const prUrl = res.pendingApproval?.pullRequestUrl;\n const updatedRiSc = {\n ...selectedRiSc,\n status:\n selectedRiSc.status === RiScStatus.Draft\n ? RiScStatus.SentForApproval\n : RiScStatus.DeletionSentForApproval,\n pullRequestUrl: prUrl,\n };\n setSelectedRiSc(updatedRiSc);\n setRiScs(\n riScs.map(r => (r.id === selectedRiSc.id ? updatedRiSc : r)),\n );\n dispatch({\n type: 'SET_BOTH',\n updateStatus: { isLoading: false, isError: false, isSuccess: true },\n response: {\n ...res,\n statusMessage: getTranslationKey('info', res.status, t),\n },\n });\n },\n (error, loginRejected) => {\n const translationContext = getTranslationContext(error.status);\n\n dispatch({\n type: 'SET_BOTH',\n updateStatus: { isLoading: false, isError: true, isSuccess: false },\n response: {\n ...error,\n statusMessage: withLoginRejected(\n getTranslationKey('error', error.status, t, translationContext),\n loginRejected,\n t,\n ),\n },\n });\n },\n );\n }\n }\n\n const value = {\n riScs,\n lockedRiScs,\n systemRiScs,\n selectRiSc,\n selectedRiSc,\n selectedLockedRiSc,\n selectedSystemRiSc,\n createNewRiSc,\n deleteRiSc,\n updateRiSc,\n showBlockedUpdateError,\n approveRiSc,\n updateStatus: localState.updateStatus,\n resetRiScStatus,\n resetResponse,\n isRequesting,\n isFetching,\n response: localState.response,\n gcpCryptoKeys,\n };\n\n return (\n <RiScContext.Provider\n value={{\n ...value,\n isFetchingGcpCryptoKeys: false,\n failedToFetchGcpCryptoKeys,\n allRiScsFailedDecryption,\n }}\n >\n {children}\n </RiScContext.Provider>\n );\n}\n\nexport function useRiScs() {\n const context = useContext(RiScContext);\n if (context === undefined) {\n throw new Error('useRiScs must be used within a RiScProvider');\n }\n return context;\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"RiScContext.esm.js","sources":["../../src/contexts/RiScContext.tsx"],"sourcesContent":["import {\n createContext,\n ReactNode,\n useCallback,\n useContext,\n useEffect,\n useReducer,\n useRef,\n useState,\n} from 'react';\nimport {\n ContentStatus,\n LockedRiSc,\n ProcessingStatus,\n RiScStatus,\n RiScWithMetadata,\n SubmitResponseObject,\n SystemRiSc,\n UnavailableRiSc,\n} from '../utils/types';\nimport { useRouteRef } from '@backstage/core-plugin-api';\nimport {\n entityRouteParams,\n entityRouteRef,\n} from '@backstage/plugin-catalog-react';\nimport {\n getTranslationKey,\n requiresNewApproval,\n} from '../utils/utilityfunctions';\nimport { riScRouteRef } from '../routes';\nimport { useLocation, useNavigate, useParams } from 'react-router';\nimport {\n dtoToRiSc,\n GcpCryptoKeyObject,\n ProcessRiScResultDTO,\n RiScDTO,\n} from '../utils/DTOs';\nimport {\n mapRiScDtoToRiScWithMetadata,\n withLoginRejected,\n} from '../utils/fetchRiScHelpers';\nimport {\n useAuthenticatedFetch,\n useGithubRepositoryInformation,\n useSystemRiScsForCurrentEntity,\n} from '../utils/hooks';\nimport { latestSupportedVersion } from '../utils/constants';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { pluginRiScTranslationRef } from '../utils/translations';\n\nexport type UpdateStatus = {\n isLoading: boolean;\n isError: boolean;\n isSuccess: boolean;\n};\n\ntype RiScDrawerProps = {\n riScs: RiScWithMetadata[] | null;\n lockedRiScs: LockedRiSc[];\n unavailableRiScs: UnavailableRiSc[];\n systemRiScs: SystemRiSc[];\n selectRiSc: (id: string) => void;\n selectedRiSc: RiScWithMetadata | null;\n selectedLockedRiSc: LockedRiSc | null;\n selectedSystemRiSc: SystemRiSc | null;\n createNewRiSc: (\n riSc: RiScWithMetadata,\n generateInitialRisc: boolean,\n defaultRiScId: string | undefined,\n ) => void;\n deleteRiSc: (onSuccess?: () => void, onError?: () => void) => void;\n updateRiSc: (\n riSc: RiScWithMetadata,\n onSuccess?: () => void,\n onError?: () => void,\n ) => void;\n showBlockedUpdateError: () => void;\n approveRiSc: () => void;\n updateStatus: UpdateStatus;\n resetRiScStatus: () => void;\n resetResponse: () => void;\n isFetching: boolean;\n isFetchingGcpCryptoKeys: boolean;\n failedToFetchGcpCryptoKeys: boolean;\n allRiScsFailedDecryption: boolean;\n gcpCryptoKeys: GcpCryptoKeyObject[];\n response: SubmitResponseObject | null;\n};\n\nconst RiScContext = createContext<RiScDrawerProps | undefined>(undefined);\n\nexport function RiScProvider({ children }: { children: ReactNode }) {\n const { riScId: riScIdFromParams } = useParams();\n const location = useLocation();\n const navigate = useNavigate();\n const getRiScPath = useRouteRef(riScRouteRef);\n const getEntityPath = useRouteRef(entityRouteRef);\n const [isRequesting, setIsRequesting] = useState<boolean>(false);\n const { t } = useTranslationRef(pluginRiScTranslationRef);\n const repoInfo = useGithubRepositoryInformation();\n const { riScs: systemRiScs } = useSystemRiScsForCurrentEntity();\n\n const {\n fetchRiScs,\n fetchGcpCryptoKeys,\n postRiScs,\n deleteRiScs,\n putRiScs,\n publishRiScs,\n } = useAuthenticatedFetch();\n\n const [riScs, setRiScs] = useState<RiScWithMetadata[] | null>(null);\n const [lockedRiScs, setLockedRiScs] = useState<LockedRiSc[]>([]);\n const [unavailableRiScs, setUnavailableRiScs] = useState<UnavailableRiSc[]>(\n [],\n );\n const [selectedRiSc, setSelectedRiSc] = useState<RiScWithMetadata | null>(\n null,\n );\n const [selectedLockedRiSc, setSelectedLockedRiSc] =\n useState<LockedRiSc | null>(null);\n const [selectedSystemRiSc, setSelectedSystemRiSc] =\n useState<SystemRiSc | null>(null);\n const [isFetching, setIsFetching] = useState(true);\n const isFetchingRef = useRef(isFetching);\n const [isFetchingRiScs, setIsFetchingRiScs] = useState(true);\n const isFetchingRiScsRef = useRef(isFetchingRiScs);\n const [isFetchingGcpCryptoKeys, setIsFetchingGcpCryptoKeys] = useState(true);\n const isFetchingGcpCryptoKeysRef = useRef(isFetchingGcpCryptoKeys);\n const gcpCryptoKeysFailed = useRef(false);\n const [failedToFetchGcpCryptoKeys, setFailedToFetchGcpCryptoKeys] =\n useState(false);\n\n type LocalState = {\n updateStatus: UpdateStatus;\n response: SubmitResponseObject | null;\n };\n\n type Action =\n | { type: 'SET_STATUS'; updateStatus: UpdateStatus }\n | { type: 'SET_RESPONSE'; response: SubmitResponseObject | null }\n | {\n type: 'SET_BOTH';\n updateStatus: UpdateStatus;\n response: SubmitResponseObject | null;\n };\n\n const initialLocalState: LocalState = {\n updateStatus: { isLoading: false, isError: false, isSuccess: false },\n response: null,\n };\n\n function reducer(state: LocalState, action: Action): LocalState {\n switch (action.type) {\n case 'SET_STATUS':\n return { ...state, updateStatus: action.updateStatus };\n case 'SET_RESPONSE':\n return { ...state, response: action.response };\n case 'SET_BOTH':\n return { updateStatus: action.updateStatus, response: action.response };\n default:\n return state;\n }\n }\n\n const [localState, dispatch] = useReducer(reducer, initialLocalState);\n\n const [gcpCryptoKeys, setGcpCryptoKeys] = useState<GcpCryptoKeyObject[]>([]);\n\n const [allRiScsFailedDecryption, setAllRiScsFailedDecryption] =\n useState(false);\n\n // Auto-clear response after a short duration to avoid the Alert sticking around\n const responseTimerRef = useRef<number | null>(null);\n useEffect(() => {\n if (localState.response) {\n if (responseTimerRef.current) {\n window.clearTimeout(responseTimerRef.current);\n }\n responseTimerRef.current = window.setTimeout(() => {\n dispatch({ type: 'SET_RESPONSE', response: null });\n responseTimerRef.current = null;\n }, 10000);\n }\n\n return () => {\n if (responseTimerRef.current) {\n window.clearTimeout(responseTimerRef.current);\n responseTimerRef.current = null;\n }\n };\n }, [localState.response]);\n\n useEffect(() => {\n if (location.state) {\n dispatch({\n type: 'SET_RESPONSE',\n response: {\n statusMessage: location.state,\n status: ProcessingStatus.ErrorWhenFetchingRiScs,\n },\n });\n }\n }, [location, dispatch]);\n\n // Initial fetch of GCP crypto keys\n useEffect(() => {\n gcpCryptoKeysFailed.current = false;\n setFailedToFetchGcpCryptoKeys(false);\n dispatch({ type: 'SET_RESPONSE', response: null });\n fetchGcpCryptoKeys(\n res => {\n // Sorts the crypto keys by the number of permissions (descending)\n setGcpCryptoKeys(\n res.sort(\n (a, b) =>\n (b.userPermissions?.length ?? 0) -\n (a.userPermissions?.length ?? 0),\n ),\n );\n isFetchingGcpCryptoKeysRef.current = false;\n setIsFetchingGcpCryptoKeys(isFetchingGcpCryptoKeysRef.current);\n if (!isFetchingRiScsRef.current) {\n isFetchingRef.current = false;\n setIsFetching(isFetchingRef.current);\n }\n },\n (_error, loginRejected) => {\n gcpCryptoKeysFailed.current = true;\n setFailedToFetchGcpCryptoKeys(true);\n dispatch({\n type: 'SET_RESPONSE',\n response: {\n status: ProcessingStatus.ErrorWhenFetchingGcpCryptoKeys,\n statusMessage: withLoginRejected(\n t('errorMessages.ErrorWhenFetchingGcpCryptoKeys'),\n loginRejected,\n t,\n ),\n },\n });\n isFetchingGcpCryptoKeysRef.current = false;\n setIsFetchingGcpCryptoKeys(isFetchingGcpCryptoKeysRef.current);\n if (!isFetchingRiScsRef.current) {\n isFetchingRef.current = false;\n setIsFetching(isFetchingRef.current);\n }\n },\n );\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // Initial fetch of RiScs\n useEffect(() => {\n dispatch({ type: 'SET_RESPONSE', response: null });\n fetchRiScs(\n res => {\n const successfulRiScs = res.filter(\n risk => risk.status === ContentStatus.Success,\n );\n const decryptionFailedRiScs = res.filter(\n risk => risk.status === ContentStatus.DecryptionFailed,\n );\n\n const failedRiScs = res.filter(\n risk =>\n risk.status !== ContentStatus.Success &&\n risk.status !== ContentStatus.DecryptionFailed,\n );\n\n // Check if all RiScs failed decryption (there are RiScs but all failed)\n const allFailed =\n res.length > 0 &&\n res.every(r => r.status === ContentStatus.DecryptionFailed);\n setAllRiScsFailedDecryption(allFailed);\n\n const fetchedRiScs: RiScWithMetadata[] = successfulRiScs.map(\n mapRiScDtoToRiScWithMetadata,\n );\n const fetchedLockedRiScs: LockedRiSc[] = decryptionFailedRiScs.map(\n risk => ({\n id: risk.riScId,\n encryptionKeyId: risk.encryptionKeyId ?? null,\n }),\n );\n\n const fetchedUnavailableRiScs: UnavailableRiSc[] = failedRiScs.map(\n risk => ({\n id: risk.riScId,\n status: risk.status,\n errorCode: risk.errorCode,\n }),\n );\n\n setRiScs(fetchedRiScs);\n setLockedRiScs(fetchedLockedRiScs);\n setUnavailableRiScs(fetchedUnavailableRiScs);\n isFetchingRiScsRef.current = false;\n setIsFetchingRiScs(isFetchingRiScsRef.current);\n if (!isFetchingGcpCryptoKeysRef.current) {\n isFetchingRef.current = false;\n setIsFetching(isFetchingRef.current);\n }\n\n if (!riScIdFromParams) {\n // If there is no RiSc ID in the URL\n\n if (fetchedRiScs.length > 0) {\n navigate(getRiScPath({ riScId: fetchedRiScs[0].id }));\n } else if (fetchedLockedRiScs.length > 0) {\n navigate(getRiScPath({ riScId: fetchedLockedRiScs[0].id }));\n }\n\n // If there are system-RiScs the user will see a message that they need to choose since changing component automatically is not good UX.\n return;\n }\n\n const riSc = fetchedRiScs.find(r => r.id === riScIdFromParams);\n const isLockedRiSc = fetchedLockedRiScs.some(\n r => r.id === riScIdFromParams,\n );\n\n // If there is an invalid RiSc ID in the URL (not accessible and not locked), navigate to the first RiSc\n if (fetchedRiScs.length > 0 && !riSc && !isLockedRiSc) {\n navigate(getRiScPath({ riScId: fetchedRiScs[0].id }), {\n state: t('errorMessages.RiScDoesNotExist'),\n });\n }\n },\n loginRejected => {\n if (!gcpCryptoKeysFailed.current) {\n dispatch({\n type: 'SET_RESPONSE',\n response: {\n status: ProcessingStatus.ErrorWhenFetchingRiScs,\n statusMessage: withLoginRejected(\n t('errorMessages.ErrorWhenFetchingRiScs'),\n loginRejected,\n t,\n ),\n },\n });\n }\n isFetchingRiScsRef.current = false;\n setIsFetchingRiScs(isFetchingRiScsRef.current);\n if (!isFetchingGcpCryptoKeysRef.current) {\n isFetchingRef.current = false;\n setIsFetching(isFetchingRef.current);\n }\n },\n );\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // Set selected RiSc, system RiSc or locked RiSc based on URL\n useEffect(() => {\n if (!riScIdFromParams) return;\n const riSc = riScs?.find(r => r.id === riScIdFromParams);\n const lockedRiSc = lockedRiScs.find(r => r.id === riScIdFromParams);\n const systemRiSc = systemRiScs.find(r => r.riScId === riScIdFromParams);\n if (riSc) {\n setSelectedRiSc(riSc);\n setSelectedLockedRiSc(null);\n setSelectedSystemRiSc(null);\n } else if (lockedRiSc) {\n setSelectedLockedRiSc(lockedRiSc);\n setSelectedRiSc(null);\n setSelectedSystemRiSc(null);\n } else if (systemRiSc) {\n setSelectedSystemRiSc(systemRiSc);\n setSelectedRiSc(null);\n setSelectedLockedRiSc(null);\n }\n }, [riScs, systemRiScs, lockedRiScs, riScIdFromParams]);\n\n const resetRiScStatus = useCallback(() => {\n dispatch({\n type: 'SET_STATUS',\n updateStatus: { isLoading: false, isSuccess: false, isError: false },\n });\n }, [dispatch]);\n\n // use callback to avoid infinite loop\n const resetResponse = useCallback(() => {\n dispatch({ type: 'SET_RESPONSE', response: null });\n }, [dispatch]);\n\n const getTranslationContext = useCallback(\n (status: ProcessingStatus) => {\n return status === ProcessingStatus.ErrorWhenNoWriteAccessToRepository\n ? { owner: repoInfo.owner, name: repoInfo.name }\n : undefined;\n },\n [repoInfo.owner, repoInfo.name],\n );\n\n function getSystemRiScPath(systemRiSc: SystemRiSc): string {\n const routeEntityRef = systemRiSc.appliesTo[0];\n\n if (!routeEntityRef) {\n throw new Error(\n `System RiSc \"${systemRiSc.riScId}\" has no appliesTo entries`,\n );\n }\n\n const entityPath = getEntityPath(entityRouteParams(routeEntityRef));\n return `${entityPath}/risc/${encodeURIComponent(systemRiSc.riScId)}`;\n }\n\n function selectRiSc(id: string) {\n const systemRiSc = systemRiScs.find(riSc => riSc.riScId === id);\n\n if (systemRiSc) {\n navigate(getSystemRiScPath(systemRiSc));\n return;\n }\n\n navigate(getRiScPath({ riScId: id }));\n }\n\n function createNewRiSc(\n riSc: RiScWithMetadata,\n generateInitialRisc: boolean,\n defaultRiScId: string | undefined,\n ) {\n setIsFetching(true);\n setSelectedRiSc(null);\n setSelectedSystemRiSc(null);\n dispatch({\n type: 'SET_BOTH',\n updateStatus: { isLoading: true, isError: false, isSuccess: false },\n response: null,\n });\n const newRiSc: RiScWithMetadata = {\n ...riSc,\n schemaVersion: latestSupportedVersion,\n };\n postRiScs(\n newRiSc.content,\n generateInitialRisc,\n newRiSc.sopsConfig,\n defaultRiScId,\n res => {\n if (!res.riScId) throw new Error('No RiSc ID returned');\n if (!res.riScContent) throw new Error('No RiSc content returned');\n const json = JSON.parse(res.riScContent) as RiScDTO;\n const content = dtoToRiSc(json);\n const riScWithMetaData: RiScWithMetadata = {\n id: res.riScId,\n status: RiScStatus.Draft,\n content: content,\n sopsConfig: riSc.sopsConfig,\n schemaVersion: riSc.schemaVersion,\n lastPublished: riSc.lastPublished,\n };\n setRiScs(riScs ? [...riScs, riScWithMetaData] : [riScWithMetaData]);\n setIsFetching(false);\n navigate(getRiScPath({ riScId: res.riScId }));\n dispatch({\n type: 'SET_BOTH',\n updateStatus: { isLoading: false, isError: false, isSuccess: true },\n response: {\n ...res,\n statusMessage: getTranslationKey('info', res.status, t),\n },\n });\n },\n (error: ProcessRiScResultDTO, loginRejected: boolean) => {\n setSelectedRiSc(selectedRiSc);\n setIsFetching(false);\n\n const translationContext = getTranslationContext(error.status);\n\n dispatch({\n type: 'SET_BOTH',\n updateStatus: { isLoading: false, isError: true, isSuccess: false },\n response: {\n ...error,\n statusMessage: withLoginRejected(\n getTranslationKey('error', error.status, t, translationContext),\n loginRejected,\n t,\n ),\n },\n });\n },\n );\n }\n\n function deleteRiSc(onSuccess?: () => void, onError?: () => void) {\n if (selectedRiSc && riScs) {\n const updatedRiSc = {\n ...selectedRiSc,\n status: RiScStatus.DeletionDraft,\n };\n const originalRiSc = selectedRiSc;\n\n dispatch({\n type: 'SET_BOTH',\n updateStatus: { isLoading: true, isError: false, isSuccess: false },\n response: null,\n });\n deleteRiScs(\n selectedRiSc.id,\n res => {\n dispatch({\n type: 'SET_BOTH',\n updateStatus: { isLoading: false, isError: false, isSuccess: true },\n response: {\n ...res,\n statusMessage: getTranslationKey('info', res.status, t),\n },\n });\n setIsRequesting(false);\n if (res.status === ProcessingStatus.DeletedRiSc) {\n setSelectedRiSc(\n riScs.find(riSc => riSc.id !== selectedRiSc.id) || null,\n );\n setRiScs(riScs.filter(riSc => riSc.id !== updatedRiSc.id));\n if (onSuccess) onSuccess();\n } else {\n setSelectedRiSc(updatedRiSc);\n setRiScs(\n riScs.map(riSc =>\n riSc.id === selectedRiSc.id ? updatedRiSc : riSc,\n ),\n );\n }\n },\n (error, loginRejected) => {\n setSelectedRiSc(originalRiSc);\n\n const translationContext = getTranslationContext(error.status);\n\n dispatch({\n type: 'SET_BOTH',\n updateStatus: { isLoading: false, isError: true, isSuccess: false },\n response: {\n ...error,\n statusMessage: withLoginRejected(\n getTranslationKey('error', error.status, t, translationContext),\n loginRejected,\n t,\n ),\n },\n });\n setIsRequesting(false);\n if (onError) onError();\n },\n );\n }\n }\n\n const isRiScMarkedForDeletion =\n selectedRiSc?.status === RiScStatus.DeletionDraft ||\n selectedRiSc?.status === RiScStatus.DeletionSentForApproval;\n\n const showBlockedUpdateError = useCallback(() => {\n dispatch({\n type: 'SET_BOTH',\n updateStatus: { isLoading: false, isError: true, isSuccess: false },\n response: {\n status: ProcessingStatus.ErrorWhenUpdatingDeletedRiSc,\n statusMessage: t('errorMessages.ErrorWhenUpdatingDeletedRiSc'),\n },\n });\n }, [dispatch, t]);\n\n function updateRiSc(\n riSc: RiScWithMetadata,\n onSuccess?: () => void,\n onError?: () => void,\n ) {\n if (isRiScMarkedForDeletion) {\n showBlockedUpdateError();\n onError?.();\n return;\n }\n\n if (selectedRiSc && riScs) {\n const isRequiresNewApproval =\n selectedRiSc.migrationStatus?.migrationRequiresNewApproval ||\n requiresNewApproval(selectedRiSc.content, riSc.content);\n\n const updatedRiSc: RiScWithMetadata = {\n ...selectedRiSc,\n sopsConfig: riSc.sopsConfig,\n content: riSc.content,\n status:\n selectedRiSc.status !== RiScStatus.Draft && isRequiresNewApproval\n ? RiScStatus.Draft\n : selectedRiSc.status,\n isRequiresNewApproval: isRequiresNewApproval,\n schemaVersion: riSc.schemaVersion,\n migrationStatus: {\n migrationChanges: false,\n migrationRequiresNewApproval: false,\n },\n };\n const originalRiSc = selectedRiSc;\n setSelectedRiSc(updatedRiSc);\n dispatch({\n type: 'SET_BOTH',\n updateStatus: { isLoading: true, isError: false, isSuccess: false },\n response: null,\n });\n putRiScs(\n updatedRiSc,\n res => {\n dispatch({\n type: 'SET_BOTH',\n updateStatus: { isLoading: false, isError: false, isSuccess: true },\n response: {\n ...res,\n statusMessage: getTranslationKey('info', res.status, t),\n },\n });\n if ('pendingApproval' in res && res.pendingApproval?.pullRequestUrl) {\n updatedRiSc.pullRequestUrl = res.pendingApproval.pullRequestUrl;\n updatedRiSc.status = RiScStatus.SentForApproval;\n }\n setSelectedRiSc(updatedRiSc);\n setRiScs(\n riScs.map(r => (r.id === selectedRiSc.id ? updatedRiSc : r)),\n );\n setIsRequesting(false);\n if (onSuccess) onSuccess();\n },\n (error, loginRejected) => {\n const translationContext = getTranslationContext(error.status);\n\n dispatch({\n type: 'SET_BOTH',\n updateStatus: { isLoading: false, isError: true, isSuccess: false },\n response: {\n ...error,\n statusMessage: withLoginRejected(\n getTranslationKey('error', error.status, t, translationContext),\n loginRejected,\n t,\n ),\n },\n });\n setIsRequesting(false);\n if (onError) onError();\n setSelectedRiSc(originalRiSc);\n },\n );\n }\n }\n\n function approveRiSc() {\n if (selectedRiSc && riScs) {\n dispatch({\n type: 'SET_STATUS',\n updateStatus: { isLoading: true, isError: false, isSuccess: false },\n });\n publishRiScs(\n selectedRiSc.id,\n res => {\n const prUrl = res.pendingApproval?.pullRequestUrl;\n const updatedRiSc = {\n ...selectedRiSc,\n status:\n selectedRiSc.status === RiScStatus.Draft\n ? RiScStatus.SentForApproval\n : RiScStatus.DeletionSentForApproval,\n pullRequestUrl: prUrl,\n };\n setSelectedRiSc(updatedRiSc);\n setRiScs(\n riScs.map(r => (r.id === selectedRiSc.id ? updatedRiSc : r)),\n );\n dispatch({\n type: 'SET_BOTH',\n updateStatus: { isLoading: false, isError: false, isSuccess: true },\n response: {\n ...res,\n statusMessage: getTranslationKey('info', res.status, t),\n },\n });\n },\n (error, loginRejected) => {\n const translationContext = getTranslationContext(error.status);\n\n dispatch({\n type: 'SET_BOTH',\n updateStatus: { isLoading: false, isError: true, isSuccess: false },\n response: {\n ...error,\n statusMessage: withLoginRejected(\n getTranslationKey('error', error.status, t, translationContext),\n loginRejected,\n t,\n ),\n },\n });\n },\n );\n }\n }\n\n const value = {\n riScs,\n lockedRiScs,\n unavailableRiScs,\n systemRiScs,\n selectRiSc,\n selectedRiSc,\n selectedLockedRiSc,\n selectedSystemRiSc,\n createNewRiSc,\n deleteRiSc,\n updateRiSc,\n showBlockedUpdateError,\n approveRiSc,\n updateStatus: localState.updateStatus,\n resetRiScStatus,\n resetResponse,\n isRequesting,\n isFetching,\n response: localState.response,\n gcpCryptoKeys,\n };\n\n return (\n <RiScContext.Provider\n value={{\n ...value,\n isFetchingGcpCryptoKeys: false,\n failedToFetchGcpCryptoKeys,\n allRiScsFailedDecryption,\n }}\n >\n {children}\n </RiScContext.Provider>\n );\n}\n\nexport function useRiScs() {\n const context = useContext(RiScContext);\n if (context === undefined) {\n throw new Error('useRiScs must be used within a RiScProvider');\n }\n return context;\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -17,74 +17,24 @@ function mapRiScDtoToRiScWithMetadata(dto) {
|
|
|
17
17
|
function withLoginRejected(baseMessage, loginRejected, t) {
|
|
18
18
|
return loginRejected ? `${baseMessage}. ${t("dictionary.rejectedLogin")}` : baseMessage;
|
|
19
19
|
}
|
|
20
|
-
function
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
return
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
);
|
|
38
|
-
const withErrorCode = decryptionRisks.filter((risk) => risk.errorCode);
|
|
39
|
-
const withoutErrorCode = decryptionRisks.filter(
|
|
40
|
-
(risk) => !risk.errorCode
|
|
41
|
-
);
|
|
42
|
-
const messages = [];
|
|
43
|
-
if (withErrorCode.length > 0) {
|
|
44
|
-
const groups = withErrorCode.reduce(
|
|
45
|
-
(acc, risk) => {
|
|
46
|
-
const groupKey = `${risk.errorCode}__${risk.encryptionKeyId ?? ""}`;
|
|
47
|
-
if (!acc[groupKey]) acc[groupKey] = [];
|
|
48
|
-
acc[groupKey].push(risk);
|
|
49
|
-
return acc;
|
|
50
|
-
},
|
|
51
|
-
{}
|
|
52
|
-
);
|
|
53
|
-
Object.values(groups).forEach((group) => {
|
|
54
|
-
const { errorCode, encryptionKeyId } = group[0];
|
|
55
|
-
const groupRiScIds = group.map((r) => r.riScId).join(", ");
|
|
56
|
-
if (encryptionKeyId) {
|
|
57
|
-
const keyId = encryptionKeyId.split("/").pop() ?? encryptionKeyId;
|
|
58
|
-
const errorKey2 = group.length === 1 ? "errorMessages.ContentStatusDecryptionFailedMessage.WITH_KEY_SINGLE" : "errorMessages.ContentStatusDecryptionFailedMessage.WITH_KEY_PLURAL";
|
|
59
|
-
messages.push(
|
|
60
|
-
t(errorKey2, { riScId: groupRiScIds, keyId })
|
|
61
|
-
);
|
|
62
|
-
} else {
|
|
63
|
-
const errorKey2 = `errorMessages.ContentStatusDecryptionFailedMessage.${errorCode}`;
|
|
64
|
-
messages.push(
|
|
65
|
-
t(errorKey2, { riScId: groupRiScIds, status })
|
|
66
|
-
);
|
|
67
|
-
}
|
|
68
|
-
});
|
|
69
|
-
}
|
|
70
|
-
if (withoutErrorCode.length > 0) {
|
|
71
|
-
const errorKey2 = `errorMessages.ContentStatus${statusKey}`;
|
|
72
|
-
messages.push(
|
|
73
|
-
t(errorKey2, {
|
|
74
|
-
riScId: withoutErrorCode.map((r) => r.riScId).join(", "),
|
|
75
|
-
status
|
|
76
|
-
})
|
|
77
|
-
);
|
|
78
|
-
}
|
|
79
|
-
return messages.join("\n");
|
|
80
|
-
}
|
|
81
|
-
const errorKey = `errorMessages.ContentStatus${statusKey}`;
|
|
82
|
-
return t(errorKey, {
|
|
83
|
-
riScId: riScIds.join(", "),
|
|
84
|
-
status
|
|
85
|
-
});
|
|
86
|
-
}).join("\n");
|
|
20
|
+
function getUnavailableRiScReasonKey(status) {
|
|
21
|
+
switch (status) {
|
|
22
|
+
case ContentStatus.FileNotFound:
|
|
23
|
+
return "contentHeader.unavailableReasonFileNotFound";
|
|
24
|
+
case ContentStatus.NoReadAccess:
|
|
25
|
+
return "contentHeader.unavailableReasonNoReadAccess";
|
|
26
|
+
case ContentStatus.SchemaValidationFailed:
|
|
27
|
+
return "contentHeader.unavailableReasonSchemaValidationFailed";
|
|
28
|
+
case ContentStatus.Failure:
|
|
29
|
+
return "contentHeader.unavailableReasonFailure";
|
|
30
|
+
case ContentStatus.Deleted:
|
|
31
|
+
return "contentHeader.unavailableReasonDeleted";
|
|
32
|
+
case ContentStatus.UnsupportedMigration:
|
|
33
|
+
return "contentHeader.unavailableReasonUnsupportedMigration";
|
|
34
|
+
default:
|
|
35
|
+
return "contentHeader.unavailableReasonUnknown";
|
|
36
|
+
}
|
|
87
37
|
}
|
|
88
38
|
|
|
89
|
-
export {
|
|
39
|
+
export { getUnavailableRiScReasonKey, mapRiScDtoToRiScWithMetadata, withLoginRejected };
|
|
90
40
|
//# sourceMappingURL=fetchRiScHelpers.esm.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fetchRiScHelpers.esm.js","sources":["../../src/utils/fetchRiScHelpers.ts"],"sourcesContent":["import { dtoToRiSc, RiScContentResultDTO, RiScDTO } from './DTOs';\nimport { ContentStatus, RiScWithMetadata } from './types';\n\n/**\n * Maps a RiScContentResultDTO to a RiScWithMetadata object.\n * Used when converting the raw API response to the internal representation.\n */\nexport function mapRiScDtoToRiScWithMetadata(\n dto: RiScContentResultDTO,\n): RiScWithMetadata {\n const json = JSON.parse(dto.riScContent) as RiScDTO;\n const content = dtoToRiSc(json);\n return {\n id: dto.riScId,\n content,\n sopsConfig: dto.sopsConfig,\n status: dto.riScStatus,\n pullRequestUrl: dto.pullRequestUrl,\n migrationStatus: dto.migrationStatus,\n lastPublished: dto.lastPublished,\n };\n}\n\n/**\n * Appends a \"login rejected\" suffix to a status message when the request was\n * rejected due to login issues. This is a recurring pattern used across all\n * error callbacks from the authenticated fetch hooks.\n */\nexport function withLoginRejected(\n baseMessage: string,\n loginRejected: boolean,\n t: (key: any, options?: any) => string,\n): string {\n return loginRejected\n ? `${baseMessage}. ${t('dictionary.rejectedLogin')}`\n : baseMessage;\n}\n\
|
|
1
|
+
{"version":3,"file":"fetchRiScHelpers.esm.js","sources":["../../src/utils/fetchRiScHelpers.ts"],"sourcesContent":["import { dtoToRiSc, RiScContentResultDTO, RiScDTO } from './DTOs';\nimport { ContentStatus, RiScWithMetadata } from './types';\nimport { pluginRiScMessages } from './translations.ts';\n\n/**\n * Maps a RiScContentResultDTO to a RiScWithMetadata object.\n * Used when converting the raw API response to the internal representation.\n */\nexport function mapRiScDtoToRiScWithMetadata(\n dto: RiScContentResultDTO,\n): RiScWithMetadata {\n const json = JSON.parse(dto.riScContent) as RiScDTO;\n const content = dtoToRiSc(json);\n return {\n id: dto.riScId,\n content,\n sopsConfig: dto.sopsConfig,\n status: dto.riScStatus,\n pullRequestUrl: dto.pullRequestUrl,\n migrationStatus: dto.migrationStatus,\n lastPublished: dto.lastPublished,\n };\n}\n\n/**\n * Appends a \"login rejected\" suffix to a status message when the request was\n * rejected due to login issues. This is a recurring pattern used across all\n * error callbacks from the authenticated fetch hooks.\n */\nexport function withLoginRejected(\n baseMessage: string,\n loginRejected: boolean,\n t: (key: any, options?: any) => string,\n): string {\n return loginRejected\n ? `${baseMessage}. ${t('dictionary.rejectedLogin')}`\n : baseMessage;\n}\n\ntype Paths<T> = {\n [K in Extract<keyof T, string>]: T[K] extends Record<string, any>\n ? `${K}.${Paths<T[K]>}`\n : K;\n}[Extract<keyof T, string>];\n\n/**\n * Maps a ContentStatus to a type-safe contentHeader translation key\n * for displaying a short reason in the RiSc selection dropdown.\n * Falls back to a generic unavailable key for statuses not explicitly mapped.\n */\nexport function getUnavailableRiScReasonKey(\n status: ContentStatus,\n): Paths<Pick<typeof pluginRiScMessages, 'contentHeader'>> {\n switch (status) {\n case ContentStatus.FileNotFound:\n return 'contentHeader.unavailableReasonFileNotFound';\n case ContentStatus.NoReadAccess:\n return 'contentHeader.unavailableReasonNoReadAccess';\n case ContentStatus.SchemaValidationFailed:\n return 'contentHeader.unavailableReasonSchemaValidationFailed';\n case ContentStatus.Failure:\n return 'contentHeader.unavailableReasonFailure';\n case ContentStatus.Deleted:\n return 'contentHeader.unavailableReasonDeleted';\n case ContentStatus.UnsupportedMigration:\n return 'contentHeader.unavailableReasonUnsupportedMigration';\n default:\n return 'contentHeader.unavailableReasonUnknown';\n }\n}\n"],"names":[],"mappings":";;;AAQO,SAAS,6BACd,GAAA,EACkB;AAClB,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,WAAW,CAAA;AACvC,EAAA,MAAM,OAAA,GAAU,UAAU,IAAI,CAAA;AAC9B,EAAA,OAAO;AAAA,IACL,IAAI,GAAA,CAAI,MAAA;AAAA,IACR,OAAA;AAAA,IACA,YAAY,GAAA,CAAI,UAAA;AAAA,IAChB,QAAQ,GAAA,CAAI,UAAA;AAAA,IACZ,gBAAgB,GAAA,CAAI,cAAA;AAAA,IACpB,iBAAiB,GAAA,CAAI,eAAA;AAAA,IACrB,eAAe,GAAA,CAAI;AAAA,GACrB;AACF;AAOO,SAAS,iBAAA,CACd,WAAA,EACA,aAAA,EACA,CAAA,EACQ;AACR,EAAA,OAAO,gBACH,CAAA,EAAG,WAAW,KAAK,CAAA,CAAE,0BAA0B,CAAC,CAAA,CAAA,GAChD,WAAA;AACN;AAaO,SAAS,4BACd,MAAA,EACyD;AACzD,EAAA,QAAQ,MAAA;AAAQ,IACd,KAAK,aAAA,CAAc,YAAA;AACjB,MAAA,OAAO,6CAAA;AAAA,IACT,KAAK,aAAA,CAAc,YAAA;AACjB,MAAA,OAAO,6CAAA;AAAA,IACT,KAAK,aAAA,CAAc,sBAAA;AACjB,MAAA,OAAO,uDAAA;AAAA,IACT,KAAK,aAAA,CAAc,OAAA;AACjB,MAAA,OAAO,wCAAA;AAAA,IACT,KAAK,aAAA,CAAc,OAAA;AACjB,MAAA,OAAO,wCAAA;AAAA,IACT,KAAK,aAAA,CAAc,oBAAA;AACjB,MAAA,OAAO,qDAAA;AAAA,IACT;AACE,MAAA,OAAO,wCAAA;AAAA;AAEb;;;;"}
|
|
@@ -10,7 +10,15 @@ const pluginRiScMessages = {
|
|
|
10
10
|
multipleRiScs: "RiSc scorecards",
|
|
11
11
|
chooseRiSc: "Choose RiSc scorecard",
|
|
12
12
|
systemRiScsSection: "System RiScs",
|
|
13
|
-
lockedRiScsSection: "RiScs you do not have access to \u2014 click for encryption key information"
|
|
13
|
+
lockedRiScsSection: "RiScs you do not have access to \u2014 click for encryption key information",
|
|
14
|
+
unavailableRiScsSection: "RiScs that could not be loaded",
|
|
15
|
+
unavailableReasonFileNotFound: "File not found",
|
|
16
|
+
unavailableReasonNoReadAccess: "No read access",
|
|
17
|
+
unavailableReasonSchemaValidationFailed: "Invalid format",
|
|
18
|
+
unavailableReasonFailure: "Unknown error",
|
|
19
|
+
unavailableReasonDeleted: "Deleted",
|
|
20
|
+
unavailableReasonUnsupportedMigration: "Cannot migrate",
|
|
21
|
+
unavailableReasonUnknown: "Unavailable"
|
|
14
22
|
},
|
|
15
23
|
dictionary: {
|
|
16
24
|
by: "By",
|
|
@@ -752,6 +760,14 @@ const pluginRiScNorwegianTranslation = createTranslationResource({
|
|
|
752
760
|
"contentHeader.chooseRiSc": "Velg RoS-analyse",
|
|
753
761
|
"contentHeader.systemRiScsSection": "System-RoSer",
|
|
754
762
|
"contentHeader.lockedRiScsSection": "RoSer du ikke har tilgang til \u2014 klikk for informasjon om krypteringsn\xF8kkel",
|
|
763
|
+
"contentHeader.unavailableRiScsSection": "RoSer som ikke kunne lastes",
|
|
764
|
+
"contentHeader.unavailableReasonFileNotFound": "Filen ble ikke funnet",
|
|
765
|
+
"contentHeader.unavailableReasonNoReadAccess": "Ingen lesetilgang",
|
|
766
|
+
"contentHeader.unavailableReasonSchemaValidationFailed": "Ugyldig format",
|
|
767
|
+
"contentHeader.unavailableReasonFailure": "Ukjent feil",
|
|
768
|
+
"contentHeader.unavailableReasonDeleted": "Slettet",
|
|
769
|
+
"contentHeader.unavailableReasonUnsupportedMigration": "Kan ikke migreres",
|
|
770
|
+
"contentHeader.unavailableReasonUnknown": "Utilgjengelig",
|
|
755
771
|
"riscIndex.title": "Analyser som refererer til denne komponenten",
|
|
756
772
|
"riscIndex.loading": "Henter refererende analyser",
|
|
757
773
|
"riscIndex.error": "Kunne ikke hente refererende analyser",
|