@kartverket/backstage-plugin-risk-scorecard 6.2.4 → 6.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,4 +1,5 @@
1
1
  import { jsxs, jsx } from 'react/jsx-runtime';
2
+ import { RiScStatus } from '../../utils/types.esm.js';
2
3
  import { ActionRow } from './ActionRow.esm.js';
3
4
  import { useState, useCallback, useEffect, Fragment } from 'react';
4
5
  import { isToday } from '../../utils/date.esm.js';
@@ -16,11 +17,12 @@ import { getUpdatedStatus } from '../../utils/actions.esm.js';
16
17
 
17
18
  function ActionRowList(props) {
18
19
  const { t } = useTranslationRef(pluginRiScTranslationRef);
19
- const { selectedRiSc } = useRiScs();
20
+ const { selectedRiSc, showBlockedUpdateError } = useRiScs();
20
21
  const { submitEditedScenarioToRiSc } = useScenario();
21
22
  const { profileInfo } = useBackstageContext();
22
23
  const [pendingActionStatusUpdates, setPendingActionStatusUpdates] = useState({});
23
24
  const [pendingActionUpdatesHistory, setPendingActionUpdatesHistory] = useState([]);
25
+ const isRiScMarkedForDeletion = selectedRiSc?.status === RiScStatus.DeletionDraft || selectedRiSc?.status === RiScStatus.DeletionSentForApproval;
24
26
  const onRefreshActionStatus = (action) => {
25
27
  if (isToday(action.lastUpdated ?? null)) return;
26
28
  setPendingActionUpdatesHistory((prev) => prev.filter((id) => id !== action.ID));
@@ -33,6 +35,10 @@ function ActionRowList(props) {
33
35
  }));
34
36
  };
35
37
  const onNewActionStatus = (actionId, newStatus) => {
38
+ if (isRiScMarkedForDeletion) {
39
+ showBlockedUpdateError();
40
+ return;
41
+ }
36
42
  setPendingActionUpdatesHistory((prev) => prev.filter((id) => id !== actionId));
37
43
  setPendingActionStatusUpdates((prev) => ({
38
44
  ...prev,
@@ -1 +1 @@
1
- {"version":3,"file":"ActionRowList.esm.js","sources":["../../../src/components/action/ActionRowList.tsx"],"sourcesContent":["import { Action } from '../../utils/types.ts';\nimport { ActionRow } from './ActionRow.tsx';\nimport { Fragment, useCallback, useEffect, useState } from 'react';\nimport { isToday } from '../../utils/date.ts';\nimport { ActionStatusOptions } from '../../utils/constants.ts';\nimport { useScenario } from '../../contexts/ScenarioContext.tsx';\nimport { Flex, Text } from '@backstage/ui';\nimport Divider from '@mui/material/Divider';\nimport { useDebounce } from '../../utils/hooks.ts';\nimport { useBackstageContext } from '../../contexts/BackstageContext.tsx';\nimport { UpdatedStatusEnumType } from '../../utils/utilityfunctions.ts';\nimport { useRiScs } from '../../contexts/RiScContext.tsx';\nimport { getScenarioOfIdFromRiSc } from '../../utils/scenario.ts';\nimport styles from './ActionRowList.module.css';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { pluginRiScTranslationRef } from '../../utils/translations.ts';\nimport { getUpdatedStatus } from '../../utils/actions.ts';\n\ntype ActionRowListProps = {\n scenarioId: string;\n displayedActions?: Action[]; // Specify if not every action of scenario is to be displayed\n allowDeletion?: boolean;\n allowEdit?: boolean;\n};\n\nexport function ActionRowList(props: ActionRowListProps) {\n const { t } = useTranslationRef(pluginRiScTranslationRef);\n const { selectedRiSc } = useRiScs();\n const { submitEditedScenarioToRiSc } = useScenario();\n const { profileInfo } = useBackstageContext();\n const [pendingActionStatusUpdates, setPendingActionStatusUpdates] = useState<\n Record<string, Record<string, ActionStatusOptions>>\n >({});\n const [pendingActionUpdatesHistory, setPendingActionUpdatesHistory] =\n useState<string[]>([]);\n\n const onRefreshActionStatus = (action: Action) => {\n if (isToday(action.lastUpdated ?? null)) return;\n\n setPendingActionUpdatesHistory(prev => prev.filter(id => id !== action.ID));\n\n setPendingActionStatusUpdates(prev => ({\n ...prev,\n [props.scenarioId]: {\n ...prev[props.scenarioId],\n [action.ID]: action.status as ActionStatusOptions,\n },\n }));\n };\n\n const onNewActionStatus = (\n actionId: string,\n newStatus: ActionStatusOptions,\n ) => {\n setPendingActionUpdatesHistory(prev => prev.filter(id => id !== actionId));\n\n setPendingActionStatusUpdates(prev => ({\n ...prev,\n [props.scenarioId]: {\n ...prev[props.scenarioId],\n [actionId]: newStatus,\n },\n }));\n };\n\n const onDeleteAction = (actionId: string) => {\n const oldScenario = getScenarioOfIdFromRiSc(props.scenarioId, selectedRiSc);\n if (!oldScenario) return;\n const newScenario = {\n ...oldScenario,\n actions: oldScenario.actions.filter(a => a.ID !== actionId),\n };\n submitEditedScenarioToRiSc(newScenario);\n };\n\n const onSaveAction = (\n newAction: Action,\n setIsEditing?: (isEditing: boolean) => void,\n ) => {\n const oldScenario = getScenarioOfIdFromRiSc(props.scenarioId, selectedRiSc);\n if (!oldScenario) return;\n submitEditedScenarioToRiSc(\n {\n ...oldScenario,\n actions: oldScenario.actions.map(a =>\n a.ID === newAction.ID ? newAction : a,\n ),\n },\n {\n profileInfo: profileInfo,\n onSuccess: () => {\n if (setIsEditing) {\n setIsEditing(false);\n }\n },\n },\n );\n };\n\n const debounceCallback = useCallback(\n (updates: Record<string, Record<string, ActionStatusOptions>>) => {\n if (Object.keys(updates).length === 0) return;\n\n Object.keys(updates).forEach(scenarioId => {\n const oldScenario = getScenarioOfIdFromRiSc(scenarioId, selectedRiSc);\n if (!oldScenario) return;\n const newActionArray = oldScenario.actions.map(a =>\n a.ID in updates[scenarioId]\n ? {\n ...a,\n status: updates[scenarioId][a.ID] ?? a.status,\n }\n : a,\n );\n\n const updatedScenario = {\n ...oldScenario,\n actions: newActionArray,\n };\n\n submitEditedScenarioToRiSc(updatedScenario, {\n idsOfActionsToForceUpdateLastUpdatedValue: Object.keys(\n updates[scenarioId],\n ),\n profileInfo: profileInfo,\n onSuccess: () => {\n const savedActionIds = Object.keys(updates[scenarioId]);\n\n setPendingActionStatusUpdates(prevStatusUpdates => {\n const remainingUpdates = { ...prevStatusUpdates };\n if (remainingUpdates[scenarioId]) {\n const remainingActionUpdates = {\n ...remainingUpdates[scenarioId],\n };\n\n savedActionIds.forEach(actionId => {\n delete remainingActionUpdates[actionId];\n });\n if (Object.keys(remainingActionUpdates).length === 0) {\n delete remainingUpdates[scenarioId];\n } else {\n remainingUpdates[scenarioId] = remainingActionUpdates;\n }\n }\n setPendingActionUpdatesHistory(prevHistory => [\n ...prevHistory,\n ...savedActionIds,\n ]);\n\n return remainingUpdates;\n });\n },\n onError: () => {\n // TODO: Should probably retry once before canceling updates\n setPendingActionStatusUpdates({});\n },\n });\n });\n },\n [submitEditedScenarioToRiSc, profileInfo, selectedRiSc],\n );\n\n const { flush } = useDebounce<\n Record<string, Record<string, ActionStatusOptions>>\n >(pendingActionStatusUpdates, 6000, debounceCallback);\n\n const actions =\n props.displayedActions ??\n getScenarioOfIdFromRiSc(props.scenarioId, selectedRiSc)?.actions ??\n [];\n\n useEffect(() => {\n return () => {\n // flush on unmount. makes sure changes are saved\n flush();\n };\n }, [flush]);\n\n if (actions.length === 0) {\n return (\n <Flex align=\"center\" direction=\"column\">\n <Divider flexItem />\n <Text className={styles.noActionsText}>\n {t('scenarioTable.noActionsLong')}\n </Text>\n </Flex>\n );\n }\n\n return (\n <Flex direction=\"column\">\n <Divider />\n {actions.map((action, index) => {\n const updatedStatus = getUpdatedStatusOfAction(\n props.scenarioId,\n action,\n pendingActionStatusUpdates,\n pendingActionUpdatesHistory,\n );\n return (\n <Fragment key={`Action-${action.ID}-${index}`}>\n <ActionRow\n action={action}\n index={index}\n onRefreshActionStatus={onRefreshActionStatus}\n onNewActionStatus={onNewActionStatus}\n onDeleteAction={onDeleteAction}\n onSaveAction={onSaveAction}\n updatedStatus={updatedStatus}\n optimisticStatus={\n pendingActionStatusUpdates[props.scenarioId]?.[action.ID]\n }\n allowDeletion={props.allowDeletion}\n allowEdit={props.allowEdit}\n />\n <Divider />\n </Fragment>\n );\n })}\n </Flex>\n );\n}\n\nfunction getUpdatedStatusOfAction(\n scenarioId: string,\n action: Action,\n pendingActionStatusUpdates: Record<\n string,\n Record<string, ActionStatusOptions>\n >,\n pendingActionUpdatesHistory: string[],\n) {\n const isActionUpdating =\n !!pendingActionStatusUpdates[scenarioId]?.[action.ID];\n\n let updatedStatus: UpdatedStatusEnumType | 'UPDATING' | 'NONE';\n if (isActionUpdating) {\n updatedStatus = 'UPDATING';\n } else {\n if (pendingActionUpdatesHistory.includes(action.ID)) {\n updatedStatus = 'UPDATED';\n } else {\n const baseStatus = getUpdatedStatus(action);\n updatedStatus = baseStatus === 'UPDATED' ? 'NONE' : baseStatus;\n }\n }\n return updatedStatus;\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ActionRowList.esm.js","sources":["../../../src/components/action/ActionRowList.tsx"],"sourcesContent":["import { Action, RiScStatus } from '../../utils/types.ts';\nimport { ActionRow } from './ActionRow.tsx';\nimport { Fragment, useCallback, useEffect, useState } from 'react';\nimport { isToday } from '../../utils/date.ts';\nimport { ActionStatusOptions } from '../../utils/constants.ts';\nimport { useScenario } from '../../contexts/ScenarioContext.tsx';\nimport { Flex, Text } from '@backstage/ui';\nimport Divider from '@mui/material/Divider';\nimport { useDebounce } from '../../utils/hooks.ts';\nimport { useBackstageContext } from '../../contexts/BackstageContext.tsx';\nimport { UpdatedStatusEnumType } from '../../utils/utilityfunctions.ts';\nimport { useRiScs } from '../../contexts/RiScContext.tsx';\nimport { getScenarioOfIdFromRiSc } from '../../utils/scenario.ts';\nimport styles from './ActionRowList.module.css';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { pluginRiScTranslationRef } from '../../utils/translations.ts';\nimport { getUpdatedStatus } from '../../utils/actions.ts';\n\ntype ActionRowListProps = {\n scenarioId: string;\n displayedActions?: Action[]; // Specify if not every action of scenario is to be displayed\n allowDeletion?: boolean;\n allowEdit?: boolean;\n};\n\nexport function ActionRowList(props: ActionRowListProps) {\n const { t } = useTranslationRef(pluginRiScTranslationRef);\n const { selectedRiSc, showBlockedUpdateError } = useRiScs();\n const { submitEditedScenarioToRiSc } = useScenario();\n const { profileInfo } = useBackstageContext();\n const [pendingActionStatusUpdates, setPendingActionStatusUpdates] = useState<\n Record<string, Record<string, ActionStatusOptions>>\n >({});\n const [pendingActionUpdatesHistory, setPendingActionUpdatesHistory] =\n useState<string[]>([]);\n\n const isRiScMarkedForDeletion =\n selectedRiSc?.status === RiScStatus.DeletionDraft ||\n selectedRiSc?.status === RiScStatus.DeletionSentForApproval;\n\n const onRefreshActionStatus = (action: Action) => {\n if (isToday(action.lastUpdated ?? null)) return;\n\n setPendingActionUpdatesHistory(prev => prev.filter(id => id !== action.ID));\n\n setPendingActionStatusUpdates(prev => ({\n ...prev,\n [props.scenarioId]: {\n ...prev[props.scenarioId],\n [action.ID]: action.status as ActionStatusOptions,\n },\n }));\n };\n\n const onNewActionStatus = (\n actionId: string,\n newStatus: ActionStatusOptions,\n ) => {\n if (isRiScMarkedForDeletion) {\n showBlockedUpdateError();\n return;\n }\n setPendingActionUpdatesHistory(prev => prev.filter(id => id !== actionId));\n\n setPendingActionStatusUpdates(prev => ({\n ...prev,\n [props.scenarioId]: {\n ...prev[props.scenarioId],\n [actionId]: newStatus,\n },\n }));\n };\n\n const onDeleteAction = (actionId: string) => {\n const oldScenario = getScenarioOfIdFromRiSc(props.scenarioId, selectedRiSc);\n if (!oldScenario) return;\n const newScenario = {\n ...oldScenario,\n actions: oldScenario.actions.filter(a => a.ID !== actionId),\n };\n submitEditedScenarioToRiSc(newScenario);\n };\n\n const onSaveAction = (\n newAction: Action,\n setIsEditing?: (isEditing: boolean) => void,\n ) => {\n const oldScenario = getScenarioOfIdFromRiSc(props.scenarioId, selectedRiSc);\n if (!oldScenario) return;\n submitEditedScenarioToRiSc(\n {\n ...oldScenario,\n actions: oldScenario.actions.map(a =>\n a.ID === newAction.ID ? newAction : a,\n ),\n },\n {\n profileInfo,\n onSuccess: () => {\n if (setIsEditing) {\n setIsEditing(false);\n }\n },\n },\n );\n };\n\n const debounceCallback = useCallback(\n (updates: Record<string, Record<string, ActionStatusOptions>>) => {\n if (Object.keys(updates).length === 0) return;\n\n Object.keys(updates).forEach(scenarioId => {\n const oldScenario = getScenarioOfIdFromRiSc(scenarioId, selectedRiSc);\n if (!oldScenario) return;\n const newActionArray = oldScenario.actions.map(a =>\n a.ID in updates[scenarioId]\n ? {\n ...a,\n status: updates[scenarioId][a.ID] ?? a.status,\n }\n : a,\n );\n\n const updatedScenario = {\n ...oldScenario,\n actions: newActionArray,\n };\n\n submitEditedScenarioToRiSc(updatedScenario, {\n idsOfActionsToForceUpdateLastUpdatedValue: Object.keys(\n updates[scenarioId],\n ),\n profileInfo,\n onSuccess: () => {\n const savedActionIds = Object.keys(updates[scenarioId]);\n\n setPendingActionStatusUpdates(prevStatusUpdates => {\n const remainingUpdates = { ...prevStatusUpdates };\n if (remainingUpdates[scenarioId]) {\n const remainingActionUpdates = {\n ...remainingUpdates[scenarioId],\n };\n\n savedActionIds.forEach(actionId => {\n delete remainingActionUpdates[actionId];\n });\n if (Object.keys(remainingActionUpdates).length === 0) {\n delete remainingUpdates[scenarioId];\n } else {\n remainingUpdates[scenarioId] = remainingActionUpdates;\n }\n }\n setPendingActionUpdatesHistory(prevHistory => [\n ...prevHistory,\n ...savedActionIds,\n ]);\n\n return remainingUpdates;\n });\n },\n onError: () => {\n // TODO: Should probably retry once before canceling updates\n setPendingActionStatusUpdates({});\n },\n });\n });\n },\n [submitEditedScenarioToRiSc, profileInfo, selectedRiSc],\n );\n\n const { flush } = useDebounce<\n Record<string, Record<string, ActionStatusOptions>>\n >(pendingActionStatusUpdates, 6000, debounceCallback);\n\n const actions =\n props.displayedActions ??\n getScenarioOfIdFromRiSc(props.scenarioId, selectedRiSc)?.actions ??\n [];\n\n useEffect(() => {\n return () => {\n // flush on unmount. makes sure changes are saved\n flush();\n };\n }, [flush]);\n\n if (actions.length === 0) {\n return (\n <Flex align=\"center\" direction=\"column\">\n <Divider flexItem />\n <Text className={styles.noActionsText}>\n {t('scenarioTable.noActionsLong')}\n </Text>\n </Flex>\n );\n }\n\n return (\n <Flex direction=\"column\">\n <Divider />\n {actions.map((action, index) => {\n const updatedStatus = getUpdatedStatusOfAction(\n props.scenarioId,\n action,\n pendingActionStatusUpdates,\n pendingActionUpdatesHistory,\n );\n return (\n <Fragment key={`Action-${action.ID}-${index}`}>\n <ActionRow\n action={action}\n index={index}\n onRefreshActionStatus={onRefreshActionStatus}\n onNewActionStatus={onNewActionStatus}\n onDeleteAction={onDeleteAction}\n onSaveAction={onSaveAction}\n updatedStatus={updatedStatus}\n optimisticStatus={\n pendingActionStatusUpdates[props.scenarioId]?.[action.ID]\n }\n allowDeletion={props.allowDeletion}\n allowEdit={props.allowEdit}\n />\n <Divider />\n </Fragment>\n );\n })}\n </Flex>\n );\n}\n\nfunction getUpdatedStatusOfAction(\n scenarioId: string,\n action: Action,\n pendingActionStatusUpdates: Record<\n string,\n Record<string, ActionStatusOptions>\n >,\n pendingActionUpdatesHistory: string[],\n) {\n const isActionUpdating =\n !!pendingActionStatusUpdates[scenarioId]?.[action.ID];\n\n let updatedStatus: UpdatedStatusEnumType | 'UPDATING' | 'NONE';\n if (isActionUpdating) {\n updatedStatus = 'UPDATING';\n } else {\n if (pendingActionUpdatesHistory.includes(action.ID)) {\n updatedStatus = 'UPDATED';\n } else {\n const baseStatus = getUpdatedStatus(action);\n updatedStatus = baseStatus === 'UPDATED' ? 'NONE' : baseStatus;\n }\n }\n return updatedStatus;\n}\n"],"names":[],"mappings":"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"}
@@ -1,18 +1,37 @@
1
- import { jsx, jsxs } from 'react/jsx-runtime';
2
- import { Card, CardBody, Flex, Text, Button } from '@backstage/ui';
1
+ import { jsxs, jsx } from 'react/jsx-runtime';
2
+ import { Card, CardHeader, Flex, Text, CardBody, Button } from '@backstage/ui';
3
3
  import { pluginRiScTranslationRef } from '../../utils/translations.esm.js';
4
4
  import { useTranslationRef } from '@backstage/core-plugin-api/alpha';
5
5
  import styles from './ErrorState.module.css.esm.js';
6
+ import { CreateNewRiScButton } from './CreateNewRiScButton.esm.js';
6
7
 
7
- function ErrorState() {
8
+ function ErrorState({ onCreateNew }) {
8
9
  const { t } = useTranslationRef(pluginRiScTranslationRef);
9
10
  const refreshPage = () => {
10
11
  window.location.reload();
11
12
  };
12
- return /* @__PURE__ */ jsx(Card, { className: styles.card, children: /* @__PURE__ */ jsx(CardBody, { children: /* @__PURE__ */ jsxs(Flex, { direction: "column", align: "center", children: [
13
- /* @__PURE__ */ jsx(Text, { variant: "body-large", children: t("errorMessages.FailedToFetchRiScs") }),
14
- /* @__PURE__ */ jsx(Button, { onClick: refreshPage, children: t("dictionary.refresh") })
15
- ] }) }) });
13
+ return /* @__PURE__ */ jsxs(Card, { className: styles.card, children: [
14
+ /* @__PURE__ */ jsx(CardHeader, { children: /* @__PURE__ */ jsx(Flex, { justify: "center", children: /* @__PURE__ */ jsx(Text, { variant: "title-small", weight: "bold", children: t("firstRiScCard.noRiScYet") }) }) }),
15
+ /* @__PURE__ */ jsx(CardBody, { children: /* @__PURE__ */ jsxs(
16
+ Flex,
17
+ {
18
+ direction: "column",
19
+ align: "center",
20
+ gap: "8px",
21
+ className: styles.content,
22
+ children: [
23
+ /* @__PURE__ */ jsx(Text, { children: t("firstRiScCard.getStarted") }),
24
+ /* @__PURE__ */ jsxs(Flex, { gap: "12px", className: styles.actions, children: [
25
+ /* @__PURE__ */ jsxs(Button, { onClick: refreshPage, className: styles.reloadButton, children: [
26
+ /* @__PURE__ */ jsx("i", { className: "ri-refresh-line" }),
27
+ t("dictionary.refresh")
28
+ ] }),
29
+ /* @__PURE__ */ jsx(CreateNewRiScButton, { onCreateNew })
30
+ ] })
31
+ ]
32
+ }
33
+ ) })
34
+ ] });
16
35
  }
17
36
 
18
37
  export { ErrorState };
@@ -1 +1 @@
1
- {"version":3,"file":"ErrorState.esm.js","sources":["../../../src/components/riScInfo/ErrorState.tsx"],"sourcesContent":["import { Card, CardBody, Flex, Text, Button } from '@backstage/ui';\nimport { pluginRiScTranslationRef } from '../../utils/translations';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport styles from './ErrorState.module.css';\n\nexport function ErrorState() {\n const { t } = useTranslationRef(pluginRiScTranslationRef);\n\n const refreshPage = () => {\n window.location.reload();\n };\n return (\n <Card className={styles.card}>\n <CardBody>\n <Flex direction=\"column\" align=\"center\">\n <Text variant=\"body-large\">\n {t('errorMessages.FailedToFetchRiScs')}\n </Text>\n <Button onClick={refreshPage}>{t('dictionary.refresh')}</Button>\n </Flex>\n </CardBody>\n </Card>\n );\n}\n"],"names":[],"mappings":";;;;;;AAKO,SAAS,UAAA,GAAa;AAC3B,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,iBAAA,CAAkB,wBAAwB,CAAA;AAExD,EAAA,MAAM,cAAc,MAAM;AACxB,IAAA,MAAA,CAAO,SAAS,MAAA,EAAO;AAAA,EACzB,CAAA;AACA,EAAA,uBACE,GAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAW,MAAA,CAAO,IAAA,EACtB,QAAA,kBAAA,GAAA,CAAC,QAAA,EAAA,EACC,QAAA,kBAAA,IAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAU,QAAA,EAAS,KAAA,EAAM,QAAA,EAC7B,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,IAAA,EAAA,EAAK,OAAA,EAAQ,YAAA,EACX,QAAA,EAAA,CAAA,CAAE,kCAAkC,CAAA,EACvC,CAAA;AAAA,wBACC,MAAA,EAAA,EAAO,OAAA,EAAS,WAAA,EAAc,QAAA,EAAA,CAAA,CAAE,oBAAoB,CAAA,EAAE;AAAA,GAAA,EACzD,GACF,CAAA,EACF,CAAA;AAEJ;;;;"}
1
+ {"version":3,"file":"ErrorState.esm.js","sources":["../../../src/components/riScInfo/ErrorState.tsx"],"sourcesContent":["import { Card, CardBody, CardHeader, Flex, Text, Button } from '@backstage/ui';\nimport { pluginRiScTranslationRef } from '../../utils/translations';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport styles from './ErrorState.module.css';\nimport { CreateNewRiScButton } from './CreateNewRiScButton';\n\ntype ErrorStateProps = {\n onCreateNew: () => void;\n};\n\nexport function ErrorState({ onCreateNew }: ErrorStateProps) {\n const { t } = useTranslationRef(pluginRiScTranslationRef);\n\n const refreshPage = () => {\n window.location.reload();\n };\n\n return (\n <Card className={styles.card}>\n <CardHeader>\n <Flex justify=\"center\">\n <Text variant=\"title-small\" weight=\"bold\">\n {t('firstRiScCard.noRiScYet')}\n </Text>\n </Flex>\n </CardHeader>\n <CardBody>\n <Flex\n direction=\"column\"\n align=\"center\"\n gap=\"8px\"\n className={styles.content}\n >\n <Text>{t('firstRiScCard.getStarted')}</Text>\n <Flex gap=\"12px\" className={styles.actions}>\n <Button onClick={refreshPage} className={styles.reloadButton}>\n <i className=\"ri-refresh-line\" />\n {t('dictionary.refresh')}\n </Button>\n <CreateNewRiScButton onCreateNew={onCreateNew} />\n </Flex>\n </Flex>\n </CardBody>\n </Card>\n );\n}\n"],"names":[],"mappings":";;;;;;;AAUO,SAAS,UAAA,CAAW,EAAE,WAAA,EAAY,EAAoB;AAC3D,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,iBAAA,CAAkB,wBAAwB,CAAA;AAExD,EAAA,MAAM,cAAc,MAAM;AACxB,IAAA,MAAA,CAAO,SAAS,MAAA,EAAO;AAAA,EACzB,CAAA;AAEA,EAAA,uBACE,IAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAW,MAAA,CAAO,IAAA,EACtB,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,UAAA,EAAA,EACC,QAAA,kBAAA,GAAA,CAAC,IAAA,EAAA,EAAK,OAAA,EAAQ,UACZ,QAAA,kBAAA,GAAA,CAAC,IAAA,EAAA,EAAK,OAAA,EAAQ,aAAA,EAAc,QAAO,MAAA,EAChC,QAAA,EAAA,CAAA,CAAE,yBAAyB,CAAA,EAC9B,GACF,CAAA,EACF,CAAA;AAAA,wBACC,QAAA,EAAA,EACC,QAAA,kBAAA,IAAA;AAAA,MAAC,IAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAU,QAAA;AAAA,QACV,KAAA,EAAM,QAAA;AAAA,QACN,GAAA,EAAI,KAAA;AAAA,QACJ,WAAW,MAAA,CAAO,OAAA;AAAA,QAElB,QAAA,EAAA;AAAA,0BAAA,GAAA,CAAC,IAAA,EAAA,EAAM,QAAA,EAAA,CAAA,CAAE,0BAA0B,CAAA,EAAE,CAAA;AAAA,+BACpC,IAAA,EAAA,EAAK,GAAA,EAAI,MAAA,EAAO,SAAA,EAAW,OAAO,OAAA,EACjC,QAAA,EAAA;AAAA,4BAAA,IAAA,CAAC,MAAA,EAAA,EAAO,OAAA,EAAS,WAAA,EAAa,SAAA,EAAW,OAAO,YAAA,EAC9C,QAAA,EAAA;AAAA,8BAAA,GAAA,CAAC,GAAA,EAAA,EAAE,WAAU,iBAAA,EAAkB,CAAA;AAAA,cAC9B,EAAE,oBAAoB;AAAA,aAAA,EACzB,CAAA;AAAA,4BACA,GAAA,CAAC,uBAAoB,WAAA,EAA0B;AAAA,WAAA,EACjD;AAAA;AAAA;AAAA,KACF,EACF;AAAA,GAAA,EACF,CAAA;AAEJ;;;;"}
@@ -1,7 +1,7 @@
1
1
  import styleInject from '../../node_modules_dist/style-inject/dist/style-inject.es.esm.js';
2
2
 
3
- var css_248z = ".ErrorState_card__21ea4655ec {\n width: 520px;\n}\n";
4
- var styles = {"card":"ErrorState_card__21ea4655ec"};
3
+ var css_248z = ".ErrorState_card__7ad74f9519 {\n width: 520px;\n}\n\n.ErrorState_content__7ad74f9519 {\n text-align: center;\n}\n\n.ErrorState_actions__7ad74f9519 {\n margin-top: 8px;\n}\n\n.ErrorState_reloadButton__7ad74f9519 {\n width: fit-content;\n}\n";
4
+ var styles = {"card":"ErrorState_card__7ad74f9519","content":"ErrorState_content__7ad74f9519","actions":"ErrorState_actions__7ad74f9519","reloadButton":"ErrorState_reloadButton__7ad74f9519"};
5
5
  styleInject(css_248z);
6
6
 
7
7
  export { styles as default };
@@ -86,13 +86,13 @@ function RiScPlugin() {
86
86
  children: /* @__PURE__ */ jsx(FirstRiScDialog, { onNewRiSc: openCreateRiScDialog })
87
87
  }
88
88
  ),
89
- !isFetching && (failedToFetchGcpCryptoKeys || allRiScsFailedDecryption) && /* @__PURE__ */ jsx(
89
+ !isFetching && !selectedRiSc && (failedToFetchGcpCryptoKeys || allRiScsFailedDecryption) && /* @__PURE__ */ jsx(
90
90
  Flex,
91
91
  {
92
92
  align: "center",
93
93
  justify: "center",
94
94
  className: riscStyles.componentLayout,
95
- children: /* @__PURE__ */ jsx(ErrorState, {})
95
+ children: /* @__PURE__ */ jsx(ErrorState, { onCreateNew: openCreateRiScDialog })
96
96
  }
97
97
  ),
98
98
  isFetching && /* @__PURE__ */ jsx(Spinner, { size: 80 }),
@@ -1 +1 @@
1
- {"version":3,"file":"RiScPlugin.esm.js","sources":["../../../src/components/riScPlugin/RiScPlugin.tsx"],"sourcesContent":["import { useEffect, useState } from 'react';\nimport { useSearchParams } from 'react-router-dom';\nimport { ScenarioWizard } from '../scenarioWizard/ScenarioWizard';\nimport { ScenarioDrawer } from '../scenarioDrawer/ScenarioDrawer';\nimport { RiskMatrix } from '../riskMatrix/RiskMatrix';\nimport AlertBar from '../common/AlertBar/AlertBar';\nimport Grid from '@mui/material/Grid';\nimport { RiScDialog, RiScDialogStates } from '../riScDialog/RiScDialog';\nimport { Spinner } from '../common/Spinner';\nimport { useRiScs } from '../../contexts/RiScContext';\nimport { ScenarioWizardSteps } from '../../contexts/ScenarioContext';\nimport { RiScHeader } from '../riScHeader/RiScHeader.tsx';\nimport { ScenarioTableWrapper } from '../scenarioTable/ScenarioTableWrapper.tsx';\nimport { FirstRiScDialog } from '../riScInfo/FirstRiScDialog.tsx';\nimport { Flex, Text } from '@backstage/ui';\nimport { CreateNewRiScButton } from '../riScInfo/CreateNewRiScButton.tsx';\nimport { RiScSelectionCard } from '../riScInfo/RiScSelectionCard.tsx';\nimport { RiScStatusComponent } from '../riScInfo/riScStatus/RiScStatusComponent.tsx';\nimport { pluginRiScTranslationRef } from '../../utils/translations.ts';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport styles from '../common/alertBar.module.css';\nimport { RiScDescriptionCard } from '../riScInfo/RiScDescriptionCard.tsx';\nimport riscStyles from '../riScInfo/RiScSelectionCard.module.css';\nimport { ErrorState } from '../riScInfo/ErrorState.tsx';\nimport { ThreatActorsAndVulnerabilitiesCard } from '../threatActorsAndVulnerabilities/ThreatActorsAndVulnerabilitiesCard.tsx';\n\nexport function RiScPlugin() {\n const [riScDialogState, setRiScDialogState] = useState<RiScDialogStates>(\n RiScDialogStates.Closed,\n );\n\n function openCreateRiScDialog() {\n return setRiScDialogState(RiScDialogStates.Create);\n }\n\n function openDeleteRiScDialog() {\n return setRiScDialogState(RiScDialogStates.Delete);\n }\n\n function openEditRiScDialog() {\n return setRiScDialogState(RiScDialogStates.EditRiscInfo);\n }\n\n function openEditEncryptionDialog() {\n return setRiScDialogState(RiScDialogStates.EditEncryption);\n }\n\n function closeRiScDialog() {\n return setRiScDialogState(RiScDialogStates.Closed);\n }\n\n const {\n approveRiSc,\n selectedRiSc,\n isFetching,\n resetResponse,\n resetRiScStatus,\n response,\n updateStatus,\n riScs,\n failedToFetchGcpCryptoKeys,\n allRiScsFailedDecryption,\n } = useRiScs();\n\n const { t } = useTranslationRef(pluginRiScTranslationRef);\n\n const [searchParams] = useSearchParams();\n const scenarioWizardStep = searchParams.get(\n 'step',\n ) as ScenarioWizardSteps | null;\n\n useEffect(() => {\n if (scenarioWizardStep !== null) {\n resetRiScStatus();\n resetResponse();\n }\n }, [resetRiScStatus, resetResponse, scenarioWizardStep]);\n\n return (\n <>\n <Flex className={styles.alertBarBox}>\n <AlertBar\n updateStatus={updateStatus}\n response={response}\n statusText={response?.statusMessage}\n />\n </Flex>\n {scenarioWizardStep !== null ? (\n <ScenarioWizard step={scenarioWizardStep} />\n ) : (\n <>\n <RiScHeader onEditEncryption={openEditEncryptionDialog} />\n {!isFetching &&\n riScs !== null &&\n riScs.length === 0 &&\n !selectedRiSc &&\n !allRiScsFailedDecryption && (\n <Flex\n justify=\"center\"\n align=\"center\"\n className={riscStyles.componentLayout}\n >\n <FirstRiScDialog onNewRiSc={openCreateRiScDialog} />\n </Flex>\n )}\n {!isFetching &&\n (failedToFetchGcpCryptoKeys || allRiScsFailedDecryption) && (\n <Flex\n align=\"center\"\n justify=\"center\"\n className={riscStyles.componentLayout}\n >\n <ErrorState />\n </Flex>\n )}\n {isFetching && <Spinner size={80} />}\n\n <Grid container spacing={4}>\n {selectedRiSc && (\n <>\n <Grid size={12}>\n <Grid container rowSpacing={3} columnSpacing={4}>\n <Grid size={8}>\n <Flex align=\"center\" justify=\"between\">\n <Text as=\"h3\" variant=\"body-large\" weight=\"bold\">\n {t('contentHeader.multipleRiScs')}\n </Text>\n <CreateNewRiScButton\n onCreateNew={openCreateRiScDialog}\n />\n </Flex>\n </Grid>\n <Grid size={8}>\n <RiScSelectionCard />\n </Grid>\n <Grid size={4} />\n\n <Grid size={8}>\n <Flex gap=\"24px\" direction=\"column\">\n <RiScDescriptionCard\n riScWithMetadata={selectedRiSc}\n edit={openEditRiScDialog}\n />\n <ScenarioTableWrapper riScWithMetadata={selectedRiSc} />\n </Flex>\n </Grid>\n\n <Grid size={4}>\n <Flex direction=\"column\" gap=\"24px\">\n <RiScStatusComponent\n selectedRiSc={selectedRiSc}\n publishRiScFn={approveRiSc}\n />\n <RiskMatrix riScWithMetadata={selectedRiSc} />\n <ThreatActorsAndVulnerabilitiesCard\n scenarios={selectedRiSc.content.scenarios}\n />\n </Flex>\n </Grid>\n </Grid>\n </Grid>\n </>\n )}\n </Grid>\n </>\n )}\n\n {riScDialogState !== RiScDialogStates.Closed && (\n <RiScDialog\n onClose={closeRiScDialog}\n dialogState={riScDialogState}\n onDelete={openDeleteRiScDialog}\n />\n )}\n\n {!scenarioWizardStep && <ScenarioDrawer />}\n </>\n );\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"RiScPlugin.esm.js","sources":["../../../src/components/riScPlugin/RiScPlugin.tsx"],"sourcesContent":["import { useEffect, useState } from 'react';\nimport { useSearchParams } from 'react-router-dom';\nimport { ScenarioWizard } from '../scenarioWizard/ScenarioWizard';\nimport { ScenarioDrawer } from '../scenarioDrawer/ScenarioDrawer';\nimport { RiskMatrix } from '../riskMatrix/RiskMatrix';\nimport AlertBar from '../common/AlertBar/AlertBar';\nimport Grid from '@mui/material/Grid';\nimport { RiScDialog, RiScDialogStates } from '../riScDialog/RiScDialog';\nimport { Spinner } from '../common/Spinner';\nimport { useRiScs } from '../../contexts/RiScContext';\nimport { ScenarioWizardSteps } from '../../contexts/ScenarioContext';\nimport { RiScHeader } from '../riScHeader/RiScHeader.tsx';\nimport { ScenarioTableWrapper } from '../scenarioTable/ScenarioTableWrapper.tsx';\nimport { FirstRiScDialog } from '../riScInfo/FirstRiScDialog.tsx';\nimport { Flex, Text } from '@backstage/ui';\nimport { CreateNewRiScButton } from '../riScInfo/CreateNewRiScButton.tsx';\nimport { RiScSelectionCard } from '../riScInfo/RiScSelectionCard.tsx';\nimport { RiScStatusComponent } from '../riScInfo/riScStatus/RiScStatusComponent.tsx';\nimport { pluginRiScTranslationRef } from '../../utils/translations.ts';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport styles from '../common/alertBar.module.css';\nimport { RiScDescriptionCard } from '../riScInfo/RiScDescriptionCard.tsx';\nimport riscStyles from '../riScInfo/RiScSelectionCard.module.css';\nimport { ErrorState } from '../riScInfo/ErrorState.tsx';\nimport { ThreatActorsAndVulnerabilitiesCard } from '../threatActorsAndVulnerabilities/ThreatActorsAndVulnerabilitiesCard.tsx';\n\nexport function RiScPlugin() {\n const [riScDialogState, setRiScDialogState] = useState<RiScDialogStates>(\n RiScDialogStates.Closed,\n );\n\n function openCreateRiScDialog() {\n return setRiScDialogState(RiScDialogStates.Create);\n }\n\n function openDeleteRiScDialog() {\n return setRiScDialogState(RiScDialogStates.Delete);\n }\n\n function openEditRiScDialog() {\n return setRiScDialogState(RiScDialogStates.EditRiscInfo);\n }\n\n function openEditEncryptionDialog() {\n return setRiScDialogState(RiScDialogStates.EditEncryption);\n }\n\n function closeRiScDialog() {\n return setRiScDialogState(RiScDialogStates.Closed);\n }\n\n const {\n approveRiSc,\n selectedRiSc,\n isFetching,\n resetResponse,\n resetRiScStatus,\n response,\n updateStatus,\n riScs,\n failedToFetchGcpCryptoKeys,\n allRiScsFailedDecryption,\n } = useRiScs();\n\n const { t } = useTranslationRef(pluginRiScTranslationRef);\n\n const [searchParams] = useSearchParams();\n const scenarioWizardStep = searchParams.get(\n 'step',\n ) as ScenarioWizardSteps | null;\n\n useEffect(() => {\n if (scenarioWizardStep !== null) {\n resetRiScStatus();\n resetResponse();\n }\n }, [resetRiScStatus, resetResponse, scenarioWizardStep]);\n\n return (\n <>\n <Flex className={styles.alertBarBox}>\n <AlertBar\n updateStatus={updateStatus}\n response={response}\n statusText={response?.statusMessage}\n />\n </Flex>\n {scenarioWizardStep !== null ? (\n <ScenarioWizard step={scenarioWizardStep} />\n ) : (\n <>\n <RiScHeader onEditEncryption={openEditEncryptionDialog} />\n {!isFetching &&\n riScs !== null &&\n riScs.length === 0 &&\n !selectedRiSc &&\n !allRiScsFailedDecryption && (\n <Flex\n justify=\"center\"\n align=\"center\"\n className={riscStyles.componentLayout}\n >\n <FirstRiScDialog onNewRiSc={openCreateRiScDialog} />\n </Flex>\n )}\n {/* Added isFetching condition to avoid showing error state when user e.g., adds new scorecard. */}\n {!isFetching &&\n !selectedRiSc &&\n (failedToFetchGcpCryptoKeys || allRiScsFailedDecryption) && (\n <Flex\n align=\"center\"\n justify=\"center\"\n className={riscStyles.componentLayout}\n >\n <ErrorState onCreateNew={openCreateRiScDialog} />\n </Flex>\n )}\n {isFetching && <Spinner size={80} />}\n\n <Grid container spacing={4}>\n {selectedRiSc && (\n <>\n <Grid size={12}>\n <Grid container rowSpacing={3} columnSpacing={4}>\n <Grid size={8}>\n <Flex align=\"center\" justify=\"between\">\n <Text as=\"h3\" variant=\"body-large\" weight=\"bold\">\n {t('contentHeader.multipleRiScs')}\n </Text>\n <CreateNewRiScButton\n onCreateNew={openCreateRiScDialog}\n />\n </Flex>\n </Grid>\n <Grid size={8}>\n <RiScSelectionCard />\n </Grid>\n <Grid size={4} />\n\n <Grid size={8}>\n <Flex gap=\"24px\" direction=\"column\">\n <RiScDescriptionCard\n riScWithMetadata={selectedRiSc}\n edit={openEditRiScDialog}\n />\n <ScenarioTableWrapper riScWithMetadata={selectedRiSc} />\n </Flex>\n </Grid>\n\n <Grid size={4}>\n <Flex direction=\"column\" gap=\"24px\">\n <RiScStatusComponent\n selectedRiSc={selectedRiSc}\n publishRiScFn={approveRiSc}\n />\n <RiskMatrix riScWithMetadata={selectedRiSc} />\n <ThreatActorsAndVulnerabilitiesCard\n scenarios={selectedRiSc.content.scenarios}\n />\n </Flex>\n </Grid>\n </Grid>\n </Grid>\n </>\n )}\n </Grid>\n </>\n )}\n\n {riScDialogState !== RiScDialogStates.Closed && (\n <RiScDialog\n onClose={closeRiScDialog}\n dialogState={riScDialogState}\n onDelete={openDeleteRiScDialog}\n />\n )}\n\n {!scenarioWizardStep && <ScenarioDrawer />}\n </>\n );\n}\n"],"names":[],"mappings":"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"}
@@ -347,7 +347,23 @@ function RiScProvider({ children }) {
347
347
  );
348
348
  }
349
349
  }
350
+ const isRiScMarkedForDeletion = selectedRiSc?.status === RiScStatus.DeletionDraft || selectedRiSc?.status === RiScStatus.DeletionSentForApproval;
351
+ const showBlockedUpdateError = useCallback(() => {
352
+ dispatch({
353
+ type: "SET_BOTH",
354
+ updateStatus: { isLoading: false, isError: true, isSuccess: false },
355
+ response: {
356
+ status: ProcessingStatus.ErrorWhenUpdatingDeletedRiSc,
357
+ statusMessage: t("errorMessages.ErrorWhenUpdatingDeletedRiSc")
358
+ }
359
+ });
360
+ }, [dispatch, t]);
350
361
  function updateRiSc(riSc, onSuccess, onError) {
362
+ if (isRiScMarkedForDeletion) {
363
+ showBlockedUpdateError();
364
+ onError?.();
365
+ return;
366
+ }
351
367
  if (selectedRiSc && riScs) {
352
368
  const isRequiresNewApproval = selectedRiSc.migrationStatus?.migrationRequiresNewApproval || requiresNewApproval(selectedRiSc.content, riSc.content);
353
369
  const updatedRiSc = {
@@ -465,6 +481,7 @@ function RiScProvider({ children }) {
465
481
  createNewRiSc,
466
482
  deleteRiSc,
467
483
  updateRiSc,
484
+ showBlockedUpdateError,
468
485
  approveRiSc,
469
486
  updateStatus: localState.updateStatus,
470
487
  resetRiScStatus,
@@ -1 +1 @@
1
- {"version":3,"file":"RiScContext.esm.js","sources":["../../src/contexts/RiScContext.tsx"],"sourcesContent":["import {\n createContext,\n ReactNode,\n useCallback,\n useContext,\n useEffect,\n useRef,\n useState,\n useReducer,\n} from 'react';\nimport {\n ContentStatus,\n ProcessingStatus,\n RiScStatus,\n RiScWithMetadata,\n SubmitResponseObject,\n} from '../utils/types';\nimport { useRouteRef } from '@backstage/core-plugin-api';\nimport {\n getTranslationKey,\n requiresNewApproval,\n} from '../utils/utilityfunctions';\nimport { riScRouteRef } from '../routes';\nimport { useLocation, useNavigate, useParams } from 'react-router';\nimport {\n dtoToRiSc,\n GcpCryptoKeyObject,\n ProcessRiScResultDTO,\n RiScContentResultDTO,\n RiScDTO,\n} from '../utils/DTOs';\nimport {\n buildFetchRiScErrorMessages,\n mapRiScDtoToRiScWithMetadata,\n withLoginRejected,\n} from '../utils/fetchRiScHelpers';\nimport {\n useAuthenticatedFetch,\n useGithubRepositoryInformation,\n} from '../utils/hooks';\nimport { latestSupportedVersion } from '../utils/constants';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { pluginRiScTranslationRef } from '../utils/translations';\n\nexport type UpdateStatus = {\n isLoading: boolean;\n isError: boolean;\n isSuccess: boolean;\n};\n\ntype RiScDrawerProps = {\n riScs: RiScWithMetadata[] | null;\n selectRiSc: (title: string) => void;\n selectedRiSc: RiScWithMetadata | null;\n createNewRiSc: (\n riSc: RiScWithMetadata,\n generateInitialRisc: boolean,\n defaultRiScId: string | undefined,\n ) => void;\n deleteRiSc: (onSuccess?: () => void, onError?: () => void) => void;\n updateRiSc: (\n riSc: RiScWithMetadata,\n onSuccess?: () => void,\n onError?: () => void,\n ) => void;\n approveRiSc: () => void;\n updateStatus: UpdateStatus;\n resetRiScStatus: () => void;\n resetResponse: () => void;\n isFetching: boolean;\n isFetchingGcpCryptoKeys: boolean;\n failedToFetchGcpCryptoKeys: boolean;\n allRiScsFailedDecryption: boolean;\n gcpCryptoKeys: GcpCryptoKeyObject[];\n response: SubmitResponseObject | null;\n};\n\nconst RiScContext = createContext<RiScDrawerProps | undefined>(undefined);\n\nexport function RiScProvider({ children }: { children: ReactNode }) {\n const { riScId: riScIdFromParams } = useParams();\n const location = useLocation();\n const navigate = useNavigate();\n const getRiScPath = useRouteRef(riScRouteRef);\n const [isRequesting, setIsRequesting] = useState<boolean>(false);\n const { t } = useTranslationRef(pluginRiScTranslationRef);\n const repoInfo = useGithubRepositoryInformation();\n\n const {\n fetchRiScs,\n fetchGcpCryptoKeys,\n postRiScs,\n deleteRiScs,\n putRiScs,\n publishRiScs,\n } = useAuthenticatedFetch();\n\n const [riScs, setRiScs] = useState<RiScWithMetadata[] | null>(null);\n const [selectedRiSc, setSelectedRiSc] = useState<RiScWithMetadata | null>(\n null,\n );\n const [isFetching, setIsFetching] = useState(true);\n const isFetchingRef = useRef(isFetching);\n const [isFetchingRiScs, setIsFetchingRiScs] = useState(true);\n const isFetchingRiScsRef = useRef(isFetchingRiScs);\n const [isFetchingGcpCryptoKeys, setIsFetchingGcpCryptoKeys] = useState(true);\n const isFetchingGcpCryptoKeysRef = useRef(isFetchingGcpCryptoKeys);\n const gcpCryptoKeysFailed = useRef(false);\n const [failedToFetchGcpCryptoKeys, setFailedToFetchGcpCryptoKeys] =\n useState(false);\n\n type LocalState = {\n updateStatus: UpdateStatus;\n response: SubmitResponseObject | null;\n };\n\n type Action =\n | { type: 'SET_STATUS'; updateStatus: UpdateStatus }\n | { type: 'SET_RESPONSE'; response: SubmitResponseObject | null }\n | {\n type: 'SET_BOTH';\n updateStatus: UpdateStatus;\n response: SubmitResponseObject | null;\n };\n\n const initialLocalState: LocalState = {\n updateStatus: { isLoading: false, isError: false, isSuccess: false },\n response: null,\n };\n\n function reducer(state: LocalState, action: Action): LocalState {\n switch (action.type) {\n case 'SET_STATUS':\n return { ...state, updateStatus: action.updateStatus };\n case 'SET_RESPONSE':\n return { ...state, response: action.response };\n case 'SET_BOTH':\n return { updateStatus: action.updateStatus, response: action.response };\n default:\n return state;\n }\n }\n\n const [localState, dispatch] = useReducer(reducer, initialLocalState);\n\n const [gcpCryptoKeys, setGcpCryptoKeys] = useState<GcpCryptoKeyObject[]>([]);\n\n const [allRiScsFailedDecryption, setAllRiScsFailedDecryption] =\n useState(false);\n\n // Auto-clear response after a short duration to avoid the Alert sticking around\n const responseTimerRef = useRef<number | null>(null);\n useEffect(() => {\n if (localState.response) {\n if (responseTimerRef.current) {\n window.clearTimeout(responseTimerRef.current);\n }\n responseTimerRef.current = window.setTimeout(() => {\n dispatch({ type: 'SET_RESPONSE', response: null });\n responseTimerRef.current = null;\n }, 10000);\n }\n\n return () => {\n if (responseTimerRef.current) {\n window.clearTimeout(responseTimerRef.current);\n responseTimerRef.current = null;\n }\n };\n }, [localState.response]);\n\n useEffect(() => {\n if (location.state) {\n dispatch({\n type: 'SET_RESPONSE',\n response: {\n statusMessage: location.state,\n status: ProcessingStatus.ErrorWhenFetchingRiScs,\n },\n });\n }\n }, [location, dispatch]);\n\n // Initial fetch of GCP crypto keys\n useEffect(() => {\n gcpCryptoKeysFailed.current = false;\n setFailedToFetchGcpCryptoKeys(false);\n dispatch({ type: 'SET_RESPONSE', response: null });\n fetchGcpCryptoKeys(\n res => {\n // Sorts the crypto keys by the number of permissions (descending)\n setGcpCryptoKeys(\n res.sort(\n (a, b) =>\n (b.userPermissions?.length ?? 0) -\n (a.userPermissions?.length ?? 0),\n ),\n );\n isFetchingGcpCryptoKeysRef.current = false;\n setIsFetchingGcpCryptoKeys(isFetchingGcpCryptoKeysRef.current);\n if (!isFetchingRiScsRef.current) {\n isFetchingRef.current = false;\n setIsFetching(isFetchingRef.current);\n }\n },\n (_error, loginRejected) => {\n gcpCryptoKeysFailed.current = true;\n setFailedToFetchGcpCryptoKeys(true);\n dispatch({\n type: 'SET_RESPONSE',\n response: {\n status: ProcessingStatus.ErrorWhenFetchingGcpCryptoKeys,\n statusMessage: withLoginRejected(\n t('errorMessages.ErrorWhenFetchingGcpCryptoKeys'),\n loginRejected,\n t,\n ),\n },\n });\n isFetchingGcpCryptoKeysRef.current = false;\n setIsFetchingGcpCryptoKeys(isFetchingGcpCryptoKeysRef.current);\n if (!isFetchingRiScsRef.current) {\n isFetchingRef.current = false;\n setIsFetching(isFetchingRef.current);\n }\n },\n );\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // Initial fetch of RiScs\n useEffect(() => {\n dispatch({ type: 'SET_RESPONSE', response: null });\n fetchRiScs(\n res => {\n const successfulRiScs = res.filter(\n risk => risk.status === ContentStatus.Success,\n );\n\n // Check if all RiScs failed decryption (there are RiScs but all failed)\n const allFailed = res.length > 0 && successfulRiScs.length === 0;\n setAllRiScsFailedDecryption(allFailed);\n\n const fetchedRiScs: RiScWithMetadata[] = successfulRiScs.map(\n mapRiScDtoToRiScWithMetadata,\n );\n setRiScs(fetchedRiScs);\n isFetchingRiScsRef.current = false;\n setIsFetchingRiScs(isFetchingRiScsRef.current);\n if (!isFetchingGcpCryptoKeysRef.current) {\n isFetchingRef.current = false;\n setIsFetching(isFetchingRef.current);\n }\n\n const errorRiScs: RiScContentResultDTO[] = res.filter(\n risk => risk.status !== ContentStatus.Success,\n );\n\n if (errorRiScs.length > 0) {\n dispatch({\n type: 'SET_RESPONSE',\n response: {\n statusMessage: buildFetchRiScErrorMessages(errorRiScs, t),\n status: ProcessingStatus.ErrorWhenFetchingRiScs,\n },\n });\n }\n\n // If there are no RiScs, don't set a selected RiSc\n if (fetchedRiScs.length === 0) {\n return;\n }\n\n // If there is no RiSc ID in the URL, navigate to the first RiSc\n if (!riScIdFromParams) {\n navigate(getRiScPath({ riScId: fetchedRiScs[0].id }));\n return;\n }\n\n const riSc = fetchedRiScs.find(r => r.id === riScIdFromParams);\n\n // If there is an invalid RiSc ID in the URL, navigate to the first RiSc with error state\n if (!riSc) {\n navigate(getRiScPath({ riScId: fetchedRiScs[0].id }), {\n state: t('errorMessages.RiScDoesNotExist'),\n });\n return;\n }\n },\n loginRejected => {\n if (!gcpCryptoKeysFailed.current) {\n dispatch({\n type: 'SET_RESPONSE',\n response: {\n status: ProcessingStatus.ErrorWhenFetchingRiScs,\n statusMessage: withLoginRejected(\n t('errorMessages.ErrorWhenFetchingRiScs'),\n loginRejected,\n t,\n ),\n },\n });\n }\n isFetchingRiScsRef.current = false;\n setIsFetchingRiScs(isFetchingRiScsRef.current);\n if (!isFetchingGcpCryptoKeysRef.current) {\n isFetchingRef.current = false;\n setIsFetching(isFetchingRef.current);\n }\n },\n );\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // Set selected RiSc based on URL\n useEffect(() => {\n if (riScIdFromParams) {\n const riSc = riScs?.find(r => r.id === riScIdFromParams);\n if (riSc) {\n setSelectedRiSc(riSc);\n }\n }\n }, [riScs, riScIdFromParams]);\n\n const resetRiScStatus = useCallback(() => {\n dispatch({\n type: 'SET_STATUS',\n updateStatus: { isLoading: false, isSuccess: false, isError: false },\n });\n }, [dispatch]);\n\n // use callback to avoid infinite loop\n const resetResponse = useCallback(() => {\n dispatch({ type: 'SET_RESPONSE', response: null });\n }, [dispatch]);\n\n const getTranslationContext = useCallback(\n (status: ProcessingStatus) => {\n return status === ProcessingStatus.ErrorWhenNoWriteAccessToRepository\n ? { owner: repoInfo.owner, name: repoInfo.name }\n : undefined;\n },\n [repoInfo.owner, repoInfo.name],\n );\n\n function selectRiSc(id: string) {\n const selectedRiScId = riScs?.find(riSc => riSc.id === id)?.id;\n if (selectedRiScId) {\n navigate(getRiScPath({ riScId: selectedRiScId }));\n }\n }\n\n function createNewRiSc(\n riSc: RiScWithMetadata,\n generateInitialRisc: boolean,\n defaultRiScId: string | undefined,\n ) {\n setIsFetching(true);\n setSelectedRiSc(null);\n dispatch({\n type: 'SET_BOTH',\n updateStatus: { isLoading: true, isError: false, isSuccess: false },\n response: null,\n });\n const newRiSc: RiScWithMetadata = {\n ...riSc,\n schemaVersion: latestSupportedVersion,\n };\n postRiScs(\n newRiSc.content,\n generateInitialRisc,\n newRiSc.sopsConfig,\n defaultRiScId,\n res => {\n if (!res.riScId) throw new Error('No RiSc ID returned');\n if (!res.riScContent) throw new Error('No RiSc content returned');\n const json = JSON.parse(res.riScContent) as RiScDTO;\n const content = dtoToRiSc(json);\n const riScWithMetaData: RiScWithMetadata = {\n id: res.riScId,\n status: RiScStatus.Draft,\n content: content,\n sopsConfig: riSc.sopsConfig,\n schemaVersion: riSc.schemaVersion,\n lastPublished: riSc.lastPublished,\n };\n setRiScs(riScs ? [...riScs, riScWithMetaData] : [riScWithMetaData]);\n setIsFetching(false);\n navigate(getRiScPath({ riScId: res.riScId }));\n dispatch({\n type: 'SET_BOTH',\n updateStatus: { isLoading: false, isError: false, isSuccess: true },\n response: {\n ...res,\n statusMessage: getTranslationKey('info', res.status, t),\n },\n });\n },\n (error: ProcessRiScResultDTO, loginRejected: boolean) => {\n setSelectedRiSc(selectedRiSc);\n setIsFetching(false);\n\n const translationContext = getTranslationContext(error.status);\n\n dispatch({\n type: 'SET_BOTH',\n updateStatus: { isLoading: false, isError: true, isSuccess: false },\n response: {\n ...error,\n statusMessage: withLoginRejected(\n getTranslationKey('error', error.status, t, translationContext),\n loginRejected,\n t,\n ),\n },\n });\n },\n );\n }\n\n function deleteRiSc(onSuccess?: () => void, onError?: () => void) {\n if (selectedRiSc && riScs) {\n const updatedRiSc = {\n ...selectedRiSc,\n status: RiScStatus.DeletionDraft,\n };\n const originalRiSc = selectedRiSc;\n\n dispatch({\n type: 'SET_BOTH',\n updateStatus: { isLoading: true, isError: false, isSuccess: false },\n response: null,\n });\n deleteRiScs(\n selectedRiSc.id,\n res => {\n dispatch({\n type: 'SET_BOTH',\n updateStatus: { isLoading: false, isError: false, isSuccess: true },\n response: {\n ...res,\n statusMessage: getTranslationKey('info', res.status, t),\n },\n });\n setIsRequesting(false);\n if (res.status === ProcessingStatus.DeletedRiSc) {\n setSelectedRiSc(\n riScs.find(riSc => riSc.id !== selectedRiSc.id) || null,\n );\n setRiScs(riScs.filter(riSc => riSc.id !== updatedRiSc.id));\n if (onSuccess) onSuccess();\n } else {\n setSelectedRiSc(updatedRiSc);\n setRiScs(\n riScs.map(riSc =>\n riSc.id === selectedRiSc.id ? updatedRiSc : riSc,\n ),\n );\n }\n },\n (error, loginRejected) => {\n setSelectedRiSc(originalRiSc);\n\n const translationContext = getTranslationContext(error.status);\n\n dispatch({\n type: 'SET_BOTH',\n updateStatus: { isLoading: false, isError: true, isSuccess: false },\n response: {\n ...error,\n statusMessage: withLoginRejected(\n getTranslationKey('error', error.status, t, translationContext),\n loginRejected,\n t,\n ),\n },\n });\n setIsRequesting(false);\n if (onError) onError();\n },\n );\n }\n }\n\n function updateRiSc(\n riSc: RiScWithMetadata,\n onSuccess?: () => void,\n onError?: () => void,\n ) {\n if (selectedRiSc && riScs) {\n const isRequiresNewApproval =\n selectedRiSc.migrationStatus?.migrationRequiresNewApproval ||\n requiresNewApproval(selectedRiSc.content, riSc.content);\n\n const updatedRiSc: RiScWithMetadata = {\n ...selectedRiSc,\n sopsConfig: riSc.sopsConfig,\n content: riSc.content,\n status:\n selectedRiSc.status !== RiScStatus.Draft && isRequiresNewApproval\n ? RiScStatus.Draft\n : selectedRiSc.status,\n isRequiresNewApproval: isRequiresNewApproval,\n schemaVersion: riSc.schemaVersion,\n migrationStatus: {\n migrationChanges: false,\n migrationRequiresNewApproval: false,\n },\n };\n const originalRiSc = selectedRiSc;\n setSelectedRiSc(updatedRiSc);\n dispatch({\n type: 'SET_BOTH',\n updateStatus: { isLoading: true, isError: false, isSuccess: false },\n response: null,\n });\n putRiScs(\n updatedRiSc,\n res => {\n dispatch({\n type: 'SET_BOTH',\n updateStatus: { isLoading: false, isError: false, isSuccess: true },\n response: {\n ...res,\n statusMessage: getTranslationKey('info', res.status, t),\n },\n });\n if ('pendingApproval' in res && res.pendingApproval?.pullRequestUrl) {\n updatedRiSc.pullRequestUrl = res.pendingApproval.pullRequestUrl;\n updatedRiSc.status = RiScStatus.SentForApproval;\n }\n setSelectedRiSc(updatedRiSc);\n setRiScs(\n riScs.map(r => (r.id === selectedRiSc.id ? updatedRiSc : r)),\n );\n setIsRequesting(false);\n if (onSuccess) onSuccess();\n },\n (error, loginRejected) => {\n const translationContext = getTranslationContext(error.status);\n\n dispatch({\n type: 'SET_BOTH',\n updateStatus: { isLoading: false, isError: true, isSuccess: false },\n response: {\n ...error,\n statusMessage: withLoginRejected(\n getTranslationKey('error', error.status, t, translationContext),\n loginRejected,\n t,\n ),\n },\n });\n setIsRequesting(false);\n if (onError) onError();\n setSelectedRiSc(originalRiSc);\n },\n );\n }\n }\n\n function approveRiSc() {\n if (selectedRiSc && riScs) {\n dispatch({\n type: 'SET_STATUS',\n updateStatus: { isLoading: true, isError: false, isSuccess: false },\n });\n publishRiScs(\n selectedRiSc.id,\n res => {\n const prUrl = res.pendingApproval?.pullRequestUrl;\n const updatedRiSc = {\n ...selectedRiSc,\n status:\n selectedRiSc.status === RiScStatus.Draft\n ? RiScStatus.SentForApproval\n : RiScStatus.DeletionSentForApproval,\n pullRequestUrl: prUrl,\n };\n setSelectedRiSc(updatedRiSc);\n setRiScs(\n riScs.map(r => (r.id === selectedRiSc.id ? updatedRiSc : r)),\n );\n dispatch({\n type: 'SET_BOTH',\n updateStatus: { isLoading: false, isError: false, isSuccess: true },\n response: {\n ...res,\n statusMessage: getTranslationKey('info', res.status, t),\n },\n });\n },\n (error, loginRejected) => {\n const translationContext = getTranslationContext(error.status);\n\n dispatch({\n type: 'SET_BOTH',\n updateStatus: { isLoading: false, isError: true, isSuccess: false },\n response: {\n ...error,\n statusMessage: withLoginRejected(\n getTranslationKey('error', error.status, t, translationContext),\n loginRejected,\n t,\n ),\n },\n });\n },\n );\n }\n }\n\n const value = {\n riScs,\n selectRiSc,\n selectedRiSc,\n createNewRiSc,\n deleteRiSc,\n updateRiSc,\n approveRiSc,\n updateStatus: localState.updateStatus,\n resetRiScStatus,\n resetResponse,\n isRequesting,\n isFetching,\n response: localState.response,\n gcpCryptoKeys,\n };\n\n return (\n <RiScContext.Provider\n value={{\n ...value,\n isFetchingGcpCryptoKeys: false,\n failedToFetchGcpCryptoKeys,\n allRiScsFailedDecryption,\n }}\n >\n {children}\n </RiScContext.Provider>\n );\n}\n\nexport function useRiScs() {\n const context = useContext(RiScContext);\n if (context === undefined) {\n throw new Error('useRiScs must be used within a RiScProvider');\n }\n return context;\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"RiScContext.esm.js","sources":["../../src/contexts/RiScContext.tsx"],"sourcesContent":["import {\n createContext,\n ReactNode,\n useCallback,\n useContext,\n useEffect,\n useRef,\n useState,\n useReducer,\n} from 'react';\nimport {\n ContentStatus,\n ProcessingStatus,\n RiScStatus,\n RiScWithMetadata,\n SubmitResponseObject,\n} from '../utils/types';\nimport { useRouteRef } from '@backstage/core-plugin-api';\nimport {\n getTranslationKey,\n requiresNewApproval,\n} from '../utils/utilityfunctions';\nimport { riScRouteRef } from '../routes';\nimport { useLocation, useNavigate, useParams } from 'react-router';\nimport {\n dtoToRiSc,\n GcpCryptoKeyObject,\n ProcessRiScResultDTO,\n RiScContentResultDTO,\n RiScDTO,\n} from '../utils/DTOs';\nimport {\n buildFetchRiScErrorMessages,\n mapRiScDtoToRiScWithMetadata,\n withLoginRejected,\n} from '../utils/fetchRiScHelpers';\nimport {\n useAuthenticatedFetch,\n useGithubRepositoryInformation,\n} from '../utils/hooks';\nimport { latestSupportedVersion } from '../utils/constants';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { pluginRiScTranslationRef } from '../utils/translations';\n\nexport type UpdateStatus = {\n isLoading: boolean;\n isError: boolean;\n isSuccess: boolean;\n};\n\ntype RiScDrawerProps = {\n riScs: RiScWithMetadata[] | null;\n selectRiSc: (title: string) => void;\n selectedRiSc: RiScWithMetadata | null;\n createNewRiSc: (\n riSc: RiScWithMetadata,\n generateInitialRisc: boolean,\n defaultRiScId: string | undefined,\n ) => void;\n deleteRiSc: (onSuccess?: () => void, onError?: () => void) => void;\n updateRiSc: (\n riSc: RiScWithMetadata,\n onSuccess?: () => void,\n onError?: () => void,\n ) => void;\n showBlockedUpdateError: () => void;\n approveRiSc: () => void;\n updateStatus: UpdateStatus;\n resetRiScStatus: () => void;\n resetResponse: () => void;\n isFetching: boolean;\n isFetchingGcpCryptoKeys: boolean;\n failedToFetchGcpCryptoKeys: boolean;\n allRiScsFailedDecryption: boolean;\n gcpCryptoKeys: GcpCryptoKeyObject[];\n response: SubmitResponseObject | null;\n};\n\nconst RiScContext = createContext<RiScDrawerProps | undefined>(undefined);\n\nexport function RiScProvider({ children }: { children: ReactNode }) {\n const { riScId: riScIdFromParams } = useParams();\n const location = useLocation();\n const navigate = useNavigate();\n const getRiScPath = useRouteRef(riScRouteRef);\n const [isRequesting, setIsRequesting] = useState<boolean>(false);\n const { t } = useTranslationRef(pluginRiScTranslationRef);\n const repoInfo = useGithubRepositoryInformation();\n\n const {\n fetchRiScs,\n fetchGcpCryptoKeys,\n postRiScs,\n deleteRiScs,\n putRiScs,\n publishRiScs,\n } = useAuthenticatedFetch();\n\n const [riScs, setRiScs] = useState<RiScWithMetadata[] | null>(null);\n const [selectedRiSc, setSelectedRiSc] = useState<RiScWithMetadata | null>(\n null,\n );\n const [isFetching, setIsFetching] = useState(true);\n const isFetchingRef = useRef(isFetching);\n const [isFetchingRiScs, setIsFetchingRiScs] = useState(true);\n const isFetchingRiScsRef = useRef(isFetchingRiScs);\n const [isFetchingGcpCryptoKeys, setIsFetchingGcpCryptoKeys] = useState(true);\n const isFetchingGcpCryptoKeysRef = useRef(isFetchingGcpCryptoKeys);\n const gcpCryptoKeysFailed = useRef(false);\n const [failedToFetchGcpCryptoKeys, setFailedToFetchGcpCryptoKeys] =\n useState(false);\n\n type LocalState = {\n updateStatus: UpdateStatus;\n response: SubmitResponseObject | null;\n };\n\n type Action =\n | { type: 'SET_STATUS'; updateStatus: UpdateStatus }\n | { type: 'SET_RESPONSE'; response: SubmitResponseObject | null }\n | {\n type: 'SET_BOTH';\n updateStatus: UpdateStatus;\n response: SubmitResponseObject | null;\n };\n\n const initialLocalState: LocalState = {\n updateStatus: { isLoading: false, isError: false, isSuccess: false },\n response: null,\n };\n\n function reducer(state: LocalState, action: Action): LocalState {\n switch (action.type) {\n case 'SET_STATUS':\n return { ...state, updateStatus: action.updateStatus };\n case 'SET_RESPONSE':\n return { ...state, response: action.response };\n case 'SET_BOTH':\n return { updateStatus: action.updateStatus, response: action.response };\n default:\n return state;\n }\n }\n\n const [localState, dispatch] = useReducer(reducer, initialLocalState);\n\n const [gcpCryptoKeys, setGcpCryptoKeys] = useState<GcpCryptoKeyObject[]>([]);\n\n const [allRiScsFailedDecryption, setAllRiScsFailedDecryption] =\n useState(false);\n\n // Auto-clear response after a short duration to avoid the Alert sticking around\n const responseTimerRef = useRef<number | null>(null);\n useEffect(() => {\n if (localState.response) {\n if (responseTimerRef.current) {\n window.clearTimeout(responseTimerRef.current);\n }\n responseTimerRef.current = window.setTimeout(() => {\n dispatch({ type: 'SET_RESPONSE', response: null });\n responseTimerRef.current = null;\n }, 10000);\n }\n\n return () => {\n if (responseTimerRef.current) {\n window.clearTimeout(responseTimerRef.current);\n responseTimerRef.current = null;\n }\n };\n }, [localState.response]);\n\n useEffect(() => {\n if (location.state) {\n dispatch({\n type: 'SET_RESPONSE',\n response: {\n statusMessage: location.state,\n status: ProcessingStatus.ErrorWhenFetchingRiScs,\n },\n });\n }\n }, [location, dispatch]);\n\n // Initial fetch of GCP crypto keys\n useEffect(() => {\n gcpCryptoKeysFailed.current = false;\n setFailedToFetchGcpCryptoKeys(false);\n dispatch({ type: 'SET_RESPONSE', response: null });\n fetchGcpCryptoKeys(\n res => {\n // Sorts the crypto keys by the number of permissions (descending)\n setGcpCryptoKeys(\n res.sort(\n (a, b) =>\n (b.userPermissions?.length ?? 0) -\n (a.userPermissions?.length ?? 0),\n ),\n );\n isFetchingGcpCryptoKeysRef.current = false;\n setIsFetchingGcpCryptoKeys(isFetchingGcpCryptoKeysRef.current);\n if (!isFetchingRiScsRef.current) {\n isFetchingRef.current = false;\n setIsFetching(isFetchingRef.current);\n }\n },\n (_error, loginRejected) => {\n gcpCryptoKeysFailed.current = true;\n setFailedToFetchGcpCryptoKeys(true);\n dispatch({\n type: 'SET_RESPONSE',\n response: {\n status: ProcessingStatus.ErrorWhenFetchingGcpCryptoKeys,\n statusMessage: withLoginRejected(\n t('errorMessages.ErrorWhenFetchingGcpCryptoKeys'),\n loginRejected,\n t,\n ),\n },\n });\n isFetchingGcpCryptoKeysRef.current = false;\n setIsFetchingGcpCryptoKeys(isFetchingGcpCryptoKeysRef.current);\n if (!isFetchingRiScsRef.current) {\n isFetchingRef.current = false;\n setIsFetching(isFetchingRef.current);\n }\n },\n );\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // Initial fetch of RiScs\n useEffect(() => {\n dispatch({ type: 'SET_RESPONSE', response: null });\n fetchRiScs(\n res => {\n const successfulRiScs = res.filter(\n risk => risk.status === ContentStatus.Success,\n );\n\n // Check if all RiScs failed decryption (there are RiScs but all failed)\n const allFailed = res.length > 0 && successfulRiScs.length === 0;\n setAllRiScsFailedDecryption(allFailed);\n\n const fetchedRiScs: RiScWithMetadata[] = successfulRiScs.map(\n mapRiScDtoToRiScWithMetadata,\n );\n setRiScs(fetchedRiScs);\n isFetchingRiScsRef.current = false;\n setIsFetchingRiScs(isFetchingRiScsRef.current);\n if (!isFetchingGcpCryptoKeysRef.current) {\n isFetchingRef.current = false;\n setIsFetching(isFetchingRef.current);\n }\n\n const errorRiScs: RiScContentResultDTO[] = res.filter(\n risk => risk.status !== ContentStatus.Success,\n );\n\n if (errorRiScs.length > 0) {\n dispatch({\n type: 'SET_RESPONSE',\n response: {\n statusMessage: buildFetchRiScErrorMessages(errorRiScs, t),\n status: ProcessingStatus.ErrorWhenFetchingRiScs,\n },\n });\n }\n\n // If there are no RiScs, don't set a selected RiSc\n if (fetchedRiScs.length === 0) {\n return;\n }\n\n // If there is no RiSc ID in the URL, navigate to the first RiSc\n if (!riScIdFromParams) {\n navigate(getRiScPath({ riScId: fetchedRiScs[0].id }));\n return;\n }\n\n const riSc = fetchedRiScs.find(r => r.id === riScIdFromParams);\n\n // If there is an invalid RiSc ID in the URL, navigate to the first RiSc with error state\n if (!riSc) {\n navigate(getRiScPath({ riScId: fetchedRiScs[0].id }), {\n state: t('errorMessages.RiScDoesNotExist'),\n });\n return;\n }\n },\n loginRejected => {\n if (!gcpCryptoKeysFailed.current) {\n dispatch({\n type: 'SET_RESPONSE',\n response: {\n status: ProcessingStatus.ErrorWhenFetchingRiScs,\n statusMessage: withLoginRejected(\n t('errorMessages.ErrorWhenFetchingRiScs'),\n loginRejected,\n t,\n ),\n },\n });\n }\n isFetchingRiScsRef.current = false;\n setIsFetchingRiScs(isFetchingRiScsRef.current);\n if (!isFetchingGcpCryptoKeysRef.current) {\n isFetchingRef.current = false;\n setIsFetching(isFetchingRef.current);\n }\n },\n );\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // Set selected RiSc based on URL\n useEffect(() => {\n if (riScIdFromParams) {\n const riSc = riScs?.find(r => r.id === riScIdFromParams);\n if (riSc) {\n setSelectedRiSc(riSc);\n }\n }\n }, [riScs, riScIdFromParams]);\n\n const resetRiScStatus = useCallback(() => {\n dispatch({\n type: 'SET_STATUS',\n updateStatus: { isLoading: false, isSuccess: false, isError: false },\n });\n }, [dispatch]);\n\n // use callback to avoid infinite loop\n const resetResponse = useCallback(() => {\n dispatch({ type: 'SET_RESPONSE', response: null });\n }, [dispatch]);\n\n const getTranslationContext = useCallback(\n (status: ProcessingStatus) => {\n return status === ProcessingStatus.ErrorWhenNoWriteAccessToRepository\n ? { owner: repoInfo.owner, name: repoInfo.name }\n : undefined;\n },\n [repoInfo.owner, repoInfo.name],\n );\n\n function selectRiSc(id: string) {\n const selectedRiScId = riScs?.find(riSc => riSc.id === id)?.id;\n if (selectedRiScId) {\n navigate(getRiScPath({ riScId: selectedRiScId }));\n }\n }\n\n function createNewRiSc(\n riSc: RiScWithMetadata,\n generateInitialRisc: boolean,\n defaultRiScId: string | undefined,\n ) {\n setIsFetching(true);\n setSelectedRiSc(null);\n dispatch({\n type: 'SET_BOTH',\n updateStatus: { isLoading: true, isError: false, isSuccess: false },\n response: null,\n });\n const newRiSc: RiScWithMetadata = {\n ...riSc,\n schemaVersion: latestSupportedVersion,\n };\n postRiScs(\n newRiSc.content,\n generateInitialRisc,\n newRiSc.sopsConfig,\n defaultRiScId,\n res => {\n if (!res.riScId) throw new Error('No RiSc ID returned');\n if (!res.riScContent) throw new Error('No RiSc content returned');\n const json = JSON.parse(res.riScContent) as RiScDTO;\n const content = dtoToRiSc(json);\n const riScWithMetaData: RiScWithMetadata = {\n id: res.riScId,\n status: RiScStatus.Draft,\n content: content,\n sopsConfig: riSc.sopsConfig,\n schemaVersion: riSc.schemaVersion,\n lastPublished: riSc.lastPublished,\n };\n setRiScs(riScs ? [...riScs, riScWithMetaData] : [riScWithMetaData]);\n setIsFetching(false);\n navigate(getRiScPath({ riScId: res.riScId }));\n dispatch({\n type: 'SET_BOTH',\n updateStatus: { isLoading: false, isError: false, isSuccess: true },\n response: {\n ...res,\n statusMessage: getTranslationKey('info', res.status, t),\n },\n });\n },\n (error: ProcessRiScResultDTO, loginRejected: boolean) => {\n setSelectedRiSc(selectedRiSc);\n setIsFetching(false);\n\n const translationContext = getTranslationContext(error.status);\n\n dispatch({\n type: 'SET_BOTH',\n updateStatus: { isLoading: false, isError: true, isSuccess: false },\n response: {\n ...error,\n statusMessage: withLoginRejected(\n getTranslationKey('error', error.status, t, translationContext),\n loginRejected,\n t,\n ),\n },\n });\n },\n );\n }\n\n function deleteRiSc(onSuccess?: () => void, onError?: () => void) {\n if (selectedRiSc && riScs) {\n const updatedRiSc = {\n ...selectedRiSc,\n status: RiScStatus.DeletionDraft,\n };\n const originalRiSc = selectedRiSc;\n\n dispatch({\n type: 'SET_BOTH',\n updateStatus: { isLoading: true, isError: false, isSuccess: false },\n response: null,\n });\n deleteRiScs(\n selectedRiSc.id,\n res => {\n dispatch({\n type: 'SET_BOTH',\n updateStatus: { isLoading: false, isError: false, isSuccess: true },\n response: {\n ...res,\n statusMessage: getTranslationKey('info', res.status, t),\n },\n });\n setIsRequesting(false);\n if (res.status === ProcessingStatus.DeletedRiSc) {\n setSelectedRiSc(\n riScs.find(riSc => riSc.id !== selectedRiSc.id) || null,\n );\n setRiScs(riScs.filter(riSc => riSc.id !== updatedRiSc.id));\n if (onSuccess) onSuccess();\n } else {\n setSelectedRiSc(updatedRiSc);\n setRiScs(\n riScs.map(riSc =>\n riSc.id === selectedRiSc.id ? updatedRiSc : riSc,\n ),\n );\n }\n },\n (error, loginRejected) => {\n setSelectedRiSc(originalRiSc);\n\n const translationContext = getTranslationContext(error.status);\n\n dispatch({\n type: 'SET_BOTH',\n updateStatus: { isLoading: false, isError: true, isSuccess: false },\n response: {\n ...error,\n statusMessage: withLoginRejected(\n getTranslationKey('error', error.status, t, translationContext),\n loginRejected,\n t,\n ),\n },\n });\n setIsRequesting(false);\n if (onError) onError();\n },\n );\n }\n }\n\n const isRiScMarkedForDeletion =\n selectedRiSc?.status === RiScStatus.DeletionDraft ||\n selectedRiSc?.status === RiScStatus.DeletionSentForApproval;\n\n const showBlockedUpdateError = useCallback(() => {\n dispatch({\n type: 'SET_BOTH',\n updateStatus: { isLoading: false, isError: true, isSuccess: false },\n response: {\n status: ProcessingStatus.ErrorWhenUpdatingDeletedRiSc,\n statusMessage: t('errorMessages.ErrorWhenUpdatingDeletedRiSc'),\n },\n });\n }, [dispatch, t]);\n\n function updateRiSc(\n riSc: RiScWithMetadata,\n onSuccess?: () => void,\n onError?: () => void,\n ) {\n if (isRiScMarkedForDeletion) {\n showBlockedUpdateError();\n onError?.();\n return;\n }\n\n if (selectedRiSc && riScs) {\n const isRequiresNewApproval =\n selectedRiSc.migrationStatus?.migrationRequiresNewApproval ||\n requiresNewApproval(selectedRiSc.content, riSc.content);\n\n const updatedRiSc: RiScWithMetadata = {\n ...selectedRiSc,\n sopsConfig: riSc.sopsConfig,\n content: riSc.content,\n status:\n selectedRiSc.status !== RiScStatus.Draft && isRequiresNewApproval\n ? RiScStatus.Draft\n : selectedRiSc.status,\n isRequiresNewApproval: isRequiresNewApproval,\n schemaVersion: riSc.schemaVersion,\n migrationStatus: {\n migrationChanges: false,\n migrationRequiresNewApproval: false,\n },\n };\n const originalRiSc = selectedRiSc;\n setSelectedRiSc(updatedRiSc);\n dispatch({\n type: 'SET_BOTH',\n updateStatus: { isLoading: true, isError: false, isSuccess: false },\n response: null,\n });\n putRiScs(\n updatedRiSc,\n res => {\n dispatch({\n type: 'SET_BOTH',\n updateStatus: { isLoading: false, isError: false, isSuccess: true },\n response: {\n ...res,\n statusMessage: getTranslationKey('info', res.status, t),\n },\n });\n if ('pendingApproval' in res && res.pendingApproval?.pullRequestUrl) {\n updatedRiSc.pullRequestUrl = res.pendingApproval.pullRequestUrl;\n updatedRiSc.status = RiScStatus.SentForApproval;\n }\n setSelectedRiSc(updatedRiSc);\n setRiScs(\n riScs.map(r => (r.id === selectedRiSc.id ? updatedRiSc : r)),\n );\n setIsRequesting(false);\n if (onSuccess) onSuccess();\n },\n (error, loginRejected) => {\n const translationContext = getTranslationContext(error.status);\n\n dispatch({\n type: 'SET_BOTH',\n updateStatus: { isLoading: false, isError: true, isSuccess: false },\n response: {\n ...error,\n statusMessage: withLoginRejected(\n getTranslationKey('error', error.status, t, translationContext),\n loginRejected,\n t,\n ),\n },\n });\n setIsRequesting(false);\n if (onError) onError();\n setSelectedRiSc(originalRiSc);\n },\n );\n }\n }\n\n function approveRiSc() {\n if (selectedRiSc && riScs) {\n dispatch({\n type: 'SET_STATUS',\n updateStatus: { isLoading: true, isError: false, isSuccess: false },\n });\n publishRiScs(\n selectedRiSc.id,\n res => {\n const prUrl = res.pendingApproval?.pullRequestUrl;\n const updatedRiSc = {\n ...selectedRiSc,\n status:\n selectedRiSc.status === RiScStatus.Draft\n ? RiScStatus.SentForApproval\n : RiScStatus.DeletionSentForApproval,\n pullRequestUrl: prUrl,\n };\n setSelectedRiSc(updatedRiSc);\n setRiScs(\n riScs.map(r => (r.id === selectedRiSc.id ? updatedRiSc : r)),\n );\n dispatch({\n type: 'SET_BOTH',\n updateStatus: { isLoading: false, isError: false, isSuccess: true },\n response: {\n ...res,\n statusMessage: getTranslationKey('info', res.status, t),\n },\n });\n },\n (error, loginRejected) => {\n const translationContext = getTranslationContext(error.status);\n\n dispatch({\n type: 'SET_BOTH',\n updateStatus: { isLoading: false, isError: true, isSuccess: false },\n response: {\n ...error,\n statusMessage: withLoginRejected(\n getTranslationKey('error', error.status, t, translationContext),\n loginRejected,\n t,\n ),\n },\n });\n },\n );\n }\n }\n\n const value = {\n riScs,\n selectRiSc,\n selectedRiSc,\n createNewRiSc,\n deleteRiSc,\n updateRiSc,\n showBlockedUpdateError,\n approveRiSc,\n updateStatus: localState.updateStatus,\n resetRiScStatus,\n resetResponse,\n isRequesting,\n isFetching,\n response: localState.response,\n gcpCryptoKeys,\n };\n\n return (\n <RiScContext.Provider\n value={{\n ...value,\n isFetchingGcpCryptoKeys: false,\n failedToFetchGcpCryptoKeys,\n allRiScsFailedDecryption,\n }}\n >\n {children}\n </RiScContext.Provider>\n );\n}\n\nexport function useRiScs() {\n const context = useContext(RiScContext);\n if (context === undefined) {\n throw new Error('useRiScs must be used within a RiScProvider');\n }\n return context;\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;AA8EA,MAAM,WAAA,GAAc,cAA2C,MAAS,CAAA;AAEjE,SAAS,YAAA,CAAa,EAAE,QAAA,EAAS,EAA4B;AAClE,EAAA,MAAM,EAAE,MAAA,EAAQ,gBAAA,EAAiB,GAAI,SAAA,EAAU;AAC/C,EAAA,MAAM,WAAW,WAAA,EAAY;AAC7B,EAAA,MAAM,WAAW,WAAA,EAAY;AAC7B,EAAA,MAAM,WAAA,GAAc,YAAY,YAAY,CAAA;AAC5C,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAI,SAAkB,KAAK,CAAA;AAC/D,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,iBAAA,CAAkB,wBAAwB,CAAA;AACxD,EAAA,MAAM,WAAW,8BAAA,EAA+B;AAEhD,EAAA,MAAM;AAAA,IACJ,UAAA;AAAA,IACA,kBAAA;AAAA,IACA,SAAA;AAAA,IACA,WAAA;AAAA,IACA,QAAA;AAAA,IACA;AAAA,MACE,qBAAA,EAAsB;AAE1B,EAAA,MAAM,CAAC,KAAA,EAAO,QAAQ,CAAA,GAAI,SAAoC,IAAI,CAAA;AAClE,EAAA,MAAM,CAAC,YAAA,EAAc,eAAe,CAAA,GAAI,QAAA;AAAA,IACtC;AAAA,GACF;AACA,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAI,SAAS,IAAI,CAAA;AACjD,EAAA,MAAM,aAAA,GAAgB,OAAO,UAAU,CAAA;AACvC,EAAA,MAAM,CAAC,eAAA,EAAiB,kBAAkB,CAAA,GAAI,SAAS,IAAI,CAAA;AAC3D,EAAA,MAAM,kBAAA,GAAqB,OAAO,eAAe,CAAA;AACjD,EAAA,MAAM,CAAC,uBAAA,EAAyB,0BAA0B,CAAA,GAAI,SAAS,IAAI,CAAA;AAC3E,EAAA,MAAM,0BAAA,GAA6B,OAAO,uBAAuB,CAAA;AACjE,EAAA,MAAM,mBAAA,GAAsB,OAAO,KAAK,CAAA;AACxC,EAAA,MAAM,CAAC,0BAAA,EAA4B,6BAA6B,CAAA,GAC9D,SAAS,KAAK,CAAA;AAgBhB,EAAA,MAAM,iBAAA,GAAgC;AAAA,IACpC,cAAc,EAAE,SAAA,EAAW,OAAO,OAAA,EAAS,KAAA,EAAO,WAAW,KAAA,EAAM;AAAA,IACnE,QAAA,EAAU;AAAA,GACZ;AAEA,EAAA,SAAS,OAAA,CAAQ,OAAmB,MAAA,EAA4B;AAC9D,IAAA,QAAQ,OAAO,IAAA;AAAM,MACnB,KAAK,YAAA;AACH,QAAA,OAAO,EAAE,GAAG,KAAA,EAAO,YAAA,EAAc,OAAO,YAAA,EAAa;AAAA,MACvD,KAAK,cAAA;AACH,QAAA,OAAO,EAAE,GAAG,KAAA,EAAO,QAAA,EAAU,OAAO,QAAA,EAAS;AAAA,MAC/C,KAAK,UAAA;AACH,QAAA,OAAO,EAAE,YAAA,EAAc,MAAA,CAAO,YAAA,EAAc,QAAA,EAAU,OAAO,QAAA,EAAS;AAAA,MACxE;AACE,QAAA,OAAO,KAAA;AAAA;AACX,EACF;AAEA,EAAA,MAAM,CAAC,UAAA,EAAY,QAAQ,CAAA,GAAI,UAAA,CAAW,SAAS,iBAAiB,CAAA;AAEpE,EAAA,MAAM,CAAC,aAAA,EAAe,gBAAgB,CAAA,GAAI,QAAA,CAA+B,EAAE,CAAA;AAE3E,EAAA,MAAM,CAAC,wBAAA,EAA0B,2BAA2B,CAAA,GAC1D,SAAS,KAAK,CAAA;AAGhB,EAAA,MAAM,gBAAA,GAAmB,OAAsB,IAAI,CAAA;AACnD,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,WAAW,QAAA,EAAU;AACvB,MAAA,IAAI,iBAAiB,OAAA,EAAS;AAC5B,QAAA,MAAA,CAAO,YAAA,CAAa,iBAAiB,OAAO,CAAA;AAAA,MAC9C;AACA,MAAA,gBAAA,CAAiB,OAAA,GAAU,MAAA,CAAO,UAAA,CAAW,MAAM;AACjD,QAAA,QAAA,CAAS,EAAE,IAAA,EAAM,cAAA,EAAgB,QAAA,EAAU,MAAM,CAAA;AACjD,QAAA,gBAAA,CAAiB,OAAA,GAAU,IAAA;AAAA,MAC7B,GAAG,GAAK,CAAA;AAAA,IACV;AAEA,IAAA,OAAO,MAAM;AACX,MAAA,IAAI,iBAAiB,OAAA,EAAS;AAC5B,QAAA,MAAA,CAAO,YAAA,CAAa,iBAAiB,OAAO,CAAA;AAC5C,QAAA,gBAAA,CAAiB,OAAA,GAAU,IAAA;AAAA,MAC7B;AAAA,IACF,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,UAAA,CAAW,QAAQ,CAAC,CAAA;AAExB,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,SAAS,KAAA,EAAO;AAClB,MAAA,QAAA,CAAS;AAAA,QACP,IAAA,EAAM,cAAA;AAAA,QACN,QAAA,EAAU;AAAA,UACR,eAAe,QAAA,CAAS,KAAA;AAAA,UACxB,QAAQ,gBAAA,CAAiB;AAAA;AAC3B,OACD,CAAA;AAAA,IACH;AAAA,EACF,CAAA,EAAG,CAAC,QAAA,EAAU,QAAQ,CAAC,CAAA;AAGvB,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,mBAAA,CAAoB,OAAA,GAAU,KAAA;AAC9B,IAAA,6BAAA,CAA8B,KAAK,CAAA;AACnC,IAAA,QAAA,CAAS,EAAE,IAAA,EAAM,cAAA,EAAgB,QAAA,EAAU,MAAM,CAAA;AACjD,IAAA,kBAAA;AAAA,MACE,CAAA,GAAA,KAAO;AAEL,QAAA,gBAAA;AAAA,UACE,GAAA,CAAI,IAAA;AAAA,YACF,CAAC,GAAG,CAAA,KAAA,CACD,CAAA,CAAE,iBAAiB,MAAA,IAAU,CAAA,KAC7B,CAAA,CAAE,eAAA,EAAiB,MAAA,IAAU,CAAA;AAAA;AAClC,SACF;AACA,QAAA,0BAAA,CAA2B,OAAA,GAAU,KAAA;AACrC,QAAA,0BAAA,CAA2B,2BAA2B,OAAO,CAAA;AAC7D,QAAA,IAAI,CAAC,mBAAmB,OAAA,EAAS;AAC/B,UAAA,aAAA,CAAc,OAAA,GAAU,KAAA;AACxB,UAAA,aAAA,CAAc,cAAc,OAAO,CAAA;AAAA,QACrC;AAAA,MACF,CAAA;AAAA,MACA,CAAC,QAAQ,aAAA,KAAkB;AACzB,QAAA,mBAAA,CAAoB,OAAA,GAAU,IAAA;AAC9B,QAAA,6BAAA,CAA8B,IAAI,CAAA;AAClC,QAAA,QAAA,CAAS;AAAA,UACP,IAAA,EAAM,cAAA;AAAA,UACN,QAAA,EAAU;AAAA,YACR,QAAQ,gBAAA,CAAiB,8BAAA;AAAA,YACzB,aAAA,EAAe,iBAAA;AAAA,cACb,EAAE,8CAA8C,CAAA;AAAA,cAChD,aAAA;AAAA,cACA;AAAA;AACF;AACF,SACD,CAAA;AACD,QAAA,0BAAA,CAA2B,OAAA,GAAU,KAAA;AACrC,QAAA,0BAAA,CAA2B,2BAA2B,OAAO,CAAA;AAC7D,QAAA,IAAI,CAAC,mBAAmB,OAAA,EAAS;AAC/B,UAAA,aAAA,CAAc,OAAA,GAAU,KAAA;AACxB,UAAA,aAAA,CAAc,cAAc,OAAO,CAAA;AAAA,QACrC;AAAA,MACF;AAAA,KACF;AAAA,EAEF,CAAA,EAAG,EAAE,CAAA;AAGL,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,QAAA,CAAS,EAAE,IAAA,EAAM,cAAA,EAAgB,QAAA,EAAU,MAAM,CAAA;AACjD,IAAA,UAAA;AAAA,MACE,CAAA,GAAA,KAAO;AACL,QAAA,MAAM,kBAAkB,GAAA,CAAI,MAAA;AAAA,UAC1B,CAAA,IAAA,KAAQ,IAAA,CAAK,MAAA,KAAW,aAAA,CAAc;AAAA,SACxC;AAGA,QAAA,MAAM,SAAA,GAAY,GAAA,CAAI,MAAA,GAAS,CAAA,IAAK,gBAAgB,MAAA,KAAW,CAAA;AAC/D,QAAA,2BAAA,CAA4B,SAAS,CAAA;AAErC,QAAA,MAAM,eAAmC,eAAA,CAAgB,GAAA;AAAA,UACvD;AAAA,SACF;AACA,QAAA,QAAA,CAAS,YAAY,CAAA;AACrB,QAAA,kBAAA,CAAmB,OAAA,GAAU,KAAA;AAC7B,QAAA,kBAAA,CAAmB,mBAAmB,OAAO,CAAA;AAC7C,QAAA,IAAI,CAAC,2BAA2B,OAAA,EAAS;AACvC,UAAA,aAAA,CAAc,OAAA,GAAU,KAAA;AACxB,UAAA,aAAA,CAAc,cAAc,OAAO,CAAA;AAAA,QACrC;AAEA,QAAA,MAAM,aAAqC,GAAA,CAAI,MAAA;AAAA,UAC7C,CAAA,IAAA,KAAQ,IAAA,CAAK,MAAA,KAAW,aAAA,CAAc;AAAA,SACxC;AAEA,QAAA,IAAI,UAAA,CAAW,SAAS,CAAA,EAAG;AACzB,UAAA,QAAA,CAAS;AAAA,YACP,IAAA,EAAM,cAAA;AAAA,YACN,QAAA,EAAU;AAAA,cACR,aAAA,EAAe,2BAAA,CAA4B,UAAA,EAAY,CAAC,CAAA;AAAA,cACxD,QAAQ,gBAAA,CAAiB;AAAA;AAC3B,WACD,CAAA;AAAA,QACH;AAGA,QAAA,IAAI,YAAA,CAAa,WAAW,CAAA,EAAG;AAC7B,UAAA;AAAA,QACF;AAGA,QAAA,IAAI,CAAC,gBAAA,EAAkB;AACrB,UAAA,QAAA,CAAS,WAAA,CAAY,EAAE,MAAA,EAAQ,YAAA,CAAa,CAAC,CAAA,CAAE,EAAA,EAAI,CAAC,CAAA;AACpD,UAAA;AAAA,QACF;AAEA,QAAA,MAAM,OAAO,YAAA,CAAa,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,OAAO,gBAAgB,CAAA;AAG7D,QAAA,IAAI,CAAC,IAAA,EAAM;AACT,UAAA,QAAA,CAAS,WAAA,CAAY,EAAE,MAAA,EAAQ,YAAA,CAAa,CAAC,CAAA,CAAE,EAAA,EAAI,CAAA,EAAG;AAAA,YACpD,KAAA,EAAO,EAAE,gCAAgC;AAAA,WAC1C,CAAA;AACD,UAAA;AAAA,QACF;AAAA,MACF,CAAA;AAAA,MACA,CAAA,aAAA,KAAiB;AACf,QAAA,IAAI,CAAC,oBAAoB,OAAA,EAAS;AAChC,UAAA,QAAA,CAAS;AAAA,YACP,IAAA,EAAM,cAAA;AAAA,YACN,QAAA,EAAU;AAAA,cACR,QAAQ,gBAAA,CAAiB,sBAAA;AAAA,cACzB,aAAA,EAAe,iBAAA;AAAA,gBACb,EAAE,sCAAsC,CAAA;AAAA,gBACxC,aAAA;AAAA,gBACA;AAAA;AACF;AACF,WACD,CAAA;AAAA,QACH;AACA,QAAA,kBAAA,CAAmB,OAAA,GAAU,KAAA;AAC7B,QAAA,kBAAA,CAAmB,mBAAmB,OAAO,CAAA;AAC7C,QAAA,IAAI,CAAC,2BAA2B,OAAA,EAAS;AACvC,UAAA,aAAA,CAAc,OAAA,GAAU,KAAA;AACxB,UAAA,aAAA,CAAc,cAAc,OAAO,CAAA;AAAA,QACrC;AAAA,MACF;AAAA,KACF;AAAA,EAEF,CAAA,EAAG,EAAE,CAAA;AAGL,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,IAAI,gBAAA,EAAkB;AACpB,MAAA,MAAM,OAAO,KAAA,EAAO,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,OAAO,gBAAgB,CAAA;AACvD,MAAA,IAAI,IAAA,EAAM;AACR,QAAA,eAAA,CAAgB,IAAI,CAAA;AAAA,MACtB;AAAA,IACF;AAAA,EACF,CAAA,EAAG,CAAC,KAAA,EAAO,gBAAgB,CAAC,CAAA;AAE5B,EAAA,MAAM,eAAA,GAAkB,YAAY,MAAM;AACxC,IAAA,QAAA,CAAS;AAAA,MACP,IAAA,EAAM,YAAA;AAAA,MACN,cAAc,EAAE,SAAA,EAAW,OAAO,SAAA,EAAW,KAAA,EAAO,SAAS,KAAA;AAAM,KACpE,CAAA;AAAA,EACH,CAAA,EAAG,CAAC,QAAQ,CAAC,CAAA;AAGb,EAAA,MAAM,aAAA,GAAgB,YAAY,MAAM;AACtC,IAAA,QAAA,CAAS,EAAE,IAAA,EAAM,cAAA,EAAgB,QAAA,EAAU,MAAM,CAAA;AAAA,EACnD,CAAA,EAAG,CAAC,QAAQ,CAAC,CAAA;AAEb,EAAA,MAAM,qBAAA,GAAwB,WAAA;AAAA,IAC5B,CAAC,MAAA,KAA6B;AAC5B,MAAA,OAAO,MAAA,KAAW,gBAAA,CAAiB,kCAAA,GAC/B,EAAE,KAAA,EAAO,SAAS,KAAA,EAAO,IAAA,EAAM,QAAA,CAAS,IAAA,EAAK,GAC7C,MAAA;AAAA,IACN,CAAA;AAAA,IACA,CAAC,QAAA,CAAS,KAAA,EAAO,QAAA,CAAS,IAAI;AAAA,GAChC;AAEA,EAAA,SAAS,WAAW,EAAA,EAAY;AAC9B,IAAA,MAAM,iBAAiB,KAAA,EAAO,IAAA,CAAK,UAAQ,IAAA,CAAK,EAAA,KAAO,EAAE,CAAA,EAAG,EAAA;AAC5D,IAAA,IAAI,cAAA,EAAgB;AAClB,MAAA,QAAA,CAAS,WAAA,CAAY,EAAE,MAAA,EAAQ,cAAA,EAAgB,CAAC,CAAA;AAAA,IAClD;AAAA,EACF;AAEA,EAAA,SAAS,aAAA,CACP,IAAA,EACA,mBAAA,EACA,aAAA,EACA;AACA,IAAA,aAAA,CAAc,IAAI,CAAA;AAClB,IAAA,eAAA,CAAgB,IAAI,CAAA;AACpB,IAAA,QAAA,CAAS;AAAA,MACP,IAAA,EAAM,UAAA;AAAA,MACN,cAAc,EAAE,SAAA,EAAW,MAAM,OAAA,EAAS,KAAA,EAAO,WAAW,KAAA,EAAM;AAAA,MAClE,QAAA,EAAU;AAAA,KACX,CAAA;AACD,IAAA,MAAM,OAAA,GAA4B;AAAA,MAChC,GAAG,IAEL,CAAA;AACA,IAAA,SAAA;AAAA,MACE,OAAA,CAAQ,OAAA;AAAA,MACR,mBAAA;AAAA,MACA,OAAA,CAAQ,UAAA;AAAA,MACR,aAAA;AAAA,MACA,CAAA,GAAA,KAAO;AACL,QAAA,IAAI,CAAC,GAAA,CAAI,MAAA,EAAQ,MAAM,IAAI,MAAM,qBAAqB,CAAA;AACtD,QAAA,IAAI,CAAC,GAAA,CAAI,WAAA,EAAa,MAAM,IAAI,MAAM,0BAA0B,CAAA;AAChE,QAAA,MAAM,IAAA,GAAO,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,WAAW,CAAA;AACvC,QAAA,MAAM,OAAA,GAAU,UAAU,IAAI,CAAA;AAC9B,QAAA,MAAM,gBAAA,GAAqC;AAAA,UACzC,IAAI,GAAA,CAAI,MAAA;AAAA,UACR,QAAQ,UAAA,CAAW,KAAA;AAAA,UACnB,OAAA;AAAA,UACA,YAAY,IAAA,CAAK,UAAA;AAAA,UACjB,eAAe,IAAA,CAAK,aAAA;AAAA,UACpB,eAAe,IAAA,CAAK;AAAA,SACtB;AACA,QAAA,QAAA,CAAS,KAAA,GAAQ,CAAC,GAAG,KAAA,EAAO,gBAAgB,CAAA,GAAI,CAAC,gBAAgB,CAAC,CAAA;AAClE,QAAA,aAAA,CAAc,KAAK,CAAA;AACnB,QAAA,QAAA,CAAS,YAAY,EAAE,MAAA,EAAQ,GAAA,CAAI,MAAA,EAAQ,CAAC,CAAA;AAC5C,QAAA,QAAA,CAAS;AAAA,UACP,IAAA,EAAM,UAAA;AAAA,UACN,cAAc,EAAE,SAAA,EAAW,OAAO,OAAA,EAAS,KAAA,EAAO,WAAW,IAAA,EAAK;AAAA,UAClE,QAAA,EAAU;AAAA,YACR,GAAG,GAAA;AAAA,YACH,aAAA,EAAe,iBAAA,CAAkB,MAAA,EAAQ,GAAA,CAAI,QAAQ,CAAC;AAAA;AACxD,SACD,CAAA;AAAA,MACH,CAAA;AAAA,MACA,CAAC,OAA6B,aAAA,KAA2B;AACvD,QAAA,eAAA,CAAgB,YAAY,CAAA;AAC5B,QAAA,aAAA,CAAc,KAAK,CAAA;AAEnB,QAAA,MAAM,kBAAA,GAAqB,qBAAA,CAAsB,KAAA,CAAM,MAAM,CAAA;AAE7D,QAAA,QAAA,CAAS;AAAA,UACP,IAAA,EAAM,UAAA;AAAA,UACN,cAAc,EAAE,SAAA,EAAW,OAAO,OAAA,EAAS,IAAA,EAAM,WAAW,KAAA,EAAM;AAAA,UAClE,QAAA,EAAU;AAAA,YACR,GAAG,KAAA;AAAA,YACH,aAAA,EAAe,iBAAA;AAAA,cACb,iBAAA,CAAkB,OAAA,EAAS,KAAA,CAAM,MAAA,EAAQ,GAAG,kBAAkB,CAAA;AAAA,cAC9D,aAAA;AAAA,cACA;AAAA;AACF;AACF,SACD,CAAA;AAAA,MACH;AAAA,KACF;AAAA,EACF;AAEA,EAAA,SAAS,UAAA,CAAW,WAAwB,OAAA,EAAsB;AAChE,IAAA,IAAI,gBAAgB,KAAA,EAAO;AACzB,MAAA,MAAM,WAAA,GAAc;AAAA,QAClB,GAAG,YAAA;AAAA,QACH,QAAQ,UAAA,CAAW;AAAA,OACrB;AACA,MAAA,MAAM,YAAA,GAAe,YAAA;AAErB,MAAA,QAAA,CAAS;AAAA,QACP,IAAA,EAAM,UAAA;AAAA,QACN,cAAc,EAAE,SAAA,EAAW,MAAM,OAAA,EAAS,KAAA,EAAO,WAAW,KAAA,EAAM;AAAA,QAClE,QAAA,EAAU;AAAA,OACX,CAAA;AACD,MAAA,WAAA;AAAA,QACE,YAAA,CAAa,EAAA;AAAA,QACb,CAAA,GAAA,KAAO;AACL,UAAA,QAAA,CAAS;AAAA,YACP,IAAA,EAAM,UAAA;AAAA,YACN,cAAc,EAAE,SAAA,EAAW,OAAO,OAAA,EAAS,KAAA,EAAO,WAAW,IAAA,EAAK;AAAA,YAClE,QAAA,EAAU;AAAA,cACR,GAAG,GAAA;AAAA,cACH,aAAA,EAAe,iBAAA,CAAkB,MAAA,EAAQ,GAAA,CAAI,QAAQ,CAAC;AAAA;AACxD,WACD,CAAA;AACD,UAAA,eAAA,CAAgB,KAAK,CAAA;AACrB,UAAA,IAAI,GAAA,CAAI,MAAA,KAAW,gBAAA,CAAiB,WAAA,EAAa;AAC/C,YAAA,eAAA;AAAA,cACE,MAAM,IAAA,CAAK,CAAA,IAAA,KAAQ,KAAK,EAAA,KAAO,YAAA,CAAa,EAAE,CAAA,IAAK;AAAA,aACrD;AACA,YAAA,QAAA,CAAS,MAAM,MAAA,CAAO,CAAA,IAAA,KAAQ,KAAK,EAAA,KAAO,WAAA,CAAY,EAAE,CAAC,CAAA;AACzD,YAAA,IAAI,WAAW,SAAA,EAAU;AAAA,UAC3B,CAAA,MAAO;AACL,YAAA,eAAA,CAAgB,WAAW,CAAA;AAC3B,YAAA,QAAA;AAAA,cACE,KAAA,CAAM,GAAA;AAAA,gBAAI,CAAA,IAAA,KACR,IAAA,CAAK,EAAA,KAAO,YAAA,CAAa,KAAK,WAAA,GAAc;AAAA;AAC9C,aACF;AAAA,UACF;AAAA,QACF,CAAA;AAAA,QACA,CAAC,OAAO,aAAA,KAAkB;AACxB,UAAA,eAAA,CAAgB,YAAY,CAAA;AAE5B,UAAA,MAAM,kBAAA,GAAqB,qBAAA,CAAsB,KAAA,CAAM,MAAM,CAAA;AAE7D,UAAA,QAAA,CAAS;AAAA,YACP,IAAA,EAAM,UAAA;AAAA,YACN,cAAc,EAAE,SAAA,EAAW,OAAO,OAAA,EAAS,IAAA,EAAM,WAAW,KAAA,EAAM;AAAA,YAClE,QAAA,EAAU;AAAA,cACR,GAAG,KAAA;AAAA,cACH,aAAA,EAAe,iBAAA;AAAA,gBACb,iBAAA,CAAkB,OAAA,EAAS,KAAA,CAAM,MAAA,EAAQ,GAAG,kBAAkB,CAAA;AAAA,gBAC9D,aAAA;AAAA,gBACA;AAAA;AACF;AACF,WACD,CAAA;AACD,UAAA,eAAA,CAAgB,KAAK,CAAA;AACrB,UAAA,IAAI,SAAS,OAAA,EAAQ;AAAA,QACvB;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,MAAM,0BACJ,YAAA,EAAc,MAAA,KAAW,WAAW,aAAA,IACpC,YAAA,EAAc,WAAW,UAAA,CAAW,uBAAA;AAEtC,EAAA,MAAM,sBAAA,GAAyB,YAAY,MAAM;AAC/C,IAAA,QAAA,CAAS;AAAA,MACP,IAAA,EAAM,UAAA;AAAA,MACN,cAAc,EAAE,SAAA,EAAW,OAAO,OAAA,EAAS,IAAA,EAAM,WAAW,KAAA,EAAM;AAAA,MAClE,QAAA,EAAU;AAAA,QACR,QAAQ,gBAAA,CAAiB,4BAAA;AAAA,QACzB,aAAA,EAAe,EAAE,4CAA4C;AAAA;AAC/D,KACD,CAAA;AAAA,EACH,CAAA,EAAG,CAAC,QAAA,EAAU,CAAC,CAAC,CAAA;AAEhB,EAAA,SAAS,UAAA,CACP,IAAA,EACA,SAAA,EACA,OAAA,EACA;AACA,IAAA,IAAI,uBAAA,EAAyB;AAC3B,MAAA,sBAAA,EAAuB;AACvB,MAAA,OAAA,IAAU;AACV,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,gBAAgB,KAAA,EAAO;AACzB,MAAA,MAAM,qBAAA,GACJ,aAAa,eAAA,EAAiB,4BAAA,IAC9B,oBAAoB,YAAA,CAAa,OAAA,EAAS,KAAK,OAAO,CAAA;AAExD,MAAA,MAAM,WAAA,GAAgC;AAAA,QACpC,GAAG,YAAA;AAAA,QACH,YAAY,IAAA,CAAK,UAAA;AAAA,QACjB,SAAS,IAAA,CAAK,OAAA;AAAA,QACd,MAAA,EACE,aAAa,MAAA,KAAW,UAAA,CAAW,SAAS,qBAAA,GACxC,UAAA,CAAW,QACX,YAAA,CAAa,MAAA;AAAA,QACnB,qBAAA;AAAA,QACA,eAAe,IAAA,CAAK,aAAA;AAAA,QACpB,eAAA,EAAiB;AAAA,UACf,gBAAA,EAAkB,KAAA;AAAA,UAClB,4BAAA,EAA8B;AAAA;AAChC,OACF;AACA,MAAA,MAAM,YAAA,GAAe,YAAA;AACrB,MAAA,eAAA,CAAgB,WAAW,CAAA;AAC3B,MAAA,QAAA,CAAS;AAAA,QACP,IAAA,EAAM,UAAA;AAAA,QACN,cAAc,EAAE,SAAA,EAAW,MAAM,OAAA,EAAS,KAAA,EAAO,WAAW,KAAA,EAAM;AAAA,QAClE,QAAA,EAAU;AAAA,OACX,CAAA;AACD,MAAA,QAAA;AAAA,QACE,WAAA;AAAA,QACA,CAAA,GAAA,KAAO;AACL,UAAA,QAAA,CAAS;AAAA,YACP,IAAA,EAAM,UAAA;AAAA,YACN,cAAc,EAAE,SAAA,EAAW,OAAO,OAAA,EAAS,KAAA,EAAO,WAAW,IAAA,EAAK;AAAA,YAClE,QAAA,EAAU;AAAA,cACR,GAAG,GAAA;AAAA,cACH,aAAA,EAAe,iBAAA,CAAkB,MAAA,EAAQ,GAAA,CAAI,QAAQ,CAAC;AAAA;AACxD,WACD,CAAA;AACD,UAAA,IAAI,iBAAA,IAAqB,GAAA,IAAO,GAAA,CAAI,eAAA,EAAiB,cAAA,EAAgB;AACnE,YAAA,WAAA,CAAY,cAAA,GAAiB,IAAI,eAAA,CAAgB,cAAA;AACjD,YAAA,WAAA,CAAY,SAAS,UAAA,CAAW,eAAA;AAAA,UAClC;AACA,UAAA,eAAA,CAAgB,WAAW,CAAA;AAC3B,UAAA,QAAA;AAAA,YACE,KAAA,CAAM,IAAI,CAAA,CAAA,KAAM,CAAA,CAAE,OAAO,YAAA,CAAa,EAAA,GAAK,cAAc,CAAE;AAAA,WAC7D;AACA,UAAA,eAAA,CAAgB,KAAK,CAAA;AACrB,UAAA,IAAI,WAAW,SAAA,EAAU;AAAA,QAC3B,CAAA;AAAA,QACA,CAAC,OAAO,aAAA,KAAkB;AACxB,UAAA,MAAM,kBAAA,GAAqB,qBAAA,CAAsB,KAAA,CAAM,MAAM,CAAA;AAE7D,UAAA,QAAA,CAAS;AAAA,YACP,IAAA,EAAM,UAAA;AAAA,YACN,cAAc,EAAE,SAAA,EAAW,OAAO,OAAA,EAAS,IAAA,EAAM,WAAW,KAAA,EAAM;AAAA,YAClE,QAAA,EAAU;AAAA,cACR,GAAG,KAAA;AAAA,cACH,aAAA,EAAe,iBAAA;AAAA,gBACb,iBAAA,CAAkB,OAAA,EAAS,KAAA,CAAM,MAAA,EAAQ,GAAG,kBAAkB,CAAA;AAAA,gBAC9D,aAAA;AAAA,gBACA;AAAA;AACF;AACF,WACD,CAAA;AACD,UAAA,eAAA,CAAgB,KAAK,CAAA;AACrB,UAAA,IAAI,SAAS,OAAA,EAAQ;AACrB,UAAA,eAAA,CAAgB,YAAY,CAAA;AAAA,QAC9B;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,SAAS,WAAA,GAAc;AACrB,IAAA,IAAI,gBAAgB,KAAA,EAAO;AACzB,MAAA,QAAA,CAAS;AAAA,QACP,IAAA,EAAM,YAAA;AAAA,QACN,cAAc,EAAE,SAAA,EAAW,MAAM,OAAA,EAAS,KAAA,EAAO,WAAW,KAAA;AAAM,OACnE,CAAA;AACD,MAAA,YAAA;AAAA,QACE,YAAA,CAAa,EAAA;AAAA,QACb,CAAA,GAAA,KAAO;AACL,UAAA,MAAM,KAAA,GAAQ,IAAI,eAAA,EAAiB,cAAA;AACnC,UAAA,MAAM,WAAA,GAAc;AAAA,YAClB,GAAG,YAAA;AAAA,YACH,QACE,YAAA,CAAa,MAAA,KAAW,WAAW,KAAA,GAC/B,UAAA,CAAW,kBACX,UAAA,CAAW,uBAAA;AAAA,YACjB,cAAA,EAAgB;AAAA,WAClB;AACA,UAAA,eAAA,CAAgB,WAAW,CAAA;AAC3B,UAAA,QAAA;AAAA,YACE,KAAA,CAAM,IAAI,CAAA,CAAA,KAAM,CAAA,CAAE,OAAO,YAAA,CAAa,EAAA,GAAK,cAAc,CAAE;AAAA,WAC7D;AACA,UAAA,QAAA,CAAS;AAAA,YACP,IAAA,EAAM,UAAA;AAAA,YACN,cAAc,EAAE,SAAA,EAAW,OAAO,OAAA,EAAS,KAAA,EAAO,WAAW,IAAA,EAAK;AAAA,YAClE,QAAA,EAAU;AAAA,cACR,GAAG,GAAA;AAAA,cACH,aAAA,EAAe,iBAAA,CAAkB,MAAA,EAAQ,GAAA,CAAI,QAAQ,CAAC;AAAA;AACxD,WACD,CAAA;AAAA,QACH,CAAA;AAAA,QACA,CAAC,OAAO,aAAA,KAAkB;AACxB,UAAA,MAAM,kBAAA,GAAqB,qBAAA,CAAsB,KAAA,CAAM,MAAM,CAAA;AAE7D,UAAA,QAAA,CAAS;AAAA,YACP,IAAA,EAAM,UAAA;AAAA,YACN,cAAc,EAAE,SAAA,EAAW,OAAO,OAAA,EAAS,IAAA,EAAM,WAAW,KAAA,EAAM;AAAA,YAClE,QAAA,EAAU;AAAA,cACR,GAAG,KAAA;AAAA,cACH,aAAA,EAAe,iBAAA;AAAA,gBACb,iBAAA,CAAkB,OAAA,EAAS,KAAA,CAAM,MAAA,EAAQ,GAAG,kBAAkB,CAAA;AAAA,gBAC9D,aAAA;AAAA,gBACA;AAAA;AACF;AACF,WACD,CAAA;AAAA,QACH;AAAA,OACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,MAAM,KAAA,GAAQ;AAAA,IACZ,KAAA;AAAA,IACA,UAAA;AAAA,IACA,YAAA;AAAA,IACA,aAAA;AAAA,IACA,UAAA;AAAA,IACA,UAAA;AAAA,IACA,sBAAA;AAAA,IACA,WAAA;AAAA,IACA,cAAc,UAAA,CAAW,YAAA;AAAA,IACzB,eAAA;AAAA,IACA,aAAA;AAAA,IACA,YAAA;AAAA,IACA,UAAA;AAAA,IACA,UAAU,UAAA,CAAW,QAAA;AAAA,IACrB;AAAA,GACF;AAEA,EAAA,uBACE,GAAA;AAAA,IAAC,WAAA,CAAY,QAAA;AAAA,IAAZ;AAAA,MACC,KAAA,EAAO;AAAA,QACL,GAAG,KAAA;AAAA,QACH,uBAAA,EAAyB,KAAA;AAAA,QACzB,0BAAA;AAAA,QACA;AAAA,OACF;AAAA,MAEC;AAAA;AAAA,GACH;AAEJ;AAEO,SAAS,QAAA,GAAW;AACzB,EAAA,MAAM,OAAA,GAAU,WAAW,WAAW,CAAA;AACtC,EAAA,IAAI,YAAY,MAAA,EAAW;AACzB,IAAA,MAAM,IAAI,MAAM,6CAA6C,CAAA;AAAA,EAC/D;AACA,EAAA,OAAO,OAAA;AACT;;;;"}
@@ -623,6 +623,7 @@ const pluginRiScMessages = {
623
623
  DefaultErrorMessage: "An error occurred",
624
624
  ErrorWhenNoWriteAccessToRepository: "Unable to update RiSc. You do not have write access to {{owner}}/{{name}}.",
625
625
  ErrorWhenUpdatingRiSc: "Failed to update risk scorecard",
626
+ ErrorWhenUpdatingDeletedRiSc: "Failed to update risk scorecard. RiSc is marked for deletion.",
626
627
  ErrorWhenDeletingRiSc: "Failed to delete risk scorecard",
627
628
  ErrorWhenCreatingPullRequest: "Failed to save approval of risk scorecard",
628
629
  ErrorWhenCreatingRiSc: "Failed to create risk scorecard",
@@ -685,8 +686,8 @@ const pluginRiScMessages = {
685
686
  listUpdatedActions: "Recently updated actions"
686
687
  },
687
688
  firstRiScCard: {
688
- noRiScYet: "No RiSc analyses created yet",
689
- getStarted: "Get started with risk and vulnerability analysis for your team"
689
+ noRiScYet: "Could not load any RoS-analyses",
690
+ getStarted: "Get started with risk and vulnerability analysis for your team, or try reload the page if you have already created one."
690
691
  },
691
692
  filter: {
692
693
  title: "Title (a-z)",
@@ -1148,6 +1149,7 @@ const pluginRiScNorwegianTranslation = createTranslationResource({
1148
1149
  "errorMessages.DefaultErrorMessage": "Det oppstod en feil",
1149
1150
  "errorMessages.ErrorWhenNoWriteAccessToRepository": "Kunne ikke oppdatere ROS. Du har ikke skrivetilgang til {{owner}}/{{name}}.",
1150
1151
  "errorMessages.ErrorWhenUpdatingRiSc": "Kunne ikke lagre risiko- og s\xE5rbarhetsanalyse",
1152
+ "errorMessages.ErrorWhenUpdatingDeletedRiSc": "Kunne ikke lagre risiko- og s\xE5rbarhetsanalyse. Den har blitt markert for sletting.",
1151
1153
  "errorMessages.ErrorWhenDeletingRiSc": "Kunne ikke slette risiko- og s\xE5rbarhetsanalyse",
1152
1154
  "errorMessages.ErrorWhenCreatingRiSc": "Kunne ikke opprette risiko- og s\xE5rbarhetsanalyse",
1153
1155
  "errorMessages.RiScDoesNotExist": "Risiko- og s\xE5rbarhetsanalysen du pr\xF8ver \xE5 \xE5pne eksisterer ikke",
@@ -1198,7 +1200,7 @@ const pluginRiScNorwegianTranslation = createTranslationResource({
1198
1200
  "filterButton.veryOutdated": "Veldig utdaterte tiltak",
1199
1201
  "filterButton.outdated": "Utdaterte tiltak",
1200
1202
  "filterButton.listUpdatedActions": "Nylig oppdaterte tiltak",
1201
- "firstRiScCard.noRiScYet": "Ingen RoS-analyser opprettet enda",
1203
+ "firstRiScCard.noRiScYet": "Kunne ikke laste inn RoS-analyser",
1202
1204
  "firstRiScCard.getStarted": "Kom igang med risiko- og s\xE5rbarhetsanalyse for ditt team",
1203
1205
  "filter.title": "Tittel (a-\xE5)",
1204
1206
  "filter.initialRisk": "Startrisiko (h\xF8y-lav)",
@@ -1 +1 @@
1
- {"version":3,"file":"translations.esm.js","sources":["../../src/utils/translations.ts"],"sourcesContent":["import {\n createTranslationRef,\n createTranslationResource,\n} from '@backstage/core-plugin-api/alpha';\n\nexport const pluginRiScMessages = {\n currentLanguage: 'en',\n contentHeader: {\n title: 'Risk scorecard',\n createNewButton: 'Create new scorecard',\n editEncryption: 'Edit encryption',\n deleteButton: 'Delete scoreboard',\n multipleRiScs: 'RiSc scorecards',\n },\n dictionary: {\n by: 'By',\n click: 'Click',\n here: 'here',\n rejectedLogin: 'Login rejected by user.',\n yes: 'Yes',\n no: 'No',\n summary: 'Summary',\n noAccess: 'No access',\n optional: 'optional',\n month: 'month',\n week: 'week',\n day: 'day',\n hour: 'hour',\n minute: 'minute',\n second: 'second',\n months: 'months',\n weeks: 'weeks',\n days: 'days',\n hours: 'hours',\n minutes: 'minutes',\n seconds: 'seconds',\n action: 'Action',\n add: 'Add',\n added: 'Added',\n availability: 'Availability',\n copy: 'Copy',\n copied: 'Copied',\n cancel: 'Cancel',\n close: 'Close',\n completed: 'Completed',\n confidentiality: 'Confidentiality',\n confirm: 'Confirm',\n consequence: 'Consequence', // Severity, Impact, Effect or Consequence\n deadline: 'Deadline', // Deadline or Due date\n delete: 'Delete',\n description: 'Description',\n discardChanges: 'Discard changes',\n edit: 'Edit',\n estimatedRisk: 'Estimated risk',\n estimatedInitialRisk: 'Estimated initial risk',\n estimatedRemainingRisk: 'Estimated remaining risk',\n estimatedCurrentRisk: 'Estimated current risk',\n example: 'Example',\n initialRisk: 'Initial risk', // Starting or Initial risk\n integrity: 'Integrity',\n measure: 'Action', // Measure, Action or Initiative\n measures: 'Actions', // Measure, Action or Initiative\n measuresInitialRiSc: 'actions',\n measureOwner: 'Responsible', // Responsible? Measure owner? Initiative owner?\n next: 'Next',\n planned: 'Planned',\n previous: 'Previous',\n probability: 'Probability', // Likelihood or Probability\n restRisk: 'Remaining risk', // Residual or Remaining risk\n currentRisk: 'Current risk',\n removed: 'Removed',\n risk: 'Risk',\n riskExplanation: {\n initial: 'Risk before actions are completed',\n current: 'Current risk based on current action status',\n remaining: 'Risk after all actions are completed',\n },\n save: 'Save',\n saveAndClose: 'Save and close',\n scenario: 'Scenario',\n scope: 'Scope',\n status: 'Status',\n threatActors: 'Threat actors',\n theThreatActor: 'The threat actor',\n theThreatActors: 'The threat actors',\n title: 'Title',\n unknown: 'Unknown',\n url: 'URL',\n emptyField: 'No {{field}} specified',\n valuation: 'Valuation',\n version: 'Version',\n vulnerabilities: 'Vulnerabilities',\n theVulnerability: 'The vulnerability',\n theVulnerabilities: 'The vulnerabilities',\n showOnlyRelevant: 'Show only relevant',\n noRelevantMeasures: 'No relevant actions',\n scenarios: 'scenarios',\n customOrder: 'Custom order',\n searchQuery: 'No result for ',\n actionsWithStatus: 'Actions that are OK',\n refresh: 'Refresh',\n },\n encryption: {\n title: 'Encryption',\n },\n rosStatus: {\n statusBadge: {\n missing:\n 'Once the draft is complete, the risk owner can review and accept the changes.', // Mangler godkjenning av risikoeier\n approved: 'Accepted by risk owner', // Godkjent av risikoeier\n error: 'Failed to retrieve status', // Kunne ikke hente status\n migration: {\n title: 'You are required to review and save changes',\n description:\n 'There has been done changes to the risk scorecard, as a result of a migration to the newest version. The changes may include deletion and modification of information. It will not be possible to save edits of the scorecard without including and accepting the changes.', // Automatisk migrering av ROS\n },\n created: 'Empty scorecard created',\n draft: 'Draft',\n waiting: 'Awaiting approval',\n published: 'Published',\n draftDeletion: 'Marked for deletion',\n waitingDeletion: 'Awaiting deletion',\n deletionApproval: 'The risk owner can review and accept the deletion.',\n },\n updatedStatus: {\n UPDATED: 'Updated status icon',\n LITTLE_OUTDATED: 'Little outdated status icon',\n OUTDATED: 'Outdated status icon',\n VERY_OUTDATED: 'Very outdated status icon',\n error: 'Error status icon',\n disabled: 'Disabled status icon',\n tooltip: {\n OUTDATED: 'This action is outdated',\n VERY_OUTDATED: 'This action is very outdated',\n },\n },\n lastModified: 'Last published: ',\n daysSinceLastModified: '{{days}} days and {{numCommits}} commits ago',\n notPublishedYet: 'RiSc is not published yet',\n errorMessage: 'Failed to retrieve status',\n outdated: 'Outdated',\n veryOutdated: 'Very outdated',\n updated: 'Updated',\n updating: 'Saving...',\n difference: {\n description: 'Summary of changes that will be approved by risk owner.',\n publishDate: 'Last published changes {{date}}',\n fetching: 'Fetching changes',\n error: 'Error while fetching changes',\n newROS: 'No published Risk scorecards to compare with',\n differences: {\n title: 'CHANGES',\n noneRemoved: 'Nothing is removed',\n titleRemoved: 'Removed from risk scorecard',\n titleExisting: 'Changed in existing risk scorecard',\n noneExisting: 'Nothing is changed',\n titleAdded: 'Added to risk scorecard',\n noneAdded: 'Nothing is added',\n },\n },\n editing: 'You can now start editing',\n approveButtonUpdate: 'Accept risks', // Approve RiSc\n approveButtonDelete: 'Accept deletion', // Approve deletion of RiSc\n prStatus: ' Merge the PR in ', // Avventer godkjenning av PR i Github\n prStatus2Update: ' to publish the scorecard.', // Approve RiSc\n prStatus2Delete: ' to delete the scorecard.', // Approve deletion of RiSc\n moreInformationButton: 'More information', // Lagre ROS migrering\n githubLink: 'Go to GitHub',\n },\n publishDialog: {\n titleUpdate: 'Accept risks', // Approve ROS\n titleDelete: 'Accept deletion', // Delete ROS\n checkboxLabelUpdate:\n 'I confirm that the risk owner accepts the risks detailed in this risk scorecard.',\n checkboxLabelDelete:\n 'I confirm that the risk owner accepts the deletion of this risk scorecard.',\n },\n migrationDialog: {\n description:\n 'The changes have been made to adhere to the latest schema version.',\n migrationTitle: 'Migration from {{from}} to {{to}}',\n schemaVersion: 'Schema version',\n schemaChangelog: 'Open schema changelog',\n title: 'Save changes', // Lagre ROS migrering\n checkboxLabel:\n 'I confirm that I have reviewed and wish to save the changes made during the migration.',\n migration40: {\n changeExplanation:\n 'This migration changes preset values for consequence and probability.',\n owner: 'Responsible',\n deadline: 'Deadline',\n existingActions: 'Existing actions',\n vulnerabilitiesTitle: 'Vulnerabilities',\n vulnerabilities: {\n 'Compromised admin user': 'Compromised admin user',\n 'Denial of service': 'Denial of service',\n 'Disclosed secret': 'Disclosed secret',\n 'Escalation of rights': 'Escalation of rights',\n 'Excessive use': 'Excessive use',\n 'Information leak': 'Information leak',\n 'User repudiation': 'User repudiation',\n 'Unauthorized access': 'Unauthorized use',\n 'Unmonitored use': 'Unmonitored use',\n },\n },\n migration41: {\n changeExplanation:\n 'This migration removes the owner and deadline fields from actions, removes existing actions and updates values for vulnerabilities.',\n nokPerIncident: 'NOK/incident',\n occurrencesPerYear: 'occurrences/year',\n },\n migration42: {\n changeExplanation: 'This migration adds a last updated field to actions.',\n },\n migration50: {\n changeExplanation:\n 'This migration updates the action status to a new naming convention.',\n },\n migration51: {\n changeExplanation:\n 'This migration adds a last updated by field to actions.',\n lastUpdatedBy: 'Last updated by:',\n addedLastUpdatedBy:\n 'Added field to track who updated an action for {{numberOfChangedActions}} existing actions',\n },\n migration52: {\n changeExplanation:\n 'This migration removes the unused concept of valuations from the RiSc document.',\n title: 'Valuations removed',\n oldValue: 'Existing valuations removed',\n },\n removed: 'Removed',\n },\n comparisonDialog: {\n noChanges: 'No changes',\n changes: 'Changes to RiSc',\n noURL: 'No URL provided',\n noDescription: 'No description provided',\n risk: {\n probabilityUnit: 'occurrences/year',\n consequenceUnit: 'NOK/incident',\n },\n valuation: {\n integrity: {\n Insignificant: 'Insignificant',\n Expected: 'Expected',\n Dependent: 'Dependent',\n Critical: 'Critical',\n },\n availability: {\n Insignificant: 'Insignificant',\n '2 days': '2 days',\n '4 hours': '4 hours',\n Immediate: 'Immediate',\n },\n confidentiality: {\n Public: 'Public',\n Internal: 'Internal',\n Confidential: 'Confidential',\n 'Strictly confidential': 'Strictly confidential',\n },\n },\n },\n supportDialog: {\n title: 'Support',\n openEntry: 'Open',\n entries: {\n riscFeedbackChannel: {\n title: 'RISC Feedback Channel',\n description: '#kodenær-ros-tilbakemelding',\n },\n riscDocumentation: {\n title: 'RISC Documentation',\n description: 'Confluence - RISC',\n },\n },\n },\n scenarioTable: {\n title: 'Risk scenarios',\n addScenarioButton: 'Add scenario',\n noActions: 'No actions',\n columns: {\n consequenceChar: 'C',\n probabilityChar: 'P',\n completed: 'complete',\n },\n editButton: 'Edit list',\n doneEditing: 'Finish editing',\n noActionsLong: 'The scenario has no actions',\n },\n riskMatrix: {\n title: 'Risk matrix', // Risk matrix or Risk overview\n estimatedRisk: {\n title: 'Estimated risk',\n suffix: {\n thousand: '{{count}} thousand',\n million_one: '{{count}} million',\n million_other: '{{count}} million',\n billion_one: '{{count}} billion',\n billion_other: '{{count}} billion',\n trillion_one: '{{count}} trillion',\n trillion_other: '{{count}} trillion',\n },\n unit: {\n nokPerYear: 'NOK/year',\n },\n },\n tooltip: {\n title: 'Risk scenarios',\n },\n currentRisk: {\n title: 'Risc reduction',\n description:\n \"The diagram illustrates the development from today's initial risk to the calculated final risk. <strong>{{actionsOk}}</strong> completed actions represent a reduction of <strong>{{reduction}} NOK/year.</strong>\",\n showMoreInfo: 'Risk statistics per scenario',\n dialogHeader: 'Risk statistics per scenario',\n dialogDescription:\n 'This table shows risk statistics per scenario. All actions within a scenario are weighted equally, so each completed action contributes the same amount of risk reduction. Use the dropdown to choose which metric to display:',\n metricCurrentRiskDescription:\n 'estimated risk based on the share of completed actions.',\n metricPotentialReductionDescription:\n 'how much the risk can still be reduced by completing remaining actions.',\n metricReductionPerActionDescription:\n 'potential reduction divided equally across remaining relevant actions.',\n scenarioColumn: 'Scenario',\n metricLabel: 'Metric',\n metricCurrentRisk: 'Current risk',\n metricReductionPerAction: 'Risk reduction per action',\n metricPotentialReduction: 'Potential reduction',\n },\n },\n infoDialog: {\n title: 'Estimated risk',\n description:\n 'The estimated risk is a calculation based on the risks the different scenarios pose. If there is a high probability that a serious consequence will occur, this could potentially become a large cost for the organization. In other words, the cost is an attempt to make the risk value more tangible and is the sum of the estimated risk for all the risk scenarios in this risk scorecard.',\n calculatedHowTitle: 'How do we calculate the estimated risk?',\n calculatedHow:\n 'Probability (P) is measured in incidents per year and consequence (C) is measured in cost (in NOK) per incident. ' +\n 'The estimated risk is calculated as 20',\n calculatedHowExponent: 'P+C-1',\n consequenceTitle: 'Consequence (NOK/incident)', // incident, event or occurrence\n consequenceUnit: 'NOK/incident',\n consequenceDescription: {\n oneworkday: '1 workday',\n oneworkmonth: '1 work month',\n oneworkyear: '1 work year',\n '20workyears': '20 work years',\n '400workyears': '400 work years',\n },\n probabilityTitle: 'Probability (incidents/year)',\n probabilityUnit: 'incidents/year',\n probabilityDescription: {\n every400years: 'Once every 400 years',\n every20years: 'Once every 20 years',\n annualy: 'Annually',\n monthly: 'Monthly',\n daily: 'Daily',\n },\n example: {\n part1: 'A risk scenario with probability ',\n part2: ' and consequence ',\n part3: ' has an estimated risk of ',\n },\n currentRisk: {\n title: 'Current risk calculations',\n description:\n 'Current risk blends the starting risk, the planned end risk, and how far the mitigation actions have progressed. For each scenario, we first compute the initial risk',\n remainingRiskCost: 'and the remaining risk',\n actionRatio:\n 'Then we measure how many relevant actions are completed (ratio) = (number of completed actions) / (number of actions not marked “Not relevant”). If no relevant actions, ratio = 0.',\n currentRiskCost:\n 'The current risk interpolates between start and remaining risk based on that ratio',\n aggregated: 'The aggregated current risk is the sum of ',\n aggregatedSums: 'across all scenarios, reported in NOK per year.',\n },\n },\n rosDialog: {\n titleNew: 'New risk scorecard',\n titleEdit: 'Edit scorecard',\n editEncryption: 'Edit encryption',\n titleError: 'The scorecard has to have a title',\n scopeDescription:\n 'Describe what the risk analysis will assess. Specify any key areas which are not part of the scope.',\n scopeError: 'The scorecard has to have a description of the scope',\n generateInitialDescription:\n 'RiSc Scorecard lets you generate a default RiSc based on information about the codebase in kartverket.dev, security metrics and security controls.',\n generateInitialToggleDescription: 'Do you want to generate a default RiSc?',\n fromScratch: 'Empty',\n generateDefault: 'Default',\n stepRiscDetails: 'Risk Scorecard Details',\n stepEncryption: 'Configure Encryption',\n initialRiscTitle: 'Predefined Risk Scorecard',\n initialRiscScopeDescription:\n 'Do you want to generate a RoS with predefined scenarios and actions?',\n initialRiscApplicationType: 'What type of application do you have?',\n generateObsRiScDescription:\n 'This RoS contains scenarios that should be considered for build and deploy.',\n generateInternalJobRiScDescription:\n 'This RoS contains scenarios that should be considered for internal tools and jobs',\n generateStandardRiScDescription:\n 'This RoS is generated from information about the codebase in kartverket.dev, security metrics and security controllers.',\n noInitialRiScFound: 'No default RoS is currently available.',\n applicationType: 'Choose application type',\n titleAndScope: 'Title and scope',\n recommendedForComponentOfType: 'Recommended for components of type',\n },\n sopsConfigDialog: {\n title: 'Encryption',\n description: {\n new: 'The Risc Scorecard will be encrypted to limit access. Below please choose a key from Google Cloud Platform which you and your team can access.',\n edit: 'The Risc Scorecard will be encrypted to limit access. You can change which key is utilized from Google Cloud Platform, make sure the correct people have access to the new key.',\n },\n selectKeysTitle: 'Choose encryption key',\n chooseGcpCryptoKey: 'Choose GCP key',\n gcpCryptoKeyDescription:\n 'From the list below, select the GCP crypto key you want to use for encrypting and decrypting the Risk scorecard.',\n cryptoKeyOptionInfo:\n '(Project: {{projectId}}, Permissions: {{permissions}})',\n cryptoKeyPermissionENCRYPT: 'Encrypt',\n cryptoKeyPermissionDECRYPT: 'Decrypt',\n cryptoKeyPermissionUNKNOWN: '⚠️ Unknown - you should switch to another key',\n gcpCryptoKeyNoSelectableKey:\n 'You do not have access to any suitable GCP crypto keys.',\n gcpCryptoKeyNonSelectedErrorMessage: 'A GCP crypto key must be selected.',\n publicAgeKeysAlreadyPresent: 'The following age keys are already present:',\n publicAgeKeyQuestion:\n 'Does anyone need to write Risk scorecards locally using their editor?',\n writeLocalRiscSuffix: \"to learn more about writing RiSc's locally.\",\n publicAgeKeyDescription:\n 'Provide a public age key below for individuals allowed local editing',\n addPublicAgeKey: 'Add public age key',\n publicAgeKey: 'Public age key',\n update: 'Update',\n createPRTitle: 'Create a Pull Request with the new encryption scheme',\n createPRContent:\n 'Your encryption configuration is now ready and has been created in a new branch. Below you can create a PR with these changes. Alternatively, you can move the changes to a different branch by clicking the \"Branch\" button and selecting another active branch.',\n PRTitle: 'Review and merge the Pull Request',\n SummaryDescription: 'A PR with the encryption scheme has now been created.',\n SummaryGCP: 'The selected GCP key is ',\n SummaryAgeKeys: 'The following public age keys have also been added: ',\n PRContent:\n 'Click the button below to view the changes, review them, and merge the PR. After you merge the PR, you can start creating and managing Risk scorecards.',\n required: 'This field is required',\n publicKeyHelperTextKeyAlreadyExists: 'Public key already added',\n publicKeyHelperTextKeyAlreadyExistInSopsConfig:\n 'Public key already present in existing SOPS configuration',\n publicKeyHelperTextKeyNotValid: 'Public key is not a valid age public key',\n pendingTitle: 'Pending SOPS configuration',\n pendingDescription:\n 'The following pull requests are opened to include a SOPS configuration in the GitHub-repo',\n secondaryPullRequestText: 'Opened _n_ ago by',\n reEncryptTitle: \"Re-encryption of existing RiSc's\",\n reEncryptDescription:\n \"When updating SOPS configuration, you will not be able to decrypt old RiSc's encrypted with the previous SOPS configuration. We therefore encourage you to re-encrypt the existing RiSc's on the default branch of your GitHub-repository for you to be able to use them with your updated SOPS configuration.\",\n reEncryptConsentDescription:\n \"Do you want to re-encrypt the RiSc's on the default branch of \",\n openPR: 'Create pull request',\n gotoPullRequest: 'Go to pull request',\n },\n scenarioStepper: {\n initialRiskStep: {\n title: 'Initial risk',\n subtitle:\n 'The initial risk is defined by the consequence of the scenario and the probability of it occurring.',\n consequenceSubtitle:\n 'How severe is the potential impact? If the scenario can impact more than one category, choose the highest level of consequence.',\n probabilitySubtitle:\n 'How likely is it that this scenario will occur? If you are between two probability values, choose the higher one.',\n },\n restRiskStep: {\n title: 'Remaining risk',\n subtitle:\n 'What is the risk reduced to when all the planned actions have been completed?',\n consequenceSubtitle:\n 'How severe is the consequence of this scenario after all actions are complete?',\n probabilitySubtitle:\n 'What is the likelihood of this scenario after all actions are complete?',\n },\n },\n scenarioDrawer: {\n action: {\n requiredError: 'Field is required',\n descriptionError: 'Description cannot be empty',\n urlError: 'Invalid URL',\n emptyState: 'This scenario has no defined actions',\n lastUpdated: 'Last updated:',\n notUpdated: 'No date',\n },\n title: 'Risk scenario',\n newTitle: 'New risk scenario',\n titleError: 'Scenario title is required',\n subtitle: 'An unwanted incident that could potentially harm the component.', // harm or affect negatively?\n threatActorSubtitle: 'Someone who attempts to access or abuse the system', // system or component or both?\n vulnerabilitySubtitle:\n 'Weakness in the system that the threat actor can exploit',\n createNewScenario: 'Create new scenario',\n saveAsDraft: 'Save as draft',\n riskMatrixModal: {\n startRisk: 'What is the risk before any mitigating actions are taken?',\n restRisk: 'What is the risk after all planned actions are completed?',\n title: 'Risk matrixes',\n },\n consequenceTab: {\n subtitle:\n 'How severe is the potential impact? If the scenario can impact more than one category, choose the highest level of consequence.',\n },\n probabilityTab: {\n subtitle:\n 'How likely is it that this scenario will occur? If you are between two probability values, choose the higher one.',\n },\n measureTab: {\n subtitle:\n 'What actions should be taken to avoid or reduce the risk of this scenario?',\n measureOwnerDescription:\n 'Decide who will be responsible for completion of this action',\n addMeasureButton: 'Add planned action',\n plannedMeasures: 'Planned actions',\n addMeasureTitleError: 'Action title is required',\n urlDescription: 'For example, link to Jira task',\n },\n restRiskTab: {\n subtitle:\n 'Define the remaining risk for the scenario. Remaining risk is the consequence and probability for this ' +\n 'scenario after all planned actions have been completed.',\n },\n deleteScenarioButton: 'Delete scenario',\n deleteScenarioConfirmation:\n 'Are you sure you want to delete this scenario?',\n deleteActionButton: 'Delete action',\n deleteActionConfirmation: 'Are you sure you want to delete this action?',\n closeConfirmation: 'Do you want to save your changes?',\n errors: {\n remainingProbabilityTooHigh:\n 'Remaining probability cannot be higher than initial probability',\n remainingConsequenceTooHigh:\n 'Remaining consequence cannot be higher than initial consequence',\n },\n },\n consequenceTable: {\n rows: {\n '1': 'Negligible', // Insignificant, negligible (ubetydelig)\n '2': 'Small', // Liten\n '3': 'Moderate',\n '4': 'Severe', // Alvorlig\n '5': 'Critical', // Catastrophic eller Critical\n },\n columns: {\n health: 'Life and health', // Health and safety, Life and limb, Health and lives (Liv og helse)\n economical: 'Financial', // Financial consequences, economic implications\n privacy: 'Privacy', // Personvern\n reputation: 'Reputation and trust', // Reputation and trust, confidence, faith (Omdømme og tillit)\n },\n cells: {\n health: {\n '1': 'Impact on life and health cannot be rated less severe than 3', // Liv og helse kan ikke være mindre alvorlig enn 3\n '2': 'Impact on life and health cannot be rated less severe than 3',\n '3': 'Temporary or less severe health implications. Temporary or minor damage to local environment.', // implications, effects or consequence? Temporary or minor? Midlertidige eller mindre alvorlige helsemessige konsekvenser. Midlertidig eller mindre skade på miljøet\n '4': 'Permanent or severe health implications for a few people. Moderate damage to the environment in a limited area.',\n '5': 'Death or permanent severe health implications for many people. Severe damage to the environment across large areas.',\n },\n economical: {\n '1': 'Temporary minor financial loss.\\n\\nMay be fixed with 1 workday.',\n '2': 'Temporary financial loss.\\n\\nMay be fixed with 1 work month.',\n '3': 'Financial loss of some duration.\\n\\nMay be fixed with 1 work year.',\n '4': 'Financial loss of considerable duration for the organization and any third parties.\\n\\nMay be fixed with 20 work years.',\n '5': 'Permanent and severe financial loss.\\n\\nMay be fixed with 400 work years.',\n },\n privacy: {\n '1': 'The right to privacy is violated for a very short period and does not involve sensitive categories or vulnerable groups', // særlige kategorier = sensitive kategorier? special/particular/sensitive categories\n '2': 'The right to privacy is violated for a longer period and involves sensitive categories or vulnerable groups.',\n '3': 'Violations of the rights and freedoms for the registered people.',\n '4': 'Severe violations and breaches of the rights and freedoms for the registered people, as well as violations of the law.',\n '5': 'Impact on privacy cannot be rated more severe than 4',\n },\n reputation: {\n '1': 'Temporary loss of reputation and little impact on trust',\n '2': 'Negative attention in national media that leads to loss of reputation.\\n\\nMay reduce trust.',\n '3': 'Lasting negative attention in national and international media that leads to severe loss of reputation.\\n\\nSevere loss of trust from authorities.\\n\\nUsers who do not dare or want to use the services.', // lasting, severe, severe loss, severe loss of trust, do not dare or want to use the services\n '4': 'Impact on reputation and trust cannot be rated more severe than 3',\n '5': 'Impact on reputation and trust cannot be rated more severe than 3',\n },\n },\n },\n probabilityTable: {\n rows: {\n '1': 'Very low', // svært liten\n '2': 'Low', // liten\n '3': 'Moderate', // moderat\n '4': 'High', // stor\n '5': 'Very high', // svært stor\n },\n cells: {\n '1': 'The scenario is unlikely to occur.\\n\\nIt occurs less often than every 400 years',\n '2': 'The scenario is unlikely to occur.\\n\\nIt can occur every 20 years',\n '3': 'The scenario can occur.\\n\\nIt can occur yearly',\n '4': 'The scenario will very likely occur.\\n\\nIt can occur monthly',\n '5': 'The scenario is almost guaranteed to occur.\\n\\nIt can occur daily',\n },\n },\n threatActors: {\n 'Script kiddie': 'Script kiddie',\n Hacktivist: 'Hacktivist',\n 'Reckless employee': 'Reckless employee',\n Insider: 'Insider',\n 'Organised crime': 'Organised crime',\n 'Terrorist organisation': 'Terrorist organisation',\n 'Nation/government': 'Nation/government',\n },\n vulnerabilities: {\n 'Flawed design': 'Flawed design',\n Misconfiguration: 'Misconfiguration',\n 'Dependency vulnerability': 'Dependency vulnerability',\n 'Unauthorized access': 'Unauthorized use',\n 'Unmonitored use': 'Unmonitored use',\n 'Input tampering': 'Input tampering',\n 'Information leak': 'Information leak',\n 'Excessive use': 'Excessive use',\n },\n threatActorsAndVulnerabilities: {\n title: 'Threat Actors and Vulnerabilities',\n allCovered: 'All {{kind}} are covered in at least one scenario.',\n oneNotCovered:\n '{{kind}} <b>{{notCovered}}</b> is not covered in any scenario.',\n twoNotCovered:\n '{{kind}} <b>{{notCovered1}}</b> and <b>{{notCovered2}}</b> is not covered in any scenario.',\n multipleNotCovered:\n 'Multiple {{kind}} are not covered. This includes <b>{{notCovered1}}</b>, <b>{{notCovered2}}</b> and <b>{{notCovered3}}</b>.',\n showMoreInfo: 'Show more information',\n dialogHeader: 'Scenarios covering vulnerabilities and threat actors',\n vulnerabilityCoverage: 'Vulnerabilities covered',\n threatActorCoverage: 'Threat actors covered',\n coverageRatio: '{{covered}} of {{total}}',\n tableColumnThreatActor: 'Threat actor',\n tableColumnVulnerability: 'Vulnerability',\n tableColumnScenarios: 'Number of scenarios',\n },\n actionStatus: {\n OK: 'OK',\n 'Not OK': 'Not OK',\n 'Not relevant': 'Not relevant',\n },\n errorMessages: {\n DefaultErrorMessage: 'An error occurred',\n ErrorWhenNoWriteAccessToRepository:\n 'Unable to update RiSc. You do not have write access to {{owner}}/{{name}}.',\n ErrorWhenUpdatingRiSc: 'Failed to update risk scorecard',\n ErrorWhenDeletingRiSc: 'Failed to delete risk scorecard',\n ErrorWhenCreatingPullRequest: 'Failed to save approval of risk scorecard',\n ErrorWhenCreatingRiSc: 'Failed to create risk scorecard',\n ErrorWhenFetchingRiScs: 'Failed to fetch risk scorecards with ids: ',\n FailedToFetchRiScs: 'Failed to fetch risk scorecards',\n RiScDoesNotExist:\n 'The risk scorecard you are trying to open does not exist',\n ScenarioDoesNotExist: 'The scenario you are trying to open does not exist',\n ErrorWhenFetchingSopsConfig: 'Could not fetch SOPS configuration',\n FailedToCreateSops: 'Failed to create SOPS configuration',\n FailedToUpdateSops: 'SOPS configuration could not be updated',\n ErrorWhenFetchingGcpCryptoKeys:\n 'Could not load risk scorecards — the encryption service is unavailable. Try refreshing the page.',\n ContentStatusDeleted: 'Risk scorecard \"{{riScId}}\" has been deleted',\n ContentStatusFailure: 'Failed to load risk scorecard \"{{riScId}}\"',\n ContentStatusFileNotFound:\n 'Risk scorecard \"{{riScId}}\" was not found in the repository',\n ContentStatusDecryptionFailed:\n 'Failed to decrypt risk scorecard \"{{riScId}}\".',\n ContentStatusNoReadAccess:\n 'You do not have read access to risk scorecard \"{{riScId}}\"',\n ContentStatusUnsupportedMigration:\n 'Risk scorecard \"{{riScId}}\" cannot be automatically migrated to the latest version.',\n ContentStatusUnknown:\n 'Failed to fetch risk scorecard \"{{riScId}}\" with unknown status: {{status}}',\n ContentStatusSchemaValidationFailed:\n 'Failed to fetch risk scorecard \"{{riScId}}\". Its content does not match the expected format. It may have been manually edited or corrupted.',\n ContentStatusDecryptionFailedMessage: {\n INTERNAL_SERVER_ERROR:\n 'Failed to decrypt risk scorecard \"{{riScId}}\", 500 - Internal server error from the crypto service.',\n MISSING_DATA_KEY:\n 'Failed to decrypt risk scorecard \"{{riScId}}\", unable to access encryption key required for decryption.',\n NO_MATCHING_KEY:\n 'Failed to decrypt risk scorecard \"{{riScId}}\", no available key could decrypt the file.',\n AUTHENTICATION_FAILED:\n 'Failed to decrypt risk scorecard \"{{riScId}}\", Authentication failed, please check your credentials and permissions.',\n INVALID_GCP_TOKEN:\n 'Failed to decrypt risk scorecard \"{{riScId}}\", your Google Cloud token is invalid or expired.',\n INVALID_AGE_KEY:\n 'Failed to decrypt risk scorecard \"{{riScId}}\", the provided Age key is invalid.',\n CONNECTION_REFUSED:\n 'Failed to decrypt risk scorecard \"{{riScId}}\", unable to connect to the encryption service.',\n },\n },\n infoMessages: {\n OpenedPullRequest: 'Successfully opened pull request',\n CreatedPullRequest: 'Successfully saved approval of risk scorecard ',\n DeletedRiSc: 'Risk scorecard deleted',\n DeletedRiScRequiresApproval:\n 'Risk scorecard staged for deletion, requires approval',\n UpdatedRiSc: 'Risk scorecard updated',\n UpdatedSops: 'SOPS configuration updated',\n UpdatedRiScRequiresNewApproval:\n 'Risk scorecard update and requires new approval',\n CreatedRiSc: 'Created new risk scorecard successfully',\n UpdatedRiScAndCreatedPullRequest:\n 'Risk scorecard updated and ready for approval in Github',\n NoSopsConfigFound:\n 'No SOPS configuration present on default branch of the GitHub repository',\n CreatedSops: 'SOPS configuration created successfully',\n UpdateAction: 'Updating action ...',\n UpdateInfoMessage:\n 'Please wait a few seconds while the changes are being saved.',\n },\n deleteDialog: {\n title: 'Delete Risk Scorecard',\n confirmationMessage: 'Are you sure you want to delete this risk scorecard?',\n },\n feedbackDialog: {\n title: 'Give us your feedback!',\n description: 'Your feedback',\n confirmationMessage: 'Thank you for your feedback.',\n feedbackButton: 'Give feedback',\n errorMessage: 'An error occurred while sending your feedback.',\n sendButton: 'Send',\n },\n filterButton: {\n veryOutdated: 'Very outdated actions',\n outdated: 'Outdated actions',\n listUpdatedActions: 'Recently updated actions',\n },\n firstRiScCard: {\n noRiScYet: 'No RiSc analyses created yet',\n getStarted:\n 'Get started with risk and vulnerability analysis for your team',\n },\n filter: {\n title: 'Title (a-z)',\n initialRisk: 'Initial risk (high-low)',\n completedActions: 'Most completed actions',\n remainingActions: 'Most remaining actions',\n },\n} as const;\n\nexport const pluginRiScTranslationRef = createTranslationRef({\n id: 'plugin.riSc',\n messages: pluginRiScMessages,\n});\n\nexport const pluginRiScNorwegianTranslation = createTranslationResource({\n ref: pluginRiScTranslationRef,\n translations: {\n no: () =>\n Promise.resolve({\n default: {\n currentLanguage: 'no',\n 'contentHeader.title': 'Risiko- og sårbarhetsanalyse',\n 'contentHeader.createNewButton': 'Opprett ny analyse',\n 'contentHeader.editEncryption': 'Rediger kryptering',\n 'contentHeader.deleteButton': 'Slett analyse',\n 'contentHeader.multipleRiScs': 'RoS-analyser',\n 'dictionary.rejectedLogin': 'Innlogging avbrutt av bruker.',\n 'dictionary.by': 'Av',\n 'dictionary.click': 'Klikk',\n 'dictionary.here': 'her',\n 'dictionary.yes': 'Ja',\n 'dictionary.no': 'Nei',\n 'dictionary.noAccess': 'Ingen tilgang',\n 'dictionary.summary': 'Oppsummering',\n 'dictionary.optional': 'valgfritt',\n 'dictionary.month': 'måned',\n 'dictionary.week': 'uke',\n 'dictionary.day': 'dag',\n 'dictionary.hour': 'time',\n 'dictionary.minute': 'minutt',\n 'dictionary.second': 'sekund',\n 'dictionary.months': 'måneder',\n 'dictionary.weeks': 'uker',\n 'dictionary.days': 'dager',\n 'dictionary.hours': 'timer',\n 'dictionary.minutes': 'minutter',\n 'dictionary.seconds': 'sekunder',\n 'dictionary.action': 'Tiltak',\n 'dictionary.add': 'Legg til',\n 'dictionary.added': 'Lagt til',\n 'dictionary.availability': 'Tilgjengelighet',\n 'dictionary.copy': 'Kopier',\n 'dictionary.copied': 'Kopiert',\n 'dictionary.cancel': 'Avbryt',\n 'dictionary.close': 'Lukk',\n 'dictionary.completed': 'Fullført',\n 'dictionary.confidentiality': 'Konfidensialitet',\n 'dictionary.confirm': 'Bekreft',\n 'dictionary.consequence': 'Konsekvens',\n 'dictionary.deadline': 'Frist',\n 'dictionary.delete': 'Slett',\n 'dictionary.description': 'Beskrivelse',\n 'dictionary.discardChanges': 'Forkast endringer',\n 'dictionary.edit': 'Rediger',\n 'dictionary.estimatedRisk': 'Estimert risiko',\n 'dictionary.estimatedInitialRisk': 'Estimert startrisiko',\n 'dictionary.estimatedRemainingRisk': 'Estimert restrisiko',\n 'dictionary.estimatedCurrentRisk': 'Estimert nårisiko',\n 'dictionary.example': 'Eksempel',\n 'dictionary.initialRisk': 'Startrisiko',\n 'dictionary.integrity': 'Integritet',\n 'dictionary.measure': 'Tiltak',\n 'dictionary.measures': 'Tiltak',\n 'dictionary.measureOwner': 'Tiltakseier',\n 'dictionary.next': 'Neste',\n 'dictionary.planned': 'Planlagt',\n 'dictionary.previous': 'Forrige',\n 'dictionary.probability': 'Sannsynlighet',\n 'dictionary.restRisk': 'Restrisiko',\n 'dictionary.currentRisk': 'Nårisiko',\n 'dictionary.removed': 'Fjernet',\n 'dictionary.risk': 'Risiko',\n 'dictionary.riskExplanation.initial': 'Risiko før tiltak er fullført',\n 'dictionary.riskExplanation.current':\n 'Nåværende risiko basert på faktisk tiltaksstatus',\n 'dictionary.riskExplanation.remaining':\n 'Risiko etter at alle tiltak er fullført',\n 'dictionary.save': 'Lagre',\n 'dictionary.saveAndClose': 'Lagre og lukk',\n 'dictionary.scenario': 'Scenario',\n 'dictionary.scope': 'Omfang',\n 'dictionary.status': 'Status',\n 'dictionary.threatActors': 'Trusselaktører',\n 'dictionary.theThreatActor': 'Trusselaktøren',\n 'dictionary.theThreatActors': 'Trusselaktørene',\n 'dictionary.title': 'Tittel',\n 'dictionary.unknown': 'Ukjent',\n 'dictionary.url': 'URL',\n 'dictionary.emptyField': 'Ingen {{field}} spesifisert',\n 'dictionary.valuation': 'Verdi',\n 'dictionary.version': 'Versjon',\n 'dictionary.vulnerabilities': 'Sårbarheter',\n 'dictionary.theVulnerability': 'Sårbarheten',\n 'dictionary.theVulnerabilities': 'Sårbarhetene',\n 'dictionary.showOnlyRelevant': 'Vis kun relevante',\n 'dictionary.noRelevantMeasures': 'Ingen relevante tiltak',\n 'dictionary.scenarios': 'scenarioer',\n 'dictionary.measuresInitialRiSc': 'tiltak',\n 'dictionary.customOrder': 'Egendefinert rekkefølge',\n 'dictionary.searchQuery': 'Ingen resultater for ',\n 'dictionary.actionsWithStatus': 'Tiltak som er OK',\n 'dictionary.refresh': 'Prøv igjen',\n\n 'scenarioDrawer.action.descriptionError':\n 'Beskrivelse kan ikke være tom',\n 'scenarioDrawer.action.urlError': 'Ugyldig URL',\n 'scenarioDrawer.action.requiredError': 'Feltet er påkrevd',\n 'scenarioDrawer.action.emptyState':\n 'Scenariet har ingen definerte tiltak',\n 'scenarioDrawer.errors.remainingConsequenceTooHigh':\n 'Restkonsekvens kan ikke være høyere enn startkonsekvens',\n 'scenarioDrawer.errors.remainingProbabilityTooHigh':\n 'Restsannsynlighet kan ikke være høyere enn startsannsynlighet',\n 'scenarioDrawer.action.lastUpdated': 'Sist oppdatert:',\n 'scenarioDrawer.action.notUpdated': 'Ingen dato',\n\n 'encryption.title': 'Kryptering',\n\n 'rosStatus.statusBadge.missing':\n 'Når utkastet er ferdig, kan risikoeier gå gjennom og godkjenne endringene.',\n 'rosStatus.outdated': 'Utdatert',\n 'rosStatus.updated': 'Oppdatert',\n 'rosStatus.veryOutdated': 'Veldig utdatert',\n 'rosStatus.updating': 'Lagrer...',\n 'rosStatus.statusBadge.approved': 'Godkjent av risikoeier',\n 'rosStatus.statusBadge.error': 'Kunne ikke hente status',\n 'rosStatus.statusBadge.migration.title':\n 'Gjennomgang og lagring av endringer kreves',\n 'rosStatus.statusBadge.migration.description':\n 'Det har blitt gjort endringer i risiko- og sårbarhetsanalysen, som følge av en migrering til nyeste versjon. Endringene kan være både sletting og endring av informsasjon. Det vil ikke være mulig å lagre endringer av analysen uten å inkludere og godta endringene.',\n 'rosStatus.statusBadge.created': 'Opprettet tom ROS',\n 'rosStatus.statusBadge.draft': 'Utkast',\n 'rosStatus.statusBadge.waiting': 'Avventer godkjenning',\n 'rosStatus.statusBadge.published': 'Publisert',\n 'rosStatus.statusBadge.draftDeletion': 'Markert for sletting',\n 'rosStatus.statusBadge.waitingDeletion': 'Venter på sletting',\n 'rosStatus.statusBadge.deletionApproval':\n 'Risikoeier kan gå igjennom og godkjenne slettingen.',\n 'rosStatus.lastModified': 'Sist publisert: ',\n 'rosStatus.daysSinceLastModified':\n '{{days}} dager og {{numCommits}} commits siden',\n 'rosStatus.notPublishedYet': 'RoS er ikke publisert enda',\n 'rosStatus.errorMessage': 'Kunne ikke hente status',\n 'rosStatus.editing': 'Du kan nå gjøre endringer',\n 'rosStatus.approveButtonUpdate': 'Godkjenn ROS',\n 'rosStatus.approveButtonDelete': 'Godkjenn sletting',\n 'rosStatus.prStatus': ' Merge pull requesten i ',\n 'rosStatus.prStatus2Update': \" for å publisere ROS'en.\",\n 'rosStatus.prStatus2Delete': \" for å slette ROS'en.\",\n 'rosStatus.moreInformationButton': 'Mer informasjon',\n 'rosStatus.difference.description':\n 'Oppsummering av endringer som må godkjennes av risikoeier.',\n 'rosStatus.difference.publishDate':\n 'Siste publiserte endringer {{date}}',\n 'rosStatus.difference.fetching': 'Henter endringer',\n 'rosStatus.difference.error': 'Feil med uthenting av endringer',\n 'rosStatus.difference.newROS':\n 'Ingen publiserte ROS-analyser å sammenligne med',\n 'rosStatus.difference.differences.title': 'ENDRINGER',\n 'rosStatus.difference.differences.titleRemoved':\n 'Fjernet fra ROS-analyse',\n 'rosStatus.difference.differences.noneRemoved':\n 'Ingenting er fjernet',\n 'rosStatus.difference.differences.titleExisting':\n 'Endret i eksisterende ROS-analyse',\n 'rosStatus.difference.differences.noneExisting':\n 'Ingenting er endret',\n 'rosStatus.difference.differences.titleAdded':\n 'Lagt til i ROS-analyse',\n 'rosStatus.difference.differences.noneAdded': 'Ingenting er lagt til',\n 'rosStatus.updatedStatus.UPDATED': 'Oppdatert statusikon',\n 'rosStatus.updatedStatus.LITTLE_OUTDATED': 'Litt utdatert statusikon',\n 'rosStatus.updatedStatus.OUTDATED': 'Utdatert statusikon',\n 'rosStatus.updatedStatus.VERY_OUTDATED': 'Veldig utdatert statusikon',\n 'rosStatus.updatedStatus.error': 'Feil statusikon',\n 'rosStatus.updatedStatus.disabled': 'Deaktivert statusikon',\n 'rosStatus.updatedStatus.tooltip.OUTDATED':\n 'Dette tiltaket er utdatert',\n 'rosStatus.updatedStatus.tooltip.VERY_OUTDATED':\n 'Dette tiltaket er veldig utdatert',\n 'rosStatus.githubLink': 'Gå til GitHub',\n 'publishDialog.titleUpdate': 'Godkjenn ROS-analyse',\n 'publishDialog.titleDelete': 'Godkjenn sletting',\n 'publishDialog.checkboxLabelUpdate':\n 'Jeg bekrefter at risikoeier godtar risikoen beskrevet i denne risiko- og sårbarhetsanalysen.',\n 'publishDialog.checkboxLabelDelete':\n 'Jeg bekrefter at risikoeier godtar slettingen av denne risiko- og sårbarhetsanalysen.',\n\n 'migrationDialog.title': 'Lagre endringer',\n 'migrationDialog.description':\n 'Endringene er gjort for å følge den nyeste skjemaversjonen.',\n 'migrationDialog.migrationTitle': 'Migrering fra {{from}} til {{to}}',\n 'migrationDialog.schemaVersion': 'Skjemaversjon',\n 'migrationDialog.schemaChangelog': 'Åpne skjemaendringslogg',\n 'migrationDialog.checkboxLabel':\n 'Jeg bekrefter at jeg har gjennomgått og ønsker å lagre endringene som er gjort under migreringen.',\n 'migrationDialog.migration40.changeExplanation':\n 'Denne migreringen endrer standard verdiene for konsekvens og sannsynlighet.',\n 'migrationDialog.migration40.owner': 'Ansvarlig',\n 'migrationDialog.migration40.deadline': 'Frist',\n 'migrationDialog.migration40.existingActions': 'Eksisterende tiltak',\n 'migrationDialog.migration40.vulnerabilitiesTitle': 'Sårbarheter',\n 'migrationDialog.migration40.vulnerabilities.Compromised admin user':\n 'Kompromittert adminbruker',\n 'migrationDialog.migration40.vulnerabilities.Denial of service':\n 'Tjenestenekt',\n 'migrationDialog.migration40.vulnerabilities.Disclosed secret':\n 'Lekket hemmelighet',\n 'migrationDialog.migration40.vulnerabilities.Escalation of rights':\n 'Rettighetseskalering',\n 'migrationDialog.migration40.vulnerabilities.Excessive use':\n 'Overdreven bruk',\n 'migrationDialog.migration40.vulnerabilities.Information leak':\n 'Informasjonslekkasje',\n 'migrationDialog.migration40.vulnerabilities.Unauthorized access':\n 'Uautorisert tilgang',\n 'migrationDialog.migration40.vulnerabilities.Unmonitored use':\n 'Uovervåket bruk',\n 'migrationDialog.migration40.vulnerabilities.User repudiation':\n 'Benekte brukerhandling',\n 'migrationDialog.migration41.changeExplanation':\n 'Denne migreringen fjerner ansvarlig («owner») og frist («deadline») feltene fra tiltak, fjerner eksisterende tiltak feltet og oppdaterer verdier for sårbarheter.',\n 'migrationDialog.migration41.nokPerIncident': 'NOK/hendelse',\n 'migrationDialog.migration41.occurrencesPerYear': 'hendelser/år',\n 'migrationDialog.migration42.changeExplanation':\n 'Denne migreringen legger til et sist oppdatert felt (\"lastUpdated\") på tiltak.',\n 'migrationDialog.migration50.changeExplanation':\n 'Denne migreringen oppdaterer tiltakets status til en ny navnekonvensjon.',\n 'migrationDialog.migration51.changeExplanation':\n 'Denne migreringen legger til et sist oppdater av felt (\"lastUpdatedBy\") på tiltak.',\n 'migrationDialog.migration51.lastUpdatedBy': 'Sist oppdatert av:',\n 'migrationDialog.migration51.addedLastUpdatedBy':\n 'La til felt for å spore hvem som oppdaterte et tiltak for {{numberOfChangedActions}} eksisterende tiltak',\n 'migrationDialog.migration52.changeExplanation':\n 'Denne migreringen fjerner det ubrukte konseptet verdivurderinger (\"valuations\") fra RiSc-dokumentet.',\n 'migrationDialog.migration52.title': 'Verdivurderinger fjernet',\n 'migrationDialog.migration52.oldValue':\n 'Fjernet eksisterende verdivurderinger',\n 'migrationDialog.removed': 'Fjernet',\n 'comparisonDialog.noChanges': 'Ingen endringer',\n 'comparisonDialog.changes': 'Endringer av RoSen',\n 'comparisonDialog.noDescription': 'Ingen beskrivelse spesifisert',\n 'comparisonDialog.noURL': 'Ingen URL spesifisert',\n 'comparisonDialog.risk.consequenceUnit': 'NOK/hendelse',\n 'comparisonDialog.risk.probabilityUnit': 'hendelser/år',\n 'comparisonDialog.valuation.integrity.Insignificant': 'Insignifikant',\n 'comparisonDialog.valuation.integrity.Expected': 'Forventet',\n 'comparisonDialog.valuation.integrity.Dependent': 'Avhengig',\n 'comparisonDialog.valuation.integrity.Critical': 'Kritisk',\n 'comparisonDialog.valuation.availability.Insignificant':\n 'Insignifikant',\n 'comparisonDialog.valuation.availability.2 days': '2 dager',\n 'comparisonDialog.valuation.availability.4 hours': '4 timer',\n 'comparisonDialog.valuation.availability.Immediate': 'Umiddelbart',\n 'comparisonDialog.valuation.confidentiality.Public': 'Offentlig',\n 'comparisonDialog.valuation.confidentiality.Internal': 'Intern',\n 'comparisonDialog.valuation.confidentiality.Confidential':\n 'Konfidensielt',\n 'comparisonDialog.valuation.confidentiality.Strictly confidential':\n 'Strengt konfidensielt',\n 'supportDialog.title': 'Support',\n 'supportDialog.openEntry': 'Åpne',\n 'supportDialog.entries.riscFeedbackChannel.title':\n 'RoS tilbakemeldingskanal',\n 'supportDialog.entries.riscFeedbackChannel.description':\n '#kodenær-ros-tilbakemelding',\n 'supportDialog.entries.riscDocumentation.title': 'RoS dokumentasjon',\n 'supportDialog.entries.riscDocumentation.description':\n 'Confluence - RISC',\n 'scenarioTable.title': 'Risikoscenarioer',\n 'scenarioTable.addScenarioButton': 'Legg til scenario',\n 'scenarioTable.noActions': 'Ingen tiltak',\n 'scenarioTable.columns.consequenceChar': 'K',\n 'scenarioTable.columns.probabilityChar': 'S',\n 'scenarioTable.columns.completed': 'fullført',\n 'scenarioTable.editButton': 'Rediger liste',\n 'scenarioTable.doneEditing': 'Avslutt redigering',\n 'scenarioTable.noActionsLong': 'Scenarioet har ingen tiltak',\n\n 'riskMatrix.title': 'Risikomatrise',\n 'riskMatrix.estimatedRisk.title': 'Estimert risiko',\n 'riskMatrix.estimatedRisk.suffix.thousand': '{{count}} tusen',\n 'riskMatrix.estimatedRisk.suffix.million_one': '{{count}} million',\n 'riskMatrix.estimatedRisk.suffix.million_other':\n '{{count}} millioner',\n 'riskMatrix.estimatedRisk.suffix.billion_one': '{{count}} milliard',\n 'riskMatrix.estimatedRisk.suffix.billion_other':\n '{{count}} milliarder',\n 'riskMatrix.estimatedRisk.suffix.trillion_one': '{{count}} billion',\n 'riskMatrix.estimatedRisk.suffix.trillion_other':\n '{{count}} billioner',\n 'riskMatrix.estimatedRisk.unit.nokPerYear': 'kr/år',\n 'riskMatrix.tooltip.title': 'Risikoscenarioer',\n 'riskMatrix.currentRisk.title': 'Reduksjon i risiko',\n 'riskMatrix.currentRisk.description':\n 'Diagrammet illustrerer utviklingen fra dagens startrisiko mot beregnet sluttrisiko. <strong>{{actionsOk}}</strong> fullførte tiltak utgjør en reduksjon på <strong>{{reduction}} kr/år.</strong>',\n 'riskMatrix.currentRisk.showMoreInfo':\n 'Risikostatistikk per scenario',\n 'riskMatrix.currentRisk.dialogHeader':\n 'Risikostatistikk per scenario',\n 'riskMatrix.currentRisk.dialogDescription':\n 'Denne tabellen viser risikostatistikk per scenario. Alle tiltak innenfor et scenario er vektet likt, slik at hvert fullført tiltak bidrar med like mye risikoreduksjon. Bruk nedtrekksmenyen for å velge hvilken metrikk som vises:',\n 'riskMatrix.currentRisk.metricCurrentRiskDescription':\n 'estimert risiko basert på andelen fullførte tiltak.',\n 'riskMatrix.currentRisk.metricPotentialReductionDescription':\n 'hvor mye risikoen fortsatt kan reduseres ved å fullføre gjenstående relevante tiltak.',\n 'riskMatrix.currentRisk.metricReductionPerActionDescription':\n 'potensiell reduksjon fordelt likt på gjenstående relevante tiltak.',\n 'riskMatrix.currentRisk.scenarioColumn': 'Scenario',\n 'riskMatrix.currentRisk.metricLabel': 'Metrikk',\n 'riskMatrix.currentRisk.metricCurrentRisk': 'Nåværende risiko',\n 'riskMatrix.currentRisk.metricReductionPerAction':\n 'Risikoreduksjon per tiltak',\n 'riskMatrix.currentRisk.metricPotentialReduction':\n 'Potensiell reduksjon',\n\n 'infoDialog.title': 'Estimert risiko',\n 'infoDialog.description':\n 'Den estimerte risikoen er basert på hvor stor risiko de forskjellige scenariene utgjør. Hvis det er stor sannsynlighet for at en alvorlig konsekvens skjer er det høy risiko for at det kan bli en stor kostnad for organisasjonen. Kostnaden er med andre ord et forsøk på å konkretisere verdien av risiko og er summen av den estimerte risikoen for alle risikoscenariene i denne ROS-analysen.',\n 'infoDialog.calculatedHowTitle':\n 'Hvordan regner vi ut estimert risiko?',\n 'infoDialog.calculatedHow':\n 'Sannsynlighet (S) måles i hendelser per år og konsekvens (K) måles i kroner per hendelse. Den estimerte risikoen blir da: 20',\n 'infoDialog.calculatedHowExponent': 'S+K-1',\n 'infoDialog.consequenceTitle': 'Konsekvens (kr/hendelse)',\n 'infoDialog.consequenceUnit': 'kr/hendelse',\n 'infoDialog.consequenceDescription.oneworkday': '1 dagsverk',\n 'infoDialog.consequenceDescription.oneworkmonth': '1 månedsverk',\n 'infoDialog.consequenceDescription.oneworkyear': '1 årsverk',\n 'infoDialog.consequenceDescription.20workyears': '20 årsverk',\n 'infoDialog.consequenceDescription.400workyears': '400 årsverk',\n 'infoDialog.probabilityTitle': 'Sannsynlighet (hendelser/år)',\n 'infoDialog.probabilityUnit': 'hendelse/år',\n 'infoDialog.probabilityDescription.every400years':\n '1 gang hvert 400. år',\n 'infoDialog.probabilityDescription.every20years':\n '1 gang hvert 20. år',\n 'infoDialog.probabilityDescription.annualy': 'Årlig',\n 'infoDialog.probabilityDescription.monthly': 'Månedlig',\n 'infoDialog.probabilityDescription.daily': 'Daglig',\n 'infoDialog.example.part1': 'Et risikoscenario med sannsynlighet ',\n 'infoDialog.example.part2': ' og konsekvens ',\n 'infoDialog.example.part3': ' har en estimert risiko på ',\n 'infoDialog.units.nokPerIncident': 'kr/hendelse',\n 'infoDialog.units.incidentsPerYear': 'hendelser/år',\n 'infoDialog.units.nokPerYear': 'kr/år',\n 'infoDialog.currentRisk.title': 'Nårisiko utregning',\n 'infoDialog.currentRisk.description':\n 'Nåværende risiko kombinerer startrisikoen, den planlagte sluttrisikoen og hvor langt risikoreduserende tiltak har kommet. For hvert scenario beregnes startrisiko: ',\n 'infoDialog.currentRisk.actionRatio':\n 'Så måler vi hvor mange relevante tiltak som er fullført (ratio) = (antall fullførte tiltak) / (antall tiltak som ikke er merket «Ikke relevant»). Hvis det ikke finnes relevante tiltak, settes forholdet til 0.',\n 'infoDialog.currentRisk.aggregated':\n 'Den aggregerte nåværende risikoen er summen ',\n 'infoDialog.currentRisk.currentRiskCost':\n 'Den aggregerte nårisikoen interpolerer mellom start- og restrisiko basert på forholdet',\n 'infoDialog.currentRisk.aggregatedSums':\n 'på tvers av alle scenarier, rapportert i NOK per år.',\n 'infoDialog.currentRisk.remainingRiskCost': 'og sluttrisiko',\n 'rosDialog.titleNew': 'Ny risiko- og sårbarhetsanalyse',\n 'rosDialog.titleEdit': 'Rediger tittel og omfang',\n 'rosDialog.initialRiscScopeDescription':\n 'Vil du generere en RoS med forhåndsdefinerte scenarioer og tiltak?',\n 'rosDialog.initialRiscApplicationType':\n 'Hva slags applikasjon har du?',\n 'rosDialog.noInitialRiScFound':\n 'Ingen forhåndsdefinert RoS er tilgjengelig for øyeblikket.',\n 'rosDialog.editEncryption': 'Rediger kryptering',\n 'rosDialog.titleError': 'ROS-analysen må ha en tittel',\n 'rosDialog.scopeDescription':\n 'Beskriv hva analysen skal vurdere. Hva som ikke inngår som en del av omfanget må også defineres.', // TODO\n 'rosDialog.scopeError': 'ROS-analysen må ha et omfang',\n 'rosDialog.generateInitialDescription':\n 'Kodenær RoS lar deg opprette en initiell RoS basert på opplysninger om kodebasen i kartverket.dev, sikkerhetsmetrikker og sikkerhetskontrollere.',\n 'rosDialog.generateInitialToggleDescription':\n 'Vil du generere initiell RoS?',\n 'rosDialog.generateObsRiScDescription':\n \"Denne RoS'en inneholder scenarier som bør vurderes for bygg og deploy.\",\n 'rosDialog.generateInternalJobRiScDescription':\n \"Denne RoS'en inneholder scenarier som bør vurderes for interne verktøy og jobber.\",\n 'rosDialog.generateStandardRiScDescription':\n \"Denne RoS'en er generert fra opplysninger om kodebasen i kartverket.dev, sikkerhetsmetrikker og sikkerhetskontrollere.\",\n 'rosDialog.fromScratch': 'Tom',\n 'rosDialog.generateDefault': 'Initiell',\n 'rosDialog.stepRiscDetails': 'RoS-detaljer',\n 'rosDialog.initialRiscTitle': 'Forhåndsdefinert RoS',\n 'rosDialog.stepEncryption': 'Konfigurer kryptering',\n 'rosDialog.applicationType': 'Velg type applikasjon',\n 'rosDialog.titleAndScope': 'Tittel og omfang',\n 'rosDialog.recommendedForComponentOfType':\n 'Anbefalt for komponenter av typen',\n 'sopsConfigDialog.title': 'Kryptering',\n 'sopsConfigDialog.writeLocalRiscSuffix':\n 'for å lære mer om å skrive kodenær RoS lokalt.',\n 'sopsConfigDialog.description.new':\n 'For å bruke kodenær RoS må du først aktivere en krypteringsløsning ved å velge en nøkkel fra Google Cloud Platform (GCP) for kryptering og dekryptering. Følg trinnene under for å fullføre oppsettet:',\n 'sopsConfigDialog.description.edit':\n 'Risiko og sårbarhetsanalysen vil bli kryptert for å sørge for konfidiensialitet. Du kan endre hvilken krypteringsnøkkel fra Google Cloud Platform (GCP) som skal bli brukt her:',\n 'sopsConfigDialog.selectKeysTitle': 'Velg krypteringsnøkkel',\n 'sopsConfigDialog.chooseGcpCryptoKey': 'Velg GCP-nøkkel',\n 'sopsConfigDialog.gcpCryptoKeyDescription':\n \"Fra listen under kan du velge hvilken GCP-nøkkel du vil bruke for å kryptere og dekryptere RoS'en.\",\n 'sopsConfigDialog.cryptoKeyOptionInfo':\n '(Prosjekt: {{projectId}}, Tilganger: {{permissions}})',\n 'sopsConfigDialog.cryptoKeyPermissionENCRYPT': 'Kryptere',\n 'sopsConfigDialog.cryptoKeyPermissionDECRYPT': 'Dekryptere',\n 'sopsConfigDialog.cryptoKeyPermissionUNKNOWN':\n '⚠️ Ukjent - du bør bytte til en annen nøkkel',\n 'sopsConfigDialog.gcpCryptoKeyNoSelectableKey':\n 'Du har ikke tilgang til noe egnede GCP-nøkler.',\n 'sopsConfigDialog.gcpCryptoKeyNonSelectedErrorMessage':\n 'En GCP-nøkkel må være valgt.',\n 'sopsConfigDialog.publicAgeKeysAlreadyPresent':\n 'Følgende age-nøkler er allerede til stede:',\n 'sopsConfigDialog.publicAgeKeyQuestion':\n 'Trenger noen å skrive RoS lokalt i sin editor?',\n 'sopsConfigDialog.publicAgeKeyDescription':\n 'Legg ved offentlige age-nøkkel til personer som ønsker å skrive kodenær RoS lokalt',\n 'sopsConfigDialog.addPublicAgeKey': 'Legg til nøkkel',\n 'sopsConfigDialog.publicAgeKey': 'Offentlig age-nøkkel',\n 'sopsConfigDialog.update': 'Oppdater',\n 'sopsConfigDialog.createPRTitle':\n 'Lag en Pull Request med det nye krypteringsskjemaet',\n 'sopsConfigDialog.createPRContent':\n 'Krypteringskonfigurasjonen er nå klar og har blitt lagt til i en ny branch. Nedenfor kan du opprette en PR med disse endringene. Alternativt kan du flytte endringene til en annen branch ved å klikke på \"Branch\"-knappen og velge en annen aktiv branch.',\n 'sopsConfigDialog.PRTitle': \"Se gjennom og merge Pull Request'en\",\n 'sopsConfigDialog.SummaryDescription':\n 'En PR med det nye krypteringsskjemaet har nå blitt opprettet.',\n 'sopsConfigDialog.SummaryGCP': 'Den valgte GCP-nøkkelen er ',\n 'sopsConfigDialog.SummaryAgeKeys':\n ' Følgende offentlige age nøkler har også blitt lagt ved: ',\n 'sopsConfigDialog.PRContent':\n \"Klikk på knappen nedenfor for å se gjennom endringene og merge PR-en. Etter at du har merget PR-en, kan du begynne å opprette og administrere RoS'er.\",\n 'sopsConfigDialog.required': 'Dette feltet er påkrevd',\n 'sopsConfigDialog.publicKeyHelperTextKeyAlreadyExists':\n 'Offentlig møkkel allerede lagt til',\n 'sopsConfigDialog.publicKeyHelperTextKeyAlreadyExistInSopsConfig':\n 'Offentlig nøkkel er allerede i eksisterende SOPS-konfigurasjon',\n 'sopsConfigDialog.publicKeyHelperTextKeyNotValid':\n 'Offentlig nøkkel er ikke en gyldig age offentlig nøkkel',\n 'sopsConfigDialog.pendingTitle': 'Avventende SOPS-konfigurasjon',\n 'sopsConfigDialog.pendingDescription':\n 'Følgende pull requests er åpnet for å inkludere en SOPS-konfigurasjon i GitHub-repoet',\n 'sopsConfigDialog.secondaryPullRequestText': 'Åpnet _n_ siden av',\n 'sopsConfigDialog.reEncryptTitle':\n \"Rekryptering av eksisterende RoS'er\",\n 'sopsConfigDialog.reEncryptDescription':\n \"Ved å oppdatere SOPS-konfigurasjonen, vil du ikke lenger kunne dekryptere gamle RoS'er kryptert med den forrige SOPS-konfigurasjonen. Vi anbefaler derfor på det sterkeste å rekryptere eksisterende RoS'er på hoved-branchen i ditt GitHub-repo for at du skal kunne fortsette å lese dem med din oppdaterte SOPS-konfigurasjon.\",\n 'sopsConfigDialog.reEncryptConsentDescription':\n \"Vil du rekryptere eksisterende RoS'er på hoved-branchen til\",\n 'sopsConfigDialog.openPR': 'Åpne pull request',\n 'sopsConfigDialog.gotoPullRequest': 'Gå til pull request',\n 'scenarioStepper.initialRiskStep.title': 'Startrisiko',\n 'scenarioStepper.initialRiskStep.subtitle':\n 'Risikoen er kombinasjonen av konsekvensen av scenarioet og sannsynligheten for at det inntreffer.',\n 'scenarioStepper.initialRiskStep.consequenceSubtitle':\n 'Hvor alvorlig er den potensielle konsekvensen? Hvis konsekvensen gjelder flere kategorier velg det høyeste konsekvensnivået av disse.',\n 'scenarioStepper.initialRiskStep.probabilitySubtitle':\n 'Hvor stor sannsynlighet er det for at dette scenarioet vil forekomme. Dersom du er mellom to sannsynlighetsverdier velg den høyeste.',\n 'scenarioStepper.restRiskStep.title': 'Restrisiko',\n 'scenarioStepper.restRiskStep.subtitle':\n 'Hvordan endrer risikoen seg fra startrisikoen etter alle tiltakene er fullført?',\n 'scenarioStepper.restRiskStep.consequenceSubtitle':\n 'Hva blir konsekvensen etter alle tiltakene er fullført?',\n 'scenarioStepper.restRiskStep.probabilitySubtitle':\n 'Hva blir sannsynligheten etter alle tiltakene er fullført?',\n\n 'scenarioDrawer.title': 'Risikoscenario',\n 'scenarioDrawer.newTitle': 'Nytt risikoscenario',\n 'scenarioDrawer.titleError': 'Scenarioet må ha en tittel',\n 'scenarioDrawer.createNewScenario': 'Opprett nytt scenario',\n 'scenarioDrawer.saveAsDraft': 'Lagre som utkast',\n 'scenarioDrawer.subtitle':\n 'En uønsket hendelse som potensielt kan ramme komponenten',\n 'scenarioDrawer.riskMatrixModal.title': 'Risikomatriser',\n 'scenarioDrawer.riskMatrixModal.startRisk':\n 'Hvor stor er risikoen før man utfører noen tiltak?',\n 'scenarioDrawer.riskMatrixModal.restRisk':\n 'Hvor stor er risikoen etter at alle tiltakene er fullført?',\n\n 'scenarioDrawer.threatActorSubtitle':\n 'Noen som prøver å få tilgang til eller misbruke systemet',\n 'scenarioDrawer.vulnerabilitySubtitle':\n 'Svakhet i systemet som kan utnyttes av trusselaktøren',\n 'scenarioDrawer.consequenceTab.subtitle':\n 'Hvor alvorlig er den potensielle konsekvensen? Hvis scenarioet kan få konsekvenser i flere kategorier velg det høyeste konsekvensnivået av disse.',\n 'scenarioDrawer.probabilityTab.subtitle':\n 'Hvor stor sannsynlighet er det for at dette scenarioet vil forekomme. Dersom du er mellom to sannsynlighetsverdier velg den høyeste.',\n 'scenarioDrawer.measureTab.subtitle':\n 'Hvilke tiltak bør gjøres for å unngå scenarioet?',\n 'scenarioDrawer.measureTab.measureOwnerDescription':\n 'De eller den som er ansvarlig for at tiltaket blir gjennomført',\n 'scenarioDrawer.measureTab.addMeasureButton': 'Legg til tiltak',\n 'scenarioDrawer.measureTab.plannedMeasures': 'Planlagte tiltak',\n 'scenarioDrawer.restRiskTab.subtitle':\n 'Sett restrisiko for scenarioet. Restrisiko er konsekvens og sannsynlighet for scenarioet etter at alle tiltak i listen er gjennomført.',\n 'scenarioDrawer.deleteScenarioButton': 'Slett scenario',\n 'scenarioDrawer.deleteScenarioConfirmation':\n 'Er du sikker på at du vil slette scenario?',\n 'scenarioDrawer.deleteActionButton': 'Slett tiltak',\n 'scenarioDrawer.deleteActionConfirmation':\n 'Er du sikker på at du vil slette tiltak?',\n 'scenarioDrawer.closeConfirmation': 'Vil du lagre endringene dine?',\n 'scenarioDrawer.measureTab.addMeasureTitleError':\n 'Tiltak må ha en tittel',\n 'scenarioDrawer.measureTab.urlDescription':\n 'For eksempel lenke til Jira-oppgave',\n 'consequenceTable.rows.1': 'Ubetydelig',\n 'consequenceTable.rows.2': 'Liten',\n 'consequenceTable.rows.3': 'Moderat',\n 'consequenceTable.rows.4': 'Alvorlig',\n 'consequenceTable.rows.5': 'Kritisk',\n 'consequenceTable.columns.health': 'Liv og helse',\n 'consequenceTable.columns.economical': 'Økonomi og drift',\n 'consequenceTable.columns.privacy': 'Personvern',\n 'consequenceTable.columns.reputation': 'Omdømme og tillit',\n 'consequenceTable.cells.health.1':\n 'Liv og helse kan ikke være mindre alvorlig enn 3',\n 'consequenceTable.cells.health.2':\n 'Liv og helse kan ikke være mindre alvorlig enn 3',\n 'consequenceTable.cells.health.3':\n 'Lettere skade på personer.\\n\\nNoe skade på lokalt miljø.',\n 'consequenceTable.cells.health.4':\n 'Et fåtall alvorlige personskader.\\n\\nModerat skade på miljø på et begrenset område.',\n 'consequenceTable.cells.health.5':\n 'Dødsfall. Svært alvorlig skade på miljø over store områder.',\n 'consequenceTable.cells.economical.1':\n 'Ubetydelig økonomisk tap.\\n\\nKan fikses med 1 dagsverk.',\n 'consequenceTable.cells.economical.2':\n 'Mindre økonomisk tap.\\n\\nKan fikses med 1 månedsverk.',\n 'consequenceTable.cells.economical.3':\n 'Moderat økonomisk tap.\\n\\nKan fikses med 1 årsverk.',\n 'consequenceTable.cells.economical.4':\n 'Større økonomisk tap.\\n\\nKan fikses med 20 årsverk.',\n 'consequenceTable.cells.economical.5':\n 'Kritisk økonomisk tap.\\n\\nKan fikses med 400 årsverk.',\n 'consequenceTable.cells.privacy.1': 'Ingen brudd.',\n 'consequenceTable.cells.privacy.2': 'Mindre brudd.',\n 'consequenceTable.cells.privacy.3':\n 'Brudd på registrertes rettigheter og friheter.',\n 'consequenceTable.cells.privacy.4':\n 'Meget alvorlige brudd på registrertes rettigheter og friheter, samt lovbrudd.',\n 'consequenceTable.cells.privacy.5':\n 'Personvern kan ikke være mer alvorlig enn 4',\n 'consequenceTable.cells.reputation.1':\n 'Liten fare for omdømmetap og liten innvikrning på tillit',\n 'consequenceTable.cells.reputation.2':\n 'Negativ oppmerksomhet i regionale og nasjonale medier som fører til omdømmetap.\\n\\nKan redusere tillit.',\n 'consequenceTable.cells.reputation.3':\n 'Negativ oppmerksomhet i nasjonale og internasjonale medier som fører til alvorlig omdømmetap.\\n\\nAlvorlig redusert tillit fra myndigheter.\\n\\nBrukere som ikke tør / vil bruke tjenestene.',\n 'consequenceTable.cells.reputation.4':\n 'Omdømme og tillit kan ikke være mer alvorlig enn 3',\n 'consequenceTable.cells.reputation.5':\n 'Omdømme og tillit kan ikke være mer alvorlig enn 3',\n\n 'probabilityTable.rows.1': 'Svært liten',\n 'probabilityTable.rows.2': 'Liten',\n 'probabilityTable.rows.3': 'Moderat',\n 'probabilityTable.rows.4': 'Stor',\n 'probabilityTable.rows.5': 'Svært stor',\n 'probabilityTable.cells.1':\n 'Scenarioet er usannsynlig å inntreffe.\\n\\nDet inntreffer sjeldnere enn hvert 400. år',\n 'probabilityTable.cells.2':\n 'Scenarioet er usannsynlig å inntreffe.\\n\\nDet kan inntreffe hvert 20. år',\n 'probabilityTable.cells.3':\n 'Scenarioet kan inntreffe.\\n\\nDet kan inntreffe nærmest årlig',\n 'probabilityTable.cells.4':\n 'Scenarioet vil med stor sannsynlighet inntreffe.\\n\\nDet kan inntreffe nærmest månedlig',\n 'probabilityTable.cells.5':\n 'Scenarioet er nesten garantert å inntreffe.\\n\\nDet kan inntreffe nærmest daglig',\n 'threatActors.Script kiddie': 'Datasnok',\n 'threatActors.Hacktivist': 'Hacktivist',\n 'threatActors.Reckless employee': 'Uheldig ansatt',\n 'threatActors.Insider': 'Innside-aktør',\n 'threatActors.Organised crime': 'Organiserte kriminelle',\n 'threatActors.Terrorist organisation': 'Terroristorganisasjon',\n 'threatActors.Nation/government': 'Nasjon/stat',\n\n 'vulnerabilities.Flawed design': 'Mangelfullt design',\n 'vulnerabilities.Misconfiguration': 'Feilkonfigurering',\n 'vulnerabilities.Dependency vulnerability': 'Sårbarhet i avhengighet',\n 'vulnerabilities.Unauthorized access': 'Uautorisert tilgang',\n 'vulnerabilities.Unmonitored use': 'Uovervåket bruk',\n 'vulnerabilities.Input tampering': 'Klussing med input',\n 'vulnerabilities.Information leak': 'Informasjonslekkasje',\n 'vulnerabilities.Excessive use': 'Overdreven bruk',\n\n 'threatActorsAndVulnerabilities.title':\n 'Trusselaktører og sårbarheter',\n 'threatActorsAndVulnerabilities.allCovered':\n 'Alle {{kind}} er dekket i minst ett scenario.',\n 'threatActorsAndVulnerabilities.oneNotCovered':\n '{{kind}} <b>{{notCovered}}</b> er ikke dekket i noen scenarioer',\n 'threatActorsAndVulnerabilities.twoNotCovered':\n '{{kind}} <b>{{notCovered1}}</b> og <b>{{notCovered2}}</b> er ikke dekket i noen scenarioer.',\n 'threatActorsAndVulnerabilities.multipleNotCovered':\n 'Flere {{kind}} er ikke dekket. Dette inkluderer <b>{{notCovered1}}</b>, <b>{{notCovered2}}</b> og <b>{{notCovered3}}</b>',\n 'threatActorsAndVulnerabilities.showMoreInfo': 'Vis mer informasjon',\n 'threatActorsAndVulnerabilities.dialogHeader':\n 'Scenarier som dekker sårbarheter og trusselaktører',\n 'threatActorsAndVulnerabilities.vulnerabilityCoverage':\n 'Sårbarheter dekket',\n 'threatActorsAndVulnerabilities.threatActorCoverage':\n 'Trusselaktører dekket',\n 'threatActorsAndVulnerabilities.coverageRatio':\n '{{covered}} av {{total}}',\n 'threatActorsAndVulnerabilities.tableColumnThreatActor':\n 'Trusselaktør',\n 'threatActorsAndVulnerabilities.tableColumnVulnerability':\n 'Sårbarhet',\n 'threatActorsAndVulnerabilities.tableColumnScenarios':\n 'Antall scenarioer',\n 'actionStatus.Not started': 'Ikke startet',\n 'actionStatus.In progress': 'Startet',\n 'actionStatus.On hold': 'På vent',\n 'actionStatus.Completed': 'Fullført',\n 'actionStatus.Aborted': 'Avbrutt',\n 'actionStatus.OK': 'OK',\n 'actionStatus.Not OK': 'Ikke OK',\n 'actionStatus.Not relevant': 'Ikke relevant',\n 'errorMessages.DefaultErrorMessage': 'Det oppstod en feil',\n 'errorMessages.ErrorWhenNoWriteAccessToRepository':\n 'Kunne ikke oppdatere ROS. Du har ikke skrivetilgang til {{owner}}/{{name}}.',\n 'errorMessages.ErrorWhenUpdatingRiSc':\n 'Kunne ikke lagre risiko- og sårbarhetsanalyse',\n 'errorMessages.ErrorWhenDeletingRiSc':\n 'Kunne ikke slette risiko- og sårbarhetsanalyse',\n 'errorMessages.ErrorWhenCreatingRiSc':\n 'Kunne ikke opprette risiko- og sårbarhetsanalyse',\n 'errorMessages.RiScDoesNotExist':\n 'Risiko- og sårbarhetsanalysen du prøver å åpne eksisterer ikke',\n 'errorMessages.ScenarioDoesNotExist':\n 'Scenariet du prøver å åpne eksisterer ikke',\n 'errorMessages.ErrorWhenCreatingPullRequest':\n 'Kunne ikke lagre godkjenning av risiko- og sårbarhetsanalysen',\n 'errorMessages.ErrorWhenFetchingRiScs':\n 'Kunne ikke hente risiko- og sårbarhetsanalyser med id-er: ',\n 'errorMessages.FailedToFetchRiScs':\n 'Kunne ikke hente risiko- og sårbarhetsanalyser',\n 'errorMessages.ErrorWhenFetchingSopsConfig':\n 'Kunne ikke hente SOPS-konfigurasjon',\n 'errorMessages.FailedToCreateSops':\n 'Kunne ikke opprette SOPS-konfigurasjon',\n 'errorMessages.FailedToUpdateSops':\n 'SOPS-konfigurasjon kunne ikke oppdateres',\n 'errorMessages.ErrorWhenFetchingGcpCryptoKeys':\n 'Kunne ikke laste inn risiko- og sårbarhetsanalysene — krypteringstjenesten er ikke tilgjengelig. Prøv å oppdatere siden.',\n 'errorMessages.ContentStatusDeleted':\n 'Risiko- og sårbarhetsanalyse \"{{riScId}}\" har blitt slettet',\n 'errorMessages.ContentStatusFailure':\n 'Kunne ikke laste risiko- og sårbarhetsanalyse \"{{riScId}}\" grunnet en uventet feil',\n 'errorMessages.ContentStatusFileNotFound':\n 'Risiko- og sårbarhetsanalyse \"{{riScId}}\" ble ikke funnet i repositoryet',\n 'errorMessages.ContentStatusDecryptionFailed':\n 'Kunne ikke dekryptere risiko- og sårbarhetsanalyse \"{{riScId}}\". Du har muligens ikke de nødvendige dekrypteringsnøklene',\n 'errorMessages.ContentStatusNoReadAccess':\n 'Du har ikke lesetilgang til risiko- og sårbarhetsanalyse \"{{riScId}}\". ',\n 'errorMessages.ContentStatusUnsupportedMigration':\n 'Risiko- og sårbarhetsanalyse \"{{riScId}}\" kan ikke automatisk migreres til den nyeste versjonen.',\n 'errorMessages.ContentStatusSchemaValidationFailed':\n 'Risiko- og sårbarhetsanalyse \"{{riScId}}\" kunne ikke lastes fordi innholdet ikke samsvarer med forventet format. Den kan ha blitt manuelt redigert eller ødelagt.',\n\n 'errorMessages.ContentStatusDecryptionFailedMessage.INTERNAL_SERVER_ERROR':\n 'Kunne ikke dekryptere risiko- og sårbarhetsanalyse \"{{riScId}}\", 500 - Intern serverfeil fra kryptotjenesten.',\n 'errorMessages.ContentStatusDecryptionFailedMessage.MISSING_DATA_KEY':\n 'Kunne ikke dekryptere risiko- og sårbarhetsanalyse \"{{riScId}}\", kunne ikke få tilgang til krypteringsnøkkelen som kreves for dekryptering.',\n 'errorMessages.ContentStatusDecryptionFailedMessage.NO_MATCHING_KEY':\n 'Kunne ikke dekryptere risiko- og sårbarhetsanalyse \"{{riScId}}\", ingen tilgjengelig nøkkel kunne dekryptere innholdet.',\n 'errorMessages.ContentStatusDecryptionFailedMessage.AUTHENTICATION_FAILED':\n 'Kunne ikke dekryptere risiko- og sårbarhetsanalyse \"{{riScId}}\", autentisering mislyktes. Vennligst kontroller tilgangene dine.',\n 'errorMessages.ContentStatusDecryptionFailedMessage.INVALID_GCP_TOKEN':\n 'Kunne ikke dekryptere risiko- og sårbarhetsanalyse \"{{riScId}}\", Google Cloud-tokenet ditt er ugyldig eller utløpt.',\n 'errorMessages.ContentStatusDecryptionFailedMessage.INVALID_AGE_KEY':\n 'Kunne ikke dekryptere risiko- og sårbarhetsanalyse \"{{riScId}}\", den oppgitte AGE-nøkkelen er ugyldig.',\n 'errorMessages.ContentStatusDecryptionFailedMessage.CONNECTION_REFUSED':\n 'Kunne ikke dekryptere risiko- og sårbarhetsanalyse \"{{riScId}}\", kunne ikke koble til krypteringstjenesten.',\n\n 'errorMessages.ContentStatusUnknown':\n 'Kunne ikke hente risiko- og sårbarhetsanalyse \"{{riScId}}\" med ukjent status: {{status}}',\n 'infoMessages.OpenedPullRequest': 'Åpnet pull request',\n 'infoMessages.CreatedPullRequest':\n 'Godkjenning av risiko- og sårbarhetsanalysen ble lagret',\n 'infoMessages.DeletedRiSc':\n 'Risiko- og sårbarhetsanalysen ble slettet',\n 'infoMessages.DeletedRiScRequiresApproval':\n 'Risiko- og sårbarhetsanalysen ble markert for sletting og trenger godkjenning',\n 'infoMessages.UpdatedRiSc':\n 'Risiko- og sårbarhetsanalysen ble oppdatert',\n 'infoMessages.UpdatedSops': 'SOPS-konfigurasjon oppdatert',\n 'infoMessages.UpdatedRiScRequiresNewApproval':\n 'Risiko- og sårbarhetsanalysen ble oppdatert og trenger ny godkjenning',\n 'infoMessages.CreatedRiSc':\n 'Risiko- og sårbarhetsanalyse ble opprettet',\n 'infoMessages.UpdatedRiScAndCreatedPullRequest':\n 'Risiko- og sårbarhetsanalysen ble oppdatert og er klar for godkjenning i Github',\n 'infoMessages.NoSopsConfigFound':\n 'Ingen SOPS-konfigurasjon funnet på default branchen til GitHub-repoet',\n 'infoMessages.CreatedSops': 'SOPS-konfigurasjon opprettet',\n 'infoMessages.UpdateAction': 'Oppdaterer tiltak ...',\n 'infoMessages.UpdateInfoMessage':\n 'Vennligst vent et par sekunder mens endringene lagres.',\n 'deleteDialog.title': 'Slett risiko- og sårbarhetsanalyse',\n 'deleteDialog.confirmationMessage':\n 'Er du sikker på at du vil slette denne risiko- og sårbarhetsanalysen?',\n 'feedbackDialog.title': 'Gi oss en tilbakemelding!',\n 'feedbackDialog.description': 'Din tilbakemelding',\n 'feedbackDialog.confirmationMessage': 'Takk for din tilbakemelding.',\n 'feedbackDialog.feedbackButton': 'Gi tilbakemelding',\n 'feedbackDialog.errorMessage': 'Kunne ikke sende tilbakemelding.',\n 'feedbackDialog.sendButton': 'Send',\n 'filterButton.veryOutdated': 'Veldig utdaterte tiltak',\n 'filterButton.outdated': 'Utdaterte tiltak',\n 'filterButton.listUpdatedActions': 'Nylig oppdaterte tiltak',\n 'firstRiScCard.noRiScYet': 'Ingen RoS-analyser opprettet enda',\n 'firstRiScCard.getStarted':\n 'Kom igang med risiko- og sårbarhetsanalyse for ditt team',\n 'filter.title': 'Tittel (a-å)',\n 'filter.initialRisk': 'Startrisiko (høy-lav)',\n 'filter.completedActions': 'Flest fullførte tiltak',\n 'filter.remainingActions': 'Flest gjennværende tiltak',\n },\n }),\n },\n});\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"translations.esm.js","sources":["../../src/utils/translations.ts"],"sourcesContent":["import {\n createTranslationRef,\n createTranslationResource,\n} from '@backstage/core-plugin-api/alpha';\n\nexport const pluginRiScMessages = {\n currentLanguage: 'en',\n contentHeader: {\n title: 'Risk scorecard',\n createNewButton: 'Create new scorecard',\n editEncryption: 'Edit encryption',\n deleteButton: 'Delete scoreboard',\n multipleRiScs: 'RiSc scorecards',\n },\n dictionary: {\n by: 'By',\n click: 'Click',\n here: 'here',\n rejectedLogin: 'Login rejected by user.',\n yes: 'Yes',\n no: 'No',\n summary: 'Summary',\n noAccess: 'No access',\n optional: 'optional',\n month: 'month',\n week: 'week',\n day: 'day',\n hour: 'hour',\n minute: 'minute',\n second: 'second',\n months: 'months',\n weeks: 'weeks',\n days: 'days',\n hours: 'hours',\n minutes: 'minutes',\n seconds: 'seconds',\n action: 'Action',\n add: 'Add',\n added: 'Added',\n availability: 'Availability',\n copy: 'Copy',\n copied: 'Copied',\n cancel: 'Cancel',\n close: 'Close',\n completed: 'Completed',\n confidentiality: 'Confidentiality',\n confirm: 'Confirm',\n consequence: 'Consequence', // Severity, Impact, Effect or Consequence\n deadline: 'Deadline', // Deadline or Due date\n delete: 'Delete',\n description: 'Description',\n discardChanges: 'Discard changes',\n edit: 'Edit',\n estimatedRisk: 'Estimated risk',\n estimatedInitialRisk: 'Estimated initial risk',\n estimatedRemainingRisk: 'Estimated remaining risk',\n estimatedCurrentRisk: 'Estimated current risk',\n example: 'Example',\n initialRisk: 'Initial risk', // Starting or Initial risk\n integrity: 'Integrity',\n measure: 'Action', // Measure, Action or Initiative\n measures: 'Actions', // Measure, Action or Initiative\n measuresInitialRiSc: 'actions',\n measureOwner: 'Responsible', // Responsible? Measure owner? Initiative owner?\n next: 'Next',\n planned: 'Planned',\n previous: 'Previous',\n probability: 'Probability', // Likelihood or Probability\n restRisk: 'Remaining risk', // Residual or Remaining risk\n currentRisk: 'Current risk',\n removed: 'Removed',\n risk: 'Risk',\n riskExplanation: {\n initial: 'Risk before actions are completed',\n current: 'Current risk based on current action status',\n remaining: 'Risk after all actions are completed',\n },\n save: 'Save',\n saveAndClose: 'Save and close',\n scenario: 'Scenario',\n scope: 'Scope',\n status: 'Status',\n threatActors: 'Threat actors',\n theThreatActor: 'The threat actor',\n theThreatActors: 'The threat actors',\n title: 'Title',\n unknown: 'Unknown',\n url: 'URL',\n emptyField: 'No {{field}} specified',\n valuation: 'Valuation',\n version: 'Version',\n vulnerabilities: 'Vulnerabilities',\n theVulnerability: 'The vulnerability',\n theVulnerabilities: 'The vulnerabilities',\n showOnlyRelevant: 'Show only relevant',\n noRelevantMeasures: 'No relevant actions',\n scenarios: 'scenarios',\n customOrder: 'Custom order',\n searchQuery: 'No result for ',\n actionsWithStatus: 'Actions that are OK',\n refresh: 'Refresh',\n },\n encryption: {\n title: 'Encryption',\n },\n rosStatus: {\n statusBadge: {\n missing:\n 'Once the draft is complete, the risk owner can review and accept the changes.', // Mangler godkjenning av risikoeier\n approved: 'Accepted by risk owner', // Godkjent av risikoeier\n error: 'Failed to retrieve status', // Kunne ikke hente status\n migration: {\n title: 'You are required to review and save changes',\n description:\n 'There has been done changes to the risk scorecard, as a result of a migration to the newest version. The changes may include deletion and modification of information. It will not be possible to save edits of the scorecard without including and accepting the changes.', // Automatisk migrering av ROS\n },\n created: 'Empty scorecard created',\n draft: 'Draft',\n waiting: 'Awaiting approval',\n published: 'Published',\n draftDeletion: 'Marked for deletion',\n waitingDeletion: 'Awaiting deletion',\n deletionApproval: 'The risk owner can review and accept the deletion.',\n },\n updatedStatus: {\n UPDATED: 'Updated status icon',\n LITTLE_OUTDATED: 'Little outdated status icon',\n OUTDATED: 'Outdated status icon',\n VERY_OUTDATED: 'Very outdated status icon',\n error: 'Error status icon',\n disabled: 'Disabled status icon',\n tooltip: {\n OUTDATED: 'This action is outdated',\n VERY_OUTDATED: 'This action is very outdated',\n },\n },\n lastModified: 'Last published: ',\n daysSinceLastModified: '{{days}} days and {{numCommits}} commits ago',\n notPublishedYet: 'RiSc is not published yet',\n errorMessage: 'Failed to retrieve status',\n outdated: 'Outdated',\n veryOutdated: 'Very outdated',\n updated: 'Updated',\n updating: 'Saving...',\n difference: {\n description: 'Summary of changes that will be approved by risk owner.',\n publishDate: 'Last published changes {{date}}',\n fetching: 'Fetching changes',\n error: 'Error while fetching changes',\n newROS: 'No published Risk scorecards to compare with',\n differences: {\n title: 'CHANGES',\n noneRemoved: 'Nothing is removed',\n titleRemoved: 'Removed from risk scorecard',\n titleExisting: 'Changed in existing risk scorecard',\n noneExisting: 'Nothing is changed',\n titleAdded: 'Added to risk scorecard',\n noneAdded: 'Nothing is added',\n },\n },\n editing: 'You can now start editing',\n approveButtonUpdate: 'Accept risks', // Approve RiSc\n approveButtonDelete: 'Accept deletion', // Approve deletion of RiSc\n prStatus: ' Merge the PR in ', // Avventer godkjenning av PR i Github\n prStatus2Update: ' to publish the scorecard.', // Approve RiSc\n prStatus2Delete: ' to delete the scorecard.', // Approve deletion of RiSc\n moreInformationButton: 'More information', // Lagre ROS migrering\n githubLink: 'Go to GitHub',\n },\n publishDialog: {\n titleUpdate: 'Accept risks', // Approve ROS\n titleDelete: 'Accept deletion', // Delete ROS\n checkboxLabelUpdate:\n 'I confirm that the risk owner accepts the risks detailed in this risk scorecard.',\n checkboxLabelDelete:\n 'I confirm that the risk owner accepts the deletion of this risk scorecard.',\n },\n migrationDialog: {\n description:\n 'The changes have been made to adhere to the latest schema version.',\n migrationTitle: 'Migration from {{from}} to {{to}}',\n schemaVersion: 'Schema version',\n schemaChangelog: 'Open schema changelog',\n title: 'Save changes', // Lagre ROS migrering\n checkboxLabel:\n 'I confirm that I have reviewed and wish to save the changes made during the migration.',\n migration40: {\n changeExplanation:\n 'This migration changes preset values for consequence and probability.',\n owner: 'Responsible',\n deadline: 'Deadline',\n existingActions: 'Existing actions',\n vulnerabilitiesTitle: 'Vulnerabilities',\n vulnerabilities: {\n 'Compromised admin user': 'Compromised admin user',\n 'Denial of service': 'Denial of service',\n 'Disclosed secret': 'Disclosed secret',\n 'Escalation of rights': 'Escalation of rights',\n 'Excessive use': 'Excessive use',\n 'Information leak': 'Information leak',\n 'User repudiation': 'User repudiation',\n 'Unauthorized access': 'Unauthorized use',\n 'Unmonitored use': 'Unmonitored use',\n },\n },\n migration41: {\n changeExplanation:\n 'This migration removes the owner and deadline fields from actions, removes existing actions and updates values for vulnerabilities.',\n nokPerIncident: 'NOK/incident',\n occurrencesPerYear: 'occurrences/year',\n },\n migration42: {\n changeExplanation: 'This migration adds a last updated field to actions.',\n },\n migration50: {\n changeExplanation:\n 'This migration updates the action status to a new naming convention.',\n },\n migration51: {\n changeExplanation:\n 'This migration adds a last updated by field to actions.',\n lastUpdatedBy: 'Last updated by:',\n addedLastUpdatedBy:\n 'Added field to track who updated an action for {{numberOfChangedActions}} existing actions',\n },\n migration52: {\n changeExplanation:\n 'This migration removes the unused concept of valuations from the RiSc document.',\n title: 'Valuations removed',\n oldValue: 'Existing valuations removed',\n },\n removed: 'Removed',\n },\n comparisonDialog: {\n noChanges: 'No changes',\n changes: 'Changes to RiSc',\n noURL: 'No URL provided',\n noDescription: 'No description provided',\n risk: {\n probabilityUnit: 'occurrences/year',\n consequenceUnit: 'NOK/incident',\n },\n valuation: {\n integrity: {\n Insignificant: 'Insignificant',\n Expected: 'Expected',\n Dependent: 'Dependent',\n Critical: 'Critical',\n },\n availability: {\n Insignificant: 'Insignificant',\n '2 days': '2 days',\n '4 hours': '4 hours',\n Immediate: 'Immediate',\n },\n confidentiality: {\n Public: 'Public',\n Internal: 'Internal',\n Confidential: 'Confidential',\n 'Strictly confidential': 'Strictly confidential',\n },\n },\n },\n supportDialog: {\n title: 'Support',\n openEntry: 'Open',\n entries: {\n riscFeedbackChannel: {\n title: 'RISC Feedback Channel',\n description: '#kodenær-ros-tilbakemelding',\n },\n riscDocumentation: {\n title: 'RISC Documentation',\n description: 'Confluence - RISC',\n },\n },\n },\n scenarioTable: {\n title: 'Risk scenarios',\n addScenarioButton: 'Add scenario',\n noActions: 'No actions',\n columns: {\n consequenceChar: 'C',\n probabilityChar: 'P',\n completed: 'complete',\n },\n editButton: 'Edit list',\n doneEditing: 'Finish editing',\n noActionsLong: 'The scenario has no actions',\n },\n riskMatrix: {\n title: 'Risk matrix', // Risk matrix or Risk overview\n estimatedRisk: {\n title: 'Estimated risk',\n suffix: {\n thousand: '{{count}} thousand',\n million_one: '{{count}} million',\n million_other: '{{count}} million',\n billion_one: '{{count}} billion',\n billion_other: '{{count}} billion',\n trillion_one: '{{count}} trillion',\n trillion_other: '{{count}} trillion',\n },\n unit: {\n nokPerYear: 'NOK/year',\n },\n },\n tooltip: {\n title: 'Risk scenarios',\n },\n currentRisk: {\n title: 'Risc reduction',\n description:\n \"The diagram illustrates the development from today's initial risk to the calculated final risk. <strong>{{actionsOk}}</strong> completed actions represent a reduction of <strong>{{reduction}} NOK/year.</strong>\",\n showMoreInfo: 'Risk statistics per scenario',\n dialogHeader: 'Risk statistics per scenario',\n dialogDescription:\n 'This table shows risk statistics per scenario. All actions within a scenario are weighted equally, so each completed action contributes the same amount of risk reduction. Use the dropdown to choose which metric to display:',\n metricCurrentRiskDescription:\n 'estimated risk based on the share of completed actions.',\n metricPotentialReductionDescription:\n 'how much the risk can still be reduced by completing remaining actions.',\n metricReductionPerActionDescription:\n 'potential reduction divided equally across remaining relevant actions.',\n scenarioColumn: 'Scenario',\n metricLabel: 'Metric',\n metricCurrentRisk: 'Current risk',\n metricReductionPerAction: 'Risk reduction per action',\n metricPotentialReduction: 'Potential reduction',\n },\n },\n infoDialog: {\n title: 'Estimated risk',\n description:\n 'The estimated risk is a calculation based on the risks the different scenarios pose. If there is a high probability that a serious consequence will occur, this could potentially become a large cost for the organization. In other words, the cost is an attempt to make the risk value more tangible and is the sum of the estimated risk for all the risk scenarios in this risk scorecard.',\n calculatedHowTitle: 'How do we calculate the estimated risk?',\n calculatedHow:\n 'Probability (P) is measured in incidents per year and consequence (C) is measured in cost (in NOK) per incident. ' +\n 'The estimated risk is calculated as 20',\n calculatedHowExponent: 'P+C-1',\n consequenceTitle: 'Consequence (NOK/incident)', // incident, event or occurrence\n consequenceUnit: 'NOK/incident',\n consequenceDescription: {\n oneworkday: '1 workday',\n oneworkmonth: '1 work month',\n oneworkyear: '1 work year',\n '20workyears': '20 work years',\n '400workyears': '400 work years',\n },\n probabilityTitle: 'Probability (incidents/year)',\n probabilityUnit: 'incidents/year',\n probabilityDescription: {\n every400years: 'Once every 400 years',\n every20years: 'Once every 20 years',\n annualy: 'Annually',\n monthly: 'Monthly',\n daily: 'Daily',\n },\n example: {\n part1: 'A risk scenario with probability ',\n part2: ' and consequence ',\n part3: ' has an estimated risk of ',\n },\n currentRisk: {\n title: 'Current risk calculations',\n description:\n 'Current risk blends the starting risk, the planned end risk, and how far the mitigation actions have progressed. For each scenario, we first compute the initial risk',\n remainingRiskCost: 'and the remaining risk',\n actionRatio:\n 'Then we measure how many relevant actions are completed (ratio) = (number of completed actions) / (number of actions not marked “Not relevant”). If no relevant actions, ratio = 0.',\n currentRiskCost:\n 'The current risk interpolates between start and remaining risk based on that ratio',\n aggregated: 'The aggregated current risk is the sum of ',\n aggregatedSums: 'across all scenarios, reported in NOK per year.',\n },\n },\n rosDialog: {\n titleNew: 'New risk scorecard',\n titleEdit: 'Edit scorecard',\n editEncryption: 'Edit encryption',\n titleError: 'The scorecard has to have a title',\n scopeDescription:\n 'Describe what the risk analysis will assess. Specify any key areas which are not part of the scope.',\n scopeError: 'The scorecard has to have a description of the scope',\n generateInitialDescription:\n 'RiSc Scorecard lets you generate a default RiSc based on information about the codebase in kartverket.dev, security metrics and security controls.',\n generateInitialToggleDescription: 'Do you want to generate a default RiSc?',\n fromScratch: 'Empty',\n generateDefault: 'Default',\n stepRiscDetails: 'Risk Scorecard Details',\n stepEncryption: 'Configure Encryption',\n initialRiscTitle: 'Predefined Risk Scorecard',\n initialRiscScopeDescription:\n 'Do you want to generate a RoS with predefined scenarios and actions?',\n initialRiscApplicationType: 'What type of application do you have?',\n generateObsRiScDescription:\n 'This RoS contains scenarios that should be considered for build and deploy.',\n generateInternalJobRiScDescription:\n 'This RoS contains scenarios that should be considered for internal tools and jobs',\n generateStandardRiScDescription:\n 'This RoS is generated from information about the codebase in kartverket.dev, security metrics and security controllers.',\n noInitialRiScFound: 'No default RoS is currently available.',\n applicationType: 'Choose application type',\n titleAndScope: 'Title and scope',\n recommendedForComponentOfType: 'Recommended for components of type',\n },\n sopsConfigDialog: {\n title: 'Encryption',\n description: {\n new: 'The Risc Scorecard will be encrypted to limit access. Below please choose a key from Google Cloud Platform which you and your team can access.',\n edit: 'The Risc Scorecard will be encrypted to limit access. You can change which key is utilized from Google Cloud Platform, make sure the correct people have access to the new key.',\n },\n selectKeysTitle: 'Choose encryption key',\n chooseGcpCryptoKey: 'Choose GCP key',\n gcpCryptoKeyDescription:\n 'From the list below, select the GCP crypto key you want to use for encrypting and decrypting the Risk scorecard.',\n cryptoKeyOptionInfo:\n '(Project: {{projectId}}, Permissions: {{permissions}})',\n cryptoKeyPermissionENCRYPT: 'Encrypt',\n cryptoKeyPermissionDECRYPT: 'Decrypt',\n cryptoKeyPermissionUNKNOWN: '⚠️ Unknown - you should switch to another key',\n gcpCryptoKeyNoSelectableKey:\n 'You do not have access to any suitable GCP crypto keys.',\n gcpCryptoKeyNonSelectedErrorMessage: 'A GCP crypto key must be selected.',\n publicAgeKeysAlreadyPresent: 'The following age keys are already present:',\n publicAgeKeyQuestion:\n 'Does anyone need to write Risk scorecards locally using their editor?',\n writeLocalRiscSuffix: \"to learn more about writing RiSc's locally.\",\n publicAgeKeyDescription:\n 'Provide a public age key below for individuals allowed local editing',\n addPublicAgeKey: 'Add public age key',\n publicAgeKey: 'Public age key',\n update: 'Update',\n createPRTitle: 'Create a Pull Request with the new encryption scheme',\n createPRContent:\n 'Your encryption configuration is now ready and has been created in a new branch. Below you can create a PR with these changes. Alternatively, you can move the changes to a different branch by clicking the \"Branch\" button and selecting another active branch.',\n PRTitle: 'Review and merge the Pull Request',\n SummaryDescription: 'A PR with the encryption scheme has now been created.',\n SummaryGCP: 'The selected GCP key is ',\n SummaryAgeKeys: 'The following public age keys have also been added: ',\n PRContent:\n 'Click the button below to view the changes, review them, and merge the PR. After you merge the PR, you can start creating and managing Risk scorecards.',\n required: 'This field is required',\n publicKeyHelperTextKeyAlreadyExists: 'Public key already added',\n publicKeyHelperTextKeyAlreadyExistInSopsConfig:\n 'Public key already present in existing SOPS configuration',\n publicKeyHelperTextKeyNotValid: 'Public key is not a valid age public key',\n pendingTitle: 'Pending SOPS configuration',\n pendingDescription:\n 'The following pull requests are opened to include a SOPS configuration in the GitHub-repo',\n secondaryPullRequestText: 'Opened _n_ ago by',\n reEncryptTitle: \"Re-encryption of existing RiSc's\",\n reEncryptDescription:\n \"When updating SOPS configuration, you will not be able to decrypt old RiSc's encrypted with the previous SOPS configuration. We therefore encourage you to re-encrypt the existing RiSc's on the default branch of your GitHub-repository for you to be able to use them with your updated SOPS configuration.\",\n reEncryptConsentDescription:\n \"Do you want to re-encrypt the RiSc's on the default branch of \",\n openPR: 'Create pull request',\n gotoPullRequest: 'Go to pull request',\n },\n scenarioStepper: {\n initialRiskStep: {\n title: 'Initial risk',\n subtitle:\n 'The initial risk is defined by the consequence of the scenario and the probability of it occurring.',\n consequenceSubtitle:\n 'How severe is the potential impact? If the scenario can impact more than one category, choose the highest level of consequence.',\n probabilitySubtitle:\n 'How likely is it that this scenario will occur? If you are between two probability values, choose the higher one.',\n },\n restRiskStep: {\n title: 'Remaining risk',\n subtitle:\n 'What is the risk reduced to when all the planned actions have been completed?',\n consequenceSubtitle:\n 'How severe is the consequence of this scenario after all actions are complete?',\n probabilitySubtitle:\n 'What is the likelihood of this scenario after all actions are complete?',\n },\n },\n scenarioDrawer: {\n action: {\n requiredError: 'Field is required',\n descriptionError: 'Description cannot be empty',\n urlError: 'Invalid URL',\n emptyState: 'This scenario has no defined actions',\n lastUpdated: 'Last updated:',\n notUpdated: 'No date',\n },\n title: 'Risk scenario',\n newTitle: 'New risk scenario',\n titleError: 'Scenario title is required',\n subtitle: 'An unwanted incident that could potentially harm the component.', // harm or affect negatively?\n threatActorSubtitle: 'Someone who attempts to access or abuse the system', // system or component or both?\n vulnerabilitySubtitle:\n 'Weakness in the system that the threat actor can exploit',\n createNewScenario: 'Create new scenario',\n saveAsDraft: 'Save as draft',\n riskMatrixModal: {\n startRisk: 'What is the risk before any mitigating actions are taken?',\n restRisk: 'What is the risk after all planned actions are completed?',\n title: 'Risk matrixes',\n },\n consequenceTab: {\n subtitle:\n 'How severe is the potential impact? If the scenario can impact more than one category, choose the highest level of consequence.',\n },\n probabilityTab: {\n subtitle:\n 'How likely is it that this scenario will occur? If you are between two probability values, choose the higher one.',\n },\n measureTab: {\n subtitle:\n 'What actions should be taken to avoid or reduce the risk of this scenario?',\n measureOwnerDescription:\n 'Decide who will be responsible for completion of this action',\n addMeasureButton: 'Add planned action',\n plannedMeasures: 'Planned actions',\n addMeasureTitleError: 'Action title is required',\n urlDescription: 'For example, link to Jira task',\n },\n restRiskTab: {\n subtitle:\n 'Define the remaining risk for the scenario. Remaining risk is the consequence and probability for this ' +\n 'scenario after all planned actions have been completed.',\n },\n deleteScenarioButton: 'Delete scenario',\n deleteScenarioConfirmation:\n 'Are you sure you want to delete this scenario?',\n deleteActionButton: 'Delete action',\n deleteActionConfirmation: 'Are you sure you want to delete this action?',\n closeConfirmation: 'Do you want to save your changes?',\n errors: {\n remainingProbabilityTooHigh:\n 'Remaining probability cannot be higher than initial probability',\n remainingConsequenceTooHigh:\n 'Remaining consequence cannot be higher than initial consequence',\n },\n },\n consequenceTable: {\n rows: {\n '1': 'Negligible', // Insignificant, negligible (ubetydelig)\n '2': 'Small', // Liten\n '3': 'Moderate',\n '4': 'Severe', // Alvorlig\n '5': 'Critical', // Catastrophic eller Critical\n },\n columns: {\n health: 'Life and health', // Health and safety, Life and limb, Health and lives (Liv og helse)\n economical: 'Financial', // Financial consequences, economic implications\n privacy: 'Privacy', // Personvern\n reputation: 'Reputation and trust', // Reputation and trust, confidence, faith (Omdømme og tillit)\n },\n cells: {\n health: {\n '1': 'Impact on life and health cannot be rated less severe than 3', // Liv og helse kan ikke være mindre alvorlig enn 3\n '2': 'Impact on life and health cannot be rated less severe than 3',\n '3': 'Temporary or less severe health implications. Temporary or minor damage to local environment.', // implications, effects or consequence? Temporary or minor? Midlertidige eller mindre alvorlige helsemessige konsekvenser. Midlertidig eller mindre skade på miljøet\n '4': 'Permanent or severe health implications for a few people. Moderate damage to the environment in a limited area.',\n '5': 'Death or permanent severe health implications for many people. Severe damage to the environment across large areas.',\n },\n economical: {\n '1': 'Temporary minor financial loss.\\n\\nMay be fixed with 1 workday.',\n '2': 'Temporary financial loss.\\n\\nMay be fixed with 1 work month.',\n '3': 'Financial loss of some duration.\\n\\nMay be fixed with 1 work year.',\n '4': 'Financial loss of considerable duration for the organization and any third parties.\\n\\nMay be fixed with 20 work years.',\n '5': 'Permanent and severe financial loss.\\n\\nMay be fixed with 400 work years.',\n },\n privacy: {\n '1': 'The right to privacy is violated for a very short period and does not involve sensitive categories or vulnerable groups', // særlige kategorier = sensitive kategorier? special/particular/sensitive categories\n '2': 'The right to privacy is violated for a longer period and involves sensitive categories or vulnerable groups.',\n '3': 'Violations of the rights and freedoms for the registered people.',\n '4': 'Severe violations and breaches of the rights and freedoms for the registered people, as well as violations of the law.',\n '5': 'Impact on privacy cannot be rated more severe than 4',\n },\n reputation: {\n '1': 'Temporary loss of reputation and little impact on trust',\n '2': 'Negative attention in national media that leads to loss of reputation.\\n\\nMay reduce trust.',\n '3': 'Lasting negative attention in national and international media that leads to severe loss of reputation.\\n\\nSevere loss of trust from authorities.\\n\\nUsers who do not dare or want to use the services.', // lasting, severe, severe loss, severe loss of trust, do not dare or want to use the services\n '4': 'Impact on reputation and trust cannot be rated more severe than 3',\n '5': 'Impact on reputation and trust cannot be rated more severe than 3',\n },\n },\n },\n probabilityTable: {\n rows: {\n '1': 'Very low', // svært liten\n '2': 'Low', // liten\n '3': 'Moderate', // moderat\n '4': 'High', // stor\n '5': 'Very high', // svært stor\n },\n cells: {\n '1': 'The scenario is unlikely to occur.\\n\\nIt occurs less often than every 400 years',\n '2': 'The scenario is unlikely to occur.\\n\\nIt can occur every 20 years',\n '3': 'The scenario can occur.\\n\\nIt can occur yearly',\n '4': 'The scenario will very likely occur.\\n\\nIt can occur monthly',\n '5': 'The scenario is almost guaranteed to occur.\\n\\nIt can occur daily',\n },\n },\n threatActors: {\n 'Script kiddie': 'Script kiddie',\n Hacktivist: 'Hacktivist',\n 'Reckless employee': 'Reckless employee',\n Insider: 'Insider',\n 'Organised crime': 'Organised crime',\n 'Terrorist organisation': 'Terrorist organisation',\n 'Nation/government': 'Nation/government',\n },\n vulnerabilities: {\n 'Flawed design': 'Flawed design',\n Misconfiguration: 'Misconfiguration',\n 'Dependency vulnerability': 'Dependency vulnerability',\n 'Unauthorized access': 'Unauthorized use',\n 'Unmonitored use': 'Unmonitored use',\n 'Input tampering': 'Input tampering',\n 'Information leak': 'Information leak',\n 'Excessive use': 'Excessive use',\n },\n threatActorsAndVulnerabilities: {\n title: 'Threat Actors and Vulnerabilities',\n allCovered: 'All {{kind}} are covered in at least one scenario.',\n oneNotCovered:\n '{{kind}} <b>{{notCovered}}</b> is not covered in any scenario.',\n twoNotCovered:\n '{{kind}} <b>{{notCovered1}}</b> and <b>{{notCovered2}}</b> is not covered in any scenario.',\n multipleNotCovered:\n 'Multiple {{kind}} are not covered. This includes <b>{{notCovered1}}</b>, <b>{{notCovered2}}</b> and <b>{{notCovered3}}</b>.',\n showMoreInfo: 'Show more information',\n dialogHeader: 'Scenarios covering vulnerabilities and threat actors',\n vulnerabilityCoverage: 'Vulnerabilities covered',\n threatActorCoverage: 'Threat actors covered',\n coverageRatio: '{{covered}} of {{total}}',\n tableColumnThreatActor: 'Threat actor',\n tableColumnVulnerability: 'Vulnerability',\n tableColumnScenarios: 'Number of scenarios',\n },\n actionStatus: {\n OK: 'OK',\n 'Not OK': 'Not OK',\n 'Not relevant': 'Not relevant',\n },\n errorMessages: {\n DefaultErrorMessage: 'An error occurred',\n ErrorWhenNoWriteAccessToRepository:\n 'Unable to update RiSc. You do not have write access to {{owner}}/{{name}}.',\n ErrorWhenUpdatingRiSc: 'Failed to update risk scorecard',\n ErrorWhenUpdatingDeletedRiSc:\n 'Failed to update risk scorecard. RiSc is marked for deletion.',\n ErrorWhenDeletingRiSc: 'Failed to delete risk scorecard',\n ErrorWhenCreatingPullRequest: 'Failed to save approval of risk scorecard',\n ErrorWhenCreatingRiSc: 'Failed to create risk scorecard',\n ErrorWhenFetchingRiScs: 'Failed to fetch risk scorecards with ids: ',\n FailedToFetchRiScs: 'Failed to fetch risk scorecards',\n RiScDoesNotExist:\n 'The risk scorecard you are trying to open does not exist',\n ScenarioDoesNotExist: 'The scenario you are trying to open does not exist',\n ErrorWhenFetchingSopsConfig: 'Could not fetch SOPS configuration',\n FailedToCreateSops: 'Failed to create SOPS configuration',\n FailedToUpdateSops: 'SOPS configuration could not be updated',\n ErrorWhenFetchingGcpCryptoKeys:\n 'Could not load risk scorecards — the encryption service is unavailable. Try refreshing the page.',\n ContentStatusDeleted: 'Risk scorecard \"{{riScId}}\" has been deleted',\n ContentStatusFailure: 'Failed to load risk scorecard \"{{riScId}}\"',\n ContentStatusFileNotFound:\n 'Risk scorecard \"{{riScId}}\" was not found in the repository',\n ContentStatusDecryptionFailed:\n 'Failed to decrypt risk scorecard \"{{riScId}}\".',\n ContentStatusNoReadAccess:\n 'You do not have read access to risk scorecard \"{{riScId}}\"',\n ContentStatusUnsupportedMigration:\n 'Risk scorecard \"{{riScId}}\" cannot be automatically migrated to the latest version.',\n ContentStatusUnknown:\n 'Failed to fetch risk scorecard \"{{riScId}}\" with unknown status: {{status}}',\n ContentStatusSchemaValidationFailed:\n 'Failed to fetch risk scorecard \"{{riScId}}\". Its content does not match the expected format. It may have been manually edited or corrupted.',\n ContentStatusDecryptionFailedMessage: {\n INTERNAL_SERVER_ERROR:\n 'Failed to decrypt risk scorecard \"{{riScId}}\", 500 - Internal server error from the crypto service.',\n MISSING_DATA_KEY:\n 'Failed to decrypt risk scorecard \"{{riScId}}\", unable to access encryption key required for decryption.',\n NO_MATCHING_KEY:\n 'Failed to decrypt risk scorecard \"{{riScId}}\", no available key could decrypt the file.',\n AUTHENTICATION_FAILED:\n 'Failed to decrypt risk scorecard \"{{riScId}}\", Authentication failed, please check your credentials and permissions.',\n INVALID_GCP_TOKEN:\n 'Failed to decrypt risk scorecard \"{{riScId}}\", your Google Cloud token is invalid or expired.',\n INVALID_AGE_KEY:\n 'Failed to decrypt risk scorecard \"{{riScId}}\", the provided Age key is invalid.',\n CONNECTION_REFUSED:\n 'Failed to decrypt risk scorecard \"{{riScId}}\", unable to connect to the encryption service.',\n },\n },\n infoMessages: {\n OpenedPullRequest: 'Successfully opened pull request',\n CreatedPullRequest: 'Successfully saved approval of risk scorecard ',\n DeletedRiSc: 'Risk scorecard deleted',\n DeletedRiScRequiresApproval:\n 'Risk scorecard staged for deletion, requires approval',\n UpdatedRiSc: 'Risk scorecard updated',\n UpdatedSops: 'SOPS configuration updated',\n UpdatedRiScRequiresNewApproval:\n 'Risk scorecard update and requires new approval',\n CreatedRiSc: 'Created new risk scorecard successfully',\n UpdatedRiScAndCreatedPullRequest:\n 'Risk scorecard updated and ready for approval in Github',\n NoSopsConfigFound:\n 'No SOPS configuration present on default branch of the GitHub repository',\n CreatedSops: 'SOPS configuration created successfully',\n UpdateAction: 'Updating action ...',\n UpdateInfoMessage:\n 'Please wait a few seconds while the changes are being saved.',\n },\n deleteDialog: {\n title: 'Delete Risk Scorecard',\n confirmationMessage: 'Are you sure you want to delete this risk scorecard?',\n },\n feedbackDialog: {\n title: 'Give us your feedback!',\n description: 'Your feedback',\n confirmationMessage: 'Thank you for your feedback.',\n feedbackButton: 'Give feedback',\n errorMessage: 'An error occurred while sending your feedback.',\n sendButton: 'Send',\n },\n filterButton: {\n veryOutdated: 'Very outdated actions',\n outdated: 'Outdated actions',\n listUpdatedActions: 'Recently updated actions',\n },\n firstRiScCard: {\n noRiScYet: 'Could not load any RoS-analyses',\n getStarted:\n 'Get started with risk and vulnerability analysis for your team, or try reload the page if you have already created one.',\n },\n filter: {\n title: 'Title (a-z)',\n initialRisk: 'Initial risk (high-low)',\n completedActions: 'Most completed actions',\n remainingActions: 'Most remaining actions',\n },\n} as const;\n\nexport const pluginRiScTranslationRef = createTranslationRef({\n id: 'plugin.riSc',\n messages: pluginRiScMessages,\n});\n\nexport const pluginRiScNorwegianTranslation = createTranslationResource({\n ref: pluginRiScTranslationRef,\n translations: {\n no: () =>\n Promise.resolve({\n default: {\n currentLanguage: 'no',\n 'contentHeader.title': 'Risiko- og sårbarhetsanalyse',\n 'contentHeader.createNewButton': 'Opprett ny analyse',\n 'contentHeader.editEncryption': 'Rediger kryptering',\n 'contentHeader.deleteButton': 'Slett analyse',\n 'contentHeader.multipleRiScs': 'RoS-analyser',\n 'dictionary.rejectedLogin': 'Innlogging avbrutt av bruker.',\n 'dictionary.by': 'Av',\n 'dictionary.click': 'Klikk',\n 'dictionary.here': 'her',\n 'dictionary.yes': 'Ja',\n 'dictionary.no': 'Nei',\n 'dictionary.noAccess': 'Ingen tilgang',\n 'dictionary.summary': 'Oppsummering',\n 'dictionary.optional': 'valgfritt',\n 'dictionary.month': 'måned',\n 'dictionary.week': 'uke',\n 'dictionary.day': 'dag',\n 'dictionary.hour': 'time',\n 'dictionary.minute': 'minutt',\n 'dictionary.second': 'sekund',\n 'dictionary.months': 'måneder',\n 'dictionary.weeks': 'uker',\n 'dictionary.days': 'dager',\n 'dictionary.hours': 'timer',\n 'dictionary.minutes': 'minutter',\n 'dictionary.seconds': 'sekunder',\n 'dictionary.action': 'Tiltak',\n 'dictionary.add': 'Legg til',\n 'dictionary.added': 'Lagt til',\n 'dictionary.availability': 'Tilgjengelighet',\n 'dictionary.copy': 'Kopier',\n 'dictionary.copied': 'Kopiert',\n 'dictionary.cancel': 'Avbryt',\n 'dictionary.close': 'Lukk',\n 'dictionary.completed': 'Fullført',\n 'dictionary.confidentiality': 'Konfidensialitet',\n 'dictionary.confirm': 'Bekreft',\n 'dictionary.consequence': 'Konsekvens',\n 'dictionary.deadline': 'Frist',\n 'dictionary.delete': 'Slett',\n 'dictionary.description': 'Beskrivelse',\n 'dictionary.discardChanges': 'Forkast endringer',\n 'dictionary.edit': 'Rediger',\n 'dictionary.estimatedRisk': 'Estimert risiko',\n 'dictionary.estimatedInitialRisk': 'Estimert startrisiko',\n 'dictionary.estimatedRemainingRisk': 'Estimert restrisiko',\n 'dictionary.estimatedCurrentRisk': 'Estimert nårisiko',\n 'dictionary.example': 'Eksempel',\n 'dictionary.initialRisk': 'Startrisiko',\n 'dictionary.integrity': 'Integritet',\n 'dictionary.measure': 'Tiltak',\n 'dictionary.measures': 'Tiltak',\n 'dictionary.measureOwner': 'Tiltakseier',\n 'dictionary.next': 'Neste',\n 'dictionary.planned': 'Planlagt',\n 'dictionary.previous': 'Forrige',\n 'dictionary.probability': 'Sannsynlighet',\n 'dictionary.restRisk': 'Restrisiko',\n 'dictionary.currentRisk': 'Nårisiko',\n 'dictionary.removed': 'Fjernet',\n 'dictionary.risk': 'Risiko',\n 'dictionary.riskExplanation.initial': 'Risiko før tiltak er fullført',\n 'dictionary.riskExplanation.current':\n 'Nåværende risiko basert på faktisk tiltaksstatus',\n 'dictionary.riskExplanation.remaining':\n 'Risiko etter at alle tiltak er fullført',\n 'dictionary.save': 'Lagre',\n 'dictionary.saveAndClose': 'Lagre og lukk',\n 'dictionary.scenario': 'Scenario',\n 'dictionary.scope': 'Omfang',\n 'dictionary.status': 'Status',\n 'dictionary.threatActors': 'Trusselaktører',\n 'dictionary.theThreatActor': 'Trusselaktøren',\n 'dictionary.theThreatActors': 'Trusselaktørene',\n 'dictionary.title': 'Tittel',\n 'dictionary.unknown': 'Ukjent',\n 'dictionary.url': 'URL',\n 'dictionary.emptyField': 'Ingen {{field}} spesifisert',\n 'dictionary.valuation': 'Verdi',\n 'dictionary.version': 'Versjon',\n 'dictionary.vulnerabilities': 'Sårbarheter',\n 'dictionary.theVulnerability': 'Sårbarheten',\n 'dictionary.theVulnerabilities': 'Sårbarhetene',\n 'dictionary.showOnlyRelevant': 'Vis kun relevante',\n 'dictionary.noRelevantMeasures': 'Ingen relevante tiltak',\n 'dictionary.scenarios': 'scenarioer',\n 'dictionary.measuresInitialRiSc': 'tiltak',\n 'dictionary.customOrder': 'Egendefinert rekkefølge',\n 'dictionary.searchQuery': 'Ingen resultater for ',\n 'dictionary.actionsWithStatus': 'Tiltak som er OK',\n 'dictionary.refresh': 'Prøv igjen',\n\n 'scenarioDrawer.action.descriptionError':\n 'Beskrivelse kan ikke være tom',\n 'scenarioDrawer.action.urlError': 'Ugyldig URL',\n 'scenarioDrawer.action.requiredError': 'Feltet er påkrevd',\n 'scenarioDrawer.action.emptyState':\n 'Scenariet har ingen definerte tiltak',\n 'scenarioDrawer.errors.remainingConsequenceTooHigh':\n 'Restkonsekvens kan ikke være høyere enn startkonsekvens',\n 'scenarioDrawer.errors.remainingProbabilityTooHigh':\n 'Restsannsynlighet kan ikke være høyere enn startsannsynlighet',\n 'scenarioDrawer.action.lastUpdated': 'Sist oppdatert:',\n 'scenarioDrawer.action.notUpdated': 'Ingen dato',\n\n 'encryption.title': 'Kryptering',\n\n 'rosStatus.statusBadge.missing':\n 'Når utkastet er ferdig, kan risikoeier gå gjennom og godkjenne endringene.',\n 'rosStatus.outdated': 'Utdatert',\n 'rosStatus.updated': 'Oppdatert',\n 'rosStatus.veryOutdated': 'Veldig utdatert',\n 'rosStatus.updating': 'Lagrer...',\n 'rosStatus.statusBadge.approved': 'Godkjent av risikoeier',\n 'rosStatus.statusBadge.error': 'Kunne ikke hente status',\n 'rosStatus.statusBadge.migration.title':\n 'Gjennomgang og lagring av endringer kreves',\n 'rosStatus.statusBadge.migration.description':\n 'Det har blitt gjort endringer i risiko- og sårbarhetsanalysen, som følge av en migrering til nyeste versjon. Endringene kan være både sletting og endring av informsasjon. Det vil ikke være mulig å lagre endringer av analysen uten å inkludere og godta endringene.',\n 'rosStatus.statusBadge.created': 'Opprettet tom ROS',\n 'rosStatus.statusBadge.draft': 'Utkast',\n 'rosStatus.statusBadge.waiting': 'Avventer godkjenning',\n 'rosStatus.statusBadge.published': 'Publisert',\n 'rosStatus.statusBadge.draftDeletion': 'Markert for sletting',\n 'rosStatus.statusBadge.waitingDeletion': 'Venter på sletting',\n 'rosStatus.statusBadge.deletionApproval':\n 'Risikoeier kan gå igjennom og godkjenne slettingen.',\n 'rosStatus.lastModified': 'Sist publisert: ',\n 'rosStatus.daysSinceLastModified':\n '{{days}} dager og {{numCommits}} commits siden',\n 'rosStatus.notPublishedYet': 'RoS er ikke publisert enda',\n 'rosStatus.errorMessage': 'Kunne ikke hente status',\n 'rosStatus.editing': 'Du kan nå gjøre endringer',\n 'rosStatus.approveButtonUpdate': 'Godkjenn ROS',\n 'rosStatus.approveButtonDelete': 'Godkjenn sletting',\n 'rosStatus.prStatus': ' Merge pull requesten i ',\n 'rosStatus.prStatus2Update': \" for å publisere ROS'en.\",\n 'rosStatus.prStatus2Delete': \" for å slette ROS'en.\",\n 'rosStatus.moreInformationButton': 'Mer informasjon',\n 'rosStatus.difference.description':\n 'Oppsummering av endringer som må godkjennes av risikoeier.',\n 'rosStatus.difference.publishDate':\n 'Siste publiserte endringer {{date}}',\n 'rosStatus.difference.fetching': 'Henter endringer',\n 'rosStatus.difference.error': 'Feil med uthenting av endringer',\n 'rosStatus.difference.newROS':\n 'Ingen publiserte ROS-analyser å sammenligne med',\n 'rosStatus.difference.differences.title': 'ENDRINGER',\n 'rosStatus.difference.differences.titleRemoved':\n 'Fjernet fra ROS-analyse',\n 'rosStatus.difference.differences.noneRemoved':\n 'Ingenting er fjernet',\n 'rosStatus.difference.differences.titleExisting':\n 'Endret i eksisterende ROS-analyse',\n 'rosStatus.difference.differences.noneExisting':\n 'Ingenting er endret',\n 'rosStatus.difference.differences.titleAdded':\n 'Lagt til i ROS-analyse',\n 'rosStatus.difference.differences.noneAdded': 'Ingenting er lagt til',\n 'rosStatus.updatedStatus.UPDATED': 'Oppdatert statusikon',\n 'rosStatus.updatedStatus.LITTLE_OUTDATED': 'Litt utdatert statusikon',\n 'rosStatus.updatedStatus.OUTDATED': 'Utdatert statusikon',\n 'rosStatus.updatedStatus.VERY_OUTDATED': 'Veldig utdatert statusikon',\n 'rosStatus.updatedStatus.error': 'Feil statusikon',\n 'rosStatus.updatedStatus.disabled': 'Deaktivert statusikon',\n 'rosStatus.updatedStatus.tooltip.OUTDATED':\n 'Dette tiltaket er utdatert',\n 'rosStatus.updatedStatus.tooltip.VERY_OUTDATED':\n 'Dette tiltaket er veldig utdatert',\n 'rosStatus.githubLink': 'Gå til GitHub',\n 'publishDialog.titleUpdate': 'Godkjenn ROS-analyse',\n 'publishDialog.titleDelete': 'Godkjenn sletting',\n 'publishDialog.checkboxLabelUpdate':\n 'Jeg bekrefter at risikoeier godtar risikoen beskrevet i denne risiko- og sårbarhetsanalysen.',\n 'publishDialog.checkboxLabelDelete':\n 'Jeg bekrefter at risikoeier godtar slettingen av denne risiko- og sårbarhetsanalysen.',\n\n 'migrationDialog.title': 'Lagre endringer',\n 'migrationDialog.description':\n 'Endringene er gjort for å følge den nyeste skjemaversjonen.',\n 'migrationDialog.migrationTitle': 'Migrering fra {{from}} til {{to}}',\n 'migrationDialog.schemaVersion': 'Skjemaversjon',\n 'migrationDialog.schemaChangelog': 'Åpne skjemaendringslogg',\n 'migrationDialog.checkboxLabel':\n 'Jeg bekrefter at jeg har gjennomgått og ønsker å lagre endringene som er gjort under migreringen.',\n 'migrationDialog.migration40.changeExplanation':\n 'Denne migreringen endrer standard verdiene for konsekvens og sannsynlighet.',\n 'migrationDialog.migration40.owner': 'Ansvarlig',\n 'migrationDialog.migration40.deadline': 'Frist',\n 'migrationDialog.migration40.existingActions': 'Eksisterende tiltak',\n 'migrationDialog.migration40.vulnerabilitiesTitle': 'Sårbarheter',\n 'migrationDialog.migration40.vulnerabilities.Compromised admin user':\n 'Kompromittert adminbruker',\n 'migrationDialog.migration40.vulnerabilities.Denial of service':\n 'Tjenestenekt',\n 'migrationDialog.migration40.vulnerabilities.Disclosed secret':\n 'Lekket hemmelighet',\n 'migrationDialog.migration40.vulnerabilities.Escalation of rights':\n 'Rettighetseskalering',\n 'migrationDialog.migration40.vulnerabilities.Excessive use':\n 'Overdreven bruk',\n 'migrationDialog.migration40.vulnerabilities.Information leak':\n 'Informasjonslekkasje',\n 'migrationDialog.migration40.vulnerabilities.Unauthorized access':\n 'Uautorisert tilgang',\n 'migrationDialog.migration40.vulnerabilities.Unmonitored use':\n 'Uovervåket bruk',\n 'migrationDialog.migration40.vulnerabilities.User repudiation':\n 'Benekte brukerhandling',\n 'migrationDialog.migration41.changeExplanation':\n 'Denne migreringen fjerner ansvarlig («owner») og frist («deadline») feltene fra tiltak, fjerner eksisterende tiltak feltet og oppdaterer verdier for sårbarheter.',\n 'migrationDialog.migration41.nokPerIncident': 'NOK/hendelse',\n 'migrationDialog.migration41.occurrencesPerYear': 'hendelser/år',\n 'migrationDialog.migration42.changeExplanation':\n 'Denne migreringen legger til et sist oppdatert felt (\"lastUpdated\") på tiltak.',\n 'migrationDialog.migration50.changeExplanation':\n 'Denne migreringen oppdaterer tiltakets status til en ny navnekonvensjon.',\n 'migrationDialog.migration51.changeExplanation':\n 'Denne migreringen legger til et sist oppdater av felt (\"lastUpdatedBy\") på tiltak.',\n 'migrationDialog.migration51.lastUpdatedBy': 'Sist oppdatert av:',\n 'migrationDialog.migration51.addedLastUpdatedBy':\n 'La til felt for å spore hvem som oppdaterte et tiltak for {{numberOfChangedActions}} eksisterende tiltak',\n 'migrationDialog.migration52.changeExplanation':\n 'Denne migreringen fjerner det ubrukte konseptet verdivurderinger (\"valuations\") fra RiSc-dokumentet.',\n 'migrationDialog.migration52.title': 'Verdivurderinger fjernet',\n 'migrationDialog.migration52.oldValue':\n 'Fjernet eksisterende verdivurderinger',\n 'migrationDialog.removed': 'Fjernet',\n 'comparisonDialog.noChanges': 'Ingen endringer',\n 'comparisonDialog.changes': 'Endringer av RoSen',\n 'comparisonDialog.noDescription': 'Ingen beskrivelse spesifisert',\n 'comparisonDialog.noURL': 'Ingen URL spesifisert',\n 'comparisonDialog.risk.consequenceUnit': 'NOK/hendelse',\n 'comparisonDialog.risk.probabilityUnit': 'hendelser/år',\n 'comparisonDialog.valuation.integrity.Insignificant': 'Insignifikant',\n 'comparisonDialog.valuation.integrity.Expected': 'Forventet',\n 'comparisonDialog.valuation.integrity.Dependent': 'Avhengig',\n 'comparisonDialog.valuation.integrity.Critical': 'Kritisk',\n 'comparisonDialog.valuation.availability.Insignificant':\n 'Insignifikant',\n 'comparisonDialog.valuation.availability.2 days': '2 dager',\n 'comparisonDialog.valuation.availability.4 hours': '4 timer',\n 'comparisonDialog.valuation.availability.Immediate': 'Umiddelbart',\n 'comparisonDialog.valuation.confidentiality.Public': 'Offentlig',\n 'comparisonDialog.valuation.confidentiality.Internal': 'Intern',\n 'comparisonDialog.valuation.confidentiality.Confidential':\n 'Konfidensielt',\n 'comparisonDialog.valuation.confidentiality.Strictly confidential':\n 'Strengt konfidensielt',\n 'supportDialog.title': 'Support',\n 'supportDialog.openEntry': 'Åpne',\n 'supportDialog.entries.riscFeedbackChannel.title':\n 'RoS tilbakemeldingskanal',\n 'supportDialog.entries.riscFeedbackChannel.description':\n '#kodenær-ros-tilbakemelding',\n 'supportDialog.entries.riscDocumentation.title': 'RoS dokumentasjon',\n 'supportDialog.entries.riscDocumentation.description':\n 'Confluence - RISC',\n 'scenarioTable.title': 'Risikoscenarioer',\n 'scenarioTable.addScenarioButton': 'Legg til scenario',\n 'scenarioTable.noActions': 'Ingen tiltak',\n 'scenarioTable.columns.consequenceChar': 'K',\n 'scenarioTable.columns.probabilityChar': 'S',\n 'scenarioTable.columns.completed': 'fullført',\n 'scenarioTable.editButton': 'Rediger liste',\n 'scenarioTable.doneEditing': 'Avslutt redigering',\n 'scenarioTable.noActionsLong': 'Scenarioet har ingen tiltak',\n\n 'riskMatrix.title': 'Risikomatrise',\n 'riskMatrix.estimatedRisk.title': 'Estimert risiko',\n 'riskMatrix.estimatedRisk.suffix.thousand': '{{count}} tusen',\n 'riskMatrix.estimatedRisk.suffix.million_one': '{{count}} million',\n 'riskMatrix.estimatedRisk.suffix.million_other':\n '{{count}} millioner',\n 'riskMatrix.estimatedRisk.suffix.billion_one': '{{count}} milliard',\n 'riskMatrix.estimatedRisk.suffix.billion_other':\n '{{count}} milliarder',\n 'riskMatrix.estimatedRisk.suffix.trillion_one': '{{count}} billion',\n 'riskMatrix.estimatedRisk.suffix.trillion_other':\n '{{count}} billioner',\n 'riskMatrix.estimatedRisk.unit.nokPerYear': 'kr/år',\n 'riskMatrix.tooltip.title': 'Risikoscenarioer',\n 'riskMatrix.currentRisk.title': 'Reduksjon i risiko',\n 'riskMatrix.currentRisk.description':\n 'Diagrammet illustrerer utviklingen fra dagens startrisiko mot beregnet sluttrisiko. <strong>{{actionsOk}}</strong> fullførte tiltak utgjør en reduksjon på <strong>{{reduction}} kr/år.</strong>',\n 'riskMatrix.currentRisk.showMoreInfo':\n 'Risikostatistikk per scenario',\n 'riskMatrix.currentRisk.dialogHeader':\n 'Risikostatistikk per scenario',\n 'riskMatrix.currentRisk.dialogDescription':\n 'Denne tabellen viser risikostatistikk per scenario. Alle tiltak innenfor et scenario er vektet likt, slik at hvert fullført tiltak bidrar med like mye risikoreduksjon. Bruk nedtrekksmenyen for å velge hvilken metrikk som vises:',\n 'riskMatrix.currentRisk.metricCurrentRiskDescription':\n 'estimert risiko basert på andelen fullførte tiltak.',\n 'riskMatrix.currentRisk.metricPotentialReductionDescription':\n 'hvor mye risikoen fortsatt kan reduseres ved å fullføre gjenstående relevante tiltak.',\n 'riskMatrix.currentRisk.metricReductionPerActionDescription':\n 'potensiell reduksjon fordelt likt på gjenstående relevante tiltak.',\n 'riskMatrix.currentRisk.scenarioColumn': 'Scenario',\n 'riskMatrix.currentRisk.metricLabel': 'Metrikk',\n 'riskMatrix.currentRisk.metricCurrentRisk': 'Nåværende risiko',\n 'riskMatrix.currentRisk.metricReductionPerAction':\n 'Risikoreduksjon per tiltak',\n 'riskMatrix.currentRisk.metricPotentialReduction':\n 'Potensiell reduksjon',\n\n 'infoDialog.title': 'Estimert risiko',\n 'infoDialog.description':\n 'Den estimerte risikoen er basert på hvor stor risiko de forskjellige scenariene utgjør. Hvis det er stor sannsynlighet for at en alvorlig konsekvens skjer er det høy risiko for at det kan bli en stor kostnad for organisasjonen. Kostnaden er med andre ord et forsøk på å konkretisere verdien av risiko og er summen av den estimerte risikoen for alle risikoscenariene i denne ROS-analysen.',\n 'infoDialog.calculatedHowTitle':\n 'Hvordan regner vi ut estimert risiko?',\n 'infoDialog.calculatedHow':\n 'Sannsynlighet (S) måles i hendelser per år og konsekvens (K) måles i kroner per hendelse. Den estimerte risikoen blir da: 20',\n 'infoDialog.calculatedHowExponent': 'S+K-1',\n 'infoDialog.consequenceTitle': 'Konsekvens (kr/hendelse)',\n 'infoDialog.consequenceUnit': 'kr/hendelse',\n 'infoDialog.consequenceDescription.oneworkday': '1 dagsverk',\n 'infoDialog.consequenceDescription.oneworkmonth': '1 månedsverk',\n 'infoDialog.consequenceDescription.oneworkyear': '1 årsverk',\n 'infoDialog.consequenceDescription.20workyears': '20 årsverk',\n 'infoDialog.consequenceDescription.400workyears': '400 årsverk',\n 'infoDialog.probabilityTitle': 'Sannsynlighet (hendelser/år)',\n 'infoDialog.probabilityUnit': 'hendelse/år',\n 'infoDialog.probabilityDescription.every400years':\n '1 gang hvert 400. år',\n 'infoDialog.probabilityDescription.every20years':\n '1 gang hvert 20. år',\n 'infoDialog.probabilityDescription.annualy': 'Årlig',\n 'infoDialog.probabilityDescription.monthly': 'Månedlig',\n 'infoDialog.probabilityDescription.daily': 'Daglig',\n 'infoDialog.example.part1': 'Et risikoscenario med sannsynlighet ',\n 'infoDialog.example.part2': ' og konsekvens ',\n 'infoDialog.example.part3': ' har en estimert risiko på ',\n 'infoDialog.units.nokPerIncident': 'kr/hendelse',\n 'infoDialog.units.incidentsPerYear': 'hendelser/år',\n 'infoDialog.units.nokPerYear': 'kr/år',\n 'infoDialog.currentRisk.title': 'Nårisiko utregning',\n 'infoDialog.currentRisk.description':\n 'Nåværende risiko kombinerer startrisikoen, den planlagte sluttrisikoen og hvor langt risikoreduserende tiltak har kommet. For hvert scenario beregnes startrisiko: ',\n 'infoDialog.currentRisk.actionRatio':\n 'Så måler vi hvor mange relevante tiltak som er fullført (ratio) = (antall fullførte tiltak) / (antall tiltak som ikke er merket «Ikke relevant»). Hvis det ikke finnes relevante tiltak, settes forholdet til 0.',\n 'infoDialog.currentRisk.aggregated':\n 'Den aggregerte nåværende risikoen er summen ',\n 'infoDialog.currentRisk.currentRiskCost':\n 'Den aggregerte nårisikoen interpolerer mellom start- og restrisiko basert på forholdet',\n 'infoDialog.currentRisk.aggregatedSums':\n 'på tvers av alle scenarier, rapportert i NOK per år.',\n 'infoDialog.currentRisk.remainingRiskCost': 'og sluttrisiko',\n 'rosDialog.titleNew': 'Ny risiko- og sårbarhetsanalyse',\n 'rosDialog.titleEdit': 'Rediger tittel og omfang',\n 'rosDialog.initialRiscScopeDescription':\n 'Vil du generere en RoS med forhåndsdefinerte scenarioer og tiltak?',\n 'rosDialog.initialRiscApplicationType':\n 'Hva slags applikasjon har du?',\n 'rosDialog.noInitialRiScFound':\n 'Ingen forhåndsdefinert RoS er tilgjengelig for øyeblikket.',\n 'rosDialog.editEncryption': 'Rediger kryptering',\n 'rosDialog.titleError': 'ROS-analysen må ha en tittel',\n 'rosDialog.scopeDescription':\n 'Beskriv hva analysen skal vurdere. Hva som ikke inngår som en del av omfanget må også defineres.', // TODO\n 'rosDialog.scopeError': 'ROS-analysen må ha et omfang',\n 'rosDialog.generateInitialDescription':\n 'Kodenær RoS lar deg opprette en initiell RoS basert på opplysninger om kodebasen i kartverket.dev, sikkerhetsmetrikker og sikkerhetskontrollere.',\n 'rosDialog.generateInitialToggleDescription':\n 'Vil du generere initiell RoS?',\n 'rosDialog.generateObsRiScDescription':\n \"Denne RoS'en inneholder scenarier som bør vurderes for bygg og deploy.\",\n 'rosDialog.generateInternalJobRiScDescription':\n \"Denne RoS'en inneholder scenarier som bør vurderes for interne verktøy og jobber.\",\n 'rosDialog.generateStandardRiScDescription':\n \"Denne RoS'en er generert fra opplysninger om kodebasen i kartverket.dev, sikkerhetsmetrikker og sikkerhetskontrollere.\",\n 'rosDialog.fromScratch': 'Tom',\n 'rosDialog.generateDefault': 'Initiell',\n 'rosDialog.stepRiscDetails': 'RoS-detaljer',\n 'rosDialog.initialRiscTitle': 'Forhåndsdefinert RoS',\n 'rosDialog.stepEncryption': 'Konfigurer kryptering',\n 'rosDialog.applicationType': 'Velg type applikasjon',\n 'rosDialog.titleAndScope': 'Tittel og omfang',\n 'rosDialog.recommendedForComponentOfType':\n 'Anbefalt for komponenter av typen',\n 'sopsConfigDialog.title': 'Kryptering',\n 'sopsConfigDialog.writeLocalRiscSuffix':\n 'for å lære mer om å skrive kodenær RoS lokalt.',\n 'sopsConfigDialog.description.new':\n 'For å bruke kodenær RoS må du først aktivere en krypteringsløsning ved å velge en nøkkel fra Google Cloud Platform (GCP) for kryptering og dekryptering. Følg trinnene under for å fullføre oppsettet:',\n 'sopsConfigDialog.description.edit':\n 'Risiko og sårbarhetsanalysen vil bli kryptert for å sørge for konfidiensialitet. Du kan endre hvilken krypteringsnøkkel fra Google Cloud Platform (GCP) som skal bli brukt her:',\n 'sopsConfigDialog.selectKeysTitle': 'Velg krypteringsnøkkel',\n 'sopsConfigDialog.chooseGcpCryptoKey': 'Velg GCP-nøkkel',\n 'sopsConfigDialog.gcpCryptoKeyDescription':\n \"Fra listen under kan du velge hvilken GCP-nøkkel du vil bruke for å kryptere og dekryptere RoS'en.\",\n 'sopsConfigDialog.cryptoKeyOptionInfo':\n '(Prosjekt: {{projectId}}, Tilganger: {{permissions}})',\n 'sopsConfigDialog.cryptoKeyPermissionENCRYPT': 'Kryptere',\n 'sopsConfigDialog.cryptoKeyPermissionDECRYPT': 'Dekryptere',\n 'sopsConfigDialog.cryptoKeyPermissionUNKNOWN':\n '⚠️ Ukjent - du bør bytte til en annen nøkkel',\n 'sopsConfigDialog.gcpCryptoKeyNoSelectableKey':\n 'Du har ikke tilgang til noe egnede GCP-nøkler.',\n 'sopsConfigDialog.gcpCryptoKeyNonSelectedErrorMessage':\n 'En GCP-nøkkel må være valgt.',\n 'sopsConfigDialog.publicAgeKeysAlreadyPresent':\n 'Følgende age-nøkler er allerede til stede:',\n 'sopsConfigDialog.publicAgeKeyQuestion':\n 'Trenger noen å skrive RoS lokalt i sin editor?',\n 'sopsConfigDialog.publicAgeKeyDescription':\n 'Legg ved offentlige age-nøkkel til personer som ønsker å skrive kodenær RoS lokalt',\n 'sopsConfigDialog.addPublicAgeKey': 'Legg til nøkkel',\n 'sopsConfigDialog.publicAgeKey': 'Offentlig age-nøkkel',\n 'sopsConfigDialog.update': 'Oppdater',\n 'sopsConfigDialog.createPRTitle':\n 'Lag en Pull Request med det nye krypteringsskjemaet',\n 'sopsConfigDialog.createPRContent':\n 'Krypteringskonfigurasjonen er nå klar og har blitt lagt til i en ny branch. Nedenfor kan du opprette en PR med disse endringene. Alternativt kan du flytte endringene til en annen branch ved å klikke på \"Branch\"-knappen og velge en annen aktiv branch.',\n 'sopsConfigDialog.PRTitle': \"Se gjennom og merge Pull Request'en\",\n 'sopsConfigDialog.SummaryDescription':\n 'En PR med det nye krypteringsskjemaet har nå blitt opprettet.',\n 'sopsConfigDialog.SummaryGCP': 'Den valgte GCP-nøkkelen er ',\n 'sopsConfigDialog.SummaryAgeKeys':\n ' Følgende offentlige age nøkler har også blitt lagt ved: ',\n 'sopsConfigDialog.PRContent':\n \"Klikk på knappen nedenfor for å se gjennom endringene og merge PR-en. Etter at du har merget PR-en, kan du begynne å opprette og administrere RoS'er.\",\n 'sopsConfigDialog.required': 'Dette feltet er påkrevd',\n 'sopsConfigDialog.publicKeyHelperTextKeyAlreadyExists':\n 'Offentlig møkkel allerede lagt til',\n 'sopsConfigDialog.publicKeyHelperTextKeyAlreadyExistInSopsConfig':\n 'Offentlig nøkkel er allerede i eksisterende SOPS-konfigurasjon',\n 'sopsConfigDialog.publicKeyHelperTextKeyNotValid':\n 'Offentlig nøkkel er ikke en gyldig age offentlig nøkkel',\n 'sopsConfigDialog.pendingTitle': 'Avventende SOPS-konfigurasjon',\n 'sopsConfigDialog.pendingDescription':\n 'Følgende pull requests er åpnet for å inkludere en SOPS-konfigurasjon i GitHub-repoet',\n 'sopsConfigDialog.secondaryPullRequestText': 'Åpnet _n_ siden av',\n 'sopsConfigDialog.reEncryptTitle':\n \"Rekryptering av eksisterende RoS'er\",\n 'sopsConfigDialog.reEncryptDescription':\n \"Ved å oppdatere SOPS-konfigurasjonen, vil du ikke lenger kunne dekryptere gamle RoS'er kryptert med den forrige SOPS-konfigurasjonen. Vi anbefaler derfor på det sterkeste å rekryptere eksisterende RoS'er på hoved-branchen i ditt GitHub-repo for at du skal kunne fortsette å lese dem med din oppdaterte SOPS-konfigurasjon.\",\n 'sopsConfigDialog.reEncryptConsentDescription':\n \"Vil du rekryptere eksisterende RoS'er på hoved-branchen til\",\n 'sopsConfigDialog.openPR': 'Åpne pull request',\n 'sopsConfigDialog.gotoPullRequest': 'Gå til pull request',\n 'scenarioStepper.initialRiskStep.title': 'Startrisiko',\n 'scenarioStepper.initialRiskStep.subtitle':\n 'Risikoen er kombinasjonen av konsekvensen av scenarioet og sannsynligheten for at det inntreffer.',\n 'scenarioStepper.initialRiskStep.consequenceSubtitle':\n 'Hvor alvorlig er den potensielle konsekvensen? Hvis konsekvensen gjelder flere kategorier velg det høyeste konsekvensnivået av disse.',\n 'scenarioStepper.initialRiskStep.probabilitySubtitle':\n 'Hvor stor sannsynlighet er det for at dette scenarioet vil forekomme. Dersom du er mellom to sannsynlighetsverdier velg den høyeste.',\n 'scenarioStepper.restRiskStep.title': 'Restrisiko',\n 'scenarioStepper.restRiskStep.subtitle':\n 'Hvordan endrer risikoen seg fra startrisikoen etter alle tiltakene er fullført?',\n 'scenarioStepper.restRiskStep.consequenceSubtitle':\n 'Hva blir konsekvensen etter alle tiltakene er fullført?',\n 'scenarioStepper.restRiskStep.probabilitySubtitle':\n 'Hva blir sannsynligheten etter alle tiltakene er fullført?',\n\n 'scenarioDrawer.title': 'Risikoscenario',\n 'scenarioDrawer.newTitle': 'Nytt risikoscenario',\n 'scenarioDrawer.titleError': 'Scenarioet må ha en tittel',\n 'scenarioDrawer.createNewScenario': 'Opprett nytt scenario',\n 'scenarioDrawer.saveAsDraft': 'Lagre som utkast',\n 'scenarioDrawer.subtitle':\n 'En uønsket hendelse som potensielt kan ramme komponenten',\n 'scenarioDrawer.riskMatrixModal.title': 'Risikomatriser',\n 'scenarioDrawer.riskMatrixModal.startRisk':\n 'Hvor stor er risikoen før man utfører noen tiltak?',\n 'scenarioDrawer.riskMatrixModal.restRisk':\n 'Hvor stor er risikoen etter at alle tiltakene er fullført?',\n\n 'scenarioDrawer.threatActorSubtitle':\n 'Noen som prøver å få tilgang til eller misbruke systemet',\n 'scenarioDrawer.vulnerabilitySubtitle':\n 'Svakhet i systemet som kan utnyttes av trusselaktøren',\n 'scenarioDrawer.consequenceTab.subtitle':\n 'Hvor alvorlig er den potensielle konsekvensen? Hvis scenarioet kan få konsekvenser i flere kategorier velg det høyeste konsekvensnivået av disse.',\n 'scenarioDrawer.probabilityTab.subtitle':\n 'Hvor stor sannsynlighet er det for at dette scenarioet vil forekomme. Dersom du er mellom to sannsynlighetsverdier velg den høyeste.',\n 'scenarioDrawer.measureTab.subtitle':\n 'Hvilke tiltak bør gjøres for å unngå scenarioet?',\n 'scenarioDrawer.measureTab.measureOwnerDescription':\n 'De eller den som er ansvarlig for at tiltaket blir gjennomført',\n 'scenarioDrawer.measureTab.addMeasureButton': 'Legg til tiltak',\n 'scenarioDrawer.measureTab.plannedMeasures': 'Planlagte tiltak',\n 'scenarioDrawer.restRiskTab.subtitle':\n 'Sett restrisiko for scenarioet. Restrisiko er konsekvens og sannsynlighet for scenarioet etter at alle tiltak i listen er gjennomført.',\n 'scenarioDrawer.deleteScenarioButton': 'Slett scenario',\n 'scenarioDrawer.deleteScenarioConfirmation':\n 'Er du sikker på at du vil slette scenario?',\n 'scenarioDrawer.deleteActionButton': 'Slett tiltak',\n 'scenarioDrawer.deleteActionConfirmation':\n 'Er du sikker på at du vil slette tiltak?',\n 'scenarioDrawer.closeConfirmation': 'Vil du lagre endringene dine?',\n 'scenarioDrawer.measureTab.addMeasureTitleError':\n 'Tiltak må ha en tittel',\n 'scenarioDrawer.measureTab.urlDescription':\n 'For eksempel lenke til Jira-oppgave',\n 'consequenceTable.rows.1': 'Ubetydelig',\n 'consequenceTable.rows.2': 'Liten',\n 'consequenceTable.rows.3': 'Moderat',\n 'consequenceTable.rows.4': 'Alvorlig',\n 'consequenceTable.rows.5': 'Kritisk',\n 'consequenceTable.columns.health': 'Liv og helse',\n 'consequenceTable.columns.economical': 'Økonomi og drift',\n 'consequenceTable.columns.privacy': 'Personvern',\n 'consequenceTable.columns.reputation': 'Omdømme og tillit',\n 'consequenceTable.cells.health.1':\n 'Liv og helse kan ikke være mindre alvorlig enn 3',\n 'consequenceTable.cells.health.2':\n 'Liv og helse kan ikke være mindre alvorlig enn 3',\n 'consequenceTable.cells.health.3':\n 'Lettere skade på personer.\\n\\nNoe skade på lokalt miljø.',\n 'consequenceTable.cells.health.4':\n 'Et fåtall alvorlige personskader.\\n\\nModerat skade på miljø på et begrenset område.',\n 'consequenceTable.cells.health.5':\n 'Dødsfall. Svært alvorlig skade på miljø over store områder.',\n 'consequenceTable.cells.economical.1':\n 'Ubetydelig økonomisk tap.\\n\\nKan fikses med 1 dagsverk.',\n 'consequenceTable.cells.economical.2':\n 'Mindre økonomisk tap.\\n\\nKan fikses med 1 månedsverk.',\n 'consequenceTable.cells.economical.3':\n 'Moderat økonomisk tap.\\n\\nKan fikses med 1 årsverk.',\n 'consequenceTable.cells.economical.4':\n 'Større økonomisk tap.\\n\\nKan fikses med 20 årsverk.',\n 'consequenceTable.cells.economical.5':\n 'Kritisk økonomisk tap.\\n\\nKan fikses med 400 årsverk.',\n 'consequenceTable.cells.privacy.1': 'Ingen brudd.',\n 'consequenceTable.cells.privacy.2': 'Mindre brudd.',\n 'consequenceTable.cells.privacy.3':\n 'Brudd på registrertes rettigheter og friheter.',\n 'consequenceTable.cells.privacy.4':\n 'Meget alvorlige brudd på registrertes rettigheter og friheter, samt lovbrudd.',\n 'consequenceTable.cells.privacy.5':\n 'Personvern kan ikke være mer alvorlig enn 4',\n 'consequenceTable.cells.reputation.1':\n 'Liten fare for omdømmetap og liten innvikrning på tillit',\n 'consequenceTable.cells.reputation.2':\n 'Negativ oppmerksomhet i regionale og nasjonale medier som fører til omdømmetap.\\n\\nKan redusere tillit.',\n 'consequenceTable.cells.reputation.3':\n 'Negativ oppmerksomhet i nasjonale og internasjonale medier som fører til alvorlig omdømmetap.\\n\\nAlvorlig redusert tillit fra myndigheter.\\n\\nBrukere som ikke tør / vil bruke tjenestene.',\n 'consequenceTable.cells.reputation.4':\n 'Omdømme og tillit kan ikke være mer alvorlig enn 3',\n 'consequenceTable.cells.reputation.5':\n 'Omdømme og tillit kan ikke være mer alvorlig enn 3',\n\n 'probabilityTable.rows.1': 'Svært liten',\n 'probabilityTable.rows.2': 'Liten',\n 'probabilityTable.rows.3': 'Moderat',\n 'probabilityTable.rows.4': 'Stor',\n 'probabilityTable.rows.5': 'Svært stor',\n 'probabilityTable.cells.1':\n 'Scenarioet er usannsynlig å inntreffe.\\n\\nDet inntreffer sjeldnere enn hvert 400. år',\n 'probabilityTable.cells.2':\n 'Scenarioet er usannsynlig å inntreffe.\\n\\nDet kan inntreffe hvert 20. år',\n 'probabilityTable.cells.3':\n 'Scenarioet kan inntreffe.\\n\\nDet kan inntreffe nærmest årlig',\n 'probabilityTable.cells.4':\n 'Scenarioet vil med stor sannsynlighet inntreffe.\\n\\nDet kan inntreffe nærmest månedlig',\n 'probabilityTable.cells.5':\n 'Scenarioet er nesten garantert å inntreffe.\\n\\nDet kan inntreffe nærmest daglig',\n 'threatActors.Script kiddie': 'Datasnok',\n 'threatActors.Hacktivist': 'Hacktivist',\n 'threatActors.Reckless employee': 'Uheldig ansatt',\n 'threatActors.Insider': 'Innside-aktør',\n 'threatActors.Organised crime': 'Organiserte kriminelle',\n 'threatActors.Terrorist organisation': 'Terroristorganisasjon',\n 'threatActors.Nation/government': 'Nasjon/stat',\n\n 'vulnerabilities.Flawed design': 'Mangelfullt design',\n 'vulnerabilities.Misconfiguration': 'Feilkonfigurering',\n 'vulnerabilities.Dependency vulnerability': 'Sårbarhet i avhengighet',\n 'vulnerabilities.Unauthorized access': 'Uautorisert tilgang',\n 'vulnerabilities.Unmonitored use': 'Uovervåket bruk',\n 'vulnerabilities.Input tampering': 'Klussing med input',\n 'vulnerabilities.Information leak': 'Informasjonslekkasje',\n 'vulnerabilities.Excessive use': 'Overdreven bruk',\n\n 'threatActorsAndVulnerabilities.title':\n 'Trusselaktører og sårbarheter',\n 'threatActorsAndVulnerabilities.allCovered':\n 'Alle {{kind}} er dekket i minst ett scenario.',\n 'threatActorsAndVulnerabilities.oneNotCovered':\n '{{kind}} <b>{{notCovered}}</b> er ikke dekket i noen scenarioer',\n 'threatActorsAndVulnerabilities.twoNotCovered':\n '{{kind}} <b>{{notCovered1}}</b> og <b>{{notCovered2}}</b> er ikke dekket i noen scenarioer.',\n 'threatActorsAndVulnerabilities.multipleNotCovered':\n 'Flere {{kind}} er ikke dekket. Dette inkluderer <b>{{notCovered1}}</b>, <b>{{notCovered2}}</b> og <b>{{notCovered3}}</b>',\n 'threatActorsAndVulnerabilities.showMoreInfo': 'Vis mer informasjon',\n 'threatActorsAndVulnerabilities.dialogHeader':\n 'Scenarier som dekker sårbarheter og trusselaktører',\n 'threatActorsAndVulnerabilities.vulnerabilityCoverage':\n 'Sårbarheter dekket',\n 'threatActorsAndVulnerabilities.threatActorCoverage':\n 'Trusselaktører dekket',\n 'threatActorsAndVulnerabilities.coverageRatio':\n '{{covered}} av {{total}}',\n 'threatActorsAndVulnerabilities.tableColumnThreatActor':\n 'Trusselaktør',\n 'threatActorsAndVulnerabilities.tableColumnVulnerability':\n 'Sårbarhet',\n 'threatActorsAndVulnerabilities.tableColumnScenarios':\n 'Antall scenarioer',\n 'actionStatus.Not started': 'Ikke startet',\n 'actionStatus.In progress': 'Startet',\n 'actionStatus.On hold': 'På vent',\n 'actionStatus.Completed': 'Fullført',\n 'actionStatus.Aborted': 'Avbrutt',\n 'actionStatus.OK': 'OK',\n 'actionStatus.Not OK': 'Ikke OK',\n 'actionStatus.Not relevant': 'Ikke relevant',\n 'errorMessages.DefaultErrorMessage': 'Det oppstod en feil',\n 'errorMessages.ErrorWhenNoWriteAccessToRepository':\n 'Kunne ikke oppdatere ROS. Du har ikke skrivetilgang til {{owner}}/{{name}}.',\n 'errorMessages.ErrorWhenUpdatingRiSc':\n 'Kunne ikke lagre risiko- og sårbarhetsanalyse',\n 'errorMessages.ErrorWhenUpdatingDeletedRiSc':\n 'Kunne ikke lagre risiko- og sårbarhetsanalyse. Den har blitt markert for sletting.',\n 'errorMessages.ErrorWhenDeletingRiSc':\n 'Kunne ikke slette risiko- og sårbarhetsanalyse',\n 'errorMessages.ErrorWhenCreatingRiSc':\n 'Kunne ikke opprette risiko- og sårbarhetsanalyse',\n 'errorMessages.RiScDoesNotExist':\n 'Risiko- og sårbarhetsanalysen du prøver å åpne eksisterer ikke',\n 'errorMessages.ScenarioDoesNotExist':\n 'Scenariet du prøver å åpne eksisterer ikke',\n 'errorMessages.ErrorWhenCreatingPullRequest':\n 'Kunne ikke lagre godkjenning av risiko- og sårbarhetsanalysen',\n 'errorMessages.ErrorWhenFetchingRiScs':\n 'Kunne ikke hente risiko- og sårbarhetsanalyser med id-er: ',\n 'errorMessages.FailedToFetchRiScs':\n 'Kunne ikke hente risiko- og sårbarhetsanalyser',\n 'errorMessages.ErrorWhenFetchingSopsConfig':\n 'Kunne ikke hente SOPS-konfigurasjon',\n 'errorMessages.FailedToCreateSops':\n 'Kunne ikke opprette SOPS-konfigurasjon',\n 'errorMessages.FailedToUpdateSops':\n 'SOPS-konfigurasjon kunne ikke oppdateres',\n 'errorMessages.ErrorWhenFetchingGcpCryptoKeys':\n 'Kunne ikke laste inn risiko- og sårbarhetsanalysene — krypteringstjenesten er ikke tilgjengelig. Prøv å oppdatere siden.',\n 'errorMessages.ContentStatusDeleted':\n 'Risiko- og sårbarhetsanalyse \"{{riScId}}\" har blitt slettet',\n 'errorMessages.ContentStatusFailure':\n 'Kunne ikke laste risiko- og sårbarhetsanalyse \"{{riScId}}\" grunnet en uventet feil',\n 'errorMessages.ContentStatusFileNotFound':\n 'Risiko- og sårbarhetsanalyse \"{{riScId}}\" ble ikke funnet i repositoryet',\n 'errorMessages.ContentStatusDecryptionFailed':\n 'Kunne ikke dekryptere risiko- og sårbarhetsanalyse \"{{riScId}}\". Du har muligens ikke de nødvendige dekrypteringsnøklene',\n 'errorMessages.ContentStatusNoReadAccess':\n 'Du har ikke lesetilgang til risiko- og sårbarhetsanalyse \"{{riScId}}\". ',\n 'errorMessages.ContentStatusUnsupportedMigration':\n 'Risiko- og sårbarhetsanalyse \"{{riScId}}\" kan ikke automatisk migreres til den nyeste versjonen.',\n 'errorMessages.ContentStatusSchemaValidationFailed':\n 'Risiko- og sårbarhetsanalyse \"{{riScId}}\" kunne ikke lastes fordi innholdet ikke samsvarer med forventet format. Den kan ha blitt manuelt redigert eller ødelagt.',\n\n 'errorMessages.ContentStatusDecryptionFailedMessage.INTERNAL_SERVER_ERROR':\n 'Kunne ikke dekryptere risiko- og sårbarhetsanalyse \"{{riScId}}\", 500 - Intern serverfeil fra kryptotjenesten.',\n 'errorMessages.ContentStatusDecryptionFailedMessage.MISSING_DATA_KEY':\n 'Kunne ikke dekryptere risiko- og sårbarhetsanalyse \"{{riScId}}\", kunne ikke få tilgang til krypteringsnøkkelen som kreves for dekryptering.',\n 'errorMessages.ContentStatusDecryptionFailedMessage.NO_MATCHING_KEY':\n 'Kunne ikke dekryptere risiko- og sårbarhetsanalyse \"{{riScId}}\", ingen tilgjengelig nøkkel kunne dekryptere innholdet.',\n 'errorMessages.ContentStatusDecryptionFailedMessage.AUTHENTICATION_FAILED':\n 'Kunne ikke dekryptere risiko- og sårbarhetsanalyse \"{{riScId}}\", autentisering mislyktes. Vennligst kontroller tilgangene dine.',\n 'errorMessages.ContentStatusDecryptionFailedMessage.INVALID_GCP_TOKEN':\n 'Kunne ikke dekryptere risiko- og sårbarhetsanalyse \"{{riScId}}\", Google Cloud-tokenet ditt er ugyldig eller utløpt.',\n 'errorMessages.ContentStatusDecryptionFailedMessage.INVALID_AGE_KEY':\n 'Kunne ikke dekryptere risiko- og sårbarhetsanalyse \"{{riScId}}\", den oppgitte AGE-nøkkelen er ugyldig.',\n 'errorMessages.ContentStatusDecryptionFailedMessage.CONNECTION_REFUSED':\n 'Kunne ikke dekryptere risiko- og sårbarhetsanalyse \"{{riScId}}\", kunne ikke koble til krypteringstjenesten.',\n\n 'errorMessages.ContentStatusUnknown':\n 'Kunne ikke hente risiko- og sårbarhetsanalyse \"{{riScId}}\" med ukjent status: {{status}}',\n 'infoMessages.OpenedPullRequest': 'Åpnet pull request',\n 'infoMessages.CreatedPullRequest':\n 'Godkjenning av risiko- og sårbarhetsanalysen ble lagret',\n 'infoMessages.DeletedRiSc':\n 'Risiko- og sårbarhetsanalysen ble slettet',\n 'infoMessages.DeletedRiScRequiresApproval':\n 'Risiko- og sårbarhetsanalysen ble markert for sletting og trenger godkjenning',\n 'infoMessages.UpdatedRiSc':\n 'Risiko- og sårbarhetsanalysen ble oppdatert',\n 'infoMessages.UpdatedSops': 'SOPS-konfigurasjon oppdatert',\n 'infoMessages.UpdatedRiScRequiresNewApproval':\n 'Risiko- og sårbarhetsanalysen ble oppdatert og trenger ny godkjenning',\n 'infoMessages.CreatedRiSc':\n 'Risiko- og sårbarhetsanalyse ble opprettet',\n 'infoMessages.UpdatedRiScAndCreatedPullRequest':\n 'Risiko- og sårbarhetsanalysen ble oppdatert og er klar for godkjenning i Github',\n 'infoMessages.NoSopsConfigFound':\n 'Ingen SOPS-konfigurasjon funnet på default branchen til GitHub-repoet',\n 'infoMessages.CreatedSops': 'SOPS-konfigurasjon opprettet',\n 'infoMessages.UpdateAction': 'Oppdaterer tiltak ...',\n 'infoMessages.UpdateInfoMessage':\n 'Vennligst vent et par sekunder mens endringene lagres.',\n 'deleteDialog.title': 'Slett risiko- og sårbarhetsanalyse',\n 'deleteDialog.confirmationMessage':\n 'Er du sikker på at du vil slette denne risiko- og sårbarhetsanalysen?',\n 'feedbackDialog.title': 'Gi oss en tilbakemelding!',\n 'feedbackDialog.description': 'Din tilbakemelding',\n 'feedbackDialog.confirmationMessage': 'Takk for din tilbakemelding.',\n 'feedbackDialog.feedbackButton': 'Gi tilbakemelding',\n 'feedbackDialog.errorMessage': 'Kunne ikke sende tilbakemelding.',\n 'feedbackDialog.sendButton': 'Send',\n 'filterButton.veryOutdated': 'Veldig utdaterte tiltak',\n 'filterButton.outdated': 'Utdaterte tiltak',\n 'filterButton.listUpdatedActions': 'Nylig oppdaterte tiltak',\n 'firstRiScCard.noRiScYet': 'Kunne ikke laste inn RoS-analyser',\n 'firstRiScCard.getStarted':\n 'Kom igang med risiko- og sårbarhetsanalyse for ditt team',\n 'filter.title': 'Tittel (a-å)',\n 'filter.initialRisk': 'Startrisiko (høy-lav)',\n 'filter.completedActions': 'Flest fullførte tiltak',\n 'filter.remainingActions': 'Flest gjennværende tiltak',\n },\n }),\n },\n});\n"],"names":[],"mappings":"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"}
@@ -21,6 +21,7 @@ var ProcessingStatus = /* @__PURE__ */ ((ProcessingStatus2) => {
21
21
  ProcessingStatus2["CreatedPullRequest"] = "CreatedPullRequest";
22
22
  ProcessingStatus2["ErrorWhenCreatingRiSc"] = "ErrorWhenCreatingRiSc";
23
23
  ProcessingStatus2["ErrorWhenUpdatingRiSc"] = "ErrorWhenUpdatingRiSc";
24
+ ProcessingStatus2["ErrorWhenUpdatingDeletedRiSc"] = "ErrorWhenUpdatingDeletedRiSc";
24
25
  ProcessingStatus2["ErrorWhenDeletingRiSc"] = "ErrorWhenDeletingRiSc";
25
26
  ProcessingStatus2["ErrorWhenPublishingRiSc"] = "ErrorWhenPublishingRiSc";
26
27
  ProcessingStatus2["ErrorWhenNoWriteAccessToRepository"] = "ErrorWhenNoWriteAccessToRepository";
@@ -1 +1 @@
1
- {"version":3,"file":"types.esm.js","sources":["../../src/utils/types.ts"],"sourcesContent":["import type { Dispatch } from 'react';\nimport { ActionsDTO, ScenarioDTO, SopsConfigDTO } from './DTOs';\nimport { ActionStatusOptions } from './constants';\n\n/**\n * Modify one key on an object type. Modify takes 3 type arguments. First one takes the original type you want to modify. Second is the specific key you want to modify. Third is the new type for that key.\n * @template {object} O Which object type to use as basis\n * @template {string} K Key of field in object to modify\n * @template R New type to set field of key to\n */\nexport type Modify<O, K extends keyof any, R> = Omit<O, K> & { [P in K]: R };\n\n/** Type of the setter from `useState` */\nexport type SetState<T extends any> = Dispatch<React.SetStateAction<T>>;\n\nexport type LastPublished = {\n dateTime: Date;\n numberOfCommits: number;\n};\n\nexport type RiScWithMetadata = {\n id: string;\n status: RiScStatus;\n content: RiSc;\n sopsConfig: SopsConfigDTO;\n isRequiresNewApproval?: boolean;\n pullRequestUrl?: string;\n schemaVersion?: string;\n migrationStatus?: MigrationStatus;\n lastPublished?: LastPublished;\n};\n\nexport type DefaultRiScTypeDescriptor = {\n id: string;\n listName: string;\n listDescription: string;\n defaultTitle: string;\n defaultScope: string;\n numberOfScenarios: number | null;\n numberOfActions: number | null;\n preferredBackstageComponentType: string | null;\n priorityIndex: number | null;\n};\n\nexport type MigrationStatus = {\n migrationChanges: boolean;\n migrationRequiresNewApproval: boolean;\n migrationVersions?: MigrationVersions;\n migrationChanges40?: MigrationChanges40;\n migrationChanges41?: MigrationChanges41;\n migrationChanges42?: MigrationChanges42;\n migrationChanges50?: MigrationChanges50;\n migrationChanges51?: MigrationChanges51;\n migrationChanges52?: MigrationChanges52;\n};\n\nexport type MigrationVersions = {\n fromVersion: string;\n toVersion: string;\n};\n\nexport type MigrationChanges52 = {\n removedValuationsCount?: number;\n};\n\nexport type MigrationChanges51 = {\n scenarios: MigrationChanges51Scenario[];\n};\n\nexport type MigrationChanges51Scenario = {\n title: string;\n id: string;\n changedActions: MigrationChanges51Action[];\n};\n\nexport type MigrationChanges51Action = {\n title: string;\n id: string;\n lastUpdatedBy?: string | null;\n};\n\nexport type MigrationChanges50 = {\n scenarios: MigrationChanges50Scenario[];\n};\n\nexport type MigrationChanges50Scenario = {\n title: string;\n id: string;\n changedActions: MigrationChanges50Action[];\n};\n\nexport type MigrationChanges50Action = {\n title: string;\n id: string;\n changedActionStatus: MigrationChangedTypedValue<\n ActionStatusOptionsV4,\n ActionStatusOptions\n >;\n};\n\nexport type MigrationChanges42 = {\n scenarios: MigrationChanges42Scenario[];\n};\n\nexport type MigrationChanges42Scenario = {\n title: string;\n id: string;\n changedActions: MigrationChanges42Action[];\n};\n\nexport type MigrationChanges42Action = {\n title: string;\n id: string;\n lastUpdated?: Date | null;\n};\n\nexport type MigrationChanges41 = {\n scenarios: MigrationChanges41Scenario[];\n};\n\nexport type MigrationChanges41Scenario = {\n title: string;\n id: string;\n changedRiskConsequence?: MigrationChangedValue<number>;\n changedRiskProbability?: MigrationChangedValue<number>;\n changedRemainingRiskConsequence?: MigrationChangedValue<number>;\n changedRemainingRiskProbability?: MigrationChangedValue<number>;\n};\n\nexport type MigrationChanges40 = {\n scenarios: MigrationChanges40Scenario[];\n};\n\nexport type MigrationChanges40Scenario = {\n title: string;\n id: string;\n removedExistingActions?: string;\n changedVulnerabilities: MigrationChangedValue<string>[];\n changedActions: MigrationChanges40Action[];\n};\n\nexport type MigrationChanges40Action = {\n title: string;\n id: string;\n removedOwner?: string;\n removedDeadline?: string;\n};\n\nexport type MigrationChangedValue<T> = {\n oldValue: T;\n newValue: T;\n};\n\nexport type MigrationChangedTypedValue<S, T> = {\n oldValue: S;\n newValue: T;\n};\n\nexport type RiSc = {\n schemaVersion: string;\n title: string;\n scope: string;\n scenarios: Scenario[];\n};\n\n// The Valuations concept was removed in PR #850 and the remaining code referencing it can be removed when old schema migration code including to v4 is removed.\ntype Valuations = {\n description: string;\n confidentiality: string;\n integrity: string;\n availability: string;\n};\n\nexport type Scenario = {\n ID: string;\n title: string;\n url?: string;\n description: string;\n threatActors: string[];\n vulnerabilities: string[];\n risk: Risk;\n remainingRisk: Risk;\n actions: Action[];\n};\n\nexport type Risk = {\n summary: string;\n probability: number;\n consequence: number;\n};\n\nexport type Action = {\n ID: string;\n title: string;\n description: string;\n status: string;\n url: string;\n lastUpdated?: Date | null;\n lastUpdatedBy?: string | null;\n};\n\nexport type GithubRepoInfo = {\n name: string;\n owner: string;\n};\n\nexport type SubmitResponseObject = {\n status: ProcessingStatus;\n statusMessage: string;\n};\n\nexport enum RiScStatus {\n Draft = 'Draft',\n Published = 'Published',\n SentForApproval = 'SentForApproval',\n DeletionDraft = 'DeletionDraft',\n DeletionSentForApproval = 'DeletionSentForApproval',\n}\n\nexport enum ProcessingStatus {\n RiScNotValid = 'RiScNotValid',\n EncryptionFailed = 'EncryptionFailed',\n CouldNotCreateBranch = 'CouldNotCreateBranch',\n UpdatedRiSc = 'UpdatedRiSc',\n DeletedRiSc = 'DeletedRiSc',\n DeletedRiScRequiresApproval = 'DeletedRiScRequiresApproval',\n UpdatedSops = 'UpdatedSops',\n UpdatedRiScRequiresNewApproval = 'UpdatedRiScRequiresNewApproval',\n UpdatedRiScAndCreatedPullRequest = 'UpdatedRiScAndCreatedPullRequest',\n CreatedRiSc = 'CreatedRiSc',\n OpenedPullRequest = 'OpenedPullRequest',\n CreatedPullRequest = 'CreatedPullRequest',\n ErrorWhenCreatingRiSc = 'ErrorWhenCreatingRiSc',\n ErrorWhenUpdatingRiSc = 'ErrorWhenUpdatingRiSc',\n ErrorWhenDeletingRiSc = 'ErrorWhenDeletingRiSc',\n ErrorWhenPublishingRiSc = 'ErrorWhenPublishingRiSc',\n ErrorWhenNoWriteAccessToRepository = 'ErrorWhenNoWriteAccessToRepository',\n ErrorWhenFetchingRiScs = 'ErrorWhenFetchingRiScs',\n ErrorWhenCreatingPullRequest = 'ErrorWhenCreatingPullRequest',\n ErrorWhenFetchingGcpCryptoKeys = 'ErrorWhenFetchingGcpCryptoKeys',\n FailedToFetchGcpProjectIds = 'Failed to fetch GCP project IDs',\n}\n\nexport enum ContentStatus {\n Success = 'Success',\n Deleted = 'Deleted',\n Failure = 'Failure',\n FileNotFound = 'FileNotFound',\n DecryptionFailed = 'DecryptionFailed',\n NoReadAccess = 'NoReadAccess',\n UnsupportedMigration = 'UnsupportedMigration',\n SchemaValidationFailed = 'SchemaValidationFailed',\n}\n\nexport enum DifferenceStatus {\n Success = 'Success',\n GithubFileNotFound = 'GithubFileNotFound',\n FrontendFallback = 'FrontendFallback',\n}\n\nexport enum ActionStatusOptionsV4 {\n NotStarted = 'Not started',\n InProgress = 'In progress',\n OnHold = 'On hold',\n Completed = 'Completed',\n Aborted = 'Aborted',\n}\n\ntype FormRisk = Modify<\n Modify<Risk, 'probability', string>,\n 'consequence',\n string\n>;\n\nexport type FormScenario = Modify<\n Modify<Scenario, 'risk', FormRisk>,\n 'remainingRisk',\n FormRisk\n>;\n\nexport type Difference = {\n type: '4.*';\n migrationChanges: MigrationStatus;\n title?: SimpleTrackedProperty<string>;\n scope?: SimpleTrackedProperty<string>;\n valuations: SimpleTrackedProperty<Valuations>[];\n scenarios: TrackedProperty<ScenarioChange, ScenarioDTO>[];\n};\n\nexport type ScenarioChange = {\n title: SimpleTrackedProperty<string>;\n id: string;\n description: SimpleTrackedProperty<string>;\n url?: SimpleTrackedProperty<string | null>;\n threatActors: SimpleTrackedProperty<string>[];\n vulnerabilities: SimpleTrackedProperty<string>[];\n risk: SimpleTrackedProperty<ScenarioRiskChange>;\n remainingRisk: SimpleTrackedProperty<ScenarioRiskChange>;\n actions: TrackedProperty<ActionChange, ActionsDTO>[];\n};\n\nexport type ActionChange = {\n title: SimpleTrackedProperty<string>;\n // The id will never change\n id: string;\n description: SimpleTrackedProperty<string>;\n url?: SimpleTrackedProperty<string | null>;\n status?: SimpleTrackedProperty<string>;\n lastUpdated?: SimpleTrackedProperty<Date | null>;\n lastUpdatedBy?: SimpleTrackedProperty<string | null>;\n};\n\nexport type ScenarioRiskChange = {\n summary?: SimpleTrackedProperty<string | null>;\n probability: SimpleTrackedProperty<number>;\n consequence: SimpleTrackedProperty<number>;\n};\n\nexport type SimpleTrackedProperty<T> = TrackedProperty<T, T>;\n\nexport type TrackedProperty<S, T> =\n | AddedProperty<T>\n | ChangedProperty<S>\n | ContentChangedProperty<S>\n | DeletedProperty<T>\n | UnchangedProperty<T>;\n\nexport type AddedProperty<T> = {\n type: 'ADDED';\n newValue: T;\n};\n\nexport type ChangedProperty<S> = {\n type: 'CHANGED';\n oldValue: S;\n newValue: S;\n};\n\nexport type ContentChangedProperty<S> = {\n type: 'CONTENT_CHANGED';\n value: S;\n};\n\nexport type DeletedProperty<T> = {\n type: 'DELETED';\n oldValue: T;\n};\n\nexport type UnchangedProperty<T> = {\n type: 'UNCHANGED';\n value: T;\n};\n\nexport type DifferenceDTO = {\n status: DifferenceStatus;\n differenceState: Difference;\n errorMessage?: string;\n defaultLastModifiedDateString: string;\n};\n\nexport type DifferenceFetchState = Modify<\n DifferenceDTO,\n 'status',\n DifferenceStatus | null\n> & { isLoading: boolean; currentDifferenceId: string };\n"],"names":["RiScStatus","ProcessingStatus","ContentStatus","DifferenceStatus"],"mappings":"AAmNO,IAAK,UAAA,qBAAAA,WAAAA,KAAL;AACL,EAAAA,YAAA,OAAA,CAAA,GAAQ,OAAA;AACR,EAAAA,YAAA,WAAA,CAAA,GAAY,WAAA;AACZ,EAAAA,YAAA,iBAAA,CAAA,GAAkB,iBAAA;AAClB,EAAAA,YAAA,eAAA,CAAA,GAAgB,eAAA;AAChB,EAAAA,YAAA,yBAAA,CAAA,GAA0B,yBAAA;AALhB,EAAA,OAAAA,WAAAA;AAAA,CAAA,EAAA,UAAA,IAAA,EAAA;AAQL,IAAK,gBAAA,qBAAAC,iBAAAA,KAAL;AACL,EAAAA,kBAAA,cAAA,CAAA,GAAe,cAAA;AACf,EAAAA,kBAAA,kBAAA,CAAA,GAAmB,kBAAA;AACnB,EAAAA,kBAAA,sBAAA,CAAA,GAAuB,sBAAA;AACvB,EAAAA,kBAAA,aAAA,CAAA,GAAc,aAAA;AACd,EAAAA,kBAAA,aAAA,CAAA,GAAc,aAAA;AACd,EAAAA,kBAAA,6BAAA,CAAA,GAA8B,6BAAA;AAC9B,EAAAA,kBAAA,aAAA,CAAA,GAAc,aAAA;AACd,EAAAA,kBAAA,gCAAA,CAAA,GAAiC,gCAAA;AACjC,EAAAA,kBAAA,kCAAA,CAAA,GAAmC,kCAAA;AACnC,EAAAA,kBAAA,aAAA,CAAA,GAAc,aAAA;AACd,EAAAA,kBAAA,mBAAA,CAAA,GAAoB,mBAAA;AACpB,EAAAA,kBAAA,oBAAA,CAAA,GAAqB,oBAAA;AACrB,EAAAA,kBAAA,uBAAA,CAAA,GAAwB,uBAAA;AACxB,EAAAA,kBAAA,uBAAA,CAAA,GAAwB,uBAAA;AACxB,EAAAA,kBAAA,uBAAA,CAAA,GAAwB,uBAAA;AACxB,EAAAA,kBAAA,yBAAA,CAAA,GAA0B,yBAAA;AAC1B,EAAAA,kBAAA,oCAAA,CAAA,GAAqC,oCAAA;AACrC,EAAAA,kBAAA,wBAAA,CAAA,GAAyB,wBAAA;AACzB,EAAAA,kBAAA,8BAAA,CAAA,GAA+B,8BAAA;AAC/B,EAAAA,kBAAA,gCAAA,CAAA,GAAiC,gCAAA;AACjC,EAAAA,kBAAA,4BAAA,CAAA,GAA6B,iCAAA;AArBnB,EAAA,OAAAA,iBAAAA;AAAA,CAAA,EAAA,gBAAA,IAAA,EAAA;AAwBL,IAAK,aAAA,qBAAAC,cAAAA,KAAL;AACL,EAAAA,eAAA,SAAA,CAAA,GAAU,SAAA;AACV,EAAAA,eAAA,SAAA,CAAA,GAAU,SAAA;AACV,EAAAA,eAAA,SAAA,CAAA,GAAU,SAAA;AACV,EAAAA,eAAA,cAAA,CAAA,GAAe,cAAA;AACf,EAAAA,eAAA,kBAAA,CAAA,GAAmB,kBAAA;AACnB,EAAAA,eAAA,cAAA,CAAA,GAAe,cAAA;AACf,EAAAA,eAAA,sBAAA,CAAA,GAAuB,sBAAA;AACvB,EAAAA,eAAA,wBAAA,CAAA,GAAyB,wBAAA;AARf,EAAA,OAAAA,cAAAA;AAAA,CAAA,EAAA,aAAA,IAAA,EAAA;AAWL,IAAK,gBAAA,qBAAAC,iBAAAA,KAAL;AACL,EAAAA,kBAAA,SAAA,CAAA,GAAU,SAAA;AACV,EAAAA,kBAAA,oBAAA,CAAA,GAAqB,oBAAA;AACrB,EAAAA,kBAAA,kBAAA,CAAA,GAAmB,kBAAA;AAHT,EAAA,OAAAA,iBAAAA;AAAA,CAAA,EAAA,gBAAA,IAAA,EAAA;;;;"}
1
+ {"version":3,"file":"types.esm.js","sources":["../../src/utils/types.ts"],"sourcesContent":["import type { Dispatch } from 'react';\nimport { ActionsDTO, ScenarioDTO, SopsConfigDTO } from './DTOs';\nimport { ActionStatusOptions } from './constants';\n\n/**\n * Modify one key on an object type. Modify takes 3 type arguments. First one takes the original type you want to modify. Second is the specific key you want to modify. Third is the new type for that key.\n * @template {object} O Which object type to use as basis\n * @template {string} K Key of field in object to modify\n * @template R New type to set field of key to\n */\nexport type Modify<O, K extends keyof any, R> = Omit<O, K> & { [P in K]: R };\n\n/** Type of the setter from `useState` */\nexport type SetState<T extends any> = Dispatch<React.SetStateAction<T>>;\n\nexport type LastPublished = {\n dateTime: Date;\n numberOfCommits: number;\n};\n\nexport type RiScWithMetadata = {\n id: string;\n status: RiScStatus;\n content: RiSc;\n sopsConfig: SopsConfigDTO;\n isRequiresNewApproval?: boolean;\n pullRequestUrl?: string;\n schemaVersion?: string;\n migrationStatus?: MigrationStatus;\n lastPublished?: LastPublished;\n};\n\nexport type DefaultRiScTypeDescriptor = {\n id: string;\n listName: string;\n listDescription: string;\n defaultTitle: string;\n defaultScope: string;\n numberOfScenarios: number | null;\n numberOfActions: number | null;\n preferredBackstageComponentType: string | null;\n priorityIndex: number | null;\n};\n\nexport type MigrationStatus = {\n migrationChanges: boolean;\n migrationRequiresNewApproval: boolean;\n migrationVersions?: MigrationVersions;\n migrationChanges40?: MigrationChanges40;\n migrationChanges41?: MigrationChanges41;\n migrationChanges42?: MigrationChanges42;\n migrationChanges50?: MigrationChanges50;\n migrationChanges51?: MigrationChanges51;\n migrationChanges52?: MigrationChanges52;\n};\n\nexport type MigrationVersions = {\n fromVersion: string;\n toVersion: string;\n};\n\nexport type MigrationChanges52 = {\n removedValuationsCount?: number;\n};\n\nexport type MigrationChanges51 = {\n scenarios: MigrationChanges51Scenario[];\n};\n\nexport type MigrationChanges51Scenario = {\n title: string;\n id: string;\n changedActions: MigrationChanges51Action[];\n};\n\nexport type MigrationChanges51Action = {\n title: string;\n id: string;\n lastUpdatedBy?: string | null;\n};\n\nexport type MigrationChanges50 = {\n scenarios: MigrationChanges50Scenario[];\n};\n\nexport type MigrationChanges50Scenario = {\n title: string;\n id: string;\n changedActions: MigrationChanges50Action[];\n};\n\nexport type MigrationChanges50Action = {\n title: string;\n id: string;\n changedActionStatus: MigrationChangedTypedValue<\n ActionStatusOptionsV4,\n ActionStatusOptions\n >;\n};\n\nexport type MigrationChanges42 = {\n scenarios: MigrationChanges42Scenario[];\n};\n\nexport type MigrationChanges42Scenario = {\n title: string;\n id: string;\n changedActions: MigrationChanges42Action[];\n};\n\nexport type MigrationChanges42Action = {\n title: string;\n id: string;\n lastUpdated?: Date | null;\n};\n\nexport type MigrationChanges41 = {\n scenarios: MigrationChanges41Scenario[];\n};\n\nexport type MigrationChanges41Scenario = {\n title: string;\n id: string;\n changedRiskConsequence?: MigrationChangedValue<number>;\n changedRiskProbability?: MigrationChangedValue<number>;\n changedRemainingRiskConsequence?: MigrationChangedValue<number>;\n changedRemainingRiskProbability?: MigrationChangedValue<number>;\n};\n\nexport type MigrationChanges40 = {\n scenarios: MigrationChanges40Scenario[];\n};\n\nexport type MigrationChanges40Scenario = {\n title: string;\n id: string;\n removedExistingActions?: string;\n changedVulnerabilities: MigrationChangedValue<string>[];\n changedActions: MigrationChanges40Action[];\n};\n\nexport type MigrationChanges40Action = {\n title: string;\n id: string;\n removedOwner?: string;\n removedDeadline?: string;\n};\n\nexport type MigrationChangedValue<T> = {\n oldValue: T;\n newValue: T;\n};\n\nexport type MigrationChangedTypedValue<S, T> = {\n oldValue: S;\n newValue: T;\n};\n\nexport type RiSc = {\n schemaVersion: string;\n title: string;\n scope: string;\n scenarios: Scenario[];\n};\n\n// The Valuations concept was removed in PR #850 and the remaining code referencing it can be removed when old schema migration code including to v4 is removed.\ntype Valuations = {\n description: string;\n confidentiality: string;\n integrity: string;\n availability: string;\n};\n\nexport type Scenario = {\n ID: string;\n title: string;\n url?: string;\n description: string;\n threatActors: string[];\n vulnerabilities: string[];\n risk: Risk;\n remainingRisk: Risk;\n actions: Action[];\n};\n\nexport type Risk = {\n summary: string;\n probability: number;\n consequence: number;\n};\n\nexport type Action = {\n ID: string;\n title: string;\n description: string;\n status: string;\n url: string;\n lastUpdated?: Date | null;\n lastUpdatedBy?: string | null;\n};\n\nexport type GithubRepoInfo = {\n name: string;\n owner: string;\n};\n\nexport type SubmitResponseObject = {\n status: ProcessingStatus;\n statusMessage: string;\n};\n\nexport enum RiScStatus {\n Draft = 'Draft',\n Published = 'Published',\n SentForApproval = 'SentForApproval',\n DeletionDraft = 'DeletionDraft',\n DeletionSentForApproval = 'DeletionSentForApproval',\n}\n\nexport enum ProcessingStatus {\n RiScNotValid = 'RiScNotValid',\n EncryptionFailed = 'EncryptionFailed',\n CouldNotCreateBranch = 'CouldNotCreateBranch',\n UpdatedRiSc = 'UpdatedRiSc',\n DeletedRiSc = 'DeletedRiSc',\n DeletedRiScRequiresApproval = 'DeletedRiScRequiresApproval',\n UpdatedSops = 'UpdatedSops',\n UpdatedRiScRequiresNewApproval = 'UpdatedRiScRequiresNewApproval',\n UpdatedRiScAndCreatedPullRequest = 'UpdatedRiScAndCreatedPullRequest',\n CreatedRiSc = 'CreatedRiSc',\n OpenedPullRequest = 'OpenedPullRequest',\n CreatedPullRequest = 'CreatedPullRequest',\n ErrorWhenCreatingRiSc = 'ErrorWhenCreatingRiSc',\n ErrorWhenUpdatingRiSc = 'ErrorWhenUpdatingRiSc',\n ErrorWhenUpdatingDeletedRiSc = 'ErrorWhenUpdatingDeletedRiSc',\n ErrorWhenDeletingRiSc = 'ErrorWhenDeletingRiSc',\n ErrorWhenPublishingRiSc = 'ErrorWhenPublishingRiSc',\n ErrorWhenNoWriteAccessToRepository = 'ErrorWhenNoWriteAccessToRepository',\n ErrorWhenFetchingRiScs = 'ErrorWhenFetchingRiScs',\n ErrorWhenCreatingPullRequest = 'ErrorWhenCreatingPullRequest',\n ErrorWhenFetchingGcpCryptoKeys = 'ErrorWhenFetchingGcpCryptoKeys',\n FailedToFetchGcpProjectIds = 'Failed to fetch GCP project IDs',\n}\n\nexport enum ContentStatus {\n Success = 'Success',\n Deleted = 'Deleted',\n Failure = 'Failure',\n FileNotFound = 'FileNotFound',\n DecryptionFailed = 'DecryptionFailed',\n NoReadAccess = 'NoReadAccess',\n UnsupportedMigration = 'UnsupportedMigration',\n SchemaValidationFailed = 'SchemaValidationFailed',\n}\n\nexport enum DifferenceStatus {\n Success = 'Success',\n GithubFileNotFound = 'GithubFileNotFound',\n FrontendFallback = 'FrontendFallback',\n}\n\nexport enum ActionStatusOptionsV4 {\n NotStarted = 'Not started',\n InProgress = 'In progress',\n OnHold = 'On hold',\n Completed = 'Completed',\n Aborted = 'Aborted',\n}\n\ntype FormRisk = Modify<\n Modify<Risk, 'probability', string>,\n 'consequence',\n string\n>;\n\nexport type FormScenario = Modify<\n Modify<Scenario, 'risk', FormRisk>,\n 'remainingRisk',\n FormRisk\n>;\n\nexport type Difference = {\n type: '4.*';\n migrationChanges: MigrationStatus;\n title?: SimpleTrackedProperty<string>;\n scope?: SimpleTrackedProperty<string>;\n valuations: SimpleTrackedProperty<Valuations>[];\n scenarios: TrackedProperty<ScenarioChange, ScenarioDTO>[];\n};\n\nexport type ScenarioChange = {\n title: SimpleTrackedProperty<string>;\n id: string;\n description: SimpleTrackedProperty<string>;\n url?: SimpleTrackedProperty<string | null>;\n threatActors: SimpleTrackedProperty<string>[];\n vulnerabilities: SimpleTrackedProperty<string>[];\n risk: SimpleTrackedProperty<ScenarioRiskChange>;\n remainingRisk: SimpleTrackedProperty<ScenarioRiskChange>;\n actions: TrackedProperty<ActionChange, ActionsDTO>[];\n};\n\nexport type ActionChange = {\n title: SimpleTrackedProperty<string>;\n // The id will never change\n id: string;\n description: SimpleTrackedProperty<string>;\n url?: SimpleTrackedProperty<string | null>;\n status?: SimpleTrackedProperty<string>;\n lastUpdated?: SimpleTrackedProperty<Date | null>;\n lastUpdatedBy?: SimpleTrackedProperty<string | null>;\n};\n\nexport type ScenarioRiskChange = {\n summary?: SimpleTrackedProperty<string | null>;\n probability: SimpleTrackedProperty<number>;\n consequence: SimpleTrackedProperty<number>;\n};\n\nexport type SimpleTrackedProperty<T> = TrackedProperty<T, T>;\n\nexport type TrackedProperty<S, T> =\n | AddedProperty<T>\n | ChangedProperty<S>\n | ContentChangedProperty<S>\n | DeletedProperty<T>\n | UnchangedProperty<T>;\n\nexport type AddedProperty<T> = {\n type: 'ADDED';\n newValue: T;\n};\n\nexport type ChangedProperty<S> = {\n type: 'CHANGED';\n oldValue: S;\n newValue: S;\n};\n\nexport type ContentChangedProperty<S> = {\n type: 'CONTENT_CHANGED';\n value: S;\n};\n\nexport type DeletedProperty<T> = {\n type: 'DELETED';\n oldValue: T;\n};\n\nexport type UnchangedProperty<T> = {\n type: 'UNCHANGED';\n value: T;\n};\n\nexport type DifferenceDTO = {\n status: DifferenceStatus;\n differenceState: Difference;\n errorMessage?: string;\n defaultLastModifiedDateString: string;\n};\n\nexport type DifferenceFetchState = Modify<\n DifferenceDTO,\n 'status',\n DifferenceStatus | null\n> & { isLoading: boolean; currentDifferenceId: string };\n"],"names":["RiScStatus","ProcessingStatus","ContentStatus","DifferenceStatus"],"mappings":"AAmNO,IAAK,UAAA,qBAAAA,WAAAA,KAAL;AACL,EAAAA,YAAA,OAAA,CAAA,GAAQ,OAAA;AACR,EAAAA,YAAA,WAAA,CAAA,GAAY,WAAA;AACZ,EAAAA,YAAA,iBAAA,CAAA,GAAkB,iBAAA;AAClB,EAAAA,YAAA,eAAA,CAAA,GAAgB,eAAA;AAChB,EAAAA,YAAA,yBAAA,CAAA,GAA0B,yBAAA;AALhB,EAAA,OAAAA,WAAAA;AAAA,CAAA,EAAA,UAAA,IAAA,EAAA;AAQL,IAAK,gBAAA,qBAAAC,iBAAAA,KAAL;AACL,EAAAA,kBAAA,cAAA,CAAA,GAAe,cAAA;AACf,EAAAA,kBAAA,kBAAA,CAAA,GAAmB,kBAAA;AACnB,EAAAA,kBAAA,sBAAA,CAAA,GAAuB,sBAAA;AACvB,EAAAA,kBAAA,aAAA,CAAA,GAAc,aAAA;AACd,EAAAA,kBAAA,aAAA,CAAA,GAAc,aAAA;AACd,EAAAA,kBAAA,6BAAA,CAAA,GAA8B,6BAAA;AAC9B,EAAAA,kBAAA,aAAA,CAAA,GAAc,aAAA;AACd,EAAAA,kBAAA,gCAAA,CAAA,GAAiC,gCAAA;AACjC,EAAAA,kBAAA,kCAAA,CAAA,GAAmC,kCAAA;AACnC,EAAAA,kBAAA,aAAA,CAAA,GAAc,aAAA;AACd,EAAAA,kBAAA,mBAAA,CAAA,GAAoB,mBAAA;AACpB,EAAAA,kBAAA,oBAAA,CAAA,GAAqB,oBAAA;AACrB,EAAAA,kBAAA,uBAAA,CAAA,GAAwB,uBAAA;AACxB,EAAAA,kBAAA,uBAAA,CAAA,GAAwB,uBAAA;AACxB,EAAAA,kBAAA,8BAAA,CAAA,GAA+B,8BAAA;AAC/B,EAAAA,kBAAA,uBAAA,CAAA,GAAwB,uBAAA;AACxB,EAAAA,kBAAA,yBAAA,CAAA,GAA0B,yBAAA;AAC1B,EAAAA,kBAAA,oCAAA,CAAA,GAAqC,oCAAA;AACrC,EAAAA,kBAAA,wBAAA,CAAA,GAAyB,wBAAA;AACzB,EAAAA,kBAAA,8BAAA,CAAA,GAA+B,8BAAA;AAC/B,EAAAA,kBAAA,gCAAA,CAAA,GAAiC,gCAAA;AACjC,EAAAA,kBAAA,4BAAA,CAAA,GAA6B,iCAAA;AAtBnB,EAAA,OAAAA,iBAAAA;AAAA,CAAA,EAAA,gBAAA,IAAA,EAAA;AAyBL,IAAK,aAAA,qBAAAC,cAAAA,KAAL;AACL,EAAAA,eAAA,SAAA,CAAA,GAAU,SAAA;AACV,EAAAA,eAAA,SAAA,CAAA,GAAU,SAAA;AACV,EAAAA,eAAA,SAAA,CAAA,GAAU,SAAA;AACV,EAAAA,eAAA,cAAA,CAAA,GAAe,cAAA;AACf,EAAAA,eAAA,kBAAA,CAAA,GAAmB,kBAAA;AACnB,EAAAA,eAAA,cAAA,CAAA,GAAe,cAAA;AACf,EAAAA,eAAA,sBAAA,CAAA,GAAuB,sBAAA;AACvB,EAAAA,eAAA,wBAAA,CAAA,GAAyB,wBAAA;AARf,EAAA,OAAAA,cAAAA;AAAA,CAAA,EAAA,aAAA,IAAA,EAAA;AAWL,IAAK,gBAAA,qBAAAC,iBAAAA,KAAL;AACL,EAAAA,kBAAA,SAAA,CAAA,GAAU,SAAA;AACV,EAAAA,kBAAA,oBAAA,CAAA,GAAqB,oBAAA;AACrB,EAAAA,kBAAA,kBAAA,CAAA,GAAmB,kBAAA;AAHT,EAAA,OAAAA,iBAAAA;AAAA,CAAA,EAAA,gBAAA,IAAA,EAAA;;;;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kartverket/backstage-plugin-risk-scorecard",
3
- "version": "6.2.4",
3
+ "version": "6.4.0",
4
4
  "main": "dist/index.esm.js",
5
5
  "types": "dist/index.d.ts",
6
6
  "license": "MIT",