@kartverket/backstage-plugin-risk-scorecard 6.5.2 → 6.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -8,7 +8,6 @@ import { ScenarioLastUpdatedLabel } from '../scenario/ScenarioLastUpdatedLabel.e
8
8
  import DeleteIcon from '@mui/icons-material/Delete';
9
9
  import Collapse from '@mui/material/Collapse';
10
10
  import Box from '@mui/material/Box';
11
- import { Edit } from '@mui/icons-material';
12
11
  import { Markdown } from '../common/Markdown.esm.js';
13
12
  import { ActionURL } from './ActionURL.esm.js';
14
13
  import { useScenario } from '../../contexts/ScenarioContext.esm.js';
@@ -146,7 +145,7 @@ function ActionView(props) {
146
145
  e.stopPropagation();
147
146
  props.toggleEditMode();
148
147
  },
149
- children: /* @__PURE__ */ jsx(Edit, {})
148
+ children: /* @__PURE__ */ jsx("i", { className: "ri-edit-line" })
150
149
  }
151
150
  )
152
151
  ] }),
@@ -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 { Edit } from '@mui/icons-material';\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 <Edit />\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 { 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":";;;;;;;;;;;;;;;;;AAkCA,MAAM,0BAAA,GAA6B,CAAC,MAAA,KAA2B;AAC7D,EAAA,QAAQ,MAAA;AAAQ,IACd,KAAK,mBAAA,CAAoB,EAAA;AACvB,MAAA,OAAO,kBAAA;AAAA,IACT,KAAK,mBAAA,CAAoB,KAAA;AACvB,MAAA,OAAO,gBAAA;AAAA,IACT;AACE,MAAA,OAAO,iBAAA;AAAA;AAEb,CAAA;AAEO,SAAS,WAAW,KAAA,EAAwB;AACjD,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,iBAAA,CAAkB,wBAAwB,CAAA;AACxD,EAAA,MAAM,EAAE,gBAAA,EAAkB,oBAAA,EAAqB,GAAI,WAAA,EAAY;AAC/D,EAAA,MAAM,UAAA,GAAa,gBAAA,CAAiB,KAAA,CAAM,MAAA,CAAO,EAAE,CAAA;AAEnD,EAAA,uBACE,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAA,GAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,IAAA,EAAK,QAAA;AAAA,QACL,QAAA,EAAU,CAAA;AAAA,QACV,SAAS,CAAA,CAAA,KAAK;AACZ,UAAA,CAAA,CAAE,eAAA,EAAgB;AAElB,UAAA,MAAM,SAAS,CAAA,CAAE,MAAA;AACjB,UAAA,IAAI,MAAA,IAAU,MAAA,CAAO,OAAA,CAAQ,sBAAsB,CAAA,EAAG;AAEtD,UAAA,oBAAA,CAAqB,KAAA,CAAM,OAAO,EAAE,CAAA;AAAA,QACtC,CAAA;AAAA,QACA,WAAW,CAAA,CAAA,KAAK;AAEd,UAAA,CAAA,CAAE,eAAA,EAAgB;AAElB,UAAA,IAAI,CAAA,CAAE,GAAA,KAAQ,OAAA,IAAW,CAAA,CAAE,QAAQ,GAAA,EAAK;AACtC,YAAA,CAAA,CAAE,cAAA,EAAe;AACjB,YAAA,oBAAA,CAAqB,KAAA,CAAM,OAAO,EAAE,CAAA;AAAA,UACtC;AAAA,QACF,CAAA;AAAA,QACA,KAAA,EAAO,EAAE,MAAA,EAAQ,SAAA,EAAU;AAAA,QAE3B,+BAAC,IAAA,EAAA,EAAK,KAAA,EAAM,UAAS,GAAA,EAAI,GAAA,EAAI,SAAQ,SAAA,EACnC,QAAA,EAAA;AAAA,0BAAA,IAAA,CAAC,IAAA,EAAA,EAAK,OAAM,QAAA,EAAS,OAAA,EAAQ,SAAQ,KAAA,EAAO,EAAE,KAAA,EAAO,KAAA,EAAM,EACzD,QAAA,EAAA;AAAA,4BAAA,GAAA;AAAA,cAAC,UAAA;AAAA,cAAA;AAAA,gBACC,SAAS,CAAA,CAAA,KAAK;AACZ,kBAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,kBAAA,oBAAA,CAAqB,KAAA,CAAM,OAAO,EAAE,CAAA;AAAA,gBACtC,CAAA;AAAA,gBAEA,QAAA,kBAAA,GAAA;AAAA,kBAAC,GAAA;AAAA,kBAAA;AAAA,oBACC,SAAA,EAAW,CAAA,SAAA,EAAY,UAAA,GAAa,MAAA,GAAS,OAAO,CAAA,OAAA;AAAA;AAAA;AACtD;AAAA,aACF;AAAA,4BACA,GAAA,CAAC,IAAA,EAAA,EAAK,OAAA,EAAQ,YAAA,EACX,gBAAM,MAAA,CAAO,KAAA,IACZ,CAAA,EAAG,CAAA,CAAE,oBAAoB,CAAC,CAAA,CAAA,EAAI,KAAA,CAAM,KAAA,IAAS,EAAE,CAAA,CAAA,EACnD;AAAA,WAAA,EACF,CAAA;AAAA,0BACA,IAAA,CAAC,IAAA,EAAA,EAAK,KAAA,EAAM,QAAA,EAAS,SAAQ,KAAA,EAC3B,QAAA,EAAA;AAAA,4BAAA,GAAA;AAAA,cAAC,kBAAA;AAAA,cAAA;AAAA,gBACC,WAAA,EAAa;AAAA,kBACX,SAAA,EAAW,0BAAA;AAAA,oBACT,KAAA,CAAM,gBAAA,IAAoB,KAAA,CAAM,MAAA,CAAO;AAAA;AACzC,iBACF;AAAA,gBACA,SAAA,EAAW;AAAA,kBACT,QAAA,EAAU,yBAAA;AAAA,oBACR,KAAA,CAAM,gBAAA,IAAoB,KAAA,CAAM,MAAA,CAAO,MAAA;AAAA,oBACvC;AAAA;AACF,iBACF;AAAA,gBACA,UAAA,EAAY;AAAA,kBACV,OAAA,kBAAS,GAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,mBAAA,EAAoB,CAAA;AAAA,kBAC1C,SAAS,MAAM;AACb,oBAAA,KAAA,CAAM,qBAAA,CAAsB,MAAM,MAAM,CAAA;AAAA,kBAC1C;AAAA,iBACF;AAAA,gBACA,WAAW,MAAA,CAAO,MAAA,CAAO,mBAAmB,CAAA,CAAE,IAAI,CAAA,KAAA,MAAU;AAAA,kBAC1D,GAAA,EAAK,KAAA;AAAA;AAAA,kBAEL,KAAA,EAAO,CAAA;AAAA,oBACL,qCACE,KACF;AAAA,mBACF;AAAA,kBACA,SAAS,MAAM,KAAA,CAAM,kBAAkB,KAAA,CAAM,MAAA,CAAO,IAAI,KAAK,CAAA;AAAA,kBAC7D,QAAA,EAAU,MAAM,gBAAA,GACZ,KAAA,KAAU,MAAM,gBAAA,GAChB,KAAA,KAAU,MAAM,MAAA,CAAO;AAAA,iBAC7B,CAAE;AAAA;AAAA,aACJ;AAAA,4BACA,IAAA,CAAC,IAAA,EAAA,EAAK,GAAA,EAAI,GAAA,EAAI,OAAM,QAAA,EAClB,QAAA,EAAA;AAAA,8BAAA,GAAA;AAAA,gBAAC,wBAAA;AAAA,gBAAA;AAAA,kBACC,WAAA,EACE,CAAC,CAAC,KAAA,CAAM,mCACJ,IAAI,IAAA,EAAK,GACT,KAAA,CAAM,MAAA,CAAO,WAAA;AAAA,kBAEnB,aAAA,EAAe,MAAM,MAAA,CAAO;AAAA;AAAA,eAC9B;AAAA,8BACA,GAAA,CAAC,kBAAA,EAAA,EAAmB,MAAA,EAAQ,KAAA,CAAM,aAAA,EAAe;AAAA,aAAA,EACnD,CAAA;AAAA,YACC,MAAM,aAAA,oBACL,GAAA;AAAA,cAAC,UAAA;AAAA,cAAA;AAAA,gBACC,SAAS,CAAA,CAAA,KAAK;AACZ,kBAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,kBAAA,KAAA,CAAM,gBAAA,EAAiB;AAAA,gBACzB,CAAA;AAAA,gBAEA,8BAAC,UAAA,EAAA,EAAW;AAAA;AAAA;AACd,WAAA,EAEJ;AAAA,SAAA,EACF;AAAA;AAAA,KACF;AAAA,oBACA,GAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,EAAA,EAAI,UAAA;AAAA,QACJ,EAAA,EAAI,EAAE,SAAA,EAAW,CAAA,EAAE;AAAA,QACnB,OAAA,EAAQ,MAAA;AAAA,QACR,aAAA,EAAa,IAAA;AAAA,QAEb,+BAAC,GAAA,EAAA,EAAI,EAAA,EAAG,QAAO,EAAA,EAAG,GAAA,EAAI,IAAG,GAAA,EACvB,QAAA,EAAA;AAAA,0BAAA,IAAA,CAAC,QAAK,OAAA,EAAQ,SAAA,EAAU,EAAA,EAAG,KAAA,EAAM,OAAM,KAAA,EACrC,QAAA,EAAA;AAAA,4BAAA,GAAA,CAAC,IAAA,EAAA,EAAK,IAAG,GAAA,EAAI,OAAA,EAAQ,cAAa,MAAA,EAAO,MAAA,EACtC,QAAA,EAAA,CAAA,CAAE,wBAAwB,CAAA,EAC7B,CAAA;AAAA,YACC,MAAM,SAAA,oBACL,GAAA;AAAA,cAAC,UAAA;AAAA,cAAA;AAAA,gBACC,EAAA,EAAI;AAAA,kBACF,UAAA,EAAY,MAAA;AAAA,kBACZ,UAAA,EAAY;AAAA,iBACd;AAAA,gBACA,SAAS,CAAA,CAAA,KAAK;AACZ,kBAAA,CAAA,CAAE,eAAA,EAAgB;AAClB,kBAAA,KAAA,CAAM,cAAA,EAAe;AAAA,gBACvB,CAAA;AAAA,gBAEA,QAAA,kBAAA,GAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,cAAA,EAAe;AAAA;AAAA;AAC9B,WAAA,EAEJ,CAAA;AAAA,0BACA,GAAA,CAAC,QAAA,EAAA,EAAS,WAAA,EAAa,KAAA,CAAM,OAAO,WAAA,EAAa,CAAA;AAAA,0BACjD,GAAA,CAAC,SAAA,EAAA,EAAU,GAAA,EAAK,KAAA,CAAM,OAAO,GAAA,EAAK;AAAA,SAAA,EACpC;AAAA;AAAA;AACF,GAAA,EACF,CAAA;AAEJ;;;;"}
@@ -71,10 +71,7 @@ function StatusIcon(props) {
71
71
  ] });
72
72
  return iconElement;
73
73
  }
74
- function TooltipTargetIcon({
75
- ariaLabel,
76
- children
77
- }) {
74
+ function TooltipTargetIcon({ ariaLabel, children }) {
78
75
  return /* @__PURE__ */ jsx(
79
76
  Button,
80
77
  {
@@ -85,5 +82,5 @@ function TooltipTargetIcon({
85
82
  );
86
83
  }
87
84
 
88
- export { StatusIcon, StatusIconTypes, TooltipTargetIcon };
85
+ export { StatusIcon, StatusIconTypes };
89
86
  //# sourceMappingURL=StatusIcon.esm.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"StatusIcon.esm.js","sources":["../../../src/components/common/StatusIcon.tsx"],"sourcesContent":["import styles from './UpdatedStatusBadge.module.css';\nimport CircularProgress from '@mui/material/CircularProgress';\nimport { Tooltip, TooltipTrigger } from '@backstage/ui';\nimport { ReactNode } from 'react';\nimport { Button as AriaButton } from 'react-aria-components';\n\nexport enum StatusIconTypes {\n Green,\n Yellow,\n Red,\n Loading,\n Error,\n}\ntype StatusIconProps = {\n type: StatusIconTypes;\n tooltipText?: string;\n ariaLabel?: string;\n size: 'small' | 'medium' | 'large';\n};\nexport function StatusIcon(props: StatusIconProps) {\n const sizeToPx = {\n small: '16px',\n medium: '24px',\n large: '32px',\n };\n const fontSize = sizeToPx[props.size];\n let iconElement;\n switch (props.type) {\n case StatusIconTypes.Green:\n iconElement = (\n <i\n className={`ri-checkbox-circle-fill ${styles.updatedIcon} ${styles.iconBase}`}\n aria-label={props.ariaLabel}\n style={{ fontSize }}\n />\n );\n break;\n case StatusIconTypes.Yellow:\n iconElement = (\n <i\n className={`ri-error-warning-fill ${styles.outdatedIcon} ${styles.iconBase}`}\n aria-label={props.ariaLabel}\n style={{ fontSize }}\n />\n );\n break;\n case StatusIconTypes.Red:\n iconElement = (\n <i\n className={`ri-error-warning-fill ${styles.veryOutdatedIcon} ${styles.iconBase}`}\n aria-label={props.ariaLabel}\n style={{ fontSize }}\n />\n );\n break;\n case StatusIconTypes.Loading:\n iconElement = <CircularProgress size={fontSize} />;\n break;\n\n default:\n iconElement = (\n <i\n className={`ri-error-warning-fill ${styles.emptyIcon} ${styles.iconBase}`}\n style={{ fontSize }}\n />\n );\n break;\n }\n if (props.tooltipText)\n return (\n <TooltipTrigger>\n <TooltipTargetIcon ariaLabel={props.ariaLabel}>\n {iconElement}\n </TooltipTargetIcon>\n <Tooltip>{props.tooltipText}</Tooltip>\n </TooltipTrigger>\n );\n return iconElement;\n}\n\ntype TooltipTargetIconProps = {\n ariaLabel?: string;\n children: ReactNode;\n};\n\n/** Unstyled focusable wrapper that works as a trigger for BUI TooltipTrigger. */\nexport function TooltipTargetIcon({\n ariaLabel,\n children,\n}: TooltipTargetIconProps) {\n return (\n <AriaButton\n aria-label={ariaLabel}\n style={{ all: 'unset', display: 'inline-flex', cursor: 'default' }}\n >\n {children}\n </AriaButton>\n );\n}\n"],"names":["StatusIconTypes","AriaButton"],"mappings":"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"}
1
+ {"version":3,"file":"StatusIcon.esm.js","sources":["../../../src/components/common/StatusIcon.tsx"],"sourcesContent":["import styles from './UpdatedStatusBadge.module.css';\nimport CircularProgress from '@mui/material/CircularProgress';\nimport { Tooltip, TooltipTrigger } from '@backstage/ui';\nimport { ReactNode } from 'react';\nimport { Button as AriaButton } from 'react-aria-components';\n\nexport enum StatusIconTypes {\n Green,\n Yellow,\n Red,\n Loading,\n Error,\n}\ntype StatusIconProps = {\n type: StatusIconTypes;\n tooltipText?: string;\n ariaLabel?: string;\n size: 'small' | 'medium' | 'large';\n};\nexport function StatusIcon(props: StatusIconProps) {\n const sizeToPx = {\n small: '16px',\n medium: '24px',\n large: '32px',\n };\n const fontSize = sizeToPx[props.size];\n let iconElement;\n switch (props.type) {\n case StatusIconTypes.Green:\n iconElement = (\n <i\n className={`ri-checkbox-circle-fill ${styles.updatedIcon} ${styles.iconBase}`}\n aria-label={props.ariaLabel}\n style={{ fontSize }}\n />\n );\n break;\n case StatusIconTypes.Yellow:\n iconElement = (\n <i\n className={`ri-error-warning-fill ${styles.outdatedIcon} ${styles.iconBase}`}\n aria-label={props.ariaLabel}\n style={{ fontSize }}\n />\n );\n break;\n case StatusIconTypes.Red:\n iconElement = (\n <i\n className={`ri-error-warning-fill ${styles.veryOutdatedIcon} ${styles.iconBase}`}\n aria-label={props.ariaLabel}\n style={{ fontSize }}\n />\n );\n break;\n case StatusIconTypes.Loading:\n iconElement = <CircularProgress size={fontSize} />;\n break;\n\n default:\n iconElement = (\n <i\n className={`ri-error-warning-fill ${styles.emptyIcon} ${styles.iconBase}`}\n style={{ fontSize }}\n />\n );\n break;\n }\n if (props.tooltipText)\n return (\n <TooltipTrigger>\n <TooltipTargetIcon ariaLabel={props.ariaLabel}>\n {iconElement}\n </TooltipTargetIcon>\n <Tooltip>{props.tooltipText}</Tooltip>\n </TooltipTrigger>\n );\n return iconElement;\n}\n\ntype TooltipTargetIconProps = {\n ariaLabel?: string;\n children: ReactNode;\n};\n\n/** Unstyled focusable wrapper that works as a trigger for BUI TooltipTrigger. */\nfunction TooltipTargetIcon({ ariaLabel, children }: TooltipTargetIconProps) {\n return (\n <AriaButton\n aria-label={ariaLabel}\n style={{ all: 'unset', display: 'inline-flex', cursor: 'default' }}\n >\n {children}\n </AriaButton>\n );\n}\n"],"names":["StatusIconTypes","AriaButton"],"mappings":";;;;;;AAMO,IAAK,eAAA,qBAAAA,gBAAAA,KAAL;AACL,EAAAA,gBAAAA,CAAAA,gBAAAA,CAAA,OAAA,CAAA,GAAA,CAAA,CAAA,GAAA,OAAA;AACA,EAAAA,gBAAAA,CAAAA,gBAAAA,CAAA,QAAA,CAAA,GAAA,CAAA,CAAA,GAAA,QAAA;AACA,EAAAA,gBAAAA,CAAAA,gBAAAA,CAAA,KAAA,CAAA,GAAA,CAAA,CAAA,GAAA,KAAA;AACA,EAAAA,gBAAAA,CAAAA,gBAAAA,CAAA,SAAA,CAAA,GAAA,CAAA,CAAA,GAAA,SAAA;AACA,EAAAA,gBAAAA,CAAAA,gBAAAA,CAAA,OAAA,CAAA,GAAA,CAAA,CAAA,GAAA,OAAA;AALU,EAAA,OAAAA,gBAAAA;AAAA,CAAA,EAAA,eAAA,IAAA,EAAA;AAaL,SAAS,WAAW,KAAA,EAAwB;AACjD,EAAA,MAAM,QAAA,GAAW;AAAA,IACf,KAAA,EAAO,MAAA;AAAA,IACP,MAAA,EAAQ,MAAA;AAAA,IACR,KAAA,EAAO;AAAA,GACT;AACA,EAAA,MAAM,QAAA,GAAW,QAAA,CAAS,KAAA,CAAM,IAAI,CAAA;AACpC,EAAA,IAAI,WAAA;AACJ,EAAA,QAAQ,MAAM,IAAA;AAAM,IAClB,KAAK,CAAA;AACH,MAAA,WAAA,mBACE,GAAA;AAAA,QAAC,GAAA;AAAA,QAAA;AAAA,UACC,WAAW,CAAA,wBAAA,EAA2B,MAAA,CAAO,WAAW,CAAA,CAAA,EAAI,OAAO,QAAQ,CAAA,CAAA;AAAA,UAC3E,cAAY,KAAA,CAAM,SAAA;AAAA,UAClB,KAAA,EAAO,EAAE,QAAA;AAAS;AAAA,OACpB;AAEF,MAAA;AAAA,IACF,KAAK,CAAA;AACH,MAAA,WAAA,mBACE,GAAA;AAAA,QAAC,GAAA;AAAA,QAAA;AAAA,UACC,WAAW,CAAA,sBAAA,EAAyB,MAAA,CAAO,YAAY,CAAA,CAAA,EAAI,OAAO,QAAQ,CAAA,CAAA;AAAA,UAC1E,cAAY,KAAA,CAAM,SAAA;AAAA,UAClB,KAAA,EAAO,EAAE,QAAA;AAAS;AAAA,OACpB;AAEF,MAAA;AAAA,IACF,KAAK,CAAA;AACH,MAAA,WAAA,mBACE,GAAA;AAAA,QAAC,GAAA;AAAA,QAAA;AAAA,UACC,WAAW,CAAA,sBAAA,EAAyB,MAAA,CAAO,gBAAgB,CAAA,CAAA,EAAI,OAAO,QAAQ,CAAA,CAAA;AAAA,UAC9E,cAAY,KAAA,CAAM,SAAA;AAAA,UAClB,KAAA,EAAO,EAAE,QAAA;AAAS;AAAA,OACpB;AAEF,MAAA;AAAA,IACF,KAAK,CAAA;AACH,MAAA,WAAA,mBAAc,GAAA,CAAC,gBAAA,EAAA,EAAiB,IAAA,EAAM,QAAA,EAAU,CAAA;AAChD,MAAA;AAAA,IAEF;AACE,MAAA,WAAA,mBACE,GAAA;AAAA,QAAC,GAAA;AAAA,QAAA;AAAA,UACC,WAAW,CAAA,sBAAA,EAAyB,MAAA,CAAO,SAAS,CAAA,CAAA,EAAI,OAAO,QAAQ,CAAA,CAAA;AAAA,UACvE,KAAA,EAAO,EAAE,QAAA;AAAS;AAAA,OACpB;AAEF,MAAA;AAAA;AAEJ,EAAA,IAAI,KAAA,CAAM,WAAA;AACR,IAAA,4BACG,cAAA,EAAA,EACC,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,iBAAA,EAAA,EAAkB,SAAA,EAAW,KAAA,CAAM,SAAA,EACjC,QAAA,EAAA,WAAA,EACH,CAAA;AAAA,sBACA,GAAA,CAAC,OAAA,EAAA,EAAS,QAAA,EAAA,KAAA,CAAM,WAAA,EAAY;AAAA,KAAA,EAC9B,CAAA;AAEJ,EAAA,OAAO,WAAA;AACT;AAQA,SAAS,iBAAA,CAAkB,EAAE,SAAA,EAAW,QAAA,EAAS,EAA2B;AAC1E,EAAA,uBACE,GAAA;AAAA,IAACC,MAAA;AAAA,IAAA;AAAA,MACC,YAAA,EAAY,SAAA;AAAA,MACZ,OAAO,EAAE,GAAA,EAAK,SAAS,OAAA,EAAS,aAAA,EAAe,QAAQ,SAAA,EAAU;AAAA,MAEhE;AAAA;AAAA,GACH;AAEJ;;;;"}
@@ -85,7 +85,7 @@ function ActionsSection({ formMethods, isEditing }) {
85
85
  /* @__PURE__ */ jsx(
86
86
  Button,
87
87
  {
88
- iconStart: allowActionDeletion ? /* @__PURE__ */ jsx("i", { className: "ri-checkbox-circle-line" }) : /* @__PURE__ */ jsx("i", { className: "ri-pencil-line" }),
88
+ iconStart: allowActionDeletion ? /* @__PURE__ */ jsx("i", { className: "ri-checkbox-circle-line" }) : /* @__PURE__ */ jsx("i", { className: "ri-edit-line" }),
89
89
  variant: "secondary",
90
90
  onClick: () => setAllowActionDeletion((prev) => !prev),
91
91
  children: allowActionDeletion
@@ -1 +1 @@
1
- {"version":3,"file":"ActionsSection.esm.js","sources":["../../../../src/components/scenarioDrawer/components/ActionsSection.tsx"],"sourcesContent":["import { useEffect, useState } from 'react';\nimport Paper from '@mui/material/Paper';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { pluginRiScTranslationRef } from '../../../utils/translations';\nimport { emptyAction, useScenario } from '../../../contexts/ScenarioContext';\nimport sharedStyles from '../scenarioDrawer.module.css';\nimport { useFieldArray, UseFormReturn } from 'react-hook-form';\nimport { Action, FormScenario } from '../../../utils/types';\nimport { ActionFormItem } from './ActionFormItem';\nimport { AddCircle } from '@mui/icons-material';\nimport Switch from '@mui/material/Switch';\nimport { useActionFiltersStorage } from '../../../stores/ActionFiltersStore.ts';\nimport {\n Text,\n Tooltip,\n TooltipTrigger,\n Flex,\n Button,\n Card,\n Box,\n} from '@backstage/ui';\nimport { useSortActionsByRelevance } from '../../../hooks/UseSortActionsByRelevance.ts';\nimport { filterActionsByRelevance } from '../../../utils/actions.ts';\nimport { ActionRowList } from '../../action/ActionRowList.tsx';\nimport styles from './ActionsSection.module.css';\nimport { ActionStatusOptions } from '../../../utils/constants.ts';\n\nconst RelevanceToggle = ({\n checked,\n onChange,\n}: {\n checked: boolean;\n onChange: (checked: boolean) => void;\n}) => {\n const { t } = useTranslationRef(pluginRiScTranslationRef);\n\n return (\n <Flex align=\"center\" gap=\"0\" className={styles.noRelevantActionToggle}>\n <Switch\n checked={checked}\n onChange={e => onChange(e.target.checked)}\n name=\"showOnlyRelevant\"\n color=\"primary\"\n />\n <Text variant=\"body-medium\">{t('dictionary.showOnlyRelevant')}</Text>\n </Flex>\n );\n};\n\ntype ActionSectionProps = {\n formMethods: UseFormReturn<FormScenario>;\n isEditing: boolean;\n};\n\nexport function ActionsSection({ formMethods, isEditing }: ActionSectionProps) {\n const { t } = useTranslationRef(pluginRiScTranslationRef);\n const { scenario } = useScenario();\n\n const [allowActionDeletion, setAllowActionDeletion] =\n useState<boolean>(false);\n const { watch } = formMethods;\n const currentActions = watch('actions');\n\n const [sortedActions, setSortedActions] = useState<Action[] | undefined>(\n undefined,\n );\n const { actionFilters, saveOnlyRelevantFilter } = useActionFiltersStorage();\n const sortActionsByRelevance = useSortActionsByRelevance();\n\n useEffect(() => {\n setSortedActions(sortedActionsState => {\n if (sortedActionsState === undefined)\n return sortActionsByRelevance([...currentActions]);\n\n // sync actions\n const updatedSortedActions: Action[] = [];\n for (const action of sortedActionsState) {\n const updatedAction = currentActions.find(a => a.ID === action.ID);\n if (updatedAction) updatedSortedActions.push(updatedAction);\n }\n // add new actions\n for (const action of currentActions) {\n if (!updatedSortedActions.some(a => a.ID === action.ID)) {\n updatedSortedActions.push(action);\n }\n }\n return updatedSortedActions;\n });\n }, [currentActions, actionFilters, sortActionsByRelevance]);\n\n if (isEditing) {\n return <ActionsSectionOnEdit formMethods={formMethods} />;\n }\n\n const doesCurrentActionsContainNotRelevantActions = currentActions.some(\n action => action.status === ActionStatusOptions.NotRelevant,\n );\n\n const isActionsEmpty = currentActions.length === 0;\n\n return (\n <Paper className={sharedStyles.section}>\n <Flex justify=\"between\" mb=\"2\">\n <Text variant=\"title-x-small\" weight=\"bold\">\n {t('dictionary.measures')}\n </Text>\n <Flex align=\"center\">\n {doesCurrentActionsContainNotRelevantActions && (\n <RelevanceToggle\n checked={actionFilters.showOnlyRelevant}\n onChange={value => saveOnlyRelevantFilter(value)}\n />\n )}\n {!isActionsEmpty && (\n <TooltipTrigger>\n <Button\n iconStart={\n allowActionDeletion ? (\n <i className=\"ri-checkbox-circle-line\" />\n ) : (\n <i className=\"ri-pencil-line\" />\n )\n }\n variant=\"secondary\"\n onClick={() => setAllowActionDeletion(prev => !prev)}\n >\n {allowActionDeletion}\n </Button>\n <Tooltip>\n {allowActionDeletion\n ? t('scenarioTable.doneEditing')\n : t('scenarioTable.editButton')}\n </Tooltip>\n </TooltipTrigger>\n )}\n </Flex>\n </Flex>\n {sortedActions !== undefined && sortedActions.length > 0 ? (\n <ActionRowList\n scenarioId={scenario.ID}\n displayedActions={filterActionsByRelevance(\n sortedActions,\n actionFilters.showOnlyRelevant,\n )}\n allowDeletion={allowActionDeletion}\n allowEdit\n />\n ) : (\n <Text variant=\"body-large\" className={styles.italicText}>\n {!currentActions || currentActions.length === 0\n ? t('dictionary.emptyField', {\n field: t('dictionary.measures').toLowerCase(),\n })\n : t('dictionary.noRelevantMeasures')}\n </Text>\n )}\n </Paper>\n );\n}\n\ntype ActionsSectionOnEditProps = {\n formMethods: UseFormReturn<FormScenario>;\n};\n\nfunction ActionsSectionOnEdit(props: ActionsSectionOnEditProps) {\n const { t } = useTranslationRef(pluginRiScTranslationRef);\n\n const { control } = props.formMethods;\n const { fields, append, remove } = useFieldArray({\n control,\n name: 'actions',\n });\n\n return (\n <Paper className={sharedStyles.section}>\n <Box>\n <Text variant=\"title-x-small\" weight=\"bold\">\n {t('dictionary.measures')}\n </Text>\n </Box>\n {fields.map((field, index) => (\n <Card key={field.id} className={styles.actionFormItemCard}>\n <ActionFormItem\n key={index}\n formMethods={props.formMethods}\n displayedIndex={index}\n handleDelete={() => remove(index)}\n baseObjectPathToActionOfForm={`actions.${index}`}\n />\n </Card>\n ))}\n <Button\n iconStart={<AddCircle />}\n variant=\"primary\"\n onClick={() => append(emptyAction())}\n className={styles.addActionButton}\n >\n {t('scenarioDrawer.measureTab.addMeasureButton')}\n </Button>\n </Paper>\n );\n}\n"],"names":["sharedStyles"],"mappings":"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"}
1
+ {"version":3,"file":"ActionsSection.esm.js","sources":["../../../../src/components/scenarioDrawer/components/ActionsSection.tsx"],"sourcesContent":["import { useEffect, useState } from 'react';\nimport Paper from '@mui/material/Paper';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { pluginRiScTranslationRef } from '../../../utils/translations';\nimport { emptyAction, useScenario } from '../../../contexts/ScenarioContext';\nimport sharedStyles from '../scenarioDrawer.module.css';\nimport { useFieldArray, UseFormReturn } from 'react-hook-form';\nimport { Action, FormScenario } from '../../../utils/types';\nimport { ActionFormItem } from './ActionFormItem';\nimport { AddCircle } from '@mui/icons-material';\nimport Switch from '@mui/material/Switch';\nimport { useActionFiltersStorage } from '../../../stores/ActionFiltersStore.ts';\nimport {\n Text,\n Tooltip,\n TooltipTrigger,\n Flex,\n Button,\n Card,\n Box,\n} from '@backstage/ui';\nimport { useSortActionsByRelevance } from '../../../hooks/UseSortActionsByRelevance.ts';\nimport { filterActionsByRelevance } from '../../../utils/actions.ts';\nimport { ActionRowList } from '../../action/ActionRowList.tsx';\nimport styles from './ActionsSection.module.css';\nimport { ActionStatusOptions } from '../../../utils/constants.ts';\n\nconst RelevanceToggle = ({\n checked,\n onChange,\n}: {\n checked: boolean;\n onChange: (checked: boolean) => void;\n}) => {\n const { t } = useTranslationRef(pluginRiScTranslationRef);\n\n return (\n <Flex align=\"center\" gap=\"0\" className={styles.noRelevantActionToggle}>\n <Switch\n checked={checked}\n onChange={e => onChange(e.target.checked)}\n name=\"showOnlyRelevant\"\n color=\"primary\"\n />\n <Text variant=\"body-medium\">{t('dictionary.showOnlyRelevant')}</Text>\n </Flex>\n );\n};\n\ntype ActionSectionProps = {\n formMethods: UseFormReturn<FormScenario>;\n isEditing: boolean;\n};\n\nexport function ActionsSection({ formMethods, isEditing }: ActionSectionProps) {\n const { t } = useTranslationRef(pluginRiScTranslationRef);\n const { scenario } = useScenario();\n\n const [allowActionDeletion, setAllowActionDeletion] =\n useState<boolean>(false);\n const { watch } = formMethods;\n const currentActions = watch('actions');\n\n const [sortedActions, setSortedActions] = useState<Action[] | undefined>(\n undefined,\n );\n const { actionFilters, saveOnlyRelevantFilter } = useActionFiltersStorage();\n const sortActionsByRelevance = useSortActionsByRelevance();\n\n useEffect(() => {\n setSortedActions(sortedActionsState => {\n if (sortedActionsState === undefined)\n return sortActionsByRelevance([...currentActions]);\n\n // sync actions\n const updatedSortedActions: Action[] = [];\n for (const action of sortedActionsState) {\n const updatedAction = currentActions.find(a => a.ID === action.ID);\n if (updatedAction) updatedSortedActions.push(updatedAction);\n }\n // add new actions\n for (const action of currentActions) {\n if (!updatedSortedActions.some(a => a.ID === action.ID)) {\n updatedSortedActions.push(action);\n }\n }\n return updatedSortedActions;\n });\n }, [currentActions, actionFilters, sortActionsByRelevance]);\n\n if (isEditing) {\n return <ActionsSectionOnEdit formMethods={formMethods} />;\n }\n\n const doesCurrentActionsContainNotRelevantActions = currentActions.some(\n action => action.status === ActionStatusOptions.NotRelevant,\n );\n\n const isActionsEmpty = currentActions.length === 0;\n\n return (\n <Paper className={sharedStyles.section}>\n <Flex justify=\"between\" mb=\"2\">\n <Text variant=\"title-x-small\" weight=\"bold\">\n {t('dictionary.measures')}\n </Text>\n <Flex align=\"center\">\n {doesCurrentActionsContainNotRelevantActions && (\n <RelevanceToggle\n checked={actionFilters.showOnlyRelevant}\n onChange={value => saveOnlyRelevantFilter(value)}\n />\n )}\n {!isActionsEmpty && (\n <TooltipTrigger>\n <Button\n iconStart={\n allowActionDeletion ? (\n <i className=\"ri-checkbox-circle-line\" />\n ) : (\n <i className=\"ri-edit-line\" />\n )\n }\n variant=\"secondary\"\n onClick={() => setAllowActionDeletion(prev => !prev)}\n >\n {allowActionDeletion}\n </Button>\n <Tooltip>\n {allowActionDeletion\n ? t('scenarioTable.doneEditing')\n : t('scenarioTable.editButton')}\n </Tooltip>\n </TooltipTrigger>\n )}\n </Flex>\n </Flex>\n {sortedActions !== undefined && sortedActions.length > 0 ? (\n <ActionRowList\n scenarioId={scenario.ID}\n displayedActions={filterActionsByRelevance(\n sortedActions,\n actionFilters.showOnlyRelevant,\n )}\n allowDeletion={allowActionDeletion}\n allowEdit\n />\n ) : (\n <Text variant=\"body-large\" className={styles.italicText}>\n {!currentActions || currentActions.length === 0\n ? t('dictionary.emptyField', {\n field: t('dictionary.measures').toLowerCase(),\n })\n : t('dictionary.noRelevantMeasures')}\n </Text>\n )}\n </Paper>\n );\n}\n\ntype ActionsSectionOnEditProps = {\n formMethods: UseFormReturn<FormScenario>;\n};\n\nfunction ActionsSectionOnEdit(props: ActionsSectionOnEditProps) {\n const { t } = useTranslationRef(pluginRiScTranslationRef);\n\n const { control } = props.formMethods;\n const { fields, append, remove } = useFieldArray({\n control,\n name: 'actions',\n });\n\n return (\n <Paper className={sharedStyles.section}>\n <Box>\n <Text variant=\"title-x-small\" weight=\"bold\">\n {t('dictionary.measures')}\n </Text>\n </Box>\n {fields.map((field, index) => (\n <Card key={field.id} className={styles.actionFormItemCard}>\n <ActionFormItem\n key={index}\n formMethods={props.formMethods}\n displayedIndex={index}\n handleDelete={() => remove(index)}\n baseObjectPathToActionOfForm={`actions.${index}`}\n />\n </Card>\n ))}\n <Button\n iconStart={<AddCircle />}\n variant=\"primary\"\n onClick={() => append(emptyAction())}\n className={styles.addActionButton}\n >\n {t('scenarioDrawer.measureTab.addMeasureButton')}\n </Button>\n </Paper>\n );\n}\n"],"names":["sharedStyles"],"mappings":"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"}
@@ -44,7 +44,7 @@ function ScenarioTableFilter(props) {
44
44
  /* @__PURE__ */ jsx(
45
45
  Button,
46
46
  {
47
- iconStart: props.isEditingScenarioTable ? /* @__PURE__ */ jsx("i", { className: "ri-checkbox-circle-line" }) : /* @__PURE__ */ jsx("i", { className: "ri-pencil-line" }),
47
+ iconStart: props.isEditingScenarioTable ? /* @__PURE__ */ jsx("i", { className: "ri-checkbox-circle-line" }) : /* @__PURE__ */ jsx("i", { className: "ri-edit-line" }),
48
48
  variant: "secondary",
49
49
  onClick: props.onToggleEditScenarioTable,
50
50
  children: props.isEditingScenarioTable
@@ -1 +1 @@
1
- {"version":3,"file":"ScenarioTableFilter.esm.js","sources":["../../../src/components/scenarioTable/ScenarioTableFilter.tsx"],"sourcesContent":["import {\n Select,\n Flex,\n Button,\n TooltipTrigger,\n Tooltip,\n SearchField,\n} from '@backstage/ui';\nimport { AddScenarioButton } from './AddScenarioButton.tsx';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { pluginRiScTranslationRef } from '../../utils/translations.ts';\n\ntype ScenarioTableFilterProps = {\n scenarioSortOrder: string | null;\n onScenarioSortOrderChange: (sortOrder: string | null) => void;\n actionSearchQuery: string;\n onActionSearchQueryChange: (query: string) => void;\n isEditingScenarioTable: boolean;\n isEditingScenarioTableAllowed: boolean;\n onToggleEditScenarioTable: () => void;\n onNewScenario: () => void;\n};\n\nexport function ScenarioTableFilter(props: ScenarioTableFilterProps) {\n const { t } = useTranslationRef(pluginRiScTranslationRef);\n return (\n <Flex justify=\"between\" gap=\"16px\">\n <Flex style={{ flex: 1 }}>\n <SearchField\n placeholder=\"Søk etter tiltak ...\"\n aria-label=\"search field\"\n value={props.actionSearchQuery}\n onChange={value => props.onActionSearchQueryChange(value)}\n />\n </Flex>\n <Flex>\n <Select\n aria-label=\"sortering\"\n defaultValue={props.scenarioSortOrder ?? 'NoSorting'}\n onSelectionChange={key =>\n props.onScenarioSortOrderChange(key?.toString() ?? 'NoSorting')\n }\n options={[\n { value: 'NoSorting', label: t('dictionary.customOrder') },\n { value: 'TitleAlphabetical', label: t('filter.title') },\n { value: 'HighestInitialRisk', label: t('filter.initialRisk') },\n {\n value: 'MostImplementedActions',\n label: t('filter.completedActions'),\n },\n {\n value: 'MostRemainingActions',\n label: t('filter.remainingActions'),\n },\n ]}\n />\n {props.isEditingScenarioTableAllowed && (\n <>\n <AddScenarioButton onNewScenario={props.onNewScenario} />\n <TooltipTrigger>\n <Button\n iconStart={\n props.isEditingScenarioTable ? (\n <i className=\"ri-checkbox-circle-line\" />\n ) : (\n <i className=\"ri-pencil-line\" />\n )\n }\n variant=\"secondary\"\n onClick={props.onToggleEditScenarioTable}\n >\n {props.isEditingScenarioTable}\n </Button>\n <Tooltip>\n {props.isEditingScenarioTable\n ? t('scenarioTable.doneEditing')\n : t('scenarioTable.editButton')}\n </Tooltip>\n </TooltipTrigger>\n </>\n )}\n </Flex>\n </Flex>\n );\n}\n"],"names":[],"mappings":";;;;;;AAuBO,SAAS,oBAAoB,KAAA,EAAiC;AACnE,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,iBAAA,CAAkB,wBAAwB,CAAA;AACxD,EAAA,uBACE,IAAA,CAAC,IAAA,EAAA,EAAK,OAAA,EAAQ,SAAA,EAAU,KAAI,MAAA,EAC1B,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,IAAA,EAAA,EAAK,KAAA,EAAO,EAAE,IAAA,EAAM,GAAE,EACrB,QAAA,kBAAA,GAAA;AAAA,MAAC,WAAA;AAAA,MAAA;AAAA,QACC,WAAA,EAAY,yBAAA;AAAA,QACZ,YAAA,EAAW,cAAA;AAAA,QACX,OAAO,KAAA,CAAM,iBAAA;AAAA,QACb,QAAA,EAAU,CAAA,KAAA,KAAS,KAAA,CAAM,yBAAA,CAA0B,KAAK;AAAA;AAAA,KAC1D,EACF,CAAA;AAAA,yBACC,IAAA,EAAA,EACC,QAAA,EAAA;AAAA,sBAAA,GAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,YAAA,EAAW,WAAA;AAAA,UACX,YAAA,EAAc,MAAM,iBAAA,IAAqB,WAAA;AAAA,UACzC,mBAAmB,CAAA,GAAA,KACjB,KAAA,CAAM,0BAA0B,GAAA,EAAK,QAAA,MAAc,WAAW,CAAA;AAAA,UAEhE,OAAA,EAAS;AAAA,YACP,EAAE,KAAA,EAAO,WAAA,EAAa,KAAA,EAAO,CAAA,CAAE,wBAAwB,CAAA,EAAE;AAAA,YACzD,EAAE,KAAA,EAAO,mBAAA,EAAqB,KAAA,EAAO,CAAA,CAAE,cAAc,CAAA,EAAE;AAAA,YACvD,EAAE,KAAA,EAAO,oBAAA,EAAsB,KAAA,EAAO,CAAA,CAAE,oBAAoB,CAAA,EAAE;AAAA,YAC9D;AAAA,cACE,KAAA,EAAO,wBAAA;AAAA,cACP,KAAA,EAAO,EAAE,yBAAyB;AAAA,aACpC;AAAA,YACA;AAAA,cACE,KAAA,EAAO,sBAAA;AAAA,cACP,KAAA,EAAO,EAAE,yBAAyB;AAAA;AACpC;AACF;AAAA,OACF;AAAA,MACC,KAAA,CAAM,iDACL,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,iBAAA,EAAA,EAAkB,aAAA,EAAe,KAAA,CAAM,aAAA,EAAe,CAAA;AAAA,6BACtD,cAAA,EAAA,EACC,QAAA,EAAA;AAAA,0BAAA,GAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACC,SAAA,EACE,KAAA,CAAM,sBAAA,mBACJ,GAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,yBAAA,EAA0B,CAAA,mBAEvC,GAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,gBAAA,EAAiB,CAAA;AAAA,cAGlC,OAAA,EAAQ,WAAA;AAAA,cACR,SAAS,KAAA,CAAM,yBAAA;AAAA,cAEd,QAAA,EAAA,KAAA,CAAM;AAAA;AAAA,WACT;AAAA,0BACA,GAAA,CAAC,WACE,QAAA,EAAA,KAAA,CAAM,sBAAA,GACH,EAAE,2BAA2B,CAAA,GAC7B,CAAA,CAAE,0BAA0B,CAAA,EAClC;AAAA,SAAA,EACF;AAAA,OAAA,EACF;AAAA,KAAA,EAEJ;AAAA,GAAA,EACF,CAAA;AAEJ;;;;"}
1
+ {"version":3,"file":"ScenarioTableFilter.esm.js","sources":["../../../src/components/scenarioTable/ScenarioTableFilter.tsx"],"sourcesContent":["import {\n Select,\n Flex,\n Button,\n TooltipTrigger,\n Tooltip,\n SearchField,\n} from '@backstage/ui';\nimport { AddScenarioButton } from './AddScenarioButton.tsx';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { pluginRiScTranslationRef } from '../../utils/translations.ts';\n\ntype ScenarioTableFilterProps = {\n scenarioSortOrder: string | null;\n onScenarioSortOrderChange: (sortOrder: string | null) => void;\n actionSearchQuery: string;\n onActionSearchQueryChange: (query: string) => void;\n isEditingScenarioTable: boolean;\n isEditingScenarioTableAllowed: boolean;\n onToggleEditScenarioTable: () => void;\n onNewScenario: () => void;\n};\n\nexport function ScenarioTableFilter(props: ScenarioTableFilterProps) {\n const { t } = useTranslationRef(pluginRiScTranslationRef);\n return (\n <Flex justify=\"between\" gap=\"16px\">\n <Flex style={{ flex: 1 }}>\n <SearchField\n placeholder=\"Søk etter tiltak ...\"\n aria-label=\"search field\"\n value={props.actionSearchQuery}\n onChange={value => props.onActionSearchQueryChange(value)}\n />\n </Flex>\n <Flex>\n <Select\n aria-label=\"sortering\"\n defaultValue={props.scenarioSortOrder ?? 'NoSorting'}\n onSelectionChange={key =>\n props.onScenarioSortOrderChange(key?.toString() ?? 'NoSorting')\n }\n options={[\n { value: 'NoSorting', label: t('dictionary.customOrder') },\n { value: 'TitleAlphabetical', label: t('filter.title') },\n { value: 'HighestInitialRisk', label: t('filter.initialRisk') },\n {\n value: 'MostImplementedActions',\n label: t('filter.completedActions'),\n },\n {\n value: 'MostRemainingActions',\n label: t('filter.remainingActions'),\n },\n ]}\n />\n {props.isEditingScenarioTableAllowed && (\n <>\n <AddScenarioButton onNewScenario={props.onNewScenario} />\n <TooltipTrigger>\n <Button\n iconStart={\n props.isEditingScenarioTable ? (\n <i className=\"ri-checkbox-circle-line\" />\n ) : (\n <i className=\"ri-edit-line\" />\n )\n }\n variant=\"secondary\"\n onClick={props.onToggleEditScenarioTable}\n >\n {props.isEditingScenarioTable}\n </Button>\n <Tooltip>\n {props.isEditingScenarioTable\n ? t('scenarioTable.doneEditing')\n : t('scenarioTable.editButton')}\n </Tooltip>\n </TooltipTrigger>\n </>\n )}\n </Flex>\n </Flex>\n );\n}\n"],"names":[],"mappings":";;;;;;AAuBO,SAAS,oBAAoB,KAAA,EAAiC;AACnE,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,iBAAA,CAAkB,wBAAwB,CAAA;AACxD,EAAA,uBACE,IAAA,CAAC,IAAA,EAAA,EAAK,OAAA,EAAQ,SAAA,EAAU,KAAI,MAAA,EAC1B,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,IAAA,EAAA,EAAK,KAAA,EAAO,EAAE,IAAA,EAAM,GAAE,EACrB,QAAA,kBAAA,GAAA;AAAA,MAAC,WAAA;AAAA,MAAA;AAAA,QACC,WAAA,EAAY,yBAAA;AAAA,QACZ,YAAA,EAAW,cAAA;AAAA,QACX,OAAO,KAAA,CAAM,iBAAA;AAAA,QACb,QAAA,EAAU,CAAA,KAAA,KAAS,KAAA,CAAM,yBAAA,CAA0B,KAAK;AAAA;AAAA,KAC1D,EACF,CAAA;AAAA,yBACC,IAAA,EAAA,EACC,QAAA,EAAA;AAAA,sBAAA,GAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,YAAA,EAAW,WAAA;AAAA,UACX,YAAA,EAAc,MAAM,iBAAA,IAAqB,WAAA;AAAA,UACzC,mBAAmB,CAAA,GAAA,KACjB,KAAA,CAAM,0BAA0B,GAAA,EAAK,QAAA,MAAc,WAAW,CAAA;AAAA,UAEhE,OAAA,EAAS;AAAA,YACP,EAAE,KAAA,EAAO,WAAA,EAAa,KAAA,EAAO,CAAA,CAAE,wBAAwB,CAAA,EAAE;AAAA,YACzD,EAAE,KAAA,EAAO,mBAAA,EAAqB,KAAA,EAAO,CAAA,CAAE,cAAc,CAAA,EAAE;AAAA,YACvD,EAAE,KAAA,EAAO,oBAAA,EAAsB,KAAA,EAAO,CAAA,CAAE,oBAAoB,CAAA,EAAE;AAAA,YAC9D;AAAA,cACE,KAAA,EAAO,wBAAA;AAAA,cACP,KAAA,EAAO,EAAE,yBAAyB;AAAA,aACpC;AAAA,YACA;AAAA,cACE,KAAA,EAAO,sBAAA;AAAA,cACP,KAAA,EAAO,EAAE,yBAAyB;AAAA;AACpC;AACF;AAAA,OACF;AAAA,MACC,KAAA,CAAM,iDACL,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,iBAAA,EAAA,EAAkB,aAAA,EAAe,KAAA,CAAM,aAAA,EAAe,CAAA;AAAA,6BACtD,cAAA,EAAA,EACC,QAAA,EAAA;AAAA,0BAAA,GAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACC,SAAA,EACE,KAAA,CAAM,sBAAA,mBACJ,GAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,yBAAA,EAA0B,CAAA,mBAEvC,GAAA,CAAC,GAAA,EAAA,EAAE,SAAA,EAAU,cAAA,EAAe,CAAA;AAAA,cAGhC,OAAA,EAAQ,WAAA;AAAA,cACR,SAAS,KAAA,CAAM,yBAAA;AAAA,cAEd,QAAA,EAAA,KAAA,CAAM;AAAA;AAAA,WACT;AAAA,0BACA,GAAA,CAAC,WACE,QAAA,EAAA,KAAA,CAAM,sBAAA,GACH,EAAE,2BAA2B,CAAA,GAC7B,CAAA,CAAE,0BAA0B,CAAA,EAClC;AAAA,SAAA,EACF;AAAA,OAAA,EACF;AAAA,KAAA,EAEJ;AAAA,GAAA,EACF,CAAA;AAEJ;;;;"}
@@ -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} 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 lastPublished: LastPublished;\n} & ContentRiScResultDTO;\n\nexport type RiScDTO = {\n schemaVersion: string;\n title: string;\n scope: string;\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 ...riSc,\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":"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"}
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} 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 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 ...riSc,\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":"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"}
@@ -44,5 +44,5 @@ function getUpdatedStatus(action) {
44
44
  return status;
45
45
  }
46
46
 
47
- export { filterActionsByRelevance, getActionsWithLastUpdated, getUpdatedStatus, isActionsEqual };
47
+ export { filterActionsByRelevance, getActionsWithLastUpdated, getUpdatedStatus };
48
48
  //# sourceMappingURL=actions.esm.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"actions.esm.js","sources":["../../src/utils/actions.ts"],"sourcesContent":["import { Action } from './types.ts';\nimport { ActionStatusOptions } from './constants.ts';\nimport {\n calculateDaysSince,\n calculateUpdatedStatus,\n UpdatedStatusEnum,\n} from './utilityfunctions.ts';\nimport { ProfileInfo } from '@backstage/core-plugin-api';\n\nexport function filterActionsByRelevance(\n actions: Action[],\n showOnlyRelevant: boolean,\n) {\n return actions.filter(action =>\n showOnlyRelevant ? action.status !== ActionStatusOptions.NotRelevant : true,\n );\n}\n\nexport function isActionsEqual(a: Action, b: Action) {\n if (\n a.ID !== b.ID ||\n a.title !== b.title ||\n a.description !== b.description ||\n a.status !== b.status ||\n a.url !== b.url\n )\n return false;\n\n if (a.lastUpdated === b.lastUpdated) return true;\n if (!a.lastUpdated || !b.lastUpdated) return false;\n return a.lastUpdated.getTime() === b.lastUpdated.getTime();\n}\n\nexport function getActionsWithLastUpdated(\n oldActions: Action[],\n newActions: Action[],\n idsOfActionsToForceUpdateLastUpdatedValue: string[] = [],\n profileInfo?: ProfileInfo,\n) {\n const actionsWithLastUpdated: Action[] = [];\n const lastUpdatedBy = profileInfo?.displayName || profileInfo?.email || '';\n for (const newAction of newActions) {\n if (idsOfActionsToForceUpdateLastUpdatedValue.includes(newAction.ID)) {\n actionsWithLastUpdated.push({\n ...newAction,\n lastUpdated: new Date(),\n lastUpdatedBy: lastUpdatedBy,\n });\n continue;\n }\n\n const oldAction = oldActions.find(a => a.ID === newAction.ID);\n if (oldAction && isActionsEqual(newAction, oldAction)) {\n actionsWithLastUpdated.push({ ...newAction });\n } else {\n actionsWithLastUpdated.push({\n ...newAction,\n lastUpdated: new Date(),\n lastUpdatedBy: lastUpdatedBy,\n });\n }\n }\n return actionsWithLastUpdated;\n}\n\nexport function getUpdatedStatus(action: Action) {\n const daysSinceLastUpdate = action.lastUpdated\n ? calculateDaysSince(new Date(action.lastUpdated))\n : null;\n\n const status =\n daysSinceLastUpdate !== null\n ? calculateUpdatedStatus(daysSinceLastUpdate)\n : UpdatedStatusEnum.VERY_OUTDATED;\n return status;\n}\n"],"names":[],"mappings":";;;AASO,SAAS,wBAAA,CACd,SACA,gBAAA,EACA;AACA,EAAA,OAAO,OAAA,CAAQ,MAAA;AAAA,IAAO,CAAA,MAAA,KACpB,gBAAA,GAAmB,MAAA,CAAO,MAAA,KAAW,oBAAoB,WAAA,GAAc;AAAA,GACzE;AACF;AAEO,SAAS,cAAA,CAAe,GAAW,CAAA,EAAW;AACnD,EAAA,IACE,EAAE,EAAA,KAAO,CAAA,CAAE,MACX,CAAA,CAAE,KAAA,KAAU,EAAE,KAAA,IACd,CAAA,CAAE,WAAA,KAAgB,CAAA,CAAE,eACpB,CAAA,CAAE,MAAA,KAAW,EAAE,MAAA,IACf,CAAA,CAAE,QAAQ,CAAA,CAAE,GAAA;AAEZ,IAAA,OAAO,KAAA;AAET,EAAA,IAAI,CAAA,CAAE,WAAA,KAAgB,CAAA,CAAE,WAAA,EAAa,OAAO,IAAA;AAC5C,EAAA,IAAI,CAAC,CAAA,CAAE,WAAA,IAAe,CAAC,CAAA,CAAE,aAAa,OAAO,KAAA;AAC7C,EAAA,OAAO,EAAE,WAAA,CAAY,OAAA,EAAQ,KAAM,CAAA,CAAE,YAAY,OAAA,EAAQ;AAC3D;AAEO,SAAS,0BACd,UAAA,EACA,UAAA,EACA,yCAAA,GAAsD,IACtD,WAAA,EACA;AACA,EAAA,MAAM,yBAAmC,EAAC;AAC1C,EAAA,MAAM,aAAA,GAAgB,WAAA,EAAa,WAAA,IAAe,WAAA,EAAa,KAAA,IAAS,EAAA;AACxE,EAAA,KAAA,MAAW,aAAa,UAAA,EAAY;AAClC,IAAA,IAAI,yCAAA,CAA0C,QAAA,CAAS,SAAA,CAAU,EAAE,CAAA,EAAG;AACpE,MAAA,sBAAA,CAAuB,IAAA,CAAK;AAAA,QAC1B,GAAG,SAAA;AAAA,QACH,WAAA,sBAAiB,IAAA,EAAK;AAAA,QACtB;AAAA,OACD,CAAA;AACD,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,YAAY,UAAA,CAAW,IAAA,CAAK,OAAK,CAAA,CAAE,EAAA,KAAO,UAAU,EAAE,CAAA;AAC5D,IAAA,IAAI,SAAA,IAAa,cAAA,CAAe,SAAA,EAAW,SAAS,CAAA,EAAG;AACrD,MAAA,sBAAA,CAAuB,IAAA,CAAK,EAAE,GAAG,SAAA,EAAW,CAAA;AAAA,IAC9C,CAAA,MAAO;AACL,MAAA,sBAAA,CAAuB,IAAA,CAAK;AAAA,QAC1B,GAAG,SAAA;AAAA,QACH,WAAA,sBAAiB,IAAA,EAAK;AAAA,QACtB;AAAA,OACD,CAAA;AAAA,IACH;AAAA,EACF;AACA,EAAA,OAAO,sBAAA;AACT;AAEO,SAAS,iBAAiB,MAAA,EAAgB;AAC/C,EAAA,MAAM,mBAAA,GAAsB,OAAO,WAAA,GAC/B,kBAAA,CAAmB,IAAI,IAAA,CAAK,MAAA,CAAO,WAAW,CAAC,CAAA,GAC/C,IAAA;AAEJ,EAAA,MAAM,SACJ,mBAAA,KAAwB,IAAA,GACpB,sBAAA,CAAuB,mBAAmB,IAC1C,iBAAA,CAAkB,aAAA;AACxB,EAAA,OAAO,MAAA;AACT;;;;"}
1
+ {"version":3,"file":"actions.esm.js","sources":["../../src/utils/actions.ts"],"sourcesContent":["import { Action } from './types.ts';\nimport { ActionStatusOptions } from './constants.ts';\nimport {\n calculateDaysSince,\n calculateUpdatedStatus,\n UpdatedStatusEnum,\n} from './utilityfunctions.ts';\nimport { ProfileInfo } from '@backstage/core-plugin-api';\n\nexport function filterActionsByRelevance(\n actions: Action[],\n showOnlyRelevant: boolean,\n) {\n return actions.filter(action =>\n showOnlyRelevant ? action.status !== ActionStatusOptions.NotRelevant : true,\n );\n}\n\nfunction isActionsEqual(a: Action, b: Action) {\n if (\n a.ID !== b.ID ||\n a.title !== b.title ||\n a.description !== b.description ||\n a.status !== b.status ||\n a.url !== b.url\n )\n return false;\n\n if (a.lastUpdated === b.lastUpdated) return true;\n if (!a.lastUpdated || !b.lastUpdated) return false;\n return a.lastUpdated.getTime() === b.lastUpdated.getTime();\n}\n\nexport function getActionsWithLastUpdated(\n oldActions: Action[],\n newActions: Action[],\n idsOfActionsToForceUpdateLastUpdatedValue: string[] = [],\n profileInfo?: ProfileInfo,\n) {\n const actionsWithLastUpdated: Action[] = [];\n const lastUpdatedBy = profileInfo?.displayName || profileInfo?.email || '';\n for (const newAction of newActions) {\n if (idsOfActionsToForceUpdateLastUpdatedValue.includes(newAction.ID)) {\n actionsWithLastUpdated.push({\n ...newAction,\n lastUpdated: new Date(),\n lastUpdatedBy: lastUpdatedBy,\n });\n continue;\n }\n\n const oldAction = oldActions.find(a => a.ID === newAction.ID);\n if (oldAction && isActionsEqual(newAction, oldAction)) {\n actionsWithLastUpdated.push({ ...newAction });\n } else {\n actionsWithLastUpdated.push({\n ...newAction,\n lastUpdated: new Date(),\n lastUpdatedBy: lastUpdatedBy,\n });\n }\n }\n return actionsWithLastUpdated;\n}\n\nexport function getUpdatedStatus(action: Action) {\n const daysSinceLastUpdate = action.lastUpdated\n ? calculateDaysSince(new Date(action.lastUpdated))\n : null;\n\n const status =\n daysSinceLastUpdate !== null\n ? calculateUpdatedStatus(daysSinceLastUpdate)\n : UpdatedStatusEnum.VERY_OUTDATED;\n return status;\n}\n"],"names":[],"mappings":";;;AASO,SAAS,wBAAA,CACd,SACA,gBAAA,EACA;AACA,EAAA,OAAO,OAAA,CAAQ,MAAA;AAAA,IAAO,CAAA,MAAA,KACpB,gBAAA,GAAmB,MAAA,CAAO,MAAA,KAAW,oBAAoB,WAAA,GAAc;AAAA,GACzE;AACF;AAEA,SAAS,cAAA,CAAe,GAAW,CAAA,EAAW;AAC5C,EAAA,IACE,EAAE,EAAA,KAAO,CAAA,CAAE,MACX,CAAA,CAAE,KAAA,KAAU,EAAE,KAAA,IACd,CAAA,CAAE,WAAA,KAAgB,CAAA,CAAE,eACpB,CAAA,CAAE,MAAA,KAAW,EAAE,MAAA,IACf,CAAA,CAAE,QAAQ,CAAA,CAAE,GAAA;AAEZ,IAAA,OAAO,KAAA;AAET,EAAA,IAAI,CAAA,CAAE,WAAA,KAAgB,CAAA,CAAE,WAAA,EAAa,OAAO,IAAA;AAC5C,EAAA,IAAI,CAAC,CAAA,CAAE,WAAA,IAAe,CAAC,CAAA,CAAE,aAAa,OAAO,KAAA;AAC7C,EAAA,OAAO,EAAE,WAAA,CAAY,OAAA,EAAQ,KAAM,CAAA,CAAE,YAAY,OAAA,EAAQ;AAC3D;AAEO,SAAS,0BACd,UAAA,EACA,UAAA,EACA,yCAAA,GAAsD,IACtD,WAAA,EACA;AACA,EAAA,MAAM,yBAAmC,EAAC;AAC1C,EAAA,MAAM,aAAA,GAAgB,WAAA,EAAa,WAAA,IAAe,WAAA,EAAa,KAAA,IAAS,EAAA;AACxE,EAAA,KAAA,MAAW,aAAa,UAAA,EAAY;AAClC,IAAA,IAAI,yCAAA,CAA0C,QAAA,CAAS,SAAA,CAAU,EAAE,CAAA,EAAG;AACpE,MAAA,sBAAA,CAAuB,IAAA,CAAK;AAAA,QAC1B,GAAG,SAAA;AAAA,QACH,WAAA,sBAAiB,IAAA,EAAK;AAAA,QACtB;AAAA,OACD,CAAA;AACD,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,YAAY,UAAA,CAAW,IAAA,CAAK,OAAK,CAAA,CAAE,EAAA,KAAO,UAAU,EAAE,CAAA;AAC5D,IAAA,IAAI,SAAA,IAAa,cAAA,CAAe,SAAA,EAAW,SAAS,CAAA,EAAG;AACrD,MAAA,sBAAA,CAAuB,IAAA,CAAK,EAAE,GAAG,SAAA,EAAW,CAAA;AAAA,IAC9C,CAAA,MAAO;AACL,MAAA,sBAAA,CAAuB,IAAA,CAAK;AAAA,QAC1B,GAAG,SAAA;AAAA,QACH,WAAA,sBAAiB,IAAA,EAAK;AAAA,QACtB;AAAA,OACD,CAAA;AAAA,IACH;AAAA,EACF;AACA,EAAA,OAAO,sBAAA;AACT;AAEO,SAAS,iBAAiB,MAAA,EAAgB;AAC/C,EAAA,MAAM,mBAAA,GAAsB,OAAO,WAAA,GAC/B,kBAAA,CAAmB,IAAI,IAAA,CAAK,MAAA,CAAO,WAAW,CAAC,CAAA,GAC/C,IAAA;AAEJ,EAAA,MAAM,SACJ,mBAAA,KAAwB,IAAA,GACpB,sBAAA,CAAuB,mBAAmB,IAC1C,iBAAA,CAAkB,aAAA;AACxB,EAAA,OAAO,MAAA;AACT;;;;"}
@@ -41,23 +41,31 @@ function buildFetchRiScErrorMessages(errorRiScs, t) {
41
41
  );
42
42
  const messages = [];
43
43
  if (withErrorCode.length > 0) {
44
- const decryptionErrorsByMessage = withErrorCode.reduce(
44
+ const groups = withErrorCode.reduce(
45
45
  (acc, risk) => {
46
- const message = risk.errorCode;
47
- if (!acc[message]) acc[message] = [];
48
- acc[message].push(risk.riScId);
46
+ const groupKey = `${risk.errorCode}__${risk.encryptionKeyId ?? ""}`;
47
+ if (!acc[groupKey]) acc[groupKey] = [];
48
+ acc[groupKey].push(risk);
49
49
  return acc;
50
50
  },
51
51
  {}
52
52
  );
53
- Object.entries(decryptionErrorsByMessage).forEach(
54
- ([message, ids]) => {
55
- const errorKey2 = `errorMessages.ContentStatusDecryptionFailedMessage.${message}`;
53
+ Object.values(groups).forEach((group) => {
54
+ const { errorCode, encryptionKeyId } = group[0];
55
+ const groupRiScIds = group.map((r) => r.riScId).join(", ");
56
+ if (encryptionKeyId) {
57
+ const keyId = encryptionKeyId.split("/").pop() ?? encryptionKeyId;
58
+ const errorKey2 = group.length === 1 ? "errorMessages.ContentStatusDecryptionFailedMessage.WITH_KEY_SINGLE" : "errorMessages.ContentStatusDecryptionFailedMessage.WITH_KEY_PLURAL";
56
59
  messages.push(
57
- t(errorKey2, { riScId: ids.join(", "), status })
60
+ t(errorKey2, { riScId: groupRiScIds, keyId })
61
+ );
62
+ } else {
63
+ const errorKey2 = `errorMessages.ContentStatusDecryptionFailedMessage.${errorCode}`;
64
+ messages.push(
65
+ t(errorKey2, { riScId: groupRiScIds, status })
58
66
  );
59
67
  }
60
- );
68
+ });
61
69
  }
62
70
  if (withoutErrorCode.length > 0) {
63
71
  const errorKey2 = `errorMessages.ContentStatus${statusKey}`;
@@ -1 +1 @@
1
- {"version":3,"file":"fetchRiScHelpers.esm.js","sources":["../../src/utils/fetchRiScHelpers.ts"],"sourcesContent":["import { dtoToRiSc, RiScContentResultDTO, RiScDTO } from './DTOs';\nimport { ContentStatus, RiScWithMetadata } from './types';\n\n/**\n * Maps a RiScContentResultDTO to a RiScWithMetadata object.\n * Used when converting the raw API response to the internal representation.\n */\nexport function mapRiScDtoToRiScWithMetadata(\n dto: RiScContentResultDTO,\n): RiScWithMetadata {\n const json = JSON.parse(dto.riScContent) as RiScDTO;\n const content = dtoToRiSc(json);\n return {\n id: dto.riScId,\n content,\n sopsConfig: dto.sopsConfig,\n status: dto.riScStatus,\n pullRequestUrl: dto.pullRequestUrl,\n migrationStatus: dto.migrationStatus,\n lastPublished: dto.lastPublished,\n };\n}\n\n/**\n * Appends a \"login rejected\" suffix to a status message when the request was\n * rejected due to login issues. This is a recurring pattern used across all\n * error callbacks from the authenticated fetch hooks.\n */\nexport function withLoginRejected(\n baseMessage: string,\n loginRejected: boolean,\n t: (key: any, options?: any) => string,\n): string {\n return loginRejected\n ? `${baseMessage}. ${t('dictionary.rejectedLogin')}`\n : baseMessage;\n}\n\n/**\n * Builds readable error message string from a list of RiScs that\n * failed to load. Groups them by ContentStatus and produces one line per\n * group, with special handling for DecryptionFailed entries that carry an\n * errorCode.\n */\nexport function buildFetchRiScErrorMessages(\n errorRiScs: RiScContentResultDTO[],\n t: (key: any, options?: any) => string,\n): string {\n const errorsByStatus = errorRiScs.reduce(\n (acc, risk) => {\n if (!acc[risk.status]) {\n acc[risk.status] = [];\n }\n acc[risk.status].push(risk.riScId);\n return acc;\n },\n {} as Record<ContentStatus, string[]>,\n );\n\n return Object.entries(errorsByStatus)\n .map(([status, riScIds]) => {\n // Fallback to Failure for unknown status values\n const validStatuses = Object.values(ContentStatus);\n const statusKey = validStatuses.includes(status as ContentStatus)\n ? status\n : ContentStatus.Failure;\n\n if (statusKey === ContentStatus.DecryptionFailed) {\n const decryptionRisks = errorRiScs.filter(\n risk =>\n risk.status === ContentStatus.DecryptionFailed &&\n riScIds.includes(risk.riScId),\n );\n\n const withErrorCode = decryptionRisks.filter(risk => risk.errorCode);\n const withoutErrorCode = decryptionRisks.filter(\n risk => !risk.errorCode,\n );\n\n const messages: string[] = [];\n\n if (withErrorCode.length > 0) {\n const decryptionErrorsByMessage = withErrorCode.reduce(\n (acc, risk) => {\n const message = risk.errorCode!;\n if (!acc[message]) acc[message] = [];\n acc[message].push(risk.riScId);\n return acc;\n },\n {} as Record<string, string[]>,\n );\n\n Object.entries(decryptionErrorsByMessage).forEach(\n ([message, ids]) => {\n const errorKey = `errorMessages.ContentStatusDecryptionFailedMessage.${message}`;\n messages.push(\n t(errorKey as any, { riScId: ids.join(', '), status }),\n );\n },\n );\n }\n\n if (withoutErrorCode.length > 0) {\n const errorKey = `errorMessages.ContentStatus${statusKey}`;\n messages.push(\n t(errorKey as any, {\n riScId: withoutErrorCode.map(r => r.riScId).join(', '),\n status,\n }),\n );\n }\n\n return messages.join('\\n');\n }\n\n const errorKey = `errorMessages.ContentStatus${statusKey}`;\n return t(errorKey as any, {\n riScId: (riScIds as string[]).join(', '),\n status,\n });\n })\n .join('\\n');\n}\n"],"names":["errorKey"],"mappings":"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"}
1
+ {"version":3,"file":"fetchRiScHelpers.esm.js","sources":["../../src/utils/fetchRiScHelpers.ts"],"sourcesContent":["import { dtoToRiSc, RiScContentResultDTO, RiScDTO } from './DTOs';\nimport { ContentStatus, RiScWithMetadata } from './types';\n\n/**\n * Maps a RiScContentResultDTO to a RiScWithMetadata object.\n * Used when converting the raw API response to the internal representation.\n */\nexport function mapRiScDtoToRiScWithMetadata(\n dto: RiScContentResultDTO,\n): RiScWithMetadata {\n const json = JSON.parse(dto.riScContent) as RiScDTO;\n const content = dtoToRiSc(json);\n return {\n id: dto.riScId,\n content,\n sopsConfig: dto.sopsConfig,\n status: dto.riScStatus,\n pullRequestUrl: dto.pullRequestUrl,\n migrationStatus: dto.migrationStatus,\n lastPublished: dto.lastPublished,\n };\n}\n\n/**\n * Appends a \"login rejected\" suffix to a status message when the request was\n * rejected due to login issues. This is a recurring pattern used across all\n * error callbacks from the authenticated fetch hooks.\n */\nexport function withLoginRejected(\n baseMessage: string,\n loginRejected: boolean,\n t: (key: any, options?: any) => string,\n): string {\n return loginRejected\n ? `${baseMessage}. ${t('dictionary.rejectedLogin')}`\n : baseMessage;\n}\n\n/**\n * Builds readable error message string from a list of RiScs that\n * failed to load. Groups them by ContentStatus and produces one line per\n * group, with special handling for DecryptionFailed entries that carry an\n * errorCode.\n */\nexport function buildFetchRiScErrorMessages(\n errorRiScs: RiScContentResultDTO[],\n t: (key: any, options?: any) => string,\n): string {\n const errorsByStatus = errorRiScs.reduce(\n (acc, risk) => {\n if (!acc[risk.status]) {\n acc[risk.status] = [];\n }\n acc[risk.status].push(risk.riScId);\n return acc;\n },\n {} as Record<ContentStatus, string[]>,\n );\n\n return Object.entries(errorsByStatus)\n .map(([status, riScIds]) => {\n // Fallback to Failure for unknown status values\n const validStatuses = Object.values(ContentStatus);\n const statusKey = validStatuses.includes(status as ContentStatus)\n ? status\n : ContentStatus.Failure;\n\n if (statusKey === ContentStatus.DecryptionFailed) {\n const decryptionRisks = errorRiScs.filter(\n risk =>\n risk.status === ContentStatus.DecryptionFailed &&\n riScIds.includes(risk.riScId),\n );\n\n const withErrorCode = decryptionRisks.filter(risk => risk.errorCode);\n const withoutErrorCode = decryptionRisks.filter(\n risk => !risk.errorCode,\n );\n\n const messages: string[] = [];\n\n if (withErrorCode.length > 0) {\n const groups = withErrorCode.reduce(\n (acc, risk) => {\n const groupKey = `${risk.errorCode}__${risk.encryptionKeyId ?? ''}`;\n if (!acc[groupKey]) acc[groupKey] = [];\n acc[groupKey].push(risk);\n return acc;\n },\n {} as Record<string, RiScContentResultDTO[]>,\n );\n\n Object.values(groups).forEach(group => {\n const { errorCode, encryptionKeyId } = group[0];\n const groupRiScIds = group.map(r => r.riScId).join(', ');\n if (encryptionKeyId) {\n const keyId = encryptionKeyId.split('/').pop() ?? encryptionKeyId;\n const errorKey =\n group.length === 1\n ? 'errorMessages.ContentStatusDecryptionFailedMessage.WITH_KEY_SINGLE'\n : 'errorMessages.ContentStatusDecryptionFailedMessage.WITH_KEY_PLURAL';\n messages.push(\n t(errorKey as any, { riScId: groupRiScIds, keyId }),\n );\n } else {\n const errorKey = `errorMessages.ContentStatusDecryptionFailedMessage.${errorCode}`;\n messages.push(\n t(errorKey as any, { riScId: groupRiScIds, status }),\n );\n }\n });\n }\n\n if (withoutErrorCode.length > 0) {\n const errorKey = `errorMessages.ContentStatus${statusKey}`;\n messages.push(\n t(errorKey as any, {\n riScId: withoutErrorCode.map(r => r.riScId).join(', '),\n status,\n }),\n );\n }\n\n return messages.join('\\n');\n }\n\n const errorKey = `errorMessages.ContentStatus${statusKey}`;\n return t(errorKey as any, {\n riScId: (riScIds as string[]).join(', '),\n status,\n });\n })\n .join('\\n');\n}\n"],"names":["errorKey"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"scenario.esm.js","sources":["../../src/utils/scenario.ts"],"sourcesContent":["import { RiScWithMetadata, Scenario } from './types.ts';\nimport {\n calculateDaysSince,\n calculateUpdatedStatus,\n UpdatedStatusEnum,\n UpdatedStatusEnumType,\n} from './utilityfunctions.ts';\nimport { ActionStatusOptions } from './constants.ts';\n\nexport type ScenarioSortingOptions =\n | 'NoSorting'\n | 'TitleAlphabetical'\n | 'HighestInitialRisk'\n | 'MostImplementedActions'\n | 'MostRemainingActions';\n\nexport function toScenarioSortingOption(\n value: string | null | undefined,\n): ScenarioSortingOptions {\n if (!value) return 'NoSorting';\n const valid: ScenarioSortingOptions[] = [\n 'NoSorting',\n 'TitleAlphabetical',\n 'HighestInitialRisk',\n 'MostImplementedActions',\n 'MostRemainingActions',\n ];\n\n return valid.includes(value as ScenarioSortingOptions)\n ? (value as ScenarioSortingOptions)\n : 'NoSorting';\n}\n\nexport function getScenarioOfIdFromRiSc(\n id: string,\n riSc: RiScWithMetadata | null,\n): Scenario | null {\n const oldScenario = riSc?.content.scenarios.find(s => s.ID === id);\n return oldScenario ?? null;\n}\n\n/**\n * The function does the following:\n * 1) Remove all actions not matching search query\n * 2) Remove all actions not matching updated-status filter\n * 3) Remove scenarios with no remaining actions after 1) and 2)\n *\n * @param scenarios\n * @param visibleUpdatedStatus\n * @param actionSearchQuery\n *\n * @return A map where a scenarioId is mapped to a list of actionIds\n */\nexport function getFilteredActionsForScenarios(\n scenarios: Scenario[],\n visibleUpdatedStatus: UpdatedStatusEnumType | null | undefined,\n actionSearchQuery: string,\n): Map<string, string[]> {\n const scenarioFilteredActionsMap = new Map<string, string[]>();\n\n scenarios.forEach(scenario => {\n const actions = [...scenario.actions];\n\n const filteredActions = actions\n // Remove actions not matching search query\n .filter(\n action =>\n !actionSearchQuery ||\n action.title.toLowerCase().includes(actionSearchQuery.toLowerCase()),\n )\n // Remove actions not matching chosen updated status\n .filter(action => {\n if (!visibleUpdatedStatus) return true;\n\n const daysSinceLastUpdate = action.lastUpdated\n ? calculateDaysSince(new Date(action.lastUpdated))\n : null;\n\n const updatedStatus =\n daysSinceLastUpdate !== null\n ? calculateUpdatedStatus(daysSinceLastUpdate)\n : UpdatedStatusEnum.VERY_OUTDATED;\n\n return updatedStatus === visibleUpdatedStatus;\n });\n scenarioFilteredActionsMap.set(\n scenario.ID,\n filteredActions.map(action => action.ID),\n );\n });\n\n // Remove scenarios with no actions\n scenarioFilteredActionsMap.forEach((actions, scenarioId) => {\n if (actions.length === 0) {\n scenarioFilteredActionsMap.delete(scenarioId);\n }\n });\n\n return scenarioFilteredActionsMap;\n}\n\nexport function getSortedScenarios(\n scenarios: Scenario[],\n sortOrder: ScenarioSortingOptions,\n) {\n const sortedScenarios = [...scenarios];\n\n if (sortOrder !== 'NoSorting') {\n sortedScenarios.sort((a, b) => {\n switch (sortOrder) {\n case 'TitleAlphabetical':\n return a.title.localeCompare(b.title, 'en');\n\n case 'HighestInitialRisk':\n return (\n b.risk.consequence * b.risk.probability -\n a.risk.consequence * a.risk.probability\n );\n\n case 'MostImplementedActions':\n return (\n b.actions.filter(status => status.status === ActionStatusOptions.OK)\n .length -\n a.actions.filter(status => status.status === ActionStatusOptions.OK)\n .length\n );\n\n case 'MostRemainingActions': {\n const remainingA = a.actions.filter(\n action =>\n action.status !== ActionStatusOptions.OK &&\n action.status !== ActionStatusOptions.NotRelevant,\n ).length;\n const remainingB = b.actions.filter(\n action =>\n action.status !== ActionStatusOptions.OK &&\n action.status !== ActionStatusOptions.NotRelevant,\n ).length;\n return remainingB - remainingA;\n }\n\n default:\n return 0;\n }\n });\n }\n return sortedScenarios;\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"scenario.esm.js","sources":["../../src/utils/scenario.ts"],"sourcesContent":["import { RiScWithMetadata, Scenario } from './types.ts';\nimport {\n calculateDaysSince,\n calculateUpdatedStatus,\n UpdatedStatusEnum,\n UpdatedStatusEnumType,\n} from './utilityfunctions.ts';\nimport { ActionStatusOptions } from './constants.ts';\n\ntype ScenarioSortingOptions =\n | 'NoSorting'\n | 'TitleAlphabetical'\n | 'HighestInitialRisk'\n | 'MostImplementedActions'\n | 'MostRemainingActions';\n\nexport function toScenarioSortingOption(\n value: string | null | undefined,\n): ScenarioSortingOptions {\n if (!value) return 'NoSorting';\n const valid: ScenarioSortingOptions[] = [\n 'NoSorting',\n 'TitleAlphabetical',\n 'HighestInitialRisk',\n 'MostImplementedActions',\n 'MostRemainingActions',\n ];\n\n return valid.includes(value as ScenarioSortingOptions)\n ? (value as ScenarioSortingOptions)\n : 'NoSorting';\n}\n\nexport function getScenarioOfIdFromRiSc(\n id: string,\n riSc: RiScWithMetadata | null,\n): Scenario | null {\n const oldScenario = riSc?.content.scenarios.find(s => s.ID === id);\n return oldScenario ?? null;\n}\n\n/**\n * The function does the following:\n * 1) Remove all actions not matching search query\n * 2) Remove all actions not matching updated-status filter\n * 3) Remove scenarios with no remaining actions after 1) and 2)\n *\n * @param scenarios\n * @param visibleUpdatedStatus\n * @param actionSearchQuery\n *\n * @return A map where a scenarioId is mapped to a list of actionIds\n */\nexport function getFilteredActionsForScenarios(\n scenarios: Scenario[],\n visibleUpdatedStatus: UpdatedStatusEnumType | null | undefined,\n actionSearchQuery: string,\n): Map<string, string[]> {\n const scenarioFilteredActionsMap = new Map<string, string[]>();\n\n scenarios.forEach(scenario => {\n const actions = [...scenario.actions];\n\n const filteredActions = actions\n // Remove actions not matching search query\n .filter(\n action =>\n !actionSearchQuery ||\n action.title.toLowerCase().includes(actionSearchQuery.toLowerCase()),\n )\n // Remove actions not matching chosen updated status\n .filter(action => {\n if (!visibleUpdatedStatus) return true;\n\n const daysSinceLastUpdate = action.lastUpdated\n ? calculateDaysSince(new Date(action.lastUpdated))\n : null;\n\n const updatedStatus =\n daysSinceLastUpdate !== null\n ? calculateUpdatedStatus(daysSinceLastUpdate)\n : UpdatedStatusEnum.VERY_OUTDATED;\n\n return updatedStatus === visibleUpdatedStatus;\n });\n scenarioFilteredActionsMap.set(\n scenario.ID,\n filteredActions.map(action => action.ID),\n );\n });\n\n // Remove scenarios with no actions\n scenarioFilteredActionsMap.forEach((actions, scenarioId) => {\n if (actions.length === 0) {\n scenarioFilteredActionsMap.delete(scenarioId);\n }\n });\n\n return scenarioFilteredActionsMap;\n}\n\nexport function getSortedScenarios(\n scenarios: Scenario[],\n sortOrder: ScenarioSortingOptions,\n) {\n const sortedScenarios = [...scenarios];\n\n if (sortOrder !== 'NoSorting') {\n sortedScenarios.sort((a, b) => {\n switch (sortOrder) {\n case 'TitleAlphabetical':\n return a.title.localeCompare(b.title, 'en');\n\n case 'HighestInitialRisk':\n return (\n b.risk.consequence * b.risk.probability -\n a.risk.consequence * a.risk.probability\n );\n\n case 'MostImplementedActions':\n return (\n b.actions.filter(status => status.status === ActionStatusOptions.OK)\n .length -\n a.actions.filter(status => status.status === ActionStatusOptions.OK)\n .length\n );\n\n case 'MostRemainingActions': {\n const remainingA = a.actions.filter(\n action =>\n action.status !== ActionStatusOptions.OK &&\n action.status !== ActionStatusOptions.NotRelevant,\n ).length;\n const remainingB = b.actions.filter(\n action =>\n action.status !== ActionStatusOptions.OK &&\n action.status !== ActionStatusOptions.NotRelevant,\n ).length;\n return remainingB - remainingA;\n }\n\n default:\n return 0;\n }\n });\n }\n return sortedScenarios;\n}\n"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"threatActorsAndVulnerabilities.esm.js","sources":["../../src/utils/threatActorsAndVulnerabilities.ts"],"sourcesContent":["import { Scenario } from './types.ts';\nimport { ThreatActorsOptions, VulnerabilitiesOptions } from './constants.ts';\n\nexport enum CoverageType {\n ThreatActor,\n Vulnerability,\n}\n\ntype ScenarioCoverageCounts = {\n threatActors: Map<ThreatActorsOptions, number>;\n vulnerabilities: Map<VulnerabilitiesOptions, number>;\n};\n\nexport function countScenarioCoverage(scenarios: Scenario[]) {\n const coverageMap: ScenarioCoverageCounts = {\n threatActors: new Map(),\n vulnerabilities: new Map(),\n };\n\n Object.values(ThreatActorsOptions).forEach(threatActor => {\n coverageMap.threatActors.set(threatActor, 0);\n });\n\n Object.values(VulnerabilitiesOptions).forEach(vuln => {\n coverageMap.vulnerabilities.set(vuln, 0);\n });\n\n scenarios.forEach(scenario => {\n scenario.threatActors.forEach(threatActor => {\n const key = threatActor as ThreatActorsOptions;\n coverageMap.threatActors.set(\n key,\n (coverageMap.threatActors.get(key) ?? 0) + 1,\n );\n });\n });\n\n scenarios.forEach(scenario => {\n scenario.vulnerabilities.forEach(vuln => {\n const key = vuln as VulnerabilitiesOptions;\n coverageMap.vulnerabilities.set(\n key,\n (coverageMap.vulnerabilities.get(key) ?? 0) + 1,\n );\n });\n });\n\n return coverageMap;\n}\n\nexport function getNotCovered(coverageMap: Map<string, number>): string[] {\n return Array.from(coverageMap.entries())\n .filter(([, count]) => count === 0)\n .map(([key]) => key);\n}\n\ntype ScenarioCoverage = {\n covered: number;\n total: number;\n};\n\nexport type ScenarioCoverageSummary = {\n threatActors: ScenarioCoverage;\n vulnerabilities: ScenarioCoverage;\n};\n\nexport function countScenarioCoverageSummary(\n scenarios: Scenario[],\n): ScenarioCoverageSummary {\n const scenarioCoverage = countScenarioCoverage(scenarios);\n\n return {\n threatActors: {\n covered: Array.from(scenarioCoverage.threatActors.values()).reduce(\n (sum, item) => sum + Number(item > 0),\n 0,\n ),\n total: scenarioCoverage.threatActors.size,\n },\n vulnerabilities: {\n covered: Array.from(scenarioCoverage.vulnerabilities.values()).reduce(\n (sum, item) => sum + Number(item > 0),\n 0,\n ),\n total: scenarioCoverage.vulnerabilities.size,\n },\n };\n}\n"],"names":["CoverageType"],"mappings":"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"}
1
+ {"version":3,"file":"threatActorsAndVulnerabilities.esm.js","sources":["../../src/utils/threatActorsAndVulnerabilities.ts"],"sourcesContent":["import { Scenario } from './types.ts';\nimport { ThreatActorsOptions, VulnerabilitiesOptions } from './constants.ts';\n\nexport enum CoverageType {\n ThreatActor,\n Vulnerability,\n}\n\ntype ScenarioCoverageCounts = {\n threatActors: Map<ThreatActorsOptions, number>;\n vulnerabilities: Map<VulnerabilitiesOptions, number>;\n};\n\nexport function countScenarioCoverage(scenarios: Scenario[]) {\n const coverageMap: ScenarioCoverageCounts = {\n threatActors: new Map(),\n vulnerabilities: new Map(),\n };\n\n Object.values(ThreatActorsOptions).forEach(threatActor => {\n coverageMap.threatActors.set(threatActor, 0);\n });\n\n Object.values(VulnerabilitiesOptions).forEach(vuln => {\n coverageMap.vulnerabilities.set(vuln, 0);\n });\n\n scenarios.forEach(scenario => {\n scenario.threatActors.forEach(threatActor => {\n const key = threatActor as ThreatActorsOptions;\n coverageMap.threatActors.set(\n key,\n (coverageMap.threatActors.get(key) ?? 0) + 1,\n );\n });\n });\n\n scenarios.forEach(scenario => {\n scenario.vulnerabilities.forEach(vuln => {\n const key = vuln as VulnerabilitiesOptions;\n coverageMap.vulnerabilities.set(\n key,\n (coverageMap.vulnerabilities.get(key) ?? 0) + 1,\n );\n });\n });\n\n return coverageMap;\n}\n\nexport function getNotCovered(coverageMap: Map<string, number>): string[] {\n return Array.from(coverageMap.entries())\n .filter(([, count]) => count === 0)\n .map(([key]) => key);\n}\n\ntype ScenarioCoverage = {\n covered: number;\n total: number;\n};\n\ntype ScenarioCoverageSummary = {\n threatActors: ScenarioCoverage;\n vulnerabilities: ScenarioCoverage;\n};\n\nexport function countScenarioCoverageSummary(\n scenarios: Scenario[],\n): ScenarioCoverageSummary {\n const scenarioCoverage = countScenarioCoverage(scenarios);\n\n return {\n threatActors: {\n covered: Array.from(scenarioCoverage.threatActors.values()).reduce(\n (sum, item) => sum + Number(item > 0),\n 0,\n ),\n total: scenarioCoverage.threatActors.size,\n },\n vulnerabilities: {\n covered: Array.from(scenarioCoverage.vulnerabilities.values()).reduce(\n (sum, item) => sum + Number(item > 0),\n 0,\n ),\n total: scenarioCoverage.vulnerabilities.size,\n },\n };\n}\n"],"names":["CoverageType"],"mappings":"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"}
@@ -651,8 +651,11 @@ const pluginRiScMessages = {
651
651
  INVALID_GCP_TOKEN: 'Failed to decrypt risk scorecard "{{riScId}}", your Google Cloud token is invalid or expired.',
652
652
  INVALID_AGE_KEY: 'Failed to decrypt risk scorecard "{{riScId}}", the provided Age key is invalid.',
653
653
  CONNECTION_REFUSED: 'Failed to decrypt risk scorecard "{{riScId}}", unable to connect to the encryption service.',
654
+ WITH_KEY_SINGLE: 'Failed to decrypt RoS-analysis "{{riScId}}" \u2013 no access to key: {{keyId}}',
655
+ WITH_KEY_PLURAL: 'Failed to decrypt RoS-analyses "{{riScId}}" \u2013 no access to key: {{keyId}}',
654
656
  UNKNOWN: 'Failed to decrypt risk scorecard "{{riScId}}" due to an unknown error.'
655
- }
657
+ },
658
+ EncryptedWithKey: "This analysis is encrypted with key {{keyId}}"
656
659
  },
657
660
  infoMessages: {
658
661
  OpenedPullRequest: "Successfully opened pull request",
@@ -1162,22 +1165,25 @@ const pluginRiScNorwegianTranslation = createTranslationResource({
1162
1165
  "errorMessages.FailedToCreateSops": "Kunne ikke opprette SOPS-konfigurasjon",
1163
1166
  "errorMessages.FailedToUpdateSops": "SOPS-konfigurasjon kunne ikke oppdateres",
1164
1167
  "errorMessages.ErrorWhenFetchingGcpCryptoKeys": "Kunne ikke laste inn risiko- og s\xE5rbarhetsanalysene \u2014 krypteringstjenesten er ikke tilgjengelig. Pr\xF8v \xE5 oppdatere siden.",
1165
- "errorMessages.ContentStatusDeleted": 'Risiko- og s\xE5rbarhetsanalyse "{{riScId}}" har blitt slettet',
1166
- "errorMessages.ContentStatusFailure": 'Kunne ikke laste risiko- og s\xE5rbarhetsanalyse "{{riScId}}" grunnet en uventet feil',
1167
- "errorMessages.ContentStatusFileNotFound": 'Risiko- og s\xE5rbarhetsanalyse "{{riScId}}" ble ikke funnet i repositoryet',
1168
- "errorMessages.ContentStatusDecryptionFailed": 'Kunne ikke dekryptere risiko- og s\xE5rbarhetsanalyse "{{riScId}}". Du har muligens ikke de n\xF8dvendige dekrypteringsn\xF8klene',
1169
- "errorMessages.ContentStatusNoReadAccess": 'Du har ikke lesetilgang til risiko- og s\xE5rbarhetsanalyse "{{riScId}}". ',
1170
- "errorMessages.ContentStatusUnsupportedMigration": 'Risiko- og s\xE5rbarhetsanalyse "{{riScId}}" kan ikke automatisk migreres til den nyeste versjonen.',
1171
- "errorMessages.ContentStatusSchemaValidationFailed": 'Risiko- og s\xE5rbarhetsanalyse "{{riScId}}" kunne ikke lastes fordi innholdet ikke samsvarer med forventet format. Den kan ha blitt manuelt redigert eller \xF8delagt.',
1172
- "errorMessages.ContentStatusDecryptionFailedMessage.INTERNAL_SERVER_ERROR": 'Kunne ikke dekryptere risiko- og s\xE5rbarhetsanalyse "{{riScId}}", 500 - Intern serverfeil fra kryptotjenesten.',
1173
- "errorMessages.ContentStatusDecryptionFailedMessage.MISSING_DATA_KEY": 'Kunne ikke dekryptere risiko- og s\xE5rbarhetsanalyse "{{riScId}}", kunne ikke f\xE5 tilgang til krypteringsn\xF8kkelen som kreves for dekryptering.',
1174
- "errorMessages.ContentStatusDecryptionFailedMessage.NO_MATCHING_KEY": 'Kunne ikke dekryptere risiko- og s\xE5rbarhetsanalyse "{{riScId}}", ingen tilgjengelig n\xF8kkel kunne dekryptere innholdet.',
1175
- "errorMessages.ContentStatusDecryptionFailedMessage.AUTHENTICATION_FAILED": 'Kunne ikke dekryptere risiko- og s\xE5rbarhetsanalyse "{{riScId}}", autentisering mislyktes. Vennligst kontroller tilgangene dine.',
1176
- "errorMessages.ContentStatusDecryptionFailedMessage.INVALID_GCP_TOKEN": 'Kunne ikke dekryptere risiko- og s\xE5rbarhetsanalyse "{{riScId}}", Google Cloud-tokenet ditt er ugyldig eller utl\xF8pt.',
1177
- "errorMessages.ContentStatusDecryptionFailedMessage.INVALID_AGE_KEY": 'Kunne ikke dekryptere risiko- og s\xE5rbarhetsanalyse "{{riScId}}", den oppgitte AGE-n\xF8kkelen er ugyldig.',
1178
- "errorMessages.ContentStatusDecryptionFailedMessage.CONNECTION_REFUSED": 'Kunne ikke dekryptere risiko- og s\xE5rbarhetsanalyse "{{riScId}}", kunne ikke koble til krypteringstjenesten.',
1179
- "errorMessages.ContentStatusDecryptionFailedMessage.UNKNOWN": 'Kunne ikke dekryptere risiko- og s\xE5rbarhetsanalyse "{{riScId}}" grunnet en ukjent feil.',
1180
- "errorMessages.ContentStatusUnknown": 'Kunne ikke hente risiko- og s\xE5rbarhetsanalyse "{{riScId}}" med ukjent status: {{status}}',
1168
+ "errorMessages.ContentStatusDeleted": 'ROS-analyse "{{riScId}}" har blitt slettet',
1169
+ "errorMessages.ContentStatusFailure": 'Kunne ikke laste ROS-analyse "{{riScId}}" grunnet en uventet feil',
1170
+ "errorMessages.ContentStatusFileNotFound": 'ROS-analyse "{{riScId}}" ble ikke funnet i repositoryet',
1171
+ "errorMessages.ContentStatusDecryptionFailed": 'Kunne ikke dekryptere ROS-analyse "{{riScId}}". Du har muligens ikke de n\xF8dvendige dekrypteringsn\xF8klene',
1172
+ "errorMessages.ContentStatusNoReadAccess": 'Du har ikke lesetilgang til ROS-analyse "{{riScId}}".',
1173
+ "errorMessages.ContentStatusUnsupportedMigration": 'ROS-analyse "{{riScId}}" kan ikke automatisk migreres til den nyeste versjonen.',
1174
+ "errorMessages.ContentStatusSchemaValidationFailed": 'ROS-analyse "{{riScId}}" kunne ikke lastes fordi innholdet ikke samsvarer med forventet format. Den kan ha blitt manuelt redigert eller \xF8delagt.',
1175
+ "errorMessages.ContentStatusDecryptionFailedMessage.INTERNAL_SERVER_ERROR": 'Kunne ikke dekryptere ROS-analyse "{{riScId}}", 500 - Intern serverfeil fra kryptotjenesten.',
1176
+ "errorMessages.ContentStatusDecryptionFailedMessage.MISSING_DATA_KEY": 'Kunne ikke dekryptere ROS-analyse "{{riScId}}", kunne ikke f\xE5 tilgang til krypteringsn\xF8kkelen som kreves for dekryptering.',
1177
+ "errorMessages.ContentStatusDecryptionFailedMessage.NO_MATCHING_KEY": 'Kunne ikke dekryptere ROS-analyse "{{riScId}}", ingen tilgjengelig n\xF8kkel kunne dekryptere innholdet.',
1178
+ "errorMessages.ContentStatusDecryptionFailedMessage.AUTHENTICATION_FAILED": 'Kunne ikke dekryptere ROS-analyse "{{riScId}}", autentisering mislyktes. Vennligst kontroller tilgangene dine.',
1179
+ "errorMessages.ContentStatusDecryptionFailedMessage.INVALID_GCP_TOKEN": 'Kunne ikke dekryptere ROS-analyse "{{riScId}}", Google Cloud-tokenet ditt er ugyldig eller utl\xF8pt.',
1180
+ "errorMessages.ContentStatusDecryptionFailedMessage.INVALID_AGE_KEY": 'Kunne ikke dekryptere ROS-analyse "{{riScId}}", den oppgitte AGE-n\xF8kkelen er ugyldig.',
1181
+ "errorMessages.ContentStatusDecryptionFailedMessage.CONNECTION_REFUSED": 'Kunne ikke dekryptere ROS-analyse "{{riScId}}", kunne ikke koble til krypteringstjenesten.',
1182
+ "errorMessages.ContentStatusDecryptionFailedMessage.WITH_KEY_SINGLE": 'Kunne ikke dekryptere ROS-analyse "{{riScId}}" \u2013 manglende tilgang til n\xF8kkel: {{keyId}}',
1183
+ "errorMessages.ContentStatusDecryptionFailedMessage.WITH_KEY_PLURAL": 'Kunne ikke dekryptere ROS-analyser "{{riScId}}" \u2013 manglende tilgang til n\xF8kkel: {{keyId}}',
1184
+ "errorMessages.ContentStatusDecryptionFailedMessage.UNKNOWN": 'Kunne ikke dekryptere ROS-analyse "{{riScId}}" grunnet en ukjent feil.',
1185
+ "errorMessages.EncryptedWithKey": "Denne analysen er kryptert med n\xF8kkel {{keyId}}",
1186
+ "errorMessages.ContentStatusUnknown": 'Kunne ikke hente ROS-analyse "{{riScId}}" med ukjent status: {{status}}',
1181
1187
  "infoMessages.OpenedPullRequest": "\xC5pnet pull request",
1182
1188
  "infoMessages.CreatedPullRequest": "Godkjenning av risiko- og s\xE5rbarhetsanalysen ble lagret",
1183
1189
  "infoMessages.DeletedRiSc": "Risiko- og s\xE5rbarhetsanalysen ble slettet",