@kartverket/backstage-plugin-risk-scorecard 6.6.1 → 6.7.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/dialog/DialogComponent.esm.js +12 -4
- package/dist/components/dialog/DialogComponent.esm.js.map +1 -1
- package/dist/components/dialog/DialogComponent.module.css.esm.js +2 -2
- package/dist/components/riScInfo/RiScSelectionCard.module.css.esm.js +2 -2
- package/dist/components/riskMatrix/CurrentRisk.esm.js +4 -2
- package/dist/components/riskMatrix/CurrentRisk.esm.js.map +1 -1
- package/dist/components/riskMatrix/RiskMatrix.esm.js +2 -2
- package/dist/components/riskMatrix/RiskMatrix.esm.js.map +1 -1
- package/dist/components/riskMatrix/RiskMatrixScenarioCount.module.css.esm.js +2 -2
- package/dist/components/scenarioTable/ActionCountButtons.esm.js +3 -0
- package/dist/components/scenarioTable/ActionCountButtons.esm.js.map +1 -1
- package/dist/components/scenarioTable/ActionsCountButton.esm.js +2 -0
- package/dist/components/scenarioTable/ActionsCountButton.esm.js.map +1 -1
- package/dist/components/scenarioTable/ScenarioTableCard.esm.js +2 -1
- package/dist/components/scenarioTable/ScenarioTableCard.esm.js.map +1 -1
- package/dist/components/scenarioTable/ScenarioTableRow.esm.js +163 -144
- package/dist/components/scenarioTable/ScenarioTableRow.esm.js.map +1 -1
- package/dist/components/scenarioWizard/components/RiskTableBase.esm.js +2 -2
- package/dist/components/scenarioWizard/components/RiskTableBase.esm.js.map +1 -1
- package/dist/utils/utilityfunctions.esm.js +2 -1
- package/dist/utils/utilityfunctions.esm.js.map +1 -1
- package/package.json +1 -1
|
@@ -9,10 +9,18 @@ function DialogComponent({
|
|
|
9
9
|
children,
|
|
10
10
|
className
|
|
11
11
|
}) {
|
|
12
|
-
return /* @__PURE__ */ jsxs(
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
12
|
+
return /* @__PURE__ */ jsxs(
|
|
13
|
+
Dialog,
|
|
14
|
+
{
|
|
15
|
+
isOpen,
|
|
16
|
+
onOpenChange: onClick,
|
|
17
|
+
className: `${styles.dialog} ${className ?? ""}`,
|
|
18
|
+
children: [
|
|
19
|
+
/* @__PURE__ */ jsx(DialogHeader, { className: styles.DialogHeader, children: /* @__PURE__ */ jsx(Text, { variant: "title-small", weight: "bold", children: header }) }),
|
|
20
|
+
/* @__PURE__ */ jsx(DialogBody, { children })
|
|
21
|
+
]
|
|
22
|
+
}
|
|
23
|
+
);
|
|
16
24
|
}
|
|
17
25
|
|
|
18
26
|
export { DialogComponent as default };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DialogComponent.esm.js","sources":["../../../src/components/dialog/DialogComponent.tsx"],"sourcesContent":["import { Dialog, DialogHeader, DialogBody, Text } from '@backstage/ui';\nimport styles from './DialogComponent.module.css';\n\ntype DialogComponentProps = {\n isOpen: boolean;\n onClick: () => void;\n header?: string;\n footer?: React.ReactNode;\n children: React.ReactNode;\n className?: string;\n};\n\nfunction DialogComponent({\n isOpen,\n onClick,\n header,\n children,\n className,\n}: DialogComponentProps) {\n return (\n <Dialog
|
|
1
|
+
{"version":3,"file":"DialogComponent.esm.js","sources":["../../../src/components/dialog/DialogComponent.tsx"],"sourcesContent":["import { Dialog, DialogHeader, DialogBody, Text } from '@backstage/ui';\nimport styles from './DialogComponent.module.css';\n\ntype DialogComponentProps = {\n isOpen: boolean;\n onClick: () => void;\n header?: string;\n footer?: React.ReactNode;\n children: React.ReactNode;\n className?: string;\n};\n\nfunction DialogComponent({\n isOpen,\n onClick,\n header,\n children,\n className,\n}: DialogComponentProps) {\n return (\n <Dialog\n isOpen={isOpen}\n onOpenChange={onClick}\n className={`${styles.dialog} ${className ?? ''}`}\n >\n <DialogHeader className={styles.DialogHeader}>\n <Text variant=\"title-small\" weight=\"bold\">\n {header}\n </Text>\n </DialogHeader>\n <DialogBody>{children}</DialogBody>\n </Dialog>\n );\n}\n\nexport default DialogComponent;\n"],"names":[],"mappings":";;;;AAYA,SAAS,eAAA,CAAgB;AAAA,EACvB,MAAA;AAAA,EACA,OAAA;AAAA,EACA,MAAA;AAAA,EACA,QAAA;AAAA,EACA;AACF,CAAA,EAAyB;AACvB,EAAA,uBACE,IAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,MAAA;AAAA,MACA,YAAA,EAAc,OAAA;AAAA,MACd,WAAW,CAAA,EAAG,MAAA,CAAO,MAAM,CAAA,CAAA,EAAI,aAAa,EAAE,CAAA,CAAA;AAAA,MAE9C,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,YAAA,EAAA,EAAa,SAAA,EAAW,MAAA,CAAO,YAAA,EAC9B,QAAA,kBAAA,GAAA,CAAC,IAAA,EAAA,EAAK,OAAA,EAAQ,aAAA,EAAc,MAAA,EAAO,MAAA,EAChC,QAAA,EAAA,MAAA,EACH,CAAA,EACF,CAAA;AAAA,wBACA,GAAA,CAAC,cAAY,QAAA,EAAS;AAAA;AAAA;AAAA,GACxB;AAEJ;;;;"}
|
|
@@ -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 = ".
|
|
4
|
-
var styles = {"DialogHeader":"
|
|
3
|
+
var css_248z = ".DialogComponent_dialog__7317f9d305 {\n --bui-bg-neutral-1: var(--bui-bg-app);\n}\n\n.DialogComponent_DialogHeader__7317f9d305 {\n padding-bottom: 12px;\n}\n";
|
|
4
|
+
var styles = {"dialog":"DialogComponent_dialog__7317f9d305","DialogHeader":"DialogComponent_DialogHeader__7317f9d305"};
|
|
5
5
|
styleInject(css_248z);
|
|
6
6
|
|
|
7
7
|
export { styles as default };
|
|
@@ -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 = ".
|
|
4
|
-
var riscStyles = {"selectTrigger":"
|
|
3
|
+
var css_248z = ".RiScSelectionCard_selectTrigger__29231cdb76 button {\n background-color: transparent;\n border: 1px solid var(--bui-border-2);\n}\n\n[role='listbox'] {\n max-height: 400px;\n overflow-y: auto;\n}\n\n.RiScSelectionCard_riScInfoDialog__29231cdb76 {\n padding: 24px;\n border-radius: 4px;\n width: 800px;\n}\n\n.RiScSelectionCard_riscSelectionDialogHeader__29231cdb76 {\n padding: 0 0 16px 0;\n}\n\n.RiScSelectionCard_riscSelectionDialogBody__29231cdb76 {\n gap: 16px;\n padding: 16px 0 0 0;\n}\n\n.RiScSelectionCard_riscDescriptionComponent__29231cdb76 {\n padding-bottom: 10px;\n}\n.RiScSelectionCard_componentLayout__29231cdb76 {\n height: 60%;\n}\n\n.RiScSelectionCard_riscDescriptionContainer__29231cdb76 {\n margin-bottom: 16px;\n}\n\n.RiScSelectionCard_riScInfoDialog__29231cdb76 {\n background-color: var(--bui-bg-app);\n}\n";
|
|
4
|
+
var riscStyles = {"selectTrigger":"RiScSelectionCard_selectTrigger__29231cdb76","riScInfoDialog":"RiScSelectionCard_riScInfoDialog__29231cdb76","riscDescriptionComponent":"RiScSelectionCard_riscDescriptionComponent__29231cdb76","componentLayout":"RiScSelectionCard_componentLayout__29231cdb76","riscDescriptionContainer":"RiScSelectionCard_riscDescriptionContainer__29231cdb76"};
|
|
5
5
|
styleInject(css_248z);
|
|
6
6
|
|
|
7
7
|
export { riscStyles as default };
|
|
@@ -87,7 +87,8 @@ function CurrentRisk({ risc }) {
|
|
|
87
87
|
className: styles.currentRiskBarFill,
|
|
88
88
|
style: {
|
|
89
89
|
background: getRiskGradient()
|
|
90
|
-
}
|
|
90
|
+
},
|
|
91
|
+
children: null
|
|
91
92
|
}
|
|
92
93
|
),
|
|
93
94
|
/* @__PURE__ */ jsx(
|
|
@@ -96,7 +97,8 @@ function CurrentRisk({ risc }) {
|
|
|
96
97
|
className: styles.currentRiskMarker,
|
|
97
98
|
style: {
|
|
98
99
|
left: `${clampedPercentage}%`
|
|
99
|
-
}
|
|
100
|
+
},
|
|
101
|
+
children: null
|
|
100
102
|
}
|
|
101
103
|
)
|
|
102
104
|
] }) }),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CurrentRisk.esm.js","sources":["../../../src/components/riskMatrix/CurrentRisk.tsx"],"sourcesContent":["import { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { pluginRiScTranslationRef } from '../../utils/translations';\nimport { RiScWithMetadata } from '../../utils/types';\nimport { Box, Button, Text, Flex } from '@backstage/ui';\nimport { ActionStatusOptions } from '../../utils/constants';\nimport { calcRiskCostOfRiSc, getRiskGradient } from '../../utils/risk';\nimport { RiskMatrixTabs } from './utils';\nimport styles from './CurrentRisk.module.css';\nimport { formatNumber } from '../../utils/utilityfunctions';\nimport { useState } from 'react';\nimport DialogComponent from '../dialog/DialogComponent.tsx';\nimport { ScenarioReductionTable } from './ScenarioReductionTable.tsx';\n\ntype CurrentRiskProps = {\n risc: RiScWithMetadata;\n};\n\nexport function CurrentRisk({ risc }: CurrentRiskProps) {\n const { t } = useTranslationRef(pluginRiScTranslationRef);\n const [isDialogOpen, setIsDialogOpen] = useState<boolean>(false);\n\n const actionsOk = risc.content.scenarios.reduce(\n (total, scenario) =>\n total +\n scenario.actions.filter(\n action => action.status === ActionStatusOptions.OK,\n ).length,\n 0,\n );\n\n const initialRiskCost = calcRiskCostOfRiSc(\n risc.content,\n RiskMatrixTabs.initialRisk,\n );\n const remainingRiskCost = calcRiskCostOfRiSc(\n risc.content,\n RiskMatrixTabs.remainingRisk,\n );\n const estimatedCurrentCost = calcRiskCostOfRiSc(\n risc.content,\n RiskMatrixTabs.currentRisk,\n );\n\n const costReduction = initialRiskCost - remainingRiskCost;\n\n const costReductionPercentage =\n costReduction > 0\n ? ((initialRiskCost - estimatedCurrentCost) / costReduction) * 100\n : 0;\n\n const clampedPercentage = Math.max(\n 0,\n Math.min(100, Number(costReductionPercentage.toFixed(2))),\n );\n\n let labelTransform = 'translateX(-50%)';\n if (clampedPercentage <= 5) {\n labelTransform = 'translateX(0%)';\n } else if (clampedPercentage >= 95) {\n labelTransform = 'translateX(-100%)';\n }\n\n const reduction = formatNumber(initialRiskCost - estimatedCurrentCost, t);\n\n const description = t('riskMatrix.currentRisk.description', {\n actionsOk: String(actionsOk),\n reduction,\n });\n\n return (\n <Flex direction=\"column\" pt=\"30px\">\n <Flex direction=\"column\" pb=\"16px\">\n <Text variant=\"title-x-small\" weight=\"bold\">\n {t('riskMatrix.currentRisk.title')}\n </Text>\n <Flex direction=\"column\" gap=\"0\">\n <Flex justify=\"between\" px=\"4px\" align=\"end\" pb=\"4px\">\n <Flex direction=\"column\" align=\"start\" gap=\"0\">\n <Text variant=\"body-small\" weight=\"bold\">\n {formatNumber(initialRiskCost, t)}{' '}\n {t('riskMatrix.estimatedRisk.unit.nokPerYear')}\n </Text>\n <Text variant=\"body-medium\">← {t('dictionary.initialRisk')}</Text>\n </Flex>\n <Flex direction=\"column\" align=\"end\" gap=\"0\">\n <Text variant=\"body-small\" weight=\"bold\">\n {formatNumber(remainingRiskCost, t)}{' '}\n {t('riskMatrix.estimatedRisk.unit.nokPerYear')}\n </Text>\n <Text variant=\"body-medium\">{t('dictionary.restRisk')} →</Text>\n </Flex>\n </Flex>\n <Box className={styles.currentRiskBarWrapper}>\n <Box className={styles.currentRiskBarContainer}>\n {initialRiskCost > 0 && (\n <>\n <Flex\n align=\"center\"\n justify=\"end\"\n className={styles.currentRiskBarFill}\n style={{\n background: getRiskGradient(),\n }}\n
|
|
1
|
+
{"version":3,"file":"CurrentRisk.esm.js","sources":["../../../src/components/riskMatrix/CurrentRisk.tsx"],"sourcesContent":["import { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { pluginRiScTranslationRef } from '../../utils/translations';\nimport { RiScWithMetadata } from '../../utils/types';\nimport { Box, Button, Text, Flex } from '@backstage/ui';\nimport { ActionStatusOptions } from '../../utils/constants';\nimport { calcRiskCostOfRiSc, getRiskGradient } from '../../utils/risk';\nimport { RiskMatrixTabs } from './utils';\nimport styles from './CurrentRisk.module.css';\nimport { formatNumber } from '../../utils/utilityfunctions';\nimport { useState } from 'react';\nimport DialogComponent from '../dialog/DialogComponent.tsx';\nimport { ScenarioReductionTable } from './ScenarioReductionTable.tsx';\n\ntype CurrentRiskProps = {\n risc: RiScWithMetadata;\n};\n\nexport function CurrentRisk({ risc }: CurrentRiskProps) {\n const { t } = useTranslationRef(pluginRiScTranslationRef);\n const [isDialogOpen, setIsDialogOpen] = useState<boolean>(false);\n\n const actionsOk = risc.content.scenarios.reduce(\n (total, scenario) =>\n total +\n scenario.actions.filter(\n action => action.status === ActionStatusOptions.OK,\n ).length,\n 0,\n );\n\n const initialRiskCost = calcRiskCostOfRiSc(\n risc.content,\n RiskMatrixTabs.initialRisk,\n );\n const remainingRiskCost = calcRiskCostOfRiSc(\n risc.content,\n RiskMatrixTabs.remainingRisk,\n );\n const estimatedCurrentCost = calcRiskCostOfRiSc(\n risc.content,\n RiskMatrixTabs.currentRisk,\n );\n\n const costReduction = initialRiskCost - remainingRiskCost;\n\n const costReductionPercentage =\n costReduction > 0\n ? ((initialRiskCost - estimatedCurrentCost) / costReduction) * 100\n : 0;\n\n const clampedPercentage = Math.max(\n 0,\n Math.min(100, Number(costReductionPercentage.toFixed(2))),\n );\n\n let labelTransform = 'translateX(-50%)';\n if (clampedPercentage <= 5) {\n labelTransform = 'translateX(0%)';\n } else if (clampedPercentage >= 95) {\n labelTransform = 'translateX(-100%)';\n }\n\n const reduction = formatNumber(initialRiskCost - estimatedCurrentCost, t);\n\n const description = t('riskMatrix.currentRisk.description', {\n actionsOk: String(actionsOk),\n reduction,\n });\n\n return (\n <Flex direction=\"column\" pt=\"30px\">\n <Flex direction=\"column\" pb=\"16px\">\n <Text variant=\"title-x-small\" weight=\"bold\">\n {t('riskMatrix.currentRisk.title')}\n </Text>\n <Flex direction=\"column\" gap=\"0\">\n <Flex justify=\"between\" px=\"4px\" align=\"end\" pb=\"4px\">\n <Flex direction=\"column\" align=\"start\" gap=\"0\">\n <Text variant=\"body-small\" weight=\"bold\">\n {formatNumber(initialRiskCost, t)}{' '}\n {t('riskMatrix.estimatedRisk.unit.nokPerYear')}\n </Text>\n <Text variant=\"body-medium\">← {t('dictionary.initialRisk')}</Text>\n </Flex>\n <Flex direction=\"column\" align=\"end\" gap=\"0\">\n <Text variant=\"body-small\" weight=\"bold\">\n {formatNumber(remainingRiskCost, t)}{' '}\n {t('riskMatrix.estimatedRisk.unit.nokPerYear')}\n </Text>\n <Text variant=\"body-medium\">{t('dictionary.restRisk')} →</Text>\n </Flex>\n </Flex>\n <Box className={styles.currentRiskBarWrapper}>\n <Box className={styles.currentRiskBarContainer}>\n {initialRiskCost > 0 && (\n <>\n <Flex\n align=\"center\"\n justify=\"end\"\n className={styles.currentRiskBarFill}\n style={{\n background: getRiskGradient(),\n }}\n >\n {null}\n </Flex>\n <Box\n className={styles.currentRiskMarker}\n style={{\n left: `${clampedPercentage}%`,\n }}\n >\n {null}\n </Box>\n </>\n )}\n </Box>\n <Flex\n className={styles.currentRiskPercentageLabel}\n style={{\n left: `${clampedPercentage}%`,\n transform: labelTransform,\n }}\n >\n <Text variant=\"body-medium\" weight=\"bold\">\n {t('dictionary.currentRisk')}\n </Text>\n </Flex>\n </Box>\n </Flex>\n </Flex>\n\n <Flex>\n <Text\n variant=\"body-large\"\n dangerouslySetInnerHTML={{ __html: description }}\n />\n </Flex>\n\n <div>\n <Button onClick={() => setIsDialogOpen(true)}>\n {t('riskMatrix.currentRisk.showMoreInfo')}\n </Button>\n </div>\n <DialogComponent\n header={t('riskMatrix.currentRisk.dialogHeader')}\n isOpen={isDialogOpen}\n onClick={() => setIsDialogOpen(false)}\n className={styles.reductionDialog}\n >\n <ScenarioReductionTable\n riScWithMetadata={risc}\n onNavigate={() => setIsDialogOpen(false)}\n />\n </DialogComponent>\n </Flex>\n );\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -55,8 +55,8 @@ function RiskMatrix({
|
|
|
55
55
|
`S:${colIndex} K:${4 - rowIndex}`
|
|
56
56
|
))
|
|
57
57
|
] }, rowIndex)),
|
|
58
|
-
/* @__PURE__ */ jsx(Box, { className: styles.centered }),
|
|
59
|
-
/* @__PURE__ */ jsx(Box, { className: styles.centered }),
|
|
58
|
+
/* @__PURE__ */ jsx(Box, { className: styles.centered, children: null }),
|
|
59
|
+
/* @__PURE__ */ jsx(Box, { className: styles.centered, children: null }),
|
|
60
60
|
riskMatrix.map((_, col) => /* @__PURE__ */ jsx(Box, { className: styles.centered, children: /* @__PURE__ */ jsx(Text, { variant: "title-x-small", weight: "bold", children: col + 1 }) }, col)),
|
|
61
61
|
/* @__PURE__ */ jsx(Box, { className: styles.sannsynlighet, children: /* @__PURE__ */ jsx(
|
|
62
62
|
Text,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RiskMatrix.esm.js","sources":["../../../src/components/riskMatrix/RiskMatrix.tsx"],"sourcesContent":["import { Fragment, useState } from 'react';\nimport { AggregatedCost } from './AggregatedCost';\nimport { RiScWithMetadata } from '../../utils/types';\nimport { MatrixTabs } from './Tabs';\nimport { riskMatrix } from '../../utils/constants';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { pluginRiScTranslationRef } from '../../utils/translations';\nimport { RiskMatrixTabs } from './utils';\nimport { Card, CardBody, CardHeader, Text, Box } from '@backstage/ui';\nimport { RiskMatrixSquare } from './RiskMatrixSquare.tsx';\nimport { CurrentRisk } from './CurrentRisk.tsx';\n\nimport styles from './RiskMatrix.module.css';\nexport function RiskMatrix({\n riScWithMetadata,\n}: {\n riScWithMetadata: RiScWithMetadata;\n}) {\n const { t } = useTranslationRef(pluginRiScTranslationRef);\n const [tab, setTab] = useState<RiskMatrixTabs>(RiskMatrixTabs.initialRisk);\n\n return (\n <Card className={styles.card}>\n <CardHeader>\n <Text variant=\"title-small\" weight=\"bold\">\n {t('riskMatrix.title')}\n </Text>\n </CardHeader>\n <CardBody>\n <MatrixTabs setTab={setTab} currentTab={tab} />\n {riScWithMetadata.content.scenarios.length > 0 && (\n <Box\n style={{\n marginTop: '18px',\n }}\n >\n <AggregatedCost riSc={riScWithMetadata.content} riskType={tab} />\n </Box>\n )}\n\n {tab === RiskMatrixTabs.currentRisk ? (\n <Box>\n <CurrentRisk risc={riScWithMetadata} />\n </Box>\n ) : (\n <Box className={styles.gridWrapper}>\n <Box className={styles.grid}>\n <Box className={styles.konsekvens}>\n <Text\n variant=\"title-x-small\"\n weight=\"bold\"\n className={styles.centered}\n >\n {t('dictionary.consequence')}\n </Text>\n </Box>\n {riskMatrix.map((row, rowIndex) => (\n <Fragment key={rowIndex}>\n <Box className={styles.centered}>\n <Text variant=\"title-x-small\" weight=\"bold\">\n {5 - rowIndex}\n </Text>\n </Box>\n {row.map((_, colIndex) => (\n <RiskMatrixSquare\n key={`S:${colIndex} K:${4 - rowIndex}`}\n size=\"grid\"\n consequence={4 - rowIndex}\n probability={colIndex}\n riScCountObject={{\n isInitialRisk: tab === RiskMatrixTabs.initialRisk,\n riSc: riScWithMetadata,\n }}\n />\n ))}\n </Fragment>\n ))}\n <Box className={styles.centered}
|
|
1
|
+
{"version":3,"file":"RiskMatrix.esm.js","sources":["../../../src/components/riskMatrix/RiskMatrix.tsx"],"sourcesContent":["import { Fragment, useState } from 'react';\nimport { AggregatedCost } from './AggregatedCost';\nimport { RiScWithMetadata } from '../../utils/types';\nimport { MatrixTabs } from './Tabs';\nimport { riskMatrix } from '../../utils/constants';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { pluginRiScTranslationRef } from '../../utils/translations';\nimport { RiskMatrixTabs } from './utils';\nimport { Card, CardBody, CardHeader, Text, Box } from '@backstage/ui';\nimport { RiskMatrixSquare } from './RiskMatrixSquare.tsx';\nimport { CurrentRisk } from './CurrentRisk.tsx';\n\nimport styles from './RiskMatrix.module.css';\nexport function RiskMatrix({\n riScWithMetadata,\n}: {\n riScWithMetadata: RiScWithMetadata;\n}) {\n const { t } = useTranslationRef(pluginRiScTranslationRef);\n const [tab, setTab] = useState<RiskMatrixTabs>(RiskMatrixTabs.initialRisk);\n\n return (\n <Card className={styles.card}>\n <CardHeader>\n <Text variant=\"title-small\" weight=\"bold\">\n {t('riskMatrix.title')}\n </Text>\n </CardHeader>\n <CardBody>\n <MatrixTabs setTab={setTab} currentTab={tab} />\n {riScWithMetadata.content.scenarios.length > 0 && (\n <Box\n style={{\n marginTop: '18px',\n }}\n >\n <AggregatedCost riSc={riScWithMetadata.content} riskType={tab} />\n </Box>\n )}\n\n {tab === RiskMatrixTabs.currentRisk ? (\n <Box>\n <CurrentRisk risc={riScWithMetadata} />\n </Box>\n ) : (\n <Box className={styles.gridWrapper}>\n <Box className={styles.grid}>\n <Box className={styles.konsekvens}>\n <Text\n variant=\"title-x-small\"\n weight=\"bold\"\n className={styles.centered}\n >\n {t('dictionary.consequence')}\n </Text>\n </Box>\n {riskMatrix.map((row, rowIndex) => (\n <Fragment key={rowIndex}>\n <Box className={styles.centered}>\n <Text variant=\"title-x-small\" weight=\"bold\">\n {5 - rowIndex}\n </Text>\n </Box>\n {row.map((_, colIndex) => (\n <RiskMatrixSquare\n key={`S:${colIndex} K:${4 - rowIndex}`}\n size=\"grid\"\n consequence={4 - rowIndex}\n probability={colIndex}\n riScCountObject={{\n isInitialRisk: tab === RiskMatrixTabs.initialRisk,\n riSc: riScWithMetadata,\n }}\n />\n ))}\n </Fragment>\n ))}\n <Box className={styles.centered}>{null}</Box>\n <Box className={styles.centered}>{null}</Box>\n {riskMatrix.map((_, col) => (\n <Box className={styles.centered} key={col}>\n <Text variant=\"title-x-small\" weight=\"bold\">\n {col + 1}\n </Text>\n </Box>\n ))}\n <Box className={styles.sannsynlighet}>\n <Text\n weight=\"bold\"\n variant=\"title-x-small\"\n className={styles.centered}\n >\n {t('dictionary.probability')}\n </Text>\n </Box>\n </Box>\n </Box>\n )}\n </CardBody>\n </Card>\n );\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -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 = ".
|
|
4
|
-
var styles = {"circle":"
|
|
3
|
+
var css_248z = ".RiskMatrixScenarioCount_circle__060e331171.RiskMatrixScenarioCount_circle__060e331171 {\n height: 60%;\n aspect-ratio: 1 / 1;\n border-radius: 50%;\n cursor: pointer;\n min-height: 20px;\n}\n\n.RiskMatrixScenarioCount_circleHovered__060e331171.RiskMatrixScenarioCount_circleHovered__060e331171 {\n background-color: var(--ros-gray-300);\n}\n\n.RiskMatrixScenarioCount_tooltip__060e331171.RiskMatrixScenarioCount_tooltip__060e331171 {\n background-color: var(--bui-white);\n padding: 16px;\n max-width: 500px;\n}\n[data-theme-mode='dark'] .RiskMatrixScenarioCount_tooltip__060e331171.RiskMatrixScenarioCount_tooltip__060e331171 {\n background-color: var(--bui-bg-app);\n}\n\n.RiskMatrixScenarioCount_tooltipArrow__060e331171.RiskMatrixScenarioCount_tooltipArrow__060e331171 {\n color: var(--bui-white);\n}\n[data-theme-mode='dark'] .RiskMatrixScenarioCount_tooltipArrow__060e331171.RiskMatrixScenarioCount_tooltipArrow__060e331171 {\n color: var(--bui-bg-app);\n}\n\n.RiskMatrixScenarioCount_tooltipList__060e331171 {\n padding-left: 16px;\n font-size: 16px;\n color: var(--bui-black);\n}\n[data-theme-mode='dark'] .RiskMatrixScenarioCount_tooltipList__060e331171 {\n color: var(--bui-white);\n}\n\n.RiskMatrixScenarioCount_tooltipListItem__060e331171 {\n margin-bottom: 16px;\n\n &:hover {\n cursor: pointer;\n background-color: var(--ros-gray-50);\n }\n}\n[data-theme-mode='dark'] .RiskMatrixScenarioCount_tooltipListItem__060e331171 {\n &:hover {\n background-color: var(--ros-gray-600);\n }\n}\n\n.RiskMatrixScenarioCount_centered__060e331171 {\n display: flex;\n align-items: center;\n justify-content: center;\n}\n";
|
|
4
|
+
var styles = {"circle":"RiskMatrixScenarioCount_circle__060e331171","circleHovered":"RiskMatrixScenarioCount_circleHovered__060e331171","tooltip":"RiskMatrixScenarioCount_tooltip__060e331171","tooltipArrow":"RiskMatrixScenarioCount_tooltipArrow__060e331171","tooltipList":"RiskMatrixScenarioCount_tooltipList__060e331171","tooltipListItem":"RiskMatrixScenarioCount_tooltipListItem__060e331171","centered":"RiskMatrixScenarioCount_centered__060e331171"};
|
|
5
5
|
styleInject(css_248z);
|
|
6
6
|
|
|
7
7
|
export { styles as default };
|
|
@@ -10,6 +10,7 @@ function ActionCountButtons(props) {
|
|
|
10
10
|
{
|
|
11
11
|
type: UpdatedStatusEnum.VERY_OUTDATED,
|
|
12
12
|
count: props.veryOutdatedCount,
|
|
13
|
+
totalCount: props.totalCount,
|
|
13
14
|
onActionCountClick: props.onActionCountClick,
|
|
14
15
|
isSelected: props.updatedStatusToDisplay === UpdatedStatusEnum.VERY_OUTDATED
|
|
15
16
|
}
|
|
@@ -19,6 +20,7 @@ function ActionCountButtons(props) {
|
|
|
19
20
|
{
|
|
20
21
|
type: UpdatedStatusEnum.OUTDATED,
|
|
21
22
|
count: props.outdatedCount,
|
|
23
|
+
totalCount: props.totalCount,
|
|
22
24
|
onActionCountClick: props.onActionCountClick,
|
|
23
25
|
isSelected: props.updatedStatusToDisplay === UpdatedStatusEnum.OUTDATED
|
|
24
26
|
}
|
|
@@ -28,6 +30,7 @@ function ActionCountButtons(props) {
|
|
|
28
30
|
{
|
|
29
31
|
type: UpdatedStatusEnum.UPDATED,
|
|
30
32
|
count: props.updatedCount,
|
|
33
|
+
totalCount: props.totalCount,
|
|
31
34
|
onActionCountClick: props.onActionCountClick,
|
|
32
35
|
isSelected: props.updatedStatusToDisplay === UpdatedStatusEnum.UPDATED
|
|
33
36
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ActionCountButtons.esm.js","sources":["../../../src/components/scenarioTable/ActionCountButtons.tsx"],"sourcesContent":["import { Flex } from '@backstage/ui';\nimport {\n UpdatedStatusEnum,\n UpdatedStatusEnumType,\n} from '../../utils/utilityfunctions.ts';\nimport { ActionsCountButton } from './ActionsCountButton.tsx';\n\ntype ActionCountButtonsProps = {\n veryOutdatedCount: number;\n outdatedCount: number;\n updatedCount: number;\n onActionCountClick: (type: UpdatedStatusEnumType) => void;\n updatedStatusToDisplay: UpdatedStatusEnumType | null;\n};\nexport function ActionCountButtons(props: ActionCountButtonsProps) {\n return (\n <Flex mb=\"24px\" style={{ flexWrap: 'wrap' }}>\n {props.veryOutdatedCount > 0 && (\n <ActionsCountButton\n type={UpdatedStatusEnum.VERY_OUTDATED}\n count={props.veryOutdatedCount}\n onActionCountClick={props.onActionCountClick}\n isSelected={\n props.updatedStatusToDisplay === UpdatedStatusEnum.VERY_OUTDATED\n }\n />\n )}\n {props.outdatedCount > 0 && (\n <ActionsCountButton\n type={UpdatedStatusEnum.OUTDATED}\n count={props.outdatedCount}\n onActionCountClick={props.onActionCountClick}\n isSelected={\n props.updatedStatusToDisplay === UpdatedStatusEnum.OUTDATED\n }\n />\n )}\n {props.updatedCount > 0 && (\n <ActionsCountButton\n type={UpdatedStatusEnum.UPDATED}\n count={props.updatedCount}\n onActionCountClick={props.onActionCountClick}\n isSelected={\n props.updatedStatusToDisplay === UpdatedStatusEnum.UPDATED\n }\n />\n )}\n </Flex>\n );\n}\n"],"names":[],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"ActionCountButtons.esm.js","sources":["../../../src/components/scenarioTable/ActionCountButtons.tsx"],"sourcesContent":["import { Flex } from '@backstage/ui';\nimport {\n UpdatedStatusEnum,\n UpdatedStatusEnumType,\n} from '../../utils/utilityfunctions.ts';\nimport { ActionsCountButton } from './ActionsCountButton.tsx';\n\ntype ActionCountButtonsProps = {\n totalCount: number;\n veryOutdatedCount: number;\n outdatedCount: number;\n updatedCount: number;\n onActionCountClick: (type: UpdatedStatusEnumType) => void;\n updatedStatusToDisplay: UpdatedStatusEnumType | null;\n};\nexport function ActionCountButtons(props: ActionCountButtonsProps) {\n return (\n <Flex mb=\"24px\" style={{ flexWrap: 'wrap' }}>\n {props.veryOutdatedCount > 0 && (\n <ActionsCountButton\n type={UpdatedStatusEnum.VERY_OUTDATED}\n count={props.veryOutdatedCount}\n totalCount={props.totalCount}\n onActionCountClick={props.onActionCountClick}\n isSelected={\n props.updatedStatusToDisplay === UpdatedStatusEnum.VERY_OUTDATED\n }\n />\n )}\n {props.outdatedCount > 0 && (\n <ActionsCountButton\n type={UpdatedStatusEnum.OUTDATED}\n count={props.outdatedCount}\n totalCount={props.totalCount}\n onActionCountClick={props.onActionCountClick}\n isSelected={\n props.updatedStatusToDisplay === UpdatedStatusEnum.OUTDATED\n }\n />\n )}\n {props.updatedCount > 0 && (\n <ActionsCountButton\n type={UpdatedStatusEnum.UPDATED}\n count={props.updatedCount}\n totalCount={props.totalCount}\n onActionCountClick={props.onActionCountClick}\n isSelected={\n props.updatedStatusToDisplay === UpdatedStatusEnum.UPDATED\n }\n />\n )}\n </Flex>\n );\n}\n"],"names":[],"mappings":";;;;;AAeO,SAAS,mBAAmB,KAAA,EAAgC;AACjE,EAAA,uBACE,IAAA,CAAC,QAAK,EAAA,EAAG,MAAA,EAAO,OAAO,EAAE,QAAA,EAAU,QAAO,EACvC,QAAA,EAAA;AAAA,IAAA,KAAA,CAAM,oBAAoB,CAAA,oBACzB,GAAA;AAAA,MAAC,kBAAA;AAAA,MAAA;AAAA,QACC,MAAM,iBAAA,CAAkB,aAAA;AAAA,QACxB,OAAO,KAAA,CAAM,iBAAA;AAAA,QACb,YAAY,KAAA,CAAM,UAAA;AAAA,QAClB,oBAAoB,KAAA,CAAM,kBAAA;AAAA,QAC1B,UAAA,EACE,KAAA,CAAM,sBAAA,KAA2B,iBAAA,CAAkB;AAAA;AAAA,KAEvD;AAAA,IAED,KAAA,CAAM,gBAAgB,CAAA,oBACrB,GAAA;AAAA,MAAC,kBAAA;AAAA,MAAA;AAAA,QACC,MAAM,iBAAA,CAAkB,QAAA;AAAA,QACxB,OAAO,KAAA,CAAM,aAAA;AAAA,QACb,YAAY,KAAA,CAAM,UAAA;AAAA,QAClB,oBAAoB,KAAA,CAAM,kBAAA;AAAA,QAC1B,UAAA,EACE,KAAA,CAAM,sBAAA,KAA2B,iBAAA,CAAkB;AAAA;AAAA,KAEvD;AAAA,IAED,KAAA,CAAM,eAAe,CAAA,oBACpB,GAAA;AAAA,MAAC,kBAAA;AAAA,MAAA;AAAA,QACC,MAAM,iBAAA,CAAkB,OAAA;AAAA,QACxB,OAAO,KAAA,CAAM,YAAA;AAAA,QACb,YAAY,KAAA,CAAM,UAAA;AAAA,QAClB,oBAAoB,KAAA,CAAM,kBAAA;AAAA,QAC1B,UAAA,EACE,KAAA,CAAM,sBAAA,KAA2B,iBAAA,CAAkB;AAAA;AAAA;AAEvD,GAAA,EAEJ,CAAA;AAEJ;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ActionsCountButton.esm.js","sources":["../../../src/components/scenarioTable/ActionsCountButton.tsx"],"sourcesContent":["import classNames from 'classnames';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { pluginRiScTranslationRef } from '../../utils/translations.ts';\nimport { Button } from '@backstage/ui';\nimport {\n UpdatedStatusEnum,\n UpdatedStatusEnumType,\n} from '../../utils/utilityfunctions.ts';\nimport styles from './ActionsCountButton.module.css';\n\ntype ActionsCountButtonProps = {\n type: UpdatedStatusEnumType;\n count: number;\n onActionCountClick: (type: UpdatedStatusEnumType) => void;\n isSelected: boolean;\n};\nexport function ActionsCountButton(props: ActionsCountButtonProps) {\n const { t } = useTranslationRef(pluginRiScTranslationRef);\n\n const className = classNames(styles.OutdatedActionsCountButton, {\n [styles['OutdatedActionsCountButton--selected']]: props.isSelected,\n [styles['OutdatedActionsCountButton--very-outdated']]:\n props.type === UpdatedStatusEnum.VERY_OUTDATED,\n [styles['OutdatedActionsCountButton--outdated']]:\n props.type === UpdatedStatusEnum.OUTDATED,\n [styles['OutdatedActionsCountButton--updated']]:\n props.type === UpdatedStatusEnum.UPDATED,\n });\n\n const closeIndicatorClassName = classNames(\n styles.OutdatedActionsCountCloseIcon,\n 'ri-close-line ri-lg',\n );\n\n const closeIndicator = props.isSelected ? (\n <i className={closeIndicatorClassName} />\n ) : undefined;\n\n const translationKey = (() => {\n if (props.type === UpdatedStatusEnum.VERY_OUTDATED) {\n return 'filterButton.veryOutdated';\n } else if (props.type === UpdatedStatusEnum.OUTDATED) {\n return 'filterButton.outdated';\n }\n return 'filterButton.listUpdatedActions';\n })();\n\n return (\n <Button\n className={className}\n size=\"small\"\n onClick={() => props.onActionCountClick(props.type)}\n iconEnd={closeIndicator}\n >\n {t(translationKey)} ({props.count})\n </Button>\n );\n}\n"],"names":[],"mappings":";;;;;;;;
|
|
1
|
+
{"version":3,"file":"ActionsCountButton.esm.js","sources":["../../../src/components/scenarioTable/ActionsCountButton.tsx"],"sourcesContent":["import classNames from 'classnames';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { pluginRiScTranslationRef } from '../../utils/translations.ts';\nimport { Button } from '@backstage/ui';\nimport {\n UpdatedStatusEnum,\n UpdatedStatusEnumType,\n} from '../../utils/utilityfunctions.ts';\nimport styles from './ActionsCountButton.module.css';\n\ntype ActionsCountButtonProps = {\n type: UpdatedStatusEnumType;\n count: number;\n totalCount: number;\n onActionCountClick: (type: UpdatedStatusEnumType) => void;\n isSelected: boolean;\n};\nexport function ActionsCountButton(props: ActionsCountButtonProps) {\n const { t } = useTranslationRef(pluginRiScTranslationRef);\n\n const className = classNames(styles.OutdatedActionsCountButton, {\n [styles['OutdatedActionsCountButton--selected']]: props.isSelected,\n [styles['OutdatedActionsCountButton--very-outdated']]:\n props.type === UpdatedStatusEnum.VERY_OUTDATED,\n [styles['OutdatedActionsCountButton--outdated']]:\n props.type === UpdatedStatusEnum.OUTDATED,\n [styles['OutdatedActionsCountButton--updated']]:\n props.type === UpdatedStatusEnum.UPDATED,\n });\n\n const closeIndicatorClassName = classNames(\n styles.OutdatedActionsCountCloseIcon,\n 'ri-close-line ri-lg',\n );\n\n const closeIndicator = props.isSelected ? (\n <i className={closeIndicatorClassName} />\n ) : undefined;\n\n const translationKey = (() => {\n if (props.type === UpdatedStatusEnum.VERY_OUTDATED) {\n return 'filterButton.veryOutdated';\n } else if (props.type === UpdatedStatusEnum.OUTDATED) {\n return 'filterButton.outdated';\n }\n return 'filterButton.listUpdatedActions';\n })();\n\n return (\n <Button\n className={className}\n size=\"small\"\n onClick={() => props.onActionCountClick(props.type)}\n iconEnd={closeIndicator}\n >\n {t(translationKey)} ({props.count}/{props.totalCount})\n </Button>\n );\n}\n"],"names":[],"mappings":";;;;;;;;AAiBO,SAAS,mBAAmB,KAAA,EAAgC;AACjE,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,iBAAA,CAAkB,wBAAwB,CAAA;AAExD,EAAA,MAAM,SAAA,GAAY,UAAA,CAAW,MAAA,CAAO,0BAAA,EAA4B;AAAA,IAC9D,CAAC,MAAA,CAAO,sCAAsC,CAAC,GAAG,KAAA,CAAM,UAAA;AAAA,IACxD,CAAC,MAAA,CAAO,2CAA2C,CAAC,GAClD,KAAA,CAAM,SAAS,iBAAA,CAAkB,aAAA;AAAA,IACnC,CAAC,MAAA,CAAO,sCAAsC,CAAC,GAC7C,KAAA,CAAM,SAAS,iBAAA,CAAkB,QAAA;AAAA,IACnC,CAAC,MAAA,CAAO,qCAAqC,CAAC,GAC5C,KAAA,CAAM,SAAS,iBAAA,CAAkB;AAAA,GACpC,CAAA;AAED,EAAA,MAAM,uBAAA,GAA0B,UAAA;AAAA,IAC9B,MAAA,CAAO,6BAAA;AAAA,IACP;AAAA,GACF;AAEA,EAAA,MAAM,iBAAiB,KAAA,CAAM,UAAA,uBAC1B,GAAA,EAAA,EAAE,SAAA,EAAW,yBAAyB,CAAA,GACrC,MAAA;AAEJ,EAAA,MAAM,kBAAkB,MAAM;AAC5B,IAAA,IAAI,KAAA,CAAM,IAAA,KAAS,iBAAA,CAAkB,aAAA,EAAe;AAClD,MAAA,OAAO,2BAAA;AAAA,IACT,CAAA,MAAA,IAAW,KAAA,CAAM,IAAA,KAAS,iBAAA,CAAkB,QAAA,EAAU;AACpD,MAAA,OAAO,uBAAA;AAAA,IACT;AACA,IAAA,OAAO,iCAAA;AAAA,EACT,CAAA,GAAG;AAEH,EAAA,uBACE,IAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,SAAA;AAAA,MACA,IAAA,EAAK,OAAA;AAAA,MACL,OAAA,EAAS,MAAM,KAAA,CAAM,kBAAA,CAAmB,MAAM,IAAI,CAAA;AAAA,MAClD,OAAA,EAAS,cAAA;AAAA,MAER,QAAA,EAAA;AAAA,QAAA,CAAA,CAAE,cAAc,CAAA;AAAA,QAAE,IAAA;AAAA,QAAG,KAAA,CAAM,KAAA;AAAA,QAAM,GAAA;AAAA,QAAE,KAAA,CAAM,UAAA;AAAA,QAAW;AAAA;AAAA;AAAA,GACvD;AAEJ;;;;"}
|
|
@@ -15,7 +15,7 @@ function ScenarioTableCard({
|
|
|
15
15
|
}) {
|
|
16
16
|
const { openNewScenarioWizard } = useScenario();
|
|
17
17
|
const [isEditing, setIsEditing] = useState(false);
|
|
18
|
-
const { veryOutdatedCount, outdatedCount, updatedCount } = computeStatusCount(riScWithMetadata);
|
|
18
|
+
const { totalCount, veryOutdatedCount, outdatedCount, updatedCount } = computeStatusCount(riScWithMetadata);
|
|
19
19
|
const [selectedUpdatedStatus, setSelectedUpdatedStatus] = useState(null);
|
|
20
20
|
const updatedStatusToDisplay = selectedUpdatedStatus === UpdatedStatusEnum.VERY_OUTDATED && veryOutdatedCount === 0 || selectedUpdatedStatus === UpdatedStatusEnum.OUTDATED && outdatedCount === 0 ? null : selectedUpdatedStatus;
|
|
21
21
|
function handleActionCountClick(type) {
|
|
@@ -31,6 +31,7 @@ function ScenarioTableCard({
|
|
|
31
31
|
(veryOutdatedCount > 0 || outdatedCount > 0) && /* @__PURE__ */ jsx(
|
|
32
32
|
ActionCountButtons,
|
|
33
33
|
{
|
|
34
|
+
totalCount,
|
|
34
35
|
veryOutdatedCount,
|
|
35
36
|
outdatedCount,
|
|
36
37
|
updatedCount,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ScenarioTableCard.esm.js","sources":["../../../src/components/scenarioTable/ScenarioTableCard.tsx"],"sourcesContent":["import { useState } from 'react';\nimport { RiScWithMetadata } from '../../utils/types';\nimport {\n computeStatusCount,\n UpdatedStatusEnumType,\n UpdatedStatusEnum,\n} from '../../utils/utilityfunctions';\nimport { Card, CardBody, CardHeader, Flex } from '@backstage/ui';\nimport { ScenarioTableCardHeader } from './ScenarioTableCardHeader.tsx';\nimport { ActionCountButtons } from './ActionCountButtons.tsx';\nimport { AddScenarioButton } from './AddScenarioButton.tsx';\nimport { ScenarioTable } from './ScenarioTable.tsx';\nimport { useScenario } from '../../contexts/ScenarioContext.tsx';\nimport { ScenarioTableFilter } from './ScenarioTableFilter.tsx';\n\ninterface ScenarioTableProps {\n riScWithMetadata: RiScWithMetadata;\n editingAllowed: boolean;\n}\n\nexport function ScenarioTableCard({\n riScWithMetadata,\n editingAllowed,\n}: ScenarioTableProps) {\n const { openNewScenarioWizard } = useScenario();\n\n const [isEditing, setIsEditing] = useState<boolean>(false);\n\n const { veryOutdatedCount, outdatedCount, updatedCount } =\n computeStatusCount(riScWithMetadata);\n const [selectedUpdatedStatus, setSelectedUpdatedStatus] =\n useState<UpdatedStatusEnumType | null>(null);\n\n // Remove updated status selection if there is none to display\n const updatedStatusToDisplay =\n (selectedUpdatedStatus === UpdatedStatusEnum.VERY_OUTDATED &&\n veryOutdatedCount === 0) ||\n (selectedUpdatedStatus === UpdatedStatusEnum.OUTDATED &&\n outdatedCount === 0)\n ? null\n : selectedUpdatedStatus;\n\n function handleActionCountClick(type: UpdatedStatusEnumType) {\n setSelectedUpdatedStatus(prev => (prev === type ? null : type));\n }\n const [scenarioSortOrder, setScenarioSortOrder] = useState<string | null>(\n null,\n );\n\n const [actionSearchQuery, setActionSearchQuery] = useState<string>('');\n\n return (\n <Card>\n <CardHeader>\n <ScenarioTableCardHeader />\n </CardHeader>\n <CardBody style={{ paddingTop: '12px' }}>\n {(veryOutdatedCount > 0 || outdatedCount > 0) && (\n <ActionCountButtons\n veryOutdatedCount={veryOutdatedCount}\n outdatedCount={outdatedCount}\n updatedCount={updatedCount}\n onActionCountClick={handleActionCountClick}\n updatedStatusToDisplay={updatedStatusToDisplay}\n />\n )}\n {riScWithMetadata.content.scenarios.length === 0 && editingAllowed ? (\n <Flex justify=\"center\">\n <AddScenarioButton onNewScenario={openNewScenarioWizard} />\n </Flex>\n ) : (\n <>\n <ScenarioTableFilter\n scenarioSortOrder={scenarioSortOrder}\n onScenarioSortOrderChange={setScenarioSortOrder}\n isEditingScenarioTable={isEditing}\n actionSearchQuery={actionSearchQuery}\n onActionSearchQueryChange={setActionSearchQuery}\n isEditingScenarioTableAllowed={\n riScWithMetadata.content.scenarios.length > 0 && editingAllowed\n }\n onToggleEditScenarioTable={() =>\n isEditing ? setIsEditing(false) : setIsEditing(true)\n }\n onNewScenario={openNewScenarioWizard}\n />\n\n <ScenarioTable\n riScWithMetadata={riScWithMetadata}\n isEditingAllowed={editingAllowed}\n isEditing={isEditing}\n visibleType={updatedStatusToDisplay}\n actionSearchQuery={actionSearchQuery}\n scenarioSortOrder={scenarioSortOrder}\n />\n </>\n )}\n </CardBody>\n </Card>\n );\n}\n"],"names":[],"mappings":";;;;;;;;;;;AAoBO,SAAS,iBAAA,CAAkB;AAAA,EAChC,gBAAA;AAAA,EACA;AACF,CAAA,EAAuB;AACrB,EAAA,MAAM,EAAE,qBAAA,EAAsB,GAAI,WAAA,EAAY;AAE9C,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAI,SAAkB,KAAK,CAAA;AAEzD,EAAA,MAAM,EAAE,iBAAA,EAAmB,
|
|
1
|
+
{"version":3,"file":"ScenarioTableCard.esm.js","sources":["../../../src/components/scenarioTable/ScenarioTableCard.tsx"],"sourcesContent":["import { useState } from 'react';\nimport { RiScWithMetadata } from '../../utils/types';\nimport {\n computeStatusCount,\n UpdatedStatusEnumType,\n UpdatedStatusEnum,\n} from '../../utils/utilityfunctions';\nimport { Card, CardBody, CardHeader, Flex } from '@backstage/ui';\nimport { ScenarioTableCardHeader } from './ScenarioTableCardHeader.tsx';\nimport { ActionCountButtons } from './ActionCountButtons.tsx';\nimport { AddScenarioButton } from './AddScenarioButton.tsx';\nimport { ScenarioTable } from './ScenarioTable.tsx';\nimport { useScenario } from '../../contexts/ScenarioContext.tsx';\nimport { ScenarioTableFilter } from './ScenarioTableFilter.tsx';\n\ninterface ScenarioTableProps {\n riScWithMetadata: RiScWithMetadata;\n editingAllowed: boolean;\n}\n\nexport function ScenarioTableCard({\n riScWithMetadata,\n editingAllowed,\n}: ScenarioTableProps) {\n const { openNewScenarioWizard } = useScenario();\n\n const [isEditing, setIsEditing] = useState<boolean>(false);\n\n const { totalCount, veryOutdatedCount, outdatedCount, updatedCount } =\n computeStatusCount(riScWithMetadata);\n const [selectedUpdatedStatus, setSelectedUpdatedStatus] =\n useState<UpdatedStatusEnumType | null>(null);\n\n // Remove updated status selection if there is none to display\n const updatedStatusToDisplay =\n (selectedUpdatedStatus === UpdatedStatusEnum.VERY_OUTDATED &&\n veryOutdatedCount === 0) ||\n (selectedUpdatedStatus === UpdatedStatusEnum.OUTDATED &&\n outdatedCount === 0)\n ? null\n : selectedUpdatedStatus;\n\n function handleActionCountClick(type: UpdatedStatusEnumType) {\n setSelectedUpdatedStatus(prev => (prev === type ? null : type));\n }\n const [scenarioSortOrder, setScenarioSortOrder] = useState<string | null>(\n null,\n );\n\n const [actionSearchQuery, setActionSearchQuery] = useState<string>('');\n\n return (\n <Card>\n <CardHeader>\n <ScenarioTableCardHeader />\n </CardHeader>\n <CardBody style={{ paddingTop: '12px' }}>\n {(veryOutdatedCount > 0 || outdatedCount > 0) && (\n <ActionCountButtons\n totalCount={totalCount}\n veryOutdatedCount={veryOutdatedCount}\n outdatedCount={outdatedCount}\n updatedCount={updatedCount}\n onActionCountClick={handleActionCountClick}\n updatedStatusToDisplay={updatedStatusToDisplay}\n />\n )}\n {riScWithMetadata.content.scenarios.length === 0 && editingAllowed ? (\n <Flex justify=\"center\">\n <AddScenarioButton onNewScenario={openNewScenarioWizard} />\n </Flex>\n ) : (\n <>\n <ScenarioTableFilter\n scenarioSortOrder={scenarioSortOrder}\n onScenarioSortOrderChange={setScenarioSortOrder}\n isEditingScenarioTable={isEditing}\n actionSearchQuery={actionSearchQuery}\n onActionSearchQueryChange={setActionSearchQuery}\n isEditingScenarioTableAllowed={\n riScWithMetadata.content.scenarios.length > 0 && editingAllowed\n }\n onToggleEditScenarioTable={() =>\n isEditing ? setIsEditing(false) : setIsEditing(true)\n }\n onNewScenario={openNewScenarioWizard}\n />\n\n <ScenarioTable\n riScWithMetadata={riScWithMetadata}\n isEditingAllowed={editingAllowed}\n isEditing={isEditing}\n visibleType={updatedStatusToDisplay}\n actionSearchQuery={actionSearchQuery}\n scenarioSortOrder={scenarioSortOrder}\n />\n </>\n )}\n </CardBody>\n </Card>\n );\n}\n"],"names":[],"mappings":";;;;;;;;;;;AAoBO,SAAS,iBAAA,CAAkB;AAAA,EAChC,gBAAA;AAAA,EACA;AACF,CAAA,EAAuB;AACrB,EAAA,MAAM,EAAE,qBAAA,EAAsB,GAAI,WAAA,EAAY;AAE9C,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAI,SAAkB,KAAK,CAAA;AAEzD,EAAA,MAAM,EAAE,UAAA,EAAY,iBAAA,EAAmB,eAAe,YAAA,EAAa,GACjE,mBAAmB,gBAAgB,CAAA;AACrC,EAAA,MAAM,CAAC,qBAAA,EAAuB,wBAAwB,CAAA,GACpD,SAAuC,IAAI,CAAA;AAG7C,EAAA,MAAM,sBAAA,GACH,qBAAA,KAA0B,iBAAA,CAAkB,aAAA,IAC3C,iBAAA,KAAsB,CAAA,IACvB,qBAAA,KAA0B,iBAAA,CAAkB,QAAA,IAC3C,aAAA,KAAkB,CAAA,GAChB,IAAA,GACA,qBAAA;AAEN,EAAA,SAAS,uBAAuB,IAAA,EAA6B;AAC3D,IAAA,wBAAA,CAAyB,CAAA,IAAA,KAAS,IAAA,KAAS,IAAA,GAAO,IAAA,GAAO,IAAK,CAAA;AAAA,EAChE;AACA,EAAA,MAAM,CAAC,iBAAA,EAAmB,oBAAoB,CAAA,GAAI,QAAA;AAAA,IAChD;AAAA,GACF;AAEA,EAAA,MAAM,CAAC,iBAAA,EAAmB,oBAAoB,CAAA,GAAI,SAAiB,EAAE,CAAA;AAErE,EAAA,4BACG,IAAA,EAAA,EACC,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,UAAA,EAAA,EACC,QAAA,kBAAA,GAAA,CAAC,uBAAA,EAAA,EAAwB,CAAA,EAC3B,CAAA;AAAA,yBACC,QAAA,EAAA,EAAS,KAAA,EAAO,EAAE,UAAA,EAAY,QAAO,EAClC,QAAA,EAAA;AAAA,MAAA,CAAA,iBAAA,GAAoB,CAAA,IAAK,gBAAgB,CAAA,qBACzC,GAAA;AAAA,QAAC,kBAAA;AAAA,QAAA;AAAA,UACC,UAAA;AAAA,UACA,iBAAA;AAAA,UACA,aAAA;AAAA,UACA,YAAA;AAAA,UACA,kBAAA,EAAoB,sBAAA;AAAA,UACpB;AAAA;AAAA,OACF;AAAA,MAED,iBAAiB,OAAA,CAAQ,SAAA,CAAU,MAAA,KAAW,CAAA,IAAK,iCAClD,GAAA,CAAC,IAAA,EAAA,EAAK,OAAA,EAAQ,QAAA,EACZ,8BAAC,iBAAA,EAAA,EAAkB,aAAA,EAAe,qBAAA,EAAuB,CAAA,EAC3D,oBAEA,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,wBAAA,GAAA;AAAA,UAAC,mBAAA;AAAA,UAAA;AAAA,YACC,iBAAA;AAAA,YACA,yBAAA,EAA2B,oBAAA;AAAA,YAC3B,sBAAA,EAAwB,SAAA;AAAA,YACxB,iBAAA;AAAA,YACA,yBAAA,EAA2B,oBAAA;AAAA,YAC3B,6BAAA,EACE,gBAAA,CAAiB,OAAA,CAAQ,SAAA,CAAU,SAAS,CAAA,IAAK,cAAA;AAAA,YAEnD,2BAA2B,MACzB,SAAA,GAAY,aAAa,KAAK,CAAA,GAAI,aAAa,IAAI,CAAA;AAAA,YAErD,aAAA,EAAe;AAAA;AAAA,SACjB;AAAA,wBAEA,GAAA;AAAA,UAAC,aAAA;AAAA,UAAA;AAAA,YACC,gBAAA;AAAA,YACA,gBAAA,EAAkB,cAAA;AAAA,YAClB,SAAA;AAAA,YACA,WAAA,EAAa,sBAAA;AAAA,YACb,iBAAA;AAAA,YACA;AAAA;AAAA;AACF,OAAA,EACF;AAAA,KAAA,EAEJ;AAAA,GAAA,EACF,CAAA;AAEJ;;;;"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
2
2
|
import { useTranslationRef } from '@backstage/core-plugin-api/alpha';
|
|
3
3
|
import Collapse from '@mui/material/Collapse';
|
|
4
4
|
import IconButton from '@mui/material/IconButton';
|
|
@@ -66,20 +66,11 @@ function ScenarioTableRow({
|
|
|
66
66
|
const cardBgColor = "var(--ros-scenario-card-bg)";
|
|
67
67
|
const isTextColorBlack = theme.palette.mode === "dark" ? isScenarioHoveredFromRiskMatrix : true;
|
|
68
68
|
const textColorAsBuiVariable = isTextColorBlack ? "var(--bui-black)" : "var(--bui-white)";
|
|
69
|
-
return /* @__PURE__ */
|
|
70
|
-
|
|
69
|
+
return /* @__PURE__ */ jsx(
|
|
70
|
+
"div",
|
|
71
71
|
{
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
setHoveredScenarios(
|
|
75
|
-
(prev) => prev.some((s) => s.ID === scenario.ID) ? prev : [...prev, scenario]
|
|
76
|
-
);
|
|
77
|
-
},
|
|
78
|
-
onMouseLeave: () => {
|
|
79
|
-
if (isExpanded) return;
|
|
80
|
-
setHoveredScenarios((prev) => prev.filter((s) => s.ID !== scenario.ID));
|
|
81
|
-
},
|
|
82
|
-
ref,
|
|
72
|
+
role: "button",
|
|
73
|
+
tabIndex: 0,
|
|
83
74
|
onClick: (e) => {
|
|
84
75
|
const target = e.target;
|
|
85
76
|
if (target && (target.closest("[data-action-root]") || target.closest("[data-action-collapse]") || target.closest("[data-no-row-toggle]"))) {
|
|
@@ -87,143 +78,171 @@ function ScenarioTableRow({
|
|
|
87
78
|
}
|
|
88
79
|
viewRow(scenario.ID);
|
|
89
80
|
},
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
opacity: isDragging ? 0.3 : 1,
|
|
95
|
-
transition: isDragging ? "none" : void 0,
|
|
96
|
-
backgroundColor: isScenarioHoveredFromRiskMatrix ? highlightColor : cardBgColor
|
|
81
|
+
onKeyDown: (e) => {
|
|
82
|
+
if (e.key === "Enter" || e.key === " ") {
|
|
83
|
+
viewRow(scenario.ID);
|
|
84
|
+
}
|
|
97
85
|
},
|
|
98
|
-
children:
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
{
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
86
|
+
children: /* @__PURE__ */ jsxs(
|
|
87
|
+
Card,
|
|
88
|
+
{
|
|
89
|
+
onMouseEnter: () => {
|
|
90
|
+
if (isExpanded) return;
|
|
91
|
+
setHoveredScenarios(
|
|
92
|
+
(prev) => prev.some((s) => s.ID === scenario.ID) ? prev : [...prev, scenario]
|
|
93
|
+
);
|
|
94
|
+
},
|
|
95
|
+
onMouseLeave: () => {
|
|
96
|
+
if (isExpanded) return;
|
|
97
|
+
setHoveredScenarios((prev) => prev.filter((s) => s.ID !== scenario.ID));
|
|
98
|
+
},
|
|
99
|
+
ref,
|
|
100
|
+
className: classNames(styles.tableCard, {
|
|
101
|
+
[styles.tableCardNoHover]: isExpanded
|
|
102
|
+
}),
|
|
103
|
+
style: {
|
|
104
|
+
opacity: isDragging ? 0.3 : 1,
|
|
105
|
+
transition: isDragging ? "none" : void 0,
|
|
106
|
+
backgroundColor: isScenarioHoveredFromRiskMatrix ? highlightColor : cardBgColor
|
|
107
|
+
},
|
|
108
|
+
children: [
|
|
109
|
+
/* @__PURE__ */ jsxs(Flex, { align: "center", children: [
|
|
110
|
+
isEditing && isDnDAllowed && /* @__PURE__ */ jsx(IconButton, { size: "small", ref: drag, children: /* @__PURE__ */ jsx(
|
|
111
|
+
DragIndicatorIcon,
|
|
112
|
+
{
|
|
113
|
+
sx: { cursor: isDragging ? "grabbing" : "grab" }
|
|
114
|
+
}
|
|
115
|
+
) }),
|
|
116
|
+
/* @__PURE__ */ jsx(
|
|
117
|
+
IconButton,
|
|
118
|
+
{
|
|
119
|
+
size: "medium",
|
|
120
|
+
"data-action-root": true,
|
|
121
|
+
onClick: (e) => {
|
|
122
|
+
e.stopPropagation();
|
|
123
|
+
setIsExpanded((prev) => !prev);
|
|
124
|
+
},
|
|
125
|
+
style: { padding: 0 },
|
|
126
|
+
children: isExpanded ? /* @__PURE__ */ jsx("i", { className: "ri-arrow-down-s-line" }) : /* @__PURE__ */ jsx("i", { className: "ri-arrow-right-s-line" })
|
|
127
|
+
}
|
|
128
|
+
),
|
|
129
|
+
/* @__PURE__ */ jsx(
|
|
130
|
+
Text,
|
|
131
|
+
{
|
|
132
|
+
as: "p",
|
|
133
|
+
variant: "body-large",
|
|
134
|
+
weight: "bold",
|
|
135
|
+
style: { width: "35%", color: textColorAsBuiVariable },
|
|
136
|
+
children: scenario.title
|
|
137
|
+
}
|
|
138
|
+
),
|
|
139
|
+
/* @__PURE__ */ jsxs(Flex, { align: "center", justify: "start", style: { width: "15%" }, children: [
|
|
140
|
+
/* @__PURE__ */ jsx(
|
|
141
|
+
RiskMatrixSquare,
|
|
142
|
+
{
|
|
143
|
+
size: "small",
|
|
144
|
+
probability: findProbabilityIndex(scenario.risk.probability),
|
|
145
|
+
consequence: findConsequenceIndex(scenario.risk.consequence)
|
|
146
|
+
}
|
|
147
|
+
),
|
|
148
|
+
/* @__PURE__ */ jsxs(
|
|
149
|
+
Text,
|
|
150
|
+
{
|
|
151
|
+
variant: "body-medium",
|
|
152
|
+
style: { color: textColorAsBuiVariable },
|
|
153
|
+
children: [
|
|
154
|
+
t("scenarioTable.columns.probabilityChar"),
|
|
155
|
+
":",
|
|
156
|
+
`${getProbabilityLevel(
|
|
157
|
+
scenario.risk
|
|
158
|
+
)} ${t("scenarioTable.columns.consequenceChar")}:${getConsequenceLevel(scenario.risk)}`
|
|
159
|
+
]
|
|
160
|
+
}
|
|
161
|
+
)
|
|
162
|
+
] }),
|
|
163
|
+
/* @__PURE__ */ jsx(
|
|
164
|
+
Flex,
|
|
165
|
+
{
|
|
166
|
+
align: "center",
|
|
167
|
+
justify: "start",
|
|
168
|
+
style: { width: isEditing ? "30%" : "35%" },
|
|
169
|
+
children: (() => {
|
|
170
|
+
if (scenario.actions.length > 0) {
|
|
171
|
+
return /* @__PURE__ */ jsx(
|
|
172
|
+
ScenarioTableProgressBar,
|
|
173
|
+
{
|
|
174
|
+
completedCount: scenario.actions.filter(
|
|
175
|
+
(a) => a.status === ActionStatusOptions.OK
|
|
176
|
+
).length,
|
|
177
|
+
totalCount: scenario.actions.filter(
|
|
178
|
+
(a) => a.status !== ActionStatusOptions.NotRelevant
|
|
179
|
+
).length,
|
|
180
|
+
textColor: textColorAsBuiVariable
|
|
181
|
+
}
|
|
182
|
+
);
|
|
164
183
|
}
|
|
165
|
-
|
|
184
|
+
return /* @__PURE__ */ jsx(Text, { style: { color: textColorAsBuiVariable }, children: t("scenarioTable.noActions") });
|
|
185
|
+
})()
|
|
166
186
|
}
|
|
167
|
-
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
187
|
+
),
|
|
188
|
+
/* @__PURE__ */ jsxs(Flex, { align: "center", style: { width: "15%" }, children: [
|
|
189
|
+
/* @__PURE__ */ jsx(
|
|
190
|
+
RiskMatrixSquare,
|
|
191
|
+
{
|
|
192
|
+
size: "small",
|
|
193
|
+
probability: findProbabilityIndex(
|
|
194
|
+
scenario.remainingRisk.probability
|
|
195
|
+
),
|
|
196
|
+
consequence: findConsequenceIndex(
|
|
197
|
+
scenario.remainingRisk.consequence
|
|
198
|
+
)
|
|
199
|
+
}
|
|
178
200
|
),
|
|
179
|
-
|
|
180
|
-
|
|
201
|
+
/* @__PURE__ */ jsx(
|
|
202
|
+
Text,
|
|
203
|
+
{
|
|
204
|
+
variant: "body-medium",
|
|
205
|
+
style: { color: textColorAsBuiVariable },
|
|
206
|
+
children: `${t("scenarioTable.columns.probabilityChar")}:${getProbabilityLevel(
|
|
207
|
+
scenario.remainingRisk
|
|
208
|
+
)} ${t("scenarioTable.columns.consequenceChar")}:${getConsequenceLevel(scenario.remainingRisk)}`
|
|
209
|
+
}
|
|
181
210
|
)
|
|
182
|
-
}
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
/* @__PURE__ */ jsx(
|
|
208
|
-
DeleteScenarioConfirmation,
|
|
211
|
+
] }),
|
|
212
|
+
isEditing && /* @__PURE__ */ jsxs(Flex, { align: "center", justify: "end", children: [
|
|
213
|
+
/* @__PURE__ */ jsx(
|
|
214
|
+
IconButton,
|
|
215
|
+
{
|
|
216
|
+
size: "small",
|
|
217
|
+
onClick: (event) => {
|
|
218
|
+
event.stopPropagation();
|
|
219
|
+
setScenarioDeletionDialogOpen(true);
|
|
220
|
+
},
|
|
221
|
+
children: /* @__PURE__ */ jsx(DeleteIcon, {})
|
|
222
|
+
}
|
|
223
|
+
),
|
|
224
|
+
/* @__PURE__ */ jsx(
|
|
225
|
+
DeleteScenarioConfirmation,
|
|
226
|
+
{
|
|
227
|
+
isOpen: isScenarioDeletionDialogOpen,
|
|
228
|
+
setIsOpen: setScenarioDeletionDialogOpen,
|
|
229
|
+
onConfirm: () => deleteScenario(riSc, updateRiSc, scenario)
|
|
230
|
+
}
|
|
231
|
+
)
|
|
232
|
+
] })
|
|
233
|
+
] }),
|
|
234
|
+
isExpanded && /* @__PURE__ */ jsx(Collapse, { in: isExpanded, timeout: "auto", unmountOnExit: true, children: /* @__PURE__ */ jsx("div", { "data-action-root": true, children: /* @__PURE__ */ jsx(
|
|
235
|
+
ActionRowList,
|
|
209
236
|
{
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
237
|
+
scenarioId: scenario.ID,
|
|
238
|
+
displayedActions: scenario.actions.filter(
|
|
239
|
+
(action) => isAnyFilterEnabled && filteredActionIds ? filteredActionIds.includes(action.ID) : true
|
|
240
|
+
)
|
|
213
241
|
}
|
|
214
|
-
)
|
|
215
|
-
]
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
ActionRowList,
|
|
219
|
-
{
|
|
220
|
-
scenarioId: scenario.ID,
|
|
221
|
-
displayedActions: scenario.actions.filter(
|
|
222
|
-
(action) => isAnyFilterEnabled && filteredActionIds ? filteredActionIds.includes(action.ID) : true
|
|
223
|
-
)
|
|
224
|
-
}
|
|
225
|
-
) }) })
|
|
226
|
-
]
|
|
242
|
+
) }) })
|
|
243
|
+
]
|
|
244
|
+
}
|
|
245
|
+
)
|
|
227
246
|
}
|
|
228
247
|
);
|
|
229
248
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ScenarioTableRow.esm.js","sources":["../../../src/components/scenarioTable/ScenarioTableRow.tsx"],"sourcesContent":["import { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport Collapse from '@mui/material/Collapse';\nimport IconButton from '@mui/material/IconButton';\nimport DeleteIcon from '@mui/icons-material/Delete';\nimport DragIndicatorIcon from '@mui/icons-material/DragIndicator';\nimport {\n useState,\n useRef,\n useEffect,\n MouseEvent,\n SetStateAction,\n Dispatch,\n} from 'react';\nimport { pluginRiScTranslationRef } from '../../utils/translations';\nimport { RiScWithMetadata, Scenario } from '../../utils/types';\nimport { useRiScs } from '../../contexts/RiScContext';\nimport {\n deleteScenario,\n findConsequenceIndex,\n findProbabilityIndex,\n getConsequenceLevel,\n getProbabilityLevel,\n} from '../../utils/utilityfunctions';\nimport { ScenarioTableProgressBar } from './ScenarioTableProgressBar';\nimport classnames from 'classnames';\nimport styles from './ScenarioTable.module.css';\nimport { Text, Flex, Card } from '@backstage/ui';\nimport { DeleteScenarioConfirmation } from '../scenarioDrawer/components/DeleteConfirmation.tsx';\nimport { ActionStatusOptions } from '../../utils/constants';\nimport { useScenario } from '../../contexts/ScenarioContext.tsx';\nimport { useTheme } from '@mui/material/styles';\nimport { ActionRowList } from '../action/ActionRowList.tsx';\nimport { RiskMatrixSquare } from '../riskMatrix/RiskMatrixSquare.tsx';\nimport {\n useScenarioTableDrag,\n useScenarioTableDrop,\n} from '../../hooks/UseScenarioTableDnD.ts';\n\ninterface ScenarioTableRowProps {\n scenario: Scenario;\n filteredActionIds?: string[];\n isAnyFilterEnabled: boolean;\n isDnDAllowed?: boolean;\n viewRow: (id: string) => void;\n listIndex: number;\n isEditing: boolean;\n setTempScenarios: Dispatch<SetStateAction<Scenario[]>>;\n riScWithMetadata: RiScWithMetadata;\n}\n\nexport function ScenarioTableRow({\n scenario,\n filteredActionIds,\n isAnyFilterEnabled,\n isDnDAllowed,\n viewRow,\n listIndex,\n isEditing,\n setTempScenarios,\n riScWithMetadata,\n}: ScenarioTableRowProps) {\n // Getting global state\n const { t } = useTranslationRef(pluginRiScTranslationRef);\n const { selectedRiSc: riSc, updateRiSc } = useRiScs();\n const { hoveredScenarios, setHoveredScenarios } = useScenario();\n\n // Initializing local state\n const [isScenarioDeletionDialogOpen, setScenarioDeletionDialogOpen] =\n useState(false);\n const [isExpanded, setIsExpanded] = useState(false);\n\n // Drag n Drop functionality definitions\n const ref = useRef<HTMLDivElement>(null);\n\n const [, drop] = useScenarioTableDrop(\n listIndex,\n scenario.ID,\n setTempScenarios,\n ref,\n );\n\n useEffect(() => {\n setIsExpanded(!!filteredActionIds);\n }, [filteredActionIds]);\n\n const [{ isDragging }, drag, preview] = useScenarioTableDrag(\n listIndex,\n scenario.ID,\n setTempScenarios,\n riScWithMetadata,\n );\n\n preview(drop(ref));\n\n // Styling\n useEffect(() => {\n if (isExpanded) {\n setHoveredScenarios(prev => prev.filter(s => s.ID !== scenario.ID));\n }\n // Only run when visibleType or expansion changes for this scenario\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [isExpanded]);\n\n const theme = useTheme();\n const isScenarioHoveredFromRiskMatrix = hoveredScenarios.some(\n s => s.ID === scenario.ID,\n );\n\n const highlightColor = 'var(--ros-scenario-highlight)';\n\n const cardBgColor = 'var(--ros-scenario-card-bg)';\n\n const isTextColorBlack =\n theme.palette.mode === 'dark' ? isScenarioHoveredFromRiskMatrix : true;\n const textColorAsBuiVariable = isTextColorBlack\n ? 'var(--bui-black)'\n : 'var(--bui-white)';\n\n return (\n <Card\n onMouseEnter={() => {\n if (isExpanded) return;\n setHoveredScenarios(prev =>\n prev.some(s => s.ID === scenario.ID) ? prev : [...prev, scenario],\n );\n }}\n onMouseLeave={() => {\n if (isExpanded) return;\n setHoveredScenarios(prev => prev.filter(s => s.ID !== scenario.ID));\n }}\n ref={ref}\n onClick={(e: MouseEvent<HTMLDivElement>) => {\n const target = e.target as HTMLElement | null;\n if (\n target &&\n (target.closest('[data-action-root]') ||\n target.closest('[data-action-collapse]') ||\n target.closest('[data-no-row-toggle]'))\n ) {\n return;\n }\n viewRow(scenario.ID);\n }}\n className={classnames(styles.tableCard, {\n [styles.tableCardNoHover]: isExpanded,\n })}\n style={{\n opacity: isDragging ? 0.3 : 1,\n transition: isDragging ? 'none' : undefined,\n backgroundColor: isScenarioHoveredFromRiskMatrix\n ? highlightColor\n : cardBgColor,\n }}\n >\n <Flex align=\"center\">\n {isEditing && isDnDAllowed && (\n <IconButton size=\"small\" ref={drag}>\n <DragIndicatorIcon\n sx={{ cursor: isDragging ? 'grabbing' : 'grab' }}\n />\n </IconButton>\n )}\n <IconButton\n size=\"medium\"\n data-action-root\n onClick={e => {\n e.stopPropagation();\n setIsExpanded(prev => !prev);\n }}\n style={{ padding: 0 }}\n >\n {isExpanded ? (\n <i className=\"ri-arrow-down-s-line\" />\n ) : (\n <i className=\"ri-arrow-right-s-line\" />\n )}\n </IconButton>\n <Text\n as=\"p\"\n variant=\"body-large\"\n weight=\"bold\"\n style={{ width: '35%', color: textColorAsBuiVariable }}\n >\n {scenario.title}\n </Text>\n <Flex align=\"center\" justify=\"start\" style={{ width: '15%' }}>\n <RiskMatrixSquare\n size=\"small\"\n probability={findProbabilityIndex(scenario.risk.probability)}\n consequence={findConsequenceIndex(scenario.risk.consequence)}\n />\n <Text variant=\"body-medium\" style={{ color: textColorAsBuiVariable }}>\n {t('scenarioTable.columns.probabilityChar')}:\n {`${getProbabilityLevel(\n scenario.risk,\n )} ${t('scenarioTable.columns.consequenceChar')}:${getConsequenceLevel(scenario.risk)}`}\n </Text>\n </Flex>\n\n <Flex\n align=\"center\"\n justify=\"start\"\n style={{ width: isEditing ? '30%' : '35%' }}\n >\n {(() => {\n if (scenario.actions.length > 0) {\n return (\n <ScenarioTableProgressBar\n completedCount={\n scenario.actions.filter(\n a => a.status === ActionStatusOptions.OK,\n ).length\n }\n totalCount={\n scenario.actions.filter(\n a => a.status !== ActionStatusOptions.NotRelevant,\n ).length\n }\n textColor={textColorAsBuiVariable}\n />\n );\n }\n return (\n <Text style={{ color: textColorAsBuiVariable }}>\n {t('scenarioTable.noActions')}\n </Text>\n );\n })()}\n </Flex>\n <Flex align=\"center\" style={{ width: '15%' }}>\n <RiskMatrixSquare\n size=\"small\"\n probability={findProbabilityIndex(\n scenario.remainingRisk.probability,\n )}\n consequence={findConsequenceIndex(\n scenario.remainingRisk.consequence,\n )}\n />\n <Text\n variant=\"body-medium\"\n style={{ color: textColorAsBuiVariable }}\n >{`${t('scenarioTable.columns.probabilityChar')}:${getProbabilityLevel(\n scenario.remainingRisk,\n )} ${t('scenarioTable.columns.consequenceChar')}:${getConsequenceLevel(scenario.remainingRisk)}`}</Text>\n </Flex>\n\n {isEditing && (\n <Flex align=\"center\" justify=\"end\">\n <IconButton\n size=\"small\"\n onClick={event => {\n event.stopPropagation();\n setScenarioDeletionDialogOpen(true);\n }}\n >\n <DeleteIcon />\n </IconButton>\n <DeleteScenarioConfirmation\n isOpen={isScenarioDeletionDialogOpen}\n setIsOpen={setScenarioDeletionDialogOpen}\n onConfirm={() => deleteScenario(riSc, updateRiSc, scenario)}\n />\n </Flex>\n )}\n </Flex>\n {isExpanded && (\n <Collapse in={isExpanded} timeout=\"auto\" unmountOnExit>\n <div data-action-root>\n <ActionRowList\n scenarioId={scenario.ID}\n displayedActions={scenario.actions.filter(action =>\n isAnyFilterEnabled && filteredActionIds\n ? filteredActionIds.includes(action.ID)\n : true,\n )}\n />\n </div>\n </Collapse>\n )}\n </Card>\n );\n}\n"],"names":["classnames"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ScenarioTableRow.esm.js","sources":["../../../src/components/scenarioTable/ScenarioTableRow.tsx"],"sourcesContent":["import { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport Collapse from '@mui/material/Collapse';\nimport IconButton from '@mui/material/IconButton';\nimport DeleteIcon from '@mui/icons-material/Delete';\nimport DragIndicatorIcon from '@mui/icons-material/DragIndicator';\nimport {\n useState,\n useRef,\n useEffect,\n MouseEvent,\n KeyboardEvent,\n SetStateAction,\n Dispatch,\n} from 'react';\nimport { pluginRiScTranslationRef } from '../../utils/translations';\nimport { RiScWithMetadata, Scenario } from '../../utils/types';\nimport { useRiScs } from '../../contexts/RiScContext';\nimport {\n deleteScenario,\n findConsequenceIndex,\n findProbabilityIndex,\n getConsequenceLevel,\n getProbabilityLevel,\n} from '../../utils/utilityfunctions';\nimport { ScenarioTableProgressBar } from './ScenarioTableProgressBar';\nimport classnames from 'classnames';\nimport styles from './ScenarioTable.module.css';\nimport { Text, Flex, Card } from '@backstage/ui';\nimport { DeleteScenarioConfirmation } from '../scenarioDrawer/components/DeleteConfirmation.tsx';\nimport { ActionStatusOptions } from '../../utils/constants';\nimport { useScenario } from '../../contexts/ScenarioContext.tsx';\nimport { useTheme } from '@mui/material/styles';\nimport { ActionRowList } from '../action/ActionRowList.tsx';\nimport { RiskMatrixSquare } from '../riskMatrix/RiskMatrixSquare.tsx';\nimport {\n useScenarioTableDrag,\n useScenarioTableDrop,\n} from '../../hooks/UseScenarioTableDnD.ts';\n\ninterface ScenarioTableRowProps {\n scenario: Scenario;\n filteredActionIds?: string[];\n isAnyFilterEnabled: boolean;\n isDnDAllowed?: boolean;\n viewRow: (id: string) => void;\n listIndex: number;\n isEditing: boolean;\n setTempScenarios: Dispatch<SetStateAction<Scenario[]>>;\n riScWithMetadata: RiScWithMetadata;\n}\n\nexport function ScenarioTableRow({\n scenario,\n filteredActionIds,\n isAnyFilterEnabled,\n isDnDAllowed,\n viewRow,\n listIndex,\n isEditing,\n setTempScenarios,\n riScWithMetadata,\n}: ScenarioTableRowProps) {\n // Getting global state\n const { t } = useTranslationRef(pluginRiScTranslationRef);\n const { selectedRiSc: riSc, updateRiSc } = useRiScs();\n const { hoveredScenarios, setHoveredScenarios } = useScenario();\n\n // Initializing local state\n const [isScenarioDeletionDialogOpen, setScenarioDeletionDialogOpen] =\n useState(false);\n const [isExpanded, setIsExpanded] = useState(false);\n\n // Drag n Drop functionality definitions\n const ref = useRef<HTMLDivElement>(null);\n\n const [, drop] = useScenarioTableDrop(\n listIndex,\n scenario.ID,\n setTempScenarios,\n ref,\n );\n\n useEffect(() => {\n setIsExpanded(!!filteredActionIds);\n }, [filteredActionIds]);\n\n const [{ isDragging }, drag, preview] = useScenarioTableDrag(\n listIndex,\n scenario.ID,\n setTempScenarios,\n riScWithMetadata,\n );\n\n preview(drop(ref));\n\n // Styling\n useEffect(() => {\n if (isExpanded) {\n setHoveredScenarios(prev => prev.filter(s => s.ID !== scenario.ID));\n }\n // Only run when visibleType or expansion changes for this scenario\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [isExpanded]);\n\n const theme = useTheme();\n const isScenarioHoveredFromRiskMatrix = hoveredScenarios.some(\n s => s.ID === scenario.ID,\n );\n\n const highlightColor = 'var(--ros-scenario-highlight)';\n\n const cardBgColor = 'var(--ros-scenario-card-bg)';\n\n const isTextColorBlack =\n theme.palette.mode === 'dark' ? isScenarioHoveredFromRiskMatrix : true;\n const textColorAsBuiVariable = isTextColorBlack\n ? 'var(--bui-black)'\n : 'var(--bui-white)';\n\n return (\n <div\n role=\"button\"\n tabIndex={0}\n onClick={(e: MouseEvent<HTMLDivElement>) => {\n const target = e.target as HTMLElement | null;\n if (\n target &&\n (target.closest('[data-action-root]') ||\n target.closest('[data-action-collapse]') ||\n target.closest('[data-no-row-toggle]'))\n ) {\n return;\n }\n viewRow(scenario.ID);\n }}\n onKeyDown={(e: KeyboardEvent<HTMLDivElement>) => {\n if (e.key === 'Enter' || e.key === ' ') {\n viewRow(scenario.ID);\n }\n }}\n >\n <Card\n onMouseEnter={() => {\n if (isExpanded) return;\n setHoveredScenarios(prev =>\n prev.some(s => s.ID === scenario.ID) ? prev : [...prev, scenario],\n );\n }}\n onMouseLeave={() => {\n if (isExpanded) return;\n setHoveredScenarios(prev => prev.filter(s => s.ID !== scenario.ID));\n }}\n ref={ref}\n className={classnames(styles.tableCard, {\n [styles.tableCardNoHover]: isExpanded,\n })}\n style={{\n opacity: isDragging ? 0.3 : 1,\n transition: isDragging ? 'none' : undefined,\n backgroundColor: isScenarioHoveredFromRiskMatrix\n ? highlightColor\n : cardBgColor,\n }}\n >\n <Flex align=\"center\">\n {isEditing && isDnDAllowed && (\n <IconButton size=\"small\" ref={drag}>\n <DragIndicatorIcon\n sx={{ cursor: isDragging ? 'grabbing' : 'grab' }}\n />\n </IconButton>\n )}\n <IconButton\n size=\"medium\"\n data-action-root\n onClick={e => {\n e.stopPropagation();\n setIsExpanded(prev => !prev);\n }}\n style={{ padding: 0 }}\n >\n {isExpanded ? (\n <i className=\"ri-arrow-down-s-line\" />\n ) : (\n <i className=\"ri-arrow-right-s-line\" />\n )}\n </IconButton>\n <Text\n as=\"p\"\n variant=\"body-large\"\n weight=\"bold\"\n style={{ width: '35%', color: textColorAsBuiVariable }}\n >\n {scenario.title}\n </Text>\n <Flex align=\"center\" justify=\"start\" style={{ width: '15%' }}>\n <RiskMatrixSquare\n size=\"small\"\n probability={findProbabilityIndex(scenario.risk.probability)}\n consequence={findConsequenceIndex(scenario.risk.consequence)}\n />\n <Text\n variant=\"body-medium\"\n style={{ color: textColorAsBuiVariable }}\n >\n {t('scenarioTable.columns.probabilityChar')}:\n {`${getProbabilityLevel(\n scenario.risk,\n )} ${t('scenarioTable.columns.consequenceChar')}:${getConsequenceLevel(scenario.risk)}`}\n </Text>\n </Flex>\n\n <Flex\n align=\"center\"\n justify=\"start\"\n style={{ width: isEditing ? '30%' : '35%' }}\n >\n {(() => {\n if (scenario.actions.length > 0) {\n return (\n <ScenarioTableProgressBar\n completedCount={\n scenario.actions.filter(\n a => a.status === ActionStatusOptions.OK,\n ).length\n }\n totalCount={\n scenario.actions.filter(\n a => a.status !== ActionStatusOptions.NotRelevant,\n ).length\n }\n textColor={textColorAsBuiVariable}\n />\n );\n }\n return (\n <Text style={{ color: textColorAsBuiVariable }}>\n {t('scenarioTable.noActions')}\n </Text>\n );\n })()}\n </Flex>\n <Flex align=\"center\" style={{ width: '15%' }}>\n <RiskMatrixSquare\n size=\"small\"\n probability={findProbabilityIndex(\n scenario.remainingRisk.probability,\n )}\n consequence={findConsequenceIndex(\n scenario.remainingRisk.consequence,\n )}\n />\n <Text\n variant=\"body-medium\"\n style={{ color: textColorAsBuiVariable }}\n >{`${t('scenarioTable.columns.probabilityChar')}:${getProbabilityLevel(\n scenario.remainingRisk,\n )} ${t('scenarioTable.columns.consequenceChar')}:${getConsequenceLevel(scenario.remainingRisk)}`}</Text>\n </Flex>\n\n {isEditing && (\n <Flex align=\"center\" justify=\"end\">\n <IconButton\n size=\"small\"\n onClick={event => {\n event.stopPropagation();\n setScenarioDeletionDialogOpen(true);\n }}\n >\n <DeleteIcon />\n </IconButton>\n <DeleteScenarioConfirmation\n isOpen={isScenarioDeletionDialogOpen}\n setIsOpen={setScenarioDeletionDialogOpen}\n onConfirm={() => deleteScenario(riSc, updateRiSc, scenario)}\n />\n </Flex>\n )}\n </Flex>\n {isExpanded && (\n <Collapse in={isExpanded} timeout=\"auto\" unmountOnExit>\n <div data-action-root>\n <ActionRowList\n scenarioId={scenario.ID}\n displayedActions={scenario.actions.filter(action =>\n isAnyFilterEnabled && filteredActionIds\n ? filteredActionIds.includes(action.ID)\n : true,\n )}\n />\n </div>\n </Collapse>\n )}\n </Card>\n </div>\n );\n}\n"],"names":["classnames"],"mappings":"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"}
|
|
@@ -37,7 +37,7 @@ function RiskTableBase({
|
|
|
37
37
|
const radioGroupClassName = additionalClassName ? `${styles.riskRow} ${additionalClassName}` : styles.riskRow;
|
|
38
38
|
return /* @__PURE__ */ jsxs(Box, { className: styles.riskTable, children: [
|
|
39
39
|
/* @__PURE__ */ jsxs(RadioGroup, { ...field, className: radioGroupClassName, children: [
|
|
40
|
-
fieldName === "consequence" && /* @__PURE__ */ jsx(Box, { className: styles.riskLabelCell }),
|
|
40
|
+
fieldName === "consequence" && /* @__PURE__ */ jsx(Box, { className: styles.riskLabelCell, children: null }),
|
|
41
41
|
Array.from({ length: 5 }, (_, i) => getRadioCell(i))
|
|
42
42
|
] }),
|
|
43
43
|
/* @__PURE__ */ jsx(InfoComponent, {})
|
|
@@ -51,7 +51,7 @@ function createInfoWithHeadersComponent(translationPrefix, InfoComponent, includ
|
|
|
51
51
|
}
|
|
52
52
|
return /* @__PURE__ */ jsxs(Box, { className: styles.riskTable, children: [
|
|
53
53
|
/* @__PURE__ */ jsxs(Box, { className: includeLabel ? styles.consequenceGrid : styles.riskRow, children: [
|
|
54
|
-
includeLabel && /* @__PURE__ */ jsx(Box, { className: styles.riskLabelCell }),
|
|
54
|
+
includeLabel && /* @__PURE__ */ jsx(Box, { className: styles.riskLabelCell, children: null }),
|
|
55
55
|
Array.from({ length: 5 }, (_, i) => getRadioLabel(i + 1))
|
|
56
56
|
] }),
|
|
57
57
|
/* @__PURE__ */ jsx(InfoComponent, {})
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RiskTableBase.esm.js","sources":["../../../../src/components/scenarioWizard/components/RiskTableBase.tsx"],"sourcesContent":["import { pluginRiScTranslationRef } from '../../../utils/translations';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { useController, UseFormReturn } from 'react-hook-form';\nimport { FormScenario } from '../../../utils/types';\nimport { RiskRadioButton } from './RiskRadioButton';\nimport RadioGroup from '@mui/material/RadioGroup';\nimport { Text, Box } from '@backstage/ui';\nimport styles from '../ScenarioWizardTable.module.css';\nimport React from 'react';\n\ntype RiskTableBaseProps = {\n formMethods: UseFormReturn<FormScenario>;\n riskType: keyof Pick<FormScenario, 'risk' | 'remainingRisk'>;\n fieldName: 'probability' | 'consequence';\n translationPrefix: 'probabilityTable' | 'consequenceTable';\n options: readonly number[];\n additionalClassName?: string;\n InfoComponent: React.ComponentType;\n};\n\nexport function RiskTableBase({\n formMethods,\n riskType,\n fieldName,\n options,\n additionalClassName = '',\n translationPrefix,\n InfoComponent,\n}: RiskTableBaseProps) {\n const { t } = useTranslationRef(pluginRiScTranslationRef);\n\n const { field } = useController({\n name: `${riskType}.${fieldName}`,\n control: formMethods.control,\n });\n\n function getRadioLabel(row: number) {\n /* @ts-ignore Because ts can't typecheck strings against our keys */\n return `${row}: ${t(`${translationPrefix}.rows.${row}`)}`;\n }\n\n function getRadioCell(row: number) {\n return (\n <RiskRadioButton\n value={options[row]}\n ref={field.ref}\n label={getRadioLabel(row + 1)}\n />\n );\n }\n\n const radioGroupClassName = additionalClassName\n ? `${styles.riskRow} ${additionalClassName}`\n : styles.riskRow;\n\n return (\n <Box className={styles.riskTable}>\n <RadioGroup {...field} className={radioGroupClassName}>\n {fieldName === 'consequence' && (\n <Box className={styles.riskLabelCell}
|
|
1
|
+
{"version":3,"file":"RiskTableBase.esm.js","sources":["../../../../src/components/scenarioWizard/components/RiskTableBase.tsx"],"sourcesContent":["import { pluginRiScTranslationRef } from '../../../utils/translations';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { useController, UseFormReturn } from 'react-hook-form';\nimport { FormScenario } from '../../../utils/types';\nimport { RiskRadioButton } from './RiskRadioButton';\nimport RadioGroup from '@mui/material/RadioGroup';\nimport { Text, Box } from '@backstage/ui';\nimport styles from '../ScenarioWizardTable.module.css';\nimport React from 'react';\n\ntype RiskTableBaseProps = {\n formMethods: UseFormReturn<FormScenario>;\n riskType: keyof Pick<FormScenario, 'risk' | 'remainingRisk'>;\n fieldName: 'probability' | 'consequence';\n translationPrefix: 'probabilityTable' | 'consequenceTable';\n options: readonly number[];\n additionalClassName?: string;\n InfoComponent: React.ComponentType;\n};\n\nexport function RiskTableBase({\n formMethods,\n riskType,\n fieldName,\n options,\n additionalClassName = '',\n translationPrefix,\n InfoComponent,\n}: RiskTableBaseProps) {\n const { t } = useTranslationRef(pluginRiScTranslationRef);\n\n const { field } = useController({\n name: `${riskType}.${fieldName}`,\n control: formMethods.control,\n });\n\n function getRadioLabel(row: number) {\n /* @ts-ignore Because ts can't typecheck strings against our keys */\n return `${row}: ${t(`${translationPrefix}.rows.${row}`)}`;\n }\n\n function getRadioCell(row: number) {\n return (\n <RiskRadioButton\n value={options[row]}\n ref={field.ref}\n label={getRadioLabel(row + 1)}\n />\n );\n }\n\n const radioGroupClassName = additionalClassName\n ? `${styles.riskRow} ${additionalClassName}`\n : styles.riskRow;\n\n return (\n <Box className={styles.riskTable}>\n <RadioGroup {...field} className={radioGroupClassName}>\n {fieldName === 'consequence' && (\n <Box className={styles.riskLabelCell}>{null}</Box>\n )}\n {Array.from({ length: 5 }, (_, i) => getRadioCell(i))}\n </RadioGroup>\n <InfoComponent />\n </Box>\n );\n}\n\nexport function createInfoWithHeadersComponent(\n translationPrefix: 'probabilityTable' | 'consequenceTable',\n InfoComponent: React.ComponentType,\n includeLabel: boolean = false,\n) {\n return function InfoWithHeaders() {\n const { t } = useTranslationRef(pluginRiScTranslationRef);\n\n function getRadioLabel(row: number) {\n return (\n <Text as=\"p\" variant=\"body-large\">\n {/* @ts-ignore Because ts can't typecheck strings against our keys */}\n {`${row}: ${t(`${translationPrefix}.rows.${row}`)}`}\n </Text>\n );\n }\n return (\n <Box className={styles.riskTable}>\n <Box className={includeLabel ? styles.consequenceGrid : styles.riskRow}>\n {includeLabel && <Box className={styles.riskLabelCell}>{null}</Box>}\n {Array.from({ length: 5 }, (_, i) => getRadioLabel(i + 1))}\n </Box>\n <InfoComponent />\n </Box>\n );\n };\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -268,6 +268,7 @@ function computeStatusCount(riScWithMetadata) {
|
|
|
268
268
|
};
|
|
269
269
|
});
|
|
270
270
|
const allActions = scenariosWithData.flatMap((scenario) => scenario.actions);
|
|
271
|
+
const totalCount = allActions.length;
|
|
271
272
|
const veryOutdatedCount = allActions.filter(
|
|
272
273
|
(action) => action.status === UpdatedStatusEnum.VERY_OUTDATED
|
|
273
274
|
).length;
|
|
@@ -277,7 +278,7 @@ function computeStatusCount(riScWithMetadata) {
|
|
|
277
278
|
const updatedCount = allActions.filter(
|
|
278
279
|
(action) => action.status === UpdatedStatusEnum.UPDATED
|
|
279
280
|
).length;
|
|
280
|
-
return { veryOutdatedCount, outdatedCount, updatedCount };
|
|
281
|
+
return { totalCount, veryOutdatedCount, outdatedCount, updatedCount };
|
|
281
282
|
}
|
|
282
283
|
function getActiveTheme() {
|
|
283
284
|
return document.body.getAttribute("data-theme-mode");
|
|
@@ -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' | '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\nexport function calculateUpdatedStatus(\n daysSinceLastModified: number,\n): UpdatedStatusEnumType {\n if (daysSinceLastModified <= 90) return UpdatedStatusEnum.UPDATED;\n if (daysSinceLastModified <= 180) return UpdatedStatusEnum.LITTLE_OUTDATED;\n if (daysSinceLastModified <= 270) return UpdatedStatusEnum.OUTDATED;\n return UpdatedStatusEnum.VERY_OUTDATED;\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\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\nexport function calculateUpdatedStatus(\n daysSinceLastModified: number,\n): UpdatedStatusEnumType {\n if (daysSinceLastModified <= 90) return UpdatedStatusEnum.UPDATED;\n if (daysSinceLastModified <= 180) return UpdatedStatusEnum.LITTLE_OUTDATED;\n if (daysSinceLastModified <= 270) return UpdatedStatusEnum.OUTDATED;\n return UpdatedStatusEnum.VERY_OUTDATED;\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\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 totalCount = allActions.length;\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 { totalCount, 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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"}
|