@kartverket/backstage-plugin-risk-scorecard 8.3.3 → 8.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/action/ActionView.esm.js +17 -18
- package/dist/components/action/ActionView.esm.js.map +1 -1
- package/dist/components/riskMatrix/RiskMatrix.esm.js +48 -35
- package/dist/components/riskMatrix/RiskMatrix.esm.js.map +1 -1
- package/dist/components/riskMatrix/RiskMatrix.module.css.esm.js +2 -2
- package/dist/components/riskMatrix/RiskMatrixScenarioCount.esm.js +7 -9
- package/dist/components/riskMatrix/RiskMatrixScenarioCount.esm.js.map +1 -1
- package/dist/components/riskMatrix/RiskMatrixSquare.esm.js +1 -1
- package/dist/components/riskMatrix/RiskMatrixSquare.esm.js.map +1 -1
- package/dist/components/scenarioTable/ScenarioTableRow.esm.js +2 -0
- package/dist/components/scenarioTable/ScenarioTableRow.esm.js.map +1 -1
- package/dist/utils/featureFlags.esm.js +10 -1
- package/dist/utils/featureFlags.esm.js.map +1 -1
- package/dist/utils/risk.esm.js +13 -1
- package/dist/utils/risk.esm.js.map +1 -1
- package/dist/utils/translations.esm.js +2 -0
- package/dist/utils/translations.esm.js.map +1 -1
- package/package.json +1 -1
|
@@ -41,6 +41,7 @@ function ActionView(props) {
|
|
|
41
41
|
toggleActionExpanded(props.action.ID);
|
|
42
42
|
},
|
|
43
43
|
onKeyDown: (e) => {
|
|
44
|
+
if (e.target !== e.currentTarget) return;
|
|
44
45
|
e.stopPropagation();
|
|
45
46
|
if (e.key === "Enter" || e.key === " ") {
|
|
46
47
|
e.preventDefault();
|
|
@@ -107,7 +108,21 @@ function ActionView(props) {
|
|
|
107
108
|
lastUpdatedBy: props.action.lastUpdatedBy
|
|
108
109
|
}
|
|
109
110
|
),
|
|
110
|
-
/* @__PURE__ */ jsx(UpdatedStatusBadge, { status: props.updatedStatus })
|
|
111
|
+
/* @__PURE__ */ jsx(UpdatedStatusBadge, { status: props.updatedStatus }),
|
|
112
|
+
/* @__PURE__ */ jsx(
|
|
113
|
+
IconButton,
|
|
114
|
+
{
|
|
115
|
+
sx: {
|
|
116
|
+
marginLeft: "auto",
|
|
117
|
+
transition: "opacity 300ms ease-in"
|
|
118
|
+
},
|
|
119
|
+
onClick: (e) => {
|
|
120
|
+
e.stopPropagation();
|
|
121
|
+
props.toggleEditMode();
|
|
122
|
+
},
|
|
123
|
+
children: /* @__PURE__ */ jsx("i", { className: "ri-edit-line" })
|
|
124
|
+
}
|
|
125
|
+
)
|
|
111
126
|
] }),
|
|
112
127
|
props.allowDeletion && /* @__PURE__ */ jsx(
|
|
113
128
|
IconButton,
|
|
@@ -131,23 +146,7 @@ function ActionView(props) {
|
|
|
131
146
|
timeout: "auto",
|
|
132
147
|
unmountOnExit: true,
|
|
133
148
|
children: /* @__PURE__ */ jsxs(Box, { ml: "56px", mt: "4", mb: "2", children: [
|
|
134
|
-
/* @__PURE__ */
|
|
135
|
-
/* @__PURE__ */ jsx(Text, { as: "p", variant: "body-large", weight: "bold", children: t("dictionary.description") }),
|
|
136
|
-
props.allowEdit && /* @__PURE__ */ jsx(
|
|
137
|
-
IconButton,
|
|
138
|
-
{
|
|
139
|
-
sx: {
|
|
140
|
-
marginLeft: "auto",
|
|
141
|
-
transition: "opacity 300ms ease-in"
|
|
142
|
-
},
|
|
143
|
-
onClick: (e) => {
|
|
144
|
-
e.stopPropagation();
|
|
145
|
-
props.toggleEditMode();
|
|
146
|
-
},
|
|
147
|
-
children: /* @__PURE__ */ jsx("i", { className: "ri-edit-line" })
|
|
148
|
-
}
|
|
149
|
-
)
|
|
150
|
-
] }),
|
|
149
|
+
/* @__PURE__ */ jsx(Flex, { justify: "between", mt: "8px", align: "end", children: /* @__PURE__ */ jsx(Text, { as: "p", variant: "body-large", weight: "bold", children: t("dictionary.description") }) }),
|
|
151
150
|
/* @__PURE__ */ jsx(Markdown, { description: props.action.description }),
|
|
152
151
|
/* @__PURE__ */ jsx(ActionURL, { url: props.action.url }),
|
|
153
152
|
props.action.comment && /* @__PURE__ */ jsxs(Box, { mt: "2", children: [
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ActionView.esm.js","sources":["../../../src/components/action/ActionView.tsx"],"sourcesContent":["import { Box, Flex, Text } from '@backstage/ui';\nimport IconButton from '@mui/material/IconButton';\nimport { DualButtonWithMenu } from '../common/DualButtonWithMenu.tsx';\nimport {\n actionStatusOptionsToTranslationKeys,\n getTranslatedActionStatus,\n UpdatedStatusEnumType,\n} from '../../utils/utilityfunctions.ts';\nimport { ActionStatusOptions } from '../../utils/constants.ts';\nimport { ScenarioLastUpdatedLabel } from '../scenario/ScenarioLastUpdatedLabel.tsx';\nimport DeleteIcon from '@mui/icons-material/Delete';\nimport Collapse from '@mui/material/Collapse';\nimport { Markdown } from '../common/Markdown.tsx';\nimport { ActionURL } from './ActionURL.tsx';\nimport { useScenario } from '../../contexts/ScenarioContext.tsx';\nimport { Action } from '../../utils/types.ts';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { pluginRiScTranslationRef } from '../../utils/translations.ts';\nimport { UpdatedStatusBadge } from '../common/UpdatedStatusBadge.tsx';\n\ntype ActionViewProps = {\n action: Action;\n onRefreshActionStatus: (action: Action) => void;\n onNewActionStatus: (actionId: string, newStatus: ActionStatusOptions) => void;\n toggleEditMode: () => void;\n openDeleteDialog: () => void;\n updatedStatus: UpdatedStatusEnumType | 'UPDATING' | 'NONE';\n optimisticStatus?: ActionStatusOptions;\n allowDeletion?: boolean;\n allowEdit?: boolean;\n index?: number;\n};\n\nconst getActionStatusButtonClass = (status: string): string => {\n switch (status) {\n case ActionStatusOptions.OK:\n return 'ros-button-green';\n case ActionStatusOptions.NotOK:\n return 'ros-button-red';\n default:\n return 'ros-button-gray';\n }\n};\n\nexport function ActionView(props: ActionViewProps) {\n const { t } = useTranslationRef(pluginRiScTranslationRef);\n const { isActionExpanded, toggleActionExpanded } = useScenario();\n const isExpanded = isActionExpanded(props.action.ID);\n\n return (\n <>\n <div\n role=\"button\"\n tabIndex={0}\n onClick={e => {\n e.stopPropagation();\n\n const target = e.target as HTMLElement | null;\n if (target && target.closest('[data-no-row-toggle]')) return;\n\n toggleActionExpanded(props.action.ID);\n }}\n onKeyDown={e => {\n // Prevent keyboard event from bubbling up to parent(s)\n e.stopPropagation();\n\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n toggleActionExpanded(props.action.ID);\n }\n }}\n style={{ cursor: 'pointer' }}\n >\n <Flex align=\"center\" gap=\"1\" justify=\"between\">\n <Flex align=\"center\" justify=\"start\" style={{ width: '40%' }}>\n <IconButton\n onClick={e => {\n e.stopPropagation();\n toggleActionExpanded(props.action.ID);\n }}\n >\n <i\n className={`ri-arrow-${isExpanded ? 'down' : 'right'}-s-line`}\n />\n </IconButton>\n <Text variant=\"body-large\">\n {props.action.title ??\n `${t('dictionary.measure')} ${props.index ?? ''}`}\n </Text>\n </Flex>\n <Flex align=\"center\" justify=\"end\">\n <DualButtonWithMenu\n propsCommon={{\n className: getActionStatusButtonClass(\n props.optimisticStatus ?? props.action.status,\n ),\n }}\n propsLeft={{\n children: getTranslatedActionStatus(\n props.optimisticStatus ?? props.action.status,\n t,\n ),\n }}\n propsRight={{\n iconEnd: <i className=\"ri-loop-left-line\" />,\n onClick: () => {\n props.onRefreshActionStatus(props.action);\n },\n }}\n menuItems={Object.values(ActionStatusOptions).map(value => ({\n key: value,\n // @ts-ignore\n label: t(\n actionStatusOptionsToTranslationKeys[\n value as ActionStatusOptions\n ],\n ),\n onClick: () => props.onNewActionStatus(props.action.ID, value),\n selected: props.optimisticStatus\n ? value === props.optimisticStatus\n : value === props.action.status,\n }))}\n />\n <Flex gap=\"0\" align=\"center\">\n <ScenarioLastUpdatedLabel\n lastUpdated={\n !!props.optimisticStatus\n ? new Date()\n : props.action.lastUpdated\n }\n lastUpdatedBy={props.action.lastUpdatedBy}\n />\n <UpdatedStatusBadge status={props.updatedStatus} />\n </Flex>\n {props.allowDeletion && (\n <IconButton\n onClick={e => {\n e.stopPropagation();\n props.openDeleteDialog();\n }}\n >\n <DeleteIcon />\n </IconButton>\n )}\n </Flex>\n </Flex>\n </div>\n <Collapse\n in={isExpanded}\n sx={{ marginTop: 1 }}\n timeout=\"auto\"\n unmountOnExit\n >\n <Box ml=\"56px\" mt=\"4\" mb=\"2\">\n <Flex justify=\"between\" mt=\"8px\" align=\"end\">\n <Text as=\"p\" variant=\"body-large\" weight=\"bold\">\n {t('dictionary.description')}\n </Text>\n {props.allowEdit && (\n <IconButton\n sx={{\n marginLeft: 'auto',\n transition: 'opacity 300ms ease-in',\n }}\n onClick={e => {\n e.stopPropagation();\n props.toggleEditMode();\n }}\n >\n <i className=\"ri-edit-line\" />\n </IconButton>\n )}\n </Flex>\n <Markdown description={props.action.description} />\n <ActionURL url={props.action.url} />\n {props.action.comment && (\n <Box mt=\"2\">\n <Text as=\"p\" variant=\"body-large\" weight=\"bold\">\n {t('dictionary.comment')}\n </Text>\n <Text as=\"p\" variant=\"body-large\">\n {props.action.comment}\n </Text>\n </Box>\n )}\n </Box>\n </Collapse>\n </>\n );\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ActionView.esm.js","sources":["../../../src/components/action/ActionView.tsx"],"sourcesContent":["import { Box, Flex, Text } from '@backstage/ui';\nimport IconButton from '@mui/material/IconButton';\nimport { DualButtonWithMenu } from '../common/DualButtonWithMenu.tsx';\nimport {\n actionStatusOptionsToTranslationKeys,\n getTranslatedActionStatus,\n UpdatedStatusEnumType,\n} from '../../utils/utilityfunctions.ts';\nimport { ActionStatusOptions } from '../../utils/constants.ts';\nimport { ScenarioLastUpdatedLabel } from '../scenario/ScenarioLastUpdatedLabel.tsx';\nimport DeleteIcon from '@mui/icons-material/Delete';\nimport Collapse from '@mui/material/Collapse';\nimport { Markdown } from '../common/Markdown.tsx';\nimport { ActionURL } from './ActionURL.tsx';\nimport { useScenario } from '../../contexts/ScenarioContext.tsx';\nimport { Action } from '../../utils/types.ts';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { pluginRiScTranslationRef } from '../../utils/translations.ts';\nimport { UpdatedStatusBadge } from '../common/UpdatedStatusBadge.tsx';\n\ntype ActionViewProps = {\n action: Action;\n onRefreshActionStatus: (action: Action) => void;\n onNewActionStatus: (actionId: string, newStatus: ActionStatusOptions) => void;\n toggleEditMode: () => void;\n openDeleteDialog: () => void;\n updatedStatus: UpdatedStatusEnumType | 'UPDATING' | 'NONE';\n optimisticStatus?: ActionStatusOptions;\n allowDeletion?: boolean;\n allowEdit?: boolean;\n index?: number;\n};\n\nconst getActionStatusButtonClass = (status: string): string => {\n switch (status) {\n case ActionStatusOptions.OK:\n return 'ros-button-green';\n case ActionStatusOptions.NotOK:\n return 'ros-button-red';\n default:\n return 'ros-button-gray';\n }\n};\n\nexport function ActionView(props: ActionViewProps) {\n const { t } = useTranslationRef(pluginRiScTranslationRef);\n const { isActionExpanded, toggleActionExpanded } = useScenario();\n const isExpanded = isActionExpanded(props.action.ID);\n\n return (\n <>\n <div\n role=\"button\"\n tabIndex={0}\n onClick={e => {\n e.stopPropagation();\n\n const target = e.target as HTMLElement | null;\n if (target && target.closest('[data-no-row-toggle]')) return;\n\n toggleActionExpanded(props.action.ID);\n }}\n onKeyDown={e => {\n if (e.target !== e.currentTarget) return;\n\n // Prevent keyboard event from bubbling up to parent(s)\n e.stopPropagation();\n\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n toggleActionExpanded(props.action.ID);\n }\n }}\n style={{ cursor: 'pointer' }}\n >\n <Flex align=\"center\" gap=\"1\" justify=\"between\">\n <Flex align=\"center\" justify=\"start\" style={{ width: '40%' }}>\n <IconButton\n onClick={e => {\n e.stopPropagation();\n toggleActionExpanded(props.action.ID);\n }}\n >\n <i\n className={`ri-arrow-${isExpanded ? 'down' : 'right'}-s-line`}\n />\n </IconButton>\n <Text variant=\"body-large\">\n {props.action.title ??\n `${t('dictionary.measure')} ${props.index ?? ''}`}\n </Text>\n </Flex>\n <Flex align=\"center\" justify=\"end\">\n <DualButtonWithMenu\n propsCommon={{\n className: getActionStatusButtonClass(\n props.optimisticStatus ?? props.action.status,\n ),\n }}\n propsLeft={{\n children: getTranslatedActionStatus(\n props.optimisticStatus ?? props.action.status,\n t,\n ),\n }}\n propsRight={{\n iconEnd: <i className=\"ri-loop-left-line\" />,\n onClick: () => {\n props.onRefreshActionStatus(props.action);\n },\n }}\n menuItems={Object.values(ActionStatusOptions).map(value => ({\n key: value,\n // @ts-ignore\n label: t(\n actionStatusOptionsToTranslationKeys[\n value as ActionStatusOptions\n ],\n ),\n onClick: () => props.onNewActionStatus(props.action.ID, value),\n selected: props.optimisticStatus\n ? value === props.optimisticStatus\n : value === props.action.status,\n }))}\n />\n <Flex gap=\"0\" align=\"center\">\n <ScenarioLastUpdatedLabel\n lastUpdated={\n !!props.optimisticStatus\n ? new Date()\n : props.action.lastUpdated\n }\n lastUpdatedBy={props.action.lastUpdatedBy}\n />\n <UpdatedStatusBadge status={props.updatedStatus} />\n <IconButton\n sx={{\n marginLeft: 'auto',\n transition: 'opacity 300ms ease-in',\n }}\n onClick={e => {\n e.stopPropagation();\n props.toggleEditMode();\n }}\n >\n <i className=\"ri-edit-line\" />\n </IconButton>\n </Flex>\n {props.allowDeletion && (\n <IconButton\n onClick={e => {\n e.stopPropagation();\n props.openDeleteDialog();\n }}\n >\n <DeleteIcon />\n </IconButton>\n )}\n </Flex>\n </Flex>\n </div>\n <Collapse\n in={isExpanded}\n sx={{ marginTop: 1 }}\n timeout=\"auto\"\n unmountOnExit\n >\n <Box ml=\"56px\" mt=\"4\" mb=\"2\">\n <Flex justify=\"between\" mt=\"8px\" align=\"end\">\n <Text as=\"p\" variant=\"body-large\" weight=\"bold\">\n {t('dictionary.description')}\n </Text>\n </Flex>\n <Markdown description={props.action.description} />\n <ActionURL url={props.action.url} />\n {props.action.comment && (\n <Box mt=\"2\">\n <Text as=\"p\" variant=\"body-large\" weight=\"bold\">\n {t('dictionary.comment')}\n </Text>\n <Text as=\"p\" variant=\"body-large\">\n {props.action.comment}\n </Text>\n </Box>\n )}\n </Box>\n </Collapse>\n </>\n );\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -6,16 +6,19 @@ import { riskMatrix } from '../../utils/constants.esm.js';
|
|
|
6
6
|
import { useTranslationRef } from '@backstage/core-plugin-api/alpha';
|
|
7
7
|
import { pluginRiScTranslationRef } from '../../utils/translations.esm.js';
|
|
8
8
|
import { RiskMatrixTabs } from './utils.esm.js';
|
|
9
|
-
import { Card, CardHeader, Text, CardBody, Box } from '@backstage/ui';
|
|
9
|
+
import { Card, CardHeader, Text, CardBody, Box, Flex } from '@backstage/ui';
|
|
10
10
|
import { RiskMatrixSquare } from './RiskMatrixSquare.esm.js';
|
|
11
11
|
import { CurrentRisk } from './CurrentRisk.esm.js';
|
|
12
|
+
import { useShowCurrentMatrixFeatureFlag } from '../../utils/featureFlags.esm.js';
|
|
12
13
|
import styles from './RiskMatrix.module.css.esm.js';
|
|
13
14
|
|
|
14
15
|
function RiskMatrix({
|
|
15
16
|
riScWithMetadata
|
|
16
17
|
}) {
|
|
17
18
|
const { t } = useTranslationRef(pluginRiScTranslationRef);
|
|
19
|
+
const showCurrentMatrix = useShowCurrentMatrixFeatureFlag();
|
|
18
20
|
const [tab, setTab] = useState(RiskMatrixTabs.initialRisk);
|
|
21
|
+
const description = t("riskMatrix.currentRisk.matrixDescription");
|
|
19
22
|
return /* @__PURE__ */ jsxs(Card, { className: styles.card, children: [
|
|
20
23
|
/* @__PURE__ */ jsx(CardHeader, { children: /* @__PURE__ */ jsx(Text, { variant: "title-small", weight: "bold", children: t("riskMatrix.title") }) }),
|
|
21
24
|
/* @__PURE__ */ jsxs(CardBody, { children: [
|
|
@@ -29,45 +32,55 @@ function RiskMatrix({
|
|
|
29
32
|
children: /* @__PURE__ */ jsx(AggregatedCost, { riSc: riScWithMetadata.content, riskType: tab })
|
|
30
33
|
}
|
|
31
34
|
),
|
|
32
|
-
tab
|
|
33
|
-
/* @__PURE__ */
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
35
|
+
(showCurrentMatrix || tab !== RiskMatrixTabs.currentRisk) && /* @__PURE__ */ jsxs(Box, { className: styles.gridWrapper, children: [
|
|
36
|
+
/* @__PURE__ */ jsxs(Box, { className: styles.grid, children: [
|
|
37
|
+
/* @__PURE__ */ jsx(Box, { className: styles.konsekvens, children: /* @__PURE__ */ jsx(
|
|
38
|
+
Text,
|
|
39
|
+
{
|
|
40
|
+
variant: "title-x-small",
|
|
41
|
+
weight: "bold",
|
|
42
|
+
className: styles.centered,
|
|
43
|
+
children: t("dictionary.consequence")
|
|
44
|
+
}
|
|
45
|
+
) }),
|
|
46
|
+
riskMatrix.map((row, rowIndex) => /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
47
|
+
/* @__PURE__ */ jsx(Box, { className: styles.centered, children: /* @__PURE__ */ jsx(Text, { variant: "title-x-small", weight: "bold", children: 5 - rowIndex }) }),
|
|
48
|
+
row.map((_, colIndex) => /* @__PURE__ */ jsx(
|
|
49
|
+
RiskMatrixSquare,
|
|
50
|
+
{
|
|
51
|
+
size: "grid",
|
|
52
|
+
consequence: 4 - rowIndex,
|
|
53
|
+
probability: colIndex,
|
|
54
|
+
riScCountObject: {
|
|
55
|
+
riskTab: tab,
|
|
56
|
+
riSc: riScWithMetadata
|
|
57
|
+
}
|
|
58
|
+
},
|
|
59
|
+
`S:${colIndex} K:${4 - rowIndex}`
|
|
60
|
+
))
|
|
61
|
+
] }, rowIndex)),
|
|
62
|
+
/* @__PURE__ */ jsx(Box, { className: styles.centered, children: null }),
|
|
63
|
+
/* @__PURE__ */ jsx(Box, { className: styles.centered, children: null }),
|
|
64
|
+
riskMatrix.map((_, col) => /* @__PURE__ */ jsx(Box, { className: styles.centered, children: /* @__PURE__ */ jsx(Text, { variant: "title-x-small", weight: "bold", children: col + 1 }) }, col)),
|
|
65
|
+
/* @__PURE__ */ jsx(Box, { className: styles.sannsynlighet, children: /* @__PURE__ */ jsx(
|
|
66
|
+
Text,
|
|
46
67
|
{
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
`S:${colIndex} K:${4 - rowIndex}`
|
|
56
|
-
))
|
|
57
|
-
] }, rowIndex)),
|
|
58
|
-
/* @__PURE__ */ jsx(Box, { className: styles.centered, children: null }),
|
|
59
|
-
/* @__PURE__ */ jsx(Box, { className: styles.centered, children: null }),
|
|
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
|
-
/* @__PURE__ */ jsx(Box, { className: styles.sannsynlighet, children: /* @__PURE__ */ jsx(
|
|
68
|
+
weight: "bold",
|
|
69
|
+
variant: "title-x-small",
|
|
70
|
+
className: styles.centered,
|
|
71
|
+
children: t("dictionary.probability")
|
|
72
|
+
}
|
|
73
|
+
) })
|
|
74
|
+
] }),
|
|
75
|
+
tab === RiskMatrixTabs.currentRisk && /* @__PURE__ */ jsx(Flex, { children: /* @__PURE__ */ jsx(
|
|
62
76
|
Text,
|
|
63
77
|
{
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
className: styles.centered,
|
|
67
|
-
children: t("dictionary.probability")
|
|
78
|
+
variant: "body-large",
|
|
79
|
+
dangerouslySetInnerHTML: { __html: description }
|
|
68
80
|
}
|
|
69
81
|
) })
|
|
70
|
-
] })
|
|
82
|
+
] }),
|
|
83
|
+
tab === RiskMatrixTabs.currentRisk && /* @__PURE__ */ jsx(Box, { className: styles.currentRiskReduction, children: /* @__PURE__ */ jsx(CurrentRisk, { risc: riScWithMetadata }) })
|
|
71
84
|
] })
|
|
72
85
|
] });
|
|
73
86
|
}
|
|
@@ -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
|
|
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, Flex } from '@backstage/ui';\nimport { RiskMatrixSquare } from './RiskMatrixSquare.tsx';\nimport { CurrentRisk } from './CurrentRisk.tsx';\nimport { useShowCurrentMatrixFeatureFlag } from '../../utils/featureFlags.ts';\n\nimport styles from './RiskMatrix.module.css';\nexport function RiskMatrix({\n riScWithMetadata,\n}: {\n riScWithMetadata: RiScWithMetadata;\n}) {\n const { t } = useTranslationRef(pluginRiScTranslationRef);\n const showCurrentMatrix = useShowCurrentMatrixFeatureFlag();\n const [tab, setTab] = useState<RiskMatrixTabs>(RiskMatrixTabs.initialRisk);\n const description = t('riskMatrix.currentRisk.matrixDescription');\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 {(showCurrentMatrix || tab !== RiskMatrixTabs.currentRisk) && (\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 riskTab: tab,\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 {tab === RiskMatrixTabs.currentRisk && (\n <Flex>\n <Text\n variant=\"body-large\"\n dangerouslySetInnerHTML={{ __html: description }}\n />\n </Flex>\n )}\n </Box>\n )}\n {tab === RiskMatrixTabs.currentRisk && (\n <Box className={styles.currentRiskReduction}>\n <CurrentRisk risc={riScWithMetadata} />\n </Box>\n )}\n </CardBody>\n </Card>\n );\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import styleInject from '../../node_modules_dist/style-inject/dist/style-inject.es.esm.js';
|
|
2
2
|
|
|
3
|
-
var css_248z = ".
|
|
4
|
-
var styles = {"gridWrapper":"
|
|
3
|
+
var css_248z = ".RiskMatrix_gridWrapper__c20cc20ed1 {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n width: 100%;\n max-width: 400px;\n margin: 0 auto;\n gap: 16px;\n padding-top: 32px;\n}\n\n.RiskMatrix_grid__c20cc20ed1 {\n width: 100%;\n display: grid;\n grid-template-rows: repeat(5, 1fr) auto auto;\n grid-template-columns: 30px 30px repeat(5, 1fr);\n gap: 4px;\n}\n\n.RiskMatrix_centered__c20cc20ed1 {\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\n.RiskMatrix_konsekvens__c20cc20ed1 {\n grid-row: 1 / span 5;\n writing-mode: vertical-lr;\n transform: rotate(180deg);\n}\n\n.RiskMatrix_sannsynlighet__c20cc20ed1 {\n grid-row: 7;\n grid-column: 3 / span 5;\n}\n\n.RiskMatrix_estimatedCostContainer__c20cc20ed1 {\n margin-top: 18px;\n}\n\n.RiskMatrix_currentRiskReduction__c20cc20ed1 {\n width: 100%;\n max-width: 400px;\n margin: 0 auto;\n}\n";
|
|
4
|
+
var styles = {"gridWrapper":"RiskMatrix_gridWrapper__c20cc20ed1","grid":"RiskMatrix_grid__c20cc20ed1","centered":"RiskMatrix_centered__c20cc20ed1","konsekvens":"RiskMatrix_konsekvens__c20cc20ed1","sannsynlighet":"RiskMatrix_sannsynlighet__c20cc20ed1","currentRiskReduction":"RiskMatrix_currentRiskReduction__c20cc20ed1"};
|
|
5
5
|
styleInject(css_248z);
|
|
6
6
|
|
|
7
7
|
export { styles as default };
|
|
@@ -8,6 +8,7 @@ import { useTranslationRef } from '@backstage/core-plugin-api/alpha';
|
|
|
8
8
|
import { pluginRiScTranslationRef } from '../../utils/translations.esm.js';
|
|
9
9
|
import { useScenario } from '../../contexts/ScenarioContext.esm.js';
|
|
10
10
|
import { findProbabilityIndex, findConsequenceIndex } from '../../utils/utilityfunctions.esm.js';
|
|
11
|
+
import { getScenarioRiskForMatrix } from '../../utils/risk.esm.js';
|
|
11
12
|
import { Text } from '@backstage/ui';
|
|
12
13
|
import styles from './RiskMatrixScenarioCount.module.css.esm.js';
|
|
13
14
|
|
|
@@ -15,7 +16,7 @@ function RiskMatrixScenarioCount({
|
|
|
15
16
|
riScWithMetadata,
|
|
16
17
|
probability,
|
|
17
18
|
consequence,
|
|
18
|
-
|
|
19
|
+
riskTab
|
|
19
20
|
}) {
|
|
20
21
|
const { t } = useTranslationRef(pluginRiScTranslationRef);
|
|
21
22
|
const [tooltipOpen, setTooltipOpen] = useState(false);
|
|
@@ -23,7 +24,7 @@ function RiskMatrixScenarioCount({
|
|
|
23
24
|
const { openScenarioDrawer, hoveredScenarios, setHoveredScenarios } = useScenario();
|
|
24
25
|
useEffect(() => {
|
|
25
26
|
setTooltipOpen(false);
|
|
26
|
-
}, [
|
|
27
|
+
}, [riskTab]);
|
|
27
28
|
function handleScenarioClick(ID) {
|
|
28
29
|
setTooltipOpen(false);
|
|
29
30
|
openScenarioDrawer(
|
|
@@ -31,13 +32,10 @@ function RiskMatrixScenarioCount({
|
|
|
31
32
|
riScWithMetadata.status !== RiScStatus.DeletionDraft && riScWithMetadata.status !== RiScStatus.DeletionSentForApproval
|
|
32
33
|
);
|
|
33
34
|
}
|
|
34
|
-
const scenarios = riScWithMetadata.content.scenarios.filter(
|
|
35
|
-
(scenario)
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
initialRisk ? scenario.risk.consequence : scenario.remainingRisk.consequence
|
|
39
|
-
) === consequence
|
|
40
|
-
);
|
|
35
|
+
const scenarios = riScWithMetadata.content.scenarios.filter((scenario) => {
|
|
36
|
+
const matrixRisk = getScenarioRiskForMatrix(scenario, riskTab);
|
|
37
|
+
return findProbabilityIndex(matrixRisk.probability) === probability && findConsequenceIndex(matrixRisk.consequence) === consequence;
|
|
38
|
+
});
|
|
41
39
|
if (scenarios.length === 0) {
|
|
42
40
|
return null;
|
|
43
41
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RiskMatrixScenarioCount.esm.js","sources":["../../../src/components/riskMatrix/RiskMatrixScenarioCount.tsx"],"sourcesContent":["import ClickAwayListener from '@mui/material/ClickAwayListener';\nimport Paper from '@mui/material/Paper';\nimport Tooltip from '@mui/material/Tooltip';\nimport { useState, useEffect } from 'react';\nimport { RiScStatus, RiScWithMetadata } from '../../utils/types';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { pluginRiScTranslationRef } from '../../utils/translations';\nimport { useScenario } from '../../contexts/ScenarioContext';\nimport {\n findConsequenceIndex,\n findProbabilityIndex,\n} from '../../utils/utilityfunctions';\nimport { Text } from '@backstage/ui';\nimport styles from './RiskMatrixScenarioCount.module.css';\n\ninterface ScenarioCountProps {\n riScWithMetadata: RiScWithMetadata;\n probability: number;\n consequence: number;\n
|
|
1
|
+
{"version":3,"file":"RiskMatrixScenarioCount.esm.js","sources":["../../../src/components/riskMatrix/RiskMatrixScenarioCount.tsx"],"sourcesContent":["import ClickAwayListener from '@mui/material/ClickAwayListener';\nimport Paper from '@mui/material/Paper';\nimport Tooltip from '@mui/material/Tooltip';\nimport { useState, useEffect } from 'react';\nimport { RiScStatus, RiScWithMetadata } from '../../utils/types';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { pluginRiScTranslationRef } from '../../utils/translations';\nimport { useScenario } from '../../contexts/ScenarioContext';\nimport {\n findConsequenceIndex,\n findProbabilityIndex,\n} from '../../utils/utilityfunctions';\nimport { getScenarioRiskForMatrix } from '../../utils/risk';\nimport { Text } from '@backstage/ui';\nimport { RiskMatrixTabs } from './utils.tsx';\nimport styles from './RiskMatrixScenarioCount.module.css';\n\ninterface ScenarioCountProps {\n riScWithMetadata: RiScWithMetadata;\n probability: number;\n consequence: number;\n riskTab: RiskMatrixTabs;\n}\n\nexport function RiskMatrixScenarioCount({\n riScWithMetadata,\n probability,\n consequence,\n riskTab,\n}: ScenarioCountProps) {\n const { t } = useTranslationRef(pluginRiScTranslationRef);\n\n const [tooltipOpen, setTooltipOpen] = useState(false);\n const [isHovered, setIsHovered] = useState(false);\n const { openScenarioDrawer, hoveredScenarios, setHoveredScenarios } =\n useScenario();\n\n useEffect(() => {\n setTooltipOpen(false);\n }, [riskTab]);\n\n function handleScenarioClick(ID: string) {\n setTooltipOpen(false);\n openScenarioDrawer(\n ID,\n riScWithMetadata.status !== RiScStatus.DeletionDraft &&\n riScWithMetadata.status !== RiScStatus.DeletionSentForApproval,\n );\n }\n\n const scenarios = riScWithMetadata.content.scenarios.filter(scenario => {\n const matrixRisk = getScenarioRiskForMatrix(scenario, riskTab);\n\n return (\n findProbabilityIndex(matrixRisk.probability) === probability &&\n findConsequenceIndex(matrixRisk.consequence) === consequence\n );\n });\n\n if (scenarios.length === 0) {\n return null;\n }\n const isHighlightedFromExternal = scenarios.some(s =>\n hoveredScenarios.some(h => h.ID === s.ID),\n );\n\n const tooltipList = (\n <div>\n <Text variant=\"title-x-small\" weight=\"bold\">\n {t('riskMatrix.tooltip.title')}\n </Text>\n <ul className={styles.tooltipList}>\n {scenarios.map(scenario => (\n <li key={scenario.ID}>\n <div\n className={styles.tooltipListItem}\n role=\"button\"\n tabIndex={0}\n onClick={e => {\n e.stopPropagation();\n handleScenarioClick(scenario.ID);\n }}\n onKeyDown={e => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n handleScenarioClick(scenario.ID);\n }\n }}\n >\n <Text>{scenario.title}</Text>\n </div>\n </li>\n ))}\n </ul>\n </div>\n );\n\n return (\n <ClickAwayListener onClickAway={() => setTooltipOpen(false)}>\n <Tooltip\n slotProps={{\n tooltip: { className: styles.tooltip },\n arrow: { className: styles.tooltipArrow },\n }}\n title={tooltipList}\n placement=\"right\"\n arrow\n open={tooltipOpen}\n >\n <Paper\n className={`${styles.circle} ${styles.centered} ${\n isHovered || isHighlightedFromExternal ? styles.circleHovered : ''\n }`}\n elevation={10}\n onClick={() => setTooltipOpen(!tooltipOpen)}\n onMouseEnter={() => {\n setIsHovered(true);\n // Add scenarios to hovered list using functional update and dedupe by ID\n setHoveredScenarios(prev => {\n const map = new Map<string, (typeof scenarios)[0]>();\n prev.forEach(p => map.set(p.ID, p));\n scenarios.forEach(s => map.set(s.ID, s));\n return Array.from(map.values());\n });\n }}\n onMouseLeave={() => {\n setIsHovered(false);\n setHoveredScenarios(prev =>\n prev.filter(s => !scenarios.some(s2 => s2.ID === s.ID)),\n );\n }}\n >\n <Text variant=\"body-large\" weight=\"bold\">\n {scenarios.length}\n </Text>\n </Paper>\n </Tooltip>\n </ClickAwayListener>\n );\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -18,7 +18,7 @@ function RiskMatrixSquare(props) {
|
|
|
18
18
|
riScWithMetadata: props.riScCountObject.riSc,
|
|
19
19
|
probability: props.probability,
|
|
20
20
|
consequence: props.consequence,
|
|
21
|
-
|
|
21
|
+
riskTab: props.riScCountObject.riskTab
|
|
22
22
|
}
|
|
23
23
|
)
|
|
24
24
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RiskMatrixSquare.esm.js","sources":["../../../src/components/riskMatrix/RiskMatrixSquare.tsx"],"sourcesContent":["import { RiScWithMetadata } from '../../utils/types.ts';\nimport { riskMatrix, riskMatrixStroke } from '../../utils/constants.ts';\nimport { RiskMatrixScenarioCount } from './RiskMatrixScenarioCount.tsx';\nimport styles from './RiskMatrixSquare.module.css';\n\ntype RiskMatrixSquareProps = {\n size: 'small' | 'grid';\n probability: number; // 0 - 4\n consequence: number; // 0 - 4\n riScCountObject?: {\n riSc: RiScWithMetadata;\n
|
|
1
|
+
{"version":3,"file":"RiskMatrixSquare.esm.js","sources":["../../../src/components/riskMatrix/RiskMatrixSquare.tsx"],"sourcesContent":["import { RiScWithMetadata } from '../../utils/types.ts';\nimport { riskMatrix, riskMatrixStroke } from '../../utils/constants.ts';\nimport { RiskMatrixScenarioCount } from './RiskMatrixScenarioCount.tsx';\nimport { RiskMatrixTabs } from './utils.tsx';\nimport styles from './RiskMatrixSquare.module.css';\n\ntype RiskMatrixSquareProps = {\n size: 'small' | 'grid';\n probability: number; // 0 - 4\n consequence: number; // 0 - 4\n riScCountObject?: {\n riSc: RiScWithMetadata;\n riskTab: RiskMatrixTabs;\n };\n};\n\nexport function RiskMatrixSquare(props: RiskMatrixSquareProps) {\n return (\n <div\n className={`${styles.squareWithRiScCount} ${props.size === 'small' ? styles.smallSquare : ''}`}\n style={{\n backgroundColor: riskMatrix[4 - props.consequence][props.probability],\n borderColor: riskMatrixStroke[4 - props.consequence][props.probability],\n }}\n key={`S:${props.probability} K:${props.consequence}`}\n >\n {props.riScCountObject && (\n <RiskMatrixScenarioCount\n riScWithMetadata={props.riScCountObject.riSc}\n probability={props.probability}\n consequence={props.consequence}\n riskTab={props.riScCountObject.riskTab}\n />\n )}\n </div>\n );\n}\n"],"names":[],"mappings":";;;;;AAgBO,SAAS,iBAAiB,KAAA,EAA8B;AAC7D,EAAA,uBACE,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,CAAA,EAAG,MAAA,CAAO,mBAAmB,CAAA,CAAA,EAAI,MAAM,IAAA,KAAS,OAAA,GAAU,MAAA,CAAO,WAAA,GAAc,EAAE,CAAA,CAAA;AAAA,MAC5F,KAAA,EAAO;AAAA,QACL,iBAAiB,UAAA,CAAW,CAAA,GAAI,MAAM,WAAW,CAAA,CAAE,MAAM,WAAW,CAAA;AAAA,QACpE,aAAa,gBAAA,CAAiB,CAAA,GAAI,MAAM,WAAW,CAAA,CAAE,MAAM,WAAW;AAAA,OACxE;AAAA,MAGC,gBAAM,eAAA,oBACL,GAAA;AAAA,QAAC,uBAAA;AAAA,QAAA;AAAA,UACC,gBAAA,EAAkB,MAAM,eAAA,CAAgB,IAAA;AAAA,UACxC,aAAa,KAAA,CAAM,WAAA;AAAA,UACnB,aAAa,KAAA,CAAM,WAAA;AAAA,UACnB,OAAA,EAAS,MAAM,eAAA,CAAgB;AAAA;AAAA;AACjC,KAAA;AAAA,IARG,CAAA,EAAA,EAAK,KAAA,CAAM,WAAW,CAAA,GAAA,EAAM,MAAM,WAAW,CAAA;AAAA,GAUpD;AAEJ;;;;"}
|
|
@@ -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 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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"}
|
|
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.target !== e.currentTarget) return;\n\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\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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"}
|
|
@@ -2,6 +2,7 @@ import { useApi, featureFlagsApiRef } from '@backstage/core-plugin-api';
|
|
|
2
2
|
|
|
3
3
|
const systemRiScsFeatureFlag = "system-riscs";
|
|
4
4
|
const predefinedScenariosFeatureFlag = "test-predefined-scenarios";
|
|
5
|
+
const showCurrentMatrixFeatureFlag = "show-current-matrix";
|
|
5
6
|
const riScFeatureFlags = [
|
|
6
7
|
// {
|
|
7
8
|
// name: systemRiScsFeatureFlag,
|
|
@@ -11,6 +12,10 @@ const riScFeatureFlags = [
|
|
|
11
12
|
{
|
|
12
13
|
name: predefinedScenariosFeatureFlag,
|
|
13
14
|
description: "Testing av forh\xE5ndsdefinerte scenarioer fra initial-riscs-collection repoet. Skru p\xE5 for \xE5 hente fra PR-branch, skru av for \xE5 hente fra main."
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
name: showCurrentMatrixFeatureFlag,
|
|
18
|
+
description: "Viser risikomatrisen for N\xE5risiko fanen."
|
|
14
19
|
}
|
|
15
20
|
];
|
|
16
21
|
function useSystemRiScsFeatureFlag() {
|
|
@@ -21,6 +26,10 @@ function usePredefinedScenariosFeatureFlag() {
|
|
|
21
26
|
const featureFlagsApi = useApi(featureFlagsApiRef);
|
|
22
27
|
return featureFlagsApi.isActive(predefinedScenariosFeatureFlag);
|
|
23
28
|
}
|
|
29
|
+
function useShowCurrentMatrixFeatureFlag() {
|
|
30
|
+
const featureFlagsApi = useApi(featureFlagsApiRef);
|
|
31
|
+
return featureFlagsApi.isActive(showCurrentMatrixFeatureFlag);
|
|
32
|
+
}
|
|
24
33
|
|
|
25
|
-
export { predefinedScenariosFeatureFlag, riScFeatureFlags, systemRiScsFeatureFlag, usePredefinedScenariosFeatureFlag, useSystemRiScsFeatureFlag };
|
|
34
|
+
export { predefinedScenariosFeatureFlag, riScFeatureFlags, showCurrentMatrixFeatureFlag, systemRiScsFeatureFlag, usePredefinedScenariosFeatureFlag, useShowCurrentMatrixFeatureFlag, useSystemRiScsFeatureFlag };
|
|
26
35
|
//# sourceMappingURL=featureFlags.esm.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"featureFlags.esm.js","sources":["../../src/utils/featureFlags.ts"],"sourcesContent":["import {\n featureFlagsApiRef,\n type PluginFeatureFlagConfig,\n useApi,\n} from '@backstage/core-plugin-api';\n\nexport const systemRiScsFeatureFlag = 'system-riscs';\nexport const predefinedScenariosFeatureFlag = 'test-predefined-scenarios';\n\nexport const riScFeatureFlags: PluginFeatureFlagConfig[] = [\n // {\n // name: systemRiScsFeatureFlag,\n // description:\n // 'Testing av system-RoS for Team SKVIS. Bruk på eget ansvar. UNNGÅ lagring av System-RoSer i åpne repoer.',\n // },\n {\n name: predefinedScenariosFeatureFlag,\n description:\n 'Testing av forhåndsdefinerte scenarioer fra initial-riscs-collection repoet. Skru på for å hente fra PR-branch, skru av for å hente fra main.',\n },\n];\n\nexport function useSystemRiScsFeatureFlag(): boolean {\n const featureFlagsApi = useApi(featureFlagsApiRef);\n return featureFlagsApi.isActive(systemRiScsFeatureFlag);\n}\n\nexport function usePredefinedScenariosFeatureFlag(): boolean {\n const featureFlagsApi = useApi(featureFlagsApiRef);\n return featureFlagsApi.isActive(predefinedScenariosFeatureFlag);\n}\n"],"names":[],"mappings":";;AAMO,MAAM,sBAAA,GAAyB;AAC/B,MAAM,8BAAA,GAAiC;
|
|
1
|
+
{"version":3,"file":"featureFlags.esm.js","sources":["../../src/utils/featureFlags.ts"],"sourcesContent":["import {\n featureFlagsApiRef,\n type PluginFeatureFlagConfig,\n useApi,\n} from '@backstage/core-plugin-api';\n\nexport const systemRiScsFeatureFlag = 'system-riscs';\nexport const predefinedScenariosFeatureFlag = 'test-predefined-scenarios';\nexport const showCurrentMatrixFeatureFlag = 'show-current-matrix';\n\nexport const riScFeatureFlags: PluginFeatureFlagConfig[] = [\n // {\n // name: systemRiScsFeatureFlag,\n // description:\n // 'Testing av system-RoS for Team SKVIS. Bruk på eget ansvar. UNNGÅ lagring av System-RoSer i åpne repoer.',\n // },\n {\n name: predefinedScenariosFeatureFlag,\n description:\n 'Testing av forhåndsdefinerte scenarioer fra initial-riscs-collection repoet. Skru på for å hente fra PR-branch, skru av for å hente fra main.',\n },\n {\n name: showCurrentMatrixFeatureFlag,\n description: 'Viser risikomatrisen for Nårisiko fanen.',\n },\n];\n\nexport function useSystemRiScsFeatureFlag(): boolean {\n const featureFlagsApi = useApi(featureFlagsApiRef);\n return featureFlagsApi.isActive(systemRiScsFeatureFlag);\n}\n\nexport function usePredefinedScenariosFeatureFlag(): boolean {\n const featureFlagsApi = useApi(featureFlagsApiRef);\n return featureFlagsApi.isActive(predefinedScenariosFeatureFlag);\n}\n\nexport function useShowCurrentMatrixFeatureFlag(): boolean {\n const featureFlagsApi = useApi(featureFlagsApiRef);\n return featureFlagsApi.isActive(showCurrentMatrixFeatureFlag);\n}\n"],"names":[],"mappings":";;AAMO,MAAM,sBAAA,GAAyB;AAC/B,MAAM,8BAAA,GAAiC;AACvC,MAAM,4BAAA,GAA+B;AAErC,MAAM,gBAAA,GAA8C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMzD;AAAA,IACE,IAAA,EAAM,8BAAA;AAAA,IACN,WAAA,EACE;AAAA,GACJ;AAAA,EACA;AAAA,IACE,IAAA,EAAM,4BAAA;AAAA,IACN,WAAA,EAAa;AAAA;AAEjB;AAEO,SAAS,yBAAA,GAAqC;AACnD,EAAA,MAAM,eAAA,GAAkB,OAAO,kBAAkB,CAAA;AACjD,EAAA,OAAO,eAAA,CAAgB,SAAS,sBAAsB,CAAA;AACxD;AAEO,SAAS,iCAAA,GAA6C;AAC3D,EAAA,MAAM,eAAA,GAAkB,OAAO,kBAAkB,CAAA;AACjD,EAAA,OAAO,eAAA,CAAgB,SAAS,8BAA8B,CAAA;AAChE;AAEO,SAAS,+BAAA,GAA2C;AACzD,EAAA,MAAM,eAAA,GAAkB,OAAO,kBAAkB,CAAA;AACjD,EAAA,OAAO,eAAA,CAAgB,SAAS,4BAA4B,CAAA;AAC9D;;;;"}
|
package/dist/utils/risk.esm.js
CHANGED
|
@@ -32,6 +32,18 @@ function calcRemainingActionsCount(scenario) {
|
|
|
32
32
|
(action) => action.status === ActionStatusOptions.NotOK
|
|
33
33
|
).length;
|
|
34
34
|
}
|
|
35
|
+
function getScenarioRiskForMatrix(scenario, riskTab) {
|
|
36
|
+
if (riskTab === RiskMatrixTabs.initialRisk) {
|
|
37
|
+
return scenario.risk;
|
|
38
|
+
}
|
|
39
|
+
if (riskTab === RiskMatrixTabs.remainingRisk) {
|
|
40
|
+
return scenario.remainingRisk;
|
|
41
|
+
}
|
|
42
|
+
const areAllActionsCompletedOrNotRelevant = scenario.actions.every(
|
|
43
|
+
(action) => action.status === ActionStatusOptions.OK || action.status === ActionStatusOptions.NotRelevant
|
|
44
|
+
);
|
|
45
|
+
return areAllActionsCompletedOrNotRelevant ? scenario.remainingRisk : scenario.risk;
|
|
46
|
+
}
|
|
35
47
|
function getRiskGradient() {
|
|
36
48
|
return `linear-gradient(to right,
|
|
37
49
|
var(--ros-red-400) 0%,
|
|
@@ -40,5 +52,5 @@ function getRiskGradient() {
|
|
|
40
52
|
var(--ros-green-100) 100%)`;
|
|
41
53
|
}
|
|
42
54
|
|
|
43
|
-
export { calcRemainingActionsCount, calcRiskCostOfRiSc, calcRiskCostOfScenario, getRiskGradient };
|
|
55
|
+
export { calcRemainingActionsCount, calcRiskCostOfRiSc, calcRiskCostOfScenario, getRiskGradient, getScenarioRiskForMatrix };
|
|
44
56
|
//# sourceMappingURL=risk.esm.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"risk.esm.js","sources":["../../src/utils/risk.ts"],"sourcesContent":["import { RiSc, Scenario } from './types.ts';\nimport { ActionStatusOptions } from './constants.ts';\nimport { RiskMatrixTabs } from '../components/riskMatrix/utils.tsx';\n\nexport function calcRiskCostOfRiSc(riSc: RiSc, riskType?: RiskMatrixTabs) {\n return riSc.scenarios\n .map(scenario => calcRiskCostOfScenario(scenario, riskType))\n .reduce((a, b) => a + b, 0);\n}\n\nexport function calcRiskCostOfScenario(\n scenario: Scenario,\n riskType?: RiskMatrixTabs,\n): number {\n const startRiskCost =\n (scenario.risk?.probability ?? 0) * (scenario.risk?.consequence ?? 0);\n const endRiskCost =\n (scenario.remainingRisk?.probability ?? 0) *\n (scenario.remainingRisk?.consequence ?? 0);\n if (riskType === RiskMatrixTabs.initialRisk) return startRiskCost;\n if (riskType === RiskMatrixTabs.remainingRisk) return endRiskCost;\n\n if (riskType === RiskMatrixTabs.currentRisk) {\n const completedActionsRatio = calcCompletedActionsRatio(scenario);\n return (\n startRiskCost + (endRiskCost - startRiskCost) * completedActionsRatio\n );\n }\n throw new Error('Unable to calculate risk cost: unhandled risk type');\n}\n\nfunction calcCompletedActionsRatio(scenario: Scenario) {\n const numOfCompletedActions = scenario.actions.filter(\n action => (action.status as ActionStatusOptions) === ActionStatusOptions.OK,\n ).length;\n\n const numOfRelevantActions = scenario.actions.filter(\n action =>\n (action.status as ActionStatusOptions) !==\n ActionStatusOptions.NotRelevant,\n ).length;\n\n if (numOfRelevantActions === 0) {\n return 0;\n }\n\n return numOfCompletedActions / numOfRelevantActions;\n}\n\nexport function calcRemainingActionsCount(scenario: Scenario): number {\n return scenario.actions.filter(\n action =>\n (action.status as ActionStatusOptions) === ActionStatusOptions.NotOK,\n ).length;\n}\n\nexport function getRiskGradient(): string {\n return `linear-gradient(to right, \n var(--ros-red-400) 0%, \n var(--ros-red-300) 25%, \n var(--ros-orange-100) 50%, \n var(--ros-green-100) 100%)`;\n}\n"],"names":[],"mappings":";;;AAIO,SAAS,kBAAA,CAAmB,MAAY,QAAA,EAA2B;AACxE,EAAA,OAAO,IAAA,CAAK,SAAA,CACT,GAAA,CAAI,CAAA,QAAA,KAAY,uBAAuB,QAAA,EAAU,QAAQ,CAAC,CAAA,CAC1D,OAAO,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,GAAI,GAAG,CAAC,CAAA;AAC9B;AAEO,SAAS,sBAAA,CACd,UACA,QAAA,EACQ;AACR,EAAA,MAAM,iBACH,QAAA,CAAS,IAAA,EAAM,eAAe,CAAA,KAAM,QAAA,CAAS,MAAM,WAAA,IAAe,CAAA,CAAA;AACrE,EAAA,MAAM,eACH,QAAA,CAAS,aAAA,EAAe,eAAe,CAAA,KACvC,QAAA,CAAS,eAAe,WAAA,IAAe,CAAA,CAAA;AAC1C,EAAA,IAAI,QAAA,KAAa,cAAA,CAAe,WAAA,EAAa,OAAO,aAAA;AACpD,EAAA,IAAI,QAAA,KAAa,cAAA,CAAe,aAAA,EAAe,OAAO,WAAA;AAEtD,EAAA,IAAI,QAAA,KAAa,eAAe,WAAA,EAAa;AAC3C,IAAA,MAAM,qBAAA,GAAwB,0BAA0B,QAAQ,CAAA;AAChE,IAAA,OACE,aAAA,GAAA,CAAiB,cAAc,aAAA,IAAiB,qBAAA;AAAA,EAEpD;AACA,EAAA,MAAM,IAAI,MAAM,oDAAoD,CAAA;AACtE;AAEA,SAAS,0BAA0B,QAAA,EAAoB;AACrD,EAAA,MAAM,qBAAA,GAAwB,SAAS,OAAA,CAAQ,MAAA;AAAA,IAC7C,CAAA,MAAA,KAAW,MAAA,CAAO,MAAA,KAAmC,mBAAA,CAAoB;AAAA,GAC3E,CAAE,MAAA;AAEF,EAAA,MAAM,oBAAA,GAAuB,SAAS,OAAA,CAAQ,MAAA;AAAA,IAC5C,CAAA,MAAA,KACG,MAAA,CAAO,MAAA,KACR,mBAAA,CAAoB;AAAA,GACxB,CAAE,MAAA;AAEF,EAAA,IAAI,yBAAyB,CAAA,EAAG;AAC9B,IAAA,OAAO,CAAA;AAAA,EACT;AAEA,EAAA,OAAO,qBAAA,GAAwB,oBAAA;AACjC;AAEO,SAAS,0BAA0B,QAAA,EAA4B;AACpE,EAAA,OAAO,SAAS,OAAA,CAAQ,MAAA;AAAA,IACtB,CAAA,MAAA,KACG,MAAA,CAAO,MAAA,KAAmC,mBAAA,CAAoB;AAAA,GACnE,CAAE,MAAA;AACJ;AAEO,SAAS,eAAA,GAA0B;AACxC,EAAA,OAAO,CAAA;AAAA;AAAA;AAAA;AAAA,8BAAA,CAAA;AAKT;;;;"}
|
|
1
|
+
{"version":3,"file":"risk.esm.js","sources":["../../src/utils/risk.ts"],"sourcesContent":["import { RiSc, Risk, Scenario } from './types.ts';\nimport { ActionStatusOptions } from './constants.ts';\nimport { RiskMatrixTabs } from '../components/riskMatrix/utils.tsx';\n\nexport function calcRiskCostOfRiSc(riSc: RiSc, riskType?: RiskMatrixTabs) {\n return riSc.scenarios\n .map(scenario => calcRiskCostOfScenario(scenario, riskType))\n .reduce((a, b) => a + b, 0);\n}\n\nexport function calcRiskCostOfScenario(\n scenario: Scenario,\n riskType?: RiskMatrixTabs,\n): number {\n const startRiskCost =\n (scenario.risk?.probability ?? 0) * (scenario.risk?.consequence ?? 0);\n const endRiskCost =\n (scenario.remainingRisk?.probability ?? 0) *\n (scenario.remainingRisk?.consequence ?? 0);\n if (riskType === RiskMatrixTabs.initialRisk) return startRiskCost;\n if (riskType === RiskMatrixTabs.remainingRisk) return endRiskCost;\n\n if (riskType === RiskMatrixTabs.currentRisk) {\n const completedActionsRatio = calcCompletedActionsRatio(scenario);\n return (\n startRiskCost + (endRiskCost - startRiskCost) * completedActionsRatio\n );\n }\n throw new Error('Unable to calculate risk cost: unhandled risk type');\n}\n\nfunction calcCompletedActionsRatio(scenario: Scenario) {\n const numOfCompletedActions = scenario.actions.filter(\n action => (action.status as ActionStatusOptions) === ActionStatusOptions.OK,\n ).length;\n\n const numOfRelevantActions = scenario.actions.filter(\n action =>\n (action.status as ActionStatusOptions) !==\n ActionStatusOptions.NotRelevant,\n ).length;\n\n if (numOfRelevantActions === 0) {\n return 0;\n }\n\n return numOfCompletedActions / numOfRelevantActions;\n}\n\nexport function calcRemainingActionsCount(scenario: Scenario): number {\n return scenario.actions.filter(\n action =>\n (action.status as ActionStatusOptions) === ActionStatusOptions.NotOK,\n ).length;\n}\n\nexport function getScenarioRiskForMatrix(\n scenario: Scenario,\n riskTab: RiskMatrixTabs,\n): Risk {\n if (riskTab === RiskMatrixTabs.initialRisk) {\n return scenario.risk;\n }\n\n if (riskTab === RiskMatrixTabs.remainingRisk) {\n return scenario.remainingRisk;\n }\n\n const areAllActionsCompletedOrNotRelevant = scenario.actions.every(\n action =>\n action.status === ActionStatusOptions.OK ||\n action.status === ActionStatusOptions.NotRelevant,\n );\n\n return areAllActionsCompletedOrNotRelevant\n ? scenario.remainingRisk\n : scenario.risk;\n}\n\nexport function getRiskGradient(): string {\n return `linear-gradient(to right, \n var(--ros-red-400) 0%, \n var(--ros-red-300) 25%, \n var(--ros-orange-100) 50%, \n var(--ros-green-100) 100%)`;\n}\n"],"names":[],"mappings":";;;AAIO,SAAS,kBAAA,CAAmB,MAAY,QAAA,EAA2B;AACxE,EAAA,OAAO,IAAA,CAAK,SAAA,CACT,GAAA,CAAI,CAAA,QAAA,KAAY,uBAAuB,QAAA,EAAU,QAAQ,CAAC,CAAA,CAC1D,OAAO,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,GAAI,GAAG,CAAC,CAAA;AAC9B;AAEO,SAAS,sBAAA,CACd,UACA,QAAA,EACQ;AACR,EAAA,MAAM,iBACH,QAAA,CAAS,IAAA,EAAM,eAAe,CAAA,KAAM,QAAA,CAAS,MAAM,WAAA,IAAe,CAAA,CAAA;AACrE,EAAA,MAAM,eACH,QAAA,CAAS,aAAA,EAAe,eAAe,CAAA,KACvC,QAAA,CAAS,eAAe,WAAA,IAAe,CAAA,CAAA;AAC1C,EAAA,IAAI,QAAA,KAAa,cAAA,CAAe,WAAA,EAAa,OAAO,aAAA;AACpD,EAAA,IAAI,QAAA,KAAa,cAAA,CAAe,aAAA,EAAe,OAAO,WAAA;AAEtD,EAAA,IAAI,QAAA,KAAa,eAAe,WAAA,EAAa;AAC3C,IAAA,MAAM,qBAAA,GAAwB,0BAA0B,QAAQ,CAAA;AAChE,IAAA,OACE,aAAA,GAAA,CAAiB,cAAc,aAAA,IAAiB,qBAAA;AAAA,EAEpD;AACA,EAAA,MAAM,IAAI,MAAM,oDAAoD,CAAA;AACtE;AAEA,SAAS,0BAA0B,QAAA,EAAoB;AACrD,EAAA,MAAM,qBAAA,GAAwB,SAAS,OAAA,CAAQ,MAAA;AAAA,IAC7C,CAAA,MAAA,KAAW,MAAA,CAAO,MAAA,KAAmC,mBAAA,CAAoB;AAAA,GAC3E,CAAE,MAAA;AAEF,EAAA,MAAM,oBAAA,GAAuB,SAAS,OAAA,CAAQ,MAAA;AAAA,IAC5C,CAAA,MAAA,KACG,MAAA,CAAO,MAAA,KACR,mBAAA,CAAoB;AAAA,GACxB,CAAE,MAAA;AAEF,EAAA,IAAI,yBAAyB,CAAA,EAAG;AAC9B,IAAA,OAAO,CAAA;AAAA,EACT;AAEA,EAAA,OAAO,qBAAA,GAAwB,oBAAA;AACjC;AAEO,SAAS,0BAA0B,QAAA,EAA4B;AACpE,EAAA,OAAO,SAAS,OAAA,CAAQ,MAAA;AAAA,IACtB,CAAA,MAAA,KACG,MAAA,CAAO,MAAA,KAAmC,mBAAA,CAAoB;AAAA,GACnE,CAAE,MAAA;AACJ;AAEO,SAAS,wBAAA,CACd,UACA,OAAA,EACM;AACN,EAAA,IAAI,OAAA,KAAY,eAAe,WAAA,EAAa;AAC1C,IAAA,OAAO,QAAA,CAAS,IAAA;AAAA,EAClB;AAEA,EAAA,IAAI,OAAA,KAAY,eAAe,aAAA,EAAe;AAC5C,IAAA,OAAO,QAAA,CAAS,aAAA;AAAA,EAClB;AAEA,EAAA,MAAM,mCAAA,GAAsC,SAAS,OAAA,CAAQ,KAAA;AAAA,IAC3D,YACE,MAAA,CAAO,MAAA,KAAW,oBAAoB,EAAA,IACtC,MAAA,CAAO,WAAW,mBAAA,CAAoB;AAAA,GAC1C;AAEA,EAAA,OAAO,mCAAA,GACH,QAAA,CAAS,aAAA,GACT,QAAA,CAAS,IAAA;AACf;AAEO,SAAS,eAAA,GAA0B;AACxC,EAAA,OAAO,CAAA;AAAA;AAAA;AAAA;AAAA,8BAAA,CAAA;AAKT;;;;"}
|