@kartverket/backstage-plugin-risk-scorecard 6.10.1 → 6.11.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/ActionEdit.esm.js +2 -1
- package/dist/components/action/ActionEdit.esm.js.map +1 -1
- package/dist/components/action/ActionURL.esm.js +1 -1
- package/dist/components/action/ActionURL.esm.js.map +1 -1
- package/dist/components/action/ActionView.esm.js +6 -3
- package/dist/components/action/ActionView.esm.js.map +1 -1
- package/dist/components/riScInfo/changeset/RiScActionChange.esm.js +7 -0
- package/dist/components/riScInfo/changeset/RiScActionChange.esm.js.map +1 -1
- package/dist/components/riScInfo/changeset/RiScActionChangeSet.esm.js +8 -0
- package/dist/components/riScInfo/changeset/RiScActionChangeSet.esm.js.map +1 -1
- package/dist/components/riScInfo/migrations/RiScMigrationChanges.esm.js +5 -1
- package/dist/components/riScInfo/migrations/RiScMigrationChanges.esm.js.map +1 -1
- package/dist/components/riScInfo/migrations/RiScMigrationChanges53.esm.js +17 -0
- package/dist/components/riScInfo/migrations/RiScMigrationChanges53.esm.js.map +1 -0
- package/dist/components/riScInfo/migrations/RiScMigrationChanges54.esm.js +20 -0
- package/dist/components/riScInfo/migrations/RiScMigrationChanges54.esm.js.map +1 -0
- package/dist/components/scenarioDrawer/components/ActionFormItem.esm.js +12 -1
- package/dist/components/scenarioDrawer/components/ActionFormItem.esm.js.map +1 -1
- package/dist/contexts/ScenarioContext.esm.js +2 -1
- package/dist/contexts/ScenarioContext.esm.js.map +1 -1
- package/dist/plugin.esm.js +2 -7
- package/dist/plugin.esm.js.map +1 -1
- package/dist/utils/DTOs.esm.js +2 -1
- package/dist/utils/DTOs.esm.js.map +1 -1
- package/dist/utils/constants.esm.js +1 -1
- package/dist/utils/constants.esm.js.map +1 -1
- package/dist/utils/featureFlags.esm.js +8 -1
- package/dist/utils/featureFlags.esm.js.map +1 -1
- package/dist/utils/translations.esm.js +14 -0
- package/dist/utils/translations.esm.js.map +1 -1
- package/dist/utils/types.esm.js.map +1 -1
- package/package.json +1 -1
|
@@ -15,7 +15,8 @@ function ActionEdit(props) {
|
|
|
15
15
|
title: props.action.title,
|
|
16
16
|
description: props.action.description,
|
|
17
17
|
status: props.action.status,
|
|
18
|
-
url: props.action.url
|
|
18
|
+
url: props.action.url,
|
|
19
|
+
comment: props.action.comment ?? ""
|
|
19
20
|
}
|
|
20
21
|
});
|
|
21
22
|
const { updateStatus } = useRiScs();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ActionEdit.esm.js","sources":["../../../src/components/action/ActionEdit.tsx"],"sourcesContent":["import Button from '@mui/material/Button';\nimport { Action } from '../../utils/types.ts';\nimport { SubmitHandler, useForm } from 'react-hook-form';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { pluginRiScTranslationRef } from '../../utils/translations.ts';\nimport CircularProgress from '@mui/material/CircularProgress';\nimport { useRiScs } from '../../contexts/RiScContext.tsx';\nimport { ActionFormItem } from '../scenarioDrawer/components/ActionFormItem.tsx';\nimport { Flex } from '@backstage/ui';\n\ntype ActionEditProps = {\n action: Action;\n onCancelEdit: () => void;\n onSaveAction: (newAction: Action) => void;\n onDeleteAction: () => void;\n onFormSubmitted?: () => void;\n};\n\ntype ActionEditForm = {\n title: string;\n description: string;\n status: string;\n url: string;\n};\n\nexport function ActionEdit(props: ActionEditProps) {\n const { t } = useTranslationRef(pluginRiScTranslationRef);\n\n const formMethods = useForm<ActionEditForm>({\n defaultValues: {\n title: props.action.title,\n description: props.action.description,\n status: props.action.status,\n url: props.action.url,\n },\n });\n const { updateStatus } = useRiScs();\n\n const onSubmit: SubmitHandler<ActionEditForm> = data => {\n const newAction = {\n ...props.action,\n ...data,\n };\n props.onSaveAction(newAction);\n };\n\n return (\n <Flex direction=\"column\" gap=\"24px\">\n <ActionFormItem\n formMethods={formMethods}\n handleDelete={props.onDeleteAction}\n />\n <Flex gap=\"8px\">\n <Button\n color=\"primary\"\n variant=\"contained\"\n onClick={formMethods.handleSubmit(onSubmit)}\n disabled={!formMethods.formState.isDirty || updateStatus.isLoading}\n >\n {t('dictionary.save')}\n {updateStatus.isLoading && (\n <CircularProgress\n size={16}\n sx={{ marginLeft: 8, color: 'inherit' }}\n />\n )}\n </Button>\n <Button onClick={props.onCancelEdit}>{t('dictionary.cancel')}</Button>\n </Flex>\n </Flex>\n );\n}\n"],"names":[],"mappings":";;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"ActionEdit.esm.js","sources":["../../../src/components/action/ActionEdit.tsx"],"sourcesContent":["import Button from '@mui/material/Button';\nimport { Action } from '../../utils/types.ts';\nimport { SubmitHandler, useForm } from 'react-hook-form';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { pluginRiScTranslationRef } from '../../utils/translations.ts';\nimport CircularProgress from '@mui/material/CircularProgress';\nimport { useRiScs } from '../../contexts/RiScContext.tsx';\nimport { ActionFormItem } from '../scenarioDrawer/components/ActionFormItem.tsx';\nimport { Flex } from '@backstage/ui';\n\ntype ActionEditProps = {\n action: Action;\n onCancelEdit: () => void;\n onSaveAction: (newAction: Action) => void;\n onDeleteAction: () => void;\n onFormSubmitted?: () => void;\n};\n\ntype ActionEditForm = {\n title: string;\n description: string;\n status: string;\n url: string;\n comment?: string;\n};\n\nexport function ActionEdit(props: ActionEditProps) {\n const { t } = useTranslationRef(pluginRiScTranslationRef);\n\n const formMethods = useForm<ActionEditForm>({\n defaultValues: {\n title: props.action.title,\n description: props.action.description,\n status: props.action.status,\n url: props.action.url,\n comment: props.action.comment ?? '',\n },\n });\n const { updateStatus } = useRiScs();\n\n const onSubmit: SubmitHandler<ActionEditForm> = data => {\n const newAction = {\n ...props.action,\n ...data,\n };\n props.onSaveAction(newAction);\n };\n\n return (\n <Flex direction=\"column\" gap=\"24px\">\n <ActionFormItem\n formMethods={formMethods}\n handleDelete={props.onDeleteAction}\n />\n <Flex gap=\"8px\">\n <Button\n color=\"primary\"\n variant=\"contained\"\n onClick={formMethods.handleSubmit(onSubmit)}\n disabled={!formMethods.formState.isDirty || updateStatus.isLoading}\n >\n {t('dictionary.save')}\n {updateStatus.isLoading && (\n <CircularProgress\n size={16}\n sx={{ marginLeft: 8, color: 'inherit' }}\n />\n )}\n </Button>\n <Button onClick={props.onCancelEdit}>{t('dictionary.cancel')}</Button>\n </Flex>\n </Flex>\n );\n}\n"],"names":[],"mappings":";;;;;;;;;;AA0BO,SAAS,WAAW,KAAA,EAAwB;AACjD,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,iBAAA,CAAkB,wBAAwB,CAAA;AAExD,EAAA,MAAM,cAAc,OAAA,CAAwB;AAAA,IAC1C,aAAA,EAAe;AAAA,MACb,KAAA,EAAO,MAAM,MAAA,CAAO,KAAA;AAAA,MACpB,WAAA,EAAa,MAAM,MAAA,CAAO,WAAA;AAAA,MAC1B,MAAA,EAAQ,MAAM,MAAA,CAAO,MAAA;AAAA,MACrB,GAAA,EAAK,MAAM,MAAA,CAAO,GAAA;AAAA,MAClB,OAAA,EAAS,KAAA,CAAM,MAAA,CAAO,OAAA,IAAW;AAAA;AACnC,GACD,CAAA;AACD,EAAA,MAAM,EAAE,YAAA,EAAa,GAAI,QAAA,EAAS;AAElC,EAAA,MAAM,WAA0C,CAAA,IAAA,KAAQ;AACtD,IAAA,MAAM,SAAA,GAAY;AAAA,MAChB,GAAG,KAAA,CAAM,MAAA;AAAA,MACT,GAAG;AAAA,KACL;AACA,IAAA,KAAA,CAAM,aAAa,SAAS,CAAA;AAAA,EAC9B,CAAA;AAEA,EAAA,uBACE,IAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAU,QAAA,EAAS,KAAI,MAAA,EAC3B,QAAA,EAAA;AAAA,oBAAA,GAAA;AAAA,MAAC,cAAA;AAAA,MAAA;AAAA,QACC,WAAA;AAAA,QACA,cAAc,KAAA,CAAM;AAAA;AAAA,KACtB;AAAA,oBACA,IAAA,CAAC,IAAA,EAAA,EAAK,GAAA,EAAI,KAAA,EACR,QAAA,EAAA;AAAA,sBAAA,IAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,KAAA,EAAM,SAAA;AAAA,UACN,OAAA,EAAQ,WAAA;AAAA,UACR,OAAA,EAAS,WAAA,CAAY,YAAA,CAAa,QAAQ,CAAA;AAAA,UAC1C,QAAA,EAAU,CAAC,WAAA,CAAY,SAAA,CAAU,WAAW,YAAA,CAAa,SAAA;AAAA,UAExD,QAAA,EAAA;AAAA,YAAA,CAAA,CAAE,iBAAiB,CAAA;AAAA,YACnB,aAAa,SAAA,oBACZ,GAAA;AAAA,cAAC,gBAAA;AAAA,cAAA;AAAA,gBACC,IAAA,EAAM,EAAA;AAAA,gBACN,EAAA,EAAI,EAAE,UAAA,EAAY,CAAA,EAAG,OAAO,SAAA;AAAU;AAAA;AACxC;AAAA;AAAA,OAEJ;AAAA,0BACC,MAAA,EAAA,EAAO,OAAA,EAAS,MAAM,YAAA,EAAe,QAAA,EAAA,CAAA,CAAE,mBAAmB,CAAA,EAAE;AAAA,KAAA,EAC/D;AAAA,GAAA,EACF,CAAA;AAEJ;;;;"}
|
|
@@ -6,7 +6,7 @@ import styles from './ActionURL.module.css.esm.js';
|
|
|
6
6
|
|
|
7
7
|
function ActionURL(props) {
|
|
8
8
|
const { t } = useTranslationRef(pluginRiScTranslationRef);
|
|
9
|
-
return /* @__PURE__ */ jsxs(Box, { mt: "
|
|
9
|
+
return /* @__PURE__ */ jsxs(Box, { mt: "2", children: [
|
|
10
10
|
/* @__PURE__ */ jsxs(Text, { as: "p", variant: "body-large", weight: "bold", children: [
|
|
11
11
|
" ",
|
|
12
12
|
t("dictionary.url")
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ActionURL.esm.js","sources":["../../../src/components/action/ActionURL.tsx"],"sourcesContent":["import { Box, Link, Text } from '@backstage/ui';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { pluginRiScTranslationRef } from '../../utils/translations.ts';\nimport styles from './ActionURL.module.css';\n\ntype ActionURLProps = {\n url: string;\n};\n\nexport function ActionURL(props: ActionURLProps) {\n const { t } = useTranslationRef(pluginRiScTranslationRef);\n return (\n <Box mt=\"
|
|
1
|
+
{"version":3,"file":"ActionURL.esm.js","sources":["../../../src/components/action/ActionURL.tsx"],"sourcesContent":["import { Box, Link, Text } from '@backstage/ui';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { pluginRiScTranslationRef } from '../../utils/translations.ts';\nimport styles from './ActionURL.module.css';\n\ntype ActionURLProps = {\n url: string;\n};\n\nexport function ActionURL(props: ActionURLProps) {\n const { t } = useTranslationRef(pluginRiScTranslationRef);\n return (\n <Box mt=\"2\">\n <Text as=\"p\" variant=\"body-large\" weight=\"bold\">\n {' '}\n {t('dictionary.url')}\n </Text>\n {props.url ? (\n <Link\n target=\"_blank\"\n variant=\"body-large\"\n rel=\"noreferrer\"\n href={props.url.startsWith('http') ? props.url : `//${props.url}`}\n >\n {props.url}\n </Link>\n ) : (\n <Text as=\"p\" variant=\"body-large\" className={styles.emptyText}>\n {t('dictionary.emptyField', {\n field: t('dictionary.url').toLowerCase(),\n })}\n </Text>\n )}\n </Box>\n );\n}\n"],"names":[],"mappings":";;;;;;AASO,SAAS,UAAU,KAAA,EAAuB;AAC/C,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,iBAAA,CAAkB,wBAAwB,CAAA;AACxD,EAAA,uBACE,IAAA,CAAC,GAAA,EAAA,EAAI,EAAA,EAAG,GAAA,EACN,QAAA,EAAA;AAAA,oBAAA,IAAA,CAAC,QAAK,EAAA,EAAG,GAAA,EAAI,OAAA,EAAQ,YAAA,EAAa,QAAO,MAAA,EACtC,QAAA,EAAA;AAAA,MAAA,GAAA;AAAA,MACA,EAAE,gBAAgB;AAAA,KAAA,EACrB,CAAA;AAAA,IACC,MAAM,GAAA,mBACL,GAAA;AAAA,MAAC,IAAA;AAAA,MAAA;AAAA,QACC,MAAA,EAAO,QAAA;AAAA,QACP,OAAA,EAAQ,YAAA;AAAA,QACR,GAAA,EAAI,YAAA;AAAA,QACJ,IAAA,EAAM,KAAA,CAAM,GAAA,CAAI,UAAA,CAAW,MAAM,IAAI,KAAA,CAAM,GAAA,GAAM,CAAA,EAAA,EAAK,KAAA,CAAM,GAAG,CAAA,CAAA;AAAA,QAE9D,QAAA,EAAA,KAAA,CAAM;AAAA;AAAA,KACT,mBAEA,GAAA,CAAC,IAAA,EAAA,EAAK,EAAA,EAAG,GAAA,EAAI,OAAA,EAAQ,YAAA,EAAa,SAAA,EAAW,MAAA,CAAO,SAAA,EACjD,QAAA,EAAA,CAAA,CAAE,uBAAA,EAAyB;AAAA,MAC1B,KAAA,EAAO,CAAA,CAAE,gBAAgB,CAAA,CAAE,WAAA;AAAY,KACxC,CAAA,EACH;AAAA,GAAA,EAEJ,CAAA;AAEJ;;;;"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
|
|
2
|
-
import { Flex, Text } from '@backstage/ui';
|
|
2
|
+
import { Flex, Text, Box } from '@backstage/ui';
|
|
3
3
|
import IconButton from '@mui/material/IconButton';
|
|
4
4
|
import { DualButtonWithMenu } from '../common/DualButtonWithMenu.esm.js';
|
|
5
5
|
import { actionStatusOptionsToTranslationKeys, getTranslatedActionStatus } from '../../utils/utilityfunctions.esm.js';
|
|
@@ -7,7 +7,6 @@ import { ActionStatusOptions } from '../../utils/constants.esm.js';
|
|
|
7
7
|
import { ScenarioLastUpdatedLabel } from '../scenario/ScenarioLastUpdatedLabel.esm.js';
|
|
8
8
|
import DeleteIcon from '@mui/icons-material/Delete';
|
|
9
9
|
import Collapse from '@mui/material/Collapse';
|
|
10
|
-
import Box from '@mui/material/Box';
|
|
11
10
|
import { Markdown } from '../common/Markdown.esm.js';
|
|
12
11
|
import { ActionURL } from './ActionURL.esm.js';
|
|
13
12
|
import { useScenario } from '../../contexts/ScenarioContext.esm.js';
|
|
@@ -150,7 +149,11 @@ function ActionView(props) {
|
|
|
150
149
|
)
|
|
151
150
|
] }),
|
|
152
151
|
/* @__PURE__ */ jsx(Markdown, { description: props.action.description }),
|
|
153
|
-
/* @__PURE__ */ jsx(ActionURL, { url: props.action.url })
|
|
152
|
+
/* @__PURE__ */ jsx(ActionURL, { url: props.action.url }),
|
|
153
|
+
props.action.comment && /* @__PURE__ */ jsxs(Box, { mt: "2", children: [
|
|
154
|
+
/* @__PURE__ */ jsx(Text, { as: "p", variant: "body-large", weight: "bold", children: t("dictionary.comment") }),
|
|
155
|
+
/* @__PURE__ */ jsx(Text, { as: "p", variant: "body-large", children: props.action.comment })
|
|
156
|
+
] })
|
|
154
157
|
] })
|
|
155
158
|
}
|
|
156
159
|
)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ActionView.esm.js","sources":["../../../src/components/action/ActionView.tsx"],"sourcesContent":["import { 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 Box from '@mui/material/Box';\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 </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 // 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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"}
|
|
@@ -45,6 +45,13 @@ function RiScActionChange({ action, type }) {
|
|
|
45
45
|
title: t("migrationDialog.migration51.lastUpdatedBy"),
|
|
46
46
|
value: action.lastUpdatedBy
|
|
47
47
|
}
|
|
48
|
+
),
|
|
49
|
+
action.comment && /* @__PURE__ */ jsx(
|
|
50
|
+
ChangeSetProperty,
|
|
51
|
+
{
|
|
52
|
+
title: t("dictionary.comment"),
|
|
53
|
+
value: action.comment
|
|
54
|
+
}
|
|
48
55
|
)
|
|
49
56
|
] });
|
|
50
57
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RiScActionChange.esm.js","sources":["../../../../src/components/riScInfo/changeset/RiScActionChange.tsx"],"sourcesContent":["import { Action } from '../../../utils/types';\nimport { ChangeSetBox } from './components/ChangeSetBox.tsx';\nimport { ChangeSetTag } from './components/ChangeSetTag.tsx';\nimport { ChangeSetTags } from './components/ChangeSetTags.tsx';\nimport { ChangeSetBoxTitle } from './components/ChangeSetBoxTitle.tsx';\nimport { ChangeSetProperty } from './components/ChangeSetProperty.tsx';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { pluginRiScTranslationRef } from '../../../utils/translations.ts';\nimport { formatDate } from '../../../utils/utilityfunctions.ts';\n\ninterface RiScWholeActionChangeProps {\n action: Action;\n type: 'ADDED' | 'DELETED';\n}\n\nexport function RiScActionChange({ action, type }: RiScWholeActionChangeProps) {\n const { t } = useTranslationRef(pluginRiScTranslationRef);\n const parsedDateTime = action.lastUpdated\n ? formatDate(action.lastUpdated)\n : t('scenarioDrawer.action.notUpdated');\n\n return (\n <ChangeSetBox type=\"secondary\">\n <ChangeSetTags>\n {type === 'ADDED' ? (\n <ChangeSetTag text={t('dictionary.added')} type=\"added\" />\n ) : (\n <ChangeSetTag text={t('dictionary.removed')} type=\"delete\" />\n )}\n <ChangeSetTag text={t('dictionary.action')} type=\"primary\" />\n </ChangeSetTags>\n <ChangeSetBoxTitle title={action.title} />\n <ChangeSetProperty\n title={t('dictionary.description')}\n value={action.description}\n />\n {action.url && (\n <ChangeSetProperty title={t('dictionary.url')} value={action.url} />\n )}\n <ChangeSetProperty\n title={t('dictionary.status')}\n /* @ts-ignore Because ts can't typecheck strings against our keys */\n value={t(`actionStatus.${action.status}`)}\n />\n <ChangeSetProperty\n title={t('scenarioDrawer.action.lastUpdated')}\n value={parsedDateTime}\n />\n <ChangeSetProperty\n title={t('migrationDialog.migration51.lastUpdatedBy')}\n value={action.lastUpdatedBy}\n />\n </ChangeSetBox>\n );\n}\n"],"names":[],"mappings":";;;;;;;;;;AAeO,SAAS,gBAAA,CAAiB,EAAE,MAAA,EAAQ,IAAA,EAAK,EAA+B;AAC7E,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,iBAAA,CAAkB,wBAAwB,CAAA;AACxD,EAAA,MAAM,cAAA,GAAiB,OAAO,WAAA,GAC1B,UAAA,CAAW,OAAO,WAAW,CAAA,GAC7B,EAAE,kCAAkC,CAAA;AAExC,EAAA,uBACE,IAAA,CAAC,YAAA,EAAA,EAAa,IAAA,EAAK,WAAA,EACjB,QAAA,EAAA;AAAA,oBAAA,IAAA,CAAC,aAAA,EAAA,EACE,QAAA,EAAA;AAAA,MAAA,IAAA,KAAS,0BACR,GAAA,CAAC,YAAA,EAAA,EAAa,IAAA,EAAM,CAAA,CAAE,kBAAkB,CAAA,EAAG,IAAA,EAAK,OAAA,EAAQ,CAAA,uBAEvD,YAAA,EAAA,EAAa,IAAA,EAAM,EAAE,oBAAoB,CAAA,EAAG,MAAK,QAAA,EAAS,CAAA;AAAA,0BAE5D,YAAA,EAAA,EAAa,IAAA,EAAM,EAAE,mBAAmB,CAAA,EAAG,MAAK,SAAA,EAAU;AAAA,KAAA,EAC7D,CAAA;AAAA,oBACA,GAAA,CAAC,iBAAA,EAAA,EAAkB,KAAA,EAAO,MAAA,CAAO,KAAA,EAAO,CAAA;AAAA,oBACxC,GAAA;AAAA,MAAC,iBAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAO,EAAE,wBAAwB,CAAA;AAAA,QACjC,OAAO,MAAA,CAAO;AAAA;AAAA,KAChB;AAAA,IACC,MAAA,CAAO,GAAA,oBACN,GAAA,CAAC,iBAAA,EAAA,EAAkB,KAAA,EAAO,EAAE,gBAAgB,CAAA,EAAG,KAAA,EAAO,MAAA,CAAO,GAAA,EAAK,CAAA;AAAA,oBAEpE,GAAA;AAAA,MAAC,iBAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAO,EAAE,mBAAmB,CAAA;AAAA,QAE5B,KAAA,EAAO,CAAA,CAAE,CAAA,aAAA,EAAgB,MAAA,CAAO,MAAM,CAAA,CAAE;AAAA;AAAA,KAC1C;AAAA,oBACA,GAAA;AAAA,MAAC,iBAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAO,EAAE,mCAAmC,CAAA;AAAA,QAC5C,KAAA,EAAO;AAAA;AAAA,KACT;AAAA,oBACA,GAAA;AAAA,MAAC,iBAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAO,EAAE,2CAA2C,CAAA;AAAA,QACpD,OAAO,MAAA,CAAO;AAAA;AAAA;AAChB,GAAA,
|
|
1
|
+
{"version":3,"file":"RiScActionChange.esm.js","sources":["../../../../src/components/riScInfo/changeset/RiScActionChange.tsx"],"sourcesContent":["import { Action } from '../../../utils/types';\nimport { ChangeSetBox } from './components/ChangeSetBox.tsx';\nimport { ChangeSetTag } from './components/ChangeSetTag.tsx';\nimport { ChangeSetTags } from './components/ChangeSetTags.tsx';\nimport { ChangeSetBoxTitle } from './components/ChangeSetBoxTitle.tsx';\nimport { ChangeSetProperty } from './components/ChangeSetProperty.tsx';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { pluginRiScTranslationRef } from '../../../utils/translations.ts';\nimport { formatDate } from '../../../utils/utilityfunctions.ts';\n\ninterface RiScWholeActionChangeProps {\n action: Action;\n type: 'ADDED' | 'DELETED';\n}\n\nexport function RiScActionChange({ action, type }: RiScWholeActionChangeProps) {\n const { t } = useTranslationRef(pluginRiScTranslationRef);\n const parsedDateTime = action.lastUpdated\n ? formatDate(action.lastUpdated)\n : t('scenarioDrawer.action.notUpdated');\n\n return (\n <ChangeSetBox type=\"secondary\">\n <ChangeSetTags>\n {type === 'ADDED' ? (\n <ChangeSetTag text={t('dictionary.added')} type=\"added\" />\n ) : (\n <ChangeSetTag text={t('dictionary.removed')} type=\"delete\" />\n )}\n <ChangeSetTag text={t('dictionary.action')} type=\"primary\" />\n </ChangeSetTags>\n <ChangeSetBoxTitle title={action.title} />\n <ChangeSetProperty\n title={t('dictionary.description')}\n value={action.description}\n />\n {action.url && (\n <ChangeSetProperty title={t('dictionary.url')} value={action.url} />\n )}\n <ChangeSetProperty\n title={t('dictionary.status')}\n /* @ts-ignore Because ts can't typecheck strings against our keys */\n value={t(`actionStatus.${action.status}`)}\n />\n <ChangeSetProperty\n title={t('scenarioDrawer.action.lastUpdated')}\n value={parsedDateTime}\n />\n <ChangeSetProperty\n title={t('migrationDialog.migration51.lastUpdatedBy')}\n value={action.lastUpdatedBy}\n />\n {action.comment && (\n <ChangeSetProperty\n title={t('dictionary.comment')}\n value={action.comment}\n />\n )}\n </ChangeSetBox>\n );\n}\n"],"names":[],"mappings":";;;;;;;;;;AAeO,SAAS,gBAAA,CAAiB,EAAE,MAAA,EAAQ,IAAA,EAAK,EAA+B;AAC7E,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,iBAAA,CAAkB,wBAAwB,CAAA;AACxD,EAAA,MAAM,cAAA,GAAiB,OAAO,WAAA,GAC1B,UAAA,CAAW,OAAO,WAAW,CAAA,GAC7B,EAAE,kCAAkC,CAAA;AAExC,EAAA,uBACE,IAAA,CAAC,YAAA,EAAA,EAAa,IAAA,EAAK,WAAA,EACjB,QAAA,EAAA;AAAA,oBAAA,IAAA,CAAC,aAAA,EAAA,EACE,QAAA,EAAA;AAAA,MAAA,IAAA,KAAS,0BACR,GAAA,CAAC,YAAA,EAAA,EAAa,IAAA,EAAM,CAAA,CAAE,kBAAkB,CAAA,EAAG,IAAA,EAAK,OAAA,EAAQ,CAAA,uBAEvD,YAAA,EAAA,EAAa,IAAA,EAAM,EAAE,oBAAoB,CAAA,EAAG,MAAK,QAAA,EAAS,CAAA;AAAA,0BAE5D,YAAA,EAAA,EAAa,IAAA,EAAM,EAAE,mBAAmB,CAAA,EAAG,MAAK,SAAA,EAAU;AAAA,KAAA,EAC7D,CAAA;AAAA,oBACA,GAAA,CAAC,iBAAA,EAAA,EAAkB,KAAA,EAAO,MAAA,CAAO,KAAA,EAAO,CAAA;AAAA,oBACxC,GAAA;AAAA,MAAC,iBAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAO,EAAE,wBAAwB,CAAA;AAAA,QACjC,OAAO,MAAA,CAAO;AAAA;AAAA,KAChB;AAAA,IACC,MAAA,CAAO,GAAA,oBACN,GAAA,CAAC,iBAAA,EAAA,EAAkB,KAAA,EAAO,EAAE,gBAAgB,CAAA,EAAG,KAAA,EAAO,MAAA,CAAO,GAAA,EAAK,CAAA;AAAA,oBAEpE,GAAA;AAAA,MAAC,iBAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAO,EAAE,mBAAmB,CAAA;AAAA,QAE5B,KAAA,EAAO,CAAA,CAAE,CAAA,aAAA,EAAgB,MAAA,CAAO,MAAM,CAAA,CAAE;AAAA;AAAA,KAC1C;AAAA,oBACA,GAAA;AAAA,MAAC,iBAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAO,EAAE,mCAAmC,CAAA;AAAA,QAC5C,KAAA,EAAO;AAAA;AAAA,KACT;AAAA,oBACA,GAAA;AAAA,MAAC,iBAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAO,EAAE,2CAA2C,CAAA;AAAA,QACpD,OAAO,MAAA,CAAO;AAAA;AAAA,KAChB;AAAA,IACC,OAAO,OAAA,oBACN,GAAA;AAAA,MAAC,iBAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAO,EAAE,oBAAoB,CAAA;AAAA,QAC7B,OAAO,MAAA,CAAO;AAAA;AAAA;AAChB,GAAA,EAEJ,CAAA;AAEJ;;;;"}
|
|
@@ -52,6 +52,14 @@ function RiScActionChangeSet({ action }) {
|
|
|
52
52
|
title: t("migrationDialog.migration51.lastUpdatedBy"),
|
|
53
53
|
property: action.lastUpdatedBy
|
|
54
54
|
}
|
|
55
|
+
),
|
|
56
|
+
/* @__PURE__ */ jsx(
|
|
57
|
+
ChangeSetTrackedProperty,
|
|
58
|
+
{
|
|
59
|
+
title: t("dictionary.comment"),
|
|
60
|
+
property: action.comment,
|
|
61
|
+
stringOnUndefinedProperty: t("comparisonDialog.noComment")
|
|
62
|
+
}
|
|
55
63
|
)
|
|
56
64
|
] });
|
|
57
65
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RiScActionChangeSet.esm.js","sources":["../../../../src/components/riScInfo/changeset/RiScActionChangeSet.tsx"],"sourcesContent":["import { ActionChange } from '../../../utils/types.ts';\nimport { ChangeSetBox } from './components/ChangeSetBox.tsx';\nimport { ChangeSetTags } from './components/ChangeSetTags.tsx';\nimport { ChangeSetTag } from './components/ChangeSetTag.tsx';\nimport { ChangeSetTrackedProperty } from './components/ChangeSetTrackedProperty.tsx';\nimport { ChangeSetChangedTitle } from './components/ChangeSetChangedTitle.tsx';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { pluginRiScTranslationRef } from '../../../utils/translations.ts';\nimport { formatDate } from '../../../utils/utilityfunctions.ts';\n\ninterface RiScActionChangeSetProps {\n action: ActionChange;\n}\n\nexport function RiScActionChangeSet({ action }: RiScActionChangeSetProps) {\n const { t } = useTranslationRef(pluginRiScTranslationRef);\n return (\n <ChangeSetBox type=\"secondary\">\n <ChangeSetTags>\n <ChangeSetTag text={t('dictionary.action')} type=\"primary\" />\n </ChangeSetTags>\n <ChangeSetChangedTitle title={action.title} />\n <ChangeSetTrackedProperty\n title={t('dictionary.description')}\n property={action.description}\n multiline={true}\n stringOnUndefinedProperty={t('comparisonDialog.noDescription')}\n />\n <ChangeSetTrackedProperty\n title={t('dictionary.url')}\n property={action.url}\n stringOnUndefinedProperty={t('comparisonDialog.noURL')}\n />\n <ChangeSetTrackedProperty\n title={t('dictionary.status')}\n property={action.status}\n /* @ts-ignore Because ts can't typecheck strings against our keys */\n valueFormatter={actionValue => t(`actionStatus.${actionValue}`)}\n />\n <ChangeSetTrackedProperty\n title={t('scenarioDrawer.action.lastUpdated')}\n property={action.lastUpdated}\n valueFormatter={actionValue =>\n actionValue\n ? formatDate(actionValue)\n : t('scenarioDrawer.action.notUpdated')\n }\n />\n <ChangeSetTrackedProperty\n title={t('migrationDialog.migration51.lastUpdatedBy')}\n property={action.lastUpdatedBy}\n />\n </ChangeSetBox>\n );\n}\n"],"names":[],"mappings":";;;;;;;;;;AAcO,SAAS,mBAAA,CAAoB,EAAE,MAAA,EAAO,EAA6B;AACxE,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,iBAAA,CAAkB,wBAAwB,CAAA;AACxD,EAAA,uBACE,IAAA,CAAC,YAAA,EAAA,EAAa,IAAA,EAAK,WAAA,EACjB,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,aAAA,EAAA,EACC,8BAAC,YAAA,EAAA,EAAa,IAAA,EAAM,EAAE,mBAAmB,CAAA,EAAG,IAAA,EAAK,SAAA,EAAU,CAAA,EAC7D,CAAA;AAAA,oBACA,GAAA,CAAC,qBAAA,EAAA,EAAsB,KAAA,EAAO,MAAA,CAAO,KAAA,EAAO,CAAA;AAAA,oBAC5C,GAAA;AAAA,MAAC,wBAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAO,EAAE,wBAAwB,CAAA;AAAA,QACjC,UAAU,MAAA,CAAO,WAAA;AAAA,QACjB,SAAA,EAAW,IAAA;AAAA,QACX,yBAAA,EAA2B,EAAE,gCAAgC;AAAA;AAAA,KAC/D;AAAA,oBACA,GAAA;AAAA,MAAC,wBAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAO,EAAE,gBAAgB,CAAA;AAAA,QACzB,UAAU,MAAA,CAAO,GAAA;AAAA,QACjB,yBAAA,EAA2B,EAAE,wBAAwB;AAAA;AAAA,KACvD;AAAA,oBACA,GAAA;AAAA,MAAC,wBAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAO,EAAE,mBAAmB,CAAA;AAAA,QAC5B,UAAU,MAAA,CAAO,MAAA;AAAA,QAEjB,cAAA,EAAgB,CAAA,WAAA,KAAe,CAAA,CAAE,CAAA,aAAA,EAAgB,WAAW,CAAA,CAAE;AAAA;AAAA,KAChE;AAAA,oBACA,GAAA;AAAA,MAAC,wBAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAO,EAAE,mCAAmC,CAAA;AAAA,QAC5C,UAAU,MAAA,CAAO,WAAA;AAAA,QACjB,gBAAgB,CAAA,WAAA,KACd,WAAA,GACI,WAAW,WAAW,CAAA,GACtB,EAAE,kCAAkC;AAAA;AAAA,KAE5C;AAAA,oBACA,GAAA;AAAA,MAAC,wBAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAO,EAAE,2CAA2C,CAAA;AAAA,QACpD,UAAU,MAAA,CAAO;AAAA;AAAA;
|
|
1
|
+
{"version":3,"file":"RiScActionChangeSet.esm.js","sources":["../../../../src/components/riScInfo/changeset/RiScActionChangeSet.tsx"],"sourcesContent":["import { ActionChange } from '../../../utils/types.ts';\nimport { ChangeSetBox } from './components/ChangeSetBox.tsx';\nimport { ChangeSetTags } from './components/ChangeSetTags.tsx';\nimport { ChangeSetTag } from './components/ChangeSetTag.tsx';\nimport { ChangeSetTrackedProperty } from './components/ChangeSetTrackedProperty.tsx';\nimport { ChangeSetChangedTitle } from './components/ChangeSetChangedTitle.tsx';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { pluginRiScTranslationRef } from '../../../utils/translations.ts';\nimport { formatDate } from '../../../utils/utilityfunctions.ts';\n\ninterface RiScActionChangeSetProps {\n action: ActionChange;\n}\n\nexport function RiScActionChangeSet({ action }: RiScActionChangeSetProps) {\n const { t } = useTranslationRef(pluginRiScTranslationRef);\n return (\n <ChangeSetBox type=\"secondary\">\n <ChangeSetTags>\n <ChangeSetTag text={t('dictionary.action')} type=\"primary\" />\n </ChangeSetTags>\n <ChangeSetChangedTitle title={action.title} />\n <ChangeSetTrackedProperty\n title={t('dictionary.description')}\n property={action.description}\n multiline={true}\n stringOnUndefinedProperty={t('comparisonDialog.noDescription')}\n />\n <ChangeSetTrackedProperty\n title={t('dictionary.url')}\n property={action.url}\n stringOnUndefinedProperty={t('comparisonDialog.noURL')}\n />\n <ChangeSetTrackedProperty\n title={t('dictionary.status')}\n property={action.status}\n /* @ts-ignore Because ts can't typecheck strings against our keys */\n valueFormatter={actionValue => t(`actionStatus.${actionValue}`)}\n />\n <ChangeSetTrackedProperty\n title={t('scenarioDrawer.action.lastUpdated')}\n property={action.lastUpdated}\n valueFormatter={actionValue =>\n actionValue\n ? formatDate(actionValue)\n : t('scenarioDrawer.action.notUpdated')\n }\n />\n <ChangeSetTrackedProperty\n title={t('migrationDialog.migration51.lastUpdatedBy')}\n property={action.lastUpdatedBy}\n />\n <ChangeSetTrackedProperty\n title={t('dictionary.comment')}\n property={action.comment}\n stringOnUndefinedProperty={t('comparisonDialog.noComment')}\n />\n </ChangeSetBox>\n );\n}\n"],"names":[],"mappings":";;;;;;;;;;AAcO,SAAS,mBAAA,CAAoB,EAAE,MAAA,EAAO,EAA6B;AACxE,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,iBAAA,CAAkB,wBAAwB,CAAA;AACxD,EAAA,uBACE,IAAA,CAAC,YAAA,EAAA,EAAa,IAAA,EAAK,WAAA,EACjB,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,aAAA,EAAA,EACC,8BAAC,YAAA,EAAA,EAAa,IAAA,EAAM,EAAE,mBAAmB,CAAA,EAAG,IAAA,EAAK,SAAA,EAAU,CAAA,EAC7D,CAAA;AAAA,oBACA,GAAA,CAAC,qBAAA,EAAA,EAAsB,KAAA,EAAO,MAAA,CAAO,KAAA,EAAO,CAAA;AAAA,oBAC5C,GAAA;AAAA,MAAC,wBAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAO,EAAE,wBAAwB,CAAA;AAAA,QACjC,UAAU,MAAA,CAAO,WAAA;AAAA,QACjB,SAAA,EAAW,IAAA;AAAA,QACX,yBAAA,EAA2B,EAAE,gCAAgC;AAAA;AAAA,KAC/D;AAAA,oBACA,GAAA;AAAA,MAAC,wBAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAO,EAAE,gBAAgB,CAAA;AAAA,QACzB,UAAU,MAAA,CAAO,GAAA;AAAA,QACjB,yBAAA,EAA2B,EAAE,wBAAwB;AAAA;AAAA,KACvD;AAAA,oBACA,GAAA;AAAA,MAAC,wBAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAO,EAAE,mBAAmB,CAAA;AAAA,QAC5B,UAAU,MAAA,CAAO,MAAA;AAAA,QAEjB,cAAA,EAAgB,CAAA,WAAA,KAAe,CAAA,CAAE,CAAA,aAAA,EAAgB,WAAW,CAAA,CAAE;AAAA;AAAA,KAChE;AAAA,oBACA,GAAA;AAAA,MAAC,wBAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAO,EAAE,mCAAmC,CAAA;AAAA,QAC5C,UAAU,MAAA,CAAO,WAAA;AAAA,QACjB,gBAAgB,CAAA,WAAA,KACd,WAAA,GACI,WAAW,WAAW,CAAA,GACtB,EAAE,kCAAkC;AAAA;AAAA,KAE5C;AAAA,oBACA,GAAA;AAAA,MAAC,wBAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAO,EAAE,2CAA2C,CAAA;AAAA,QACpD,UAAU,MAAA,CAAO;AAAA;AAAA,KACnB;AAAA,oBACA,GAAA;AAAA,MAAC,wBAAA;AAAA,MAAA;AAAA,QACC,KAAA,EAAO,EAAE,oBAAoB,CAAA;AAAA,QAC7B,UAAU,MAAA,CAAO,OAAA;AAAA,QACjB,yBAAA,EAA2B,EAAE,4BAA4B;AAAA;AAAA;AAC3D,GAAA,EACF,CAAA;AAEJ;;;;"}
|
|
@@ -10,6 +10,8 @@ import { RiScMigrationChanges42 } from './RiScMigrationChanges42.esm.js';
|
|
|
10
10
|
import { RiScMigrationChanges50 } from './RiScMigrationChanges50.esm.js';
|
|
11
11
|
import { RiScMigrationChanges51 } from './RiScMigrationChanges51.esm.js';
|
|
12
12
|
import { RiScMigrationChanges52 } from './RiScMigrationChanges52.esm.js';
|
|
13
|
+
import { RiScMigrationChanges53 } from './RiScMigrationChanges53.esm.js';
|
|
14
|
+
import { RiScMigrationChanges54 } from './RiScMigrationChanges54.esm.js';
|
|
13
15
|
|
|
14
16
|
function RiScMigrationChanges({
|
|
15
17
|
migrationStatus
|
|
@@ -31,7 +33,9 @@ function RiScMigrationChanges({
|
|
|
31
33
|
migrationStatus.migrationChanges42 && /* @__PURE__ */ jsx(RiScMigrationChanges42, { changes: migrationStatus.migrationChanges42 }),
|
|
32
34
|
migrationStatus.migrationChanges50 && /* @__PURE__ */ jsx(RiScMigrationChanges50, { changes: migrationStatus.migrationChanges50 }),
|
|
33
35
|
migrationStatus.migrationChanges51 && /* @__PURE__ */ jsx(RiScMigrationChanges51, { changes: migrationStatus.migrationChanges51 }),
|
|
34
|
-
migrationStatus.migrationVersions?.toVersion === "5.2" && /* @__PURE__ */ jsx(RiScMigrationChanges52, {})
|
|
36
|
+
migrationStatus.migrationVersions?.toVersion === "5.2" && /* @__PURE__ */ jsx(RiScMigrationChanges52, {}),
|
|
37
|
+
migrationStatus.migrationVersions?.toVersion === "5.3" && /* @__PURE__ */ jsx(RiScMigrationChanges53, {}),
|
|
38
|
+
migrationStatus.migrationVersions?.toVersion === "5.4" && /* @__PURE__ */ jsx(RiScMigrationChanges54, {})
|
|
35
39
|
] });
|
|
36
40
|
}
|
|
37
41
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RiScMigrationChanges.esm.js","sources":["../../../../src/components/riScInfo/migrations/RiScMigrationChanges.tsx"],"sourcesContent":["import { ChangeSetTitle } from '../changeset/components/ChangeSetTitle.tsx';\nimport { ChangeSetBox } from '../changeset/components/ChangeSetBox.tsx';\nimport { RiScMigrationChanges40 } from './RiScMigrationChanges40.tsx';\nimport { RiScMigrationChanges41 } from './RiScMigrationChanges41.tsx';\nimport { MigrationStatus } from '../../../utils/types.ts';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { pluginRiScTranslationRef } from '../../../utils/translations.ts';\nimport { ChangeSetChangedProperty } from '../changeset/components/ChangeSetChangedProperty.tsx';\nimport { RiScMigrationChanges42 } from './RiScMigrationChanges42.tsx';\nimport { RiScMigrationChanges50 } from './RiScMigrationChanges50.tsx';\nimport { RiScMigrationChanges51 } from './RiScMigrationChanges51.tsx';\nimport { RiScMigrationChanges52 } from './RiScMigrationChanges52.tsx';\n\ninterface RiScMigrationChangesProps {\n migrationStatus: MigrationStatus;\n}\n\nexport function RiScMigrationChanges({\n migrationStatus,\n}: RiScMigrationChangesProps) {\n const { t } = useTranslationRef(pluginRiScTranslationRef);\n return (\n <div>\n <ChangeSetTitle text={t('migrationDialog.schemaVersion')} />\n <ChangeSetBox type=\"primary\">\n <ChangeSetChangedProperty\n propertyName={t('migrationDialog.schemaVersion')}\n oldValue={migrationStatus.migrationVersions?.fromVersion || ''}\n newValue={migrationStatus.migrationVersions?.toVersion || ''}\n compact={true}\n />\n </ChangeSetBox>\n {migrationStatus.migrationChanges40 && (\n <RiScMigrationChanges40 changes={migrationStatus.migrationChanges40} />\n )}\n {migrationStatus.migrationChanges41 && (\n <RiScMigrationChanges41 changes={migrationStatus.migrationChanges41} />\n )}\n {migrationStatus.migrationChanges42 && (\n <RiScMigrationChanges42 changes={migrationStatus.migrationChanges42} />\n )}\n {migrationStatus.migrationChanges50 && (\n <RiScMigrationChanges50 changes={migrationStatus.migrationChanges50} />\n )}\n {migrationStatus.migrationChanges51 && (\n <RiScMigrationChanges51 changes={migrationStatus.migrationChanges51} />\n )}\n {migrationStatus.migrationVersions?.toVersion === '5.2' && (\n <RiScMigrationChanges52 />\n )}\n </div>\n );\n}\n"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"RiScMigrationChanges.esm.js","sources":["../../../../src/components/riScInfo/migrations/RiScMigrationChanges.tsx"],"sourcesContent":["import { ChangeSetTitle } from '../changeset/components/ChangeSetTitle.tsx';\nimport { ChangeSetBox } from '../changeset/components/ChangeSetBox.tsx';\nimport { RiScMigrationChanges40 } from './RiScMigrationChanges40.tsx';\nimport { RiScMigrationChanges41 } from './RiScMigrationChanges41.tsx';\nimport { MigrationStatus } from '../../../utils/types.ts';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { pluginRiScTranslationRef } from '../../../utils/translations.ts';\nimport { ChangeSetChangedProperty } from '../changeset/components/ChangeSetChangedProperty.tsx';\nimport { RiScMigrationChanges42 } from './RiScMigrationChanges42.tsx';\nimport { RiScMigrationChanges50 } from './RiScMigrationChanges50.tsx';\nimport { RiScMigrationChanges51 } from './RiScMigrationChanges51.tsx';\nimport { RiScMigrationChanges52 } from './RiScMigrationChanges52.tsx';\nimport { RiScMigrationChanges53 } from './RiScMigrationChanges53.tsx';\nimport { RiScMigrationChanges54 } from './RiScMigrationChanges54.tsx';\n\ninterface RiScMigrationChangesProps {\n migrationStatus: MigrationStatus;\n}\n\nexport function RiScMigrationChanges({\n migrationStatus,\n}: RiScMigrationChangesProps) {\n const { t } = useTranslationRef(pluginRiScTranslationRef);\n return (\n <div>\n <ChangeSetTitle text={t('migrationDialog.schemaVersion')} />\n <ChangeSetBox type=\"primary\">\n <ChangeSetChangedProperty\n propertyName={t('migrationDialog.schemaVersion')}\n oldValue={migrationStatus.migrationVersions?.fromVersion || ''}\n newValue={migrationStatus.migrationVersions?.toVersion || ''}\n compact={true}\n />\n </ChangeSetBox>\n {migrationStatus.migrationChanges40 && (\n <RiScMigrationChanges40 changes={migrationStatus.migrationChanges40} />\n )}\n {migrationStatus.migrationChanges41 && (\n <RiScMigrationChanges41 changes={migrationStatus.migrationChanges41} />\n )}\n {migrationStatus.migrationChanges42 && (\n <RiScMigrationChanges42 changes={migrationStatus.migrationChanges42} />\n )}\n {migrationStatus.migrationChanges50 && (\n <RiScMigrationChanges50 changes={migrationStatus.migrationChanges50} />\n )}\n {migrationStatus.migrationChanges51 && (\n <RiScMigrationChanges51 changes={migrationStatus.migrationChanges51} />\n )}\n {migrationStatus.migrationVersions?.toVersion === '5.2' && (\n <RiScMigrationChanges52 />\n )}\n {migrationStatus.migrationVersions?.toVersion === '5.3' && (\n <RiScMigrationChanges53 />\n )}\n {migrationStatus.migrationVersions?.toVersion === '5.4' && (\n <RiScMigrationChanges54 />\n )}\n </div>\n );\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;AAmBO,SAAS,oBAAA,CAAqB;AAAA,EACnC;AACF,CAAA,EAA8B;AAC5B,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,iBAAA,CAAkB,wBAAwB,CAAA;AACxD,EAAA,4BACG,KAAA,EAAA,EACC,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,cAAA,EAAA,EAAe,IAAA,EAAM,CAAA,CAAE,+BAA+B,CAAA,EAAG,CAAA;AAAA,oBAC1D,GAAA,CAAC,YAAA,EAAA,EAAa,IAAA,EAAK,SAAA,EACjB,QAAA,kBAAA,GAAA;AAAA,MAAC,wBAAA;AAAA,MAAA;AAAA,QACC,YAAA,EAAc,EAAE,+BAA+B,CAAA;AAAA,QAC/C,QAAA,EAAU,eAAA,CAAgB,iBAAA,EAAmB,WAAA,IAAe,EAAA;AAAA,QAC5D,QAAA,EAAU,eAAA,CAAgB,iBAAA,EAAmB,SAAA,IAAa,EAAA;AAAA,QAC1D,OAAA,EAAS;AAAA;AAAA,KACX,EACF,CAAA;AAAA,IACC,gBAAgB,kBAAA,oBACf,GAAA,CAAC,sBAAA,EAAA,EAAuB,OAAA,EAAS,gBAAgB,kBAAA,EAAoB,CAAA;AAAA,IAEtE,gBAAgB,kBAAA,oBACf,GAAA,CAAC,sBAAA,EAAA,EAAuB,OAAA,EAAS,gBAAgB,kBAAA,EAAoB,CAAA;AAAA,IAEtE,gBAAgB,kBAAA,oBACf,GAAA,CAAC,sBAAA,EAAA,EAAuB,OAAA,EAAS,gBAAgB,kBAAA,EAAoB,CAAA;AAAA,IAEtE,gBAAgB,kBAAA,oBACf,GAAA,CAAC,sBAAA,EAAA,EAAuB,OAAA,EAAS,gBAAgB,kBAAA,EAAoB,CAAA;AAAA,IAEtE,gBAAgB,kBAAA,oBACf,GAAA,CAAC,sBAAA,EAAA,EAAuB,OAAA,EAAS,gBAAgB,kBAAA,EAAoB,CAAA;AAAA,IAEtE,eAAA,CAAgB,iBAAA,EAAmB,SAAA,KAAc,KAAA,wBAC/C,sBAAA,EAAA,EAAuB,CAAA;AAAA,IAEzB,eAAA,CAAgB,iBAAA,EAAmB,SAAA,KAAc,KAAA,wBAC/C,sBAAA,EAAA,EAAuB,CAAA;AAAA,IAEzB,eAAA,CAAgB,iBAAA,EAAmB,SAAA,KAAc,KAAA,wBAC/C,sBAAA,EAAA,EAAuB;AAAA,GAAA,EAE5B,CAAA;AAEJ;;;;"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { jsx } from 'react/jsx-runtime';
|
|
2
|
+
import { MigrationTitle } from './components/MigrationTitle.esm.js';
|
|
3
|
+
|
|
4
|
+
function RiScMigrationChanges53() {
|
|
5
|
+
return /* @__PURE__ */ jsx(
|
|
6
|
+
MigrationTitle,
|
|
7
|
+
{
|
|
8
|
+
from: "5.2",
|
|
9
|
+
to: "5.3",
|
|
10
|
+
migrationExplanation: "",
|
|
11
|
+
changelogUrl: "https://github.com/kartverket/backstage-plugin-risk-scorecard-backend/blob/main/docs/schemaChangelog.md#53"
|
|
12
|
+
}
|
|
13
|
+
);
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export { RiScMigrationChanges53 };
|
|
17
|
+
//# sourceMappingURL=RiScMigrationChanges53.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RiScMigrationChanges53.esm.js","sources":["../../../../src/components/riScInfo/migrations/RiScMigrationChanges53.tsx"],"sourcesContent":["import { MigrationTitle } from './components/MigrationTitle.tsx';\n\nexport function RiScMigrationChanges53() {\n return (\n <MigrationTitle\n from=\"5.2\"\n to=\"5.3\"\n migrationExplanation=\"\"\n changelogUrl=\"https://github.com/kartverket/backstage-plugin-risk-scorecard-backend/blob/main/docs/schemaChangelog.md#53\"\n />\n );\n}\n"],"names":[],"mappings":";;;AAEO,SAAS,sBAAA,GAAyB;AACvC,EAAA,uBACE,GAAA;AAAA,IAAC,cAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,KAAA;AAAA,MACL,EAAA,EAAG,KAAA;AAAA,MACH,oBAAA,EAAqB,EAAA;AAAA,MACrB,YAAA,EAAa;AAAA;AAAA,GACf;AAEJ;;;;"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { jsx } from 'react/jsx-runtime';
|
|
2
|
+
import { MigrationTitle } from './components/MigrationTitle.esm.js';
|
|
3
|
+
import { useTranslationRef } from '@backstage/core-plugin-api/alpha';
|
|
4
|
+
import { pluginRiScTranslationRef } from '../../../utils/translations.esm.js';
|
|
5
|
+
|
|
6
|
+
function RiScMigrationChanges54() {
|
|
7
|
+
const { t } = useTranslationRef(pluginRiScTranslationRef);
|
|
8
|
+
return /* @__PURE__ */ jsx(
|
|
9
|
+
MigrationTitle,
|
|
10
|
+
{
|
|
11
|
+
from: "5.3",
|
|
12
|
+
to: "5.4",
|
|
13
|
+
migrationExplanation: t("migrationDialog.migration54.changeExplanation"),
|
|
14
|
+
changelogUrl: "https://github.com/kartverket/backstage-plugin-risk-scorecard-backend/blob/main/docs/schemaChangelog.md#54"
|
|
15
|
+
}
|
|
16
|
+
);
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export { RiScMigrationChanges54 };
|
|
20
|
+
//# sourceMappingURL=RiScMigrationChanges54.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RiScMigrationChanges54.esm.js","sources":["../../../../src/components/riScInfo/migrations/RiScMigrationChanges54.tsx"],"sourcesContent":["import { MigrationTitle } from './components/MigrationTitle.tsx';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { pluginRiScTranslationRef } from '../../../utils/translations.ts';\n\nexport function RiScMigrationChanges54() {\n const { t } = useTranslationRef(pluginRiScTranslationRef);\n\n return (\n <MigrationTitle\n from=\"5.3\"\n to=\"5.4\"\n migrationExplanation={t('migrationDialog.migration54.changeExplanation')}\n changelogUrl=\"https://github.com/kartverket/backstage-plugin-risk-scorecard-backend/blob/main/docs/schemaChangelog.md#54\"\n />\n );\n}\n"],"names":[],"mappings":";;;;;AAIO,SAAS,sBAAA,GAAyB;AACvC,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,iBAAA,CAAkB,wBAAwB,CAAA;AAExD,EAAA,uBACE,GAAA;AAAA,IAAC,cAAA;AAAA,IAAA;AAAA,MACC,IAAA,EAAK,KAAA;AAAA,MACL,EAAA,EAAG,KAAA;AAAA,MACH,oBAAA,EAAsB,EAAE,+CAA+C,CAAA;AAAA,MACvE,YAAA,EAAa;AAAA;AAAA,GACf;AAEJ;;;;"}
|
|
@@ -104,7 +104,18 @@ function ActionFormItem({
|
|
|
104
104
|
options: actionStatusOptions
|
|
105
105
|
}
|
|
106
106
|
)
|
|
107
|
-
] })
|
|
107
|
+
] }),
|
|
108
|
+
/* @__PURE__ */ jsx(
|
|
109
|
+
Input,
|
|
110
|
+
{
|
|
111
|
+
...register(
|
|
112
|
+
`${addPeriodToBaseObjectPath(baseObjectPathToActionOfForm)}comment`
|
|
113
|
+
),
|
|
114
|
+
label: t("dictionary.comment"),
|
|
115
|
+
helperText: errorObject?.comment?.message,
|
|
116
|
+
error: errorObject?.comment?.message !== void 0
|
|
117
|
+
}
|
|
118
|
+
)
|
|
108
119
|
] }) });
|
|
109
120
|
}
|
|
110
121
|
function UrlLabel() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ActionFormItem.esm.js","sources":["../../../../src/components/scenarioDrawer/components/ActionFormItem.tsx"],"sourcesContent":["import { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport DeleteIcon from '@mui/icons-material/Delete';\nimport Box from '@mui/material/Box';\nimport IconButton from '@mui/material/IconButton';\nimport { Controller, UseFormReturn } from 'react-hook-form';\nimport {\n ActionStatusOptions,\n urlRegExpPattern,\n} from '../../../utils/constants';\nimport { pluginRiScTranslationRef } from '../../../utils/translations';\nimport {\n actionStatusOptionsToTranslationKeys,\n getValue,\n} from '../../../utils/utilityfunctions';\nimport { Input } from '../../common/Input';\nimport { MarkdownInput } from '../../common/MarkdownInput';\nimport { Select } from '../../common/Select';\nimport HelpIcon from '@mui/icons-material/Help';\nimport Tooltip from '@mui/material/Tooltip';\nimport { Text } from '@backstage/ui';\nimport styles from './ActionFormItem.module.css';\n\nfunction addPeriodToBaseObjectPath(s: string) {\n if (!s) return '';\n return `${s}.`;\n}\n\ntype ActionFormItemProps = {\n formMethods: UseFormReturn<any>;\n handleDelete: () => void;\n displayedIndex?: number;\n // Specify baseObjectPathToActionOfForm where in the form of formMethods the action object is (use if nested)\n // Example value: \"actions.1\"\n baseObjectPathToActionOfForm?: string;\n};\n\nexport function ActionFormItem({\n formMethods,\n handleDelete,\n displayedIndex,\n baseObjectPathToActionOfForm = '',\n}: ActionFormItemProps) {\n const { t } = useTranslationRef(pluginRiScTranslationRef);\n\n const { control, register, formState } = formMethods;\n const errorObject = getValue(formState.errors, baseObjectPathToActionOfForm);\n\n const actionStatusOptions = Object.values(ActionStatusOptions).map(\n actionStatus => ({\n value: actionStatus,\n /* @ts-ignore Because ts can't typecheck strings against our keys */\n renderedValue: t(actionStatusOptionsToTranslationKeys[actionStatus]),\n }),\n );\n\n return (\n <>\n <Box className={styles.formGrid}>\n <Box className={styles.formHeader}>\n {displayedIndex !== undefined && displayedIndex !== null ? (\n <Text variant=\"title-x-small\" weight=\"bold\">\n {t('dictionary.measure')} {displayedIndex + 1}\n </Text>\n ) : (\n <Text variant=\"title-x-small\" weight=\"bold\">\n {t('dictionary.edit')}\n </Text>\n )}\n <IconButton onClick={handleDelete} color=\"primary\">\n <DeleteIcon aria-label=\"Delete\" />\n </IconButton>\n </Box>\n <Input\n required\n {...register(\n `${addPeriodToBaseObjectPath(baseObjectPathToActionOfForm)}title`,\n {\n required: true,\n },\n )}\n error={errorObject?.title !== undefined}\n label={t('dictionary.title')}\n helperText={\n errorObject?.title &&\n t('scenarioDrawer.measureTab.addMeasureTitleError')\n }\n />\n <Controller\n control={control}\n name={`${addPeriodToBaseObjectPath(baseObjectPathToActionOfForm)}description`}\n render={({ field: { onChange, value }, fieldState: { error } }) => (\n <MarkdownInput\n label={t('dictionary.description')}\n value={value}\n onMarkdownChange={onChange}\n error={!!error}\n minRows={8}\n />\n )}\n />\n <Box className={styles.inputGrid}>\n <Input\n {...register(\n `${addPeriodToBaseObjectPath(baseObjectPathToActionOfForm)}url`,\n {\n pattern: {\n value: urlRegExpPattern,\n message: t('scenarioDrawer.action.urlError'),\n },\n },\n )}\n label={<UrlLabel />}\n helperText={errorObject?.url?.message}\n error={errorObject?.url?.message}\n />\n <Select\n required\n control={control}\n name={`${addPeriodToBaseObjectPath(baseObjectPathToActionOfForm)}status`}\n label={t('dictionary.status')}\n options={actionStatusOptions}\n />\n </Box>\n </Box>\n </>\n );\n}\n\nexport function UrlLabel(): JSX.Element {\n const { t } = useTranslationRef(pluginRiScTranslationRef);\n return (\n <Box className={styles.urlLabel}>\n {t('dictionary.url')}\n <Tooltip\n title={\n <Text variant=\"body-large\" className={styles.tooltipText}>\n {t('scenarioDrawer.measureTab.urlDescription')}\n </Text>\n }\n arrow\n >\n <HelpIcon color=\"primary\" />\n </Tooltip>\n </Box>\n );\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ActionFormItem.esm.js","sources":["../../../../src/components/scenarioDrawer/components/ActionFormItem.tsx"],"sourcesContent":["import { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport DeleteIcon from '@mui/icons-material/Delete';\nimport Box from '@mui/material/Box';\nimport IconButton from '@mui/material/IconButton';\nimport { Controller, UseFormReturn } from 'react-hook-form';\nimport {\n ActionStatusOptions,\n urlRegExpPattern,\n} from '../../../utils/constants';\nimport { pluginRiScTranslationRef } from '../../../utils/translations';\nimport {\n actionStatusOptionsToTranslationKeys,\n getValue,\n} from '../../../utils/utilityfunctions';\nimport { Input } from '../../common/Input';\nimport { MarkdownInput } from '../../common/MarkdownInput';\nimport { Select } from '../../common/Select';\nimport HelpIcon from '@mui/icons-material/Help';\nimport Tooltip from '@mui/material/Tooltip';\nimport { Text } from '@backstage/ui';\nimport styles from './ActionFormItem.module.css';\n\nfunction addPeriodToBaseObjectPath(s: string) {\n if (!s) return '';\n return `${s}.`;\n}\n\ntype ActionFormItemProps = {\n formMethods: UseFormReturn<any>;\n handleDelete: () => void;\n displayedIndex?: number;\n // Specify baseObjectPathToActionOfForm where in the form of formMethods the action object is (use if nested)\n // Example value: \"actions.1\"\n baseObjectPathToActionOfForm?: string;\n};\n\nexport function ActionFormItem({\n formMethods,\n handleDelete,\n displayedIndex,\n baseObjectPathToActionOfForm = '',\n}: ActionFormItemProps) {\n const { t } = useTranslationRef(pluginRiScTranslationRef);\n\n const { control, register, formState } = formMethods;\n const errorObject = getValue(formState.errors, baseObjectPathToActionOfForm);\n\n const actionStatusOptions = Object.values(ActionStatusOptions).map(\n actionStatus => ({\n value: actionStatus,\n /* @ts-ignore Because ts can't typecheck strings against our keys */\n renderedValue: t(actionStatusOptionsToTranslationKeys[actionStatus]),\n }),\n );\n\n return (\n <>\n <Box className={styles.formGrid}>\n <Box className={styles.formHeader}>\n {displayedIndex !== undefined && displayedIndex !== null ? (\n <Text variant=\"title-x-small\" weight=\"bold\">\n {t('dictionary.measure')} {displayedIndex + 1}\n </Text>\n ) : (\n <Text variant=\"title-x-small\" weight=\"bold\">\n {t('dictionary.edit')}\n </Text>\n )}\n <IconButton onClick={handleDelete} color=\"primary\">\n <DeleteIcon aria-label=\"Delete\" />\n </IconButton>\n </Box>\n <Input\n required\n {...register(\n `${addPeriodToBaseObjectPath(baseObjectPathToActionOfForm)}title`,\n {\n required: true,\n },\n )}\n error={errorObject?.title !== undefined}\n label={t('dictionary.title')}\n helperText={\n errorObject?.title &&\n t('scenarioDrawer.measureTab.addMeasureTitleError')\n }\n />\n <Controller\n control={control}\n name={`${addPeriodToBaseObjectPath(baseObjectPathToActionOfForm)}description`}\n render={({ field: { onChange, value }, fieldState: { error } }) => (\n <MarkdownInput\n label={t('dictionary.description')}\n value={value}\n onMarkdownChange={onChange}\n error={!!error}\n minRows={8}\n />\n )}\n />\n <Box className={styles.inputGrid}>\n <Input\n {...register(\n `${addPeriodToBaseObjectPath(baseObjectPathToActionOfForm)}url`,\n {\n pattern: {\n value: urlRegExpPattern,\n message: t('scenarioDrawer.action.urlError'),\n },\n },\n )}\n label={<UrlLabel />}\n helperText={errorObject?.url?.message}\n error={errorObject?.url?.message}\n />\n <Select\n required\n control={control}\n name={`${addPeriodToBaseObjectPath(baseObjectPathToActionOfForm)}status`}\n label={t('dictionary.status')}\n options={actionStatusOptions}\n />\n </Box>\n <Input\n {...register(\n `${addPeriodToBaseObjectPath(baseObjectPathToActionOfForm)}comment`,\n )}\n label={t('dictionary.comment')}\n helperText={errorObject?.comment?.message}\n error={errorObject?.comment?.message !== undefined}\n />\n </Box>\n </>\n );\n}\n\nexport function UrlLabel(): JSX.Element {\n const { t } = useTranslationRef(pluginRiScTranslationRef);\n return (\n <Box className={styles.urlLabel}>\n {t('dictionary.url')}\n <Tooltip\n title={\n <Text variant=\"body-large\" className={styles.tooltipText}>\n {t('scenarioDrawer.measureTab.urlDescription')}\n </Text>\n }\n arrow\n >\n <HelpIcon color=\"primary\" />\n </Tooltip>\n </Box>\n );\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAsBA,SAAS,0BAA0B,CAAA,EAAW;AAC5C,EAAA,IAAI,CAAC,GAAG,OAAO,EAAA;AACf,EAAA,OAAO,GAAG,CAAC,CAAA,CAAA,CAAA;AACb;AAWO,SAAS,cAAA,CAAe;AAAA,EAC7B,WAAA;AAAA,EACA,YAAA;AAAA,EACA,cAAA;AAAA,EACA,4BAAA,GAA+B;AACjC,CAAA,EAAwB;AACtB,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,iBAAA,CAAkB,wBAAwB,CAAA;AAExD,EAAA,MAAM,EAAE,OAAA,EAAS,QAAA,EAAU,SAAA,EAAU,GAAI,WAAA;AACzC,EAAA,MAAM,WAAA,GAAc,QAAA,CAAS,SAAA,CAAU,MAAA,EAAQ,4BAA4B,CAAA;AAE3E,EAAA,MAAM,mBAAA,GAAsB,MAAA,CAAO,MAAA,CAAO,mBAAmB,CAAA,CAAE,GAAA;AAAA,IAC7D,CAAA,YAAA,MAAiB;AAAA,MACf,KAAA,EAAO,YAAA;AAAA;AAAA,MAEP,aAAA,EAAe,CAAA,CAAE,oCAAA,CAAqC,YAAY,CAAC;AAAA,KACrE;AAAA,GACF;AAEA,EAAA,uBACE,GAAA,CAAA,QAAA,EAAA,EACE,QAAA,kBAAA,IAAA,CAAC,GAAA,EAAA,EAAI,SAAA,EAAW,OAAO,QAAA,EACrB,QAAA,EAAA;AAAA,oBAAA,IAAA,CAAC,GAAA,EAAA,EAAI,SAAA,EAAW,MAAA,CAAO,UAAA,EACpB,QAAA,EAAA;AAAA,MAAA,cAAA,KAAmB,MAAA,IAAa,mBAAmB,IAAA,mBAClD,IAAA,CAAC,QAAK,OAAA,EAAQ,eAAA,EAAgB,QAAO,MAAA,EAClC,QAAA,EAAA;AAAA,QAAA,CAAA,CAAE,oBAAoB,CAAA;AAAA,QAAE,GAAA;AAAA,QAAE,cAAA,GAAiB;AAAA,OAAA,EAC9C,CAAA,uBAEC,IAAA,EAAA,EAAK,OAAA,EAAQ,iBAAgB,MAAA,EAAO,MAAA,EAClC,QAAA,EAAA,CAAA,CAAE,iBAAiB,CAAA,EACtB,CAAA;AAAA,sBAEF,GAAA,CAAC,UAAA,EAAA,EAAW,OAAA,EAAS,YAAA,EAAc,KAAA,EAAM,WACvC,QAAA,kBAAA,GAAA,CAAC,UAAA,EAAA,EAAW,YAAA,EAAW,QAAA,EAAS,CAAA,EAClC;AAAA,KAAA,EACF,CAAA;AAAA,oBACA,GAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,QAAA,EAAQ,IAAA;AAAA,QACP,GAAG,QAAA;AAAA,UACF,CAAA,EAAG,yBAAA,CAA0B,4BAA4B,CAAC,CAAA,KAAA,CAAA;AAAA,UAC1D;AAAA,YACE,QAAA,EAAU;AAAA;AACZ,SACF;AAAA,QACA,KAAA,EAAO,aAAa,KAAA,KAAU,MAAA;AAAA,QAC9B,KAAA,EAAO,EAAE,kBAAkB,CAAA;AAAA,QAC3B,UAAA,EACE,WAAA,EAAa,KAAA,IACb,CAAA,CAAE,gDAAgD;AAAA;AAAA,KAEtD;AAAA,oBACA,GAAA;AAAA,MAAC,UAAA;AAAA,MAAA;AAAA,QACC,OAAA;AAAA,QACA,IAAA,EAAM,CAAA,EAAG,yBAAA,CAA0B,4BAA4B,CAAC,CAAA,WAAA,CAAA;AAAA,QAChE,MAAA,EAAQ,CAAC,EAAE,KAAA,EAAO,EAAE,QAAA,EAAU,KAAA,EAAM,EAAG,UAAA,EAAY,EAAE,KAAA,EAAM,EAAE,qBAC3D,GAAA;AAAA,UAAC,aAAA;AAAA,UAAA;AAAA,YACC,KAAA,EAAO,EAAE,wBAAwB,CAAA;AAAA,YACjC,KAAA;AAAA,YACA,gBAAA,EAAkB,QAAA;AAAA,YAClB,KAAA,EAAO,CAAC,CAAC,KAAA;AAAA,YACT,OAAA,EAAS;AAAA;AAAA;AACX;AAAA,KAEJ;AAAA,oBACA,IAAA,CAAC,GAAA,EAAA,EAAI,SAAA,EAAW,MAAA,CAAO,SAAA,EACrB,QAAA,EAAA;AAAA,sBAAA,GAAA;AAAA,QAAC,KAAA;AAAA,QAAA;AAAA,UACE,GAAG,QAAA;AAAA,YACF,CAAA,EAAG,yBAAA,CAA0B,4BAA4B,CAAC,CAAA,GAAA,CAAA;AAAA,YAC1D;AAAA,cACE,OAAA,EAAS;AAAA,gBACP,KAAA,EAAO,gBAAA;AAAA,gBACP,OAAA,EAAS,EAAE,gCAAgC;AAAA;AAC7C;AACF,WACF;AAAA,UACA,KAAA,sBAAQ,QAAA,EAAA,EAAS,CAAA;AAAA,UACjB,UAAA,EAAY,aAAa,GAAA,EAAK,OAAA;AAAA,UAC9B,KAAA,EAAO,aAAa,GAAA,EAAK;AAAA;AAAA,OAC3B;AAAA,sBACA,GAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,QAAA,EAAQ,IAAA;AAAA,UACR,OAAA;AAAA,UACA,IAAA,EAAM,CAAA,EAAG,yBAAA,CAA0B,4BAA4B,CAAC,CAAA,MAAA,CAAA;AAAA,UAChE,KAAA,EAAO,EAAE,mBAAmB,CAAA;AAAA,UAC5B,OAAA,EAAS;AAAA;AAAA;AACX,KAAA,EACF,CAAA;AAAA,oBACA,GAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACE,GAAG,QAAA;AAAA,UACF,CAAA,EAAG,yBAAA,CAA0B,4BAA4B,CAAC,CAAA,OAAA;AAAA,SAC5D;AAAA,QACA,KAAA,EAAO,EAAE,oBAAoB,CAAA;AAAA,QAC7B,UAAA,EAAY,aAAa,OAAA,EAAS,OAAA;AAAA,QAClC,KAAA,EAAO,WAAA,EAAa,OAAA,EAAS,OAAA,KAAY;AAAA;AAAA;AAC3C,GAAA,EACF,CAAA,EACF,CAAA;AAEJ;AAEO,SAAS,QAAA,GAAwB;AACtC,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,iBAAA,CAAkB,wBAAwB,CAAA;AACxD,EAAA,uBACE,IAAA,CAAC,GAAA,EAAA,EAAI,SAAA,EAAW,MAAA,CAAO,QAAA,EACpB,QAAA,EAAA;AAAA,IAAA,CAAA,CAAE,gBAAgB,CAAA;AAAA,oBACnB,GAAA;AAAA,MAAC,OAAA;AAAA,MAAA;AAAA,QACC,KAAA,kBACE,GAAA,CAAC,IAAA,EAAA,EAAK,OAAA,EAAQ,YAAA,EAAa,WAAW,MAAA,CAAO,WAAA,EAC1C,QAAA,EAAA,CAAA,CAAE,0CAA0C,CAAA,EAC/C,CAAA;AAAA,QAEF,KAAA,EAAK,IAAA;AAAA,QAEL,QAAA,kBAAA,GAAA,CAAC,QAAA,EAAA,EAAS,KAAA,EAAM,SAAA,EAAU;AAAA;AAAA;AAC5B,GAAA,EACF,CAAA;AAEJ;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ScenarioContext.esm.js","sources":["../../src/contexts/ScenarioContext.tsx"],"sourcesContent":["import { ProfileInfo, useRouteRef } from '@backstage/core-plugin-api';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport {\n ReactNode,\n createContext,\n useContext,\n useEffect,\n useState,\n Dispatch,\n SetStateAction,\n} from 'react';\nimport { useNavigate, useParams } from 'react-router';\nimport { useSearchParams } from 'react-router-dom';\nimport { riScRouteRef, scenarioRouteRef } from '../routes';\nimport { pluginRiScTranslationRef } from '../utils/translations';\nimport { Action, FormScenario, Scenario } from '../utils/types';\nimport {\n generateRandomId,\n roundConsequenceToNearestConsequenceOption,\n roundProbabilityToNearestProbabilityOption,\n} from '../utils/utilityfunctions';\nimport { useRiScs } from './RiScContext';\nimport {\n ActionStatusOptions,\n consequenceOptions,\n probabilityOptions,\n} from '../utils/constants';\nimport { getActionsWithLastUpdated } from '../utils/actions.ts';\nimport { getScenarioOfIdFromRiSc } from '../utils/scenario.ts';\n\nexport const emptyAction = (): Action => ({\n ID: generateRandomId(),\n title: '',\n description: '',\n status: ActionStatusOptions.NotOK,\n url: '',\n});\n\nconst emptyScenario = (): Scenario => ({\n ID: generateRandomId(),\n title: '',\n description: '',\n threatActors: [],\n vulnerabilities: [],\n risk: {\n summary: '',\n probability: 0.01,\n consequence: 1000,\n },\n actions: [],\n remainingRisk: {\n summary: '',\n probability: 0.01,\n consequence: 1000,\n },\n});\n\ntype ScenarioDrawerProps = {\n isDrawerOpen: boolean;\n isEditingAllowed: boolean;\n\n isActionExpanded: (actionId: string) => boolean;\n toggleActionExpanded: (actionId: string) => void;\n collapseAllActions: () => void;\n\n hoveredScenarios: Scenario[];\n setHoveredScenarios: Dispatch<SetStateAction<Scenario[]>>;\n\n emptyFormScenario: (scenario: Scenario) => FormScenario;\n scenario: Scenario;\n submitNewScenario: (\n newScenario: Scenario,\n profileInfo?: ProfileInfo,\n onSuccess?: () => void,\n onError?: () => void,\n ) => void;\n submitEditedScenarioToRiSc: (\n editedScenario: Scenario,\n options?: {\n idsOfActionsToForceUpdateLastUpdatedValue?: string[];\n profileInfo?: ProfileInfo;\n onSuccess?: () => void;\n onError?: () => void;\n },\n ) => void;\n\n openScenarioDrawer: (id: string, isEditingAllowed: boolean) => void;\n openNewScenarioWizard: () => void;\n closeScenarioForm: () => void;\n mapFormScenarioToScenario: (formScenario: FormScenario) => Scenario;\n mapScenarioToFormScenario: (scenario: Scenario) => FormScenario;\n};\n\nexport type ScenarioWizardSteps = (typeof scenarioWizardSteps)[number];\nexport const scenarioWizardSteps = [\n 'scenario',\n 'initialRisk',\n 'measure',\n 'restRisk',\n] as const;\n\nconst ScenarioContext = createContext<ScenarioDrawerProps | undefined>(\n undefined,\n);\n\nexport function ScenarioProvider({ children }: { children: ReactNode }) {\n const navigate = useNavigate();\n const [searchParams] = useSearchParams();\n const getRiScPath = useRouteRef(riScRouteRef);\n const getScenarioPath = useRouteRef(scenarioRouteRef);\n const { scenarioId: scenarioIdFromParams } = useParams();\n\n const { selectedRiSc, updateRiSc } = useRiScs();\n const riSc = selectedRiSc ?? null;\n\n const [scenario, setScenario] = useState(emptyScenario());\n\n const [hoveredScenarios, setHoveredScenarios] = useState<Scenario[]>([]);\n\n const [isDrawerOpen, setIsDrawerOpen] = useState(false);\n const [isEditingAllowed, setIsEditingAllowed] = useState(true);\n\n const { t } = useTranslationRef(pluginRiScTranslationRef);\n\n const [expandedActions, setExpandedActions] = useState<{\n [key: string]: boolean;\n }>({});\n\n function toggleActionExpanded(actionId: string) {\n setExpandedActions(prevState => ({\n ...prevState,\n [actionId]: !prevState[actionId],\n }));\n }\n\n function collapseAllActions() {\n const allCollapsed = Object.keys(expandedActions).reduce(\n (acc, key) => {\n acc[key] = false;\n return acc;\n },\n {} as { [key: string]: boolean },\n );\n setExpandedActions(allCollapsed);\n }\n\n function isActionExpanded(actionId: string) {\n return expandedActions[actionId] || false;\n }\n\n function emptyFormScenario(initialScenario: Scenario): FormScenario {\n return {\n ...initialScenario,\n risk: {\n summary: '',\n probability: probabilityOptions[0].toString(),\n consequence: consequenceOptions[0].toString(),\n },\n remainingRisk: {\n summary: '',\n probability: probabilityOptions[0].toString(),\n consequence: consequenceOptions[0].toString(),\n },\n };\n }\n\n // Open scenario when url changes\n useEffect(() => {\n const scenarioWizardStep = searchParams.get(\n 'step',\n ) as ScenarioWizardSteps | null;\n\n if (riSc) {\n // If there is no scenario ID in the URL, close the drawer and reset the scenario to an empty state\n if (!scenarioIdFromParams) {\n setIsDrawerOpen(false);\n const s = emptyScenario();\n\n setScenario(s);\n return;\n }\n\n if (scenarioWizardStep) {\n // If step query param exists in url then we are creating a new scenario with the wizard.\n return;\n }\n\n const selectedScenario = riSc.content.scenarios.find(\n s => s.ID === scenarioIdFromParams,\n );\n\n // If there is an invalid scenario ID in the URL, navigate to the RiSc with error state\n if (!selectedScenario) {\n navigate(getRiScPath({ riScId: riSc.id }), {\n state: t('errorMessages.ScenarioDoesNotExist'),\n });\n return;\n }\n\n setScenario(selectedScenario);\n setIsDrawerOpen(true);\n }\n }, [riSc, scenarioIdFromParams, getRiScPath, navigate, searchParams, t]);\n\n // SCENARIO DRAWER FUNCTIONS\n function openScenarioDrawer(id: string, canEdit: boolean) {\n if (riSc) {\n setIsEditingAllowed(canEdit);\n navigate(getScenarioPath({ riScId: riSc.id, scenarioId: id }));\n }\n }\n\n function closeScenarioForm() {\n if (riSc) {\n navigate(getRiScPath({ riScId: riSc.id }));\n }\n }\n\n function submitNewScenario(\n newScenario: Scenario,\n profileInfo?: ProfileInfo,\n onSuccess?: () => void,\n onError?: () => void,\n ) {\n newScenario.actions = getActionsWithLastUpdated(\n [],\n newScenario.actions,\n [],\n profileInfo,\n );\n\n if (riSc) {\n updateRiSc(\n {\n ...riSc,\n content: {\n ...riSc.content,\n scenarios: [newScenario, ...riSc.content.scenarios],\n },\n },\n onSuccess,\n onError,\n );\n }\n }\n\n function submitEditedScenarioToRiSc(\n editedScenario: Scenario,\n options?: {\n idsOfActionsToForceUpdateLastUpdatedValue?: string[];\n profileInfo?: ProfileInfo;\n onSuccess?: () => void;\n onError?: () => void;\n },\n ) {\n const oldScenario = getScenarioOfIdFromRiSc(\n editedScenario.ID,\n selectedRiSc,\n );\n\n editedScenario.actions = getActionsWithLastUpdated(\n oldScenario?.actions ?? [],\n editedScenario.actions,\n options?.idsOfActionsToForceUpdateLastUpdatedValue ?? [],\n options?.profileInfo,\n );\n\n if (riSc) {\n updateRiSc(\n {\n ...riSc,\n content: {\n ...riSc.content,\n scenarios: riSc.content.scenarios.map(s =>\n s.ID === editedScenario.ID ? editedScenario : s,\n ),\n },\n },\n options?.onSuccess,\n options?.onError,\n );\n }\n }\n\n function openNewScenarioWizard() {\n if (riSc) {\n const s = emptyScenario();\n setScenario(s);\n\n navigate(\n `${getScenarioPath({\n riScId: riSc.id,\n scenarioId: s.ID,\n })}?step=scenario`,\n );\n }\n }\n\n function mapFormScenarioToScenario(formScenario: FormScenario): Scenario {\n const returnScenario: Scenario = {\n ...formScenario,\n risk: {\n ...formScenario.risk,\n probability: Number(formScenario.risk.probability),\n consequence: Number(formScenario.risk.consequence),\n },\n remainingRisk: {\n ...formScenario.remainingRisk,\n probability: Number(formScenario.remainingRisk.probability),\n consequence: Number(formScenario.remainingRisk.consequence),\n },\n };\n return returnScenario;\n }\n\n function mapScenarioToFormScenario(apiScenario: Scenario): FormScenario {\n const returnFormScenario: FormScenario = {\n ...apiScenario,\n risk: {\n ...apiScenario.risk,\n probability: `${roundProbabilityToNearestProbabilityOption(apiScenario.risk.probability)}`,\n consequence: `${roundConsequenceToNearestConsequenceOption(apiScenario.risk.consequence)}`,\n },\n remainingRisk: {\n ...apiScenario.remainingRisk,\n probability: `${roundProbabilityToNearestProbabilityOption(apiScenario.remainingRisk.probability)}`,\n consequence: `${roundConsequenceToNearestConsequenceOption(apiScenario.remainingRisk.consequence)}`,\n },\n };\n return returnFormScenario;\n }\n\n const value = {\n isDrawerOpen,\n isEditingAllowed,\n\n isActionExpanded,\n toggleActionExpanded,\n collapseAllActions,\n\n hoveredScenarios,\n setHoveredScenarios,\n\n emptyFormScenario,\n scenario,\n submitNewScenario,\n submitEditedScenarioToRiSc,\n\n openScenarioDrawer,\n openNewScenarioWizard,\n closeScenarioForm,\n mapFormScenarioToScenario,\n mapScenarioToFormScenario,\n };\n\n return (\n <ScenarioContext.Provider value={value}>\n {children}\n </ScenarioContext.Provider>\n );\n}\n\nexport function useScenario() {\n const context = useContext(ScenarioContext);\n if (context === undefined) {\n throw new Error('useScenario must be used within a ScenarioProvider');\n }\n return context;\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ScenarioContext.esm.js","sources":["../../src/contexts/ScenarioContext.tsx"],"sourcesContent":["import { ProfileInfo, useRouteRef } from '@backstage/core-plugin-api';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport {\n ReactNode,\n createContext,\n useContext,\n useEffect,\n useState,\n Dispatch,\n SetStateAction,\n} from 'react';\nimport { useNavigate, useParams } from 'react-router';\nimport { useSearchParams } from 'react-router-dom';\nimport { riScRouteRef, scenarioRouteRef } from '../routes';\nimport { pluginRiScTranslationRef } from '../utils/translations';\nimport { Action, FormScenario, Scenario } from '../utils/types';\nimport {\n generateRandomId,\n roundConsequenceToNearestConsequenceOption,\n roundProbabilityToNearestProbabilityOption,\n} from '../utils/utilityfunctions';\nimport { useRiScs } from './RiScContext';\nimport {\n ActionStatusOptions,\n consequenceOptions,\n probabilityOptions,\n} from '../utils/constants';\nimport { getActionsWithLastUpdated } from '../utils/actions.ts';\nimport { getScenarioOfIdFromRiSc } from '../utils/scenario.ts';\n\nexport const emptyAction = (): Action => ({\n ID: generateRandomId(),\n title: '',\n description: '',\n status: ActionStatusOptions.NotOK,\n url: '',\n comment: '',\n});\n\nconst emptyScenario = (): Scenario => ({\n ID: generateRandomId(),\n title: '',\n description: '',\n threatActors: [],\n vulnerabilities: [],\n risk: {\n summary: '',\n probability: 0.01,\n consequence: 1000,\n },\n actions: [],\n remainingRisk: {\n summary: '',\n probability: 0.01,\n consequence: 1000,\n },\n});\n\ntype ScenarioDrawerProps = {\n isDrawerOpen: boolean;\n isEditingAllowed: boolean;\n\n isActionExpanded: (actionId: string) => boolean;\n toggleActionExpanded: (actionId: string) => void;\n collapseAllActions: () => void;\n\n hoveredScenarios: Scenario[];\n setHoveredScenarios: Dispatch<SetStateAction<Scenario[]>>;\n\n emptyFormScenario: (scenario: Scenario) => FormScenario;\n scenario: Scenario;\n submitNewScenario: (\n newScenario: Scenario,\n profileInfo?: ProfileInfo,\n onSuccess?: () => void,\n onError?: () => void,\n ) => void;\n submitEditedScenarioToRiSc: (\n editedScenario: Scenario,\n options?: {\n idsOfActionsToForceUpdateLastUpdatedValue?: string[];\n profileInfo?: ProfileInfo;\n onSuccess?: () => void;\n onError?: () => void;\n },\n ) => void;\n\n openScenarioDrawer: (id: string, isEditingAllowed: boolean) => void;\n openNewScenarioWizard: () => void;\n closeScenarioForm: () => void;\n mapFormScenarioToScenario: (formScenario: FormScenario) => Scenario;\n mapScenarioToFormScenario: (scenario: Scenario) => FormScenario;\n};\n\nexport type ScenarioWizardSteps = (typeof scenarioWizardSteps)[number];\nexport const scenarioWizardSteps = [\n 'scenario',\n 'initialRisk',\n 'measure',\n 'restRisk',\n] as const;\n\nconst ScenarioContext = createContext<ScenarioDrawerProps | undefined>(\n undefined,\n);\n\nexport function ScenarioProvider({ children }: { children: ReactNode }) {\n const navigate = useNavigate();\n const [searchParams] = useSearchParams();\n const getRiScPath = useRouteRef(riScRouteRef);\n const getScenarioPath = useRouteRef(scenarioRouteRef);\n const { scenarioId: scenarioIdFromParams } = useParams();\n\n const { selectedRiSc, updateRiSc } = useRiScs();\n const riSc = selectedRiSc ?? null;\n\n const [scenario, setScenario] = useState(emptyScenario());\n\n const [hoveredScenarios, setHoveredScenarios] = useState<Scenario[]>([]);\n\n const [isDrawerOpen, setIsDrawerOpen] = useState(false);\n const [isEditingAllowed, setIsEditingAllowed] = useState(true);\n\n const { t } = useTranslationRef(pluginRiScTranslationRef);\n\n const [expandedActions, setExpandedActions] = useState<{\n [key: string]: boolean;\n }>({});\n\n function toggleActionExpanded(actionId: string) {\n setExpandedActions(prevState => ({\n ...prevState,\n [actionId]: !prevState[actionId],\n }));\n }\n\n function collapseAllActions() {\n const allCollapsed = Object.keys(expandedActions).reduce(\n (acc, key) => {\n acc[key] = false;\n return acc;\n },\n {} as { [key: string]: boolean },\n );\n setExpandedActions(allCollapsed);\n }\n\n function isActionExpanded(actionId: string) {\n return expandedActions[actionId] || false;\n }\n\n function emptyFormScenario(initialScenario: Scenario): FormScenario {\n return {\n ...initialScenario,\n risk: {\n summary: '',\n probability: probabilityOptions[0].toString(),\n consequence: consequenceOptions[0].toString(),\n },\n remainingRisk: {\n summary: '',\n probability: probabilityOptions[0].toString(),\n consequence: consequenceOptions[0].toString(),\n },\n };\n }\n\n // Open scenario when url changes\n useEffect(() => {\n const scenarioWizardStep = searchParams.get(\n 'step',\n ) as ScenarioWizardSteps | null;\n\n if (riSc) {\n // If there is no scenario ID in the URL, close the drawer and reset the scenario to an empty state\n if (!scenarioIdFromParams) {\n setIsDrawerOpen(false);\n const s = emptyScenario();\n\n setScenario(s);\n return;\n }\n\n if (scenarioWizardStep) {\n // If step query param exists in url then we are creating a new scenario with the wizard.\n return;\n }\n\n const selectedScenario = riSc.content.scenarios.find(\n s => s.ID === scenarioIdFromParams,\n );\n\n // If there is an invalid scenario ID in the URL, navigate to the RiSc with error state\n if (!selectedScenario) {\n navigate(getRiScPath({ riScId: riSc.id }), {\n state: t('errorMessages.ScenarioDoesNotExist'),\n });\n return;\n }\n\n setScenario(selectedScenario);\n setIsDrawerOpen(true);\n }\n }, [riSc, scenarioIdFromParams, getRiScPath, navigate, searchParams, t]);\n\n // SCENARIO DRAWER FUNCTIONS\n function openScenarioDrawer(id: string, canEdit: boolean) {\n if (riSc) {\n setIsEditingAllowed(canEdit);\n navigate(getScenarioPath({ riScId: riSc.id, scenarioId: id }));\n }\n }\n\n function closeScenarioForm() {\n if (riSc) {\n navigate(getRiScPath({ riScId: riSc.id }));\n }\n }\n\n function submitNewScenario(\n newScenario: Scenario,\n profileInfo?: ProfileInfo,\n onSuccess?: () => void,\n onError?: () => void,\n ) {\n newScenario.actions = getActionsWithLastUpdated(\n [],\n newScenario.actions,\n [],\n profileInfo,\n );\n\n if (riSc) {\n updateRiSc(\n {\n ...riSc,\n content: {\n ...riSc.content,\n scenarios: [newScenario, ...riSc.content.scenarios],\n },\n },\n onSuccess,\n onError,\n );\n }\n }\n\n function submitEditedScenarioToRiSc(\n editedScenario: Scenario,\n options?: {\n idsOfActionsToForceUpdateLastUpdatedValue?: string[];\n profileInfo?: ProfileInfo;\n onSuccess?: () => void;\n onError?: () => void;\n },\n ) {\n const oldScenario = getScenarioOfIdFromRiSc(\n editedScenario.ID,\n selectedRiSc,\n );\n\n editedScenario.actions = getActionsWithLastUpdated(\n oldScenario?.actions ?? [],\n editedScenario.actions,\n options?.idsOfActionsToForceUpdateLastUpdatedValue ?? [],\n options?.profileInfo,\n );\n\n if (riSc) {\n updateRiSc(\n {\n ...riSc,\n content: {\n ...riSc.content,\n scenarios: riSc.content.scenarios.map(s =>\n s.ID === editedScenario.ID ? editedScenario : s,\n ),\n },\n },\n options?.onSuccess,\n options?.onError,\n );\n }\n }\n\n function openNewScenarioWizard() {\n if (riSc) {\n const s = emptyScenario();\n setScenario(s);\n\n navigate(\n `${getScenarioPath({\n riScId: riSc.id,\n scenarioId: s.ID,\n })}?step=scenario`,\n );\n }\n }\n\n function mapFormScenarioToScenario(formScenario: FormScenario): Scenario {\n const returnScenario: Scenario = {\n ...formScenario,\n risk: {\n ...formScenario.risk,\n probability: Number(formScenario.risk.probability),\n consequence: Number(formScenario.risk.consequence),\n },\n remainingRisk: {\n ...formScenario.remainingRisk,\n probability: Number(formScenario.remainingRisk.probability),\n consequence: Number(formScenario.remainingRisk.consequence),\n },\n };\n return returnScenario;\n }\n\n function mapScenarioToFormScenario(apiScenario: Scenario): FormScenario {\n const returnFormScenario: FormScenario = {\n ...apiScenario,\n risk: {\n ...apiScenario.risk,\n probability: `${roundProbabilityToNearestProbabilityOption(apiScenario.risk.probability)}`,\n consequence: `${roundConsequenceToNearestConsequenceOption(apiScenario.risk.consequence)}`,\n },\n remainingRisk: {\n ...apiScenario.remainingRisk,\n probability: `${roundProbabilityToNearestProbabilityOption(apiScenario.remainingRisk.probability)}`,\n consequence: `${roundConsequenceToNearestConsequenceOption(apiScenario.remainingRisk.consequence)}`,\n },\n };\n return returnFormScenario;\n }\n\n const value = {\n isDrawerOpen,\n isEditingAllowed,\n\n isActionExpanded,\n toggleActionExpanded,\n collapseAllActions,\n\n hoveredScenarios,\n setHoveredScenarios,\n\n emptyFormScenario,\n scenario,\n submitNewScenario,\n submitEditedScenarioToRiSc,\n\n openScenarioDrawer,\n openNewScenarioWizard,\n closeScenarioForm,\n mapFormScenarioToScenario,\n mapScenarioToFormScenario,\n };\n\n return (\n <ScenarioContext.Provider value={value}>\n {children}\n </ScenarioContext.Provider>\n );\n}\n\nexport function useScenario() {\n const context = useContext(ScenarioContext);\n if (context === undefined) {\n throw new Error('useScenario must be used within a ScenarioProvider');\n }\n return context;\n}\n"],"names":[],"mappings":"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"}
|
package/dist/plugin.esm.js
CHANGED
|
@@ -1,15 +1,10 @@
|
|
|
1
1
|
import { createPlugin, createRoutableExtension } from '@backstage/core-plugin-api';
|
|
2
2
|
import { riScRouteRef, scenarioRouteRef, rootRouteRef } from './routes.esm.js';
|
|
3
|
-
import {
|
|
3
|
+
import { riScFeatureFlags } from './utils/featureFlags.esm.js';
|
|
4
4
|
|
|
5
5
|
const riScPlugin = createPlugin({
|
|
6
6
|
id: "riSc",
|
|
7
|
-
featureFlags:
|
|
8
|
-
{
|
|
9
|
-
name: systemRiScsFeatureFlag,
|
|
10
|
-
description: "Testing av system-RoS for Team SKVIS. Bruk p\xE5 eget ansvar. UNNG\xC5 lagring av System-RoSer i \xE5pne repoer."
|
|
11
|
-
}
|
|
12
|
-
],
|
|
7
|
+
featureFlags: riScFeatureFlags,
|
|
13
8
|
routes: {
|
|
14
9
|
root: rootRouteRef,
|
|
15
10
|
scenario: scenarioRouteRef,
|
package/dist/plugin.esm.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin.esm.js","sources":["../src/plugin.ts"],"sourcesContent":["import {\n createPlugin,\n createRoutableExtension,\n} from '@backstage/core-plugin-api';\n\nimport { rootRouteRef, riScRouteRef, scenarioRouteRef } from './routes';\nimport {
|
|
1
|
+
{"version":3,"file":"plugin.esm.js","sources":["../src/plugin.ts"],"sourcesContent":["import {\n createPlugin,\n createRoutableExtension,\n} from '@backstage/core-plugin-api';\n\nimport { rootRouteRef, riScRouteRef, scenarioRouteRef } from './routes';\nimport { riScFeatureFlags } from './utils/featureFlags';\n\nexport const riScPlugin = createPlugin({\n id: 'riSc',\n featureFlags: riScFeatureFlags,\n routes: {\n root: rootRouteRef,\n scenario: scenarioRouteRef,\n riSc: riScRouteRef,\n },\n});\n\nexport const RiScPage = riScPlugin.provide(\n createRoutableExtension({\n name: 'RiScPage',\n component: () => import('./PluginRoot').then(m => m.PluginRoot),\n mountPoint: rootRouteRef,\n }),\n);\n"],"names":[],"mappings":";;;;AAQO,MAAM,aAAa,YAAA,CAAa;AAAA,EACrC,EAAA,EAAI,MAAA;AAAA,EACJ,YAAA,EAAc,gBAAA;AAAA,EACd,MAAA,EAAQ;AAAA,IACN,IAAA,EAAM,YAAA;AAAA,IACN,QAAA,EAAU,gBAAA;AAAA,IACV,IAAA,EAAM;AAAA;AAEV,CAAC;AAEM,MAAM,WAAW,UAAA,CAAW,OAAA;AAAA,EACjC,uBAAA,CAAwB;AAAA,IACtB,IAAA,EAAM,UAAA;AAAA,IACN,SAAA,EAAW,MAAM,OAAO,qBAAc,EAAE,IAAA,CAAK,CAAA,CAAA,KAAK,EAAE,UAAU,CAAA;AAAA,IAC9D,UAAA,EAAY;AAAA,GACb;AACH;;;;"}
|
package/dist/utils/DTOs.esm.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DTOs.esm.js","sources":["../../src/utils/DTOs.ts"],"sourcesContent":["import {\n Action,\n ContentStatus,\n LastPublished,\n MigrationStatus,\n Modify,\n ProcessingStatus,\n RiSc,\n RiScStatus,\n Risk,\n Scenario,\n UnencryptedMetadata,\n} from './types';\nimport { ProfileInfo } from '@backstage/core-plugin-api';\n\nexport type ProcessRiScResultDTO = {\n riScId: string;\n status: ProcessingStatus;\n statusMessage: string;\n riScContent: string | null;\n};\n\n// Takes a normal ProcessRiScResultDTO and changes status to ContentStatus.\ntype ContentRiScResultDTO = Modify<\n ProcessRiScResultDTO,\n 'status',\n ContentStatus\n> & { pullRequestUrl: string };\n\nexport type PublishRiScResultDTO = {\n pendingApproval?: {\n pullRequestUrl: string;\n pullRequestName: string;\n };\n} & ProcessRiScResultDTO;\n\nexport type CreateRiScResultDTO = {\n riScId: String;\n status: ProcessingStatus;\n statusMessage: string;\n riScContent: string | null;\n sopsConfig: SopsConfigDTO;\n} & ProcessRiScResultDTO;\n\nexport type DeleteRiScResultDTO = ProcessRiScResultDTO;\n\nexport type RiScContentResultDTO = {\n riScStatus: RiScStatus;\n riScContent: string;\n sopsConfig: SopsConfigDTO;\n migrationStatus: MigrationStatus;\n statusMessage?: string;\n errorCode?: string;\n encryptionKeyId?: string;\n lastPublished: LastPublished;\n} & ContentRiScResultDTO;\n\nexport type RiScDTO = {\n schemaVersion: string;\n title: string;\n scope: string;\n unencryptedMetadata?: UnencryptedMetadata;\n scenarios: ScenarioDTO[];\n};\n\nexport enum CryptoKeyPermission {\n UNKNOWN = 'UNKNOWN',\n DECRYPT = 'DECRYPT',\n ENCRYPT = 'ENCRYPT',\n}\n\nexport type GcpCryptoKeyObject = {\n projectId: string;\n keyRing: string;\n name: string;\n locations: string;\n resourceId: string;\n createdAt: string;\n userPermissions: CryptoKeyPermission[];\n};\n\nexport type ScenarioDTO = {\n title: string;\n scenario: {\n ID: string;\n url?: string;\n description: string;\n threatActors: string[];\n vulnerabilities: string[];\n risk: Risk;\n actions: ActionsDTO[];\n remainingRisk: Risk;\n };\n};\n\nexport type ActionsDTO = {\n title: string;\n action: {\n ID: string;\n description: string;\n status: string;\n url: string;\n lastUpdated?: Date | null;\n lastUpdatedBy?: string | null;\n };\n};\n\nexport function dtoToRiSc(riScDTO: RiScDTO): RiSc {\n return {\n ...riScDTO,\n // TODO implementere løsning for migrering, kan bumpe fra 3.2 til 3.3 på denne måten manuelt ved å åpne og lagre riscen:\n // skjemaVersjon: '3.3',\n scenarios: riScDTO.scenarios.map(dtoToScenario),\n };\n}\n\nexport function dtoToScenario(scenarioDTO: ScenarioDTO): Scenario {\n return {\n ...scenarioDTO.scenario,\n title: scenarioDTO.title,\n actions: scenarioDTO.scenario.actions.map(dtoToAction),\n };\n}\n\nexport function dtoToAction(actionDTO: ActionsDTO): Action {\n return {\n ...actionDTO.action,\n title: actionDTO.title,\n };\n}\n\nexport function profileInfoToDTOString(profile: ProfileInfo): string {\n return JSON.stringify({\n name: profile.displayName ?? '',\n email: profile.email ?? '',\n });\n}\n\nexport function riScToDTOString(\n riSc: RiSc,\n isRequiresNewApproval: boolean,\n profile: ProfileInfo,\n sopsConfig: SopsConfigDTO,\n defaultRiScId?: string | undefined,\n): string {\n const json = JSON.stringify({\n riSc: JSON.stringify(riScToDTO(riSc)),\n isRequiresNewApproval: isRequiresNewApproval,\n schemaVersion: riSc.schemaVersion,\n defaultRiScId: defaultRiScId ?? undefined,\n userInfo: {\n name: profile.displayName ?? '',\n email: profile.email ?? '',\n },\n sopsConfig: sopsConfig,\n });\n return json;\n}\n\nfunction riScToDTO(riSc: RiSc): RiScDTO {\n return {\n // Explicit mapping instead of ...riSc to ensure stable serialized order.\n schemaVersion: riSc.schemaVersion,\n title: riSc.title,\n scope: riSc.scope,\n unencryptedMetadata: riSc.unencryptedMetadata?.appliesTo\n ? riSc.unencryptedMetadata\n : undefined,\n scenarios: riSc.scenarios.map(scenarioToDTO),\n };\n}\n\nfunction scenarioToDTO(scenario: Scenario): ScenarioDTO {\n return {\n title: scenario.title,\n scenario: {\n ID: scenario.ID,\n url: scenario.url,\n description: scenario.description,\n threatActors: scenario.threatActors,\n vulnerabilities: scenario.vulnerabilities,\n risk: scenario.risk,\n actions: scenario.actions.map(actionToDTO),\n remainingRisk: scenario.remainingRisk,\n },\n };\n}\n\nfunction actionToDTO(action: Action): ActionsDTO {\n return {\n title: action.title,\n action: {\n ID: action.ID,\n description: action.description,\n status: action.status,\n url: action.url,\n lastUpdated: action.lastUpdated,\n lastUpdatedBy: action.lastUpdatedBy,\n },\n };\n}\n\nexport type SopsConfigDTO = {\n shamir_threshold: number;\n age?: AgeEntry[];\n gcp_kms: GcpKmsEntry[];\n lastModified?: string;\n unencrypted_suffix?: string;\n version?: string;\n};\n\ntype GcpKmsEntry = {\n resource_id: string;\n created_at: string;\n};\n\ntype AgeEntry = {\n recipient: string;\n};\n"],"names":["CryptoKeyPermission"],"mappings":"AAiEO,IAAK,mBAAA,qBAAAA,oBAAAA,KAAL;AACL,EAAAA,qBAAA,SAAA,CAAA,GAAU,SAAA;AACV,EAAAA,qBAAA,SAAA,CAAA,GAAU,SAAA;AACV,EAAAA,qBAAA,SAAA,CAAA,GAAU,SAAA;AAHA,EAAA,OAAAA,oBAAAA;AAAA,CAAA,EAAA,mBAAA,IAAA,EAAA;
|
|
1
|
+
{"version":3,"file":"DTOs.esm.js","sources":["../../src/utils/DTOs.ts"],"sourcesContent":["import {\n Action,\n ContentStatus,\n LastPublished,\n MigrationStatus,\n Modify,\n ProcessingStatus,\n RiSc,\n RiScStatus,\n Risk,\n Scenario,\n UnencryptedMetadata,\n} from './types';\nimport { ProfileInfo } from '@backstage/core-plugin-api';\n\nexport type ProcessRiScResultDTO = {\n riScId: string;\n status: ProcessingStatus;\n statusMessage: string;\n riScContent: string | null;\n};\n\n// Takes a normal ProcessRiScResultDTO and changes status to ContentStatus.\ntype ContentRiScResultDTO = Modify<\n ProcessRiScResultDTO,\n 'status',\n ContentStatus\n> & { pullRequestUrl: string };\n\nexport type PublishRiScResultDTO = {\n pendingApproval?: {\n pullRequestUrl: string;\n pullRequestName: string;\n };\n} & ProcessRiScResultDTO;\n\nexport type CreateRiScResultDTO = {\n riScId: String;\n status: ProcessingStatus;\n statusMessage: string;\n riScContent: string | null;\n sopsConfig: SopsConfigDTO;\n} & ProcessRiScResultDTO;\n\nexport type DeleteRiScResultDTO = ProcessRiScResultDTO;\n\nexport type RiScContentResultDTO = {\n riScStatus: RiScStatus;\n riScContent: string;\n sopsConfig: SopsConfigDTO;\n migrationStatus: MigrationStatus;\n statusMessage?: string;\n errorCode?: string;\n encryptionKeyId?: string;\n lastPublished: LastPublished;\n} & ContentRiScResultDTO;\n\nexport type RiScDTO = {\n schemaVersion: string;\n title: string;\n scope: string;\n unencryptedMetadata?: UnencryptedMetadata;\n scenarios: ScenarioDTO[];\n};\n\nexport enum CryptoKeyPermission {\n UNKNOWN = 'UNKNOWN',\n DECRYPT = 'DECRYPT',\n ENCRYPT = 'ENCRYPT',\n}\n\nexport type GcpCryptoKeyObject = {\n projectId: string;\n keyRing: string;\n name: string;\n locations: string;\n resourceId: string;\n createdAt: string;\n userPermissions: CryptoKeyPermission[];\n};\n\nexport type ScenarioDTO = {\n title: string;\n scenario: {\n ID: string;\n url?: string;\n description: string;\n threatActors: string[];\n vulnerabilities: string[];\n risk: Risk;\n actions: ActionsDTO[];\n remainingRisk: Risk;\n };\n};\n\nexport type ActionsDTO = {\n title: string;\n action: {\n ID: string;\n description: string;\n status: string;\n url: string;\n lastUpdated?: Date | null;\n lastUpdatedBy?: string | null;\n comment?: string;\n };\n};\n\nexport function dtoToRiSc(riScDTO: RiScDTO): RiSc {\n return {\n ...riScDTO,\n // TODO implementere løsning for migrering, kan bumpe fra 3.2 til 3.3 på denne måten manuelt ved å åpne og lagre riscen:\n // skjemaVersjon: '3.3',\n scenarios: riScDTO.scenarios.map(dtoToScenario),\n };\n}\n\nexport function dtoToScenario(scenarioDTO: ScenarioDTO): Scenario {\n return {\n ...scenarioDTO.scenario,\n title: scenarioDTO.title,\n actions: scenarioDTO.scenario.actions.map(dtoToAction),\n };\n}\n\nexport function dtoToAction(actionDTO: ActionsDTO): Action {\n return {\n ...actionDTO.action,\n title: actionDTO.title,\n };\n}\n\nexport function profileInfoToDTOString(profile: ProfileInfo): string {\n return JSON.stringify({\n name: profile.displayName ?? '',\n email: profile.email ?? '',\n });\n}\n\nexport function riScToDTOString(\n riSc: RiSc,\n isRequiresNewApproval: boolean,\n profile: ProfileInfo,\n sopsConfig: SopsConfigDTO,\n defaultRiScId?: string | undefined,\n): string {\n const json = JSON.stringify({\n riSc: JSON.stringify(riScToDTO(riSc)),\n isRequiresNewApproval: isRequiresNewApproval,\n schemaVersion: riSc.schemaVersion,\n defaultRiScId: defaultRiScId ?? undefined,\n userInfo: {\n name: profile.displayName ?? '',\n email: profile.email ?? '',\n },\n sopsConfig: sopsConfig,\n });\n return json;\n}\n\nfunction riScToDTO(riSc: RiSc): RiScDTO {\n return {\n // Explicit mapping instead of ...riSc to ensure stable serialized order.\n schemaVersion: riSc.schemaVersion,\n title: riSc.title,\n scope: riSc.scope,\n unencryptedMetadata: riSc.unencryptedMetadata?.appliesTo\n ? riSc.unencryptedMetadata\n : undefined,\n scenarios: riSc.scenarios.map(scenarioToDTO),\n };\n}\n\nfunction scenarioToDTO(scenario: Scenario): ScenarioDTO {\n return {\n title: scenario.title,\n scenario: {\n ID: scenario.ID,\n url: scenario.url,\n description: scenario.description,\n threatActors: scenario.threatActors,\n vulnerabilities: scenario.vulnerabilities,\n risk: scenario.risk,\n actions: scenario.actions.map(actionToDTO),\n remainingRisk: scenario.remainingRisk,\n },\n };\n}\n\nfunction actionToDTO(action: Action): ActionsDTO {\n return {\n title: action.title,\n action: {\n ID: action.ID,\n description: action.description,\n status: action.status,\n url: action.url,\n lastUpdated: action.lastUpdated,\n lastUpdatedBy: action.lastUpdatedBy,\n comment: action.comment,\n },\n };\n}\n\nexport type SopsConfigDTO = {\n shamir_threshold: number;\n age?: AgeEntry[];\n gcp_kms: GcpKmsEntry[];\n lastModified?: string;\n unencrypted_suffix?: string;\n version?: string;\n};\n\ntype GcpKmsEntry = {\n resource_id: string;\n created_at: string;\n};\n\ntype AgeEntry = {\n recipient: string;\n};\n"],"names":["CryptoKeyPermission"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constants.esm.js","sources":["../../src/utils/constants.ts"],"sourcesContent":["export const schemaPath = '../
|
|
1
|
+
{"version":3,"file":"constants.esm.js","sources":["../../src/utils/constants.ts"],"sourcesContent":["export const schemaPath = '../risc_schema_en_v5_4.json';\n\nexport const latestSupportedVersion = '5.4';\n\nexport const BASE_NUMBER = 20.0;\nexport const CONSEQUENCE_SCALE_OFFSET = 3;\nexport const PROBABILITY_SCALE_OFFSET = -2;\n\nexport const consequenceOptions = Array.from({ length: 5 }, (_, i) =>\n Math.pow(BASE_NUMBER, i + CONSEQUENCE_SCALE_OFFSET),\n);\n\nexport const probabilityOptions = Array.from({ length: 5 }, (_, i) =>\n Math.pow(BASE_NUMBER, i + PROBABILITY_SCALE_OFFSET),\n);\n\nexport enum ThreatActorsOptions {\n ScriptKiddie = 'Script kiddie',\n Hacktivist = 'Hacktivist',\n RecklessEmployee = 'Reckless employee',\n Insider = 'Insider',\n OrganisedCrime = 'Organised crime',\n TerroristOrganisation = 'Terrorist organisation',\n NationGovernment = 'Nation/government',\n}\n\nexport enum VulnerabilitiesOptions {\n FlawedDesign = 'Flawed design',\n Misconfiguration = 'Misconfiguration',\n DependencyVulnerability = 'Dependency vulnerability',\n UnauthorizedAccess = 'Unauthorized access',\n UnmonitoredUse = 'Unmonitored use',\n InputTampering = 'Input tampering',\n InformationLeak = 'Information leak',\n ExcessiveUse = 'Excessive use',\n}\n\nexport enum ActionStatusOptions {\n OK = 'OK',\n NotOK = 'Not OK',\n NotRelevant = 'Not relevant',\n}\n\nconst grn = 'var(--ros-green-100)';\nconst ylw = 'var(--ros-orange-100)';\nconst red = 'var(--ros-red-300)';\nconst drd = 'var(--ros-red-400)';\n\nexport const riskMatrix = [\n [ylw, red, red, drd, drd],\n [ylw, ylw, red, red, drd],\n [grn, ylw, ylw, red, red],\n [grn, grn, ylw, ylw, red],\n [grn, grn, grn, ylw, ylw],\n];\n\nconst sGrn = 'var(--ros-green-300)';\nconst sYlw = 'var(--ros-orange-300)';\nconst sRed = 'var(--ros-red-500)';\nconst sDrd = 'var(--ros-red-600)';\n\nexport const riskMatrixStroke = [\n [sYlw, sRed, sRed, sDrd, sDrd],\n [sYlw, sYlw, sRed, sRed, sDrd],\n [sGrn, sYlw, sYlw, sRed, sRed],\n [sGrn, sGrn, sYlw, sYlw, sRed],\n [sGrn, sGrn, sGrn, sYlw, sYlw],\n];\n\nexport const urlRegExpPattern: RegExp =\n /[-a-zA-Z0-9@:%._\\+~#=]{1,256}\\.[a-zA-Z0-9()]{1,6}\\b([-a-zA-Z0-9()@:%_\\+.~#?&//=]*)/;\n"],"names":["ThreatActorsOptions","VulnerabilitiesOptions","ActionStatusOptions"],"mappings":"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"}
|