@kartverket/backstage-plugin-risk-scorecard 3.5.0 → 3.5.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
2
2
|
import { ActionBox } from './ActionBox.esm.js';
|
|
3
|
-
import { useState, useCallback,
|
|
3
|
+
import { useState, useCallback, useEffect, Fragment } from 'react';
|
|
4
4
|
import Paper from '@mui/material/Paper';
|
|
5
5
|
import Typography from '@mui/material/Typography';
|
|
6
6
|
import { useTranslationRef } from '@backstage/core-plugin-api/alpha';
|
|
7
7
|
import { pluginRiScTranslationRef } from '../../../utils/translations.esm.js';
|
|
8
|
-
import { emptyAction } from '../../../contexts/ScenarioContext.esm.js';
|
|
8
|
+
import { useScenario, emptyAction } from '../../../contexts/ScenarioContext.esm.js';
|
|
9
9
|
import { section } from '../scenarioDrawerComponents.esm.js';
|
|
10
10
|
import { heading3, emptyState } from '../../common/typography.esm.js';
|
|
11
11
|
import Divider from '@mui/material/Divider';
|
|
@@ -44,6 +44,7 @@ function ActionsSection({
|
|
|
44
44
|
setCurrentUpdatedActionIDs
|
|
45
45
|
}) {
|
|
46
46
|
const { t } = useTranslationRef(pluginRiScTranslationRef);
|
|
47
|
+
const { isDrawerOpen } = useScenario();
|
|
47
48
|
const { control, watch } = formMethods;
|
|
48
49
|
const { fields, append, remove } = useFieldArray({
|
|
49
50
|
control,
|
|
@@ -53,15 +54,7 @@ function ActionsSection({
|
|
|
53
54
|
const [showOnlyRelevant, setShowOnlyRelevant] = useState(
|
|
54
55
|
FILTER_SETTINGS.SHOW_ALL
|
|
55
56
|
);
|
|
56
|
-
const
|
|
57
|
-
(actions, filterRelevant) => {
|
|
58
|
-
if (!filterRelevant) return actions;
|
|
59
|
-
return actions.filter(
|
|
60
|
-
(action) => action.status !== ActionStatusOptions.NotRelevant
|
|
61
|
-
);
|
|
62
|
-
},
|
|
63
|
-
[]
|
|
64
|
-
);
|
|
57
|
+
const [processedActions, setProcessedActions] = useState([]);
|
|
65
58
|
const sortActionsByRelevance = useCallback((actions) => {
|
|
66
59
|
return [...actions].sort((a, b) => {
|
|
67
60
|
const aIsNotRelevant = a.status === ActionStatusOptions.NotRelevant;
|
|
@@ -75,15 +68,20 @@ function ActionsSection({
|
|
|
75
68
|
return 0;
|
|
76
69
|
});
|
|
77
70
|
}, []);
|
|
78
|
-
|
|
79
|
-
if (
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
71
|
+
useEffect(() => {
|
|
72
|
+
if (isDrawerOpen && currentActions?.length) {
|
|
73
|
+
const sorted = sortActionsByRelevance(currentActions);
|
|
74
|
+
setProcessedActions(
|
|
75
|
+
sorted.map((action) => ({
|
|
76
|
+
action,
|
|
77
|
+
originalIndex: currentActions.findIndex((a) => a === action)
|
|
78
|
+
}))
|
|
79
|
+
);
|
|
80
|
+
}
|
|
81
|
+
}, [isDrawerOpen, sortActionsByRelevance]);
|
|
82
|
+
const visibleActions = processedActions.filter(
|
|
83
|
+
({ action }) => showOnlyRelevant ? action.status !== ActionStatusOptions.NotRelevant : true
|
|
84
|
+
);
|
|
87
85
|
if (isEditing) {
|
|
88
86
|
return /* @__PURE__ */ jsxs(Paper, { sx: section, children: [
|
|
89
87
|
/* @__PURE__ */ jsxs(Box, { sx: { display: "flex", alignItems: "center", gap: 2 }, children: [
|
|
@@ -134,7 +132,7 @@ function ActionsSection({
|
|
|
134
132
|
]
|
|
135
133
|
}
|
|
136
134
|
),
|
|
137
|
-
|
|
135
|
+
visibleActions.length > 0 ? visibleActions.map(({ action, originalIndex }) => /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
138
136
|
/* @__PURE__ */ jsx(Divider, {}),
|
|
139
137
|
/* @__PURE__ */ jsx(
|
|
140
138
|
ActionBox,
|
|
@@ -147,7 +145,7 @@ function ActionsSection({
|
|
|
147
145
|
setCurrentUpdatedActionIDs
|
|
148
146
|
}
|
|
149
147
|
)
|
|
150
|
-
] },
|
|
148
|
+
] }, action.ID)) : /* @__PURE__ */ jsx(Typography, { sx: emptyState, children: !currentActions || currentActions.length === 0 ? t("dictionary.emptyField", {
|
|
151
149
|
field: t("dictionary.measures").toLowerCase()
|
|
152
150
|
}) : t("dictionary.noRelevantMeasures") })
|
|
153
151
|
] });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ActionsSection.esm.js","sources":["../../../../src/components/scenarioDrawer/components/ActionsSection.tsx"],"sourcesContent":["import { ActionBox } from './ActionBox';\nimport { Fragment, useCallback,
|
|
1
|
+
{"version":3,"file":"ActionsSection.esm.js","sources":["../../../../src/components/scenarioDrawer/components/ActionsSection.tsx"],"sourcesContent":["import { ActionBox } from './ActionBox';\nimport { Fragment, useCallback, useEffect, useState } from 'react';\nimport Paper from '@mui/material/Paper';\nimport Typography from '@mui/material/Typography';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { pluginRiScTranslationRef } from '../../../utils/translations';\nimport { emptyAction, useScenario } from '../../../contexts/ScenarioContext';\nimport { section } from '../scenarioDrawerComponents';\nimport { emptyState, heading3 } from '../../common/typography';\nimport Divider from '@mui/material/Divider';\nimport { useFieldArray, UseFormReturn } from 'react-hook-form';\nimport { Action, FormScenario } from '../../../utils/types';\nimport { ActionFormItem } from './ActionFormItem';\nimport Button from '@mui/material/Button';\nimport { AddCircle } from '@mui/icons-material';\nimport Box from '@mui/material/Box';\nimport { ActionStatusOptions } from '../../../utils/constants';\nimport Switch from '@mui/material/Switch';\n\nconst FILTER_SETTINGS = {\n SHOW_ALL: false,\n SHOW_ONLY_RELEVANT: true,\n} as const;\n\ntype ActionSectionProps = {\n formMethods: UseFormReturn<FormScenario>;\n isEditing: boolean;\n onSubmit: () => void;\n setCurrentUpdatedActionIDs: React.Dispatch<React.SetStateAction<string[]>>;\n};\n\nconst RelevanceToggle = ({\n checked,\n onChange,\n}: {\n checked: boolean;\n onChange: (checked: boolean) => void;\n}) => {\n const { t } = useTranslationRef(pluginRiScTranslationRef);\n\n return (\n <Box sx={{ display: 'flex', alignItems: 'center' }}>\n <Switch\n checked={checked}\n onChange={e => onChange(e.target.checked)}\n name=\"showOnlyRelevant\"\n color=\"primary\"\n />\n <Typography variant=\"subtitle2\" color=\"primary\">\n {t('dictionary.showOnlyRelevant')}\n </Typography>\n </Box>\n );\n};\n\nexport function ActionsSection({\n formMethods,\n isEditing,\n onSubmit,\n setCurrentUpdatedActionIDs,\n}: ActionSectionProps) {\n const { t } = useTranslationRef(pluginRiScTranslationRef);\n const { isDrawerOpen } = useScenario();\n\n const { control, watch } = formMethods;\n const { fields, append, remove } = useFieldArray({\n control,\n name: 'actions',\n });\n\n const currentActions = watch('actions');\n\n const [showOnlyRelevant, setShowOnlyRelevant] = useState<boolean>(\n FILTER_SETTINGS.SHOW_ALL,\n );\n\n const [processedActions, setProcessedActions] = useState<\n { action: Action; originalIndex: number }[]\n >([]);\n\n const sortActionsByRelevance = useCallback((actions: Action[]) => {\n return [...actions].sort((a, b) => {\n const aIsNotRelevant = a.status === ActionStatusOptions.NotRelevant;\n const bIsNotRelevant = b.status === ActionStatusOptions.NotRelevant;\n\n if (aIsNotRelevant && !bIsNotRelevant) {\n return 1;\n }\n if (!aIsNotRelevant && bIsNotRelevant) {\n return -1;\n }\n return 0;\n });\n }, []);\n\n useEffect(() => {\n if (isDrawerOpen && currentActions?.length) {\n const sorted = sortActionsByRelevance(currentActions);\n\n setProcessedActions(\n sorted.map(action => ({\n action,\n originalIndex: currentActions.findIndex(a => a === action),\n })),\n );\n }\n // ESLint-ignore: only sort when drawer opens\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [isDrawerOpen, sortActionsByRelevance]);\n\n const visibleActions = processedActions.filter(({ action }) =>\n showOnlyRelevant ? action.status !== ActionStatusOptions.NotRelevant : true,\n );\n\n if (isEditing) {\n return (\n <Paper sx={section}>\n <Box sx={{ display: 'flex', alignItems: 'center', gap: 2 }}>\n <Typography sx={heading3}>{t('dictionary.measure')}</Typography>\n <Button\n startIcon={<AddCircle />}\n color=\"primary\"\n onClick={() => append(emptyAction())}\n >\n {t('scenarioDrawer.measureTab.addMeasureButton')}\n </Button>\n </Box>\n {fields.map((field, index) => (\n <Fragment key={field.id}>\n <Divider variant=\"fullWidth\" />\n <ActionFormItem\n key={index}\n formMethods={formMethods}\n index={index}\n remove={remove}\n />\n </Fragment>\n ))}\n </Paper>\n );\n }\n\n return (\n <Paper sx={section}>\n <Box\n sx={{\n display: 'flex',\n justifyContent: 'space-between',\n alignItems: 'center',\n marginBottom: 2,\n }}\n >\n <Typography sx={heading3}>{t('dictionary.measures')}</Typography>\n\n <RelevanceToggle\n checked={showOnlyRelevant}\n onChange={value => setShowOnlyRelevant(value)}\n />\n </Box>\n {visibleActions.length > 0 ? (\n visibleActions.map(({ action, originalIndex }) => (\n <Fragment key={action.ID}>\n <Divider />\n <ActionBox\n action={action}\n index={originalIndex}\n formMethods={formMethods}\n remove={remove}\n onSubmit={onSubmit}\n setCurrentUpdatedActionIDs={setCurrentUpdatedActionIDs}\n />\n </Fragment>\n ))\n ) : (\n <Typography sx={emptyState}>\n {!currentActions || currentActions.length === 0\n ? t('dictionary.emptyField', {\n field: t('dictionary.measures').toLowerCase(),\n })\n : t('dictionary.noRelevantMeasures')}\n </Typography>\n )}\n </Paper>\n );\n}\n"],"names":[],"mappings":"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"}
|