@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.
@@ -9,10 +9,18 @@ function DialogComponent({
9
9
  children,
10
10
  className
11
11
  }) {
12
- return /* @__PURE__ */ jsxs(Dialog, { isOpen, onOpenChange: onClick, className, children: [
13
- /* @__PURE__ */ jsx(DialogHeader, { className: styles.DialogHeader, children: /* @__PURE__ */ jsx(Text, { variant: "title-small", weight: "bold", children: header }) }),
14
- /* @__PURE__ */ jsx(DialogBody, { children })
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 isOpen={isOpen} onOpenChange={onClick} className={className}>\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,CAAC,MAAA,EAAA,EAAO,MAAA,EAAgB,YAAA,EAAc,SAAS,SAAA,EAC7C,QAAA,EAAA;AAAA,oBAAA,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,oBACA,GAAA,CAAC,cAAY,QAAA,EAAS;AAAA,GAAA,EACxB,CAAA;AAEJ;;;;"}
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 = ".DialogComponent_DialogHeader__5be9eff22a {\n padding-bottom: 12px;\n}\n";
4
- var styles = {"DialogHeader":"DialogComponent_DialogHeader__5be9eff22a"};
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 = ".RiScSelectionCard_selectTrigger__3e2e061704 button {\n background-color: transparent;\n}\n\n[role='listbox'] {\n max-height: 400px;\n overflow-y: auto;\n}\n\n.RiScSelectionCard_riScInfoDialog__3e2e061704 {\n padding: 24px;\n border-radius: 4px;\n width: 800px;\n}\n\n.RiScSelectionCard_riscSelectionDialogHeader__3e2e061704 {\n padding: 0 0 16px 0;\n}\n\n.RiScSelectionCard_riscSelectionDialogBody__3e2e061704 {\n gap: 16px;\n padding: 16px 0 0 0;\n}\n\n.RiScSelectionCard_riscDescriptionComponent__3e2e061704 {\n padding-bottom: 10px;\n}\n.RiScSelectionCard_componentLayout__3e2e061704 {\n height: 60%;\n}\n\n.RiScSelectionCard_riscDescriptionContainer__3e2e061704 {\n margin-bottom: 16px;\n}\n\n.RiScSelectionCard_riScInfoDialog__3e2e061704 {\n background-color: var(--bui-bg-app);\n}\n";
4
- var riscStyles = {"selectTrigger":"RiScSelectionCard_selectTrigger__3e2e061704","riScInfoDialog":"RiScSelectionCard_riScInfoDialog__3e2e061704","riscDescriptionComponent":"RiScSelectionCard_riscDescriptionComponent__3e2e061704","componentLayout":"RiScSelectionCard_componentLayout__3e2e061704","riscDescriptionContainer":"RiScSelectionCard_riscDescriptionContainer__3e2e061704"};
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 />\n <Box\n className={styles.currentRiskMarker}\n style={{\n left: `${clampedPercentage}%`,\n }}\n />\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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"}
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} />\n <Box className={styles.centered} />\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
+ {"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 = ".RiskMatrixScenarioCount_circle__6001a941b9.RiskMatrixScenarioCount_circle__6001a941b9 {\n height: 60%;\n aspect-ratio: 1 / 1;\n border-radius: 50%;\n cursor: pointer;\n min-height: 20px;\n}\n\n.RiskMatrixScenarioCount_circleHovered__6001a941b9.RiskMatrixScenarioCount_circleHovered__6001a941b9 {\n background-color: var(--ros-gray-300);\n}\n\n.RiskMatrixScenarioCount_tooltip__6001a941b9.RiskMatrixScenarioCount_tooltip__6001a941b9 {\n background-color: var(--bui-white);\n padding: 16px;\n max-width: 500px;\n}\n[data-theme-mode='dark'] .RiskMatrixScenarioCount_tooltip__6001a941b9.RiskMatrixScenarioCount_tooltip__6001a941b9 {\n background-color: var(--bui-bg-popover);\n}\n\n.RiskMatrixScenarioCount_tooltipArrow__6001a941b9.RiskMatrixScenarioCount_tooltipArrow__6001a941b9 {\n color: var(--bui-white);\n}\n[data-theme-mode='dark'] .RiskMatrixScenarioCount_tooltipArrow__6001a941b9.RiskMatrixScenarioCount_tooltipArrow__6001a941b9 {\n color: var(--bui-bg-popover);\n}\n\n.RiskMatrixScenarioCount_tooltipList__6001a941b9 {\n padding-left: 16px;\n font-size: 16px;\n color: var(--bui-black);\n}\n[data-theme-mode='dark'] .RiskMatrixScenarioCount_tooltipList__6001a941b9 {\n color: var(--bui-white);\n}\n\n.RiskMatrixScenarioCount_tooltipListItem__6001a941b9 {\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__6001a941b9 {\n &:hover {\n background-color: var(--ros-gray-600);\n }\n}\n\n.RiskMatrixScenarioCount_centered__6001a941b9 {\n display: flex;\n align-items: center;\n justify-content: center;\n}\n";
4
- var styles = {"circle":"RiskMatrixScenarioCount_circle__6001a941b9","circleHovered":"RiskMatrixScenarioCount_circleHovered__6001a941b9","tooltip":"RiskMatrixScenarioCount_tooltip__6001a941b9","tooltipArrow":"RiskMatrixScenarioCount_tooltipArrow__6001a941b9","tooltipList":"RiskMatrixScenarioCount_tooltipList__6001a941b9","tooltipListItem":"RiskMatrixScenarioCount_tooltipListItem__6001a941b9","centered":"RiskMatrixScenarioCount_centered__6001a941b9"};
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":";;;;;AAcO,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,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,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,oBAAoB,KAAA,CAAM,kBAAA;AAAA,QAC1B,UAAA,EACE,KAAA,CAAM,sBAAA,KAA2B,iBAAA,CAAkB;AAAA;AAAA;AAEvD,GAAA,EAEJ,CAAA;AAEJ;;;;"}
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;;;;"}
@@ -38,6 +38,8 @@ function ActionsCountButton(props) {
38
38
  t(translationKey),
39
39
  " (",
40
40
  props.count,
41
+ "/",
42
+ props.totalCount,
41
43
  ")"
42
44
  ]
43
45
  }
@@ -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":";;;;;;;;AAgBO,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;AAAA;AAAA;AAAA,GACpC;AAEJ;;;;"}
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,aAAA,EAAe,YAAA,EAAa,GACrD,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,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
+ {"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 { jsxs, jsx } from 'react/jsx-runtime';
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__ */ jsxs(
70
- Card,
69
+ return /* @__PURE__ */ jsx(
70
+ "div",
71
71
  {
72
- onMouseEnter: () => {
73
- if (isExpanded) return;
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
- className: classNames(styles.tableCard, {
91
- [styles.tableCardNoHover]: isExpanded
92
- }),
93
- style: {
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
- /* @__PURE__ */ jsxs(Flex, { align: "center", children: [
100
- isEditing && isDnDAllowed && /* @__PURE__ */ jsx(IconButton, { size: "small", ref: drag, children: /* @__PURE__ */ jsx(
101
- DragIndicatorIcon,
102
- {
103
- sx: { cursor: isDragging ? "grabbing" : "grab" }
104
- }
105
- ) }),
106
- /* @__PURE__ */ jsx(
107
- IconButton,
108
- {
109
- size: "medium",
110
- "data-action-root": true,
111
- onClick: (e) => {
112
- e.stopPropagation();
113
- setIsExpanded((prev) => !prev);
114
- },
115
- style: { padding: 0 },
116
- children: isExpanded ? /* @__PURE__ */ jsx("i", { className: "ri-arrow-down-s-line" }) : /* @__PURE__ */ jsx("i", { className: "ri-arrow-right-s-line" })
117
- }
118
- ),
119
- /* @__PURE__ */ jsx(
120
- Text,
121
- {
122
- as: "p",
123
- variant: "body-large",
124
- weight: "bold",
125
- style: { width: "35%", color: textColorAsBuiVariable },
126
- children: scenario.title
127
- }
128
- ),
129
- /* @__PURE__ */ jsxs(Flex, { align: "center", justify: "start", style: { width: "15%" }, children: [
130
- /* @__PURE__ */ jsx(
131
- RiskMatrixSquare,
132
- {
133
- size: "small",
134
- probability: findProbabilityIndex(scenario.risk.probability),
135
- consequence: findConsequenceIndex(scenario.risk.consequence)
136
- }
137
- ),
138
- /* @__PURE__ */ jsxs(Text, { variant: "body-medium", style: { color: textColorAsBuiVariable }, children: [
139
- t("scenarioTable.columns.probabilityChar"),
140
- ":",
141
- `${getProbabilityLevel(
142
- scenario.risk
143
- )} ${t("scenarioTable.columns.consequenceChar")}:${getConsequenceLevel(scenario.risk)}`
144
- ] })
145
- ] }),
146
- /* @__PURE__ */ jsx(
147
- Flex,
148
- {
149
- align: "center",
150
- justify: "start",
151
- style: { width: isEditing ? "30%" : "35%" },
152
- children: (() => {
153
- if (scenario.actions.length > 0) {
154
- return /* @__PURE__ */ jsx(
155
- ScenarioTableProgressBar,
156
- {
157
- completedCount: scenario.actions.filter(
158
- (a) => a.status === ActionStatusOptions.OK
159
- ).length,
160
- totalCount: scenario.actions.filter(
161
- (a) => a.status !== ActionStatusOptions.NotRelevant
162
- ).length,
163
- textColor: textColorAsBuiVariable
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
- return /* @__PURE__ */ jsx(Text, { style: { color: textColorAsBuiVariable }, children: t("scenarioTable.noActions") });
168
- })()
169
- }
170
- ),
171
- /* @__PURE__ */ jsxs(Flex, { align: "center", style: { width: "15%" }, children: [
172
- /* @__PURE__ */ jsx(
173
- RiskMatrixSquare,
174
- {
175
- size: "small",
176
- probability: findProbabilityIndex(
177
- scenario.remainingRisk.probability
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
- consequence: findConsequenceIndex(
180
- scenario.remainingRisk.consequence
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
- /* @__PURE__ */ jsx(
185
- Text,
186
- {
187
- variant: "body-medium",
188
- style: { color: textColorAsBuiVariable },
189
- children: `${t("scenarioTable.columns.probabilityChar")}:${getProbabilityLevel(
190
- scenario.remainingRisk
191
- )} ${t("scenarioTable.columns.consequenceChar")}:${getConsequenceLevel(scenario.remainingRisk)}`
192
- }
193
- )
194
- ] }),
195
- isEditing && /* @__PURE__ */ jsxs(Flex, { align: "center", justify: "end", children: [
196
- /* @__PURE__ */ jsx(
197
- IconButton,
198
- {
199
- size: "small",
200
- onClick: (event) => {
201
- event.stopPropagation();
202
- setScenarioDeletionDialogOpen(true);
203
- },
204
- children: /* @__PURE__ */ jsx(DeleteIcon, {})
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
- isOpen: isScenarioDeletionDialogOpen,
211
- setIsOpen: setScenarioDeletionDialogOpen,
212
- onConfirm: () => deleteScenario(riSc, updateRiSc, scenario)
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
- isExpanded && /* @__PURE__ */ jsx(Collapse, { in: isExpanded, timeout: "auto", unmountOnExit: true, children: /* @__PURE__ */ jsx("div", { "data-action-root": true, children: /* @__PURE__ */ jsx(
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} />\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} />}\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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"}
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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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kartverket/backstage-plugin-risk-scorecard",
3
- "version": "6.6.1",
3
+ "version": "6.7.1",
4
4
  "main": "dist/index.esm.js",
5
5
  "types": "dist/index.d.ts",
6
6
  "license": "MIT",