@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.
- package/dist/PluginRoot.esm.js +9 -1
- package/dist/PluginRoot.esm.js.map +1 -1
- package/dist/components/predefinedScenarios/PredefinedScenariosApprovalTooltip.esm.js +34 -0
- package/dist/components/predefinedScenarios/PredefinedScenariosApprovalTooltip.esm.js.map +1 -0
- package/dist/components/predefinedScenarios/PredefinedScenariosBanner.esm.js +76 -0
- package/dist/components/predefinedScenarios/PredefinedScenariosBanner.esm.js.map +1 -0
- package/dist/components/predefinedScenarios/PredefinedScenariosBanner.module.css.esm.js +8 -0
- package/dist/components/predefinedScenarios/PredefinedScenariosBanner.module.css.esm.js.map +1 -0
- package/dist/components/riScInfo/riScStatus/RiScStatusComponent.esm.js +25 -15
- package/dist/components/riScInfo/riScStatus/RiScStatusComponent.esm.js.map +1 -1
- package/dist/components/riScPlugin/RiScPlugin.esm.js +16 -1
- package/dist/components/riScPlugin/RiScPlugin.esm.js.map +1 -1
- package/dist/hooks/usePredefinedScenarios.esm.js +69 -0
- package/dist/hooks/usePredefinedScenarios.esm.js.map +1 -0
- package/dist/index.d.ts +2 -2
- package/dist/stores/PredefinedScenariosBannerStore.esm.js +36 -0
- package/dist/stores/PredefinedScenariosBannerStore.esm.js.map +1 -0
- package/dist/urls/backend.esm.js +2 -1
- package/dist/urls/backend.esm.js.map +1 -1
- package/dist/utils/featureFlags.esm.js +10 -1
- package/dist/utils/featureFlags.esm.js.map +1 -1
- package/dist/utils/hooks.esm.js +1 -1
- package/dist/utils/hooks.esm.js.map +1 -1
- package/dist/utils/predefinedScenarios.esm.js +23 -0
- package/dist/utils/predefinedScenarios.esm.js.map +1 -0
- package/dist/utils/translations.esm.js +22 -0
- package/dist/utils/translations.esm.js.map +1 -1
- package/package.json +2 -1
package/dist/PluginRoot.esm.js
CHANGED
|
@@ -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 <
|
|
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__ */
|
|
170
|
-
|
|
171
|
+
/* @__PURE__ */ jsx(
|
|
172
|
+
PredefinedScenariosApprovalTooltip,
|
|
171
173
|
{
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
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
|
|
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():
|
|
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>;
|