@kartverket/backstage-plugin-risk-scorecard 3.10.8 → 3.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (66) hide show
  1. package/dist/components/action/ActionRow.esm.js +1 -2
  2. package/dist/components/action/ActionRow.esm.js.map +1 -1
  3. package/dist/components/action/ActionRowList.esm.js +7 -2
  4. package/dist/components/action/ActionRowList.esm.js.map +1 -1
  5. package/dist/components/action/ActionURL.esm.js +2 -7
  6. package/dist/components/action/ActionURL.esm.js.map +1 -1
  7. package/dist/components/common/typography.esm.js +1 -12
  8. package/dist/components/common/typography.esm.js.map +1 -1
  9. package/dist/components/riScDialog/RiScDialog.esm.js +1 -1
  10. package/dist/components/riScDialog/RiScDialog.esm.js.map +1 -1
  11. package/dist/components/riskMatrix/AggregatedCost.esm.js +14 -5
  12. package/dist/components/riskMatrix/AggregatedCost.esm.js.map +1 -1
  13. package/dist/components/riskMatrix/CurrentRisk.esm.js +124 -0
  14. package/dist/components/riskMatrix/CurrentRisk.esm.js.map +1 -0
  15. package/dist/components/riskMatrix/CurrentRisk.module.css.esm.js +8 -0
  16. package/dist/components/riskMatrix/CurrentRisk.module.css.esm.js.map +1 -0
  17. package/dist/components/riskMatrix/RiskMatrix.esm.js +15 -24
  18. package/dist/components/riskMatrix/RiskMatrix.esm.js.map +1 -1
  19. package/dist/components/riskMatrix/RiskMatrix.module.css.esm.js +8 -0
  20. package/dist/components/riskMatrix/RiskMatrix.module.css.esm.js.map +1 -0
  21. package/dist/components/riskMatrix/RiskMatrixScenarioCount.esm.js +27 -46
  22. package/dist/components/riskMatrix/RiskMatrixScenarioCount.esm.js.map +1 -1
  23. package/dist/components/riskMatrix/RiskMatrixScenarioCount.module.css.esm.js +8 -0
  24. package/dist/components/riskMatrix/RiskMatrixScenarioCount.module.css.esm.js.map +1 -0
  25. package/dist/components/riskMatrix/Tabs.esm.js +19 -0
  26. package/dist/components/riskMatrix/Tabs.esm.js.map +1 -1
  27. package/dist/components/riskMatrix/utils.esm.js +1 -0
  28. package/dist/components/riskMatrix/utils.esm.js.map +1 -1
  29. package/dist/components/scenarioTable/{OutdatedActionsCounts.esm.js → ActionCountButtons.esm.js} +13 -13
  30. package/dist/components/scenarioTable/ActionCountButtons.esm.js.map +1 -0
  31. package/dist/components/scenarioTable/{components/OutdatedActionsCountButton/OutdatedActionsCountButton.esm.js → ActionsCountButton.esm.js} +7 -8
  32. package/dist/components/scenarioTable/ActionsCountButton.esm.js.map +1 -0
  33. package/dist/components/scenarioTable/ActionsCountButton.module.css.esm.js +8 -0
  34. package/dist/components/scenarioTable/ActionsCountButton.module.css.esm.js.map +1 -0
  35. package/dist/components/scenarioTable/ScenarioTable.esm.js +31 -57
  36. package/dist/components/scenarioTable/ScenarioTable.esm.js.map +1 -1
  37. package/dist/components/scenarioTable/ScenarioTableCard.esm.js +26 -34
  38. package/dist/components/scenarioTable/ScenarioTableCard.esm.js.map +1 -1
  39. package/dist/components/scenarioTable/ScenarioTableFilter.esm.js +17 -14
  40. package/dist/components/scenarioTable/ScenarioTableFilter.esm.js.map +1 -1
  41. package/dist/components/scenarioTable/ScenarioTableRow.esm.js +37 -85
  42. package/dist/components/scenarioTable/ScenarioTableRow.esm.js.map +1 -1
  43. package/dist/components/scenarioWizard/ScenarioWizard.esm.js +1 -2
  44. package/dist/components/scenarioWizard/ScenarioWizard.esm.js.map +1 -1
  45. package/dist/hooks/UseScenarioTableDnD.esm.js +78 -0
  46. package/dist/hooks/UseScenarioTableDnD.esm.js.map +1 -0
  47. package/dist/utils/actions.esm.js +1 -24
  48. package/dist/utils/actions.esm.js.map +1 -1
  49. package/dist/utils/hooks.esm.js +13 -81
  50. package/dist/utils/hooks.esm.js.map +1 -1
  51. package/dist/utils/risk.esm.js +39 -0
  52. package/dist/utils/risk.esm.js.map +1 -0
  53. package/dist/utils/scenario.esm.js +66 -1
  54. package/dist/utils/scenario.esm.js.map +1 -1
  55. package/dist/utils/style.esm.js +1 -60
  56. package/dist/utils/style.esm.js.map +1 -1
  57. package/dist/utils/translations.esm.js +10 -4
  58. package/dist/utils/translations.esm.js.map +1 -1
  59. package/dist/utils/utilityfunctions.esm.js.map +1 -1
  60. package/package.json +1 -1
  61. package/dist/components/riskMatrix/riskMatrixStyle.esm.js +0 -67
  62. package/dist/components/riskMatrix/riskMatrixStyle.esm.js.map +0 -1
  63. package/dist/components/scenarioTable/OutdatedActionsCounts.esm.js.map +0 -1
  64. package/dist/components/scenarioTable/components/OutdatedActionsCountButton/OutdatedActionsCountButton.esm.js.map +0 -1
  65. package/dist/components/scenarioTable/components/OutdatedActionsCountButton/OutdatedActionsCountButton.module.css.esm.js +0 -8
  66. package/dist/components/scenarioTable/components/OutdatedActionsCountButton/OutdatedActionsCountButton.module.css.esm.js.map +0 -1
@@ -12,8 +12,7 @@ function ActionRow(props) {
12
12
  ActionEdit,
13
13
  {
14
14
  onSaveAction: (a) => {
15
- props.onSaveAction(a);
16
- setIsEditing(false);
15
+ props.onSaveAction(a, setIsEditing);
17
16
  },
18
17
  onDeleteAction: () => setDeleteActionConfirmationIsOpen(true),
19
18
  onCancelEdit: () => setIsEditing(false),
@@ -1 +1 @@
1
- {"version":3,"file":"ActionRow.esm.js","sources":["../../../src/components/action/ActionRow.tsx"],"sourcesContent":["import { UpdatedStatusEnumType } from '../../utils/utilityfunctions.ts';\nimport { ActionStatusOptions } from '../../utils/constants.ts';\nimport { DeleteActionConfirmation } from '../scenarioDrawer/components/DeleteConfirmation.tsx';\nimport { Action } from '../../utils/types.ts';\nimport { useState } from 'react';\nimport { ActionEdit } from './ActionEdit.tsx';\nimport { ActionView } from './ActionView.tsx';\n\ntype ActionRowProps = {\n action: Action;\n onRefreshActionStatus: (action: Action) => void;\n onNewActionStatus: (actionId: string, newStatus: ActionStatusOptions) => void;\n onDeleteAction: (actionId: string) => void;\n onSaveAction: (newAction: Action) => void;\n allowDeletion?: boolean;\n allowEdit?: boolean;\n optimisticStatus?: ActionStatusOptions;\n optimisticUpdatedStatus?: UpdatedStatusEnumType;\n index?: number;\n};\n\nexport function ActionRow(props: ActionRowProps) {\n const [isEditing, setIsEditing] = useState<boolean>(false);\n const [deleteActionConfirmationIsOpen, setDeleteActionConfirmationIsOpen] =\n useState(false);\n\n return (\n <div key={props.action.ID}>\n {isEditing ? (\n <ActionEdit\n onSaveAction={(a: Action) => {\n props.onSaveAction(a);\n setIsEditing(false);\n }}\n onDeleteAction={() => setDeleteActionConfirmationIsOpen(true)}\n onCancelEdit={() => setIsEditing(false)}\n action={props.action}\n />\n ) : (\n <ActionView\n action={props.action}\n onRefreshActionStatus={props.onRefreshActionStatus}\n onNewActionStatus={props.onNewActionStatus}\n toggleEditMode={() => setIsEditing(!isEditing)}\n openDeleteDialog={() => setDeleteActionConfirmationIsOpen(true)}\n allowDeletion={props.allowDeletion}\n allowEdit={props.allowEdit}\n optimisticStatus={props.optimisticStatus}\n optimisticUpdatedStatus={props.optimisticUpdatedStatus}\n index={props.index}\n />\n )}\n <DeleteActionConfirmation\n isOpen={deleteActionConfirmationIsOpen}\n setIsOpen={setDeleteActionConfirmationIsOpen}\n onConfirm={() => props.onDeleteAction(props.action.ID)}\n />\n </div>\n );\n}\n"],"names":[],"mappings":";;;;;;AAqBO,SAAS,UAAU,KAAA,EAAuB;AAC/C,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAI,SAAkB,KAAK,CAAA;AACzD,EAAA,MAAM,CAAC,8BAAA,EAAgC,iCAAiC,CAAA,GACtE,SAAS,KAAK,CAAA;AAEhB,EAAA,4BACG,KAAA,EAAA,EACE,QAAA,EAAA;AAAA,IAAA,SAAA,mBACC,GAAA;AAAA,MAAC,UAAA;AAAA,MAAA;AAAA,QACC,YAAA,EAAc,CAAC,CAAA,KAAc;AAC3B,UAAA,KAAA,CAAM,aAAa,CAAC,CAAA;AACpB,UAAA,YAAA,CAAa,KAAK,CAAA;AAAA,QACpB,CAAA;AAAA,QACA,cAAA,EAAgB,MAAM,iCAAA,CAAkC,IAAI,CAAA;AAAA,QAC5D,YAAA,EAAc,MAAM,YAAA,CAAa,KAAK,CAAA;AAAA,QACtC,QAAQ,KAAA,CAAM;AAAA;AAAA,KAChB,mBAEA,GAAA;AAAA,MAAC,UAAA;AAAA,MAAA;AAAA,QACC,QAAQ,KAAA,CAAM,MAAA;AAAA,QACd,uBAAuB,KAAA,CAAM,qBAAA;AAAA,QAC7B,mBAAmB,KAAA,CAAM,iBAAA;AAAA,QACzB,cAAA,EAAgB,MAAM,YAAA,CAAa,CAAC,SAAS,CAAA;AAAA,QAC7C,gBAAA,EAAkB,MAAM,iCAAA,CAAkC,IAAI,CAAA;AAAA,QAC9D,eAAe,KAAA,CAAM,aAAA;AAAA,QACrB,WAAW,KAAA,CAAM,SAAA;AAAA,QACjB,kBAAkB,KAAA,CAAM,gBAAA;AAAA,QACxB,yBAAyB,KAAA,CAAM,uBAAA;AAAA,QAC/B,OAAO,KAAA,CAAM;AAAA;AAAA,KACf;AAAA,oBAEF,GAAA;AAAA,MAAC,wBAAA;AAAA,MAAA;AAAA,QACC,MAAA,EAAQ,8BAAA;AAAA,QACR,SAAA,EAAW,iCAAA;AAAA,QACX,WAAW,MAAM,KAAA,CAAM,cAAA,CAAe,KAAA,CAAM,OAAO,EAAE;AAAA;AAAA;AACvD,GAAA,EAAA,EA7BQ,KAAA,CAAM,OAAO,EA8BvB,CAAA;AAEJ;;;;"}
1
+ {"version":3,"file":"ActionRow.esm.js","sources":["../../../src/components/action/ActionRow.tsx"],"sourcesContent":["import { UpdatedStatusEnumType } from '../../utils/utilityfunctions.ts';\nimport { ActionStatusOptions } from '../../utils/constants.ts';\nimport { DeleteActionConfirmation } from '../scenarioDrawer/components/DeleteConfirmation.tsx';\nimport { Action } from '../../utils/types.ts';\nimport { useState } from 'react';\nimport { ActionEdit } from './ActionEdit.tsx';\nimport { ActionView } from './ActionView.tsx';\n\ntype ActionRowProps = {\n action: Action;\n onRefreshActionStatus: (action: Action) => void;\n onNewActionStatus: (actionId: string, newStatus: ActionStatusOptions) => void;\n onDeleteAction: (actionId: string) => void;\n onSaveAction: (\n newAction: Action,\n setIsEditing?: (isEditing: boolean) => void,\n ) => void;\n allowDeletion?: boolean;\n allowEdit?: boolean;\n optimisticStatus?: ActionStatusOptions;\n optimisticUpdatedStatus?: UpdatedStatusEnumType;\n index?: number;\n};\n\nexport function ActionRow(props: ActionRowProps) {\n const [isEditing, setIsEditing] = useState<boolean>(false);\n const [deleteActionConfirmationIsOpen, setDeleteActionConfirmationIsOpen] =\n useState(false);\n\n return (\n <div key={props.action.ID}>\n {isEditing ? (\n <ActionEdit\n onSaveAction={(a: Action) => {\n props.onSaveAction(a, setIsEditing);\n }}\n onDeleteAction={() => setDeleteActionConfirmationIsOpen(true)}\n onCancelEdit={() => setIsEditing(false)}\n action={props.action}\n />\n ) : (\n <ActionView\n action={props.action}\n onRefreshActionStatus={props.onRefreshActionStatus}\n onNewActionStatus={props.onNewActionStatus}\n toggleEditMode={() => setIsEditing(!isEditing)}\n openDeleteDialog={() => setDeleteActionConfirmationIsOpen(true)}\n allowDeletion={props.allowDeletion}\n allowEdit={props.allowEdit}\n optimisticStatus={props.optimisticStatus}\n optimisticUpdatedStatus={props.optimisticUpdatedStatus}\n index={props.index}\n />\n )}\n <DeleteActionConfirmation\n isOpen={deleteActionConfirmationIsOpen}\n setIsOpen={setDeleteActionConfirmationIsOpen}\n onConfirm={() => props.onDeleteAction(props.action.ID)}\n />\n </div>\n );\n}\n"],"names":[],"mappings":";;;;;;AAwBO,SAAS,UAAU,KAAA,EAAuB;AAC/C,EAAA,MAAM,CAAC,SAAA,EAAW,YAAY,CAAA,GAAI,SAAkB,KAAK,CAAA;AACzD,EAAA,MAAM,CAAC,8BAAA,EAAgC,iCAAiC,CAAA,GACtE,SAAS,KAAK,CAAA;AAEhB,EAAA,4BACG,KAAA,EAAA,EACE,QAAA,EAAA;AAAA,IAAA,SAAA,mBACC,GAAA;AAAA,MAAC,UAAA;AAAA,MAAA;AAAA,QACC,YAAA,EAAc,CAAC,CAAA,KAAc;AAC3B,UAAA,KAAA,CAAM,YAAA,CAAa,GAAG,YAAY,CAAA;AAAA,QACpC,CAAA;AAAA,QACA,cAAA,EAAgB,MAAM,iCAAA,CAAkC,IAAI,CAAA;AAAA,QAC5D,YAAA,EAAc,MAAM,YAAA,CAAa,KAAK,CAAA;AAAA,QACtC,QAAQ,KAAA,CAAM;AAAA;AAAA,KAChB,mBAEA,GAAA;AAAA,MAAC,UAAA;AAAA,MAAA;AAAA,QACC,QAAQ,KAAA,CAAM,MAAA;AAAA,QACd,uBAAuB,KAAA,CAAM,qBAAA;AAAA,QAC7B,mBAAmB,KAAA,CAAM,iBAAA;AAAA,QACzB,cAAA,EAAgB,MAAM,YAAA,CAAa,CAAC,SAAS,CAAA;AAAA,QAC7C,gBAAA,EAAkB,MAAM,iCAAA,CAAkC,IAAI,CAAA;AAAA,QAC9D,eAAe,KAAA,CAAM,aAAA;AAAA,QACrB,WAAW,KAAA,CAAM,SAAA;AAAA,QACjB,kBAAkB,KAAA,CAAM,gBAAA;AAAA,QACxB,yBAAyB,KAAA,CAAM,uBAAA;AAAA,QAC/B,OAAO,KAAA,CAAM;AAAA;AAAA,KACf;AAAA,oBAEF,GAAA;AAAA,MAAC,wBAAA;AAAA,MAAA;AAAA,QACC,MAAA,EAAQ,8BAAA;AAAA,QACR,SAAA,EAAW,iCAAA;AAAA,QACX,WAAW,MAAM,KAAA,CAAM,cAAA,CAAe,KAAA,CAAM,OAAO,EAAE;AAAA;AAAA;AACvD,GAAA,EAAA,EA5BQ,KAAA,CAAM,OAAO,EA6BvB,CAAA;AAEJ;;;;"}
@@ -51,7 +51,7 @@ function ActionRowList(props) {
51
51
  };
52
52
  submitEditedScenarioToRiSc(newScenario);
53
53
  };
54
- const onSaveAction = (newAction) => {
54
+ const onSaveAction = (newAction, setIsEditing) => {
55
55
  const oldScenario = getScenarioOfIdFromRiSc(props.scenarioId, selectedRiSc);
56
56
  if (!oldScenario) return;
57
57
  submitEditedScenarioToRiSc(
@@ -62,7 +62,12 @@ function ActionRowList(props) {
62
62
  )
63
63
  },
64
64
  {
65
- profileInfo
65
+ profileInfo,
66
+ onSuccess: () => {
67
+ if (setIsEditing) {
68
+ setIsEditing(false);
69
+ }
70
+ }
66
71
  }
67
72
  );
68
73
  };
@@ -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 { UpdatedStatusEnum } 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';\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 setPendingActionStatusUpdates(prev => ({\n ...prev,\n [props.scenarioId]: {\n ...prev[props.scenarioId],\n [action.ID]: action.status as ActionStatusOptions,\n },\n }));\n setPendingActionUpdatesHistory(prev => [...prev, action.ID]);\n };\n\n const onNewActionStatus = (\n actionId: string,\n newStatus: ActionStatusOptions,\n ) => {\n setPendingActionStatusUpdates(prev => ({\n ...prev,\n [props.scenarioId]: {\n ...prev[props.scenarioId],\n [actionId]: newStatus,\n },\n }));\n setPendingActionUpdatesHistory(prev => [...prev, actionId]);\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 = (newAction: Action) => {\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 },\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 setPendingActionStatusUpdates({});\n },\n onError: () => {\n // TODO: Should probably retry once before canceling updates\n setPendingActionStatusUpdates(prevStatusUpdates => {\n setPendingActionUpdatesHistory(prevHistory =>\n prevHistory.filter(actionId =>\n Object.keys(prevStatusUpdates[scenarioId] ?? {}).includes(\n actionId,\n ),\n ),\n );\n return {};\n });\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 <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 optimisticUpdatedStatus={\n pendingActionUpdatesHistory.includes(action.ID)\n ? UpdatedStatusEnum.UPDATED\n : undefined\n }\n optimisticStatus={\n pendingActionStatusUpdates[props.scenarioId]?.[action.ID]\n }\n allowDeletion={props.allowDeletion}\n allowEdit={props.allowEdit}\n />\n <Divider />\n </Fragment>\n ))}\n </Flex>\n );\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAwBO,SAAS,cAAc,KAAA,EAA2B;AACvD,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,iBAAA,CAAkB,wBAAwB,CAAA;AACxD,EAAA,MAAM,EAAE,YAAA,EAAa,GAAI,QAAA,EAAS;AAClC,EAAA,MAAM,EAAE,0BAAA,EAA2B,GAAI,WAAA,EAAY;AACnD,EAAA,MAAM,EAAE,WAAA,EAAY,GAAI,mBAAA,EAAoB;AAC5C,EAAA,MAAM,CAAC,0BAAA,EAA4B,6BAA6B,CAAA,GAAI,QAAA,CAElE,EAAE,CAAA;AACJ,EAAA,MAAM,CAAC,2BAAA,EAA6B,8BAA8B,CAAA,GAChE,QAAA,CAAmB,EAAE,CAAA;AAEvB,EAAA,MAAM,qBAAA,GAAwB,CAAC,MAAA,KAAmB;AAChD,IAAA,IAAI,OAAA,CAAQ,MAAA,CAAO,WAAA,IAAe,IAAI,CAAA,EAAG;AAEzC,IAAA,6BAAA,CAA8B,CAAA,IAAA,MAAS;AAAA,MACrC,GAAG,IAAA;AAAA,MACH,CAAC,KAAA,CAAM,UAAU,GAAG;AAAA,QAClB,GAAG,IAAA,CAAK,KAAA,CAAM,UAAU,CAAA;AAAA,QACxB,CAAC,MAAA,CAAO,EAAE,GAAG,MAAA,CAAO;AAAA;AACtB,KACF,CAAE,CAAA;AACF,IAAA,8BAAA,CAA+B,UAAQ,CAAC,GAAG,IAAA,EAAM,MAAA,CAAO,EAAE,CAAC,CAAA;AAAA,EAC7D,CAAA;AAEA,EAAA,MAAM,iBAAA,GAAoB,CACxB,QAAA,EACA,SAAA,KACG;AACH,IAAA,6BAAA,CAA8B,CAAA,IAAA,MAAS;AAAA,MACrC,GAAG,IAAA;AAAA,MACH,CAAC,KAAA,CAAM,UAAU,GAAG;AAAA,QAClB,GAAG,IAAA,CAAK,KAAA,CAAM,UAAU,CAAA;AAAA,QACxB,CAAC,QAAQ,GAAG;AAAA;AACd,KACF,CAAE,CAAA;AACF,IAAA,8BAAA,CAA+B,CAAA,IAAA,KAAQ,CAAC,GAAG,IAAA,EAAM,QAAQ,CAAC,CAAA;AAAA,EAC5D,CAAA;AAEA,EAAA,MAAM,cAAA,GAAiB,CAAC,QAAA,KAAqB;AAC3C,IAAA,MAAM,WAAA,GAAc,uBAAA,CAAwB,KAAA,CAAM,UAAA,EAAY,YAAY,CAAA;AAC1E,IAAA,IAAI,CAAC,WAAA,EAAa;AAClB,IAAA,MAAM,WAAA,GAAc;AAAA,MAClB,GAAG,WAAA;AAAA,MACH,SAAS,WAAA,CAAY,OAAA,CAAQ,OAAO,CAAA,CAAA,KAAK,CAAA,CAAE,OAAO,QAAQ;AAAA,KAC5D;AACA,IAAA,0BAAA,CAA2B,WAAW,CAAA;AAAA,EACxC,CAAA;AAEA,EAAA,MAAM,YAAA,GAAe,CAAC,SAAA,KAAsB;AAC1C,IAAA,MAAM,WAAA,GAAc,uBAAA,CAAwB,KAAA,CAAM,UAAA,EAAY,YAAY,CAAA;AAC1E,IAAA,IAAI,CAAC,WAAA,EAAa;AAClB,IAAA,0BAAA;AAAA,MACE;AAAA,QACE,GAAG,WAAA;AAAA,QACH,OAAA,EAAS,YAAY,OAAA,CAAQ,GAAA;AAAA,UAAI,CAAA,CAAA,KAC/B,CAAA,CAAE,EAAA,KAAO,SAAA,CAAU,KAAK,SAAA,GAAY;AAAA;AACtC,OACF;AAAA,MACA;AAAA,QACE;AAAA;AACF,KACF;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,gBAAA,GAAmB,WAAA;AAAA,IACvB,CAAC,OAAA,KAAiE;AAChE,MAAA,IAAI,MAAA,CAAO,IAAA,CAAK,OAAO,CAAA,CAAE,WAAW,CAAA,EAAG;AAEvC,MAAA,MAAA,CAAO,IAAA,CAAK,OAAO,CAAA,CAAE,OAAA,CAAQ,CAAA,UAAA,KAAc;AACzC,QAAA,MAAM,WAAA,GAAc,uBAAA,CAAwB,UAAA,EAAY,YAAY,CAAA;AACpE,QAAA,IAAI,CAAC,WAAA,EAAa;AAClB,QAAA,MAAM,cAAA,GAAiB,YAAY,OAAA,CAAQ,GAAA;AAAA,UAAI,CAAA,CAAA,KAC7C,CAAA,CAAE,EAAA,IAAM,OAAA,CAAQ,UAAU,CAAA,GACtB;AAAA,YACE,GAAG,CAAA;AAAA,YACH,QAAQ,OAAA,CAAQ,UAAU,EAAE,CAAA,CAAE,EAAE,KAAK,CAAA,CAAE;AAAA,WACzC,GACA;AAAA,SACN;AAEA,QAAA,MAAM,eAAA,GAAkB;AAAA,UACtB,GAAG,WAAA;AAAA,UACH,OAAA,EAAS;AAAA,SACX;AAEA,QAAA,0BAAA,CAA2B,eAAA,EAAiB;AAAA,UAC1C,2CAA2C,MAAA,CAAO,IAAA;AAAA,YAChD,QAAQ,UAAU;AAAA,WACpB;AAAA,UACA,WAAA;AAAA,UACA,WAAW,MAAM;AACf,YAAA,6BAAA,CAA8B,EAAE,CAAA;AAAA,UAClC,CAAA;AAAA,UACA,SAAS,MAAM;AAEb,YAAA,6BAAA,CAA8B,CAAA,iBAAA,KAAqB;AACjD,cAAA,8BAAA;AAAA,gBAA+B,iBAC7B,WAAA,CAAY,MAAA;AAAA,kBAAO,CAAA,QAAA,KACjB,OAAO,IAAA,CAAK,iBAAA,CAAkB,UAAU,CAAA,IAAK,EAAE,CAAA,CAAE,QAAA;AAAA,oBAC/C;AAAA;AACF;AACF,eACF;AACA,cAAA,OAAO,EAAC;AAAA,YACV,CAAC,CAAA;AAAA,UACH;AAAA,SACD,CAAA;AAAA,MACH,CAAC,CAAA;AAAA,IACH,CAAA;AAAA,IACA,CAAC,0BAAA,EAA4B,WAAA,EAAa,YAAY;AAAA,GACxD;AAEA,EAAA,MAAM,EAAE,KAAA,EAAM,GAAI,WAAA,CAEhB,0BAAA,EAA4B,KAAM,gBAAgB,CAAA;AAEpD,EAAA,MAAM,OAAA,GACJ,MAAM,gBAAA,IACN,uBAAA,CAAwB,MAAM,UAAA,EAAY,YAAY,CAAA,EAAG,OAAA,IACzD,EAAC;AAEH,EAAA,SAAA,CAAU,MAAM;AACd,IAAA,OAAO,MAAM;AAEX,MAAA,KAAA,EAAM;AAAA,IACR,CAAA;AAAA,EACF,CAAA,EAAG,CAAC,KAAK,CAAC,CAAA;AAEV,EAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AACxB,IAAA,uBACE,IAAA,CAAC,IAAA,EAAA,EAAK,KAAA,EAAM,QAAA,EAAS,WAAU,QAAA,EAC7B,QAAA,EAAA;AAAA,sBAAA,GAAA,CAAC,OAAA,EAAA,EAAQ,UAAQ,IAAA,EAAC,CAAA;AAAA,0BACjB,IAAA,EAAA,EAAK,SAAA,EAAW,OAAO,aAAA,EACrB,QAAA,EAAA,CAAA,CAAE,6BAA6B,CAAA,EAClC;AAAA,KAAA,EACF,CAAA;AAAA,EAEJ;AAEA,EAAA,uBACE,IAAA,CAAC,IAAA,EAAA,EAAK,SAAA,EAAU,QAAA,EACd,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,OAAA,EAAA,EAAQ,CAAA;AAAA,IACR,QAAQ,GAAA,CAAI,CAAC,MAAA,EAAQ,KAAA,0BACnB,QAAA,EAAA,EACC,QAAA,EAAA;AAAA,sBAAA,GAAA;AAAA,QAAC,SAAA;AAAA,QAAA;AAAA,UACC,MAAA;AAAA,UACA,KAAA;AAAA,UACA,qBAAA;AAAA,UACA,iBAAA;AAAA,UACA,cAAA;AAAA,UACA,YAAA;AAAA,UACA,yBACE,2BAAA,CAA4B,QAAA,CAAS,OAAO,EAAE,CAAA,GAC1C,kBAAkB,OAAA,GAClB,MAAA;AAAA,UAEN,kBACE,0BAAA,CAA2B,KAAA,CAAM,UAAU,CAAA,GAAI,OAAO,EAAE,CAAA;AAAA,UAE1D,eAAe,KAAA,CAAM,aAAA;AAAA,UACrB,WAAW,KAAA,CAAM;AAAA;AAAA,OACnB;AAAA,0BACC,OAAA,EAAA,EAAQ;AAAA,KAAA,EAAA,EAnBI,UAAU,MAAA,CAAO,EAAE,CAAA,CAAA,EAAI,KAAK,EAoB3C,CACD;AAAA,GAAA,EACH,CAAA;AAEJ;;;;"}
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 { UpdatedStatusEnum } 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';\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 setPendingActionStatusUpdates(prev => ({\n ...prev,\n [props.scenarioId]: {\n ...prev[props.scenarioId],\n [action.ID]: action.status as ActionStatusOptions,\n },\n }));\n setPendingActionUpdatesHistory(prev => [...prev, action.ID]);\n };\n\n const onNewActionStatus = (\n actionId: string,\n newStatus: ActionStatusOptions,\n ) => {\n setPendingActionStatusUpdates(prev => ({\n ...prev,\n [props.scenarioId]: {\n ...prev[props.scenarioId],\n [actionId]: newStatus,\n },\n }));\n setPendingActionUpdatesHistory(prev => [...prev, actionId]);\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 setPendingActionStatusUpdates({});\n },\n onError: () => {\n // TODO: Should probably retry once before canceling updates\n setPendingActionStatusUpdates(prevStatusUpdates => {\n setPendingActionUpdatesHistory(prevHistory =>\n prevHistory.filter(actionId =>\n Object.keys(prevStatusUpdates[scenarioId] ?? {}).includes(\n actionId,\n ),\n ),\n );\n return {};\n });\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 <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 optimisticUpdatedStatus={\n pendingActionUpdatesHistory.includes(action.ID)\n ? UpdatedStatusEnum.UPDATED\n : undefined\n }\n optimisticStatus={\n pendingActionStatusUpdates[props.scenarioId]?.[action.ID]\n }\n allowDeletion={props.allowDeletion}\n allowEdit={props.allowEdit}\n />\n <Divider />\n </Fragment>\n ))}\n </Flex>\n );\n}\n"],"names":[],"mappings":"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"}
@@ -1,7 +1,5 @@
1
1
  import { jsxs, jsx } from 'react/jsx-runtime';
2
- import { Box, Text } from '@backstage/ui';
3
- import Link from '@mui/material/Link';
4
- import { body2 } from '../common/typography.esm.js';
2
+ import { Box, Text, Link } from '@backstage/ui';
5
3
  import { useTranslationRef } from '@backstage/core-plugin-api/alpha';
6
4
  import { pluginRiScTranslationRef } from '../../utils/translations.esm.js';
7
5
 
@@ -15,11 +13,8 @@ function ActionURL(props) {
15
13
  props.url ? /* @__PURE__ */ jsx(
16
14
  Link,
17
15
  {
18
- sx: {
19
- ...body2,
20
- wordBreak: "break-all"
21
- },
22
16
  target: "_blank",
17
+ variant: "body-large",
23
18
  rel: "noreferrer",
24
19
  href: props.url.startsWith("http") ? props.url : `//${props.url}`,
25
20
  children: props.url
@@ -1 +1 @@
1
- {"version":3,"file":"ActionURL.esm.js","sources":["../../../src/components/action/ActionURL.tsx"],"sourcesContent":["import { Box, Text } from '@backstage/ui';\nimport Link from '@mui/material/Link';\nimport { body2 } from '../common/typography.ts';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { pluginRiScTranslationRef } from '../../utils/translations.ts';\n\ntype ActionURLProps = {\n url: string;\n};\n\nexport function ActionURL(props: ActionURLProps) {\n const { t } = useTranslationRef(pluginRiScTranslationRef);\n return (\n <Box mt=\"16px\">\n <Text as=\"p\" variant=\"body-large\" weight=\"bold\">\n {' '}\n {t('dictionary.url')}\n </Text>\n {props.url ? (\n <Link\n sx={{\n ...body2,\n wordBreak: 'break-all',\n }}\n target=\"_blank\"\n rel=\"noreferrer\"\n href={props.url.startsWith('http') ? props.url : `//${props.url}`}\n >\n {props.url}\n </Link>\n ) : (\n <Text as=\"p\" variant=\"body-large\" style={{ fontStyle: 'italic' }}>\n {t('dictionary.emptyField', {\n field: t('dictionary.url').toLowerCase(),\n })}\n </Text>\n )}\n </Box>\n );\n}\n"],"names":[],"mappings":";;;;;;;AAUO,SAAS,UAAU,KAAA,EAAuB;AAC/C,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,iBAAA,CAAkB,wBAAwB,CAAA;AACxD,EAAA,uBACE,IAAA,CAAC,GAAA,EAAA,EAAI,EAAA,EAAG,MAAA,EACN,QAAA,EAAA;AAAA,oBAAA,IAAA,CAAC,QAAK,EAAA,EAAG,GAAA,EAAI,OAAA,EAAQ,YAAA,EAAa,QAAO,MAAA,EACtC,QAAA,EAAA;AAAA,MAAA,GAAA;AAAA,MACA,EAAE,gBAAgB;AAAA,KAAA,EACrB,CAAA;AAAA,IACC,MAAM,GAAA,mBACL,GAAA;AAAA,MAAC,IAAA;AAAA,MAAA;AAAA,QACC,EAAA,EAAI;AAAA,UACF,GAAG,KAAA;AAAA,UACH,SAAA,EAAW;AAAA,SACb;AAAA,QACA,MAAA,EAAO,QAAA;AAAA,QACP,GAAA,EAAI,YAAA;AAAA,QACJ,IAAA,EAAM,KAAA,CAAM,GAAA,CAAI,UAAA,CAAW,MAAM,IAAI,KAAA,CAAM,GAAA,GAAM,CAAA,EAAA,EAAK,KAAA,CAAM,GAAG,CAAA,CAAA;AAAA,QAE9D,QAAA,EAAA,KAAA,CAAM;AAAA;AAAA,KACT,mBAEA,GAAA,CAAC,IAAA,EAAA,EAAK,EAAA,EAAG,GAAA,EAAI,OAAA,EAAQ,YAAA,EAAa,KAAA,EAAO,EAAE,SAAA,EAAW,QAAA,EAAS,EAC5D,YAAE,uBAAA,EAAyB;AAAA,MAC1B,KAAA,EAAO,CAAA,CAAE,gBAAgB,CAAA,CAAE,WAAA;AAAY,KACxC,CAAA,EACH;AAAA,GAAA,EAEJ,CAAA;AAEJ;;;;"}
1
+ {"version":3,"file":"ActionURL.esm.js","sources":["../../../src/components/action/ActionURL.tsx"],"sourcesContent":["import { Box, Link, Text } from '@backstage/ui';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { pluginRiScTranslationRef } from '../../utils/translations.ts';\n\ntype ActionURLProps = {\n url: string;\n};\n\nexport function ActionURL(props: ActionURLProps) {\n const { t } = useTranslationRef(pluginRiScTranslationRef);\n return (\n <Box mt=\"16px\">\n <Text as=\"p\" variant=\"body-large\" weight=\"bold\">\n {' '}\n {t('dictionary.url')}\n </Text>\n {props.url ? (\n <Link\n target=\"_blank\"\n variant=\"body-large\"\n rel=\"noreferrer\"\n href={props.url.startsWith('http') ? props.url : `//${props.url}`}\n >\n {props.url}\n </Link>\n ) : (\n <Text as=\"p\" variant=\"body-large\" style={{ fontStyle: 'italic' }}>\n {t('dictionary.emptyField', {\n field: t('dictionary.url').toLowerCase(),\n })}\n </Text>\n )}\n </Box>\n );\n}\n"],"names":[],"mappings":";;;;;AAQO,SAAS,UAAU,KAAA,EAAuB;AAC/C,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,iBAAA,CAAkB,wBAAwB,CAAA;AACxD,EAAA,uBACE,IAAA,CAAC,GAAA,EAAA,EAAI,EAAA,EAAG,MAAA,EACN,QAAA,EAAA;AAAA,oBAAA,IAAA,CAAC,QAAK,EAAA,EAAG,GAAA,EAAI,OAAA,EAAQ,YAAA,EAAa,QAAO,MAAA,EACtC,QAAA,EAAA;AAAA,MAAA,GAAA;AAAA,MACA,EAAE,gBAAgB;AAAA,KAAA,EACrB,CAAA;AAAA,IACC,MAAM,GAAA,mBACL,GAAA;AAAA,MAAC,IAAA;AAAA,MAAA;AAAA,QACC,MAAA,EAAO,QAAA;AAAA,QACP,OAAA,EAAQ,YAAA;AAAA,QACR,GAAA,EAAI,YAAA;AAAA,QACJ,IAAA,EAAM,KAAA,CAAM,GAAA,CAAI,UAAA,CAAW,MAAM,IAAI,KAAA,CAAM,GAAA,GAAM,CAAA,EAAA,EAAK,KAAA,CAAM,GAAG,CAAA,CAAA;AAAA,QAE9D,QAAA,EAAA,KAAA,CAAM;AAAA;AAAA,KACT,mBAEA,GAAA,CAAC,IAAA,EAAA,EAAK,EAAA,EAAG,GAAA,EAAI,OAAA,EAAQ,YAAA,EAAa,KAAA,EAAO,EAAE,SAAA,EAAW,QAAA,EAAS,EAC5D,YAAE,uBAAA,EAAyB;AAAA,MAC1B,KAAA,EAAO,CAAA,CAAE,gBAAgB,CAAA,CAAE,WAAA;AAAY,KACxC,CAAA,EACH;AAAA,GAAA,EAEJ,CAAA;AAEJ;;;;"}
@@ -1,14 +1,3 @@
1
- const body2 = {
2
- fontSize: "1rem",
3
- fontWeight: 400,
4
- whiteSpace: "pre-line"
5
- };
6
- const label = {
7
- fontSize: "0.875rem",
8
- fontWeight: 700,
9
- textTransform: "uppercase",
10
- paddingBottom: "0.4rem"
11
- };
12
1
  const formLabel = {
13
2
  fontSize: "0.875rem",
14
3
  fontWeight: 700,
@@ -22,5 +11,5 @@ const formHelperText = {
22
11
  margin: 0
23
12
  };
24
13
 
25
- export { body2, formHelperText, formLabel, label };
14
+ export { formHelperText, formLabel };
26
15
  //# sourceMappingURL=typography.esm.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"typography.esm.js","sources":["../../../src/components/common/typography.ts"],"sourcesContent":["import { SxProps, Theme } from '@mui/material/styles';\n\nexport const body2: SxProps<Theme> = {\n fontSize: '1rem',\n fontWeight: 400,\n whiteSpace: 'pre-line',\n};\n\nexport const label: SxProps<Theme> = {\n fontSize: '0.875rem',\n fontWeight: 700,\n textTransform: 'uppercase',\n paddingBottom: '0.4rem',\n};\n\nexport const formLabel: SxProps<Theme> = {\n fontSize: '0.875rem',\n fontWeight: 700,\n textTransform: 'uppercase',\n color: 'inherit',\n};\n\nexport const formHelperText: SxProps<Theme> = {\n fontSize: '0.875rem',\n fontWeight: 400,\n color: 'inherit',\n margin: 0,\n};\n"],"names":[],"mappings":"AAEO,MAAM,KAAA,GAAwB;AAAA,EACnC,QAAA,EAAU,MAAA;AAAA,EACV,UAAA,EAAY,GAAA;AAAA,EACZ,UAAA,EAAY;AACd;AAEO,MAAM,KAAA,GAAwB;AAAA,EACnC,QAAA,EAAU,UAAA;AAAA,EACV,UAAA,EAAY,GAAA;AAAA,EACZ,aAAA,EAAe,WAAA;AAAA,EACf,aAAA,EAAe;AACjB;AAEO,MAAM,SAAA,GAA4B;AAAA,EACvC,QAAA,EAAU,UAAA;AAAA,EACV,UAAA,EAAY,GAAA;AAAA,EACZ,aAAA,EAAe,WAAA;AAAA,EACf,KAAA,EAAO;AACT;AAEO,MAAM,cAAA,GAAiC;AAAA,EAC5C,QAAA,EAAU,UAAA;AAAA,EACV,UAAA,EAAY,GAAA;AAAA,EACZ,KAAA,EAAO,SAAA;AAAA,EACP,MAAA,EAAQ;AACV;;;;"}
1
+ {"version":3,"file":"typography.esm.js","sources":["../../../src/components/common/typography.ts"],"sourcesContent":["import { SxProps, Theme } from '@mui/material/styles';\n\nexport const formLabel: SxProps<Theme> = {\n fontSize: '0.875rem',\n fontWeight: 700,\n textTransform: 'uppercase',\n color: 'inherit',\n};\n\nexport const formHelperText: SxProps<Theme> = {\n fontSize: '0.875rem',\n fontWeight: 400,\n color: 'inherit',\n margin: 0,\n};\n"],"names":[],"mappings":"AAEO,MAAM,SAAA,GAA4B;AAAA,EACvC,QAAA,EAAU,UAAA;AAAA,EACV,UAAA,EAAY,GAAA;AAAA,EACZ,aAAA,EAAe,WAAA;AAAA,EACf,KAAA,EAAO;AACT;AAEO,MAAM,cAAA,GAAiC;AAAA,EAC5C,QAAA,EAAU,UAAA;AAAA,EACV,UAAA,EAAY,GAAA;AAAA,EACZ,KAAA,EAAO,SAAA;AAAA,EACP,MAAA,EAAQ;AACV;;;;"}
@@ -30,7 +30,7 @@ function RiScStepper({ activeStep }) {
30
30
  t("rosDialog.stepRiscDetails"),
31
31
  t("rosDialog.stepEncryption")
32
32
  ];
33
- return /* @__PURE__ */ jsx(Stepper, { activeStep, alternativeLabel: true, children: steps.map((label) => /* @__PURE__ */ jsx(Step, { children: /* @__PURE__ */ jsx(StepLabel, { children: label }) }, label)) });
33
+ return /* @__PURE__ */ jsx(Stepper, { activeStep, alternativeLabel: true, children: steps.map((label) => /* @__PURE__ */ jsx(Step, { children: /* @__PURE__ */ jsx(StepLabel, { children: /* @__PURE__ */ jsx(Text, { children: label }) }) }, label)) });
34
34
  }
35
35
  function RiScDialog({
36
36
  onClose,
@@ -1 +1 @@
1
- {"version":3,"file":"RiScDialog.esm.js","sources":["../../../src/components/riScDialog/RiScDialog.tsx"],"sourcesContent":["import { useState, useEffect } from 'react';\nimport { RiScWithMetadata } from '../../utils/types';\nimport { emptyRiSc, isDeeplyEqual } from '../../utils/utilityfunctions';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { pluginRiScTranslationRef } from '../../utils/translations';\nimport { useRiScs } from '../../contexts/RiScContext';\nimport { useForm } from 'react-hook-form';\nimport { Step, StepLabel, Stepper } from '@mui/material';\nimport ConfigEncryptionDialog from './ConfigEncryptionDialog';\nimport ConfigRiscInfo from './ConfigRiscInfo';\nimport ConfigInitialRisc from './ConfigInitialRisc';\nimport { Flex, Button, Text } from '@backstage/ui';\nimport styles from './RiScDialog.module.css';\nimport { useDefaultRiScTypeDescriptors } from '../../contexts/DefaultRiScTypesContext.tsx';\nimport DialogComponent from '../dialog/DialogComponent.tsx';\n\nexport enum RiScDialogStates {\n Closed = 0,\n Create = 1,\n EditRiscInfo = 2,\n SelectInitialRisc = 3,\n EditEncryption = 4,\n Delete = 5,\n}\n\ninterface RiScDialogProps {\n onClose: () => void;\n dialogState: RiScDialogStates;\n onDelete: () => void;\n}\n\nfunction RiScStepper({ activeStep }: { activeStep: number }) {\n const { t } = useTranslationRef(pluginRiScTranslationRef);\n\n const steps = [\n t('rosDialog.initialRiscTitle'),\n t('rosDialog.stepRiscDetails'),\n t('rosDialog.stepEncryption'),\n ];\n return (\n <Stepper activeStep={activeStep} alternativeLabel>\n {steps.map(label => (\n <Step key={label}>\n <StepLabel>{label}</StepLabel>\n </Step>\n ))}\n </Stepper>\n );\n}\n\nexport function RiScDialog({\n onClose,\n dialogState,\n onDelete,\n}: RiScDialogProps) {\n const { t } = useTranslationRef(pluginRiScTranslationRef);\n\n const {\n selectedRiSc,\n riScs,\n selectRiSc,\n createNewRiSc,\n deleteRiSc,\n updateRiSc,\n gcpCryptoKeys,\n } = useRiScs();\n const {\n register,\n handleSubmit,\n watch,\n formState: { errors },\n setValue,\n } = useForm<RiScWithMetadata>({\n defaultValues:\n dialogState === RiScDialogStates.EditRiscInfo ||\n dialogState === RiScDialogStates.EditEncryption\n ? selectedRiSc!\n : {\n content: emptyRiSc(),\n sopsConfig: {\n shamir_threshold: 2,\n },\n },\n mode: 'onBlur',\n });\n\n const [activeStep, setActiveStep] = useState(0);\n\n const [switchOn, setSwitchOn] = useState(false);\n\n const { riScSelectedByDefault } = useDefaultRiScTypeDescriptors();\n const [selectedRiScId, setSelectedRiScId] = useState<string | undefined>(\n riScSelectedByDefault?.id,\n );\n useEffect(() => {\n setSelectedRiScId(riScSelectedByDefault?.id);\n }, [riScSelectedByDefault]);\n\n const handleNext = handleSubmit(\n () => {\n if (activeStep === 0) {\n setActiveStep(1);\n }\n if (activeStep === 1) {\n setActiveStep(2);\n }\n },\n // Continue to step 1 even if there are errors, as long as there are no errors in step 0 (the content)\n validationErrors => {\n if (activeStep === 0 && validationErrors.content === undefined) {\n setActiveStep(1);\n }\n },\n );\n\n function handleBack() {\n if (activeStep === 1) {\n setActiveStep(0);\n }\n if (activeStep === 2) {\n setActiveStep(1);\n }\n }\n\n const handleFinish = handleSubmit((data: RiScWithMetadata) => {\n if (dialogState === RiScDialogStates.Create) {\n createNewRiSc(data, switchOn, selectedRiScId);\n } else if (dialogState === RiScDialogStates.Delete) {\n deleteRiSc(() =>\n selectRiSc(riScs && riScs.length > 0 ? riScs[0].id : ''),\n );\n } else {\n // Do manual comparison of contents, as the sopsConfig field contains many values from the backend that are not\n // used or set by the frontend.\n // Check if the additional Age keys are equal, using the single important field, `recipient`\n const areAgeKeysEqual = isDeeplyEqual(\n data.sopsConfig.age?.map(age => age.recipient).sort(),\n selectedRiSc?.sopsConfig.age?.map(age => age.recipient).sort(),\n );\n\n // Check if the GCP keys are equal, using the two important fields, `resource_id` and `created_at`.\n // Comparison uses dictionaries, where resource ids are keys and created at dates are values\n const areGCPKeysEqual = isDeeplyEqual(\n Object.fromEntries(\n data.sopsConfig.gcp_kms?.map(key => [\n key.resource_id,\n key.created_at,\n ]) ?? [],\n ),\n Object.fromEntries(\n selectedRiSc?.sopsConfig.gcp_kms?.map(key => [\n key.resource_id,\n key.created_at,\n ]) ?? [],\n ),\n );\n\n // Only update the risc if it has changed\n if (\n !isDeeplyEqual(data, selectedRiSc, ['sopsConfig']) ||\n !areGCPKeysEqual ||\n !areAgeKeysEqual\n ) {\n updateRiSc(data);\n }\n }\n onClose();\n });\n\n if (dialogState === RiScDialogStates.Create) {\n return (\n <DialogComponent\n isOpen={true}\n onClick={onClose}\n header={t('rosDialog.titleNew')}\n className={styles.createRiscDialog}\n >\n <RiScStepper activeStep={activeStep} />\n <Text\n as=\"h2\"\n variant=\"title-x-small\"\n weight=\"bold\"\n className={styles.subtitle}\n >\n {activeStep === 0 && t('rosDialog.initialRiscTitle')}\n {activeStep === 1 && t('rosDialog.titleAndScope')}\n {activeStep === 2 && t('rosDialog.stepEncryption')}\n </Text>\n {activeStep === 0 && (\n <ConfigInitialRisc\n switchOn={switchOn}\n setSwitchOn={setSwitchOn}\n setValue={setValue}\n selectedRiScId={selectedRiScId}\n setSelectedRiScId={setSelectedRiScId}\n />\n )}\n {activeStep === 1 && (\n <ConfigRiscInfo\n register={register}\n errors={errors}\n setValue={setValue}\n watch={watch}\n />\n )}\n {activeStep === 2 && (\n <ConfigEncryptionDialog\n gcpCryptoKeys={gcpCryptoKeys}\n setValue={setValue}\n state={dialogState}\n register={register}\n errors={errors}\n />\n )}\n <Flex pt=\"16px\" justify=\"between\">\n <Button size=\"medium\" variant=\"secondary\" onClick={onClose}>\n {t('dictionary.cancel')}\n </Button>\n <Flex>\n <Button\n size=\"medium\"\n variant=\"secondary\"\n isDisabled={activeStep === 0}\n onClick={handleBack}\n >\n {t('dictionary.previous')}\n </Button>\n {activeStep < 2 ? (\n <Button size=\"medium\" variant=\"primary\" onClick={handleNext}>\n {t('dictionary.next')}\n </Button>\n ) : (\n <Button size=\"medium\" variant=\"primary\" onClick={handleFinish}>\n {t('dictionary.save')}\n </Button>\n )}\n </Flex>\n </Flex>\n </DialogComponent>\n );\n }\n\n if (dialogState === RiScDialogStates.Delete) {\n return (\n <DialogComponent\n isOpen={true}\n onClick={onClose}\n header={t('deleteDialog.title')}\n className={styles.createRiscDialog}\n >\n <Flex direction=\"column\">\n {t('deleteDialog.confirmationMessage')}\n <Flex justify=\"between\" pt=\"16px\">\n <Button size=\"medium\" variant=\"secondary\" onClick={onClose}>\n {t('dictionary.cancel')}\n </Button>\n <Button size=\"medium\" variant=\"primary\" onClick={handleFinish}>\n {t('dictionary.delete')}\n </Button>\n </Flex>\n </Flex>\n </DialogComponent>\n );\n }\n\n if (dialogState === RiScDialogStates.EditRiscInfo) {\n return (\n <DialogComponent\n isOpen={true}\n onClick={onClose}\n header={t('rosDialog.titleEdit')}\n className={styles.createRiscDialog}\n >\n <ConfigRiscInfo\n register={register}\n errors={errors}\n setValue={setValue}\n watch={watch}\n />\n <Flex justify=\"between\" pt=\"16px\">\n <Button\n size=\"medium\"\n variant=\"tertiary\"\n onClick={onDelete}\n className={styles.deleteButton}\n >\n <i className={`ri-delete-bin-line ${styles.deleteButtonIcon}`} />\n {t('contentHeader.deleteButton')}\n </Button>\n <Flex>\n <Button size=\"medium\" variant=\"secondary\" onClick={onClose}>\n {t('dictionary.cancel')}\n </Button>\n <Button size=\"medium\" variant=\"primary\" onClick={handleFinish}>\n {t('dictionary.save')}\n </Button>\n </Flex>\n </Flex>\n </DialogComponent>\n );\n }\n\n if (dialogState === RiScDialogStates.EditEncryption) {\n return (\n <DialogComponent\n isOpen={true}\n onClick={onClose}\n header={t('rosDialog.editEncryption')}\n className={styles.createRiscDialog}\n >\n <ConfigEncryptionDialog\n gcpCryptoKeys={gcpCryptoKeys}\n sopsData={selectedRiSc?.sopsConfig}\n setValue={setValue}\n state={dialogState}\n register={register}\n errors={errors}\n />\n <Flex justify=\"between\" pt=\"16px\">\n <Button size=\"medium\" variant=\"secondary\" onClick={onClose}>\n {t('dictionary.cancel')}\n </Button>\n <Button size=\"medium\" variant=\"primary\" onClick={handleFinish}>\n {t('dictionary.save')}\n </Button>\n </Flex>\n </DialogComponent>\n );\n }\n\n return null;\n}\n"],"names":["RiScDialogStates"],"mappings":"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"}
1
+ {"version":3,"file":"RiScDialog.esm.js","sources":["../../../src/components/riScDialog/RiScDialog.tsx"],"sourcesContent":["import { useState, useEffect } from 'react';\nimport { RiScWithMetadata } from '../../utils/types';\nimport { emptyRiSc, isDeeplyEqual } from '../../utils/utilityfunctions';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { pluginRiScTranslationRef } from '../../utils/translations';\nimport { useRiScs } from '../../contexts/RiScContext';\nimport { useForm } from 'react-hook-form';\nimport { Step, StepLabel, Stepper } from '@mui/material';\nimport ConfigEncryptionDialog from './ConfigEncryptionDialog';\nimport ConfigRiscInfo from './ConfigRiscInfo';\nimport ConfigInitialRisc from './ConfigInitialRisc';\nimport { Flex, Button, Text } from '@backstage/ui';\nimport styles from './RiScDialog.module.css';\nimport { useDefaultRiScTypeDescriptors } from '../../contexts/DefaultRiScTypesContext.tsx';\nimport DialogComponent from '../dialog/DialogComponent.tsx';\n\nexport enum RiScDialogStates {\n Closed = 0,\n Create = 1,\n EditRiscInfo = 2,\n SelectInitialRisc = 3,\n EditEncryption = 4,\n Delete = 5,\n}\n\ninterface RiScDialogProps {\n onClose: () => void;\n dialogState: RiScDialogStates;\n onDelete: () => void;\n}\n\nfunction RiScStepper({ activeStep }: { activeStep: number }) {\n const { t } = useTranslationRef(pluginRiScTranslationRef);\n\n const steps = [\n t('rosDialog.initialRiscTitle'),\n t('rosDialog.stepRiscDetails'),\n t('rosDialog.stepEncryption'),\n ];\n return (\n <Stepper activeStep={activeStep} alternativeLabel>\n {steps.map(label => (\n <Step key={label}>\n <StepLabel>\n <Text>{label}</Text>\n </StepLabel>\n </Step>\n ))}\n </Stepper>\n );\n}\n\nexport function RiScDialog({\n onClose,\n dialogState,\n onDelete,\n}: RiScDialogProps) {\n const { t } = useTranslationRef(pluginRiScTranslationRef);\n\n const {\n selectedRiSc,\n riScs,\n selectRiSc,\n createNewRiSc,\n deleteRiSc,\n updateRiSc,\n gcpCryptoKeys,\n } = useRiScs();\n const {\n register,\n handleSubmit,\n watch,\n formState: { errors },\n setValue,\n } = useForm<RiScWithMetadata>({\n defaultValues:\n dialogState === RiScDialogStates.EditRiscInfo ||\n dialogState === RiScDialogStates.EditEncryption\n ? selectedRiSc!\n : {\n content: emptyRiSc(),\n sopsConfig: {\n shamir_threshold: 2,\n },\n },\n mode: 'onBlur',\n });\n\n const [activeStep, setActiveStep] = useState(0);\n\n const [switchOn, setSwitchOn] = useState(false);\n\n const { riScSelectedByDefault } = useDefaultRiScTypeDescriptors();\n const [selectedRiScId, setSelectedRiScId] = useState<string | undefined>(\n riScSelectedByDefault?.id,\n );\n useEffect(() => {\n setSelectedRiScId(riScSelectedByDefault?.id);\n }, [riScSelectedByDefault]);\n\n const handleNext = handleSubmit(\n () => {\n if (activeStep === 0) {\n setActiveStep(1);\n }\n if (activeStep === 1) {\n setActiveStep(2);\n }\n },\n // Continue to step 1 even if there are errors, as long as there are no errors in step 0 (the content)\n validationErrors => {\n if (activeStep === 0 && validationErrors.content === undefined) {\n setActiveStep(1);\n }\n },\n );\n\n function handleBack() {\n if (activeStep === 1) {\n setActiveStep(0);\n }\n if (activeStep === 2) {\n setActiveStep(1);\n }\n }\n\n const handleFinish = handleSubmit((data: RiScWithMetadata) => {\n if (dialogState === RiScDialogStates.Create) {\n createNewRiSc(data, switchOn, selectedRiScId);\n } else if (dialogState === RiScDialogStates.Delete) {\n deleteRiSc(() =>\n selectRiSc(riScs && riScs.length > 0 ? riScs[0].id : ''),\n );\n } else {\n // Do manual comparison of contents, as the sopsConfig field contains many values from the backend that are not\n // used or set by the frontend.\n // Check if the additional Age keys are equal, using the single important field, `recipient`\n const areAgeKeysEqual = isDeeplyEqual(\n data.sopsConfig.age?.map(age => age.recipient).sort(),\n selectedRiSc?.sopsConfig.age?.map(age => age.recipient).sort(),\n );\n\n // Check if the GCP keys are equal, using the two important fields, `resource_id` and `created_at`.\n // Comparison uses dictionaries, where resource ids are keys and created at dates are values\n const areGCPKeysEqual = isDeeplyEqual(\n Object.fromEntries(\n data.sopsConfig.gcp_kms?.map(key => [\n key.resource_id,\n key.created_at,\n ]) ?? [],\n ),\n Object.fromEntries(\n selectedRiSc?.sopsConfig.gcp_kms?.map(key => [\n key.resource_id,\n key.created_at,\n ]) ?? [],\n ),\n );\n\n // Only update the risc if it has changed\n if (\n !isDeeplyEqual(data, selectedRiSc, ['sopsConfig']) ||\n !areGCPKeysEqual ||\n !areAgeKeysEqual\n ) {\n updateRiSc(data);\n }\n }\n onClose();\n });\n\n if (dialogState === RiScDialogStates.Create) {\n return (\n <DialogComponent\n isOpen={true}\n onClick={onClose}\n header={t('rosDialog.titleNew')}\n className={styles.createRiscDialog}\n >\n <RiScStepper activeStep={activeStep} />\n <Text\n as=\"h2\"\n variant=\"title-x-small\"\n weight=\"bold\"\n className={styles.subtitle}\n >\n {activeStep === 0 && t('rosDialog.initialRiscTitle')}\n {activeStep === 1 && t('rosDialog.titleAndScope')}\n {activeStep === 2 && t('rosDialog.stepEncryption')}\n </Text>\n {activeStep === 0 && (\n <ConfigInitialRisc\n switchOn={switchOn}\n setSwitchOn={setSwitchOn}\n setValue={setValue}\n selectedRiScId={selectedRiScId}\n setSelectedRiScId={setSelectedRiScId}\n />\n )}\n {activeStep === 1 && (\n <ConfigRiscInfo\n register={register}\n errors={errors}\n setValue={setValue}\n watch={watch}\n />\n )}\n {activeStep === 2 && (\n <ConfigEncryptionDialog\n gcpCryptoKeys={gcpCryptoKeys}\n setValue={setValue}\n state={dialogState}\n register={register}\n errors={errors}\n />\n )}\n <Flex pt=\"16px\" justify=\"between\">\n <Button size=\"medium\" variant=\"secondary\" onClick={onClose}>\n {t('dictionary.cancel')}\n </Button>\n <Flex>\n <Button\n size=\"medium\"\n variant=\"secondary\"\n isDisabled={activeStep === 0}\n onClick={handleBack}\n >\n {t('dictionary.previous')}\n </Button>\n {activeStep < 2 ? (\n <Button size=\"medium\" variant=\"primary\" onClick={handleNext}>\n {t('dictionary.next')}\n </Button>\n ) : (\n <Button size=\"medium\" variant=\"primary\" onClick={handleFinish}>\n {t('dictionary.save')}\n </Button>\n )}\n </Flex>\n </Flex>\n </DialogComponent>\n );\n }\n\n if (dialogState === RiScDialogStates.Delete) {\n return (\n <DialogComponent\n isOpen={true}\n onClick={onClose}\n header={t('deleteDialog.title')}\n className={styles.createRiscDialog}\n >\n <Flex direction=\"column\">\n {t('deleteDialog.confirmationMessage')}\n <Flex justify=\"between\" pt=\"16px\">\n <Button size=\"medium\" variant=\"secondary\" onClick={onClose}>\n {t('dictionary.cancel')}\n </Button>\n <Button size=\"medium\" variant=\"primary\" onClick={handleFinish}>\n {t('dictionary.delete')}\n </Button>\n </Flex>\n </Flex>\n </DialogComponent>\n );\n }\n\n if (dialogState === RiScDialogStates.EditRiscInfo) {\n return (\n <DialogComponent\n isOpen={true}\n onClick={onClose}\n header={t('rosDialog.titleEdit')}\n className={styles.createRiscDialog}\n >\n <ConfigRiscInfo\n register={register}\n errors={errors}\n setValue={setValue}\n watch={watch}\n />\n <Flex justify=\"between\" pt=\"16px\">\n <Button\n size=\"medium\"\n variant=\"tertiary\"\n onClick={onDelete}\n className={styles.deleteButton}\n >\n <i className={`ri-delete-bin-line ${styles.deleteButtonIcon}`} />\n {t('contentHeader.deleteButton')}\n </Button>\n <Flex>\n <Button size=\"medium\" variant=\"secondary\" onClick={onClose}>\n {t('dictionary.cancel')}\n </Button>\n <Button size=\"medium\" variant=\"primary\" onClick={handleFinish}>\n {t('dictionary.save')}\n </Button>\n </Flex>\n </Flex>\n </DialogComponent>\n );\n }\n\n if (dialogState === RiScDialogStates.EditEncryption) {\n return (\n <DialogComponent\n isOpen={true}\n onClick={onClose}\n header={t('rosDialog.editEncryption')}\n className={styles.createRiscDialog}\n >\n <ConfigEncryptionDialog\n gcpCryptoKeys={gcpCryptoKeys}\n sopsData={selectedRiSc?.sopsConfig}\n setValue={setValue}\n state={dialogState}\n register={register}\n errors={errors}\n />\n <Flex justify=\"between\" pt=\"16px\">\n <Button size=\"medium\" variant=\"secondary\" onClick={onClose}>\n {t('dictionary.cancel')}\n </Button>\n <Button size=\"medium\" variant=\"primary\" onClick={handleFinish}>\n {t('dictionary.save')}\n </Button>\n </Flex>\n </DialogComponent>\n );\n }\n\n return null;\n}\n"],"names":["RiScDialogStates"],"mappings":"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"}
@@ -8,15 +8,24 @@ import { formatNumber } from '../../utils/utilityfunctions.esm.js';
8
8
  import { EstimatedRiskInfoDialog } from './EstimatedRiskInfoDialog.esm.js';
9
9
  import { Box, Text, Flex } from '@backstage/ui';
10
10
  import styles from './AggregatedCost.module.css.esm.js';
11
+ import { calcRiskCostOfRiSc } from '../../utils/risk.esm.js';
12
+ import { RiskMatrixTabs } from './utils.esm.js';
11
13
 
12
- function AggregatedCost({ riSc, initialRisk }) {
14
+ function AggregatedCost({ riSc, riskType }) {
13
15
  const { t } = useTranslationRef(pluginRiScTranslationRef);
14
16
  const [showDialog, setShowDialog] = useState(false);
15
- const cost = riSc.scenarios.map((scenario) => {
16
- return initialRisk ? scenario.risk.probability * scenario.risk.consequence : scenario.remainingRisk.probability * scenario.remainingRisk.consequence;
17
- }).reduce((a, b) => a + b, 0);
17
+ const cost = calcRiskCostOfRiSc(riSc, riskType);
18
+ const riskLabel = {
19
+ [RiskMatrixTabs.initialRisk]: t("dictionary.initialRisk"),
20
+ [RiskMatrixTabs.remainingRisk]: t("dictionary.restRisk"),
21
+ [RiskMatrixTabs.currentRisk]: t("dictionary.currentRisk")
22
+ };
18
23
  return /* @__PURE__ */ jsxs(Box, { className: styles.boxStyle, children: [
19
- /* @__PURE__ */ jsx(Text, { as: "h3", variant: "body-large", weight: "bold", children: t("riskMatrix.estimatedRisk.title") }),
24
+ /* @__PURE__ */ jsxs(Text, { as: "h3", variant: "body-large", weight: "bold", children: [
25
+ t("riskMatrix.estimatedRisk.title"),
26
+ " ",
27
+ riskType && `(${riskLabel[riskType]})`
28
+ ] }),
20
29
  /* @__PURE__ */ jsxs(Flex, { align: "center", gap: "0", children: [
21
30
  /* @__PURE__ */ jsxs(Text, { variant: "body-large", children: [
22
31
  formatNumber(cost, t),
@@ -1 +1 @@
1
- {"version":3,"file":"AggregatedCost.esm.js","sources":["../../../src/components/riskMatrix/AggregatedCost.tsx"],"sourcesContent":["import { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { IconButton } from '@material-ui/core';\nimport InfoIcon from '@mui/icons-material/Info';\nimport { useState } from 'react';\nimport { pluginRiScTranslationRef } from '../../utils/translations';\nimport { RiSc } from '../../utils/types';\nimport { formatNumber } from '../../utils/utilityfunctions';\nimport { EstimatedRiskInfoDialog } from './EstimatedRiskInfoDialog';\nimport { Box, Flex, Text } from '@backstage/ui';\nimport styles from './AggregatedCost.module.css';\n\ninterface AggregatedCostProps {\n riSc: RiSc;\n initialRisk: boolean;\n}\n\nexport function AggregatedCost({ riSc, initialRisk }: AggregatedCostProps) {\n const { t } = useTranslationRef(pluginRiScTranslationRef);\n\n const [showDialog, setShowDialog] = useState(false);\n\n const cost = riSc.scenarios\n .map(scenario => {\n return initialRisk\n ? scenario.risk.probability * scenario.risk.consequence\n : scenario.remainingRisk.probability *\n scenario.remainingRisk.consequence;\n })\n .reduce((a, b) => a + b, 0);\n\n return (\n <Box className={styles.boxStyle}>\n <Text as=\"h3\" variant=\"body-large\" weight=\"bold\">\n {t('riskMatrix.estimatedRisk.title')}\n </Text>\n <Flex align=\"center\" gap=\"0\">\n <Text variant=\"body-large\">\n {formatNumber(cost, t)}{' '}\n {t('riskMatrix.estimatedRisk.unit.nokPerYear')}\n </Text>\n <IconButton size=\"small\" onClick={() => setShowDialog(true)}>\n <InfoIcon />\n </IconButton>\n </Flex>\n <EstimatedRiskInfoDialog\n isOpen={showDialog}\n onClose={() => setShowDialog(false)}\n />\n </Box>\n );\n}\n"],"names":[],"mappings":";;;;;;;;;;;AAgBO,SAAS,cAAA,CAAe,EAAE,IAAA,EAAM,WAAA,EAAY,EAAwB;AACzE,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,iBAAA,CAAkB,wBAAwB,CAAA;AAExD,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAI,SAAS,KAAK,CAAA;AAElD,EAAA,MAAM,IAAA,GAAO,IAAA,CAAK,SAAA,CACf,GAAA,CAAI,CAAA,QAAA,KAAY;AACf,IAAA,OAAO,WAAA,GACH,QAAA,CAAS,IAAA,CAAK,WAAA,GAAc,QAAA,CAAS,IAAA,CAAK,WAAA,GAC1C,QAAA,CAAS,aAAA,CAAc,WAAA,GACrB,QAAA,CAAS,aAAA,CAAc,WAAA;AAAA,EAC/B,CAAC,EACA,MAAA,CAAO,CAAC,GAAG,CAAA,KAAM,CAAA,GAAI,GAAG,CAAC,CAAA;AAE5B,EAAA,uBACE,IAAA,CAAC,GAAA,EAAA,EAAI,SAAA,EAAW,MAAA,CAAO,QAAA,EACrB,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,IAAA,EAAA,EAAK,IAAG,IAAA,EAAK,OAAA,EAAQ,cAAa,MAAA,EAAO,MAAA,EACvC,QAAA,EAAA,CAAA,CAAE,gCAAgC,CAAA,EACrC,CAAA;AAAA,oBACA,IAAA,CAAC,IAAA,EAAA,EAAK,KAAA,EAAM,QAAA,EAAS,KAAI,GAAA,EACvB,QAAA,EAAA;AAAA,sBAAA,IAAA,CAAC,IAAA,EAAA,EAAK,SAAQ,YAAA,EACX,QAAA,EAAA;AAAA,QAAA,YAAA,CAAa,MAAM,CAAC,CAAA;AAAA,QAAG,GAAA;AAAA,QACvB,EAAE,0CAA0C;AAAA,OAAA,EAC/C,CAAA;AAAA,sBACA,GAAA,CAAC,UAAA,EAAA,EAAW,IAAA,EAAK,OAAA,EAAQ,OAAA,EAAS,MAAM,aAAA,CAAc,IAAI,CAAA,EACxD,QAAA,kBAAA,GAAA,CAAC,QAAA,EAAA,EAAS,CAAA,EACZ;AAAA,KAAA,EACF,CAAA;AAAA,oBACA,GAAA;AAAA,MAAC,uBAAA;AAAA,MAAA;AAAA,QACC,MAAA,EAAQ,UAAA;AAAA,QACR,OAAA,EAAS,MAAM,aAAA,CAAc,KAAK;AAAA;AAAA;AACpC,GAAA,EACF,CAAA;AAEJ;;;;"}
1
+ {"version":3,"file":"AggregatedCost.esm.js","sources":["../../../src/components/riskMatrix/AggregatedCost.tsx"],"sourcesContent":["import { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { IconButton } from '@material-ui/core';\nimport InfoIcon from '@mui/icons-material/Info';\nimport { useState } from 'react';\nimport { pluginRiScTranslationRef } from '../../utils/translations';\nimport { RiSc } from '../../utils/types';\nimport { formatNumber } from '../../utils/utilityfunctions';\nimport { EstimatedRiskInfoDialog } from './EstimatedRiskInfoDialog';\nimport { Box, Flex, Text } from '@backstage/ui';\nimport styles from './AggregatedCost.module.css';\nimport { calcRiskCostOfRiSc } from '../../utils/risk';\nimport { RiskMatrixTabs } from './utils';\n\ninterface AggregatedCostProps {\n riSc: RiSc;\n riskType?: RiskMatrixTabs;\n}\n\nexport function AggregatedCost({ riSc, riskType }: AggregatedCostProps) {\n const { t } = useTranslationRef(pluginRiScTranslationRef);\n\n const [showDialog, setShowDialog] = useState(false);\n\n const cost = calcRiskCostOfRiSc(riSc, riskType);\n\n const riskLabel = {\n [RiskMatrixTabs.initialRisk]: t('dictionary.initialRisk'),\n [RiskMatrixTabs.remainingRisk]: t('dictionary.restRisk'),\n [RiskMatrixTabs.currentRisk]: t('dictionary.currentRisk'),\n };\n\n return (\n <Box className={styles.boxStyle}>\n <Text as=\"h3\" variant=\"body-large\" weight=\"bold\">\n {t('riskMatrix.estimatedRisk.title')}{' '}\n {riskType && `(${riskLabel[riskType]})`}\n </Text>\n <Flex align=\"center\" gap=\"0\">\n <Text variant=\"body-large\">\n {formatNumber(cost, t)}{' '}\n {t('riskMatrix.estimatedRisk.unit.nokPerYear')}\n </Text>\n <IconButton size=\"small\" onClick={() => setShowDialog(true)}>\n <InfoIcon />\n </IconButton>\n </Flex>\n <EstimatedRiskInfoDialog\n isOpen={showDialog}\n onClose={() => setShowDialog(false)}\n />\n </Box>\n );\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;AAkBO,SAAS,cAAA,CAAe,EAAE,IAAA,EAAM,QAAA,EAAS,EAAwB;AACtE,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,iBAAA,CAAkB,wBAAwB,CAAA;AAExD,EAAA,MAAM,CAAC,UAAA,EAAY,aAAa,CAAA,GAAI,SAAS,KAAK,CAAA;AAElD,EAAA,MAAM,IAAA,GAAO,kBAAA,CAAmB,IAAA,EAAM,QAAQ,CAAA;AAE9C,EAAA,MAAM,SAAA,GAAY;AAAA,IAChB,CAAC,cAAA,CAAe,WAAW,GAAG,EAAE,wBAAwB,CAAA;AAAA,IACxD,CAAC,cAAA,CAAe,aAAa,GAAG,EAAE,qBAAqB,CAAA;AAAA,IACvD,CAAC,cAAA,CAAe,WAAW,GAAG,EAAE,wBAAwB;AAAA,GAC1D;AAEA,EAAA,uBACE,IAAA,CAAC,GAAA,EAAA,EAAI,SAAA,EAAW,MAAA,CAAO,QAAA,EACrB,QAAA,EAAA;AAAA,oBAAA,IAAA,CAAC,QAAK,EAAA,EAAG,IAAA,EAAK,OAAA,EAAQ,YAAA,EAAa,QAAO,MAAA,EACvC,QAAA,EAAA;AAAA,MAAA,CAAA,CAAE,gCAAgC,CAAA;AAAA,MAAG,GAAA;AAAA,MACrC,QAAA,IAAY,CAAA,CAAA,EAAI,SAAA,CAAU,QAAQ,CAAC,CAAA,CAAA;AAAA,KAAA,EACtC,CAAA;AAAA,oBACA,IAAA,CAAC,IAAA,EAAA,EAAK,KAAA,EAAM,QAAA,EAAS,KAAI,GAAA,EACvB,QAAA,EAAA;AAAA,sBAAA,IAAA,CAAC,IAAA,EAAA,EAAK,SAAQ,YAAA,EACX,QAAA,EAAA;AAAA,QAAA,YAAA,CAAa,MAAM,CAAC,CAAA;AAAA,QAAG,GAAA;AAAA,QACvB,EAAE,0CAA0C;AAAA,OAAA,EAC/C,CAAA;AAAA,sBACA,GAAA,CAAC,UAAA,EAAA,EAAW,IAAA,EAAK,OAAA,EAAQ,OAAA,EAAS,MAAM,aAAA,CAAc,IAAI,CAAA,EACxD,QAAA,kBAAA,GAAA,CAAC,QAAA,EAAA,EAAS,CAAA,EACZ;AAAA,KAAA,EACF,CAAA;AAAA,oBACA,GAAA;AAAA,MAAC,uBAAA;AAAA,MAAA;AAAA,QACC,MAAA,EAAQ,UAAA;AAAA,QACR,OAAA,EAAS,MAAM,aAAA,CAAc,KAAK;AAAA;AAAA;AACpC,GAAA,EACF,CAAA;AAEJ;;;;"}
@@ -0,0 +1,124 @@
1
+ import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
2
+ import { useTranslationRef } from '@backstage/core-plugin-api/alpha';
3
+ import { pluginRiScTranslationRef } from '../../utils/translations.esm.js';
4
+ import { Flex, Text, Box } from '@backstage/ui';
5
+ import { ActionStatusOptions } from '../../utils/constants.esm.js';
6
+ import { calcRiskCostOfRiSc, getRiskGradient } from '../../utils/risk.esm.js';
7
+ import { RiskMatrixTabs } from './utils.esm.js';
8
+ import styles from './CurrentRisk.module.css.esm.js';
9
+ import { formatNumber } from '../../utils/utilityfunctions.esm.js';
10
+
11
+ function CurrentRisk({ risc }) {
12
+ const { t } = useTranslationRef(pluginRiScTranslationRef);
13
+ const actionsOk = risc.content.scenarios.reduce(
14
+ (total, scenario) => total + scenario.actions.filter(
15
+ (action) => action.status === ActionStatusOptions.OK
16
+ ).length,
17
+ 0
18
+ );
19
+ const initialRiskCost = calcRiskCostOfRiSc(
20
+ risc.content,
21
+ RiskMatrixTabs.initialRisk
22
+ );
23
+ const remainingRiskCost = calcRiskCostOfRiSc(
24
+ risc.content,
25
+ RiskMatrixTabs.remainingRisk
26
+ );
27
+ const estimatedCurrentCost = calcRiskCostOfRiSc(
28
+ risc.content,
29
+ RiskMatrixTabs.currentRisk
30
+ );
31
+ const costReduction = initialRiskCost - remainingRiskCost;
32
+ const costReductionPercentage = costReduction > 0 ? (initialRiskCost - estimatedCurrentCost) / costReduction * 100 : 0;
33
+ const clampedPercentage = Math.max(
34
+ 0,
35
+ Math.min(100, Number(costReductionPercentage.toFixed(2)))
36
+ );
37
+ let labelTransform = "translateX(-50%)";
38
+ if (clampedPercentage <= 5) {
39
+ labelTransform = "translateX(0%)";
40
+ } else if (clampedPercentage >= 95) {
41
+ labelTransform = "translateX(-100%)";
42
+ }
43
+ const reduction = formatNumber(initialRiskCost - estimatedCurrentCost, t);
44
+ const description = t("riskMatrix.currentRisk.description", {
45
+ actionsOk: String(actionsOk),
46
+ reduction
47
+ });
48
+ return /* @__PURE__ */ jsxs(Flex, { direction: "column", pt: "30px", children: [
49
+ /* @__PURE__ */ jsxs(Flex, { direction: "column", pb: "16px", children: [
50
+ /* @__PURE__ */ jsx(Text, { variant: "title-x-small", weight: "bold", children: t("riskMatrix.currentRisk.title") }),
51
+ /* @__PURE__ */ jsxs(Flex, { direction: "column", gap: "0", children: [
52
+ /* @__PURE__ */ jsxs(Flex, { justify: "between", px: "4px", align: "end", pb: "4px", children: [
53
+ /* @__PURE__ */ jsxs(Flex, { direction: "column", align: "start", gap: "0", children: [
54
+ /* @__PURE__ */ jsxs(Text, { variant: "body-small", weight: "bold", children: [
55
+ formatNumber(initialRiskCost, t),
56
+ " ",
57
+ t("riskMatrix.estimatedRisk.unit.nokPerYear")
58
+ ] }),
59
+ /* @__PURE__ */ jsxs(Text, { variant: "body-medium", children: [
60
+ "\u2190 ",
61
+ t("dictionary.initialRisk")
62
+ ] })
63
+ ] }),
64
+ /* @__PURE__ */ jsxs(Flex, { direction: "column", align: "end", gap: "0", children: [
65
+ /* @__PURE__ */ jsxs(Text, { variant: "body-small", weight: "bold", children: [
66
+ formatNumber(remainingRiskCost, t),
67
+ " ",
68
+ t("riskMatrix.estimatedRisk.unit.nokPerYear")
69
+ ] }),
70
+ /* @__PURE__ */ jsxs(Text, { variant: "body-medium", children: [
71
+ t("dictionary.restRisk"),
72
+ " \u2192"
73
+ ] })
74
+ ] })
75
+ ] }),
76
+ /* @__PURE__ */ jsxs(Box, { className: styles.currentRiskBarWrapper, children: [
77
+ /* @__PURE__ */ jsx(Box, { className: styles.currentRiskBarContainer, children: initialRiskCost > 0 && /* @__PURE__ */ jsxs(Fragment, { children: [
78
+ /* @__PURE__ */ jsx(
79
+ Flex,
80
+ {
81
+ align: "center",
82
+ justify: "end",
83
+ className: styles.currentRiskBarFill,
84
+ style: {
85
+ background: getRiskGradient()
86
+ }
87
+ }
88
+ ),
89
+ /* @__PURE__ */ jsx(
90
+ Box,
91
+ {
92
+ className: styles.currentRiskMarker,
93
+ style: {
94
+ left: `${clampedPercentage}%`
95
+ }
96
+ }
97
+ )
98
+ ] }) }),
99
+ /* @__PURE__ */ jsx(
100
+ Flex,
101
+ {
102
+ className: styles.currentRiskPercentageLabel,
103
+ style: {
104
+ left: `${clampedPercentage}%`,
105
+ transform: labelTransform
106
+ },
107
+ children: /* @__PURE__ */ jsx(Text, { variant: "body-medium", weight: "bold", children: t("dictionary.currentRisk") })
108
+ }
109
+ )
110
+ ] })
111
+ ] })
112
+ ] }),
113
+ /* @__PURE__ */ jsx(Flex, { children: /* @__PURE__ */ jsx(
114
+ Text,
115
+ {
116
+ variant: "body-large",
117
+ dangerouslySetInnerHTML: { __html: description }
118
+ }
119
+ ) })
120
+ ] });
121
+ }
122
+
123
+ export { CurrentRisk };
124
+ //# sourceMappingURL=CurrentRisk.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CurrentRisk.esm.js","sources":["../../../src/components/riskMatrix/CurrentRisk.tsx"],"sourcesContent":["import { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { pluginRiScTranslationRef } from '../../utils/translations';\nimport { RiScWithMetadata } from '../../utils/types';\nimport { Box, Text, Flex } from '@backstage/ui';\nimport { ActionStatusOptions } from '../../utils/constants';\nimport { calcRiskCostOfRiSc, getRiskGradient } from '../../utils/risk';\nimport { RiskMatrixTabs } from './utils';\nimport styles from './CurrentRisk.module.css';\nimport { formatNumber } from '../../utils/utilityfunctions';\n\ntype CurrentRiskProps = {\n risc: RiScWithMetadata;\n};\n\nexport function CurrentRisk({ risc }: CurrentRiskProps) {\n const { t } = useTranslationRef(pluginRiScTranslationRef);\n\n const actionsOk = risc.content.scenarios.reduce(\n (total, scenario) =>\n total +\n scenario.actions.filter(\n action => action.status === ActionStatusOptions.OK,\n ).length,\n 0,\n );\n\n const initialRiskCost = calcRiskCostOfRiSc(\n risc.content,\n RiskMatrixTabs.initialRisk,\n );\n const remainingRiskCost = calcRiskCostOfRiSc(\n risc.content,\n RiskMatrixTabs.remainingRisk,\n );\n const estimatedCurrentCost = calcRiskCostOfRiSc(\n risc.content,\n RiskMatrixTabs.currentRisk,\n );\n\n const costReduction = initialRiskCost - remainingRiskCost;\n\n const costReductionPercentage =\n costReduction > 0\n ? ((initialRiskCost - estimatedCurrentCost) / costReduction) * 100\n : 0;\n\n const clampedPercentage = Math.max(\n 0,\n Math.min(100, Number(costReductionPercentage.toFixed(2))),\n );\n\n let labelTransform = 'translateX(-50%)';\n if (clampedPercentage <= 5) {\n labelTransform = 'translateX(0%)';\n } else if (clampedPercentage >= 95) {\n labelTransform = 'translateX(-100%)';\n }\n\n const reduction = formatNumber(initialRiskCost - estimatedCurrentCost, t);\n\n const description = t('riskMatrix.currentRisk.description', {\n actionsOk: String(actionsOk),\n reduction,\n });\n\n return (\n <Flex direction=\"column\" pt=\"30px\">\n <Flex direction=\"column\" pb=\"16px\">\n <Text variant=\"title-x-small\" weight=\"bold\">\n {t('riskMatrix.currentRisk.title')}\n </Text>\n <Flex direction=\"column\" gap=\"0\">\n <Flex justify=\"between\" px=\"4px\" align=\"end\" pb=\"4px\">\n <Flex direction=\"column\" align=\"start\" gap=\"0\">\n <Text variant=\"body-small\" weight=\"bold\">\n {formatNumber(initialRiskCost, t)}{' '}\n {t('riskMatrix.estimatedRisk.unit.nokPerYear')}\n </Text>\n <Text variant=\"body-medium\">← {t('dictionary.initialRisk')}</Text>\n </Flex>\n <Flex direction=\"column\" align=\"end\" gap=\"0\">\n <Text variant=\"body-small\" weight=\"bold\">\n {formatNumber(remainingRiskCost, t)}{' '}\n {t('riskMatrix.estimatedRisk.unit.nokPerYear')}\n </Text>\n <Text variant=\"body-medium\">{t('dictionary.restRisk')} →</Text>\n </Flex>\n </Flex>\n <Box className={styles.currentRiskBarWrapper}>\n <Box className={styles.currentRiskBarContainer}>\n {initialRiskCost > 0 && (\n <>\n <Flex\n align=\"center\"\n justify=\"end\"\n className={styles.currentRiskBarFill}\n style={{\n background: getRiskGradient(),\n }}\n />\n <Box\n className={styles.currentRiskMarker}\n style={{\n left: `${clampedPercentage}%`,\n }}\n />\n </>\n )}\n </Box>\n <Flex\n className={styles.currentRiskPercentageLabel}\n style={{\n left: `${clampedPercentage}%`,\n transform: labelTransform,\n }}\n >\n <Text variant=\"body-medium\" weight=\"bold\">\n {t('dictionary.currentRisk')}\n </Text>\n </Flex>\n </Box>\n </Flex>\n </Flex>\n\n <Flex>\n <Text\n variant=\"body-large\"\n dangerouslySetInnerHTML={{ __html: description }}\n />\n </Flex>\n </Flex>\n );\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import styleInject from '../../node_modules_dist/style-inject/dist/style-inject.es.esm.js';
2
+
3
+ var css_248z = ".CurrentRisk-module_currentRiskBarWrapper__ceTOm {\n position: relative;\n}\n\n.CurrentRisk-module_currentRiskBarContainer__i7eQY {\n width: 100%;\n height: 50px;\n border-radius: 8px;\n overflow: hidden;\n position: relative;\n border: 2px solid black;\n}\n\n.CurrentRisk-module_currentRiskBarFill__cr5qc {\n position: absolute;\n width: 100%;\n left: 0;\n top: 0;\n bottom: 0;\n}\n\n.CurrentRisk-module_currentRiskMarker__cJmvA {\n position: absolute;\n top: 0;\n bottom: 0;\n width: 2px;\n background-color: var(--bui-black);\n transform: translateX(-50%);\n transition: left 0.3s ease;\n}\n\n.CurrentRisk-module_currentRiskPercentageLabel__WAr-Q {\n position: absolute;\n top: calc(100% + 6px);\n transform: translateX(-50%);\n white-space: nowrap;\n pointer-events: none;\n transition: left 0.3s ease;\n}\n";
4
+ var styles = {"currentRiskBarWrapper":"CurrentRisk-module_currentRiskBarWrapper__ceTOm","currentRiskBarContainer":"CurrentRisk-module_currentRiskBarContainer__i7eQY","currentRiskBarFill":"CurrentRisk-module_currentRiskBarFill__cr5qc","currentRiskMarker":"CurrentRisk-module_currentRiskMarker__cJmvA","currentRiskPercentageLabel":"CurrentRisk-module_currentRiskPercentageLabel__WAr-Q"};
5
+ styleInject(css_248z);
6
+
7
+ export { styles as default };
8
+ //# sourceMappingURL=CurrentRisk.module.css.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CurrentRisk.module.css.esm.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;"}
@@ -1,23 +1,20 @@
1
1
  import { jsxs, jsx } from 'react/jsx-runtime';
2
2
  import { useState, Fragment } from 'react';
3
- import Box from '@mui/material/Box';
4
3
  import { AggregatedCost } from './AggregatedCost.esm.js';
5
4
  import { MatrixTabs } from './Tabs.esm.js';
6
5
  import { riskMatrix } from '../../utils/constants.esm.js';
7
6
  import { useTranslationRef } from '@backstage/core-plugin-api/alpha';
8
7
  import { pluginRiScTranslationRef } from '../../utils/translations.esm.js';
9
- import { useFontStyles } from '../../utils/style.esm.js';
10
- import { useRiskMatrixStyles } from './riskMatrixStyle.esm.js';
11
8
  import { RiskMatrixTabs } from './utils.esm.js';
12
- import { Card, CardHeader, Text, CardBody } from '@backstage/ui';
9
+ import { Card, CardHeader, Text, CardBody, Box } from '@backstage/ui';
13
10
  import { RiskMatrixSquare } from './RiskMatrixSquare.esm.js';
11
+ import { CurrentRisk } from './CurrentRisk.esm.js';
12
+ import styles from './RiskMatrix.module.css.esm.js';
14
13
 
15
14
  function RiskMatrix({
16
15
  riScWithMetadata
17
16
  }) {
18
17
  const { t } = useTranslationRef(pluginRiScTranslationRef);
19
- const { label2 } = useFontStyles();
20
- const { grid, gridWrapper, konsekvens, sannsynlighet, text, centered } = useRiskMatrixStyles();
21
18
  const [tab, setTab] = useState(RiskMatrixTabs.initialRisk);
22
19
  return /* @__PURE__ */ jsxs(Card, { children: [
23
20
  /* @__PURE__ */ jsx(CardHeader, { children: /* @__PURE__ */ jsx(Text, { variant: "title-small", weight: "bold", children: t("riskMatrix.title") }) }),
@@ -29,27 +26,21 @@ function RiskMatrix({
29
26
  style: {
30
27
  marginTop: "18px"
31
28
  },
32
- children: /* @__PURE__ */ jsx(
33
- AggregatedCost,
34
- {
35
- riSc: riScWithMetadata.content,
36
- initialRisk: tab === RiskMatrixTabs.initialRisk
37
- }
38
- )
29
+ children: /* @__PURE__ */ jsx(AggregatedCost, { riSc: riScWithMetadata.content, riskType: tab })
39
30
  }
40
31
  ),
41
- /* @__PURE__ */ jsx(Box, { className: gridWrapper, children: /* @__PURE__ */ jsxs(Box, { className: grid, children: [
42
- /* @__PURE__ */ jsx(Box, { className: konsekvens, children: /* @__PURE__ */ jsx(
32
+ tab === RiskMatrixTabs.currentRisk ? /* @__PURE__ */ jsx(Box, { children: /* @__PURE__ */ jsx(CurrentRisk, { risc: riScWithMetadata }) }) : /* @__PURE__ */ jsx(Box, { className: styles.gridWrapper, children: /* @__PURE__ */ jsxs(Box, { className: styles.grid, children: [
33
+ /* @__PURE__ */ jsx(Box, { className: styles.konsekvens, children: /* @__PURE__ */ jsx(
43
34
  Text,
44
35
  {
45
- variant: "body-large",
36
+ variant: "title-x-small",
46
37
  weight: "bold",
47
- className: `${centered} ${label2}`,
38
+ className: styles.centered,
48
39
  children: t("dictionary.consequence")
49
40
  }
50
41
  ) }),
51
42
  riskMatrix.map((row, rowIndex) => /* @__PURE__ */ jsxs(Fragment, { children: [
52
- /* @__PURE__ */ jsx(Box, { className: centered, children: /* @__PURE__ */ jsx(Text, { variant: "title-x-small", weight: "bold", className: text, children: 5 - rowIndex }) }),
43
+ /* @__PURE__ */ jsx(Box, { className: styles.centered, children: /* @__PURE__ */ jsx(Text, { variant: "title-x-small", weight: "bold", children: 5 - rowIndex }) }),
53
44
  row.map((_, colIndex) => /* @__PURE__ */ jsx(
54
45
  RiskMatrixSquare,
55
46
  {
@@ -63,15 +54,15 @@ function RiskMatrix({
63
54
  }
64
55
  ))
65
56
  ] }, rowIndex)),
66
- /* @__PURE__ */ jsx(Box, { className: centered }),
67
- /* @__PURE__ */ jsx(Box, { className: centered }),
68
- riskMatrix.map((_, col) => /* @__PURE__ */ jsx(Box, { className: centered, children: /* @__PURE__ */ jsx(Text, { variant: "title-x-small", weight: "bold", className: text, children: col + 1 }) }, col)),
69
- /* @__PURE__ */ jsx(Box, { className: sannsynlighet, children: /* @__PURE__ */ jsx(
57
+ /* @__PURE__ */ jsx(Box, { className: styles.centered }),
58
+ /* @__PURE__ */ jsx(Box, { className: styles.centered }),
59
+ riskMatrix.map((_, col) => /* @__PURE__ */ jsx(Box, { className: styles.centered, children: /* @__PURE__ */ jsx(Text, { variant: "title-x-small", weight: "bold", children: col + 1 }) }, col)),
60
+ /* @__PURE__ */ jsx(Box, { className: styles.sannsynlighet, children: /* @__PURE__ */ jsx(
70
61
  Text,
71
62
  {
72
63
  weight: "bold",
73
- variant: "body-large",
74
- className: `${centered} ${label2}`,
64
+ variant: "title-x-small",
65
+ className: styles.centered,
75
66
  children: t("dictionary.probability")
76
67
  }
77
68
  ) })