@kartverket/backstage-plugin-risk-scorecard 8.0.1 → 8.1.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 (28) hide show
  1. package/dist/PluginRoot.esm.js +9 -1
  2. package/dist/PluginRoot.esm.js.map +1 -1
  3. package/dist/components/predefinedScenarios/PredefinedScenariosApprovalTooltip.esm.js +34 -0
  4. package/dist/components/predefinedScenarios/PredefinedScenariosApprovalTooltip.esm.js.map +1 -0
  5. package/dist/components/predefinedScenarios/PredefinedScenariosBanner.esm.js +76 -0
  6. package/dist/components/predefinedScenarios/PredefinedScenariosBanner.esm.js.map +1 -0
  7. package/dist/components/predefinedScenarios/PredefinedScenariosBanner.module.css.esm.js +8 -0
  8. package/dist/components/predefinedScenarios/PredefinedScenariosBanner.module.css.esm.js.map +1 -0
  9. package/dist/components/riScInfo/riScStatus/RiScStatusComponent.esm.js +25 -15
  10. package/dist/components/riScInfo/riScStatus/RiScStatusComponent.esm.js.map +1 -1
  11. package/dist/components/riScPlugin/RiScPlugin.esm.js +16 -1
  12. package/dist/components/riScPlugin/RiScPlugin.esm.js.map +1 -1
  13. package/dist/hooks/usePredefinedScenarios.esm.js +69 -0
  14. package/dist/hooks/usePredefinedScenarios.esm.js.map +1 -0
  15. package/dist/index.d.ts +2 -2
  16. package/dist/stores/PredefinedScenariosBannerStore.esm.js +36 -0
  17. package/dist/stores/PredefinedScenariosBannerStore.esm.js.map +1 -0
  18. package/dist/urls/backend.esm.js +2 -1
  19. package/dist/urls/backend.esm.js.map +1 -1
  20. package/dist/utils/featureFlags.esm.js +10 -1
  21. package/dist/utils/featureFlags.esm.js.map +1 -1
  22. package/dist/utils/hooks.esm.js +1 -1
  23. package/dist/utils/hooks.esm.js.map +1 -1
  24. package/dist/utils/predefinedScenarios.esm.js +23 -0
  25. package/dist/utils/predefinedScenarios.esm.js.map +1 -0
  26. package/dist/utils/translations.esm.js +22 -0
  27. package/dist/utils/translations.esm.js.map +1 -1
  28. package/package.json +2 -1
@@ -3,6 +3,7 @@ import { Routes, Route } from 'react-router-dom';
3
3
  import { CacheProvider } from '@emotion/react';
4
4
  import createCache from '@emotion/cache';
5
5
  import { useMemo } from 'react';
6
+ import { QueryClientProvider, QueryClient } from '@tanstack/react-query';
6
7
  import { stringifyEntityRef } from '@backstage/catalog-model';
7
8
  import { useEntity } from '@backstage/plugin-catalog-react';
8
9
  import { createTheme, ThemeProvider } from '@mui/material/styles';
@@ -22,6 +23,13 @@ const cache = createCache({
22
23
  key: "css",
23
24
  insertionPoint: emotionInsertionPoint
24
25
  });
26
+ const queryClient = new QueryClient({
27
+ defaultOptions: {
28
+ queries: {
29
+ staleTime: 5 * 60 * 1e3
30
+ }
31
+ }
32
+ });
25
33
  function MuiThemeBridge({ children }) {
26
34
  const mode = useBackstageThemeMode();
27
35
  const theme = useMemo(() => createTheme({ palette: { mode } }), [mode]);
@@ -30,7 +38,7 @@ function MuiThemeBridge({ children }) {
30
38
  function ProvidedPlugin() {
31
39
  const { entity } = useEntity();
32
40
  const entityKey = stringifyEntityRef(entity);
33
- return /* @__PURE__ */ jsx(CacheProvider, { value: cache, children: /* @__PURE__ */ jsx(MuiThemeBridge, { children: /* @__PURE__ */ jsx(BackstageContextProvider, { children: /* @__PURE__ */ jsx(RiScProvider, { children: /* @__PURE__ */ jsx(DefaultRiScTypesProvider, { children: /* @__PURE__ */ jsx(ScenarioProvider, { children: /* @__PURE__ */ jsx(RiScPlugin, {}) }) }) }, entityKey) }) }) });
41
+ return /* @__PURE__ */ jsx(CacheProvider, { value: cache, children: /* @__PURE__ */ jsx(MuiThemeBridge, { children: /* @__PURE__ */ jsx(QueryClientProvider, { client: queryClient, children: /* @__PURE__ */ jsx(BackstageContextProvider, { children: /* @__PURE__ */ jsx(RiScProvider, { children: /* @__PURE__ */ jsx(DefaultRiScTypesProvider, { children: /* @__PURE__ */ jsx(ScenarioProvider, { children: /* @__PURE__ */ jsx(RiScPlugin, {}) }) }) }, entityKey) }) }) }) });
34
42
  }
35
43
  function PluginRoot() {
36
44
  return /* @__PURE__ */ jsxs(Routes, { children: [
@@ -1 +1 @@
1
- {"version":3,"file":"PluginRoot.esm.js","sources":["../src/PluginRoot.tsx"],"sourcesContent":["import { Route, Routes } from 'react-router-dom';\nimport { CacheProvider } from '@emotion/react';\nimport createCache from '@emotion/cache';\nimport { useMemo } from 'react';\nimport { stringifyEntityRef } from '@backstage/catalog-model';\nimport { useEntity } from '@backstage/plugin-catalog-react';\nimport { createTheme, ThemeProvider } from '@mui/material/styles';\nimport { RiScPlugin } from './components/riScPlugin/RiScPlugin';\nimport { ScenarioProvider } from './contexts/ScenarioContext';\nimport { riScRouteRef, scenarioRouteRef } from './routes';\nimport { RiScProvider } from './contexts/RiScContext';\nimport 'remixicon/fonts/remixicon.css';\nimport { DefaultRiScTypesProvider } from './contexts/DefaultRiScTypesContext.tsx';\nimport { BackstageContextProvider } from './contexts/BackstageContext.tsx';\nimport { useBackstageThemeMode } from './hooks/useBackstageThemeMode.ts';\n\nconst emotionInsertionPoint = document.createElement('meta');\nemotionInsertionPoint.setAttribute('name', 'emotion-insertion-point');\ndocument.querySelector('head')?.appendChild(emotionInsertionPoint);\n\nconst cache = createCache({\n key: 'css',\n insertionPoint: emotionInsertionPoint,\n});\n\nfunction MuiThemeBridge({ children }: { children: React.ReactNode }) {\n const mode = useBackstageThemeMode();\n const theme = useMemo(() => createTheme({ palette: { mode } }), [mode]);\n return <ThemeProvider theme={theme}>{children}</ThemeProvider>;\n}\n\nfunction ProvidedPlugin() {\n const { entity } = useEntity();\n const entityKey = stringifyEntityRef(entity);\n\n return (\n <CacheProvider value={cache}>\n <MuiThemeBridge>\n <BackstageContextProvider>\n <RiScProvider key={entityKey}>\n <DefaultRiScTypesProvider>\n <ScenarioProvider>\n <RiScPlugin />\n </ScenarioProvider>\n </DefaultRiScTypesProvider>\n </RiScProvider>\n </BackstageContextProvider>\n </MuiThemeBridge>\n </CacheProvider>\n );\n}\n\nexport function PluginRoot() {\n return (\n <Routes>\n <Route path=\"/\" element={<ProvidedPlugin />} />\n <Route path={riScRouteRef.path} element={<ProvidedPlugin />} />\n <Route path={scenarioRouteRef.path} element={<ProvidedPlugin />} />\n </Routes>\n );\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAgBA,MAAM,qBAAA,GAAwB,QAAA,CAAS,aAAA,CAAc,MAAM,CAAA;AAC3D,qBAAA,CAAsB,YAAA,CAAa,QAAQ,yBAAyB,CAAA;AACpE,QAAA,CAAS,aAAA,CAAc,MAAM,CAAA,EAAG,WAAA,CAAY,qBAAqB,CAAA;AAEjE,MAAM,QAAQ,WAAA,CAAY;AAAA,EACxB,GAAA,EAAK,KAAA;AAAA,EACL,cAAA,EAAgB;AAClB,CAAC,CAAA;AAED,SAAS,cAAA,CAAe,EAAE,QAAA,EAAS,EAAkC;AACnE,EAAA,MAAM,OAAO,qBAAA,EAAsB;AACnC,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,MAAM,WAAA,CAAY,EAAE,OAAA,EAAS,EAAE,IAAA,EAAK,EAAG,CAAA,EAAG,CAAC,IAAI,CAAC,CAAA;AACtE,EAAA,uBAAO,GAAA,CAAC,aAAA,EAAA,EAAc,KAAA,EAAe,QAAA,EAAS,CAAA;AAChD;AAEA,SAAS,cAAA,GAAiB;AACxB,EAAA,MAAM,EAAE,MAAA,EAAO,GAAI,SAAA,EAAU;AAC7B,EAAA,MAAM,SAAA,GAAY,mBAAmB,MAAM,CAAA;AAE3C,EAAA,uBACE,GAAA,CAAC,iBAAc,KAAA,EAAO,KAAA,EACpB,8BAAC,cAAA,EAAA,EACC,QAAA,kBAAA,GAAA,CAAC,wBAAA,EAAA,EACC,QAAA,kBAAA,GAAA,CAAC,YAAA,EAAA,EACC,QAAA,kBAAA,GAAA,CAAC,4BACC,QAAA,kBAAA,GAAA,CAAC,gBAAA,EAAA,EACC,8BAAC,UAAA,EAAA,EAAW,CAAA,EACd,GACF,CAAA,EAAA,EALiB,SAMnB,CAAA,EACF,CAAA,EACF,CAAA,EACF,CAAA;AAEJ;AAEO,SAAS,UAAA,GAAa;AAC3B,EAAA,4BACG,MAAA,EAAA,EACC,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,SAAM,IAAA,EAAK,GAAA,EAAI,OAAA,kBAAS,GAAA,CAAC,kBAAe,CAAA,EAAI,CAAA;AAAA,oBAC7C,GAAA,CAAC,SAAM,IAAA,EAAM,YAAA,CAAa,MAAM,OAAA,kBAAS,GAAA,CAAC,kBAAe,CAAA,EAAI,CAAA;AAAA,oBAC7D,GAAA,CAAC,SAAM,IAAA,EAAM,gBAAA,CAAiB,MAAM,OAAA,kBAAS,GAAA,CAAC,kBAAe,CAAA,EAAI;AAAA,GAAA,EACnE,CAAA;AAEJ;;;;"}
1
+ {"version":3,"file":"PluginRoot.esm.js","sources":["../src/PluginRoot.tsx"],"sourcesContent":["import { Route, Routes } from 'react-router-dom';\nimport { CacheProvider } from '@emotion/react';\nimport createCache from '@emotion/cache';\nimport { useMemo } from 'react';\nimport { QueryClient, QueryClientProvider } from '@tanstack/react-query';\nimport { stringifyEntityRef } from '@backstage/catalog-model';\nimport { useEntity } from '@backstage/plugin-catalog-react';\nimport { createTheme, ThemeProvider } from '@mui/material/styles';\nimport { RiScPlugin } from './components/riScPlugin/RiScPlugin';\nimport { ScenarioProvider } from './contexts/ScenarioContext';\nimport { riScRouteRef, scenarioRouteRef } from './routes';\nimport { RiScProvider } from './contexts/RiScContext';\nimport 'remixicon/fonts/remixicon.css';\nimport { DefaultRiScTypesProvider } from './contexts/DefaultRiScTypesContext.tsx';\nimport { BackstageContextProvider } from './contexts/BackstageContext.tsx';\nimport { useBackstageThemeMode } from './hooks/useBackstageThemeMode.ts';\n\nconst emotionInsertionPoint = document.createElement('meta');\nemotionInsertionPoint.setAttribute('name', 'emotion-insertion-point');\ndocument.querySelector('head')?.appendChild(emotionInsertionPoint);\n\nconst cache = createCache({\n key: 'css',\n insertionPoint: emotionInsertionPoint,\n});\n\nconst queryClient = new QueryClient({\n defaultOptions: {\n queries: {\n staleTime: 5 * 60 * 1000,\n },\n },\n});\n\nfunction MuiThemeBridge({ children }: { children: React.ReactNode }) {\n const mode = useBackstageThemeMode();\n const theme = useMemo(() => createTheme({ palette: { mode } }), [mode]);\n return <ThemeProvider theme={theme}>{children}</ThemeProvider>;\n}\n\nfunction ProvidedPlugin() {\n const { entity } = useEntity();\n const entityKey = stringifyEntityRef(entity);\n\n return (\n <CacheProvider value={cache}>\n <MuiThemeBridge>\n <QueryClientProvider client={queryClient}>\n <BackstageContextProvider>\n <RiScProvider key={entityKey}>\n <DefaultRiScTypesProvider>\n <ScenarioProvider>\n <RiScPlugin />\n </ScenarioProvider>\n </DefaultRiScTypesProvider>\n </RiScProvider>\n </BackstageContextProvider>\n </QueryClientProvider>\n </MuiThemeBridge>\n </CacheProvider>\n );\n}\n\nexport function PluginRoot() {\n return (\n <Routes>\n <Route path=\"/\" element={<ProvidedPlugin />} />\n <Route path={riScRouteRef.path} element={<ProvidedPlugin />} />\n <Route path={scenarioRouteRef.path} element={<ProvidedPlugin />} />\n </Routes>\n );\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;AAiBA,MAAM,qBAAA,GAAwB,QAAA,CAAS,aAAA,CAAc,MAAM,CAAA;AAC3D,qBAAA,CAAsB,YAAA,CAAa,QAAQ,yBAAyB,CAAA;AACpE,QAAA,CAAS,aAAA,CAAc,MAAM,CAAA,EAAG,WAAA,CAAY,qBAAqB,CAAA;AAEjE,MAAM,QAAQ,WAAA,CAAY;AAAA,EACxB,GAAA,EAAK,KAAA;AAAA,EACL,cAAA,EAAgB;AAClB,CAAC,CAAA;AAED,MAAM,WAAA,GAAc,IAAI,WAAA,CAAY;AAAA,EAClC,cAAA,EAAgB;AAAA,IACd,OAAA,EAAS;AAAA,MACP,SAAA,EAAW,IAAI,EAAA,GAAK;AAAA;AACtB;AAEJ,CAAC,CAAA;AAED,SAAS,cAAA,CAAe,EAAE,QAAA,EAAS,EAAkC;AACnE,EAAA,MAAM,OAAO,qBAAA,EAAsB;AACnC,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,MAAM,WAAA,CAAY,EAAE,OAAA,EAAS,EAAE,IAAA,EAAK,EAAG,CAAA,EAAG,CAAC,IAAI,CAAC,CAAA;AACtE,EAAA,uBAAO,GAAA,CAAC,aAAA,EAAA,EAAc,KAAA,EAAe,QAAA,EAAS,CAAA;AAChD;AAEA,SAAS,cAAA,GAAiB;AACxB,EAAA,MAAM,EAAE,MAAA,EAAO,GAAI,SAAA,EAAU;AAC7B,EAAA,MAAM,SAAA,GAAY,mBAAmB,MAAM,CAAA;AAE3C,EAAA,uBACE,GAAA,CAAC,aAAA,EAAA,EAAc,KAAA,EAAO,KAAA,EACpB,QAAA,kBAAA,GAAA,CAAC,cAAA,EAAA,EACC,QAAA,kBAAA,GAAA,CAAC,mBAAA,EAAA,EAAoB,MAAA,EAAQ,WAAA,EAC3B,QAAA,kBAAA,GAAA,CAAC,wBAAA,EAAA,EACC,QAAA,kBAAA,GAAA,CAAC,YAAA,EAAA,EACC,QAAA,kBAAA,GAAA,CAAC,wBAAA,EAAA,EACC,QAAA,kBAAA,GAAA,CAAC,gBAAA,EAAA,EACC,QAAA,kBAAA,GAAA,CAAC,UAAA,EAAA,EAAW,CAAA,EACd,CAAA,EACF,CAAA,EAAA,EALiB,SAMnB,CAAA,EACF,CAAA,EACF,CAAA,EACF,CAAA,EACF,CAAA;AAEJ;AAEO,SAAS,UAAA,GAAa;AAC3B,EAAA,4BACG,MAAA,EAAA,EACC,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,SAAM,IAAA,EAAK,GAAA,EAAI,OAAA,kBAAS,GAAA,CAAC,kBAAe,CAAA,EAAI,CAAA;AAAA,oBAC7C,GAAA,CAAC,SAAM,IAAA,EAAM,YAAA,CAAa,MAAM,OAAA,kBAAS,GAAA,CAAC,kBAAe,CAAA,EAAI,CAAA;AAAA,oBAC7D,GAAA,CAAC,SAAM,IAAA,EAAM,gBAAA,CAAiB,MAAM,OAAA,kBAAS,GAAA,CAAC,kBAAe,CAAA,EAAI;AAAA,GAAA,EACnE,CAAA;AAEJ;;;;"}
@@ -0,0 +1,34 @@
1
+ import { jsx } from 'react/jsx-runtime';
2
+ import Tooltip from '@mui/material/Tooltip';
3
+ import { useTranslationRef } from '@backstage/core-plugin-api/alpha';
4
+ import { pluginRiScTranslationRef } from '../../utils/translations.esm.js';
5
+ import { RiScStatus } from '../../utils/types.esm.js';
6
+ import { hasAnyPredefinedScenario } from '../../utils/predefinedScenarios.esm.js';
7
+ import { usePredefinedScenariosFeatureFlag } from '../../utils/featureFlags.esm.js';
8
+ import { usePredefinedScenarios } from '../../hooks/usePredefinedScenarios.esm.js';
9
+
10
+ function PredefinedScenariosApprovalTooltip({
11
+ selectedRiSc,
12
+ isDismissed,
13
+ children
14
+ }) {
15
+ const { t } = useTranslationRef(pluginRiScTranslationRef);
16
+ const isTestPredefinedScenariosEnabled = usePredefinedScenariosFeatureFlag();
17
+ const { data: predefinedScenarios } = usePredefinedScenarios(
18
+ isTestPredefinedScenariosEnabled
19
+ );
20
+ if (selectedRiSc.status === RiScStatus.DeletionSentForApproval || selectedRiSc.status === RiScStatus.DeletionDraft) {
21
+ return children(false);
22
+ }
23
+ if (!predefinedScenarios) {
24
+ return /* @__PURE__ */ jsx(Tooltip, { title: t("rosStatus.predefinedScenariosRequired"), arrow: true, children: /* @__PURE__ */ jsx("span", { style: { marginLeft: "auto" }, children: children(true) }) });
25
+ }
26
+ const blocked = predefinedScenarios.length > 0 && !isDismissed && !hasAnyPredefinedScenario(selectedRiSc, predefinedScenarios);
27
+ if (!blocked) {
28
+ return children(false);
29
+ }
30
+ return /* @__PURE__ */ jsx(Tooltip, { title: t("rosStatus.predefinedScenariosRequired"), arrow: true, children: /* @__PURE__ */ jsx("span", { style: { marginLeft: "auto" }, children: children(true) }) });
31
+ }
32
+
33
+ export { PredefinedScenariosApprovalTooltip };
34
+ //# sourceMappingURL=PredefinedScenariosApprovalTooltip.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PredefinedScenariosApprovalTooltip.esm.js","sources":["../../../src/components/predefinedScenarios/PredefinedScenariosApprovalTooltip.tsx"],"sourcesContent":["import { ReactNode } from 'react';\nimport Tooltip from '@mui/material/Tooltip';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { pluginRiScTranslationRef } from '../../utils/translations.ts';\nimport { RiScStatus, RiScWithMetadata } from '../../utils/types.ts';\nimport { hasAnyPredefinedScenario } from '../../utils/predefinedScenarios.ts';\nimport { usePredefinedScenariosFeatureFlag } from '../../utils/featureFlags';\nimport { usePredefinedScenarios } from '../../hooks/usePredefinedScenarios.ts';\n\ntype PredefinedScenariosApprovalTooltipProps = {\n selectedRiSc: RiScWithMetadata;\n isDismissed: boolean;\n children: (isDisabled: boolean) => ReactNode;\n};\n\nexport function PredefinedScenariosApprovalTooltip({\n selectedRiSc,\n isDismissed,\n children,\n}: PredefinedScenariosApprovalTooltipProps) {\n const { t } = useTranslationRef(pluginRiScTranslationRef);\n const isTestPredefinedScenariosEnabled = usePredefinedScenariosFeatureFlag();\n const { data: predefinedScenarios } = usePredefinedScenarios(\n isTestPredefinedScenariosEnabled,\n );\n\n if (\n selectedRiSc.status === RiScStatus.DeletionSentForApproval ||\n selectedRiSc.status === RiScStatus.DeletionDraft\n ) {\n return children(false);\n }\n\n if (!predefinedScenarios) {\n // This works while fetching the scenarios, or if it has failed, in neither case\n // which you should be able to move on since we use the time of approval as an\n // indication of these having been addressed. The error will be shown in the banner.\n return (\n <Tooltip title={t('rosStatus.predefinedScenariosRequired')} arrow>\n <span style={{ marginLeft: 'auto' }}>{children(true)}</span>\n </Tooltip>\n );\n }\n\n const blocked =\n predefinedScenarios.length > 0 &&\n !isDismissed &&\n !hasAnyPredefinedScenario(selectedRiSc, predefinedScenarios);\n\n if (!blocked) {\n return children(false);\n }\n\n return (\n <Tooltip title={t('rosStatus.predefinedScenariosRequired')} arrow>\n <span style={{ marginLeft: 'auto' }}>{children(true)}</span>\n </Tooltip>\n );\n}\n"],"names":[],"mappings":";;;;;;;;;AAeO,SAAS,kCAAA,CAAmC;AAAA,EACjD,YAAA;AAAA,EACA,WAAA;AAAA,EACA;AACF,CAAA,EAA4C;AAC1C,EAAA,MAAM,EAAE,CAAA,EAAE,GAAI,iBAAA,CAAkB,wBAAwB,CAAA;AACxD,EAAA,MAAM,mCAAmC,iCAAA,EAAkC;AAC3E,EAAA,MAAM,EAAE,IAAA,EAAM,mBAAA,EAAoB,GAAI,sBAAA;AAAA,IACpC;AAAA,GACF;AAEA,EAAA,IACE,aAAa,MAAA,KAAW,UAAA,CAAW,2BACnC,YAAA,CAAa,MAAA,KAAW,WAAW,aAAA,EACnC;AACA,IAAA,OAAO,SAAS,KAAK,CAAA;AAAA,EACvB;AAEA,EAAA,IAAI,CAAC,mBAAA,EAAqB;AAIxB,IAAA,2BACG,OAAA,EAAA,EAAQ,KAAA,EAAO,EAAE,uCAAuC,CAAA,EAAG,OAAK,IAAA,EAC/D,QAAA,kBAAA,GAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,EAAE,UAAA,EAAY,MAAA,IAAW,QAAA,EAAA,QAAA,CAAS,IAAI,GAAE,CAAA,EACvD,CAAA;AAAA,EAEJ;AAEA,EAAA,MAAM,OAAA,GACJ,oBAAoB,MAAA,GAAS,CAAA,IAC7B,CAAC,WAAA,IACD,CAAC,wBAAA,CAAyB,YAAA,EAAc,mBAAmB,CAAA;AAE7D,EAAA,IAAI,CAAC,OAAA,EAAS;AACZ,IAAA,OAAO,SAAS,KAAK,CAAA;AAAA,EACvB;AAEA,EAAA,2BACG,OAAA,EAAA,EAAQ,KAAA,EAAO,EAAE,uCAAuC,CAAA,EAAG,OAAK,IAAA,EAC/D,QAAA,kBAAA,GAAA,CAAC,MAAA,EAAA,EAAK,KAAA,EAAO,EAAE,UAAA,EAAY,MAAA,IAAW,QAAA,EAAA,QAAA,CAAS,IAAI,GAAE,CAAA,EACvD,CAAA;AAEJ;;;;"}
@@ -0,0 +1,76 @@
1
+ import { jsx, Fragment, jsxs } from 'react/jsx-runtime';
2
+ import { Flex, Text, Button } from '@backstage/ui';
3
+ import { useTranslationRef } from '@backstage/core-plugin-api/alpha';
4
+ import { pluginRiScTranslationRef } from '../../utils/translations.esm.js';
5
+ import { useRiScs } from '../../contexts/RiScContext.esm.js';
6
+ import { useBackstageContext } from '../../contexts/BackstageContext.esm.js';
7
+ import { RiScStatus } from '../../utils/types.esm.js';
8
+ import { hasAnyPredefinedScenario, buildPredefinedScenarios } from '../../utils/predefinedScenarios.esm.js';
9
+ import { usePredefinedScenarios } from '../../hooks/usePredefinedScenarios.esm.js';
10
+ import styles from './PredefinedScenariosBanner.module.css.esm.js';
11
+ import CircularProgress from '@mui/material/CircularProgress';
12
+ import { usePredefinedScenariosFeatureFlag } from '../../utils/featureFlags.esm.js';
13
+
14
+ function PredefinedScenariosBanner({
15
+ selectedRiSc,
16
+ isDismissed,
17
+ dismiss
18
+ }) {
19
+ const { t } = useTranslationRef(pluginRiScTranslationRef);
20
+ const { updateRiSc, updateStatus } = useRiScs();
21
+ const { profileInfo } = useBackstageContext();
22
+ const isTestPredefinedScenariosEnabled = usePredefinedScenariosFeatureFlag();
23
+ const {
24
+ data: predefinedScenarios,
25
+ isError,
26
+ isPending
27
+ } = usePredefinedScenarios(isTestPredefinedScenariosEnabled);
28
+ if (isDismissed || selectedRiSc.status === RiScStatus.DeletionDraft || selectedRiSc.status === RiScStatus.DeletionSentForApproval) {
29
+ return null;
30
+ }
31
+ if (isPending) {
32
+ return /* @__PURE__ */ jsx(Flex, { justify: "center", children: /* @__PURE__ */ jsx(CircularProgress, {}) });
33
+ }
34
+ if (isError) {
35
+ return /* @__PURE__ */ jsx(Flex, { className: styles.error, direction: "column", align: "start", gap: "1", children: /* @__PURE__ */ jsx(Text, { as: "p", variant: "body-medium", children: t("predefinedScenarios.error") }) });
36
+ }
37
+ if (hasAnyPredefinedScenario(selectedRiSc, predefinedScenarios)) {
38
+ return null;
39
+ }
40
+ const newScenarios = buildPredefinedScenarios(
41
+ predefinedScenarios,
42
+ profileInfo
43
+ );
44
+ function onAdd() {
45
+ updateRiSc(
46
+ {
47
+ ...selectedRiSc,
48
+ content: {
49
+ ...selectedRiSc.content,
50
+ scenarios: [...newScenarios, ...selectedRiSc.content.scenarios]
51
+ }
52
+ },
53
+ dismiss
54
+ );
55
+ }
56
+ return /* @__PURE__ */ jsx(Fragment, { children: /* @__PURE__ */ jsxs(Flex, { className: styles.banner, direction: "column", align: "start", gap: "2", children: [
57
+ /* @__PURE__ */ jsxs(Flex, { direction: "column", gap: "1", children: [
58
+ /* @__PURE__ */ jsx(Text, { as: "h4", variant: "body-large", weight: "bold", children: t("predefinedScenarios.title") }),
59
+ /* @__PURE__ */ jsx(Text, { as: "p", variant: "body-medium", children: t("predefinedScenarios.description") })
60
+ ] }),
61
+ /* @__PURE__ */ jsx(
62
+ Button,
63
+ {
64
+ iconStart: /* @__PURE__ */ jsx("i", { className: "ri-add-line" }),
65
+ variant: "primary",
66
+ onClick: onAdd,
67
+ isDisabled: updateStatus.isLoading,
68
+ style: { marginTop: "4px" },
69
+ children: t("predefinedScenarios.addButton")
70
+ }
71
+ )
72
+ ] }) });
73
+ }
74
+
75
+ export { PredefinedScenariosBanner };
76
+ //# sourceMappingURL=PredefinedScenariosBanner.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PredefinedScenariosBanner.esm.js","sources":["../../../src/components/predefinedScenarios/PredefinedScenariosBanner.tsx"],"sourcesContent":["import { Button, Flex, Text } from '@backstage/ui';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { pluginRiScTranslationRef } from '../../utils/translations.ts';\nimport { useRiScs } from '../../contexts/RiScContext.tsx';\nimport { useBackstageContext } from '../../contexts/BackstageContext.tsx';\nimport { RiScStatus, RiScWithMetadata } from '../../utils/types.ts';\nimport {\n buildPredefinedScenarios,\n hasAnyPredefinedScenario,\n} from '../../utils/predefinedScenarios.ts';\nimport { usePredefinedScenarios } from '../../hooks/usePredefinedScenarios.ts';\nimport styles from './PredefinedScenariosBanner.module.css';\nimport CircularProgress from '@mui/material/CircularProgress';\nimport { usePredefinedScenariosFeatureFlag } from '../../utils/featureFlags.ts';\n\ntype PredefinedScenariosBannerProps = {\n selectedRiSc: RiScWithMetadata;\n isDismissed: boolean;\n dismiss: () => void;\n};\n\nexport function PredefinedScenariosBanner({\n selectedRiSc,\n isDismissed,\n dismiss,\n}: PredefinedScenariosBannerProps) {\n const { t } = useTranslationRef(pluginRiScTranslationRef);\n const { updateRiSc, updateStatus } = useRiScs();\n const { profileInfo } = useBackstageContext();\n const isTestPredefinedScenariosEnabled = usePredefinedScenariosFeatureFlag();\n const {\n data: predefinedScenarios,\n isError,\n isPending,\n } = usePredefinedScenarios(isTestPredefinedScenariosEnabled);\n if (\n isDismissed ||\n selectedRiSc.status === RiScStatus.DeletionDraft ||\n selectedRiSc.status === RiScStatus.DeletionSentForApproval\n ) {\n return null;\n }\n\n if (isPending) {\n return (\n <Flex justify=\"center\">\n <CircularProgress />\n </Flex>\n );\n }\n\n if (isError) {\n return (\n <Flex className={styles.error} direction=\"column\" align=\"start\" gap=\"1\">\n <Text as=\"p\" variant=\"body-medium\">\n {t('predefinedScenarios.error')}\n </Text>\n </Flex>\n );\n }\n\n if (hasAnyPredefinedScenario(selectedRiSc, predefinedScenarios)) {\n return null;\n }\n const newScenarios = buildPredefinedScenarios(\n predefinedScenarios,\n profileInfo,\n );\n\n function onAdd() {\n updateRiSc(\n {\n ...selectedRiSc,\n content: {\n ...selectedRiSc.content,\n scenarios: [...newScenarios, ...selectedRiSc.content.scenarios],\n },\n },\n dismiss,\n );\n }\n\n return (\n <>\n <Flex className={styles.banner} direction=\"column\" align=\"start\" gap=\"2\">\n <Flex direction=\"column\" gap=\"1\">\n <Text as=\"h4\" variant=\"body-large\" weight=\"bold\">\n {t('predefinedScenarios.title')}\n </Text>\n <Text as=\"p\" variant=\"body-medium\">\n {t('predefinedScenarios.description')}\n </Text>\n </Flex>\n <Button\n iconStart={<i className=\"ri-add-line\" />}\n variant=\"primary\"\n onClick={onAdd}\n isDisabled={updateStatus.isLoading}\n style={{ marginTop: '4px' }}\n >\n {t('predefinedScenarios.addButton')}\n </Button>\n </Flex>\n </>\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 = ".PredefinedScenariosBanner_banner__fd5e58ae1d {\n position: relative;\n background-color: var(--ros-orange-50);\n padding: 16px;\n padding-right: 10%;\n border-radius: 8px;\n}\n\n[data-theme-mode='dark'] .PredefinedScenariosBanner_banner__fd5e58ae1d {\n background-color: var(--ros-gray-500);\n}\n\n.PredefinedScenariosBanner_error__fd5e58ae1d {\n background-color: var(--ros-red-50);\n color: var(--ros-red-800);\n padding: 16px;\n border-radius: 8px;\n}\n\n[data-theme-mode='dark'] .PredefinedScenariosBanner_error__fd5e58ae1d {\n background-color: var(--ros-red-900);\n color: var(--ros-red-100);\n}\n\n.PredefinedScenariosBanner_closeButton__fd5e58ae1d {\n position: absolute;\n top: 8px;\n right: 8px;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 28px;\n height: 28px;\n background: none;\n border: none;\n border-radius: 4px;\n cursor: pointer;\n font-size: 20px;\n line-height: 1;\n color: var(--bui-fg-secondary, inherit);\n}\n\n.PredefinedScenariosBanner_closeButton__fd5e58ae1d:hover {\n color: var(--bui-fg-primary, inherit);\n background-color: var(--bui-bg-surface-2, rgba(0, 0, 0, 0.06));\n}\n";
4
+ var styles = {"banner":"PredefinedScenariosBanner_banner__fd5e58ae1d","error":"PredefinedScenariosBanner_error__fd5e58ae1d"};
5
+ styleInject(css_248z);
6
+
7
+ export { styles as default };
8
+ //# sourceMappingURL=PredefinedScenariosBanner.module.css.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PredefinedScenariosBanner.module.css.esm.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;"}
@@ -13,6 +13,7 @@ import { Card, CardHeader, Text, CardBody, Flex, ButtonLink, Button, Box } from
13
13
  import { StatusBanner } from './StatusBanner.esm.js';
14
14
  import { StatusBadge } from './StatusBadge.esm.js';
15
15
  import { FeedbackLink } from './FeedbackLink.esm.js';
16
+ import { PredefinedScenariosApprovalTooltip } from '../../predefinedScenarios/PredefinedScenariosApprovalTooltip.esm.js';
16
17
 
17
18
  const emptyDifferenceFetchState = {
18
19
  differenceState: {
@@ -35,7 +36,8 @@ const emptyDifferenceFetchState = {
35
36
  };
36
37
  function RiScStatusComponent({
37
38
  selectedRiSc,
38
- publishRiScFn
39
+ publishRiScFn,
40
+ predefinedScenariosDismissed
39
41
  }) {
40
42
  const { t } = useTranslationRef(pluginRiScTranslationRef);
41
43
  const { fetchDifference } = useAuthenticatedFetch();
@@ -166,21 +168,29 @@ function RiScStatusComponent({
166
168
  ),
167
169
  status === RiScStatusEnum.PUBLISHED && /* @__PURE__ */ jsx(Text, { as: "p", variant: "body-large", children: t("rosStatus.statusBadge.approved") }),
168
170
  (status === RiScStatusEnum.DRAFT || status === RiScStatusEnum.DELETION_DRAFT) && /* @__PURE__ */ jsxs(Fragment, { children: [
169
- /* @__PURE__ */ jsxs(
170
- Button,
171
+ /* @__PURE__ */ jsx(
172
+ PredefinedScenariosApprovalTooltip,
171
173
  {
172
- variant: "primary",
173
- size: "medium",
174
- onClick: handleOpenPublishRiScDialog,
175
- style: {
176
- display: "block",
177
- marginLeft: "auto",
178
- fontSize: "14px"
179
- },
180
- children: [
181
- status === RiScStatusEnum.DRAFT && t("rosStatus.approveButtonUpdate"),
182
- status === RiScStatusEnum.DELETION_DRAFT && t("rosStatus.approveButtonDelete")
183
- ]
174
+ selectedRiSc,
175
+ isDismissed: predefinedScenariosDismissed,
176
+ children: (isDisabled) => /* @__PURE__ */ jsxs(
177
+ Button,
178
+ {
179
+ variant: "primary",
180
+ size: "medium",
181
+ onClick: handleOpenPublishRiScDialog,
182
+ isDisabled,
183
+ style: {
184
+ display: "block",
185
+ marginLeft: "auto",
186
+ fontSize: "14px"
187
+ },
188
+ children: [
189
+ status === RiScStatusEnum.DRAFT && t("rosStatus.approveButtonUpdate"),
190
+ status === RiScStatusEnum.DELETION_DRAFT && t("rosStatus.approveButtonDelete")
191
+ ]
192
+ }
193
+ )
184
194
  }
185
195
  ),
186
196
  /* @__PURE__ */ jsx(
@@ -1 +1 @@
1
- {"version":3,"file":"RiScStatusComponent.esm.js","sources":["../../../../src/components/riScInfo/riScStatus/RiScStatusComponent.tsx"],"sourcesContent":["import { useEffect, useState } from 'react';\nimport {\n DifferenceFetchState,\n DifferenceStatus,\n RiScStatus,\n RiScWithMetadata,\n} from '../../../utils/types';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { pluginRiScTranslationRef } from '../../../utils/translations';\nimport { useRiScs } from '../../../contexts/RiScContext';\nimport { useAuthenticatedFetch } from '../../../utils/hooks';\nimport { RiScMigrationDialog } from '../MigrationDialog';\nimport { RiScPublishDialog } from '../PublishDialog';\nimport { calculateDaysSince } from '../../../utils/utilityfunctions';\nimport { RiScStatusEnum, RiScStatusEnumType } from './utils';\nimport {\n Text,\n Button,\n Box,\n Flex,\n Card,\n CardBody,\n ButtonLink,\n CardHeader,\n} from '@backstage/ui';\nimport { StatusBanner } from './StatusBanner.tsx';\nimport { StatusBadge } from './StatusBadge.tsx';\nimport { FeedbackLink } from './FeedbackLink.tsx';\n\nconst emptyDifferenceFetchState: DifferenceFetchState = {\n differenceState: {\n type: '4.*',\n migrationChanges: {\n migrationChanges: false,\n migrationRequiresNewApproval: false,\n migrationVersions: undefined,\n migrationChanges40: undefined,\n migrationChanges41: undefined,\n },\n valuations: [],\n scenarios: [],\n },\n status: null,\n isLoading: false,\n errorMessage: '',\n currentDifferenceId: '',\n defaultLastModifiedDateString: '',\n};\n\ninterface RiScStatusProps {\n selectedRiSc: RiScWithMetadata;\n publishRiScFn: () => void;\n}\n\nexport function RiScStatusComponent({\n selectedRiSc,\n publishRiScFn,\n}: RiScStatusProps) {\n const { t } = useTranslationRef(pluginRiScTranslationRef);\n const { fetchDifference } = useAuthenticatedFetch();\n\n const [publishRiScDialogIsOpen, setPublishRiScDialogIsOpen] =\n useState<boolean>(false);\n\n const [migrationDialogIsOpen, setMigrationDialogIsOpen] =\n useState<boolean>(false);\n\n const [differenceFetchState, setDifferenceFetchState] =\n useState<DifferenceFetchState>(emptyDifferenceFetchState);\n\n const { updateRiSc } = useRiScs();\n\n function handleApproveAndPublish() {\n publishRiScFn();\n setPublishRiScDialogIsOpen(false);\n }\n\n function getDifferences() {\n if (\n !selectedRiSc ||\n differenceFetchState.isLoading ||\n differenceFetchState.currentDifferenceId === selectedRiSc.id\n )\n return;\n\n setDifferenceFetchState({ ...differenceFetchState, isLoading: true });\n fetchDifference(\n selectedRiSc,\n response => {\n setDifferenceFetchState({\n differenceState: response.differenceState,\n isLoading: false,\n currentDifferenceId: selectedRiSc.id,\n status: response.status,\n errorMessage: response.errorMessage,\n defaultLastModifiedDateString: response.defaultLastModifiedDateString,\n });\n },\n () => {\n setDifferenceFetchState({\n ...emptyDifferenceFetchState,\n errorMessage: t('rosStatus.difference.error'),\n status: DifferenceStatus.FrontendFallback, // Fallback when the backend does not deliver a response with status\n });\n },\n );\n }\n\n function handleUpdate() {\n updateRiSc(selectedRiSc);\n setMigrationDialogIsOpen(false);\n }\n\n function handleOpenPublishRiScDialog() {\n setPublishRiScDialogIsOpen(true);\n getDifferences();\n }\n\n function handleClosePublishRiScDialog() {\n setPublishRiScDialogIsOpen(false);\n }\n\n useEffect(() => {\n setDifferenceFetchState(emptyDifferenceFetchState);\n }, [selectedRiSc]);\n\n const [status, setStatus] = useState<RiScStatusEnumType>(\n RiScStatusEnum.CREATED,\n );\n\n useEffect(() => {\n if (selectedRiSc.status === RiScStatus.DeletionDraft) {\n setStatus(RiScStatusEnum.DELETION_DRAFT);\n } else if (selectedRiSc.status === RiScStatus.DeletionSentForApproval) {\n setStatus(RiScStatusEnum.DELETION_WAITING);\n } else if (selectedRiSc.content.scenarios.length === 0) {\n setStatus(RiScStatusEnum.CREATED);\n } else if (selectedRiSc.status === RiScStatus.Draft) {\n setStatus(RiScStatusEnum.DRAFT);\n } else if (selectedRiSc.status === RiScStatus.SentForApproval) {\n setStatus(RiScStatusEnum.WAITING);\n } else if (selectedRiSc.status === RiScStatus.Published) {\n setStatus(RiScStatusEnum.PUBLISHED);\n }\n }, [selectedRiSc.status, selectedRiSc.content.scenarios]);\n\n const migration =\n selectedRiSc.migrationStatus?.migrationChanges &&\n selectedRiSc.status !== RiScStatus.DeletionDraft &&\n selectedRiSc.status !== RiScStatus.DeletionSentForApproval;\n\n const lastPublishedDateTime = selectedRiSc.lastPublished?.dateTime;\n const daysSinceLastModified = lastPublishedDateTime\n ? calculateDaysSince(new Date(lastPublishedDateTime))\n : null;\n\n const numOfCommitsBehind =\n selectedRiSc.lastPublished?.numberOfCommits ?? null;\n\n const showFeedbackLink =\n status === RiScStatusEnum.WAITING ||\n (status === RiScStatusEnum.PUBLISHED &&\n daysSinceLastModified !== null &&\n daysSinceLastModified <= 5);\n\n return (\n <Card style={{ height: 'fit-content' }}>\n <CardHeader>\n <Text variant=\"title-small\" weight=\"bold\" as=\"h5\">\n Status\n </Text>\n <StatusBanner\n numOfCommitsBehind={numOfCommitsBehind}\n daysSinceLastModified={daysSinceLastModified}\n differenceFetchState={differenceFetchState}\n />\n </CardHeader>\n <CardBody>\n {!migration && (\n <>\n <Flex\n direction=\"column\"\n justify=\"between\"\n align=\"start\"\n gap=\"1\"\n mt=\"4\"\n >\n <StatusBadge riScStatus={status} />\n <Flex direction=\"row\" mb=\"4\" pl=\"7\" style={{ width: '100%' }}>\n {status === RiScStatusEnum.CREATED && (\n <Text as=\"p\" variant=\"body-large\">\n {t('rosStatus.editing')}\n </Text>\n )}\n {status === RiScStatusEnum.DRAFT && (\n <Text as=\"p\" variant=\"body-large\">\n {t('rosStatus.statusBadge.missing')}\n </Text>\n )}\n {status === RiScStatusEnum.DELETION_DRAFT && (\n <Text as=\"p\" variant=\"body-large\">\n {t('rosStatus.statusBadge.deletionApproval')}\n </Text>\n )}\n {(status === RiScStatusEnum.WAITING ||\n status === RiScStatusEnum.DELETION_WAITING) && (\n <Flex\n justify=\"between\"\n align=\"baseline\"\n style={{ width: '100%' }}\n >\n <Text as=\"p\" variant=\"body-large\">\n {t('rosStatus.prStatus')}\n {status === RiScStatusEnum.WAITING &&\n t('rosStatus.prStatus2Update')}\n {status === RiScStatusEnum.DELETION_WAITING &&\n t('rosStatus.prStatus2Delete')}\n </Text>\n <ButtonLink\n target=\"_blank\"\n href={selectedRiSc.pullRequestUrl}\n variant=\"secondary\"\n >\n <i className=\"ri-external-link-line\" />\n {t('rosStatus.githubLink')}\n </ButtonLink>\n </Flex>\n )}\n {status === RiScStatusEnum.PUBLISHED && (\n <Text as=\"p\" variant=\"body-large\">\n {t('rosStatus.statusBadge.approved')}\n </Text>\n )}\n {(status === RiScStatusEnum.DRAFT ||\n status === RiScStatusEnum.DELETION_DRAFT) && (\n <>\n <Button\n variant=\"primary\"\n size=\"medium\"\n onClick={handleOpenPublishRiScDialog}\n style={{\n display: 'block',\n marginLeft: 'auto',\n fontSize: '14px',\n }}\n >\n {status === RiScStatusEnum.DRAFT &&\n t('rosStatus.approveButtonUpdate')}\n {status === RiScStatusEnum.DELETION_DRAFT &&\n t('rosStatus.approveButtonDelete')}\n </Button>\n <RiScPublishDialog\n openDialog={publishRiScDialogIsOpen}\n isDeletion={status === RiScStatusEnum.DELETION_DRAFT}\n handlePublish={handleApproveAndPublish}\n handleCancel={handleClosePublishRiScDialog}\n differenceFetchState={differenceFetchState}\n />\n </>\n )}\n </Flex>\n </Flex>\n </>\n )}\n {/* Need to include the undefined check here, as TypeScript does not pick up that this check is part of `migration` */}\n {migration && selectedRiSc.migrationStatus && (\n <Box>\n <Box mt=\"2\" mb=\"2\">\n <Text as=\"p\" variant=\"body-large\" weight=\"bold\">\n <i className=\"ri-error-warning-line\" />{' '}\n {t('rosStatus.statusBadge.migration.title')}\n </Text>\n </Box>\n\n <Text as=\"p\" variant=\"body-large\">\n {t('rosStatus.statusBadge.migration.description')}\n </Text>\n\n <Flex direction=\"column\" mt=\"4\" align=\"end\">\n <Button\n variant=\"primary\"\n size=\"medium\"\n onClick={() => setMigrationDialogIsOpen(!migrationDialogIsOpen)}\n >\n {t('rosStatus.moreInformationButton')}\n </Button>\n </Flex>\n <RiScMigrationDialog\n openDialog={migrationDialogIsOpen}\n handleUpdate={handleUpdate}\n handleCancel={() => setMigrationDialogIsOpen(false)}\n migrationStatus={selectedRiSc.migrationStatus}\n />\n </Box>\n )}\n {/* Error */}\n {!selectedRiSc && (\n <Text as=\"span\">{t('rosStatus.statusBadge.error')}</Text>\n )}\n {showFeedbackLink && <FeedbackLink />}\n </CardBody>\n </Card>\n );\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"RiScStatusComponent.esm.js","sources":["../../../../src/components/riScInfo/riScStatus/RiScStatusComponent.tsx"],"sourcesContent":["import { useEffect, useState } from 'react';\nimport {\n DifferenceFetchState,\n DifferenceStatus,\n RiScStatus,\n RiScWithMetadata,\n} from '../../../utils/types';\nimport { useTranslationRef } from '@backstage/core-plugin-api/alpha';\nimport { pluginRiScTranslationRef } from '../../../utils/translations';\nimport { useRiScs } from '../../../contexts/RiScContext';\nimport { useAuthenticatedFetch } from '../../../utils/hooks';\nimport { RiScMigrationDialog } from '../MigrationDialog';\nimport { RiScPublishDialog } from '../PublishDialog';\nimport { calculateDaysSince } from '../../../utils/utilityfunctions';\nimport { RiScStatusEnum, RiScStatusEnumType } from './utils';\nimport {\n Text,\n Button,\n Box,\n Flex,\n Card,\n CardBody,\n ButtonLink,\n CardHeader,\n} from '@backstage/ui';\nimport { StatusBanner } from './StatusBanner.tsx';\nimport { StatusBadge } from './StatusBadge.tsx';\nimport { FeedbackLink } from './FeedbackLink.tsx';\nimport { PredefinedScenariosApprovalTooltip } from '../../predefinedScenarios/PredefinedScenariosApprovalTooltip.tsx';\n\nconst emptyDifferenceFetchState: DifferenceFetchState = {\n differenceState: {\n type: '4.*',\n migrationChanges: {\n migrationChanges: false,\n migrationRequiresNewApproval: false,\n migrationVersions: undefined,\n migrationChanges40: undefined,\n migrationChanges41: undefined,\n },\n valuations: [],\n scenarios: [],\n },\n status: null,\n isLoading: false,\n errorMessage: '',\n currentDifferenceId: '',\n defaultLastModifiedDateString: '',\n};\n\ninterface RiScStatusProps {\n selectedRiSc: RiScWithMetadata;\n publishRiScFn: () => void;\n predefinedScenariosDismissed: boolean;\n}\n\nexport function RiScStatusComponent({\n selectedRiSc,\n publishRiScFn,\n predefinedScenariosDismissed,\n}: RiScStatusProps) {\n const { t } = useTranslationRef(pluginRiScTranslationRef);\n const { fetchDifference } = useAuthenticatedFetch();\n\n const [publishRiScDialogIsOpen, setPublishRiScDialogIsOpen] =\n useState<boolean>(false);\n\n const [migrationDialogIsOpen, setMigrationDialogIsOpen] =\n useState<boolean>(false);\n\n const [differenceFetchState, setDifferenceFetchState] =\n useState<DifferenceFetchState>(emptyDifferenceFetchState);\n\n const { updateRiSc } = useRiScs();\n\n function handleApproveAndPublish() {\n publishRiScFn();\n setPublishRiScDialogIsOpen(false);\n }\n\n function getDifferences() {\n if (\n !selectedRiSc ||\n differenceFetchState.isLoading ||\n differenceFetchState.currentDifferenceId === selectedRiSc.id\n )\n return;\n\n setDifferenceFetchState({ ...differenceFetchState, isLoading: true });\n fetchDifference(\n selectedRiSc,\n response => {\n setDifferenceFetchState({\n differenceState: response.differenceState,\n isLoading: false,\n currentDifferenceId: selectedRiSc.id,\n status: response.status,\n errorMessage: response.errorMessage,\n defaultLastModifiedDateString: response.defaultLastModifiedDateString,\n });\n },\n () => {\n setDifferenceFetchState({\n ...emptyDifferenceFetchState,\n errorMessage: t('rosStatus.difference.error'),\n status: DifferenceStatus.FrontendFallback, // Fallback when the backend does not deliver a response with status\n });\n },\n );\n }\n\n function handleUpdate() {\n updateRiSc(selectedRiSc);\n setMigrationDialogIsOpen(false);\n }\n\n function handleOpenPublishRiScDialog() {\n setPublishRiScDialogIsOpen(true);\n getDifferences();\n }\n\n function handleClosePublishRiScDialog() {\n setPublishRiScDialogIsOpen(false);\n }\n\n useEffect(() => {\n setDifferenceFetchState(emptyDifferenceFetchState);\n }, [selectedRiSc]);\n\n const [status, setStatus] = useState<RiScStatusEnumType>(\n RiScStatusEnum.CREATED,\n );\n\n useEffect(() => {\n if (selectedRiSc.status === RiScStatus.DeletionDraft) {\n setStatus(RiScStatusEnum.DELETION_DRAFT);\n } else if (selectedRiSc.status === RiScStatus.DeletionSentForApproval) {\n setStatus(RiScStatusEnum.DELETION_WAITING);\n } else if (selectedRiSc.content.scenarios.length === 0) {\n setStatus(RiScStatusEnum.CREATED);\n } else if (selectedRiSc.status === RiScStatus.Draft) {\n setStatus(RiScStatusEnum.DRAFT);\n } else if (selectedRiSc.status === RiScStatus.SentForApproval) {\n setStatus(RiScStatusEnum.WAITING);\n } else if (selectedRiSc.status === RiScStatus.Published) {\n setStatus(RiScStatusEnum.PUBLISHED);\n }\n }, [selectedRiSc.status, selectedRiSc.content.scenarios]);\n\n const migration =\n selectedRiSc.migrationStatus?.migrationChanges &&\n selectedRiSc.status !== RiScStatus.DeletionDraft &&\n selectedRiSc.status !== RiScStatus.DeletionSentForApproval;\n\n const lastPublishedDateTime = selectedRiSc.lastPublished?.dateTime;\n const daysSinceLastModified = lastPublishedDateTime\n ? calculateDaysSince(new Date(lastPublishedDateTime))\n : null;\n\n const numOfCommitsBehind =\n selectedRiSc.lastPublished?.numberOfCommits ?? null;\n\n const showFeedbackLink =\n status === RiScStatusEnum.WAITING ||\n (status === RiScStatusEnum.PUBLISHED &&\n daysSinceLastModified !== null &&\n daysSinceLastModified <= 5);\n\n return (\n <Card style={{ height: 'fit-content' }}>\n <CardHeader>\n <Text variant=\"title-small\" weight=\"bold\" as=\"h5\">\n Status\n </Text>\n <StatusBanner\n numOfCommitsBehind={numOfCommitsBehind}\n daysSinceLastModified={daysSinceLastModified}\n differenceFetchState={differenceFetchState}\n />\n </CardHeader>\n <CardBody>\n {!migration && (\n <>\n <Flex\n direction=\"column\"\n justify=\"between\"\n align=\"start\"\n gap=\"1\"\n mt=\"4\"\n >\n <StatusBadge riScStatus={status} />\n <Flex direction=\"row\" mb=\"4\" pl=\"7\" style={{ width: '100%' }}>\n {status === RiScStatusEnum.CREATED && (\n <Text as=\"p\" variant=\"body-large\">\n {t('rosStatus.editing')}\n </Text>\n )}\n {status === RiScStatusEnum.DRAFT && (\n <Text as=\"p\" variant=\"body-large\">\n {t('rosStatus.statusBadge.missing')}\n </Text>\n )}\n {status === RiScStatusEnum.DELETION_DRAFT && (\n <Text as=\"p\" variant=\"body-large\">\n {t('rosStatus.statusBadge.deletionApproval')}\n </Text>\n )}\n {(status === RiScStatusEnum.WAITING ||\n status === RiScStatusEnum.DELETION_WAITING) && (\n <Flex\n justify=\"between\"\n align=\"baseline\"\n style={{ width: '100%' }}\n >\n <Text as=\"p\" variant=\"body-large\">\n {t('rosStatus.prStatus')}\n {status === RiScStatusEnum.WAITING &&\n t('rosStatus.prStatus2Update')}\n {status === RiScStatusEnum.DELETION_WAITING &&\n t('rosStatus.prStatus2Delete')}\n </Text>\n <ButtonLink\n target=\"_blank\"\n href={selectedRiSc.pullRequestUrl}\n variant=\"secondary\"\n >\n <i className=\"ri-external-link-line\" />\n {t('rosStatus.githubLink')}\n </ButtonLink>\n </Flex>\n )}\n {status === RiScStatusEnum.PUBLISHED && (\n <Text as=\"p\" variant=\"body-large\">\n {t('rosStatus.statusBadge.approved')}\n </Text>\n )}\n {(status === RiScStatusEnum.DRAFT ||\n status === RiScStatusEnum.DELETION_DRAFT) && (\n <>\n <PredefinedScenariosApprovalTooltip\n selectedRiSc={selectedRiSc}\n isDismissed={predefinedScenariosDismissed}\n >\n {(isDisabled: boolean) => (\n <Button\n variant=\"primary\"\n size=\"medium\"\n onClick={handleOpenPublishRiScDialog}\n isDisabled={isDisabled}\n style={{\n display: 'block',\n marginLeft: 'auto',\n fontSize: '14px',\n }}\n >\n {status === RiScStatusEnum.DRAFT &&\n t('rosStatus.approveButtonUpdate')}\n {status === RiScStatusEnum.DELETION_DRAFT &&\n t('rosStatus.approveButtonDelete')}\n </Button>\n )}\n </PredefinedScenariosApprovalTooltip>\n <RiScPublishDialog\n openDialog={publishRiScDialogIsOpen}\n isDeletion={status === RiScStatusEnum.DELETION_DRAFT}\n handlePublish={handleApproveAndPublish}\n handleCancel={handleClosePublishRiScDialog}\n differenceFetchState={differenceFetchState}\n />\n </>\n )}\n </Flex>\n </Flex>\n </>\n )}\n {/* Need to include the undefined check here, as TypeScript does not pick up that this check is part of `migration` */}\n {migration && selectedRiSc.migrationStatus && (\n <Box>\n <Box mt=\"2\" mb=\"2\">\n <Text as=\"p\" variant=\"body-large\" weight=\"bold\">\n <i className=\"ri-error-warning-line\" />{' '}\n {t('rosStatus.statusBadge.migration.title')}\n </Text>\n </Box>\n\n <Text as=\"p\" variant=\"body-large\">\n {t('rosStatus.statusBadge.migration.description')}\n </Text>\n\n <Flex direction=\"column\" mt=\"4\" align=\"end\">\n <Button\n variant=\"primary\"\n size=\"medium\"\n onClick={() => setMigrationDialogIsOpen(!migrationDialogIsOpen)}\n >\n {t('rosStatus.moreInformationButton')}\n </Button>\n </Flex>\n <RiScMigrationDialog\n openDialog={migrationDialogIsOpen}\n handleUpdate={handleUpdate}\n handleCancel={() => setMigrationDialogIsOpen(false)}\n migrationStatus={selectedRiSc.migrationStatus}\n />\n </Box>\n )}\n {/* Error */}\n {!selectedRiSc && (\n <Text as=\"span\">{t('rosStatus.statusBadge.error')}</Text>\n )}\n {showFeedbackLink && <FeedbackLink />}\n </CardBody>\n </Card>\n );\n}\n"],"names":[],"mappings":"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"}
@@ -24,6 +24,8 @@ import riscStyles from '../riScInfo/RiScSelectionCard.module.css.esm.js';
24
24
  import { ErrorState } from '../riScInfo/ErrorState.esm.js';
25
25
  import { LockedRiScView } from '../riScInfo/LockedRiScView.esm.js';
26
26
  import { ThreatActorsAndVulnerabilitiesCard } from '../threatActorsAndVulnerabilities/ThreatActorsAndVulnerabilitiesCard.esm.js';
27
+ import { PredefinedScenariosBanner } from '../predefinedScenarios/PredefinedScenariosBanner.esm.js';
28
+ import { usePredefinedScenariosBannerDismissal } from '../../stores/PredefinedScenariosBannerStore.esm.js';
27
29
 
28
30
  function RiScPlugin() {
29
31
  const [riScDialogState, setRiScDialogState] = useState(
@@ -59,6 +61,10 @@ function RiScPlugin() {
59
61
  failedToFetchGcpCryptoKeys,
60
62
  allRiScsFailedDecryption
61
63
  } = useRiScs();
64
+ const {
65
+ isDismissed: predefinedScenariosDismissed,
66
+ dismiss: dismissPredefinedScenarios
67
+ } = usePredefinedScenariosBannerDismissal(selectedRiSc?.id);
62
68
  const { t } = useTranslationRef(pluginRiScTranslationRef);
63
69
  const [searchParams] = useSearchParams();
64
70
  const scenarioWizardStep = searchParams.get(
@@ -153,6 +159,14 @@ function RiScPlugin() {
153
159
  /* @__PURE__ */ jsx(Grid, { size: 8, children: /* @__PURE__ */ jsx(RiScSelectionCard, {}) }),
154
160
  /* @__PURE__ */ jsx(Grid, { size: 4 }),
155
161
  /* @__PURE__ */ jsx(Grid, { size: 8, children: /* @__PURE__ */ jsxs(Flex, { gap: "24px", direction: "column", children: [
162
+ /* @__PURE__ */ jsx(
163
+ PredefinedScenariosBanner,
164
+ {
165
+ selectedRiSc,
166
+ isDismissed: predefinedScenariosDismissed,
167
+ dismiss: dismissPredefinedScenarios
168
+ }
169
+ ),
156
170
  /* @__PURE__ */ jsx(
157
171
  RiScDescriptionCard,
158
172
  {
@@ -167,7 +181,8 @@ function RiScPlugin() {
167
181
  RiScStatusComponent,
168
182
  {
169
183
  selectedRiSc,
170
- publishRiScFn: approveRiSc
184
+ publishRiScFn: approveRiSc,
185
+ predefinedScenariosDismissed
171
186
  }
172
187
  ),
173
188
  /* @__PURE__ */ jsx(RiskMatrix, { riScWithMetadata: selectedRiSc }),
@@ -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 { LockedRiScView } from '../riScInfo/LockedRiScView.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 selectedLockedRiSc,\n selectedSystemRiSc,\n isFetching,\n resetResponse,\n resetRiScStatus,\n response,\n updateStatus,\n riScs,\n systemRiScs,\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 !selectedSystemRiSc &&\n !selectedLockedRiSc &&\n !allRiScsFailedDecryption && (\n <Flex\n direction=\"column\"\n gap=\"24px\"\n justify=\"center\"\n align=\"center\"\n className={riscStyles.componentLayout}\n >\n {/* TODO: Fjern hardkodet tekst og finn bedre oppførsel når det kun finnes system-RoS (Oppgave laget i notion) */}\n {systemRiScs.length > 0 && (\n <>\n <RiScSelectionCard />\n <span>System-RoS kan velges i dropdown</span>\n </>\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 !selectedSystemRiSc &&\n !selectedLockedRiSc &&\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 {selectedSystemRiSc && (\n <Flex\n justify=\"center\"\n align=\"center\"\n className={riscStyles.componentLayout}\n >\n {/* System RiScs redirect through their first appliesTo entity and render there as regular or locked RiScs. */}\n <Spinner size={80} />\n </Flex>\n )}\n\n {selectedLockedRiSc && (\n <>\n <Grid container spacing={4}>\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>\n </Grid>\n </Grid>\n <Flex\n justify=\"center\"\n align=\"center\"\n className={riscStyles.componentLayout}\n >\n <LockedRiScView lockedRiSc={selectedLockedRiSc} />\n </Flex>\n </>\n )}\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 { LockedRiScView } from '../riScInfo/LockedRiScView.tsx';\nimport { ThreatActorsAndVulnerabilitiesCard } from '../threatActorsAndVulnerabilities/ThreatActorsAndVulnerabilitiesCard.tsx';\nimport { PredefinedScenariosBanner } from '../predefinedScenarios/PredefinedScenariosBanner.tsx';\nimport { usePredefinedScenariosBannerDismissal } from '../../stores/PredefinedScenariosBannerStore.ts';\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 selectedLockedRiSc,\n selectedSystemRiSc,\n isFetching,\n resetResponse,\n resetRiScStatus,\n response,\n updateStatus,\n riScs,\n systemRiScs,\n failedToFetchGcpCryptoKeys,\n allRiScsFailedDecryption,\n } = useRiScs();\n\n const {\n isDismissed: predefinedScenariosDismissed,\n dismiss: dismissPredefinedScenarios,\n } = usePredefinedScenariosBannerDismissal(selectedRiSc?.id);\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 !selectedSystemRiSc &&\n !selectedLockedRiSc &&\n !allRiScsFailedDecryption && (\n <Flex\n direction=\"column\"\n gap=\"24px\"\n justify=\"center\"\n align=\"center\"\n className={riscStyles.componentLayout}\n >\n {/* TODO: Fjern hardkodet tekst og finn bedre oppførsel når det kun finnes system-RoS (Oppgave laget i notion) */}\n {systemRiScs.length > 0 && (\n <>\n <RiScSelectionCard />\n <span>System-RoS kan velges i dropdown</span>\n </>\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 !selectedSystemRiSc &&\n !selectedLockedRiSc &&\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 {selectedSystemRiSc && (\n <Flex\n justify=\"center\"\n align=\"center\"\n className={riscStyles.componentLayout}\n >\n {/* System RiScs redirect through their first appliesTo entity and render there as regular or locked RiScs. */}\n <Spinner size={80} />\n </Flex>\n )}\n\n {selectedLockedRiSc && (\n <>\n <Grid container spacing={4}>\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>\n </Grid>\n </Grid>\n <Flex\n justify=\"center\"\n align=\"center\"\n className={riscStyles.componentLayout}\n >\n <LockedRiScView lockedRiSc={selectedLockedRiSc} />\n </Flex>\n </>\n )}\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 <PredefinedScenariosBanner\n selectedRiSc={selectedRiSc}\n isDismissed={predefinedScenariosDismissed}\n dismiss={dismissPredefinedScenarios}\n />\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 predefinedScenariosDismissed={\n predefinedScenariosDismissed\n }\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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"}
@@ -0,0 +1,69 @@
1
+ import { useQuery } from '@tanstack/react-query';
2
+ import { useApi, configApiRef, identityApiRef, githubAuthApiRef, fetchApiRef } from '@backstage/core-plugin-api';
3
+ import { buildNativeBackendUrls } from '../urls/backend.esm.js';
4
+ import { useGithubRepositoryInformation } from '../utils/hooks.esm.js';
5
+ import { latestSupportedVersion } from '../utils/constants.esm.js';
6
+
7
+ const PREDEFINED_SCENARIOS_TEMPLATE_ID = "web-app-api";
8
+ const PREDEFINED_SCENARIOS_SOURCE_TEST_REF = "add-scenarios";
9
+ const PREDEFINED_SCENARIO_IDS = ["xK9mP", "mF6xQ"];
10
+ const PREDEFINED_SCENARIOS_QUERY_KEY = ["predefined-scenarios"];
11
+ function usePredefinedScenarios(isTestPredefinedScenariosEnabled) {
12
+ const configApi = useApi(configApiRef);
13
+ const identityApi = useApi(identityApiRef);
14
+ const githubApi = useApi(githubAuthApiRef);
15
+ const { fetch } = useApi(fetchApiRef);
16
+ const repoInformation = useGithubRepositoryInformation();
17
+ const backendUrl = configApi.getString("backend.baseUrl");
18
+ const { uriToFetchInitRiScTemplate } = buildNativeBackendUrls({
19
+ baseUrl: `${backendUrl}/api/risk-scorecard`,
20
+ owner: repoInformation.owner,
21
+ repo: repoInformation.name,
22
+ version: latestSupportedVersion
23
+ });
24
+ return useQuery({
25
+ queryKey: [
26
+ PREDEFINED_SCENARIOS_QUERY_KEY,
27
+ isTestPredefinedScenariosEnabled ? "test" : "main"
28
+ ],
29
+ retry: (count, error) => {
30
+ if (error.message === "Unexpected status 401" || error.message === "Unexpected status 403" || error.message === "Unexpected status 404" || error.message === "Unexpected status 429") {
31
+ return false;
32
+ }
33
+ return count < 2;
34
+ },
35
+ queryFn: async ({ signal }) => {
36
+ const [identity, githubToken] = await Promise.all([
37
+ identityApi.getCredentials(),
38
+ githubApi.getAccessToken(["repo"])
39
+ ]);
40
+ const response = await fetch(
41
+ uriToFetchInitRiScTemplate(
42
+ PREDEFINED_SCENARIOS_TEMPLATE_ID,
43
+ isTestPredefinedScenariosEnabled ? PREDEFINED_SCENARIOS_SOURCE_TEST_REF : void 0
44
+ ),
45
+ {
46
+ signal,
47
+ headers: {
48
+ Authorization: `Bearer ${identity.token}`,
49
+ "GitHub-Access-Token": githubToken
50
+ }
51
+ }
52
+ );
53
+ if (!response.ok) {
54
+ throw new Error(`Unexpected status ${response.status}`);
55
+ }
56
+ const data = await response.json();
57
+ const scenarios = data?.scenarios;
58
+ if (!Array.isArray(scenarios)) {
59
+ throw new Error("Source file has no scenarios array");
60
+ }
61
+ return scenarios.filter(
62
+ (dto) => PREDEFINED_SCENARIO_IDS.includes(dto.scenario.ID)
63
+ );
64
+ }
65
+ });
66
+ }
67
+
68
+ export { usePredefinedScenarios };
69
+ //# sourceMappingURL=usePredefinedScenarios.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usePredefinedScenarios.esm.js","sources":["../../src/hooks/usePredefinedScenarios.ts"],"sourcesContent":["import { useQuery } from '@tanstack/react-query';\nimport {\n configApiRef,\n fetchApiRef,\n githubAuthApiRef,\n identityApiRef,\n useApi,\n} from '@backstage/core-plugin-api';\nimport { ScenarioDTO } from '../utils/DTOs.ts';\nimport { buildNativeBackendUrls } from '../urls/backend.ts';\nimport { useGithubRepositoryInformation } from '../utils/hooks.ts';\nimport { latestSupportedVersion } from '../utils/constants.ts';\n\nconst PREDEFINED_SCENARIOS_TEMPLATE_ID = 'web-app-api';\nconst PREDEFINED_SCENARIOS_SOURCE_TEST_REF = 'add-scenarios';\n\nconst PREDEFINED_SCENARIO_IDS = ['xK9mP', 'mF6xQ'];\n\nconst PREDEFINED_SCENARIOS_QUERY_KEY = ['predefined-scenarios'] as const;\n\nexport function usePredefinedScenarios(\n isTestPredefinedScenariosEnabled: boolean,\n) {\n const configApi = useApi(configApiRef);\n const identityApi = useApi(identityApiRef);\n const githubApi = useApi(githubAuthApiRef);\n const { fetch } = useApi(fetchApiRef);\n const repoInformation = useGithubRepositoryInformation();\n\n const backendUrl = configApi.getString('backend.baseUrl');\n const { uriToFetchInitRiScTemplate } = buildNativeBackendUrls({\n baseUrl: `${backendUrl}/api/risk-scorecard`,\n owner: repoInformation.owner,\n repo: repoInformation.name,\n version: latestSupportedVersion,\n });\n\n return useQuery({\n queryKey: [\n PREDEFINED_SCENARIOS_QUERY_KEY,\n isTestPredefinedScenariosEnabled ? 'test' : 'main',\n ],\n retry: (count, error) => {\n if (\n error.message === 'Unexpected status 401' ||\n error.message === 'Unexpected status 403' ||\n error.message === 'Unexpected status 404' ||\n error.message === 'Unexpected status 429'\n ) {\n return false;\n }\n return count < 2;\n },\n queryFn: async ({ signal }): Promise<ScenarioDTO[]> => {\n const [identity, githubToken] = await Promise.all([\n identityApi.getCredentials(),\n githubApi.getAccessToken(['repo']),\n ]);\n\n const response = await fetch(\n uriToFetchInitRiScTemplate(\n PREDEFINED_SCENARIOS_TEMPLATE_ID,\n isTestPredefinedScenariosEnabled\n ? PREDEFINED_SCENARIOS_SOURCE_TEST_REF\n : undefined,\n ),\n {\n signal,\n headers: {\n Authorization: `Bearer ${identity.token}`,\n 'GitHub-Access-Token': githubToken,\n },\n },\n );\n if (!response.ok) {\n throw new Error(`Unexpected status ${response.status}`);\n }\n const data: unknown = await response.json();\n const scenarios = (data as { scenarios?: ScenarioDTO[] })?.scenarios;\n if (!Array.isArray(scenarios)) {\n throw new Error('Source file has no scenarios array');\n }\n\n return scenarios.filter(dto =>\n PREDEFINED_SCENARIO_IDS.includes(dto.scenario.ID),\n );\n },\n });\n}\n"],"names":[],"mappings":";;;;;;AAaA,MAAM,gCAAA,GAAmC,aAAA;AACzC,MAAM,oCAAA,GAAuC,eAAA;AAE7C,MAAM,uBAAA,GAA0B,CAAC,OAAA,EAAS,OAAO,CAAA;AAEjD,MAAM,8BAAA,GAAiC,CAAC,sBAAsB,CAAA;AAEvD,SAAS,uBACd,gCAAA,EACA;AACA,EAAA,MAAM,SAAA,GAAY,OAAO,YAAY,CAAA;AACrC,EAAA,MAAM,WAAA,GAAc,OAAO,cAAc,CAAA;AACzC,EAAA,MAAM,SAAA,GAAY,OAAO,gBAAgB,CAAA;AACzC,EAAA,MAAM,EAAE,KAAA,EAAM,GAAI,MAAA,CAAO,WAAW,CAAA;AACpC,EAAA,MAAM,kBAAkB,8BAAA,EAA+B;AAEvD,EAAA,MAAM,UAAA,GAAa,SAAA,CAAU,SAAA,CAAU,iBAAiB,CAAA;AACxD,EAAA,MAAM,EAAE,0BAAA,EAA2B,GAAI,sBAAA,CAAuB;AAAA,IAC5D,OAAA,EAAS,GAAG,UAAU,CAAA,mBAAA,CAAA;AAAA,IACtB,OAAO,eAAA,CAAgB,KAAA;AAAA,IACvB,MAAM,eAAA,CAAgB,IAAA;AAAA,IACtB,OAAA,EAAS;AAAA,GACV,CAAA;AAED,EAAA,OAAO,QAAA,CAAS;AAAA,IACd,QAAA,EAAU;AAAA,MACR,8BAAA;AAAA,MACA,mCAAmC,MAAA,GAAS;AAAA,KAC9C;AAAA,IACA,KAAA,EAAO,CAAC,KAAA,EAAO,KAAA,KAAU;AACvB,MAAA,IACE,KAAA,CAAM,OAAA,KAAY,uBAAA,IAClB,KAAA,CAAM,OAAA,KAAY,uBAAA,IAClB,KAAA,CAAM,OAAA,KAAY,uBAAA,IAClB,KAAA,CAAM,OAAA,KAAY,uBAAA,EAClB;AACA,QAAA,OAAO,KAAA;AAAA,MACT;AACA,MAAA,OAAO,KAAA,GAAQ,CAAA;AAAA,IACjB,CAAA;AAAA,IACA,OAAA,EAAS,OAAO,EAAE,MAAA,EAAO,KAA8B;AACrD,MAAA,MAAM,CAAC,QAAA,EAAU,WAAW,CAAA,GAAI,MAAM,QAAQ,GAAA,CAAI;AAAA,QAChD,YAAY,cAAA,EAAe;AAAA,QAC3B,SAAA,CAAU,cAAA,CAAe,CAAC,MAAM,CAAC;AAAA,OAClC,CAAA;AAED,MAAA,MAAM,WAAW,MAAM,KAAA;AAAA,QACrB,0BAAA;AAAA,UACE,gCAAA;AAAA,UACA,mCACI,oCAAA,GACA;AAAA,SACN;AAAA,QACA;AAAA,UACE,MAAA;AAAA,UACA,OAAA,EAAS;AAAA,YACP,aAAA,EAAe,CAAA,OAAA,EAAU,QAAA,CAAS,KAAK,CAAA,CAAA;AAAA,YACvC,qBAAA,EAAuB;AAAA;AACzB;AACF,OACF;AACA,MAAA,IAAI,CAAC,SAAS,EAAA,EAAI;AAChB,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,kBAAA,EAAqB,QAAA,CAAS,MAAM,CAAA,CAAE,CAAA;AAAA,MACxD;AACA,MAAA,MAAM,IAAA,GAAgB,MAAM,QAAA,CAAS,IAAA,EAAK;AAC1C,MAAA,MAAM,YAAa,IAAA,EAAwC,SAAA;AAC3D,MAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,SAAS,CAAA,EAAG;AAC7B,QAAA,MAAM,IAAI,MAAM,oCAAoC,CAAA;AAAA,MACtD;AAEA,MAAA,OAAO,SAAA,CAAU,MAAA;AAAA,QAAO,CAAA,GAAA,KACtB,uBAAA,CAAwB,QAAA,CAAS,GAAA,CAAI,SAAS,EAAE;AAAA,OAClD;AAAA,IACF;AAAA,GACD,CAAA;AACH;;;;"}
package/dist/index.d.ts CHANGED
@@ -1,8 +1,8 @@
1
- import * as react from 'react';
1
+ import * as react_jsx_runtime from 'react/jsx-runtime';
2
2
  import * as _backstage_core_plugin_api from '@backstage/core-plugin-api';
3
3
  import * as _backstage_frontend_plugin_api from '@backstage/frontend-plugin-api';
4
4
 
5
- declare function PluginRoot(): react.JSX.Element;
5
+ declare function PluginRoot(): react_jsx_runtime.JSX.Element;
6
6
 
7
7
  declare const riScPlugin: _backstage_core_plugin_api.BackstagePlugin<{
8
8
  root: _backstage_core_plugin_api.RouteRef<undefined>;