@kartverket/backstage-plugin-risk-scorecard 4.0.3 → 4.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,18 +1,42 @@
1
- import { jsx } from 'react/jsx-runtime';
1
+ import { jsxs, jsx } from 'react/jsx-runtime';
2
2
  import Alert from '@mui/material/Alert';
3
3
  import styles from '../alertBar.module.css.esm.js';
4
+ import { AlertTitle, CircularProgress } from '@mui/material';
5
+ import { getAlertSeverity } from '../../../utils/utilityfunctions.esm.js';
6
+ import { Text } from '@backstage/ui';
7
+ import { useTranslationRef } from '@backstage/core-plugin-api/alpha';
8
+ import { pluginRiScTranslationRef } from '../../../utils/translations.esm.js';
4
9
 
5
- function AlertBar({ severity, children, className, alertProps }) {
10
+ function AlertBar({ updateStatus, response, statusText }) {
11
+ const severity = getAlertSeverity(updateStatus, response ?? void 0);
6
12
  const severityClass = styles[severity] || "";
7
- return /* @__PURE__ */ jsx("div", { className, children: /* @__PURE__ */ jsx(
8
- Alert,
9
- {
10
- severity,
11
- className: `${styles.alertBar} ${severityClass}`,
12
- ...alertProps,
13
- children
14
- }
15
- ) });
13
+ const { t } = useTranslationRef(pluginRiScTranslationRef);
14
+ if (!updateStatus) return null;
15
+ if (updateStatus.isLoading) {
16
+ return /* @__PURE__ */ jsxs(
17
+ Alert,
18
+ {
19
+ severity: "info",
20
+ className: `${styles.alertBar} ${styles.info}`,
21
+ icon: /* @__PURE__ */ jsx(CircularProgress, { size: 16, sx: { color: "inherit" } }),
22
+ children: [
23
+ /* @__PURE__ */ jsx(AlertTitle, { children: t("infoMessages.UpdateAction") }),
24
+ /* @__PURE__ */ jsx(Text, { variant: "body-large", children: t("infoMessages.UpdateInfoMessage") })
25
+ ]
26
+ }
27
+ );
28
+ }
29
+ if (response) {
30
+ return /* @__PURE__ */ jsx(
31
+ Alert,
32
+ {
33
+ severity,
34
+ className: `${styles.alertBar} ${severityClass}`,
35
+ children: /* @__PURE__ */ jsx(Text, { variant: "body-large", children: statusText })
36
+ }
37
+ );
38
+ }
39
+ return null;
16
40
  }
17
41
 
18
42
  export { AlertBar as default };
@@ -1 +1 @@
1
- {"version":3,"file":"AlertBar.esm.js","sources":["../../../../src/components/common/AlertBar/AlertBar.tsx"],"sourcesContent":["import React from 'react';\nimport Alert, { AlertProps } from '@mui/material/Alert';\nimport styles from '../alertBar.module.css';\n\ntype Severity = 'success' | 'warning' | 'error' | 'info';\n\ntype Props = {\n severity: Severity;\n children: React.ReactNode;\n className?: string; // applied to wrapper\n alertProps?: Partial<AlertProps>;\n};\n\nfunction AlertBar({ severity, children, className, alertProps }: Props) {\n const severityClass = (styles as any)[severity] || '';\n\n return (\n <div className={className}>\n <Alert\n severity={severity as any}\n className={`${styles.alertBar} ${severityClass}`}\n {...(alertProps as any)}\n >\n {children}\n </Alert>\n </div>\n );\n}\n\nexport default AlertBar;\n"],"names":[],"mappings":";;;;AAaA,SAAS,SAAS,EAAE,QAAA,EAAU,QAAA,EAAU,SAAA,EAAW,YAAW,EAAU;AACtE,EAAA,MAAM,aAAA,GAAiB,MAAA,CAAe,QAAQ,CAAA,IAAK,EAAA;AAEnD,EAAA,uBACE,GAAA,CAAC,SAAI,SAAA,EACH,QAAA,kBAAA,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,QAAA;AAAA,MACA,SAAA,EAAW,CAAA,EAAG,MAAA,CAAO,QAAQ,IAAI,aAAa,CAAA,CAAA;AAAA,MAC7C,GAAI,UAAA;AAAA,MAEJ;AAAA;AAAA,GACH,EACF,CAAA;AAEJ;;;;"}
1
+ {"version":3,"file":"AlertBar.esm.js","sources":["../../../../src/components/common/AlertBar/AlertBar.tsx"],"sourcesContent":["import Alert from '@mui/material/Alert';\nimport styles from '../alertBar.module.css';\nimport { UpdateStatus } from '../../../contexts/RiScContext';\nimport { SubmitResponseObject } from '../../../utils/types';\nimport { AlertTitle, CircularProgress } from '@mui/material';\nimport { getAlertSeverity } from '../../../utils/utilityfunctions';\nimport { Text } from '@backstage/ui';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { pluginRiScTranslationRef } from '../../../utils/translations.ts';\n\ntype Props = {\n updateStatus: UpdateStatus;\n response: SubmitResponseObject | null;\n statusText?: string;\n};\n\nfunction AlertBar({ updateStatus, response, statusText }: Props) {\n const severity = getAlertSeverity(updateStatus, response ?? undefined);\n const severityClass = (styles as any)[severity] || '';\n const { t } = useTranslationRef(pluginRiScTranslationRef);\n\n if (!updateStatus) return null; // Prevents error if prop is missing\n\n if (updateStatus.isLoading) {\n return (\n <Alert\n severity=\"info\"\n className={`${styles.alertBar} ${styles.info}`}\n icon={<CircularProgress size={16} sx={{ color: 'inherit' }} />}\n >\n <AlertTitle>{t('infoMessages.UpdateAction')}</AlertTitle>\n <Text variant=\"body-large\">{t('infoMessages.UpdateInfoMessage')}</Text>\n </Alert>\n );\n }\n if (response) {\n return (\n <Alert\n severity={severity}\n className={`${styles.alertBar} ${severityClass}`}\n >\n <Text variant=\"body-large\">{statusText}</Text>\n </Alert>\n );\n }\n return null;\n}\n\nexport default AlertBar;\n"],"names":[],"mappings":";;;;;;;;;AAgBA,SAAS,QAAA,CAAS,EAAE,YAAA,EAAc,QAAA,EAAU,YAAW,EAAU;AAC/D,EAAA,MAAM,QAAA,GAAW,gBAAA,CAAiB,YAAA,EAAc,QAAA,IAAY,MAAS,CAAA;AACrE,EAAA,MAAM,aAAA,GAAiB,MAAA,CAAe,QAAQ,CAAA,IAAK,EAAA;AACnD,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,iBAAA,CAAkB,wBAAwB,CAAA;AAExD,EAAA,IAAI,CAAC,cAAc,OAAO,IAAA;AAE1B,EAAA,IAAI,aAAa,SAAA,EAAW;AAC1B,IAAA,uBACE,IAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,QAAA,EAAS,MAAA;AAAA,QACT,WAAW,CAAA,EAAG,MAAA,CAAO,QAAQ,CAAA,CAAA,EAAI,OAAO,IAAI,CAAA,CAAA;AAAA,QAC5C,IAAA,sBAAO,gBAAA,EAAA,EAAiB,IAAA,EAAM,IAAI,EAAA,EAAI,EAAE,KAAA,EAAO,SAAA,EAAU,EAAG,CAAA;AAAA,QAE5D,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,UAAA,EAAA,EAAY,QAAA,EAAA,CAAA,CAAE,2BAA2B,CAAA,EAAE,CAAA;AAAA,8BAC3C,IAAA,EAAA,EAAK,OAAA,EAAQ,YAAA,EAAc,QAAA,EAAA,CAAA,CAAE,gCAAgC,CAAA,EAAE;AAAA;AAAA;AAAA,KAClE;AAAA,EAEJ;AACA,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,uBACE,GAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,QAAA;AAAA,QACA,SAAA,EAAW,CAAA,EAAG,MAAA,CAAO,QAAQ,IAAI,aAAa,CAAA,CAAA;AAAA,QAE9C,QAAA,kBAAA,GAAA,CAAC,IAAA,EAAA,EAAK,OAAA,EAAQ,YAAA,EAAc,QAAA,EAAA,UAAA,EAAW;AAAA;AAAA,KACzC;AAAA,EAEJ;AACA,EAAA,OAAO,IAAA;AACT;;;;"}
@@ -1,7 +1,7 @@
1
1
  import styleInject from '../../node_modules_dist/style-inject/dist/style-inject.es.esm.js';
2
2
 
3
- var css_248z = ".alertBar_alertBarBox__3257f35270 {\n position: sticky;\n top: 8px;\n z-index: 100;\n}\n\n.alertBar_alertBar__3257f35270 {\n width: 100%;\n}\n\n/* severity variants */\n.alertBar_success__3257f35270 {\n background-color: #e9f8eb;\n border: 1px solid #66b077;\n}\n\n.alertBar_warning__3257f35270 {\n background-color: #fff7ed;\n border: 1px solid #cf914a;\n}\n\n.alertBar_error__3257f35270 {\n background-color: #fcf1e8;\n border: 1px solid #a32f00;\n}\n\n.alertBar_info__3257f35270 {\n background-color: #eaf6ff;\n border: 1px solid #439ccd;\n}\n";
4
- var styles = {"alertBarBox":"alertBar_alertBarBox__3257f35270","alertBar":"alertBar_alertBar__3257f35270","success":"alertBar_success__3257f35270","warning":"alertBar_warning__3257f35270","error":"alertBar_error__3257f35270","info":"alertBar_info__3257f35270"};
3
+ var css_248z = ".alertBar_alertBarBox__181b52d9eb {\n position: sticky;\n top: 8px;\n z-index: 100;\n display: block;\n}\n\n.alertBar_alertBar__181b52d9eb {\n width: 100%;\n}\n\n/* severity variants */\n.alertBar_success__181b52d9eb {\n background-color: #e9f8eb;\n border: 1px solid #66b077;\n}\n\n.alertBar_warning__181b52d9eb {\n background-color: #fff7ed;\n border: 1px solid #cf914a;\n}\n\n.alertBar_error__181b52d9eb {\n background-color: #fcf1e8;\n border: 1px solid #a32f00;\n}\n\n.alertBar_info__181b52d9eb {\n background-color: #eaf6ff;\n border: 1px solid #439ccd;\n}\n";
4
+ var styles = {"alertBarBox":"alertBar_alertBarBox__181b52d9eb","alertBar":"alertBar_alertBar__181b52d9eb","success":"alertBar_success__181b52d9eb","warning":"alertBar_warning__181b52d9eb","error":"alertBar_error__181b52d9eb","info":"alertBar_info__181b52d9eb"};
5
5
  styleInject(css_248z);
6
6
 
7
7
  export { styles as default };
@@ -6,8 +6,6 @@ import { ScenarioDrawer } from '../scenarioDrawer/ScenarioDrawer.esm.js';
6
6
  import { RiskMatrix } from '../riskMatrix/RiskMatrix.esm.js';
7
7
  import AlertBar from '../common/AlertBar/AlertBar.esm.js';
8
8
  import Grid from '@mui/material/Grid';
9
- import LinearProgress from '@mui/material/LinearProgress';
10
- import { getAlertSeverity } from '../../utils/utilityfunctions.esm.js';
11
9
  import { RiScDialogStates, RiScDialog } from '../riScDialog/RiScDialog.esm.js';
12
10
  import { Spinner } from '../common/Spinner.esm.js';
13
11
  import { useRiScs } from '../../contexts/RiScContext.esm.js';
@@ -67,24 +65,14 @@ function RiScPlugin() {
67
65
  }
68
66
  }, [resetRiScStatus, resetResponse, scenarioWizardStep]);
69
67
  return /* @__PURE__ */ jsxs(Fragment, { children: [
70
- response && !updateStatus.isLoading && /* @__PURE__ */ jsx(Flex, { className: styles.alertBarBox, children: /* @__PURE__ */ jsx(
68
+ /* @__PURE__ */ jsx(Flex, { className: styles.alertBarBox, children: /* @__PURE__ */ jsx(
71
69
  AlertBar,
72
70
  {
73
- severity: getAlertSeverity(updateStatus, response),
74
- className: styles.alertBar,
75
- children: /* @__PURE__ */ jsx(Text, { variant: "body-large", children: response.statusMessage })
71
+ updateStatus,
72
+ response,
73
+ statusText: response?.statusMessage
76
74
  }
77
75
  ) }),
78
- updateStatus.isLoading && /* @__PURE__ */ jsx(
79
- LinearProgress,
80
- {
81
- sx: {
82
- position: "sticky",
83
- top: 0,
84
- margin: 2
85
- }
86
- }
87
- ),
88
76
  scenarioWizardStep !== null ? /* @__PURE__ */ jsx(ScenarioWizard, { step: scenarioWizardStep }) : /* @__PURE__ */ jsxs(Fragment, { children: [
89
77
  /* @__PURE__ */ jsx(RiScHeader, { onEditEncryption: openEditEncryptionDialog }),
90
78
  !isFetching && riScs !== null && riScs.length === 0 && !selectedRiSc && /* @__PURE__ */ jsx(
@@ -1 +1 @@
1
- {"version":3,"file":"RiScPlugin.esm.js","sources":["../../../src/components/riScPlugin/RiScPlugin.tsx"],"sourcesContent":["import { useEffect, useState } from 'react';\nimport { useSearchParams } from 'react-router-dom';\nimport { ScenarioWizard } from '../scenarioWizard/ScenarioWizard';\nimport { ScenarioDrawer } from '../scenarioDrawer/ScenarioDrawer';\nimport { RiskMatrix } from '../riskMatrix/RiskMatrix';\nimport AlertBar from '../common/AlertBar/AlertBar';\nimport Grid from '@mui/material/Grid';\nimport LinearProgress from '@mui/material/LinearProgress';\nimport { getAlertSeverity } from '../../utils/utilityfunctions';\nimport { RiScDialog, RiScDialogStates } from '../riScDialog/RiScDialog';\nimport { Spinner } from '../common/Spinner';\nimport { useRiScs } from '../../contexts/RiScContext';\nimport { ScenarioWizardSteps } from '../../contexts/ScenarioContext';\nimport { RiScHeader } from '../riScHeader/RiScHeader.tsx';\nimport { ScenarioTableWrapper } from '../scenarioTable/ScenarioTableWrapper.tsx';\nimport { FirstRiScDialog } from '../riScInfo/FirstRiScDialog.tsx';\nimport { Flex, Text } from '@backstage/ui';\nimport { CreateNewRiScButton } from '../riScInfo/CreateNewRiScButton.tsx';\nimport { RiScSelectionCard } from '../riScInfo/RiScSelectionCard.tsx';\nimport { RiScRelationComponent } from '../riScInfo/RiScRelationComponent.tsx';\nimport { RiScStatusComponent } from '../riScInfo/riScStatus/RiScStatusComponent.tsx';\nimport { pluginRiScTranslationRef } from '../../utils/translations.ts';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport styles from '../common/alertBar.module.css';\nimport { RiScDescriptionCard } from '../riScInfo/RiScDescriptionCard.tsx';\nimport riscStyles from '../riScInfo/RiScSelectionCard.module.css';\nimport { ErrorState } from '../riScInfo/ErrorState.tsx';\n\nexport function RiScPlugin() {\n const [riScDialogState, setRiScDialogState] = useState<RiScDialogStates>(\n RiScDialogStates.Closed,\n );\n\n function openCreateRiScDialog() {\n return setRiScDialogState(RiScDialogStates.Create);\n }\n\n function openDeleteRiScDialog() {\n return setRiScDialogState(RiScDialogStates.Delete);\n }\n\n function openEditRiScDialog() {\n return setRiScDialogState(RiScDialogStates.EditRiscInfo);\n }\n\n function openEditEncryptionDialog() {\n return setRiScDialogState(RiScDialogStates.EditEncryption);\n }\n\n function closeRiScDialog() {\n return setRiScDialogState(RiScDialogStates.Closed);\n }\n\n const {\n approveRiSc,\n selectedRiSc,\n isFetching,\n resetResponse,\n resetRiScStatus,\n response,\n updateStatus,\n riScs,\n } = useRiScs();\n\n const { t } = useTranslationRef(pluginRiScTranslationRef);\n\n const [searchParams] = useSearchParams();\n const scenarioWizardStep = searchParams.get(\n 'step',\n ) as ScenarioWizardSteps | null;\n\n useEffect(() => {\n if (scenarioWizardStep !== null) {\n resetRiScStatus();\n resetResponse();\n }\n }, [resetRiScStatus, resetResponse, scenarioWizardStep]);\n\n return (\n <>\n {response && !updateStatus.isLoading && (\n <Flex className={styles.alertBarBox}>\n <AlertBar\n severity={getAlertSeverity(updateStatus, response)}\n className={styles.alertBar}\n >\n <Text variant=\"body-large\">{response.statusMessage}</Text>\n </AlertBar>\n </Flex>\n )}\n {updateStatus.isLoading && (\n <LinearProgress\n sx={{\n position: 'sticky',\n top: 0,\n margin: 2,\n }}\n />\n )}\n\n {scenarioWizardStep !== null ? (\n <ScenarioWizard step={scenarioWizardStep} />\n ) : (\n <>\n <RiScHeader onEditEncryption={openEditEncryptionDialog} />\n {!isFetching &&\n riScs !== null &&\n riScs.length === 0 &&\n !selectedRiSc && (\n <Flex\n justify=\"center\"\n align=\"center\"\n className={riscStyles.componentLayout}\n >\n <FirstRiScDialog onNewRiSc={openCreateRiScDialog} />\n </Flex>\n )}\n {!isFetching && riScs === null && (\n <Flex\n align=\"center\"\n justify=\"center\"\n className={riscStyles.componentLayout}\n >\n <ErrorState />\n </Flex>\n )}\n {isFetching && <Spinner size={80} />}\n\n <Grid container spacing={4}>\n {selectedRiSc && (\n <>\n <Grid item xs={12}>\n <Grid container rowSpacing={3} columnSpacing={4}>\n <Grid item xs={8}>\n <Flex align=\"center\" justify=\"between\">\n <Text as=\"h3\" variant=\"body-large\" weight=\"bold\">\n {t('contentHeader.multipleRiScs')}\n </Text>\n <CreateNewRiScButton\n onCreateNew={openCreateRiScDialog}\n />\n </Flex>\n </Grid>\n <Grid item xs={8}>\n <RiScSelectionCard />\n </Grid>\n <Grid item xs={4} />\n\n <Grid item xs={8}>\n <Flex gap=\"24px\" direction=\"column\">\n <RiScDescriptionCard\n riScWithMetadata={selectedRiSc}\n edit={openEditRiScDialog}\n />\n <ScenarioTableWrapper riScWithMetadata={selectedRiSc} />\n </Flex>\n </Grid>\n\n <Grid item xs={4}>\n <Flex direction=\"column\" gap=\"24px\">\n <RiScStatusComponent\n selectedRiSc={selectedRiSc}\n publishRiScFn={approveRiSc}\n />\n <RiScRelationComponent />\n <RiskMatrix riScWithMetadata={selectedRiSc} />\n </Flex>\n </Grid>\n </Grid>\n </Grid>\n </>\n )}\n </Grid>\n </>\n )}\n\n {riScDialogState !== RiScDialogStates.Closed && (\n <RiScDialog\n onClose={closeRiScDialog}\n dialogState={riScDialogState}\n onDelete={openDeleteRiScDialog}\n />\n )}\n\n {!scenarioWizardStep && <ScenarioDrawer />}\n </>\n );\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"RiScPlugin.esm.js","sources":["../../../src/components/riScPlugin/RiScPlugin.tsx"],"sourcesContent":["import { useEffect, useState } from 'react';\nimport { useSearchParams } from 'react-router-dom';\nimport { ScenarioWizard } from '../scenarioWizard/ScenarioWizard';\nimport { ScenarioDrawer } from '../scenarioDrawer/ScenarioDrawer';\nimport { RiskMatrix } from '../riskMatrix/RiskMatrix';\nimport AlertBar from '../common/AlertBar/AlertBar';\nimport Grid from '@mui/material/Grid';\nimport { RiScDialog, RiScDialogStates } from '../riScDialog/RiScDialog';\nimport { Spinner } from '../common/Spinner';\nimport { useRiScs } from '../../contexts/RiScContext';\nimport { ScenarioWizardSteps } from '../../contexts/ScenarioContext';\nimport { RiScHeader } from '../riScHeader/RiScHeader.tsx';\nimport { ScenarioTableWrapper } from '../scenarioTable/ScenarioTableWrapper.tsx';\nimport { FirstRiScDialog } from '../riScInfo/FirstRiScDialog.tsx';\nimport { Flex, Text } from '@backstage/ui';\nimport { CreateNewRiScButton } from '../riScInfo/CreateNewRiScButton.tsx';\nimport { RiScSelectionCard } from '../riScInfo/RiScSelectionCard.tsx';\nimport { RiScRelationComponent } from '../riScInfo/RiScRelationComponent.tsx';\nimport { RiScStatusComponent } from '../riScInfo/riScStatus/RiScStatusComponent.tsx';\nimport { pluginRiScTranslationRef } from '../../utils/translations.ts';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport styles from '../common/alertBar.module.css';\nimport { RiScDescriptionCard } from '../riScInfo/RiScDescriptionCard.tsx';\nimport riscStyles from '../riScInfo/RiScSelectionCard.module.css';\nimport { ErrorState } from '../riScInfo/ErrorState.tsx';\n\nexport function RiScPlugin() {\n const [riScDialogState, setRiScDialogState] = useState<RiScDialogStates>(\n RiScDialogStates.Closed,\n );\n\n function openCreateRiScDialog() {\n return setRiScDialogState(RiScDialogStates.Create);\n }\n\n function openDeleteRiScDialog() {\n return setRiScDialogState(RiScDialogStates.Delete);\n }\n\n function openEditRiScDialog() {\n return setRiScDialogState(RiScDialogStates.EditRiscInfo);\n }\n\n function openEditEncryptionDialog() {\n return setRiScDialogState(RiScDialogStates.EditEncryption);\n }\n\n function closeRiScDialog() {\n return setRiScDialogState(RiScDialogStates.Closed);\n }\n\n const {\n approveRiSc,\n selectedRiSc,\n isFetching,\n resetResponse,\n resetRiScStatus,\n response,\n updateStatus,\n riScs,\n } = useRiScs();\n\n const { t } = useTranslationRef(pluginRiScTranslationRef);\n\n const [searchParams] = useSearchParams();\n const scenarioWizardStep = searchParams.get(\n 'step',\n ) as ScenarioWizardSteps | null;\n\n useEffect(() => {\n if (scenarioWizardStep !== null) {\n resetRiScStatus();\n resetResponse();\n }\n }, [resetRiScStatus, resetResponse, scenarioWizardStep]);\n\n return (\n <>\n <Flex className={styles.alertBarBox}>\n <AlertBar\n updateStatus={updateStatus}\n response={response}\n statusText={response?.statusMessage}\n />\n </Flex>\n {scenarioWizardStep !== null ? (\n <ScenarioWizard step={scenarioWizardStep} />\n ) : (\n <>\n <RiScHeader onEditEncryption={openEditEncryptionDialog} />\n {!isFetching &&\n riScs !== null &&\n riScs.length === 0 &&\n !selectedRiSc && (\n <Flex\n justify=\"center\"\n align=\"center\"\n className={riscStyles.componentLayout}\n >\n <FirstRiScDialog onNewRiSc={openCreateRiScDialog} />\n </Flex>\n )}\n {!isFetching && riScs === null && (\n <Flex\n align=\"center\"\n justify=\"center\"\n className={riscStyles.componentLayout}\n >\n <ErrorState />\n </Flex>\n )}\n {isFetching && <Spinner size={80} />}\n\n <Grid container spacing={4}>\n {selectedRiSc && (\n <>\n <Grid item xs={12}>\n <Grid container rowSpacing={3} columnSpacing={4}>\n <Grid item xs={8}>\n <Flex align=\"center\" justify=\"between\">\n <Text as=\"h3\" variant=\"body-large\" weight=\"bold\">\n {t('contentHeader.multipleRiScs')}\n </Text>\n <CreateNewRiScButton\n onCreateNew={openCreateRiScDialog}\n />\n </Flex>\n </Grid>\n <Grid item xs={8}>\n <RiScSelectionCard />\n </Grid>\n <Grid item xs={4} />\n\n <Grid item xs={8}>\n <Flex gap=\"24px\" direction=\"column\">\n <RiScDescriptionCard\n riScWithMetadata={selectedRiSc}\n edit={openEditRiScDialog}\n />\n <ScenarioTableWrapper riScWithMetadata={selectedRiSc} />\n </Flex>\n </Grid>\n\n <Grid item xs={4}>\n <Flex direction=\"column\" gap=\"24px\">\n <RiScStatusComponent\n selectedRiSc={selectedRiSc}\n publishRiScFn={approveRiSc}\n />\n <RiScRelationComponent />\n <RiskMatrix riScWithMetadata={selectedRiSc} />\n </Flex>\n </Grid>\n </Grid>\n </Grid>\n </>\n )}\n </Grid>\n </>\n )}\n\n {riScDialogState !== RiScDialogStates.Closed && (\n <RiScDialog\n onClose={closeRiScDialog}\n dialogState={riScDialogState}\n onDelete={openDeleteRiScDialog}\n />\n )}\n\n {!scenarioWizardStep && <ScenarioDrawer />}\n </>\n );\n}\n"],"names":[],"mappings":"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"}
@@ -1,10 +1,8 @@
1
1
  import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
2
2
  import { useTranslationRef } from '@backstage/core-plugin-api/alpha';
3
3
  import DeleteIcon from '@mui/icons-material/Delete';
4
- import { AlertTitle } from '@mui/material';
5
- import AlertBar from '../common/AlertBar/AlertBar.esm.js';
6
4
  import Box from '@mui/material/Box';
7
- import { Button, Flex, Text } from '@backstage/ui';
5
+ import { Button, Flex } from '@backstage/ui';
8
6
  import CircularProgress from '@mui/material/CircularProgress';
9
7
  import Drawer from '@mui/material/Drawer';
10
8
  import { useState, useRef, useEffect } from 'react';
@@ -12,8 +10,7 @@ import { useForm } from 'react-hook-form';
12
10
  import { useRiScs } from '../../contexts/RiScContext.esm.js';
13
11
  import { useScenario } from '../../contexts/ScenarioContext.esm.js';
14
12
  import { pluginRiScTranslationRef } from '../../utils/translations.esm.js';
15
- import { ProcessingStatus } from '../../utils/types.esm.js';
16
- import { getAlertSeverity, deleteScenario } from '../../utils/utilityfunctions.esm.js';
13
+ import { deleteScenario } from '../../utils/utilityfunctions.esm.js';
17
14
  import { MatrixDialog } from '../riScDialog/MatrixDialog.esm.js';
18
15
  import { CloseConfirmation } from '../scenarioWizard/components/CloseConfirmation.esm.js';
19
16
  import { ActionsSection } from './components/ActionsSection.esm.js';
@@ -24,6 +21,7 @@ import { useBackstageContext } from '../../contexts/BackstageContext.esm.js';
24
21
  import styles from '../common/alertBar.module.css.esm.js';
25
22
  import { ScopeSection } from './components/ScopeSection.esm.js';
26
23
  import { RiskSection } from './components/RiskSection.esm.js';
24
+ import AlertBar from '../common/AlertBar/AlertBar.esm.js';
27
25
 
28
26
  function ScenarioDrawer() {
29
27
  const { profileInfo } = useBackstageContext();
@@ -150,26 +148,12 @@ function ScenarioDrawer() {
150
148
  }
151
149
  )
152
150
  ] }) : /* @__PURE__ */ jsxs(Fragment, { children: [
153
- updateStatus.isLoading && /* @__PURE__ */ jsx(Flex, { className: styles.alertBarBox, children: /* @__PURE__ */ jsx(
154
- AlertBar,
155
- {
156
- className: styles.alertBar,
157
- severity: "info",
158
- alertProps: {
159
- icon: /* @__PURE__ */ jsx(CircularProgress, { size: 16, sx: { color: "inherit" } })
160
- },
161
- children: /* @__PURE__ */ jsxs(Fragment, { children: [
162
- /* @__PURE__ */ jsx(AlertTitle, { children: t("infoMessages.UpdateAction") }),
163
- /* @__PURE__ */ jsx(Text, { variant: "body-large", children: t("infoMessages.UpdateInfoMessage") })
164
- ] })
165
- }
166
- ) }),
167
- !updateStatus.isLoading && updateStatus.isSuccess && response && response.status !== ProcessingStatus.ErrorWhenFetchingRiScs && /* @__PURE__ */ jsx(Flex, { className: styles.alertBarBox, children: /* @__PURE__ */ jsx(
151
+ /* @__PURE__ */ jsx(Flex, { className: styles.alertBarBox, children: /* @__PURE__ */ jsx(
168
152
  AlertBar,
169
153
  {
170
- className: styles.alertBar,
171
- severity: getAlertSeverity(updateStatus, response),
172
- children: /* @__PURE__ */ jsx(Text, { variant: "body-large", children: response?.statusMessage })
154
+ updateStatus,
155
+ response,
156
+ statusText: response?.statusMessage
173
157
  }
174
158
  ) }),
175
159
  /* @__PURE__ */ jsx(ScopeSection, {}),
@@ -1 +1 @@
1
- {"version":3,"file":"ScenarioDrawer.esm.js","sources":["../../../src/components/scenarioDrawer/ScenarioDrawer.tsx"],"sourcesContent":["import { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport DeleteIcon from '@mui/icons-material/Delete';\nimport { AlertTitle } from '@mui/material';\nimport AlertBar from '../common/AlertBar/AlertBar';\nimport Box from '@mui/material/Box';\nimport { Button } from '@backstage/ui';\nimport CircularProgress from '@mui/material/CircularProgress';\nimport Drawer from '@mui/material/Drawer';\nimport { useEffect, useRef, useState } from 'react';\nimport { useForm } from 'react-hook-form';\nimport { useRiScs } from '../../contexts/RiScContext';\nimport { useScenario } from '../../contexts/ScenarioContext';\nimport { pluginRiScTranslationRef } from '../../utils/translations';\nimport { FormScenario, ProcessingStatus } from '../../utils/types';\nimport { deleteScenario, getAlertSeverity } from '../../utils/utilityfunctions';\nimport { MatrixDialog } from '../riScDialog/MatrixDialog';\nimport { CloseConfirmation } from '../scenarioWizard/components/CloseConfirmation';\nimport { ActionsSection } from './components/ActionsSection';\nimport { DeleteScenarioConfirmation } from './components/DeleteConfirmation';\nimport RiskFormSection from './components/RiskFormSection';\nimport ScopeFormSection from './components/ScopeFormSection';\nimport { Text, Flex } from '@backstage/ui';\nimport { useBackstageContext } from '../../contexts/BackstageContext.tsx';\nimport styles from '../common/alertBar.module.css';\nimport { ScopeSection } from './components/ScopeSection.tsx';\nimport { RiskSection } from './components/RiskSection.tsx';\n\nexport function ScenarioDrawer() {\n const { profileInfo } = useBackstageContext();\n const { t } = useTranslationRef(pluginRiScTranslationRef);\n const [isEditing, setIsEditing] = useState(false);\n const {\n scenario,\n isDrawerOpen,\n isEditingAllowed,\n closeScenarioForm,\n submitEditedScenarioToRiSc,\n mapScenarioToFormScenario,\n mapFormScenarioToScenario,\n collapseAllActions,\n } = useScenario();\n const { selectedRiSc, updateRiSc } = useRiScs();\n\n const [deleteConfirmationIsOpen, setDeleteConfirmationIsOpen] =\n useState(false);\n\n const [showCloseConfirmation, setShowCloseConfirmation] = useState(false);\n\n const [isMatrixDialogOpen, setIsMatrixDialogOpen] = useState<boolean>(false);\n\n const { updateStatus, response } = useRiScs();\n\n const [currentUpdatedActionIDs, setCurrentUpdatedActionIDs] = useState<\n string[]\n >([]);\n\n // Used to scroll to the bottom of the drawer when the user deletes a scenario\n // via the quick edit and DeleteConfirmation\n const deleteScenarioRef = useRef<HTMLDivElement>(null);\n\n const formMethods = useForm<FormScenario>({\n defaultValues: mapScenarioToFormScenario(scenario),\n mode: 'onChange',\n });\n\n function onCancel() {\n formMethods.reset(mapScenarioToFormScenario(scenario));\n setIsEditing(false);\n }\n\n function handleClose() {\n closeScenarioForm();\n setIsEditing(false);\n setShowCloseConfirmation(false);\n collapseAllActions();\n }\n\n function onClose() {\n if (formMethods.formState.isDirty) {\n setShowCloseConfirmation(true);\n } else {\n closeScenarioForm();\n setIsEditing(false);\n collapseAllActions();\n }\n }\n\n const onSubmit = formMethods.handleSubmit((data: FormScenario) => {\n submitEditedScenarioToRiSc(mapFormScenarioToScenario(data), {\n onSuccess: () => {\n setCurrentUpdatedActionIDs([]);\n setIsEditing(false);\n },\n idsOfActionsToForceUpdateLastUpdatedValue: currentUpdatedActionIDs,\n profileInfo: profileInfo,\n });\n });\n\n function onSubmitAndCloseDialog() {\n onSubmit();\n setShowCloseConfirmation(false);\n\n if (deleteScenarioRef.current) {\n deleteScenarioRef.current.scrollIntoView({ behavior: 'smooth' });\n }\n }\n\n useEffect(() => {\n formMethods.reset(mapScenarioToFormScenario(scenario));\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [scenario]);\n\n return (\n <Drawer\n PaperProps={{\n sx: theme => ({\n padding: theme.spacing(4),\n width: '50%',\n gap: theme.spacing(3),\n [theme.breakpoints.down('sm')]: {\n width: '90%',\n padding: theme.spacing(2),\n },\n backgroundColor:\n theme.palette.mode === 'dark' ? '#333333' : '#f8f8f8',\n }),\n }}\n variant=\"temporary\"\n ModalProps={{ sx: { zIndex: 100 } }}\n anchor=\"right\"\n open={isDrawerOpen}\n onClose={onClose}\n >\n <Box\n sx={{\n display: 'flex',\n gap: '16px',\n marginLeft: 'auto',\n }}\n >\n {!isEditing && isEditingAllowed && (\n <Button\n size=\"medium\"\n variant=\"primary\"\n onClick={() => setIsEditing(true)}\n >\n {t('dictionary.edit')}\n </Button>\n )}\n <Button\n size=\"medium\"\n variant=\"secondary\"\n onClick={isEditing ? onCancel : onClose}\n >\n {t(isEditing ? 'dictionary.cancel' : 'dictionary.close')}\n </Button>\n </Box>\n\n {isEditing ? (\n <>\n <ScopeFormSection formMethods={formMethods} />\n <RiskFormSection\n formMethods={formMethods}\n setIsMatrixDialogOpen={setIsMatrixDialogOpen}\n />\n </>\n ) : (\n <>\n {updateStatus.isLoading && (\n <Flex className={styles.alertBarBox}>\n <AlertBar\n className={styles.alertBar}\n severity=\"info\"\n alertProps={{\n icon: (\n <CircularProgress size={16} sx={{ color: 'inherit' }} />\n ),\n }}\n >\n <>\n <AlertTitle>{t('infoMessages.UpdateAction')}</AlertTitle>\n <Text variant=\"body-large\">\n {t('infoMessages.UpdateInfoMessage')}\n </Text>\n </>\n </AlertBar>\n </Flex>\n )}\n {!updateStatus.isLoading &&\n updateStatus.isSuccess &&\n response &&\n response.status !== ProcessingStatus.ErrorWhenFetchingRiScs && (\n <Flex className={styles.alertBarBox}>\n <AlertBar\n className={styles.alertBar}\n severity={getAlertSeverity(updateStatus, response)}\n >\n <Text variant=\"body-large\">{response?.statusMessage}</Text>\n </AlertBar>\n </Flex>\n )}\n <ScopeSection />\n <RiskSection />\n </>\n )}\n\n <ActionsSection formMethods={formMethods} isEditing={isEditing} />\n <Box\n sx={{\n display: 'flex',\n gap: '16px',\n }}\n >\n {isEditing && (\n <Button\n size=\"medium\"\n variant=\"primary\"\n onClick={onSubmit}\n isDisabled={\n !formMethods.formState.isDirty || updateStatus.isLoading\n }\n >\n {t('dictionary.save')}\n {updateStatus.isLoading && (\n <CircularProgress\n size={16}\n sx={{ marginLeft: 1, color: 'inherit' }}\n />\n )}\n </Button>\n )}\n {isEditingAllowed && (\n <div ref={deleteScenarioRef}>\n <Button\n iconStart={<DeleteIcon />}\n size=\"medium\"\n variant=\"tertiary\"\n onClick={() => setDeleteConfirmationIsOpen(true)}\n >\n {t('scenarioDrawer.deleteScenarioButton')}\n </Button>\n </div>\n )}\n </Box>\n\n <DeleteScenarioConfirmation\n isOpen={deleteConfirmationIsOpen}\n setIsOpen={setDeleteConfirmationIsOpen}\n onConfirm={() => deleteScenario(selectedRiSc, updateRiSc, scenario)}\n />\n <MatrixDialog\n open={isMatrixDialogOpen}\n close={() => setIsMatrixDialogOpen(false)}\n />\n <CloseConfirmation\n isOpen={showCloseConfirmation}\n close={handleClose}\n save={onSubmitAndCloseDialog}\n />\n </Drawer>\n );\n}\n"],"names":["RiskFormSection"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AA2BO,SAAS,cAAA,GAAiB;AAC/B,EAAA,MAAM,EAAE,WAAA,EAAY,GAAI,mBAAA,EAAoB;AAC5C,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,iBAAA,CAAkB,wBAAwB,CAAA;AACxD,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAI,SAAS,KAAK,CAAA;AAChD,EAAA,MAAM;AAAA,IACJ,QAAA;AAAA,IACA,YAAA;AAAA,IACA,gBAAA;AAAA,IACA,iBAAA;AAAA,IACA,0BAAA;AAAA,IACA,yBAAA;AAAA,IACA,yBAAA;AAAA,IACA;AAAA,MACE,WAAA,EAAY;AAChB,EAAA,MAAM,EAAE,YAAA,EAAc,UAAA,EAAW,GAAI,QAAA,EAAS;AAE9C,EAAA,MAAM,CAAC,wBAAA,EAA0B,2BAA2B,CAAA,GAC1D,SAAS,KAAK,CAAA;AAEhB,EAAA,MAAM,CAAC,qBAAA,EAAuB,wBAAwB,CAAA,GAAI,SAAS,KAAK,CAAA;AAExE,EAAA,MAAM,CAAC,kBAAA,EAAoB,qBAAqB,CAAA,GAAI,SAAkB,KAAK,CAAA;AAE3E,EAAA,MAAM,EAAE,YAAA,EAAc,QAAA,EAAS,GAAI,QAAA,EAAS;AAE5C,EAAA,MAAM,CAAC,uBAAA,EAAyB,0BAA0B,CAAA,GAAI,QAAA,CAE5D,EAAE,CAAA;AAIJ,EAAA,MAAM,iBAAA,GAAoB,OAAuB,IAAI,CAAA;AAErD,EAAA,MAAM,cAAc,OAAA,CAAsB;AAAA,IACxC,aAAA,EAAe,0BAA0B,QAAQ,CAAA;AAAA,IACjD,IAAA,EAAM;AAAA,GACP,CAAA;AAED,EAAA,SAAS,QAAA,GAAW;AAClB,IAAA,WAAA,CAAY,KAAA,CAAM,yBAAA,CAA0B,QAAQ,CAAC,CAAA;AACrD,IAAA,YAAA,CAAa,KAAK,CAAA;AAAA,EACpB;AAEA,EAAA,SAAS,WAAA,GAAc;AACrB,IAAA,iBAAA,EAAkB;AAClB,IAAA,YAAA,CAAa,KAAK,CAAA;AAClB,IAAA,wBAAA,CAAyB,KAAK,CAAA;AAC9B,IAAA,kBAAA,EAAmB;AAAA,EACrB;AAEA,EAAA,SAAS,OAAA,GAAU;AACjB,IAAA,IAAI,WAAA,CAAY,UAAU,OAAA,EAAS;AACjC,MAAA,wBAAA,CAAyB,IAAI,CAAA;AAAA,IAC/B,CAAA,MAAO;AACL,MAAA,iBAAA,EAAkB;AAClB,MAAA,YAAA,CAAa,KAAK,CAAA;AAClB,MAAA,kBAAA,EAAmB;AAAA,IACrB;AAAA,EACF;AAEA,EAAA,MAAM,QAAA,GAAW,WAAA,CAAY,YAAA,CAAa,CAAC,IAAA,KAAuB;AAChE,IAAA,0BAAA,CAA2B,yBAAA,CAA0B,IAAI,CAAA,EAAG;AAAA,MAC1D,WAAW,MAAM;AACf,QAAA,0BAAA,CAA2B,EAAE,CAAA;AAC7B,QAAA,YAAA,CAAa,KAAK,CAAA;AAAA,MACpB,CAAA;AAAA,MACA,yCAAA,EAA2C,uBAAA;AAAA,MAC3C;AAAA,KACD,CAAA;AAAA,EACH,CAAC,CAAA;AAED,EAAA,SAAS,sBAAA,GAAyB;AAChC,IAAA,QAAA,EAAS;AACT,IAAA,wBAAA,CAAyB,KAAK,CAAA;AAE9B,IAAA,IAAI,kBAAkB,OAAA,EAAS;AAC7B,MAAA,iBAAA,CAAkB,OAAA,CAAQ,cAAA,CAAe,EAAE,QAAA,EAAU,UAAU,CAAA;AAAA,IACjE;AAAA,EACF;AAEA,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,WAAA,CAAY,KAAA,CAAM,yBAAA,CAA0B,QAAQ,CAAC,CAAA;AAAA,EAEvD,CAAA,EAAG,CAAC,QAAQ,CAAC,CAAA;AAEb,EAAA,uBACE,IAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,UAAA,EAAY;AAAA,QACV,IAAI,CAAA,KAAA,MAAU;AAAA,UACZ,OAAA,EAAS,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA;AAAA,UACxB,KAAA,EAAO,KAAA;AAAA,UACP,GAAA,EAAK,KAAA,CAAM,OAAA,CAAQ,CAAC,CAAA;AAAA,UACpB,CAAC,KAAA,CAAM,WAAA,CAAY,IAAA,CAAK,IAAI,CAAC,GAAG;AAAA,YAC9B,KAAA,EAAO,KAAA;AAAA,YACP,OAAA,EAAS,KAAA,CAAM,OAAA,CAAQ,CAAC;AAAA,WAC1B;AAAA,UACA,eAAA,EACE,KAAA,CAAM,OAAA,CAAQ,IAAA,KAAS,SAAS,SAAA,GAAY;AAAA,SAChD;AAAA,OACF;AAAA,MACA,OAAA,EAAQ,WAAA;AAAA,MACR,YAAY,EAAE,EAAA,EAAI,EAAE,MAAA,EAAQ,KAAI,EAAE;AAAA,MAClC,MAAA,EAAO,OAAA;AAAA,MACP,IAAA,EAAM,YAAA;AAAA,MACN,OAAA;AAAA,MAEA,QAAA,EAAA;AAAA,wBAAA,IAAA;AAAA,UAAC,GAAA;AAAA,UAAA;AAAA,YACC,EAAA,EAAI;AAAA,cACF,OAAA,EAAS,MAAA;AAAA,cACT,GAAA,EAAK,MAAA;AAAA,cACL,UAAA,EAAY;AAAA,aACd;AAAA,YAEC,QAAA,EAAA;AAAA,cAAA,CAAC,aAAa,gBAAA,oBACb,GAAA;AAAA,gBAAC,MAAA;AAAA,gBAAA;AAAA,kBACC,IAAA,EAAK,QAAA;AAAA,kBACL,OAAA,EAAQ,SAAA;AAAA,kBACR,OAAA,EAAS,MAAM,YAAA,CAAa,IAAI,CAAA;AAAA,kBAE/B,YAAE,iBAAiB;AAAA;AAAA,eACtB;AAAA,8BAEF,GAAA;AAAA,gBAAC,MAAA;AAAA,gBAAA;AAAA,kBACC,IAAA,EAAK,QAAA;AAAA,kBACL,OAAA,EAAQ,WAAA;AAAA,kBACR,OAAA,EAAS,YAAY,QAAA,GAAW,OAAA;AAAA,kBAE/B,QAAA,EAAA,CAAA,CAAE,SAAA,GAAY,mBAAA,GAAsB,kBAAkB;AAAA;AAAA;AACzD;AAAA;AAAA,SACF;AAAA,QAEC,4BACC,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,oBAAiB,WAAA,EAA0B,CAAA;AAAA,0BAC5C,GAAA;AAAA,YAACA,YAAA;AAAA,YAAA;AAAA,cACC,WAAA;AAAA,cACA;AAAA;AAAA;AACF,SAAA,EACF,oBAEA,IAAA,CAAA,QAAA,EAAA,EACG,QAAA,EAAA;AAAA,UAAA,YAAA,CAAa,SAAA,oBACZ,GAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAW,OAAO,WAAA,EACtB,QAAA,kBAAA,GAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,WAAW,MAAA,CAAO,QAAA;AAAA,cAClB,QAAA,EAAS,MAAA;AAAA,cACT,UAAA,EAAY;AAAA,gBACV,IAAA,sBACG,gBAAA,EAAA,EAAiB,IAAA,EAAM,IAAI,EAAA,EAAI,EAAE,KAAA,EAAO,SAAA,EAAU,EAAG;AAAA,eAE1D;AAAA,cAEA,QAAA,kBAAA,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,gCAAA,GAAA,CAAC,UAAA,EAAA,EAAY,QAAA,EAAA,CAAA,CAAE,2BAA2B,CAAA,EAAE,CAAA;AAAA,oCAC3C,IAAA,EAAA,EAAK,OAAA,EAAQ,YAAA,EACX,QAAA,EAAA,CAAA,CAAE,gCAAgC,CAAA,EACrC;AAAA,eAAA,EACF;AAAA;AAAA,WACF,EACF,CAAA;AAAA,UAED,CAAC,YAAA,CAAa,SAAA,IACb,YAAA,CAAa,aACb,QAAA,IACA,QAAA,CAAS,MAAA,KAAW,gBAAA,CAAiB,sBAAA,oBACnC,GAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAW,OAAO,WAAA,EACtB,QAAA,kBAAA,GAAA;AAAA,YAAC,QAAA;AAAA,YAAA;AAAA,cACC,WAAW,MAAA,CAAO,QAAA;AAAA,cAClB,QAAA,EAAU,gBAAA,CAAiB,YAAA,EAAc,QAAQ,CAAA;AAAA,cAEjD,QAAA,kBAAA,GAAA,CAAC,IAAA,EAAA,EAAK,OAAA,EAAQ,YAAA,EAAc,oBAAU,aAAA,EAAc;AAAA;AAAA,WACtD,EACF,CAAA;AAAA,8BAEH,YAAA,EAAA,EAAa,CAAA;AAAA,8BACb,WAAA,EAAA,EAAY;AAAA,SAAA,EACf,CAAA;AAAA,wBAGF,GAAA,CAAC,cAAA,EAAA,EAAe,WAAA,EAA0B,SAAA,EAAsB,CAAA;AAAA,wBAChE,IAAA;AAAA,UAAC,GAAA;AAAA,UAAA;AAAA,YACC,EAAA,EAAI;AAAA,cACF,OAAA,EAAS,MAAA;AAAA,cACT,GAAA,EAAK;AAAA,aACP;AAAA,YAEC,QAAA,EAAA;AAAA,cAAA,SAAA,oBACC,IAAA;AAAA,gBAAC,MAAA;AAAA,gBAAA;AAAA,kBACC,IAAA,EAAK,QAAA;AAAA,kBACL,OAAA,EAAQ,SAAA;AAAA,kBACR,OAAA,EAAS,QAAA;AAAA,kBACT,UAAA,EACE,CAAC,WAAA,CAAY,SAAA,CAAU,WAAW,YAAA,CAAa,SAAA;AAAA,kBAGhD,QAAA,EAAA;AAAA,oBAAA,CAAA,CAAE,iBAAiB,CAAA;AAAA,oBACnB,aAAa,SAAA,oBACZ,GAAA;AAAA,sBAAC,gBAAA;AAAA,sBAAA;AAAA,wBACC,IAAA,EAAM,EAAA;AAAA,wBACN,EAAA,EAAI,EAAE,UAAA,EAAY,CAAA,EAAG,OAAO,SAAA;AAAU;AAAA;AACxC;AAAA;AAAA,eAEJ;AAAA,cAED,gBAAA,oBACC,GAAA,CAAC,KAAA,EAAA,EAAI,GAAA,EAAK,iBAAA,EACR,QAAA,kBAAA,GAAA;AAAA,gBAAC,MAAA;AAAA,gBAAA;AAAA,kBACC,SAAA,sBAAY,UAAA,EAAA,EAAW,CAAA;AAAA,kBACvB,IAAA,EAAK,QAAA;AAAA,kBACL,OAAA,EAAQ,UAAA;AAAA,kBACR,OAAA,EAAS,MAAM,2BAAA,CAA4B,IAAI,CAAA;AAAA,kBAE9C,YAAE,qCAAqC;AAAA;AAAA,eAC1C,EACF;AAAA;AAAA;AAAA,SAEJ;AAAA,wBAEA,GAAA;AAAA,UAAC,0BAAA;AAAA,UAAA;AAAA,YACC,MAAA,EAAQ,wBAAA;AAAA,YACR,SAAA,EAAW,2BAAA;AAAA,YACX,SAAA,EAAW,MAAM,cAAA,CAAe,YAAA,EAAc,YAAY,QAAQ;AAAA;AAAA,SACpE;AAAA,wBACA,GAAA;AAAA,UAAC,YAAA;AAAA,UAAA;AAAA,YACC,IAAA,EAAM,kBAAA;AAAA,YACN,KAAA,EAAO,MAAM,qBAAA,CAAsB,KAAK;AAAA;AAAA,SAC1C;AAAA,wBACA,GAAA;AAAA,UAAC,iBAAA;AAAA,UAAA;AAAA,YACC,MAAA,EAAQ,qBAAA;AAAA,YACR,KAAA,EAAO,WAAA;AAAA,YACP,IAAA,EAAM;AAAA;AAAA;AACR;AAAA;AAAA,GACF;AAEJ;;;;"}
1
+ {"version":3,"file":"ScenarioDrawer.esm.js","sources":["../../../src/components/scenarioDrawer/ScenarioDrawer.tsx"],"sourcesContent":["import { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport DeleteIcon from '@mui/icons-material/Delete';\nimport Box from '@mui/material/Box';\nimport { Button } from '@backstage/ui';\nimport CircularProgress from '@mui/material/CircularProgress';\nimport Drawer from '@mui/material/Drawer';\nimport { useEffect, useRef, useState } from 'react';\nimport { useForm } from 'react-hook-form';\nimport { useRiScs } from '../../contexts/RiScContext';\nimport { useScenario } from '../../contexts/ScenarioContext';\nimport { pluginRiScTranslationRef } from '../../utils/translations';\nimport { FormScenario } from '../../utils/types';\nimport { deleteScenario } from '../../utils/utilityfunctions';\nimport { MatrixDialog } from '../riScDialog/MatrixDialog';\nimport { CloseConfirmation } from '../scenarioWizard/components/CloseConfirmation';\nimport { ActionsSection } from './components/ActionsSection';\nimport { DeleteScenarioConfirmation } from './components/DeleteConfirmation';\nimport RiskFormSection from './components/RiskFormSection';\nimport ScopeFormSection from './components/ScopeFormSection';\nimport { Flex } from '@backstage/ui';\nimport { useBackstageContext } from '../../contexts/BackstageContext.tsx';\nimport styles from '../common/alertBar.module.css';\nimport { ScopeSection } from './components/ScopeSection.tsx';\nimport { RiskSection } from './components/RiskSection.tsx';\nimport AlertBar from '../common/AlertBar/AlertBar.tsx';\n\nexport function ScenarioDrawer() {\n const { profileInfo } = useBackstageContext();\n const { t } = useTranslationRef(pluginRiScTranslationRef);\n const [isEditing, setIsEditing] = useState(false);\n const {\n scenario,\n isDrawerOpen,\n isEditingAllowed,\n closeScenarioForm,\n submitEditedScenarioToRiSc,\n mapScenarioToFormScenario,\n mapFormScenarioToScenario,\n collapseAllActions,\n } = useScenario();\n const { selectedRiSc, updateRiSc } = useRiScs();\n\n const [deleteConfirmationIsOpen, setDeleteConfirmationIsOpen] =\n useState(false);\n\n const [showCloseConfirmation, setShowCloseConfirmation] = useState(false);\n\n const [isMatrixDialogOpen, setIsMatrixDialogOpen] = useState<boolean>(false);\n\n const { updateStatus, response } = useRiScs();\n\n const [currentUpdatedActionIDs, setCurrentUpdatedActionIDs] = useState<\n string[]\n >([]);\n\n // Used to scroll to the bottom of the drawer when the user deletes a scenario\n // via the quick edit and DeleteConfirmation\n const deleteScenarioRef = useRef<HTMLDivElement>(null);\n\n const formMethods = useForm<FormScenario>({\n defaultValues: mapScenarioToFormScenario(scenario),\n mode: 'onChange',\n });\n\n function onCancel() {\n formMethods.reset(mapScenarioToFormScenario(scenario));\n setIsEditing(false);\n }\n\n function handleClose() {\n closeScenarioForm();\n setIsEditing(false);\n setShowCloseConfirmation(false);\n collapseAllActions();\n }\n\n function onClose() {\n if (formMethods.formState.isDirty) {\n setShowCloseConfirmation(true);\n } else {\n closeScenarioForm();\n setIsEditing(false);\n collapseAllActions();\n }\n }\n\n const onSubmit = formMethods.handleSubmit((data: FormScenario) => {\n submitEditedScenarioToRiSc(mapFormScenarioToScenario(data), {\n onSuccess: () => {\n setCurrentUpdatedActionIDs([]);\n setIsEditing(false);\n },\n idsOfActionsToForceUpdateLastUpdatedValue: currentUpdatedActionIDs,\n profileInfo: profileInfo,\n });\n });\n\n function onSubmitAndCloseDialog() {\n onSubmit();\n setShowCloseConfirmation(false);\n\n if (deleteScenarioRef.current) {\n deleteScenarioRef.current.scrollIntoView({ behavior: 'smooth' });\n }\n }\n\n useEffect(() => {\n formMethods.reset(mapScenarioToFormScenario(scenario));\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [scenario]);\n\n return (\n <Drawer\n PaperProps={{\n sx: theme => ({\n padding: theme.spacing(4),\n width: '50%',\n gap: theme.spacing(3),\n [theme.breakpoints.down('sm')]: {\n width: '90%',\n padding: theme.spacing(2),\n },\n backgroundColor:\n theme.palette.mode === 'dark' ? '#333333' : '#f8f8f8',\n }),\n }}\n variant=\"temporary\"\n ModalProps={{ sx: { zIndex: 100 } }}\n anchor=\"right\"\n open={isDrawerOpen}\n onClose={onClose}\n >\n <Box\n sx={{\n display: 'flex',\n gap: '16px',\n marginLeft: 'auto',\n }}\n >\n {!isEditing && isEditingAllowed && (\n <Button\n size=\"medium\"\n variant=\"primary\"\n onClick={() => setIsEditing(true)}\n >\n {t('dictionary.edit')}\n </Button>\n )}\n <Button\n size=\"medium\"\n variant=\"secondary\"\n onClick={isEditing ? onCancel : onClose}\n >\n {t(isEditing ? 'dictionary.cancel' : 'dictionary.close')}\n </Button>\n </Box>\n\n {isEditing ? (\n <>\n <ScopeFormSection formMethods={formMethods} />\n <RiskFormSection\n formMethods={formMethods}\n setIsMatrixDialogOpen={setIsMatrixDialogOpen}\n />\n </>\n ) : (\n <>\n <Flex className={styles.alertBarBox}>\n <AlertBar\n updateStatus={updateStatus}\n response={response}\n statusText={response?.statusMessage}\n />\n </Flex>\n <ScopeSection />\n <RiskSection />\n </>\n )}\n <ActionsSection formMethods={formMethods} isEditing={isEditing} />\n <Box\n sx={{\n display: 'flex',\n gap: '16px',\n }}\n >\n {isEditing && (\n <Button\n size=\"medium\"\n variant=\"primary\"\n onClick={onSubmit}\n isDisabled={\n !formMethods.formState.isDirty || updateStatus.isLoading\n }\n >\n {t('dictionary.save')}\n {updateStatus.isLoading && (\n <CircularProgress\n size={16}\n sx={{ marginLeft: 1, color: 'inherit' }}\n />\n )}\n </Button>\n )}\n {isEditingAllowed && (\n <div ref={deleteScenarioRef}>\n <Button\n iconStart={<DeleteIcon />}\n size=\"medium\"\n variant=\"tertiary\"\n onClick={() => setDeleteConfirmationIsOpen(true)}\n >\n {t('scenarioDrawer.deleteScenarioButton')}\n </Button>\n </div>\n )}\n </Box>\n\n <DeleteScenarioConfirmation\n isOpen={deleteConfirmationIsOpen}\n setIsOpen={setDeleteConfirmationIsOpen}\n onConfirm={() => deleteScenario(selectedRiSc, updateRiSc, scenario)}\n />\n <MatrixDialog\n open={isMatrixDialogOpen}\n close={() => setIsMatrixDialogOpen(false)}\n />\n <CloseConfirmation\n isOpen={showCloseConfirmation}\n close={handleClose}\n save={onSubmitAndCloseDialog}\n />\n </Drawer>\n );\n}\n"],"names":["RiskFormSection"],"mappings":"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"}
@@ -221,6 +221,11 @@ function RiScProvider({ children }) {
221
221
  function createNewRiSc(riSc, generateInitialRisc, defaultRiScId) {
222
222
  setIsFetching(true);
223
223
  setSelectedRiSc(null);
224
+ dispatch({
225
+ type: "SET_BOTH",
226
+ updateStatus: { isLoading: true, isError: false, isSuccess: false },
227
+ response: null
228
+ });
224
229
  const newRiSc = {
225
230
  ...riSc};
226
231
  postRiScs(
@@ -278,8 +283,9 @@ function RiScProvider({ children }) {
278
283
  };
279
284
  const originalRiSc = selectedRiSc;
280
285
  dispatch({
281
- type: "SET_STATUS",
282
- updateStatus: { isLoading: true, isError: false, isSuccess: false }
286
+ type: "SET_BOTH",
287
+ updateStatus: { isLoading: true, isError: false, isSuccess: false },
288
+ response: null
283
289
  });
284
290
  deleteRiScs(
285
291
  selectedRiSc.id,
@@ -350,8 +356,9 @@ function RiScProvider({ children }) {
350
356
  const originalRiSc = selectedRiSc;
351
357
  setSelectedRiSc(updatedRiSc);
352
358
  dispatch({
353
- type: "SET_STATUS",
354
- updateStatus: { isLoading: true, isError: false, isSuccess: false }
359
+ type: "SET_BOTH",
360
+ updateStatus: { isLoading: true, isError: false, isSuccess: false },
361
+ response: null
355
362
  });
356
363
  putRiScs(
357
364
  updatedRiSc,
@@ -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 ProcessingStatus,\n RiScStatus,\n RiScWithMetadata,\n SubmitResponseObject,\n} from '../utils/types';\nimport { useRouteRef } from '@backstage/core-plugin-api';\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 useAuthenticatedFetch,\n useGithubRepositoryInformation,\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 selectRiSc: (title: string) => void;\n selectedRiSc: RiScWithMetadata | 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 approveRiSc: () => void;\n updateStatus: UpdateStatus;\n resetRiScStatus: () => void;\n resetResponse: () => void;\n isFetching: boolean;\n isFetchingGcpCryptoKeys: boolean;\n failedToFetchGcpCryptoKeys: 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 [isRequesting, setIsRequesting] = useState<boolean>(false);\n const { t } = useTranslationRef(pluginRiScTranslationRef);\n const repoInfo = useGithubRepositoryInformation();\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 [selectedRiSc, setSelectedRiSc] = useState<RiScWithMetadata | null>(\n null,\n );\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\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 // 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 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 dispatch({\n type: 'SET_RESPONSE',\n response: {\n status: ProcessingStatus.ErrorWhenFetchingGcpCryptoKeys,\n statusMessage: loginRejected\n ? `${t('errorMessages.ErrorWhenFetchingGcpCryptoKeys')}. ${t(\n 'dictionary.rejectedLogin',\n )}`\n : t('errorMessages.ErrorWhenFetchingGcpCryptoKeys'),\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 fetchRiScs(\n res => {\n const fetchedRiScs: RiScWithMetadata[] = res\n .filter(risk => risk.status === ContentStatus.Success)\n .map(riScDTO => {\n const json = JSON.parse(riScDTO.riScContent) as RiScDTO;\n\n const content = dtoToRiSc(json);\n return {\n id: riScDTO.riScId,\n content: content,\n sopsConfig: riScDTO.sopsConfig,\n status: riScDTO.riScStatus,\n pullRequestUrl: riScDTO.pullRequestUrl,\n migrationStatus: riScDTO.migrationStatus,\n lastPublished: riScDTO.lastPublished,\n };\n });\n setRiScs(fetchedRiScs);\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: string[] = res\n .filter(risk => risk.status !== ContentStatus.Success)\n .map(risk => risk.riScId);\n\n if (errorRiScs.length > 0) {\n const errorRiScIds = errorRiScs.join(', ');\n dispatch({\n type: 'SET_RESPONSE',\n response: {\n statusMessage: t('errorMessages.ErrorWhenFetchingRiScs').concat(\n errorRiScIds,\n ),\n status: ProcessingStatus.ErrorWhenFetchingRiScs,\n },\n });\n }\n\n // If there are no RiScs, don't set a selected RiSc\n if (fetchedRiScs.length === 0) {\n return;\n }\n\n // If there is no RiSc ID in the URL, navigate to the first RiSc\n if (!riScIdFromParams) {\n navigate(getRiScPath({ riScId: fetchedRiScs[0].id }));\n return;\n }\n\n const riSc = fetchedRiScs.find(r => r.id === riScIdFromParams);\n\n // If there is an invalid RiSc ID in the URL, navigate to the first RiSc with error state\n if (!riSc) {\n navigate(getRiScPath({ riScId: fetchedRiScs[0].id }), {\n state: t('errorMessages.RiScDoesNotExist'),\n });\n return;\n }\n },\n loginRejected => {\n dispatch({\n type: 'SET_RESPONSE',\n response: {\n status: ProcessingStatus.ErrorWhenFetchingRiScs,\n statusMessage: loginRejected\n ? `${t('errorMessages.ErrorWhenFetchingRiScs')}. ${t(\n 'dictionary.rejectedLogin',\n )}`\n : t('errorMessages.ErrorWhenFetchingRiScs'),\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 based on URL\n useEffect(() => {\n if (riScIdFromParams) {\n const riSc = riScs?.find(r => r.id === riScIdFromParams);\n if (riSc) {\n setSelectedRiSc(riSc);\n }\n }\n }, [riScs, 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 selectRiSc(id: string) {\n const selectedRiScId = riScs?.find(riSc => riSc.id === id)?.id;\n if (selectedRiScId) {\n navigate(getRiScPath({ riScId: selectedRiScId }));\n }\n }\n\n function createNewRiSc(\n riSc: RiScWithMetadata,\n generateInitialRisc: boolean,\n defaultRiScId: string | undefined,\n ) {\n setIsFetching(true);\n setSelectedRiSc(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: loginRejected\n ? `${getTranslationKey('error', error.status, t, translationContext)}. ${t(\n 'dictionary.rejectedLogin',\n )}`\n : getTranslationKey('error', error.status, t, translationContext),\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_STATUS',\n updateStatus: { isLoading: true, isError: false, isSuccess: false },\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 } else {\n setSelectedRiSc(updatedRiSc);\n setRiScs(\n riScs.map(riSc =>\n riSc.id === selectedRiSc.id ? updatedRiSc : riSc,\n ),\n );\n }\n if (onSuccess) onSuccess();\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: loginRejected\n ? `${getTranslationKey('error', error.status, t, translationContext)}. ${t(\n 'dictionary.rejectedLogin',\n )}`\n : getTranslationKey(\n 'error',\n error.status,\n t,\n translationContext,\n ),\n },\n });\n setIsRequesting(false);\n if (onError) onError();\n },\n );\n }\n }\n\n function updateRiSc(\n riSc: RiScWithMetadata,\n onSuccess?: () => void,\n onError?: () => void,\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_STATUS',\n updateStatus: { isLoading: true, isError: false, isSuccess: false },\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: loginRejected\n ? `${getTranslationKey('error', error.status, t, translationContext)}. ${t(\n 'dictionary.rejectedLogin',\n )}`\n : getTranslationKey(\n 'error',\n error.status,\n t,\n translationContext,\n ),\n },\n });\n setIsRequesting(false);\n if (onError) onError();\n setSelectedRiSc(originalRiSc);\n },\n );\n }\n }\n\n const refetchRiScs = useCallback(() => {\n fetchRiScs(\n res => {\n const fetchedRiScs: RiScWithMetadata[] = res\n .filter(risk => risk.status === ContentStatus.Success)\n .map(riScDTO => {\n const json = JSON.parse(riScDTO.riScContent) as RiScDTO;\n const content = dtoToRiSc(json);\n return {\n id: riScDTO.riScId,\n content,\n sopsConfig: riScDTO.sopsConfig,\n status: riScDTO.riScStatus,\n pullRequestUrl: riScDTO.pullRequestUrl,\n migrationStatus: riScDTO.migrationStatus,\n lastPublished: riScDTO.lastPublished,\n };\n });\n\n setRiScs(fetchedRiScs);\n\n setSelectedRiSc(prev =>\n prev ? (fetchedRiScs.find(r => r.id === prev.id) ?? prev) : prev,\n );\n },\n loginRejected => {\n dispatch({\n type: 'SET_RESPONSE',\n response: {\n status: ProcessingStatus.ErrorWhenFetchingRiScs,\n statusMessage: loginRejected\n ? `${t('errorMessages.ErrorWhenFetchingRiScs')}. ${t('dictionary.rejectedLogin')}`\n : t('errorMessages.ErrorWhenFetchingRiScs'),\n },\n });\n },\n );\n }, [fetchRiScs, dispatch, t]);\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: loginRejected\n ? `${getTranslationKey('error', error.status, t, translationContext)}. ${t('dictionary.rejectedLogin')}`\n : getTranslationKey(\n 'error',\n error.status,\n t,\n translationContext,\n ),\n },\n });\n },\n );\n }\n }\n\n useEffect(() => {\n const s = selectedRiSc?.status;\n\n const shouldPoll =\n s === RiScStatus.SentForApproval ||\n s === RiScStatus.DeletionSentForApproval;\n\n if (!shouldPoll) {\n return undefined;\n }\n\n const id = window.setInterval(() => {\n refetchRiScs();\n }, 5000);\n\n return () => window.clearInterval(id);\n }, [selectedRiSc?.status, refetchRiScs]);\n\n const value = {\n riScs,\n selectRiSc,\n selectedRiSc,\n createNewRiSc,\n deleteRiSc,\n updateRiSc,\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: false,\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 useRef,\n useState,\n useReducer,\n} from 'react';\nimport {\n ContentStatus,\n ProcessingStatus,\n RiScStatus,\n RiScWithMetadata,\n SubmitResponseObject,\n} from '../utils/types';\nimport { useRouteRef } from '@backstage/core-plugin-api';\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 useAuthenticatedFetch,\n useGithubRepositoryInformation,\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 selectRiSc: (title: string) => void;\n selectedRiSc: RiScWithMetadata | 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 approveRiSc: () => void;\n updateStatus: UpdateStatus;\n resetRiScStatus: () => void;\n resetResponse: () => void;\n isFetching: boolean;\n isFetchingGcpCryptoKeys: boolean;\n failedToFetchGcpCryptoKeys: 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 [isRequesting, setIsRequesting] = useState<boolean>(false);\n const { t } = useTranslationRef(pluginRiScTranslationRef);\n const repoInfo = useGithubRepositoryInformation();\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 [selectedRiSc, setSelectedRiSc] = useState<RiScWithMetadata | null>(\n null,\n );\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\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 // 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 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 dispatch({\n type: 'SET_RESPONSE',\n response: {\n status: ProcessingStatus.ErrorWhenFetchingGcpCryptoKeys,\n statusMessage: loginRejected\n ? `${t('errorMessages.ErrorWhenFetchingGcpCryptoKeys')}. ${t(\n 'dictionary.rejectedLogin',\n )}`\n : t('errorMessages.ErrorWhenFetchingGcpCryptoKeys'),\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 fetchRiScs(\n res => {\n const fetchedRiScs: RiScWithMetadata[] = res\n .filter(risk => risk.status === ContentStatus.Success)\n .map(riScDTO => {\n const json = JSON.parse(riScDTO.riScContent) as RiScDTO;\n\n const content = dtoToRiSc(json);\n return {\n id: riScDTO.riScId,\n content: content,\n sopsConfig: riScDTO.sopsConfig,\n status: riScDTO.riScStatus,\n pullRequestUrl: riScDTO.pullRequestUrl,\n migrationStatus: riScDTO.migrationStatus,\n lastPublished: riScDTO.lastPublished,\n };\n });\n setRiScs(fetchedRiScs);\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: string[] = res\n .filter(risk => risk.status !== ContentStatus.Success)\n .map(risk => risk.riScId);\n\n if (errorRiScs.length > 0) {\n const errorRiScIds = errorRiScs.join(', ');\n dispatch({\n type: 'SET_RESPONSE',\n response: {\n statusMessage: t('errorMessages.ErrorWhenFetchingRiScs').concat(\n errorRiScIds,\n ),\n status: ProcessingStatus.ErrorWhenFetchingRiScs,\n },\n });\n }\n\n // If there are no RiScs, don't set a selected RiSc\n if (fetchedRiScs.length === 0) {\n return;\n }\n\n // If there is no RiSc ID in the URL, navigate to the first RiSc\n if (!riScIdFromParams) {\n navigate(getRiScPath({ riScId: fetchedRiScs[0].id }));\n return;\n }\n\n const riSc = fetchedRiScs.find(r => r.id === riScIdFromParams);\n\n // If there is an invalid RiSc ID in the URL, navigate to the first RiSc with error state\n if (!riSc) {\n navigate(getRiScPath({ riScId: fetchedRiScs[0].id }), {\n state: t('errorMessages.RiScDoesNotExist'),\n });\n return;\n }\n },\n loginRejected => {\n dispatch({\n type: 'SET_RESPONSE',\n response: {\n status: ProcessingStatus.ErrorWhenFetchingRiScs,\n statusMessage: loginRejected\n ? `${t('errorMessages.ErrorWhenFetchingRiScs')}. ${t(\n 'dictionary.rejectedLogin',\n )}`\n : t('errorMessages.ErrorWhenFetchingRiScs'),\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 based on URL\n useEffect(() => {\n if (riScIdFromParams) {\n const riSc = riScs?.find(r => r.id === riScIdFromParams);\n if (riSc) {\n setSelectedRiSc(riSc);\n }\n }\n }, [riScs, 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 selectRiSc(id: string) {\n const selectedRiScId = riScs?.find(riSc => riSc.id === id)?.id;\n if (selectedRiScId) {\n navigate(getRiScPath({ riScId: selectedRiScId }));\n }\n }\n\n function createNewRiSc(\n riSc: RiScWithMetadata,\n generateInitialRisc: boolean,\n defaultRiScId: string | undefined,\n ) {\n setIsFetching(true);\n setSelectedRiSc(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: loginRejected\n ? `${getTranslationKey('error', error.status, t, translationContext)}. ${t(\n 'dictionary.rejectedLogin',\n )}`\n : getTranslationKey('error', error.status, t, translationContext),\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 } else {\n setSelectedRiSc(updatedRiSc);\n setRiScs(\n riScs.map(riSc =>\n riSc.id === selectedRiSc.id ? updatedRiSc : riSc,\n ),\n );\n }\n if (onSuccess) onSuccess();\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: loginRejected\n ? `${getTranslationKey('error', error.status, t, translationContext)}. ${t(\n 'dictionary.rejectedLogin',\n )}`\n : getTranslationKey(\n 'error',\n error.status,\n t,\n translationContext,\n ),\n },\n });\n setIsRequesting(false);\n if (onError) onError();\n },\n );\n }\n }\n\n function updateRiSc(\n riSc: RiScWithMetadata,\n onSuccess?: () => void,\n onError?: () => void,\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: loginRejected\n ? `${getTranslationKey('error', error.status, t, translationContext)}. ${t(\n 'dictionary.rejectedLogin',\n )}`\n : getTranslationKey(\n 'error',\n error.status,\n t,\n translationContext,\n ),\n },\n });\n setIsRequesting(false);\n if (onError) onError();\n setSelectedRiSc(originalRiSc);\n },\n );\n }\n }\n\n const refetchRiScs = useCallback(() => {\n fetchRiScs(\n res => {\n const fetchedRiScs: RiScWithMetadata[] = res\n .filter(risk => risk.status === ContentStatus.Success)\n .map(riScDTO => {\n const json = JSON.parse(riScDTO.riScContent) as RiScDTO;\n const content = dtoToRiSc(json);\n return {\n id: riScDTO.riScId,\n content,\n sopsConfig: riScDTO.sopsConfig,\n status: riScDTO.riScStatus,\n pullRequestUrl: riScDTO.pullRequestUrl,\n migrationStatus: riScDTO.migrationStatus,\n lastPublished: riScDTO.lastPublished,\n };\n });\n\n setRiScs(fetchedRiScs);\n\n setSelectedRiSc(prev =>\n prev ? (fetchedRiScs.find(r => r.id === prev.id) ?? prev) : prev,\n );\n },\n loginRejected => {\n dispatch({\n type: 'SET_RESPONSE',\n response: {\n status: ProcessingStatus.ErrorWhenFetchingRiScs,\n statusMessage: loginRejected\n ? `${t('errorMessages.ErrorWhenFetchingRiScs')}. ${t('dictionary.rejectedLogin')}`\n : t('errorMessages.ErrorWhenFetchingRiScs'),\n },\n });\n },\n );\n }, [fetchRiScs, dispatch, t]);\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: loginRejected\n ? `${getTranslationKey('error', error.status, t, translationContext)}. ${t('dictionary.rejectedLogin')}`\n : getTranslationKey(\n 'error',\n error.status,\n t,\n translationContext,\n ),\n },\n });\n },\n );\n }\n }\n\n useEffect(() => {\n const s = selectedRiSc?.status;\n\n const shouldPoll =\n s === RiScStatus.SentForApproval ||\n s === RiScStatus.DeletionSentForApproval;\n\n if (!shouldPoll) {\n return undefined;\n }\n\n const id = window.setInterval(() => {\n refetchRiScs();\n }, 5000);\n\n return () => window.clearInterval(id);\n }, [selectedRiSc?.status, refetchRiScs]);\n\n const value = {\n riScs,\n selectRiSc,\n selectedRiSc,\n createNewRiSc,\n deleteRiSc,\n updateRiSc,\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: false,\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":";;;;;;;;;;;;;AAsEA,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,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;AAEhD,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,YAAA,EAAc,eAAe,CAAA,GAAI,QAAA;AAAA,IACtC;AAAA,GACF;AACA,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;AAgBjE,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;AAG3E,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,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,QAAA,CAAS;AAAA,UACP,IAAA,EAAM,cAAA;AAAA,UACN,QAAA,EAAU;AAAA,YACR,QAAQ,gBAAA,CAAiB,8BAAA;AAAA,YACzB,eAAe,aAAA,GACX,CAAA,EAAG,CAAA,CAAE,8CAA8C,CAAC,CAAA,EAAA,EAAK,CAAA;AAAA,cACvD;AAAA,aACD,CAAA,CAAA,GACD,CAAA,CAAE,8CAA8C;AAAA;AACtD,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,UAAA;AAAA,MACE,CAAA,GAAA,KAAO;AACL,QAAA,MAAM,YAAA,GAAmC,GAAA,CACtC,MAAA,CAAO,CAAA,IAAA,KAAQ,IAAA,CAAK,WAAW,aAAA,CAAc,OAAO,CAAA,CACpD,GAAA,CAAI,CAAA,OAAA,KAAW;AACd,UAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,WAAW,CAAA;AAE3C,UAAA,MAAM,OAAA,GAAU,UAAU,IAAI,CAAA;AAC9B,UAAA,OAAO;AAAA,YACL,IAAI,OAAA,CAAQ,MAAA;AAAA,YACZ,OAAA;AAAA,YACA,YAAY,OAAA,CAAQ,UAAA;AAAA,YACpB,QAAQ,OAAA,CAAQ,UAAA;AAAA,YAChB,gBAAgB,OAAA,CAAQ,cAAA;AAAA,YACxB,iBAAiB,OAAA,CAAQ,eAAA;AAAA,YACzB,eAAe,OAAA,CAAQ;AAAA,WACzB;AAAA,QACF,CAAC,CAAA;AACH,QAAA,QAAA,CAAS,YAAY,CAAA;AACrB,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,MAAM,UAAA,GAAuB,GAAA,CAC1B,MAAA,CAAO,CAAA,IAAA,KAAQ,IAAA,CAAK,MAAA,KAAW,aAAA,CAAc,OAAO,CAAA,CACpD,GAAA,CAAI,CAAA,IAAA,KAAQ,IAAA,CAAK,MAAM,CAAA;AAE1B,QAAA,IAAI,UAAA,CAAW,SAAS,CAAA,EAAG;AACzB,UAAA,MAAM,YAAA,GAAe,UAAA,CAAW,IAAA,CAAK,IAAI,CAAA;AACzC,UAAA,QAAA,CAAS;AAAA,YACP,IAAA,EAAM,cAAA;AAAA,YACN,QAAA,EAAU;AAAA,cACR,aAAA,EAAe,CAAA,CAAE,sCAAsC,CAAA,CAAE,MAAA;AAAA,gBACvD;AAAA,eACF;AAAA,cACA,QAAQ,gBAAA,CAAiB;AAAA;AAC3B,WACD,CAAA;AAAA,QACH;AAGA,QAAA,IAAI,YAAA,CAAa,WAAW,CAAA,EAAG;AAC7B,UAAA;AAAA,QACF;AAGA,QAAA,IAAI,CAAC,gBAAA,EAAkB;AACrB,UAAA,QAAA,CAAS,WAAA,CAAY,EAAE,MAAA,EAAQ,YAAA,CAAa,CAAC,CAAA,CAAE,EAAA,EAAI,CAAC,CAAA;AACpD,UAAA;AAAA,QACF;AAEA,QAAA,MAAM,OAAO,YAAA,CAAa,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,OAAO,gBAAgB,CAAA;AAG7D,QAAA,IAAI,CAAC,IAAA,EAAM;AACT,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;AACD,UAAA;AAAA,QACF;AAAA,MACF,CAAA;AAAA,MACA,CAAA,aAAA,KAAiB;AACf,QAAA,QAAA,CAAS;AAAA,UACP,IAAA,EAAM,cAAA;AAAA,UACN,QAAA,EAAU;AAAA,YACR,QAAQ,gBAAA,CAAiB,sBAAA;AAAA,YACzB,eAAe,aAAA,GACX,CAAA,EAAG,CAAA,CAAE,sCAAsC,CAAC,CAAA,EAAA,EAAK,CAAA;AAAA,cAC/C;AAAA,aACD,CAAA,CAAA,GACD,CAAA,CAAE,sCAAsC;AAAA;AAC9C,SACD,CAAA;AACD,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,gBAAA,EAAkB;AACpB,MAAA,MAAM,OAAO,KAAA,EAAO,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,OAAO,gBAAgB,CAAA;AACvD,MAAA,IAAI,IAAA,EAAM;AACR,QAAA,eAAA,CAAgB,IAAI,CAAA;AAAA,MACtB;AAAA,IACF;AAAA,EACF,CAAA,EAAG,CAAC,KAAA,EAAO,gBAAgB,CAAC,CAAA;AAE5B,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,WAAW,EAAA,EAAY;AAC9B,IAAA,MAAM,iBAAiB,KAAA,EAAO,IAAA,CAAK,UAAQ,IAAA,CAAK,EAAA,KAAO,EAAE,CAAA,EAAG,EAAA;AAC5D,IAAA,IAAI,cAAA,EAAgB;AAClB,MAAA,QAAA,CAAS,WAAA,CAAY,EAAE,MAAA,EAAQ,cAAA,EAAgB,CAAC,CAAA;AAAA,IAClD;AAAA,EACF;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,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,aAAA,GACX,CAAA,EAAG,iBAAA,CAAkB,OAAA,EAAS,MAAM,MAAA,EAAQ,CAAA,EAAG,kBAAkB,CAAC,CAAA,EAAA,EAAK,CAAA;AAAA,cACrE;AAAA,aACD,CAAA,CAAA,GACD,iBAAA,CAAkB,SAAS,KAAA,CAAM,MAAA,EAAQ,GAAG,kBAAkB;AAAA;AACpE,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;AAAA,UAC3D,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;AACA,UAAA,IAAI,WAAW,SAAA,EAAU;AAAA,QAC3B,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,aAAA,GACX,CAAA,EAAG,iBAAA,CAAkB,OAAA,EAAS,MAAM,MAAA,EAAQ,CAAA,EAAG,kBAAkB,CAAC,CAAA,EAAA,EAAK,CAAA;AAAA,gBACrE;AAAA,eACD,CAAA,CAAA,GACD,iBAAA;AAAA,gBACE,OAAA;AAAA,gBACA,KAAA,CAAM,MAAA;AAAA,gBACN,CAAA;AAAA,gBACA;AAAA;AACF;AACN,WACD,CAAA;AACD,UAAA,eAAA,CAAgB,KAAK,CAAA;AACrB,UAAA,IAAI,SAAS,OAAA,EAAQ;AAAA,QACvB;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,SAAS,UAAA,CACP,IAAA,EACA,SAAA,EACA,OAAA,EACA;AACA,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,aAAA,GACX,CAAA,EAAG,iBAAA,CAAkB,OAAA,EAAS,MAAM,MAAA,EAAQ,CAAA,EAAG,kBAAkB,CAAC,CAAA,EAAA,EAAK,CAAA;AAAA,gBACrE;AAAA,eACD,CAAA,CAAA,GACD,iBAAA;AAAA,gBACE,OAAA;AAAA,gBACA,KAAA,CAAM,MAAA;AAAA,gBACN,CAAA;AAAA,gBACA;AAAA;AACF;AACN,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,MAAM,YAAA,GAAe,YAAY,MAAM;AACrC,IAAA,UAAA;AAAA,MACE,CAAA,GAAA,KAAO;AACL,QAAA,MAAM,YAAA,GAAmC,GAAA,CACtC,MAAA,CAAO,CAAA,IAAA,KAAQ,IAAA,CAAK,WAAW,aAAA,CAAc,OAAO,CAAA,CACpD,GAAA,CAAI,CAAA,OAAA,KAAW;AACd,UAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,OAAA,CAAQ,WAAW,CAAA;AAC3C,UAAA,MAAM,OAAA,GAAU,UAAU,IAAI,CAAA;AAC9B,UAAA,OAAO;AAAA,YACL,IAAI,OAAA,CAAQ,MAAA;AAAA,YACZ,OAAA;AAAA,YACA,YAAY,OAAA,CAAQ,UAAA;AAAA,YACpB,QAAQ,OAAA,CAAQ,UAAA;AAAA,YAChB,gBAAgB,OAAA,CAAQ,cAAA;AAAA,YACxB,iBAAiB,OAAA,CAAQ,eAAA;AAAA,YACzB,eAAe,OAAA,CAAQ;AAAA,WACzB;AAAA,QACF,CAAC,CAAA;AAEH,QAAA,QAAA,CAAS,YAAY,CAAA;AAErB,QAAA,eAAA;AAAA,UAAgB,CAAA,IAAA,KACd,IAAA,GAAQ,YAAA,CAAa,IAAA,CAAK,CAAA,CAAA,KAAK,EAAE,EAAA,KAAO,IAAA,CAAK,EAAE,CAAA,IAAK,IAAA,GAAQ;AAAA,SAC9D;AAAA,MACF,CAAA;AAAA,MACA,CAAA,aAAA,KAAiB;AACf,QAAA,QAAA,CAAS;AAAA,UACP,IAAA,EAAM,cAAA;AAAA,UACN,QAAA,EAAU;AAAA,YACR,QAAQ,gBAAA,CAAiB,sBAAA;AAAA,YACzB,aAAA,EAAe,aAAA,GACX,CAAA,EAAG,CAAA,CAAE,sCAAsC,CAAC,CAAA,EAAA,EAAK,CAAA,CAAE,0BAA0B,CAAC,CAAA,CAAA,GAC9E,CAAA,CAAE,sCAAsC;AAAA;AAC9C,SACD,CAAA;AAAA,MACH;AAAA,KACF;AAAA,EACF,CAAA,EAAG,CAAC,UAAA,EAAY,QAAA,EAAU,CAAC,CAAC,CAAA;AAE5B,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,aAAA,GACX,CAAA,EAAG,iBAAA,CAAkB,SAAS,KAAA,CAAM,MAAA,EAAQ,CAAA,EAAG,kBAAkB,CAAC,CAAA,EAAA,EAAK,CAAA,CAAE,0BAA0B,CAAC,CAAA,CAAA,GACpG,iBAAA;AAAA,gBACE,OAAA;AAAA,gBACA,KAAA,CAAM,MAAA;AAAA,gBACN,CAAA;AAAA,gBACA;AAAA;AACF;AACN,WACD,CAAA;AAAA,QACH;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,MAAM,IAAI,YAAA,EAAc,MAAA;AAExB,IAAA,MAAM,UAAA,GACJ,CAAA,KAAM,UAAA,CAAW,eAAA,IACjB,MAAM,UAAA,CAAW,uBAAA;AAEnB,IAAA,IAAI,CAAC,UAAA,EAAY;AACf,MAAA,OAAO,MAAA;AAAA,IACT;AAEA,IAAA,MAAM,EAAA,GAAK,MAAA,CAAO,WAAA,CAAY,MAAM;AAClC,MAAA,YAAA,EAAa;AAAA,IACf,GAAG,GAAI,CAAA;AAEP,IAAA,OAAO,MAAM,MAAA,CAAO,aAAA,CAAc,EAAE,CAAA;AAAA,EACtC,CAAA,EAAG,CAAC,YAAA,EAAc,MAAA,EAAQ,YAAY,CAAC,CAAA;AAEvC,EAAA,MAAM,KAAA,GAAQ;AAAA,IACZ,KAAA;AAAA,IACA,UAAA;AAAA,IACA,YAAA;AAAA,IACA,aAAA;AAAA,IACA,UAAA;AAAA,IACA,UAAA;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,EAA4B;AAAA,OAC9B;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;;;;"}
@@ -19,6 +19,9 @@ function formatNOK(amount) {
19
19
  return formatter.format(amount);
20
20
  }
21
21
  function getAlertSeverity(updateStatus, response) {
22
+ if (updateStatus.isLoading) {
23
+ return "info";
24
+ }
22
25
  if (updateStatus.isSuccess) {
23
26
  return "success";
24
27
  } else if (updateStatus.isError) {
@@ -1 +1 @@
1
- {"version":3,"file":"utilityfunctions.esm.js","sources":["../../src/utils/utilityfunctions.ts"],"sourcesContent":["import { DateTime } from 'luxon';\nimport { UpdateStatus } from '../contexts/RiScContext';\nimport {\n ActionStatusOptions,\n BASE_NUMBER,\n CONSEQUENCE_SCALE_OFFSET,\n PROBABILITY_SCALE_OFFSET,\n ThreatActorsOptions,\n VulnerabilitiesOptions,\n latestSupportedVersion,\n riskMatrix,\n} from './constants';\nimport {\n RiSc,\n RiScWithMetadata,\n Risk,\n Scenario,\n SubmitResponseObject,\n} from './types';\n\nexport function generateRandomId(): string {\n return [...Array(5)]\n .map(() => {\n const randomChar = Math.random().toString(36)[2];\n return Math.random() < 0.5 ? randomChar.toUpperCase() : randomChar;\n })\n .join('');\n}\n\n/**\n * Gets value from a nested object based on input path to the value.\n * Example:\n * {\n * test: {\n * somethings: [\n * {\n * title: 'Test1',\n * name: 'Name1',\n * },\n * ...\n * ]\n * }\n * }\n * getValue(theObjectFromAbove, 'test.somethings.0.title') => 'Test1'\n *\n * @param obj Object to get value from\n * @param path Path to value\n */\nexport function getValue(obj: any, path: string) {\n return path.split('.').reduce((prev, curr) => {\n return prev?.[curr];\n }, obj);\n}\n\nconst formatter = new Intl.NumberFormat('nb-NO', {\n maximumFractionDigits: 0,\n});\n\nexport function formatNOK(amount: number): string {\n return formatter.format(amount);\n}\n\nexport function getAlertSeverity(\n updateStatus: UpdateStatus,\n response?: SubmitResponseObject,\n): 'error' | 'success' | 'warning' {\n if (updateStatus.isSuccess) {\n return 'success';\n } else if (updateStatus.isError) {\n return 'error';\n }\n\n if (response && typeof response.status === 'string') {\n if (response.status.includes('Error')) return 'error';\n return 'success';\n }\n\n return 'warning';\n}\n\nexport function getRiskMatrixColor(risiko: Risk) {\n const sannsynlighet = findProbabilityIndex(risiko.probability);\n const konsekvens = findConsequenceIndex(risiko.consequence);\n return riskMatrix[4 - konsekvens][sannsynlighet];\n}\n\nexport function getProbabilityLevel(risiko: Risk) {\n return findProbabilityIndex(risiko.probability) + 1;\n}\n\nexport function getConsequenceLevel(risiko: Risk) {\n return findConsequenceIndex(risiko.consequence) + 1;\n}\n\nexport function emptyRiSc(): RiSc {\n return {\n schemaVersion: latestSupportedVersion,\n title: '',\n scope: '',\n scenarios: [],\n };\n}\n\nexport function shortenName(name: string, maxCharacters: number = 16) {\n if (name.length <= maxCharacters) return name;\n\n const parts = name.trim().split(/\\s+/);\n\n if (parts.length === 3) {\n const [first, middle, last] = parts;\n const candidates = [\n `${first} ${middle[0]}. ${last}`,\n `${first} ${last}`,\n `${first} ${last[0]}.`,\n first,\n ];\n return (\n candidates.find(c => c.length <= maxCharacters) ??\n first.slice(0, maxCharacters)\n );\n }\n\n if (parts.length === 2) {\n const [first, last] = parts;\n const candidates = [\n `${first} ${last}`,\n `${first} ${last[0]}.`,\n first,\n last,\n ];\n\n return (\n candidates.find(c => c.length <= maxCharacters) ??\n first.slice(0, maxCharacters)\n );\n }\n\n return parts[parts.length - 1].slice(0, maxCharacters);\n}\n\nexport function formatDate(date: Date | string): string {\n return DateTime.fromJSDate(new Date(date)).toFormat('dd.MM.yy');\n}\n\nexport function calculateDaysSince(dateString: Date) {\n const givenDate = dateString;\n const now = new Date();\n\n const diffTime = now.getTime() - givenDate.getTime();\n const diffDays = Math.floor(diffTime / (1000 * 60 * 60 * 24));\n\n return diffDays;\n}\n\nexport const UpdatedStatusEnum = {\n UPDATED: 'UPDATED',\n LITTLE_OUTDATED: 'LITTLE_OUTDATED',\n OUTDATED: 'OUTDATED',\n VERY_OUTDATED: 'VERY_OUTDATED',\n} as const;\n\nexport type UpdatedStatusEnumType =\n (typeof UpdatedStatusEnum)[keyof typeof UpdatedStatusEnum];\n\nfunction calculateUpdatedStatusFromDaysOnly(daysSinceLastModified: number) {\n if (daysSinceLastModified < 1 * 7) return UpdatedStatusEnum.UPDATED;\n if (daysSinceLastModified < 4 * 7) return UpdatedStatusEnum.LITTLE_OUTDATED;\n if (daysSinceLastModified < 8 * 7) return UpdatedStatusEnum.OUTDATED;\n return UpdatedStatusEnum.VERY_OUTDATED;\n}\n\nfunction calculateUpdatedStatusFromDaysAndCommits(\n daysSinceLastModified: number,\n numOfCommitsBehind: number,\n) {\n const days = daysSinceLastModified;\n const commits = numOfCommitsBehind;\n\n if (commits > 50) {\n return UpdatedStatusEnum.VERY_OUTDATED;\n }\n\n if (commits > 25) {\n if (days <= 30) return UpdatedStatusEnum.LITTLE_OUTDATED;\n if (days <= 90) return UpdatedStatusEnum.OUTDATED;\n return UpdatedStatusEnum.VERY_OUTDATED;\n }\n\n if (commits > 10) {\n if (days <= 30) return UpdatedStatusEnum.UPDATED;\n if (days <= 90) return UpdatedStatusEnum.LITTLE_OUTDATED;\n if (days <= 180) return UpdatedStatusEnum.OUTDATED;\n return UpdatedStatusEnum.VERY_OUTDATED;\n }\n\n if (days <= 60) return UpdatedStatusEnum.UPDATED;\n if (days <= 180) return UpdatedStatusEnum.LITTLE_OUTDATED;\n if (days <= 360) return UpdatedStatusEnum.OUTDATED;\n return UpdatedStatusEnum.VERY_OUTDATED;\n}\n\nexport function calculateUpdatedStatus(\n daysSinceLastModified: number,\n numOfCommitsBehind?: number,\n): UpdatedStatusEnumType {\n if (numOfCommitsBehind === undefined) {\n return calculateUpdatedStatusFromDaysOnly(daysSinceLastModified);\n }\n return calculateUpdatedStatusFromDaysAndCommits(\n daysSinceLastModified,\n numOfCommitsBehind,\n );\n}\n\nexport function requiresNewApproval(oldRiSc: RiSc, updatedRiSc: RiSc): boolean {\n return !isDeeplyEqual(\n oldRiSc.scenarios.sort(\n (scenario1, scenario2) => Number(scenario1.ID) - Number(scenario2.ID),\n ),\n updatedRiSc.scenarios.sort(\n (scenario1, scenario2) => Number(scenario1.ID) - Number(scenario2.ID),\n ),\n );\n}\n\nexport function formatNumber(\n cost: number,\n t: (s: any, c: any) => string,\n): string {\n function getTranslationWithCorrectUnit(\n costValue: number,\n threshold: number,\n unit: string,\n ): string {\n return t(`riskMatrix.estimatedRisk.suffix.${unit}`, {\n count: Number(((costValue / threshold) * 1000).toFixed(0)),\n });\n }\n\n if (cost < 1e4) {\n return formatNOK(cost);\n }\n if (cost < 1e6) {\n return getTranslationWithCorrectUnit(cost, 1e6, 'thousand');\n }\n if (cost < 1e9) {\n return getTranslationWithCorrectUnit(cost, 1e9, 'million');\n }\n if (cost < 1e12) {\n return getTranslationWithCorrectUnit(cost, 1e12, 'billion');\n }\n return getTranslationWithCorrectUnit(cost, 1e15, 'trillion');\n}\n\nexport function parseISODateFromEncryptedROS(date?: string): string | null {\n // Early return if date is null or too short for an ISO date string, could happen from recursion\n if (!date || date.length < 10) {\n return null;\n }\n\n try {\n const parsedDate = DateTime.fromISO(date, { setZone: true });\n\n if (!parsedDate.isValid) {\n return parseISODateFromEncryptedROS(date.substring(1, date.length - 1));\n }\n\n return parsedDate.toISO({ suppressMilliseconds: true });\n } catch (e) {\n return null;\n }\n}\n\nexport function getTranslationKey(\n type: string,\n key: string,\n t: (s: any, c?: any) => string,\n context?: any,\n): string {\n if (type === 'error') {\n return t(\n [`errorMessages.${key}`, 'errorMessages.DefaultErrorMessage'],\n context,\n );\n }\n return t(`infoMessages.${key}`, context);\n}\n\nexport function isPublicAgeKeyValid(publicAgeKey: string) {\n if (publicAgeKey.length !== 62) {\n return false;\n }\n\n if (!publicAgeKey.startsWith('age1')) {\n return false;\n }\n\n const ageKeyRegex = /^age1[ac-hj-np-z02-9]{58}$/;\n return ageKeyRegex.test(publicAgeKey);\n}\n\nexport function deleteScenario(\n riSc: RiScWithMetadata | null,\n updateRiSc: (\n riSc: RiScWithMetadata,\n onSuccess?: () => void,\n onError?: () => void,\n ) => void,\n scenario: Scenario,\n) {\n if (riSc) {\n const updatedScenarios = riSc.content.scenarios.filter(\n s => s.ID !== scenario.ID,\n );\n updateRiSc({\n ...riSc,\n content: { ...riSc.content, scenarios: updatedScenarios },\n });\n }\n}\n\nexport function deleteAction(\n remove: (index?: number | number[]) => void,\n index: number,\n onSubmit: () => void,\n) {\n remove(index);\n onSubmit();\n}\n\n/**\n * A recursive method for determining if a and b are deeply equal. Keys in the ignoredKeys argument are ignored in the\n * comparison, i.e., they are considered non-existing in both a and b.\n */\nexport function isDeeplyEqual<T>(\n a: T,\n b: T,\n ignoredKeys: string[] = [],\n): boolean {\n // If objects are equal, there is no need compare them any further.\n if (a === b) return true;\n\n // Only do comparison on objects, ignoring null (which maps to object).\n if (a && b && typeof a === 'object' && typeof b === 'object') {\n // Check if a and b are both arrays or not. If only one is, then a and b are not equal. It is necessary to perform\n // this check, as otherwise the method below will say that [] and {} are equal (or [0] and {0: 0}).\n if (Array.isArray(a) !== Array.isArray(b)) return false;\n\n // Check if a and b have the same number of entries\n if (\n Object.keys(a).filter(key => !ignoredKeys.includes(key)).length !==\n Object.keys(b).filter(key => !ignoredKeys.includes(key)).length\n )\n return false;\n\n // Check if every key of a is a key of b and that the entry associated with the key is deeply the same in a and b.\n // Since a and b has the same number of entries, it is sufficient to check only the keys of a.\n return Object.entries(a).every(\n ([key, value]) =>\n ignoredKeys.includes(key) ||\n (Object.hasOwn(b, key as keyof T) &&\n isDeeplyEqual(value, b[key as keyof T])),\n );\n }\n\n // If a or b is null or a primitive type, then they are not equal as a === b should have returned true already.\n return false;\n}\n\nfunction logBase(value: number, base: number): number {\n return Math.log(value) / Math.log(base);\n}\n\n/*\n Probability is categorized in 5 levels on a logarithmic scale with base 20:\n 0 = 20^-2 = 1 / 400\n 1 = 20^-1 = 1 / 20\n 2 = 20^-0 = 1\n 3 = 20^1 = 20\n 4 = 20^2 = 400\n*/\nexport function findProbabilityIndex(probability: number): number {\n const probabilityIndex = Math.round(\n logBase(probability, BASE_NUMBER) - PROBABILITY_SCALE_OFFSET,\n );\n return Math.min(4, Math.max(0, probabilityIndex));\n}\n\n/*\n Consequence is categorized in 5 levels on a logarithmic scale with base 20:\n 0 = 20^3 = 8 000\n 1 = 20^4 = 160 000\n 2 = 20^5 = 3 200 000\n 3 = 20^6 = 64 000 000\n 4 = 20^7 = 1 280 000 000\n*/\nexport function findConsequenceIndex(consequence: number): number {\n const consequenceIndex = Math.round(\n logBase(consequence, BASE_NUMBER) - CONSEQUENCE_SCALE_OFFSET,\n );\n return Math.min(4, Math.max(0, consequenceIndex));\n}\n\n/*\n Logarithmically round the consequence to the nearest consequence option.\n*/\nexport function roundConsequenceToNearestConsequenceOption(\n consequence: number,\n): number {\n return Math.pow(BASE_NUMBER, findConsequenceIndex(consequence) + 3);\n}\n\n/*\n Logarithmically round the probability to the nearest probability option.\n*/\nexport function roundProbabilityToNearestProbabilityOption(\n probability: number,\n): number {\n return Math.pow(BASE_NUMBER, findProbabilityIndex(probability) - 2);\n}\n\nexport const consequenceIndexToTranslationKeys: Record<number, string> = {\n 0: 'infoDialog.consequenceDescription.oneworkday',\n 1: 'infoDialog.consequenceDescription.oneworkmonth',\n 2: 'infoDialog.consequenceDescription.oneworkyear',\n 3: 'infoDialog.consequenceDescription.20workyears',\n 4: 'infoDialog.consequenceDescription.400workyears',\n};\n\nexport const probabilityIndexToTranslationKeys: Record<number, string> = {\n 0: 'infoDialog.probabilityDescription.every400years',\n 1: 'infoDialog.probabilityDescription.every20years',\n 2: 'infoDialog.probabilityDescription.annualy',\n 3: 'infoDialog.probabilityDescription.monthly',\n 4: 'infoDialog.probabilityDescription.daily',\n};\n\nexport const actionStatusOptionsToTranslationKeys: Record<\n ActionStatusOptions,\n string\n> = {\n [ActionStatusOptions.OK]: 'actionStatus.OK',\n [ActionStatusOptions.NotOK]: 'actionStatus.Not OK',\n [ActionStatusOptions.NotRelevant]: 'actionStatus.Not relevant',\n};\n\nexport function getTranslatedActionStatus(\n status: string,\n t: (key: string, options?: any) => string,\n): string {\n if (\n Object.values(ActionStatusOptions).includes(status as ActionStatusOptions)\n ) {\n return t(\n actionStatusOptionsToTranslationKeys[status as ActionStatusOptions],\n );\n }\n\n return status;\n}\n\nexport const threatActorOptionsToTranslationKeys: Record<\n ThreatActorsOptions,\n string\n> = {\n [ThreatActorsOptions.ScriptKiddie]: 'threatActors.Script kiddie',\n [ThreatActorsOptions.Hacktivist]: 'threatActors.Hacktivist',\n [ThreatActorsOptions.RecklessEmployee]: 'threatActors.Reckless employee',\n [ThreatActorsOptions.Insider]: 'threatActors.Insider',\n [ThreatActorsOptions.OrganisedCrime]: 'threatActors.Organised crime',\n [ThreatActorsOptions.TerroristOrganisation]:\n 'threatActors.Terrorist organisation',\n [ThreatActorsOptions.NationGovernment]: 'threatActors.Nation/government',\n};\n\nexport const vulnerabiltiesOptionsToTranslationKeys: Record<\n VulnerabilitiesOptions,\n string\n> = {\n [VulnerabilitiesOptions.FlawedDesign]: 'vulnerabilities.Flawed design',\n [VulnerabilitiesOptions.Misconfiguration]: 'vulnerabilities.Misconfiguration',\n [VulnerabilitiesOptions.DependencyVulnerability]:\n 'vulnerabilities.Dependency vulnerability',\n [VulnerabilitiesOptions.UnauthorizedAccess]:\n 'vulnerabilities.Unauthorized access',\n [VulnerabilitiesOptions.UnmonitoredUse]: 'vulnerabilities.Unmonitored use',\n [VulnerabilitiesOptions.InputTampering]: 'vulnerabilities.Input tampering',\n [VulnerabilitiesOptions.InformationLeak]: 'vulnerabilities.Information leak',\n [VulnerabilitiesOptions.ExcessiveUse]: 'vulnerabilities.Excessive use',\n};\n\nexport function computeStatusCount(riScWithMetadata: RiScWithMetadata) {\n const scenariosWithData = riScWithMetadata.content.scenarios.map(scenario => {\n const actionsWithStatus = (scenario.actions ?? []).map(action => {\n if (!action.lastUpdated) {\n return { ...action, status: UpdatedStatusEnum.VERY_OUTDATED };\n }\n const daysSinceLastUpdate = action.lastUpdated\n ? calculateDaysSince(new Date(action.lastUpdated))\n : null;\n const status =\n daysSinceLastUpdate !== null\n ? calculateUpdatedStatus(daysSinceLastUpdate)\n : UpdatedStatusEnum.VERY_OUTDATED;\n\n return { ...action, status };\n });\n return {\n ...scenario,\n actions: actionsWithStatus,\n };\n });\n\n const allActions = scenariosWithData.flatMap(scenario => scenario.actions);\n const veryOutdatedCount = allActions.filter(\n action => action.status === UpdatedStatusEnum.VERY_OUTDATED,\n ).length;\n const outdatedCount = allActions.filter(\n action => action.status === UpdatedStatusEnum.OUTDATED,\n ).length;\n const updatedCount = allActions.filter(\n action => action.status === UpdatedStatusEnum.UPDATED,\n ).length;\n\n return { veryOutdatedCount, outdatedCount, updatedCount };\n}\n\nexport function getActiveTheme() {\n return document.body.getAttribute('data-theme-mode');\n}\n\nexport function validateRemainingRiskNotHigher(\n formData: {\n risk: { probability: number | string; consequence: number | string };\n remainingRisk: {\n probability: number | string;\n consequence: number | string;\n };\n },\n t: (key: string, options?: any) => string,\n): { isValid: boolean; errors: string[] } {\n const initialProbability = Number(formData.risk.probability);\n const initialConsequence = Number(formData.risk.consequence);\n const remainingProbability = Number(formData.remainingRisk.probability);\n const remainingConsequence = Number(formData.remainingRisk.consequence);\n\n const errors: string[] = [];\n\n if (remainingProbability > initialProbability) {\n errors.push(t('scenarioDrawer.errors.remainingProbabilityTooHigh'));\n }\n if (remainingConsequence > initialConsequence) {\n errors.push(t('scenarioDrawer.errors.remainingConsequenceTooHigh'));\n }\n\n return {\n isValid: errors.length === 0,\n errors,\n };\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"utilityfunctions.esm.js","sources":["../../src/utils/utilityfunctions.ts"],"sourcesContent":["import { DateTime } from 'luxon';\nimport { UpdateStatus } from '../contexts/RiScContext';\nimport {\n ActionStatusOptions,\n BASE_NUMBER,\n CONSEQUENCE_SCALE_OFFSET,\n PROBABILITY_SCALE_OFFSET,\n ThreatActorsOptions,\n VulnerabilitiesOptions,\n latestSupportedVersion,\n riskMatrix,\n} from './constants';\nimport {\n RiSc,\n RiScWithMetadata,\n Risk,\n Scenario,\n SubmitResponseObject,\n} from './types';\n\nexport function generateRandomId(): string {\n return [...Array(5)]\n .map(() => {\n const randomChar = Math.random().toString(36)[2];\n return Math.random() < 0.5 ? randomChar.toUpperCase() : randomChar;\n })\n .join('');\n}\n\n/**\n * Gets value from a nested object based on input path to the value.\n * Example:\n * {\n * test: {\n * somethings: [\n * {\n * title: 'Test1',\n * name: 'Name1',\n * },\n * ...\n * ]\n * }\n * }\n * getValue(theObjectFromAbove, 'test.somethings.0.title') => 'Test1'\n *\n * @param obj Object to get value from\n * @param path Path to value\n */\nexport function getValue(obj: any, path: string) {\n return path.split('.').reduce((prev, curr) => {\n return prev?.[curr];\n }, obj);\n}\n\nconst formatter = new Intl.NumberFormat('nb-NO', {\n maximumFractionDigits: 0,\n});\n\nexport function formatNOK(amount: number): string {\n return formatter.format(amount);\n}\n\nexport function getAlertSeverity(\n updateStatus: UpdateStatus,\n response?: SubmitResponseObject,\n): 'error' | 'success' | 'warning' | 'info' {\n if (updateStatus.isLoading) {\n return 'info';\n }\n if (updateStatus.isSuccess) {\n return 'success';\n } else if (updateStatus.isError) {\n return 'error';\n }\n\n if (response && typeof response.status === 'string') {\n if (response.status.includes('Error')) return 'error';\n return 'success';\n }\n\n return 'warning';\n}\n\nexport function getRiskMatrixColor(risiko: Risk) {\n const sannsynlighet = findProbabilityIndex(risiko.probability);\n const konsekvens = findConsequenceIndex(risiko.consequence);\n return riskMatrix[4 - konsekvens][sannsynlighet];\n}\n\nexport function getProbabilityLevel(risiko: Risk) {\n return findProbabilityIndex(risiko.probability) + 1;\n}\n\nexport function getConsequenceLevel(risiko: Risk) {\n return findConsequenceIndex(risiko.consequence) + 1;\n}\n\nexport function emptyRiSc(): RiSc {\n return {\n schemaVersion: latestSupportedVersion,\n title: '',\n scope: '',\n scenarios: [],\n };\n}\n\nexport function shortenName(name: string, maxCharacters: number = 16) {\n if (name.length <= maxCharacters) return name;\n\n const parts = name.trim().split(/\\s+/);\n\n if (parts.length === 3) {\n const [first, middle, last] = parts;\n const candidates = [\n `${first} ${middle[0]}. ${last}`,\n `${first} ${last}`,\n `${first} ${last[0]}.`,\n first,\n ];\n return (\n candidates.find(c => c.length <= maxCharacters) ??\n first.slice(0, maxCharacters)\n );\n }\n\n if (parts.length === 2) {\n const [first, last] = parts;\n const candidates = [\n `${first} ${last}`,\n `${first} ${last[0]}.`,\n first,\n last,\n ];\n\n return (\n candidates.find(c => c.length <= maxCharacters) ??\n first.slice(0, maxCharacters)\n );\n }\n\n return parts[parts.length - 1].slice(0, maxCharacters);\n}\n\nexport function formatDate(date: Date | string): string {\n return DateTime.fromJSDate(new Date(date)).toFormat('dd.MM.yy');\n}\n\nexport function calculateDaysSince(dateString: Date) {\n const givenDate = dateString;\n const now = new Date();\n\n const diffTime = now.getTime() - givenDate.getTime();\n const diffDays = Math.floor(diffTime / (1000 * 60 * 60 * 24));\n\n return diffDays;\n}\n\nexport const UpdatedStatusEnum = {\n UPDATED: 'UPDATED',\n LITTLE_OUTDATED: 'LITTLE_OUTDATED',\n OUTDATED: 'OUTDATED',\n VERY_OUTDATED: 'VERY_OUTDATED',\n} as const;\n\nexport type UpdatedStatusEnumType =\n (typeof UpdatedStatusEnum)[keyof typeof UpdatedStatusEnum];\n\nfunction calculateUpdatedStatusFromDaysOnly(daysSinceLastModified: number) {\n if (daysSinceLastModified < 1 * 7) return UpdatedStatusEnum.UPDATED;\n if (daysSinceLastModified < 4 * 7) return UpdatedStatusEnum.LITTLE_OUTDATED;\n if (daysSinceLastModified < 8 * 7) return UpdatedStatusEnum.OUTDATED;\n return UpdatedStatusEnum.VERY_OUTDATED;\n}\n\nfunction calculateUpdatedStatusFromDaysAndCommits(\n daysSinceLastModified: number,\n numOfCommitsBehind: number,\n) {\n const days = daysSinceLastModified;\n const commits = numOfCommitsBehind;\n\n if (commits > 50) {\n return UpdatedStatusEnum.VERY_OUTDATED;\n }\n\n if (commits > 25) {\n if (days <= 30) return UpdatedStatusEnum.LITTLE_OUTDATED;\n if (days <= 90) return UpdatedStatusEnum.OUTDATED;\n return UpdatedStatusEnum.VERY_OUTDATED;\n }\n\n if (commits > 10) {\n if (days <= 30) return UpdatedStatusEnum.UPDATED;\n if (days <= 90) return UpdatedStatusEnum.LITTLE_OUTDATED;\n if (days <= 180) return UpdatedStatusEnum.OUTDATED;\n return UpdatedStatusEnum.VERY_OUTDATED;\n }\n\n if (days <= 60) return UpdatedStatusEnum.UPDATED;\n if (days <= 180) return UpdatedStatusEnum.LITTLE_OUTDATED;\n if (days <= 360) return UpdatedStatusEnum.OUTDATED;\n return UpdatedStatusEnum.VERY_OUTDATED;\n}\n\nexport function calculateUpdatedStatus(\n daysSinceLastModified: number,\n numOfCommitsBehind?: number,\n): UpdatedStatusEnumType {\n if (numOfCommitsBehind === undefined) {\n return calculateUpdatedStatusFromDaysOnly(daysSinceLastModified);\n }\n return calculateUpdatedStatusFromDaysAndCommits(\n daysSinceLastModified,\n numOfCommitsBehind,\n );\n}\n\nexport function requiresNewApproval(oldRiSc: RiSc, updatedRiSc: RiSc): boolean {\n return !isDeeplyEqual(\n oldRiSc.scenarios.sort(\n (scenario1, scenario2) => Number(scenario1.ID) - Number(scenario2.ID),\n ),\n updatedRiSc.scenarios.sort(\n (scenario1, scenario2) => Number(scenario1.ID) - Number(scenario2.ID),\n ),\n );\n}\n\nexport function formatNumber(\n cost: number,\n t: (s: any, c: any) => string,\n): string {\n function getTranslationWithCorrectUnit(\n costValue: number,\n threshold: number,\n unit: string,\n ): string {\n return t(`riskMatrix.estimatedRisk.suffix.${unit}`, {\n count: Number(((costValue / threshold) * 1000).toFixed(0)),\n });\n }\n\n if (cost < 1e4) {\n return formatNOK(cost);\n }\n if (cost < 1e6) {\n return getTranslationWithCorrectUnit(cost, 1e6, 'thousand');\n }\n if (cost < 1e9) {\n return getTranslationWithCorrectUnit(cost, 1e9, 'million');\n }\n if (cost < 1e12) {\n return getTranslationWithCorrectUnit(cost, 1e12, 'billion');\n }\n return getTranslationWithCorrectUnit(cost, 1e15, 'trillion');\n}\n\nexport function parseISODateFromEncryptedROS(date?: string): string | null {\n // Early return if date is null or too short for an ISO date string, could happen from recursion\n if (!date || date.length < 10) {\n return null;\n }\n\n try {\n const parsedDate = DateTime.fromISO(date, { setZone: true });\n\n if (!parsedDate.isValid) {\n return parseISODateFromEncryptedROS(date.substring(1, date.length - 1));\n }\n\n return parsedDate.toISO({ suppressMilliseconds: true });\n } catch (e) {\n return null;\n }\n}\n\nexport function getTranslationKey(\n type: string,\n key: string,\n t: (s: any, c?: any) => string,\n context?: any,\n): string {\n if (type === 'error') {\n return t(\n [`errorMessages.${key}`, 'errorMessages.DefaultErrorMessage'],\n context,\n );\n }\n return t(`infoMessages.${key}`, context);\n}\n\nexport function isPublicAgeKeyValid(publicAgeKey: string) {\n if (publicAgeKey.length !== 62) {\n return false;\n }\n\n if (!publicAgeKey.startsWith('age1')) {\n return false;\n }\n\n const ageKeyRegex = /^age1[ac-hj-np-z02-9]{58}$/;\n return ageKeyRegex.test(publicAgeKey);\n}\n\nexport function deleteScenario(\n riSc: RiScWithMetadata | null,\n updateRiSc: (\n riSc: RiScWithMetadata,\n onSuccess?: () => void,\n onError?: () => void,\n ) => void,\n scenario: Scenario,\n) {\n if (riSc) {\n const updatedScenarios = riSc.content.scenarios.filter(\n s => s.ID !== scenario.ID,\n );\n updateRiSc({\n ...riSc,\n content: { ...riSc.content, scenarios: updatedScenarios },\n });\n }\n}\n\nexport function deleteAction(\n remove: (index?: number | number[]) => void,\n index: number,\n onSubmit: () => void,\n) {\n remove(index);\n onSubmit();\n}\n\n/**\n * A recursive method for determining if a and b are deeply equal. Keys in the ignoredKeys argument are ignored in the\n * comparison, i.e., they are considered non-existing in both a and b.\n */\nexport function isDeeplyEqual<T>(\n a: T,\n b: T,\n ignoredKeys: string[] = [],\n): boolean {\n // If objects are equal, there is no need compare them any further.\n if (a === b) return true;\n\n // Only do comparison on objects, ignoring null (which maps to object).\n if (a && b && typeof a === 'object' && typeof b === 'object') {\n // Check if a and b are both arrays or not. If only one is, then a and b are not equal. It is necessary to perform\n // this check, as otherwise the method below will say that [] and {} are equal (or [0] and {0: 0}).\n if (Array.isArray(a) !== Array.isArray(b)) return false;\n\n // Check if a and b have the same number of entries\n if (\n Object.keys(a).filter(key => !ignoredKeys.includes(key)).length !==\n Object.keys(b).filter(key => !ignoredKeys.includes(key)).length\n )\n return false;\n\n // Check if every key of a is a key of b and that the entry associated with the key is deeply the same in a and b.\n // Since a and b has the same number of entries, it is sufficient to check only the keys of a.\n return Object.entries(a).every(\n ([key, value]) =>\n ignoredKeys.includes(key) ||\n (Object.hasOwn(b, key as keyof T) &&\n isDeeplyEqual(value, b[key as keyof T])),\n );\n }\n\n // If a or b is null or a primitive type, then they are not equal as a === b should have returned true already.\n return false;\n}\n\nfunction logBase(value: number, base: number): number {\n return Math.log(value) / Math.log(base);\n}\n\n/*\n Probability is categorized in 5 levels on a logarithmic scale with base 20:\n 0 = 20^-2 = 1 / 400\n 1 = 20^-1 = 1 / 20\n 2 = 20^-0 = 1\n 3 = 20^1 = 20\n 4 = 20^2 = 400\n*/\nexport function findProbabilityIndex(probability: number): number {\n const probabilityIndex = Math.round(\n logBase(probability, BASE_NUMBER) - PROBABILITY_SCALE_OFFSET,\n );\n return Math.min(4, Math.max(0, probabilityIndex));\n}\n\n/*\n Consequence is categorized in 5 levels on a logarithmic scale with base 20:\n 0 = 20^3 = 8 000\n 1 = 20^4 = 160 000\n 2 = 20^5 = 3 200 000\n 3 = 20^6 = 64 000 000\n 4 = 20^7 = 1 280 000 000\n*/\nexport function findConsequenceIndex(consequence: number): number {\n const consequenceIndex = Math.round(\n logBase(consequence, BASE_NUMBER) - CONSEQUENCE_SCALE_OFFSET,\n );\n return Math.min(4, Math.max(0, consequenceIndex));\n}\n\n/*\n Logarithmically round the consequence to the nearest consequence option.\n*/\nexport function roundConsequenceToNearestConsequenceOption(\n consequence: number,\n): number {\n return Math.pow(BASE_NUMBER, findConsequenceIndex(consequence) + 3);\n}\n\n/*\n Logarithmically round the probability to the nearest probability option.\n*/\nexport function roundProbabilityToNearestProbabilityOption(\n probability: number,\n): number {\n return Math.pow(BASE_NUMBER, findProbabilityIndex(probability) - 2);\n}\n\nexport const consequenceIndexToTranslationKeys: Record<number, string> = {\n 0: 'infoDialog.consequenceDescription.oneworkday',\n 1: 'infoDialog.consequenceDescription.oneworkmonth',\n 2: 'infoDialog.consequenceDescription.oneworkyear',\n 3: 'infoDialog.consequenceDescription.20workyears',\n 4: 'infoDialog.consequenceDescription.400workyears',\n};\n\nexport const probabilityIndexToTranslationKeys: Record<number, string> = {\n 0: 'infoDialog.probabilityDescription.every400years',\n 1: 'infoDialog.probabilityDescription.every20years',\n 2: 'infoDialog.probabilityDescription.annualy',\n 3: 'infoDialog.probabilityDescription.monthly',\n 4: 'infoDialog.probabilityDescription.daily',\n};\n\nexport const actionStatusOptionsToTranslationKeys: Record<\n ActionStatusOptions,\n string\n> = {\n [ActionStatusOptions.OK]: 'actionStatus.OK',\n [ActionStatusOptions.NotOK]: 'actionStatus.Not OK',\n [ActionStatusOptions.NotRelevant]: 'actionStatus.Not relevant',\n};\n\nexport function getTranslatedActionStatus(\n status: string,\n t: (key: string, options?: any) => string,\n): string {\n if (\n Object.values(ActionStatusOptions).includes(status as ActionStatusOptions)\n ) {\n return t(\n actionStatusOptionsToTranslationKeys[status as ActionStatusOptions],\n );\n }\n\n return status;\n}\n\nexport const threatActorOptionsToTranslationKeys: Record<\n ThreatActorsOptions,\n string\n> = {\n [ThreatActorsOptions.ScriptKiddie]: 'threatActors.Script kiddie',\n [ThreatActorsOptions.Hacktivist]: 'threatActors.Hacktivist',\n [ThreatActorsOptions.RecklessEmployee]: 'threatActors.Reckless employee',\n [ThreatActorsOptions.Insider]: 'threatActors.Insider',\n [ThreatActorsOptions.OrganisedCrime]: 'threatActors.Organised crime',\n [ThreatActorsOptions.TerroristOrganisation]:\n 'threatActors.Terrorist organisation',\n [ThreatActorsOptions.NationGovernment]: 'threatActors.Nation/government',\n};\n\nexport const vulnerabiltiesOptionsToTranslationKeys: Record<\n VulnerabilitiesOptions,\n string\n> = {\n [VulnerabilitiesOptions.FlawedDesign]: 'vulnerabilities.Flawed design',\n [VulnerabilitiesOptions.Misconfiguration]: 'vulnerabilities.Misconfiguration',\n [VulnerabilitiesOptions.DependencyVulnerability]:\n 'vulnerabilities.Dependency vulnerability',\n [VulnerabilitiesOptions.UnauthorizedAccess]:\n 'vulnerabilities.Unauthorized access',\n [VulnerabilitiesOptions.UnmonitoredUse]: 'vulnerabilities.Unmonitored use',\n [VulnerabilitiesOptions.InputTampering]: 'vulnerabilities.Input tampering',\n [VulnerabilitiesOptions.InformationLeak]: 'vulnerabilities.Information leak',\n [VulnerabilitiesOptions.ExcessiveUse]: 'vulnerabilities.Excessive use',\n};\n\nexport function computeStatusCount(riScWithMetadata: RiScWithMetadata) {\n const scenariosWithData = riScWithMetadata.content.scenarios.map(scenario => {\n const actionsWithStatus = (scenario.actions ?? []).map(action => {\n if (!action.lastUpdated) {\n return { ...action, status: UpdatedStatusEnum.VERY_OUTDATED };\n }\n const daysSinceLastUpdate = action.lastUpdated\n ? calculateDaysSince(new Date(action.lastUpdated))\n : null;\n const status =\n daysSinceLastUpdate !== null\n ? calculateUpdatedStatus(daysSinceLastUpdate)\n : UpdatedStatusEnum.VERY_OUTDATED;\n\n return { ...action, status };\n });\n return {\n ...scenario,\n actions: actionsWithStatus,\n };\n });\n\n const allActions = scenariosWithData.flatMap(scenario => scenario.actions);\n const veryOutdatedCount = allActions.filter(\n action => action.status === UpdatedStatusEnum.VERY_OUTDATED,\n ).length;\n const outdatedCount = allActions.filter(\n action => action.status === UpdatedStatusEnum.OUTDATED,\n ).length;\n const updatedCount = allActions.filter(\n action => action.status === UpdatedStatusEnum.UPDATED,\n ).length;\n\n return { veryOutdatedCount, outdatedCount, updatedCount };\n}\n\nexport function getActiveTheme() {\n return document.body.getAttribute('data-theme-mode');\n}\n\nexport function validateRemainingRiskNotHigher(\n formData: {\n risk: { probability: number | string; consequence: number | string };\n remainingRisk: {\n probability: number | string;\n consequence: number | string;\n };\n },\n t: (key: string, options?: any) => string,\n): { isValid: boolean; errors: string[] } {\n const initialProbability = Number(formData.risk.probability);\n const initialConsequence = Number(formData.risk.consequence);\n const remainingProbability = Number(formData.remainingRisk.probability);\n const remainingConsequence = Number(formData.remainingRisk.consequence);\n\n const errors: string[] = [];\n\n if (remainingProbability > initialProbability) {\n errors.push(t('scenarioDrawer.errors.remainingProbabilityTooHigh'));\n }\n if (remainingConsequence > initialConsequence) {\n errors.push(t('scenarioDrawer.errors.remainingConsequenceTooHigh'));\n }\n\n return {\n isValid: errors.length === 0,\n errors,\n };\n}\n"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kartverket/backstage-plugin-risk-scorecard",
3
- "version": "4.0.3",
3
+ "version": "4.0.5",
4
4
  "main": "dist/index.esm.js",
5
5
  "types": "dist/index.d.ts",
6
6
  "license": "MIT",