@kartverket/backstage-plugin-risk-scorecard 6.11.0 → 6.12.1

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.
@@ -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":";;;;;;;;;;;AAUO,SAAS,iBAAA,GAAoB;AAClC,EAAA,MAAM;AAAA,IACJ,KAAA;AAAA,IACA,WAAA;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,KACpC,WAAA,CAAY,MAAA,KAAW,CAAA,IACvB,WAAA,CAAY,MAAA,KAAW,CAAA;AAEzB,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;AAAA;AAAA;AAAA,KAEL,CAAA,EAEJ,CAAA;AAEJ;;;;"}
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":"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"}
@@ -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, buildFetchRiScErrorMessages } from '../utils/fetchRiScHelpers.esm.js';
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":";;;;;;;;;;;;;;;AAyFA,MAAM,WAAA,GAAc,cAA2C,MAAS,CAAA;AAEjE,SAAS,YAAA,CAAa,EAAE,QAAA,EAAS,EAA4B;AAClE,EAAA,MAAM,EAAE,MAAA,EAAQ,gBAAA,EAAiB,GAAI,SAAA,EAAU;AAC/C,EAAA,MAAM,WAAW,WAAA,EAAY;AAC7B,EAAA,MAAM,WAAW,WAAA,EAAY;AAC7B,EAAA,MAAM,WAAA,GAAc,YAAY,YAAY,CAAA;AAC5C,EAAA,MAAM,aAAA,GAAgB,YAAY,cAAc,CAAA;AAChD,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAI,SAAkB,KAAK,CAAA;AAC/D,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,iBAAA,CAAkB,wBAAwB,CAAA;AACxD,EAAA,MAAM,WAAW,8BAAA,EAA+B;AAChD,EAAA,MAAM,EAAE,KAAA,EAAO,WAAA,EAAY,GAAI,8BAAA,EAA+B;AAE9D,EAAA,MAAM;AAAA,IACJ,UAAA;AAAA,IACA,kBAAA;AAAA,IACA,SAAA;AAAA,IACA,WAAA;AAAA,IACA,QAAA;AAAA,IACA;AAAA,MACE,qBAAA,EAAsB;AAE1B,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAI,SAAoC,IAAI,CAAA;AAClE,EAAA,MAAM,CAAC,WAAA,EAAa,cAAc,CAAA,GAAI,QAAA,CAAuB,EAAE,CAAA;AAC/D,EAAA,MAAM,CAAC,gBAAA,EAAkB,mBAAmB,CAAA,GAAI,QAAA;AAAA,IAC9C;AAAC,GACH;AACA,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAI,QAAA;AAAA,IACtC;AAAA,GACF;AACA,EAAA,MAAM,CAAC,kBAAA,EAAoB,qBAAqB,CAAA,GAC9C,SAA4B,IAAI,CAAA;AAClC,EAAA,MAAM,CAAC,kBAAA,EAAoB,qBAAqB,CAAA,GAC9C,SAA4B,IAAI,CAAA;AAClC,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAI,SAAS,IAAI,CAAA;AACjD,EAAA,MAAM,aAAA,GAAgB,OAAO,UAAU,CAAA;AACvC,EAAA,MAAM,CAAC,eAAA,EAAiB,kBAAkB,CAAA,GAAI,SAAS,IAAI,CAAA;AAC3D,EAAA,MAAM,kBAAA,GAAqB,OAAO,eAAe,CAAA;AACjD,EAAA,MAAM,CAAC,uBAAA,EAAyB,0BAA0B,CAAA,GAAI,SAAS,IAAI,CAAA;AAC3E,EAAA,MAAM,0BAAA,GAA6B,OAAO,uBAAuB,CAAA;AACjE,EAAA,MAAM,mBAAA,GAAsB,OAAO,KAAK,CAAA;AACxC,EAAA,MAAM,CAAC,0BAAA,EAA4B,6BAA6B,CAAA,GAC9D,SAAS,KAAK,CAAA;AAgBhB,EAAA,MAAM,iBAAA,GAAgC;AAAA,IACpC,cAAc,EAAE,SAAA,EAAW,OAAO,OAAA,EAAS,KAAA,EAAO,WAAW,KAAA,EAAM;AAAA,IACnE,QAAA,EAAU;AAAA,GACZ;AAEA,EAAA,SAAS,OAAA,CAAQ,OAAmB,MAAA,EAA4B;AAC9D,IAAA,QAAQ,OAAO,IAAA;AAAM,MACnB,KAAK,YAAA;AACH,QAAA,OAAO,EAAE,GAAG,KAAA,EAAO,YAAA,EAAc,OAAO,YAAA,EAAa;AAAA,MACvD,KAAK,cAAA;AACH,QAAA,OAAO,EAAE,GAAG,KAAA,EAAO,QAAA,EAAU,OAAO,QAAA,EAAS;AAAA,MAC/C,KAAK,UAAA;AACH,QAAA,OAAO,EAAE,YAAA,EAAc,MAAA,CAAO,YAAA,EAAc,QAAA,EAAU,OAAO,QAAA,EAAS;AAAA,MACxE;AACE,QAAA,OAAO,KAAA;AAAA;AACX,EACF;AAEA,EAAA,MAAM,CAAC,UAAA,EAAY,QAAQ,CAAA,GAAI,UAAA,CAAW,SAAS,iBAAiB,CAAA;AAEpE,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAI,QAAA,CAA+B,EAAE,CAAA;AAE3E,EAAA,MAAM,CAAC,wBAAA,EAA0B,2BAA2B,CAAA,GAC1D,SAAS,KAAK,CAAA;AAGhB,EAAA,MAAM,gBAAA,GAAmB,OAAsB,IAAI,CAAA;AACnD,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,WAAW,QAAA,EAAU;AACvB,MAAA,IAAI,iBAAiB,OAAA,EAAS;AAC5B,QAAA,MAAA,CAAO,YAAA,CAAa,iBAAiB,OAAO,CAAA;AAAA,MAC9C;AACA,MAAA,gBAAA,CAAiB,OAAA,GAAU,MAAA,CAAO,UAAA,CAAW,MAAM;AACjD,QAAA,QAAA,CAAS,EAAE,IAAA,EAAM,cAAA,EAAgB,QAAA,EAAU,MAAM,CAAA;AACjD,QAAA,gBAAA,CAAiB,OAAA,GAAU,IAAA;AAAA,MAC7B,GAAG,GAAK,CAAA;AAAA,IACV;AAEA,IAAA,OAAO,MAAM;AACX,MAAA,IAAI,iBAAiB,OAAA,EAAS;AAC5B,QAAA,MAAA,CAAO,YAAA,CAAa,iBAAiB,OAAO,CAAA;AAC5C,QAAA,gBAAA,CAAiB,OAAA,GAAU,IAAA;AAAA,MAC7B;AAAA,IACF,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,UAAA,CAAW,QAAQ,CAAC,CAAA;AAExB,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,SAAS,KAAA,EAAO;AAClB,MAAA,QAAA,CAAS;AAAA,QACP,IAAA,EAAM,cAAA;AAAA,QACN,QAAA,EAAU;AAAA,UACR,eAAe,QAAA,CAAS,KAAA;AAAA,UACxB,QAAQ,gBAAA,CAAiB;AAAA;AAC3B,OACD,CAAA;AAAA,IACH;AAAA,EACF,CAAA,EAAG,CAAC,QAAA,EAAU,QAAQ,CAAC,CAAA;AAGvB,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,mBAAA,CAAoB,OAAA,GAAU,KAAA;AAC9B,IAAA,6BAAA,CAA8B,KAAK,CAAA;AACnC,IAAA,QAAA,CAAS,EAAE,IAAA,EAAM,cAAA,EAAgB,QAAA,EAAU,MAAM,CAAA;AACjD,IAAA,kBAAA;AAAA,MACE,CAAA,GAAA,KAAO;AAEL,QAAA,gBAAA;AAAA,UACE,GAAA,CAAI,IAAA;AAAA,YACF,CAAC,GAAG,CAAA,KAAA,CACD,CAAA,CAAE,iBAAiB,MAAA,IAAU,CAAA,KAC7B,CAAA,CAAE,eAAA,EAAiB,MAAA,IAAU,CAAA;AAAA;AAClC,SACF;AACA,QAAA,0BAAA,CAA2B,OAAA,GAAU,KAAA;AACrC,QAAA,0BAAA,CAA2B,2BAA2B,OAAO,CAAA;AAC7D,QAAA,IAAI,CAAC,mBAAmB,OAAA,EAAS;AAC/B,UAAA,aAAA,CAAc,OAAA,GAAU,KAAA;AACxB,UAAA,aAAA,CAAc,cAAc,OAAO,CAAA;AAAA,QACrC;AAAA,MACF,CAAA;AAAA,MACA,CAAC,QAAQ,aAAA,KAAkB;AACzB,QAAA,mBAAA,CAAoB,OAAA,GAAU,IAAA;AAC9B,QAAA,6BAAA,CAA8B,IAAI,CAAA;AAClC,QAAA,QAAA,CAAS;AAAA,UACP,IAAA,EAAM,cAAA;AAAA,UACN,QAAA,EAAU;AAAA,YACR,QAAQ,gBAAA,CAAiB,8BAAA;AAAA,YACzB,aAAA,EAAe,iBAAA;AAAA,cACb,EAAE,8CAA8C,CAAA;AAAA,cAChD,aAAA;AAAA,cACA;AAAA;AACF;AACF,SACD,CAAA;AACD,QAAA,0BAAA,CAA2B,OAAA,GAAU,KAAA;AACrC,QAAA,0BAAA,CAA2B,2BAA2B,OAAO,CAAA;AAC7D,QAAA,IAAI,CAAC,mBAAmB,OAAA,EAAS;AAC/B,UAAA,aAAA,CAAc,OAAA,GAAU,KAAA;AACxB,UAAA,aAAA,CAAc,cAAc,OAAO,CAAA;AAAA,QACrC;AAAA,MACF;AAAA,KACF;AAAA,EAEF,CAAA,EAAG,EAAE,CAAA;AAGL,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,QAAA,CAAS,EAAE,IAAA,EAAM,cAAA,EAAgB,QAAA,EAAU,MAAM,CAAA;AACjD,IAAA,UAAA;AAAA,MACE,CAAA,GAAA,KAAO;AACL,QAAA,MAAM,kBAAkB,GAAA,CAAI,MAAA;AAAA,UAC1B,CAAA,IAAA,KAAQ,IAAA,CAAK,MAAA,KAAW,aAAA,CAAc;AAAA,SACxC;AACA,QAAA,MAAM,wBAAwB,GAAA,CAAI,MAAA;AAAA,UAChC,CAAA,IAAA,KAAQ,IAAA,CAAK,MAAA,KAAW,aAAA,CAAc;AAAA,SACxC;AAEA,QAAA,MAAM,cAAc,GAAA,CAAI,MAAA;AAAA,UACtB,UACE,IAAA,CAAK,MAAA,KAAW,cAAc,OAAA,IAC9B,IAAA,CAAK,WAAW,aAAA,CAAc;AAAA,SAClC;AAGA,QAAA,MAAM,SAAA,GACJ,GAAA,CAAI,MAAA,GAAS,CAAA,IACb,GAAA,CAAI,MAAM,CAAA,CAAA,KAAK,CAAA,CAAE,MAAA,KAAW,aAAA,CAAc,gBAAgB,CAAA;AAC5D,QAAA,2BAAA,CAA4B,SAAS,CAAA;AAErC,QAAA,MAAM,eAAmC,eAAA,CAAgB,GAAA;AAAA,UACvD;AAAA,SACF;AACA,QAAA,MAAM,qBAAmC,qBAAA,CAAsB,GAAA;AAAA,UAC7D,CAAA,IAAA,MAAS;AAAA,YACP,IAAI,IAAA,CAAK,MAAA;AAAA,YACT,eAAA,EAAiB,KAAK,eAAA,IAAmB;AAAA,WAC3C;AAAA,SACF;AAEA,QAAA,MAAM,0BAA6C,WAAA,CAAY,GAAA;AAAA,UAC7D,CAAA,IAAA,MAAS;AAAA,YACP,IAAI,IAAA,CAAK,MAAA;AAAA,YACT,QAAQ,IAAA,CAAK,MAAA;AAAA,YACb,WAAW,IAAA,CAAK;AAAA,WAClB;AAAA,SACF;AAEA,QAAA,QAAA,CAAS,YAAY,CAAA;AACrB,QAAA,cAAA,CAAe,kBAAkB,CAAA;AACjC,QAAA,mBAAA,CAAoB,uBAAuB,CAAA;AAC3C,QAAA,kBAAA,CAAmB,OAAA,GAAU,KAAA;AAC7B,QAAA,kBAAA,CAAmB,mBAAmB,OAAO,CAAA;AAC7C,QAAA,IAAI,CAAC,2BAA2B,OAAA,EAAS;AACvC,UAAA,aAAA,CAAc,OAAA,GAAU,KAAA;AACxB,UAAA,aAAA,CAAc,cAAc,OAAO,CAAA;AAAA,QACrC;AAEA,QAAA,IAAI,CAAC,gBAAA,EAAkB;AAGrB,UAAA,IAAI,YAAA,CAAa,SAAS,CAAA,EAAG;AAC3B,YAAA,QAAA,CAAS,WAAA,CAAY,EAAE,MAAA,EAAQ,YAAA,CAAa,CAAC,CAAA,CAAE,EAAA,EAAI,CAAC,CAAA;AAAA,UACtD,CAAA,MAAA,IAAW,kBAAA,CAAmB,MAAA,GAAS,CAAA,EAAG;AACxC,YAAA,QAAA,CAAS,WAAA,CAAY,EAAE,MAAA,EAAQ,kBAAA,CAAmB,CAAC,CAAA,CAAE,EAAA,EAAI,CAAC,CAAA;AAAA,UAC5D;AAGA,UAAA;AAAA,QACF;AAEA,QAAA,MAAM,OAAO,YAAA,CAAa,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,OAAO,gBAAgB,CAAA;AAC7D,QAAA,MAAM,eAAe,kBAAA,CAAmB,IAAA;AAAA,UACtC,CAAA,CAAA,KAAK,EAAE,EAAA,KAAO;AAAA,SAChB;AAGA,QAAA,IAAI,aAAa,MAAA,GAAS,CAAA,IAAK,CAAC,IAAA,IAAQ,CAAC,YAAA,EAAc;AACrD,UAAA,QAAA,CAAS,WAAA,CAAY,EAAE,MAAA,EAAQ,YAAA,CAAa,CAAC,CAAA,CAAE,EAAA,EAAI,CAAA,EAAG;AAAA,YACpD,KAAA,EAAO,EAAE,gCAAgC;AAAA,WAC1C,CAAA;AAAA,QACH;AAAA,MACF,CAAA;AAAA,MACA,CAAA,aAAA,KAAiB;AACf,QAAA,IAAI,CAAC,oBAAoB,OAAA,EAAS;AAChC,UAAA,QAAA,CAAS;AAAA,YACP,IAAA,EAAM,cAAA;AAAA,YACN,QAAA,EAAU;AAAA,cACR,QAAQ,gBAAA,CAAiB,sBAAA;AAAA,cACzB,aAAA,EAAe,iBAAA;AAAA,gBACb,EAAE,sCAAsC,CAAA;AAAA,gBACxC,aAAA;AAAA,gBACA;AAAA;AACF;AACF,WACD,CAAA;AAAA,QACH;AACA,QAAA,kBAAA,CAAmB,OAAA,GAAU,KAAA;AAC7B,QAAA,kBAAA,CAAmB,mBAAmB,OAAO,CAAA;AAC7C,QAAA,IAAI,CAAC,2BAA2B,OAAA,EAAS;AACvC,UAAA,aAAA,CAAc,OAAA,GAAU,KAAA;AACxB,UAAA,aAAA,CAAc,cAAc,OAAO,CAAA;AAAA,QACrC;AAAA,MACF;AAAA,KACF;AAAA,EAEF,CAAA,EAAG,EAAE,CAAA;AAGL,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,CAAC,gBAAA,EAAkB;AACvB,IAAA,MAAM,OAAO,KAAA,EAAO,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,OAAO,gBAAgB,CAAA;AACvD,IAAA,MAAM,aAAa,WAAA,CAAY,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,OAAO,gBAAgB,CAAA;AAClE,IAAA,MAAM,aAAa,WAAA,CAAY,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,WAAW,gBAAgB,CAAA;AACtE,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,eAAA,CAAgB,IAAI,CAAA;AACpB,MAAA,qBAAA,CAAsB,IAAI,CAAA;AAC1B,MAAA,qBAAA,CAAsB,IAAI,CAAA;AAAA,IAC5B,WAAW,UAAA,EAAY;AACrB,MAAA,qBAAA,CAAsB,UAAU,CAAA;AAChC,MAAA,eAAA,CAAgB,IAAI,CAAA;AACpB,MAAA,qBAAA,CAAsB,IAAI,CAAA;AAAA,IAC5B,WAAW,UAAA,EAAY;AACrB,MAAA,qBAAA,CAAsB,UAAU,CAAA;AAChC,MAAA,eAAA,CAAgB,IAAI,CAAA;AACpB,MAAA,qBAAA,CAAsB,IAAI,CAAA;AAAA,IAC5B;AAAA,EACF,GAAG,CAAC,KAAA,EAAO,WAAA,EAAa,WAAA,EAAa,gBAAgB,CAAC,CAAA;AAEtD,EAAA,MAAM,eAAA,GAAkB,YAAY,MAAM;AACxC,IAAA,QAAA,CAAS;AAAA,MACP,IAAA,EAAM,YAAA;AAAA,MACN,cAAc,EAAE,SAAA,EAAW,OAAO,SAAA,EAAW,KAAA,EAAO,SAAS,KAAA;AAAM,KACpE,CAAA;AAAA,EACH,CAAA,EAAG,CAAC,QAAQ,CAAC,CAAA;AAGb,EAAA,MAAM,aAAA,GAAgB,YAAY,MAAM;AACtC,IAAA,QAAA,CAAS,EAAE,IAAA,EAAM,cAAA,EAAgB,QAAA,EAAU,MAAM,CAAA;AAAA,EACnD,CAAA,EAAG,CAAC,QAAQ,CAAC,CAAA;AAEb,EAAA,MAAM,qBAAA,GAAwB,WAAA;AAAA,IAC5B,CAAC,MAAA,KAA6B;AAC5B,MAAA,OAAO,MAAA,KAAW,gBAAA,CAAiB,kCAAA,GAC/B,EAAE,KAAA,EAAO,SAAS,KAAA,EAAO,IAAA,EAAM,QAAA,CAAS,IAAA,EAAK,GAC7C,MAAA;AAAA,IACN,CAAA;AAAA,IACA,CAAC,QAAA,CAAS,KAAA,EAAO,QAAA,CAAS,IAAI;AAAA,GAChC;AAEA,EAAA,SAAS,kBAAkB,UAAA,EAAgC;AACzD,IAAA,MAAM,cAAA,GAAiB,UAAA,CAAW,SAAA,CAAU,CAAC,CAAA;AAE7C,IAAA,IAAI,CAAC,cAAA,EAAgB;AACnB,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAA,aAAA,EAAgB,WAAW,MAAM,CAAA,0BAAA;AAAA,OACnC;AAAA,IACF;AAEA,IAAA,MAAM,UAAA,GAAa,aAAA,CAAc,iBAAA,CAAkB,cAAc,CAAC,CAAA;AAClE,IAAA,OAAO,GAAG,UAAU,CAAA,MAAA,EAAS,kBAAA,CAAmB,UAAA,CAAW,MAAM,CAAC,CAAA,CAAA;AAAA,EACpE;AAEA,EAAA,SAAS,WAAW,EAAA,EAAY;AAC9B,IAAA,MAAM,aAAa,WAAA,CAAY,IAAA,CAAK,CAAA,IAAA,KAAQ,IAAA,CAAK,WAAW,EAAE,CAAA;AAE9D,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,QAAA,CAAS,iBAAA,CAAkB,UAAU,CAAC,CAAA;AACtC,MAAA;AAAA,IACF;AAEA,IAAA,QAAA,CAAS,WAAA,CAAY,EAAE,MAAA,EAAQ,EAAA,EAAI,CAAC,CAAA;AAAA,EACtC;AAEA,EAAA,SAAS,aAAA,CACP,IAAA,EACA,mBAAA,EACA,aAAA,EACA;AACA,IAAA,aAAA,CAAc,IAAI,CAAA;AAClB,IAAA,eAAA,CAAgB,IAAI,CAAA;AACpB,IAAA,qBAAA,CAAsB,IAAI,CAAA;AAC1B,IAAA,QAAA,CAAS;AAAA,MACP,IAAA,EAAM,UAAA;AAAA,MACN,cAAc,EAAE,SAAA,EAAW,MAAM,OAAA,EAAS,KAAA,EAAO,WAAW,KAAA,EAAM;AAAA,MAClE,QAAA,EAAU;AAAA,KACX,CAAA;AACD,IAAA,MAAM,OAAA,GAA4B;AAAA,MAChC,GAAG,IAEL,CAAA;AACA,IAAA,SAAA;AAAA,MACE,OAAA,CAAQ,OAAA;AAAA,MACR,mBAAA;AAAA,MACA,OAAA,CAAQ,UAAA;AAAA,MACR,aAAA;AAAA,MACA,CAAA,GAAA,KAAO;AACL,QAAA,IAAI,CAAC,GAAA,CAAI,MAAA,EAAQ,MAAM,IAAI,MAAM,qBAAqB,CAAA;AACtD,QAAA,IAAI,CAAC,GAAA,CAAI,WAAA,EAAa,MAAM,IAAI,MAAM,0BAA0B,CAAA;AAChE,QAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,WAAW,CAAA;AACvC,QAAA,MAAM,OAAA,GAAU,UAAU,IAAI,CAAA;AAC9B,QAAA,MAAM,gBAAA,GAAqC;AAAA,UACzC,IAAI,GAAA,CAAI,MAAA;AAAA,UACR,QAAQ,UAAA,CAAW,KAAA;AAAA,UACnB,OAAA;AAAA,UACA,YAAY,IAAA,CAAK,UAAA;AAAA,UACjB,eAAe,IAAA,CAAK,aAAA;AAAA,UACpB,eAAe,IAAA,CAAK;AAAA,SACtB;AACA,QAAA,QAAA,CAAS,KAAA,GAAQ,CAAC,GAAG,KAAA,EAAO,gBAAgB,CAAA,GAAI,CAAC,gBAAgB,CAAC,CAAA;AAClE,QAAA,aAAA,CAAc,KAAK,CAAA;AACnB,QAAA,QAAA,CAAS,YAAY,EAAE,MAAA,EAAQ,GAAA,CAAI,MAAA,EAAQ,CAAC,CAAA;AAC5C,QAAA,QAAA,CAAS;AAAA,UACP,IAAA,EAAM,UAAA;AAAA,UACN,cAAc,EAAE,SAAA,EAAW,OAAO,OAAA,EAAS,KAAA,EAAO,WAAW,IAAA,EAAK;AAAA,UAClE,QAAA,EAAU;AAAA,YACR,GAAG,GAAA;AAAA,YACH,aAAA,EAAe,iBAAA,CAAkB,MAAA,EAAQ,GAAA,CAAI,QAAQ,CAAC;AAAA;AACxD,SACD,CAAA;AAAA,MACH,CAAA;AAAA,MACA,CAAC,OAA6B,aAAA,KAA2B;AACvD,QAAA,eAAA,CAAgB,YAAY,CAAA;AAC5B,QAAA,aAAA,CAAc,KAAK,CAAA;AAEnB,QAAA,MAAM,kBAAA,GAAqB,qBAAA,CAAsB,KAAA,CAAM,MAAM,CAAA;AAE7D,QAAA,QAAA,CAAS;AAAA,UACP,IAAA,EAAM,UAAA;AAAA,UACN,cAAc,EAAE,SAAA,EAAW,OAAO,OAAA,EAAS,IAAA,EAAM,WAAW,KAAA,EAAM;AAAA,UAClE,QAAA,EAAU;AAAA,YACR,GAAG,KAAA;AAAA,YACH,aAAA,EAAe,iBAAA;AAAA,cACb,iBAAA,CAAkB,OAAA,EAAS,KAAA,CAAM,MAAA,EAAQ,GAAG,kBAAkB,CAAA;AAAA,cAC9D,aAAA;AAAA,cACA;AAAA;AACF;AACF,SACD,CAAA;AAAA,MACH;AAAA,KACF;AAAA,EACF;AAEA,EAAA,SAAS,UAAA,CAAW,WAAwB,OAAA,EAAsB;AAChE,IAAA,IAAI,gBAAgB,KAAA,EAAO;AACzB,MAAA,MAAM,WAAA,GAAc;AAAA,QAClB,GAAG,YAAA;AAAA,QACH,QAAQ,UAAA,CAAW;AAAA,OACrB;AACA,MAAA,MAAM,YAAA,GAAe,YAAA;AAErB,MAAA,QAAA,CAAS;AAAA,QACP,IAAA,EAAM,UAAA;AAAA,QACN,cAAc,EAAE,SAAA,EAAW,MAAM,OAAA,EAAS,KAAA,EAAO,WAAW,KAAA,EAAM;AAAA,QAClE,QAAA,EAAU;AAAA,OACX,CAAA;AACD,MAAA,WAAA;AAAA,QACE,YAAA,CAAa,EAAA;AAAA,QACb,CAAA,GAAA,KAAO;AACL,UAAA,QAAA,CAAS;AAAA,YACP,IAAA,EAAM,UAAA;AAAA,YACN,cAAc,EAAE,SAAA,EAAW,OAAO,OAAA,EAAS,KAAA,EAAO,WAAW,IAAA,EAAK;AAAA,YAClE,QAAA,EAAU;AAAA,cACR,GAAG,GAAA;AAAA,cACH,aAAA,EAAe,iBAAA,CAAkB,MAAA,EAAQ,GAAA,CAAI,QAAQ,CAAC;AAAA;AACxD,WACD,CAAA;AACD,UAAA,eAAA,CAAgB,KAAK,CAAA;AACrB,UAAA,IAAI,GAAA,CAAI,MAAA,KAAW,gBAAA,CAAiB,WAAA,EAAa;AAC/C,YAAA,eAAA;AAAA,cACE,MAAM,IAAA,CAAK,CAAA,IAAA,KAAQ,KAAK,EAAA,KAAO,YAAA,CAAa,EAAE,CAAA,IAAK;AAAA,aACrD;AACA,YAAA,QAAA,CAAS,MAAM,MAAA,CAAO,CAAA,IAAA,KAAQ,KAAK,EAAA,KAAO,WAAA,CAAY,EAAE,CAAC,CAAA;AACzD,YAAA,IAAI,WAAW,SAAA,EAAU;AAAA,UAC3B,CAAA,MAAO;AACL,YAAA,eAAA,CAAgB,WAAW,CAAA;AAC3B,YAAA,QAAA;AAAA,cACE,KAAA,CAAM,GAAA;AAAA,gBAAI,CAAA,IAAA,KACR,IAAA,CAAK,EAAA,KAAO,YAAA,CAAa,KAAK,WAAA,GAAc;AAAA;AAC9C,aACF;AAAA,UACF;AAAA,QACF,CAAA;AAAA,QACA,CAAC,OAAO,aAAA,KAAkB;AACxB,UAAA,eAAA,CAAgB,YAAY,CAAA;AAE5B,UAAA,MAAM,kBAAA,GAAqB,qBAAA,CAAsB,KAAA,CAAM,MAAM,CAAA;AAE7D,UAAA,QAAA,CAAS;AAAA,YACP,IAAA,EAAM,UAAA;AAAA,YACN,cAAc,EAAE,SAAA,EAAW,OAAO,OAAA,EAAS,IAAA,EAAM,WAAW,KAAA,EAAM;AAAA,YAClE,QAAA,EAAU;AAAA,cACR,GAAG,KAAA;AAAA,cACH,aAAA,EAAe,iBAAA;AAAA,gBACb,iBAAA,CAAkB,OAAA,EAAS,KAAA,CAAM,MAAA,EAAQ,GAAG,kBAAkB,CAAA;AAAA,gBAC9D,aAAA;AAAA,gBACA;AAAA;AACF;AACF,WACD,CAAA;AACD,UAAA,eAAA,CAAgB,KAAK,CAAA;AACrB,UAAA,IAAI,SAAS,OAAA,EAAQ;AAAA,QACvB;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,MAAM,0BACJ,YAAA,EAAc,MAAA,KAAW,WAAW,aAAA,IACpC,YAAA,EAAc,WAAW,UAAA,CAAW,uBAAA;AAEtC,EAAA,MAAM,sBAAA,GAAyB,YAAY,MAAM;AAC/C,IAAA,QAAA,CAAS;AAAA,MACP,IAAA,EAAM,UAAA;AAAA,MACN,cAAc,EAAE,SAAA,EAAW,OAAO,OAAA,EAAS,IAAA,EAAM,WAAW,KAAA,EAAM;AAAA,MAClE,QAAA,EAAU;AAAA,QACR,QAAQ,gBAAA,CAAiB,4BAAA;AAAA,QACzB,aAAA,EAAe,EAAE,4CAA4C;AAAA;AAC/D,KACD,CAAA;AAAA,EACH,CAAA,EAAG,CAAC,QAAA,EAAU,CAAC,CAAC,CAAA;AAEhB,EAAA,SAAS,UAAA,CACP,IAAA,EACA,SAAA,EACA,OAAA,EACA;AACA,IAAA,IAAI,uBAAA,EAAyB;AAC3B,MAAA,sBAAA,EAAuB;AACvB,MAAA,OAAA,IAAU;AACV,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,gBAAgB,KAAA,EAAO;AACzB,MAAA,MAAM,qBAAA,GACJ,aAAa,eAAA,EAAiB,4BAAA,IAC9B,oBAAoB,YAAA,CAAa,OAAA,EAAS,KAAK,OAAO,CAAA;AAExD,MAAA,MAAM,WAAA,GAAgC;AAAA,QACpC,GAAG,YAAA;AAAA,QACH,YAAY,IAAA,CAAK,UAAA;AAAA,QACjB,SAAS,IAAA,CAAK,OAAA;AAAA,QACd,MAAA,EACE,aAAa,MAAA,KAAW,UAAA,CAAW,SAAS,qBAAA,GACxC,UAAA,CAAW,QACX,YAAA,CAAa,MAAA;AAAA,QACnB,qBAAA;AAAA,QACA,eAAe,IAAA,CAAK,aAAA;AAAA,QACpB,eAAA,EAAiB;AAAA,UACf,gBAAA,EAAkB,KAAA;AAAA,UAClB,4BAAA,EAA8B;AAAA;AAChC,OACF;AACA,MAAA,MAAM,YAAA,GAAe,YAAA;AACrB,MAAA,eAAA,CAAgB,WAAW,CAAA;AAC3B,MAAA,QAAA,CAAS;AAAA,QACP,IAAA,EAAM,UAAA;AAAA,QACN,cAAc,EAAE,SAAA,EAAW,MAAM,OAAA,EAAS,KAAA,EAAO,WAAW,KAAA,EAAM;AAAA,QAClE,QAAA,EAAU;AAAA,OACX,CAAA;AACD,MAAA,QAAA;AAAA,QACE,WAAA;AAAA,QACA,CAAA,GAAA,KAAO;AACL,UAAA,QAAA,CAAS;AAAA,YACP,IAAA,EAAM,UAAA;AAAA,YACN,cAAc,EAAE,SAAA,EAAW,OAAO,OAAA,EAAS,KAAA,EAAO,WAAW,IAAA,EAAK;AAAA,YAClE,QAAA,EAAU;AAAA,cACR,GAAG,GAAA;AAAA,cACH,aAAA,EAAe,iBAAA,CAAkB,MAAA,EAAQ,GAAA,CAAI,QAAQ,CAAC;AAAA;AACxD,WACD,CAAA;AACD,UAAA,IAAI,iBAAA,IAAqB,GAAA,IAAO,GAAA,CAAI,eAAA,EAAiB,cAAA,EAAgB;AACnE,YAAA,WAAA,CAAY,cAAA,GAAiB,IAAI,eAAA,CAAgB,cAAA;AACjD,YAAA,WAAA,CAAY,SAAS,UAAA,CAAW,eAAA;AAAA,UAClC;AACA,UAAA,eAAA,CAAgB,WAAW,CAAA;AAC3B,UAAA,QAAA;AAAA,YACE,KAAA,CAAM,IAAI,CAAA,CAAA,KAAM,CAAA,CAAE,OAAO,YAAA,CAAa,EAAA,GAAK,cAAc,CAAE;AAAA,WAC7D;AACA,UAAA,eAAA,CAAgB,KAAK,CAAA;AACrB,UAAA,IAAI,WAAW,SAAA,EAAU;AAAA,QAC3B,CAAA;AAAA,QACA,CAAC,OAAO,aAAA,KAAkB;AACxB,UAAA,MAAM,kBAAA,GAAqB,qBAAA,CAAsB,KAAA,CAAM,MAAM,CAAA;AAE7D,UAAA,QAAA,CAAS;AAAA,YACP,IAAA,EAAM,UAAA;AAAA,YACN,cAAc,EAAE,SAAA,EAAW,OAAO,OAAA,EAAS,IAAA,EAAM,WAAW,KAAA,EAAM;AAAA,YAClE,QAAA,EAAU;AAAA,cACR,GAAG,KAAA;AAAA,cACH,aAAA,EAAe,iBAAA;AAAA,gBACb,iBAAA,CAAkB,OAAA,EAAS,KAAA,CAAM,MAAA,EAAQ,GAAG,kBAAkB,CAAA;AAAA,gBAC9D,aAAA;AAAA,gBACA;AAAA;AACF;AACF,WACD,CAAA;AACD,UAAA,eAAA,CAAgB,KAAK,CAAA;AACrB,UAAA,IAAI,SAAS,OAAA,EAAQ;AACrB,UAAA,eAAA,CAAgB,YAAY,CAAA;AAAA,QAC9B;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,SAAS,WAAA,GAAc;AACrB,IAAA,IAAI,gBAAgB,KAAA,EAAO;AACzB,MAAA,QAAA,CAAS;AAAA,QACP,IAAA,EAAM,YAAA;AAAA,QACN,cAAc,EAAE,SAAA,EAAW,MAAM,OAAA,EAAS,KAAA,EAAO,WAAW,KAAA;AAAM,OACnE,CAAA;AACD,MAAA,YAAA;AAAA,QACE,YAAA,CAAa,EAAA;AAAA,QACb,CAAA,GAAA,KAAO;AACL,UAAA,MAAM,KAAA,GAAQ,IAAI,eAAA,EAAiB,cAAA;AACnC,UAAA,MAAM,WAAA,GAAc;AAAA,YAClB,GAAG,YAAA;AAAA,YACH,QACE,YAAA,CAAa,MAAA,KAAW,WAAW,KAAA,GAC/B,UAAA,CAAW,kBACX,UAAA,CAAW,uBAAA;AAAA,YACjB,cAAA,EAAgB;AAAA,WAClB;AACA,UAAA,eAAA,CAAgB,WAAW,CAAA;AAC3B,UAAA,QAAA;AAAA,YACE,KAAA,CAAM,IAAI,CAAA,CAAA,KAAM,CAAA,CAAE,OAAO,YAAA,CAAa,EAAA,GAAK,cAAc,CAAE;AAAA,WAC7D;AACA,UAAA,QAAA,CAAS;AAAA,YACP,IAAA,EAAM,UAAA;AAAA,YACN,cAAc,EAAE,SAAA,EAAW,OAAO,OAAA,EAAS,KAAA,EAAO,WAAW,IAAA,EAAK;AAAA,YAClE,QAAA,EAAU;AAAA,cACR,GAAG,GAAA;AAAA,cACH,aAAA,EAAe,iBAAA,CAAkB,MAAA,EAAQ,GAAA,CAAI,QAAQ,CAAC;AAAA;AACxD,WACD,CAAA;AAAA,QACH,CAAA;AAAA,QACA,CAAC,OAAO,aAAA,KAAkB;AACxB,UAAA,MAAM,kBAAA,GAAqB,qBAAA,CAAsB,KAAA,CAAM,MAAM,CAAA;AAE7D,UAAA,QAAA,CAAS;AAAA,YACP,IAAA,EAAM,UAAA;AAAA,YACN,cAAc,EAAE,SAAA,EAAW,OAAO,OAAA,EAAS,IAAA,EAAM,WAAW,KAAA,EAAM;AAAA,YAClE,QAAA,EAAU;AAAA,cACR,GAAG,KAAA;AAAA,cACH,aAAA,EAAe,iBAAA;AAAA,gBACb,iBAAA,CAAkB,OAAA,EAAS,KAAA,CAAM,MAAA,EAAQ,GAAG,kBAAkB,CAAA;AAAA,gBAC9D,aAAA;AAAA,gBACA;AAAA;AACF;AACF,WACD,CAAA;AAAA,QACH;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,MAAM,KAAA,GAAQ;AAAA,IACZ,KAAA;AAAA,IACA,WAAA;AAAA,IACA,gBAAA;AAAA,IACA,WAAA;AAAA,IACA,UAAA;AAAA,IACA,YAAA;AAAA,IACA,kBAAA;AAAA,IACA,kBAAA;AAAA,IACA,aAAA;AAAA,IACA,UAAA;AAAA,IACA,UAAA;AAAA,IACA,sBAAA;AAAA,IACA,WAAA;AAAA,IACA,cAAc,UAAA,CAAW,YAAA;AAAA,IACzB,eAAA;AAAA,IACA,aAAA;AAAA,IACA,YAAA;AAAA,IACA,UAAA;AAAA,IACA,UAAU,UAAA,CAAW,QAAA;AAAA,IACrB;AAAA,GACF;AAEA,EAAA,uBACE,GAAA;AAAA,IAAC,WAAA,CAAY,QAAA;AAAA,IAAZ;AAAA,MACC,KAAA,EAAO;AAAA,QACL,GAAG,KAAA;AAAA,QACH,uBAAA,EAAyB,KAAA;AAAA,QACzB,0BAAA;AAAA,QACA;AAAA,OACF;AAAA,MAEC;AAAA;AAAA,GACH;AAEJ;AAEO,SAAS,QAAA,GAAW;AACzB,EAAA,MAAM,OAAA,GAAU,WAAW,WAAW,CAAA;AACtC,EAAA,IAAI,YAAY,MAAA,EAAW;AACzB,IAAA,MAAM,IAAI,MAAM,6CAA6C,CAAA;AAAA,EAC/D;AACA,EAAA,OAAO,OAAA;AACT;;;;"}
@@ -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 buildFetchRiScErrorMessages(errorRiScs, t) {
21
- const errorsByStatus = errorRiScs.reduce(
22
- (acc, risk) => {
23
- if (!acc[risk.status]) {
24
- acc[risk.status] = [];
25
- }
26
- acc[risk.status].push(risk.riScId);
27
- return acc;
28
- },
29
- {}
30
- );
31
- return Object.entries(errorsByStatus).map(([status, riScIds]) => {
32
- const validStatuses = Object.values(ContentStatus);
33
- const statusKey = validStatuses.includes(status) ? status : ContentStatus.Failure;
34
- if (statusKey === ContentStatus.DecryptionFailed) {
35
- const decryptionRisks = errorRiScs.filter(
36
- (risk) => risk.status === ContentStatus.DecryptionFailed && riScIds.includes(risk.riScId)
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 { buildFetchRiScErrorMessages, mapRiScDtoToRiScWithMetadata, withLoginRejected };
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\n/**\n * Builds readable error message string from a list of RiScs that\n * failed to load. Groups them by ContentStatus and produces one line per\n * group, with special handling for DecryptionFailed entries that carry an\n * errorCode.\n */\nexport function buildFetchRiScErrorMessages(\n errorRiScs: RiScContentResultDTO[],\n t: (key: any, options?: any) => string,\n): string {\n const errorsByStatus = errorRiScs.reduce(\n (acc, risk) => {\n if (!acc[risk.status]) {\n acc[risk.status] = [];\n }\n acc[risk.status].push(risk.riScId);\n return acc;\n },\n {} as Record<ContentStatus, string[]>,\n );\n\n return Object.entries(errorsByStatus)\n .map(([status, riScIds]) => {\n // Fallback to Failure for unknown status values\n const validStatuses = Object.values(ContentStatus);\n const statusKey = validStatuses.includes(status as ContentStatus)\n ? status\n : ContentStatus.Failure;\n\n if (statusKey === ContentStatus.DecryptionFailed) {\n const decryptionRisks = errorRiScs.filter(\n risk =>\n risk.status === ContentStatus.DecryptionFailed &&\n riScIds.includes(risk.riScId),\n );\n\n const withErrorCode = decryptionRisks.filter(risk => risk.errorCode);\n const withoutErrorCode = decryptionRisks.filter(\n risk => !risk.errorCode,\n );\n\n const messages: string[] = [];\n\n if (withErrorCode.length > 0) {\n const groups = withErrorCode.reduce(\n (acc, risk) => {\n const groupKey = `${risk.errorCode}__${risk.encryptionKeyId ?? ''}`;\n if (!acc[groupKey]) acc[groupKey] = [];\n acc[groupKey].push(risk);\n return acc;\n },\n {} as Record<string, RiScContentResultDTO[]>,\n );\n\n Object.values(groups).forEach(group => {\n const { errorCode, encryptionKeyId } = group[0];\n const groupRiScIds = group.map(r => r.riScId).join(', ');\n if (encryptionKeyId) {\n const keyId = encryptionKeyId.split('/').pop() ?? encryptionKeyId;\n const errorKey =\n group.length === 1\n ? 'errorMessages.ContentStatusDecryptionFailedMessage.WITH_KEY_SINGLE'\n : 'errorMessages.ContentStatusDecryptionFailedMessage.WITH_KEY_PLURAL';\n messages.push(\n t(errorKey as any, { riScId: groupRiScIds, keyId }),\n );\n } else {\n const errorKey = `errorMessages.ContentStatusDecryptionFailedMessage.${errorCode}`;\n messages.push(\n t(errorKey as any, { riScId: groupRiScIds, status }),\n );\n }\n });\n }\n\n if (withoutErrorCode.length > 0) {\n const errorKey = `errorMessages.ContentStatus${statusKey}`;\n messages.push(\n t(errorKey as any, {\n riScId: withoutErrorCode.map(r => r.riScId).join(', '),\n status,\n }),\n );\n }\n\n return messages.join('\\n');\n }\n\n const errorKey = `errorMessages.ContentStatus${statusKey}`;\n return t(errorKey as any, {\n riScId: (riScIds as string[]).join(', '),\n status,\n });\n })\n .join('\\n');\n}\n"],"names":["errorKey"],"mappings":"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"}
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",