@backstage-community/plugin-tech-insights-maturity 0.2.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/CHANGELOG.md +21 -0
- package/README.md +177 -0
- package/dist/ScoreRouter.esm.js +8 -0
- package/dist/ScoreRouter.esm.js.map +1 -0
- package/dist/SummaryRouter.esm.js +8 -0
- package/dist/SummaryRouter.esm.js.map +1 -0
- package/dist/api/MaturityApi.esm.js +8 -0
- package/dist/api/MaturityApi.esm.js.map +1 -0
- package/dist/api/MaturityClient.esm.js +128 -0
- package/dist/api/MaturityClient.esm.js.map +1 -0
- package/dist/api/ScoringDataFormatter.esm.js +142 -0
- package/dist/api/ScoringDataFormatter.esm.js.map +1 -0
- package/dist/components/MaturityChartCard/MaturityChartCard.esm.js +79 -0
- package/dist/components/MaturityChartCard/MaturityChartCard.esm.js.map +1 -0
- package/dist/components/MaturityChartCard/index.esm.js +2 -0
- package/dist/components/MaturityChartCard/index.esm.js.map +1 -0
- package/dist/components/MaturityPage/MaturityPage.esm.js +21 -0
- package/dist/components/MaturityPage/MaturityPage.esm.js.map +1 -0
- package/dist/components/MaturityPage/index.esm.js +2 -0
- package/dist/components/MaturityPage/index.esm.js.map +1 -0
- package/dist/components/MaturityRankAvatar/MaturityRankAvatar.esm.js +100 -0
- package/dist/components/MaturityRankAvatar/MaturityRankAvatar.esm.js.map +1 -0
- package/dist/components/MaturityRankInfoCard/MaturityRankInfoCard.esm.js +80 -0
- package/dist/components/MaturityRankInfoCard/MaturityRankInfoCard.esm.js.map +1 -0
- package/dist/components/MaturityRankWidget/MaturityRankWidget.esm.js +22 -0
- package/dist/components/MaturityRankWidget/MaturityRankWidget.esm.js.map +1 -0
- package/dist/components/MaturityRankWidget/index.esm.js +2 -0
- package/dist/components/MaturityRankWidget/index.esm.js.map +1 -0
- package/dist/components/MaturityScorePage/MaturityScorePage.esm.js +85 -0
- package/dist/components/MaturityScorePage/MaturityScorePage.esm.js.map +1 -0
- package/dist/components/MaturityScorePage/maturityTableRows.esm.js +124 -0
- package/dist/components/MaturityScorePage/maturityTableRows.esm.js.map +1 -0
- package/dist/components/MaturitySummaryInfoCard/MaturitySummaryCardContent.esm.js +17 -0
- package/dist/components/MaturitySummaryInfoCard/MaturitySummaryCardContent.esm.js.map +1 -0
- package/dist/components/MaturitySummaryInfoCard/MaturitySummaryInfoCard.esm.js +34 -0
- package/dist/components/MaturitySummaryInfoCard/MaturitySummaryInfoCard.esm.js.map +1 -0
- package/dist/components/MaturitySummaryInfoCard/index.esm.js +2 -0
- package/dist/components/MaturitySummaryInfoCard/index.esm.js.map +1 -0
- package/dist/components/MaturitySummaryPage/MaturitySummaryPage.esm.js +35 -0
- package/dist/components/MaturitySummaryPage/MaturitySummaryPage.esm.js.map +1 -0
- package/dist/components/MaturitySummaryTable/MaturitySummaryTable.esm.js +206 -0
- package/dist/components/MaturitySummaryTable/MaturitySummaryTable.esm.js.map +1 -0
- package/dist/helpers/AreaProgress.esm.js +47 -0
- package/dist/helpers/AreaProgress.esm.js.map +1 -0
- package/dist/helpers/MaturityHelp.esm.js +9 -0
- package/dist/helpers/MaturityHelp.esm.js.map +1 -0
- package/dist/helpers/MaturityLink.esm.js +25 -0
- package/dist/helpers/MaturityLink.esm.js.map +1 -0
- package/dist/helpers/Rank.esm.js +33 -0
- package/dist/helpers/Rank.esm.js.map +1 -0
- package/dist/helpers/utils.esm.js +41 -0
- package/dist/helpers/utils.esm.js.map +1 -0
- package/dist/img/bronze.png +0 -0
- package/dist/img/gold.png +0 -0
- package/dist/img/silver.png +0 -0
- package/dist/img/stone.png +0 -0
- package/dist/index.d.ts +86 -0
- package/dist/index.esm.js +4 -0
- package/dist/index.esm.js.map +1 -0
- package/dist/plugin.esm.js +80 -0
- package/dist/plugin.esm.js.map +1 -0
- package/dist/routes.esm.js +8 -0
- package/dist/routes.esm.js.map +1 -0
- package/package.json +104 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.esm.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { Page, Header, Content } from '@backstage/core-components';
|
|
2
|
+
import { useApi } from '@backstage/core-plugin-api';
|
|
3
|
+
import { catalogApiRef } from '@backstage/plugin-catalog-react';
|
|
4
|
+
import Grid from '@mui/material/Grid';
|
|
5
|
+
import React from 'react';
|
|
6
|
+
import useAsyncRetry from 'react-use/lib/useAsync';
|
|
7
|
+
import { MaturityChartCard } from '../MaturityChartCard/MaturityChartCard.esm.js';
|
|
8
|
+
|
|
9
|
+
const MaturityPage = () => {
|
|
10
|
+
const catalogApi = useApi(catalogApiRef);
|
|
11
|
+
const { value: entities } = useAsyncRetry(async () => {
|
|
12
|
+
const entitiesList = await catalogApi.getEntities({
|
|
13
|
+
filter: { kind: ["Component"] }
|
|
14
|
+
});
|
|
15
|
+
return entitiesList.items;
|
|
16
|
+
}, [catalogApi]);
|
|
17
|
+
return /* @__PURE__ */ React.createElement(Page, { themeId: "home" }, /* @__PURE__ */ React.createElement(Header, { title: "Maturity" }), /* @__PURE__ */ React.createElement(Content, null, /* @__PURE__ */ React.createElement(Grid, { container: true }, /* @__PURE__ */ React.createElement(Grid, { item: true, md: 4 }, /* @__PURE__ */ React.createElement(MaturityChartCard, { entities: entities ?? [] })))));
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
export { MaturityPage };
|
|
21
|
+
//# sourceMappingURL=MaturityPage.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MaturityPage.esm.js","sources":["../../../src/components/MaturityPage/MaturityPage.tsx"],"sourcesContent":["/*\n * Copyright 2025 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { Content, Header, Page } from '@backstage/core-components';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { catalogApiRef } from '@backstage/plugin-catalog-react';\nimport Grid from '@mui/material/Grid';\nimport React from 'react';\nimport useAsyncRetry from 'react-use/lib/useAsync';\nimport { MaturityChartCard } from '../MaturityChartCard';\n\nexport const MaturityPage = () => {\n const catalogApi = useApi(catalogApiRef);\n\n const { value: entities } = useAsyncRetry(async () => {\n const entitiesList = await catalogApi.getEntities({\n filter: { kind: ['Component'] },\n });\n return entitiesList.items;\n }, [catalogApi]);\n\n return (\n <Page themeId=\"home\">\n <Header title=\"Maturity\" />\n <Content>\n <Grid container>\n <Grid item md={4}>\n <MaturityChartCard entities={entities ?? []} />\n </Grid>\n </Grid>\n </Content>\n </Page>\n );\n};\n"],"names":[],"mappings":";;;;;;;;AAuBO,MAAM,eAAe,MAAM;AAChC,EAAM,MAAA,UAAA,GAAa,OAAO,aAAa,CAAA;AAEvC,EAAA,MAAM,EAAE,KAAA,EAAO,QAAS,EAAA,GAAI,cAAc,YAAY;AACpD,IAAM,MAAA,YAAA,GAAe,MAAM,UAAA,CAAW,WAAY,CAAA;AAAA,MAChD,MAAQ,EAAA,EAAE,IAAM,EAAA,CAAC,WAAW,CAAE;AAAA,KAC/B,CAAA;AACD,IAAA,OAAO,YAAa,CAAA,KAAA;AAAA,GACtB,EAAG,CAAC,UAAU,CAAC,CAAA;AAEf,EAAA,uBACG,KAAA,CAAA,aAAA,CAAA,IAAA,EAAA,EAAK,OAAQ,EAAA,MAAA,EAAA,kBACX,KAAA,CAAA,aAAA,CAAA,MAAA,EAAA,EAAO,KAAM,EAAA,UAAA,EAAW,CACzB,kBAAA,KAAA,CAAA,aAAA,CAAC,OACC,EAAA,IAAA,kBAAA,KAAA,CAAA,aAAA,CAAC,QAAK,SAAS,EAAA,IAAA,EAAA,kBACZ,KAAA,CAAA,aAAA,CAAA,IAAA,EAAA,EAAK,IAAI,EAAA,IAAA,EAAC,EAAI,EAAA,CAAA,EAAA,kBACZ,KAAA,CAAA,aAAA,CAAA,iBAAA,EAAA,EAAkB,QAAU,EAAA,QAAA,IAAY,EAAC,EAAG,CAC/C,CACF,CACF,CACF,CAAA;AAEJ;;;;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.esm.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import { Rank } from '@backstage-community/plugin-tech-insights-maturity-common';
|
|
2
|
+
import Avatar from '@mui/material/Avatar';
|
|
3
|
+
import Chip from '@mui/material/Chip';
|
|
4
|
+
import Tooltip from '@mui/material/Tooltip';
|
|
5
|
+
import { Circle } from 'rc-progress';
|
|
6
|
+
import React from 'react';
|
|
7
|
+
import getRankImg from '../../helpers/Rank.esm.js';
|
|
8
|
+
import { getNextRankColor, pluralize } from '../../helpers/utils.esm.js';
|
|
9
|
+
import { MaturityLink } from '../../helpers/MaturityLink.esm.js';
|
|
10
|
+
|
|
11
|
+
const ChipWrapper = ({
|
|
12
|
+
children,
|
|
13
|
+
rank,
|
|
14
|
+
size,
|
|
15
|
+
isMaxRank
|
|
16
|
+
}) => {
|
|
17
|
+
let backgroundColor;
|
|
18
|
+
if (isMaxRank) {
|
|
19
|
+
backgroundColor = "rgb(35, 180, 70, 1)";
|
|
20
|
+
}
|
|
21
|
+
return /* @__PURE__ */ React.createElement(
|
|
22
|
+
Chip,
|
|
23
|
+
{
|
|
24
|
+
avatar: children,
|
|
25
|
+
label: Rank[rank],
|
|
26
|
+
style: {
|
|
27
|
+
height: size + 7,
|
|
28
|
+
backgroundColor,
|
|
29
|
+
margin: "0"
|
|
30
|
+
},
|
|
31
|
+
clickable: true
|
|
32
|
+
}
|
|
33
|
+
);
|
|
34
|
+
};
|
|
35
|
+
const MaturityRankAvatar = ({
|
|
36
|
+
className,
|
|
37
|
+
entity,
|
|
38
|
+
progress,
|
|
39
|
+
size = 27,
|
|
40
|
+
value,
|
|
41
|
+
variant
|
|
42
|
+
}) => {
|
|
43
|
+
let result;
|
|
44
|
+
const rank = value.rank;
|
|
45
|
+
const maxRank = value.isMaxRank ? value.rank : Rank.Gold;
|
|
46
|
+
const img = getRankImg(rank);
|
|
47
|
+
result = /* @__PURE__ */ React.createElement(
|
|
48
|
+
Avatar,
|
|
49
|
+
{
|
|
50
|
+
alt: Rank[rank],
|
|
51
|
+
src: img,
|
|
52
|
+
className,
|
|
53
|
+
style: { width: size, height: size }
|
|
54
|
+
}
|
|
55
|
+
);
|
|
56
|
+
let tooltip = "";
|
|
57
|
+
if (progress !== void 0) {
|
|
58
|
+
const remainingTasks = progress.totalChecks - progress.passedChecks;
|
|
59
|
+
const remainingTasksTip = `(${remainingTasks} task${pluralize(
|
|
60
|
+
remainingTasks
|
|
61
|
+
)} left)`;
|
|
62
|
+
tooltip = value.isMaxRank ? `${Rank[rank]} rank acquired` : `${progress.percentage}% to ${Rank[rank + 1]} ${remainingTasksTip}`;
|
|
63
|
+
result = /* @__PURE__ */ React.createElement(
|
|
64
|
+
"div",
|
|
65
|
+
{
|
|
66
|
+
style: {
|
|
67
|
+
display: "flex",
|
|
68
|
+
position: "relative",
|
|
69
|
+
alignItems: "center",
|
|
70
|
+
justifyContent: "center"
|
|
71
|
+
}
|
|
72
|
+
},
|
|
73
|
+
/* @__PURE__ */ React.createElement(
|
|
74
|
+
Circle,
|
|
75
|
+
{
|
|
76
|
+
strokeColor: getNextRankColor(rank, maxRank),
|
|
77
|
+
trailColor: "rgba(0, 0, 0, 0.1)",
|
|
78
|
+
strokeWidth: 14,
|
|
79
|
+
trailWidth: 14,
|
|
80
|
+
percent: progress.percentage,
|
|
81
|
+
style: { width: size + size / 4, height: size + size / 4 }
|
|
82
|
+
}
|
|
83
|
+
),
|
|
84
|
+
/* @__PURE__ */ React.createElement("div", { style: { zIndex: 1, position: "absolute" } }, result)
|
|
85
|
+
);
|
|
86
|
+
} else {
|
|
87
|
+
tooltip = Rank[rank];
|
|
88
|
+
}
|
|
89
|
+
if (variant === "chip") {
|
|
90
|
+
tooltip = value.isMaxRank ? "All required tasks have been completed!" : `Increase your rank by completing all ${Rank[rank + 1]} rank tasks!`;
|
|
91
|
+
result = /* @__PURE__ */ React.createElement(ChipWrapper, { rank, size, isMaxRank: value.isMaxRank }, result);
|
|
92
|
+
}
|
|
93
|
+
if (entity !== void 0) {
|
|
94
|
+
result = /* @__PURE__ */ React.createElement("div", null, /* @__PURE__ */ React.createElement(MaturityLink, { entity }, result));
|
|
95
|
+
}
|
|
96
|
+
return /* @__PURE__ */ React.createElement(Tooltip, { title: tooltip, arrow: true }, result);
|
|
97
|
+
};
|
|
98
|
+
|
|
99
|
+
export { MaturityRankAvatar };
|
|
100
|
+
//# sourceMappingURL=MaturityRankAvatar.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MaturityRankAvatar.esm.js","sources":["../../../src/components/MaturityRankAvatar/MaturityRankAvatar.tsx"],"sourcesContent":["/*\n * Copyright 2025 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { Entity } from '@backstage/catalog-model';\nimport {\n MaturityProgress,\n Rank,\n} from '@backstage-community/plugin-tech-insights-maturity-common';\nimport Avatar from '@mui/material/Avatar';\nimport Chip from '@mui/material/Chip';\nimport Tooltip from '@mui/material/Tooltip';\nimport { Circle } from 'rc-progress';\nimport React from 'react';\nimport getRankImg from '../../helpers/Rank';\nimport { getNextRankColor, pluralize } from '../../helpers/utils';\nimport { MaturityLink } from '../../helpers/MaturityLink';\n\nconst ChipWrapper = ({\n children,\n rank,\n size,\n isMaxRank,\n}: {\n children: React.JSX.Element;\n rank: Rank;\n size: number;\n isMaxRank?: boolean;\n}) => {\n let backgroundColor;\n if (isMaxRank) {\n backgroundColor = 'rgb(35, 180, 70, 1)';\n }\n\n return (\n <Chip\n avatar={children}\n label={Rank[rank]}\n style={{\n height: size + 7,\n backgroundColor,\n margin: '0',\n }}\n clickable\n />\n );\n};\n\ntype Props = {\n value: { rank: Rank; isMaxRank?: boolean };\n className?: string;\n entity?: Entity;\n size?: number;\n progress?: MaturityProgress;\n variant?: 'chip';\n};\n\nexport const MaturityRankAvatar = ({\n className,\n entity,\n progress,\n size = 27,\n value,\n variant,\n}: Props) => {\n let result;\n const rank = value.rank;\n const maxRank = value.isMaxRank ? value.rank : Rank.Gold;\n\n const img = getRankImg(rank);\n\n // Define base Avatar element\n result = (\n <Avatar\n alt={Rank[rank]}\n src={img}\n className={className}\n style={{ width: size, height: size }}\n />\n );\n\n let tooltip = '';\n\n // Wrap Avatar with a progress indicator if provided\n if (progress !== undefined) {\n const remainingTasks = progress.totalChecks - progress.passedChecks;\n const remainingTasksTip = `(${remainingTasks} task${pluralize(\n remainingTasks,\n )} left)`;\n tooltip = value.isMaxRank\n ? `${Rank[rank]} rank acquired`\n : `${progress.percentage}% to ${Rank[rank + 1]} ${remainingTasksTip}`;\n\n result = (\n <div\n style={{\n display: 'flex',\n position: 'relative',\n alignItems: 'center',\n justifyContent: 'center',\n }}\n >\n <Circle\n strokeColor={getNextRankColor(rank, maxRank)}\n trailColor=\"rgba(0, 0, 0, 0.1)\"\n strokeWidth={14}\n trailWidth={14}\n percent={progress.percentage}\n style={{ width: size + size / 4, height: size + size / 4 }}\n />\n <div style={{ zIndex: 1, position: 'absolute' }}>{result}</div>\n </div>\n );\n } else {\n tooltip = Rank[rank];\n }\n\n // Wrap Avatar in Chip if specified\n if (variant === 'chip') {\n tooltip = value.isMaxRank\n ? 'All required tasks have been completed!'\n : `Increase your rank by completing all ${Rank[rank + 1]} rank tasks!`;\n\n result = (\n <ChipWrapper rank={rank} size={size} isMaxRank={value.isMaxRank}>\n {result}\n </ChipWrapper>\n );\n }\n\n // Wrap with Entity link if Entity is provided\n if (entity !== undefined) {\n result = (\n <div>\n <MaturityLink entity={entity}>{result}</MaturityLink>\n </div>\n );\n }\n\n // Wrap with tooltip and return\n return (\n <Tooltip title={tooltip} arrow>\n {result}\n </Tooltip>\n );\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { InfoCard } from '@backstage/core-components';
|
|
3
|
+
import { Rank } from '@backstage-community/plugin-tech-insights-maturity-common';
|
|
4
|
+
import { makeStyles } from '@mui/styles';
|
|
5
|
+
import Typography from '@mui/material/Typography';
|
|
6
|
+
import CardContent from '@mui/material/CardContent';
|
|
7
|
+
import Divider from '@mui/material/Divider';
|
|
8
|
+
import Stack from '@mui/material/Stack';
|
|
9
|
+
import { MaturitySummaryCardContent } from '../MaturitySummaryInfoCard/MaturitySummaryCardContent.esm.js';
|
|
10
|
+
import { MaturityHelp } from '../../helpers/MaturityHelp.esm.js';
|
|
11
|
+
import { MaturityRankAvatar } from '../MaturityRankAvatar/MaturityRankAvatar.esm.js';
|
|
12
|
+
|
|
13
|
+
const useStyles = makeStyles({
|
|
14
|
+
content: {
|
|
15
|
+
justifyContent: "center",
|
|
16
|
+
margin: "auto"
|
|
17
|
+
}
|
|
18
|
+
});
|
|
19
|
+
const RankDescription = /* @__PURE__ */ new Map([
|
|
20
|
+
[
|
|
21
|
+
Rank.Stone,
|
|
22
|
+
"Entity does not utilize standard infrastructure or tools to ensure effective operations"
|
|
23
|
+
],
|
|
24
|
+
[
|
|
25
|
+
Rank.Bronze,
|
|
26
|
+
"Has full Ownership, but Maintainability, Security, and Reliability are not ensured"
|
|
27
|
+
],
|
|
28
|
+
[
|
|
29
|
+
Rank.Silver,
|
|
30
|
+
"Ownership, Maintainability, and Security are ensured, but Reliability is not guaranteed"
|
|
31
|
+
],
|
|
32
|
+
[
|
|
33
|
+
Rank.Gold,
|
|
34
|
+
"Conforms with the Golden Path standards. Ownership, Maintainability, Security, and Reliability are all ensured"
|
|
35
|
+
]
|
|
36
|
+
]);
|
|
37
|
+
function rankProgress(rank, value) {
|
|
38
|
+
if (value.rank >= rank || value.maxRank === rank && value.isMaxRank) {
|
|
39
|
+
return {
|
|
40
|
+
passedChecks: 0,
|
|
41
|
+
totalChecks: 0,
|
|
42
|
+
percentage: 100
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
return void 0;
|
|
46
|
+
}
|
|
47
|
+
function getRankAvatarProgress(rank, value) {
|
|
48
|
+
return /* @__PURE__ */ React.createElement(
|
|
49
|
+
MaturityRankAvatar,
|
|
50
|
+
{
|
|
51
|
+
value: { rank, isMaxRank: true },
|
|
52
|
+
size: 25,
|
|
53
|
+
progress: rankProgress(rank, value)
|
|
54
|
+
}
|
|
55
|
+
);
|
|
56
|
+
}
|
|
57
|
+
const MaturityRankInfoCard = ({ summary }) => {
|
|
58
|
+
const { content } = useStyles();
|
|
59
|
+
return /* @__PURE__ */ React.createElement(
|
|
60
|
+
InfoCard,
|
|
61
|
+
{
|
|
62
|
+
title: /* @__PURE__ */ React.createElement(React.Fragment, null, "Maturity Rank", /* @__PURE__ */ React.createElement(MaturityHelp, null))
|
|
63
|
+
},
|
|
64
|
+
/* @__PURE__ */ React.createElement(CardContent, null, /* @__PURE__ */ React.createElement(Stack, { direction: "row", spacing: 5 }, getRankAvatarProgress(Rank.Stone, summary), getRankAvatarProgress(Rank.Bronze, summary), getRankAvatarProgress(Rank.Silver, summary), getRankAvatarProgress(Rank.Gold, summary))),
|
|
65
|
+
/* @__PURE__ */ React.createElement(CardContent, null, /* @__PURE__ */ React.createElement(
|
|
66
|
+
MaturityRankAvatar,
|
|
67
|
+
{
|
|
68
|
+
value: summary,
|
|
69
|
+
size: 80,
|
|
70
|
+
progress: summary.rankProgress,
|
|
71
|
+
className: content
|
|
72
|
+
}
|
|
73
|
+
), /* @__PURE__ */ React.createElement(Typography, { variant: "h6", align: "center" }, Rank[summary.rank]), /* @__PURE__ */ React.createElement(Typography, { variant: "subtitle2", align: "center" }, RankDescription.get(summary.rank))),
|
|
74
|
+
/* @__PURE__ */ React.createElement(Divider, null),
|
|
75
|
+
/* @__PURE__ */ React.createElement(CardContent, null, /* @__PURE__ */ React.createElement(MaturitySummaryCardContent, { summary, variant: "infoCard" }))
|
|
76
|
+
);
|
|
77
|
+
};
|
|
78
|
+
|
|
79
|
+
export { MaturityRankInfoCard };
|
|
80
|
+
//# sourceMappingURL=MaturityRankInfoCard.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MaturityRankInfoCard.esm.js","sources":["../../../src/components/MaturityRankInfoCard/MaturityRankInfoCard.tsx"],"sourcesContent":["/*\n * Copyright 2025 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport React from 'react';\nimport { InfoCard } from '@backstage/core-components';\nimport {\n MaturitySummary,\n Rank,\n} from '@backstage-community/plugin-tech-insights-maturity-common';\nimport { makeStyles } from '@mui/styles';\nimport Typography from '@mui/material/Typography';\nimport CardContent from '@mui/material/CardContent';\nimport Divider from '@mui/material/Divider';\nimport Stack from '@mui/material/Stack';\nimport { MaturitySummaryCardContent } from '../MaturitySummaryInfoCard/MaturitySummaryCardContent';\nimport { MaturityHelp } from '../../helpers/MaturityHelp';\nimport { MaturityRankAvatar } from '../MaturityRankAvatar';\n\ntype Props = {\n summary: MaturitySummary;\n};\n\nconst useStyles = makeStyles({\n content: {\n justifyContent: 'center',\n margin: 'auto',\n },\n});\n\nconst RankDescription = new Map<number, string>([\n [\n Rank.Stone,\n 'Entity does not utilize standard infrastructure or tools to ensure effective operations',\n ],\n [\n Rank.Bronze,\n 'Has full Ownership, but Maintainability, Security, and Reliability are not ensured',\n ],\n [\n Rank.Silver,\n 'Ownership, Maintainability, and Security are ensured, but Reliability is not guaranteed',\n ],\n [\n Rank.Gold,\n 'Conforms with the Golden Path standards. Ownership, Maintainability, Security, and Reliability are all ensured',\n ],\n]);\n\nfunction rankProgress(rank: Rank, value: MaturitySummary) {\n if (value.rank >= rank || (value.maxRank === rank && value.isMaxRank)) {\n return {\n passedChecks: 0,\n totalChecks: 0,\n percentage: 100,\n };\n }\n return undefined;\n}\n\nfunction getRankAvatarProgress(rank: Rank, value: MaturitySummary) {\n return (\n <MaturityRankAvatar\n value={{ rank, isMaxRank: true }}\n size={25}\n progress={rankProgress(rank, value)}\n />\n );\n}\n\nexport const MaturityRankInfoCard = ({ summary }: Props) => {\n const { content } = useStyles();\n\n return (\n <InfoCard\n title={\n <React.Fragment>\n Maturity Rank\n <MaturityHelp />\n </React.Fragment>\n }\n >\n <CardContent>\n <Stack direction=\"row\" spacing={5}>\n {getRankAvatarProgress(Rank.Stone, summary)}\n {getRankAvatarProgress(Rank.Bronze, summary)}\n {getRankAvatarProgress(Rank.Silver, summary)}\n {getRankAvatarProgress(Rank.Gold, summary)}\n </Stack>\n </CardContent>\n <CardContent>\n <MaturityRankAvatar\n value={summary}\n size={80}\n progress={summary.rankProgress}\n className={content}\n />\n <Typography variant=\"h6\" align=\"center\">\n {Rank[summary.rank]}\n </Typography>\n <Typography variant=\"subtitle2\" align=\"center\">\n {RankDescription.get(summary.rank)}\n </Typography>\n </CardContent>\n <Divider />\n <CardContent>\n <MaturitySummaryCardContent summary={summary} variant=\"infoCard\" />\n </CardContent>\n </InfoCard>\n );\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import useAsyncRetry from 'react-use/lib/useAsync';
|
|
3
|
+
import { useApi } from '@backstage/core-plugin-api';
|
|
4
|
+
import { maturityApiRef } from '../../api/MaturityApi.esm.js';
|
|
5
|
+
import '@backstage/catalog-model';
|
|
6
|
+
import '@backstage/plugin-catalog-react';
|
|
7
|
+
import '@backstage-community/plugin-tech-insights';
|
|
8
|
+
import '@backstage-community/plugin-tech-insights-maturity-common';
|
|
9
|
+
import { MaturityRankAvatar } from '../MaturityRankAvatar/MaturityRankAvatar.esm.js';
|
|
10
|
+
|
|
11
|
+
const MaturityRankWidget = ({ entity }) => {
|
|
12
|
+
const api = useApi(maturityApiRef);
|
|
13
|
+
const { value, loading } = useAsyncRetry(
|
|
14
|
+
async () => api.getMaturityRank(entity),
|
|
15
|
+
[api, entity]
|
|
16
|
+
);
|
|
17
|
+
if (loading || !value) return /* @__PURE__ */ React.createElement(React.Fragment, null);
|
|
18
|
+
return /* @__PURE__ */ React.createElement(MaturityRankAvatar, { entity, value, variant: "chip" });
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
export { MaturityRankWidget };
|
|
22
|
+
//# sourceMappingURL=MaturityRankWidget.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MaturityRankWidget.esm.js","sources":["../../../src/components/MaturityRankWidget/MaturityRankWidget.tsx"],"sourcesContent":["/*\n * Copyright 2025 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport React from 'react';\nimport useAsyncRetry from 'react-use/lib/useAsync';\n\nimport { Entity } from '@backstage/catalog-model';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { maturityApiRef } from '../../api';\nimport { MaturityRankAvatar } from '../MaturityRankAvatar';\n\ntype Props = {\n entity: Entity;\n};\n\nexport const MaturityRankWidget = ({ entity }: Props) => {\n const api = useApi(maturityApiRef);\n const { value, loading } = useAsyncRetry(\n async () => api.getMaturityRank(entity),\n [api, entity],\n );\n\n if (loading || !value) return <></>;\n return <MaturityRankAvatar entity={entity} value={value} variant=\"chip\" />;\n};\n"],"names":[],"mappings":";;;;;;;;;;AA2BO,MAAM,kBAAqB,GAAA,CAAC,EAAE,MAAA,EAAoB,KAAA;AACvD,EAAM,MAAA,GAAA,GAAM,OAAO,cAAc,CAAA;AACjC,EAAM,MAAA,EAAE,KAAO,EAAA,OAAA,EAAY,GAAA,aAAA;AAAA,IACzB,YAAY,GAAI,CAAA,eAAA,CAAgB,MAAM,CAAA;AAAA,IACtC,CAAC,KAAK,MAAM;AAAA,GACd;AAEA,EAAA,IAAI,OAAW,IAAA,CAAC,KAAO,EAAA,uBAAS,KAAA,CAAA,aAAA,CAAA,KAAA,CAAA,QAAA,EAAA,IAAA,CAAA;AAChC,EAAA,uBAAQ,KAAA,CAAA,aAAA,CAAA,kBAAA,EAAA,EAAmB,MAAgB,EAAA,KAAA,EAAc,SAAQ,MAAO,EAAA,CAAA;AAC1E;;;;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.esm.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import useAsyncRetry from 'react-use/lib/useAsync';
|
|
3
|
+
import { Progress, EmptyState, InfoCard } from '@backstage/core-components';
|
|
4
|
+
import { useApi } from '@backstage/core-plugin-api';
|
|
5
|
+
import { getCompoundEntityRef } from '@backstage/catalog-model';
|
|
6
|
+
import { useEntity } from '@backstage/plugin-catalog-react';
|
|
7
|
+
import Grid from '@mui/material/Grid';
|
|
8
|
+
import Alert from '@mui/material/Alert';
|
|
9
|
+
import { maturityApiRef } from '../../api/MaturityApi.esm.js';
|
|
10
|
+
import '@backstage-community/plugin-tech-insights';
|
|
11
|
+
import { Rank } from '@backstage-community/plugin-tech-insights-maturity-common';
|
|
12
|
+
import { MaturityRankInfoCard } from '../MaturityRankInfoCard/MaturityRankInfoCard.esm.js';
|
|
13
|
+
import { Box } from '@material-ui/core';
|
|
14
|
+
import { MaturityCheckTable } from './maturityTableRows.esm.js';
|
|
15
|
+
|
|
16
|
+
const MaturityScorePage = () => {
|
|
17
|
+
const { entity } = useEntity();
|
|
18
|
+
const api = useApi(maturityApiRef);
|
|
19
|
+
const { loading, error, value } = useAsyncRetry(async () => {
|
|
20
|
+
const score = await api.getMaturityScore(entity);
|
|
21
|
+
const facts = await api.getFacts(
|
|
22
|
+
getCompoundEntityRef(entity),
|
|
23
|
+
score.checks?.flatMap((x) => x.check.factIds)
|
|
24
|
+
);
|
|
25
|
+
return {
|
|
26
|
+
checks: score.checks,
|
|
27
|
+
rank: score.rank,
|
|
28
|
+
summary: score.summary,
|
|
29
|
+
facts
|
|
30
|
+
};
|
|
31
|
+
}, [api]);
|
|
32
|
+
if (loading) {
|
|
33
|
+
return /* @__PURE__ */ React.createElement(Progress, null);
|
|
34
|
+
} else if (error) {
|
|
35
|
+
return /* @__PURE__ */ React.createElement(Alert, { severity: "error" }, error.message);
|
|
36
|
+
} else if (!value) {
|
|
37
|
+
return /* @__PURE__ */ React.createElement(EmptyState, { missing: "info", title: "No information to display" });
|
|
38
|
+
}
|
|
39
|
+
return /* @__PURE__ */ React.createElement(Grid, { container: true }, /* @__PURE__ */ React.createElement(Grid, { item: true, md: 3 }, /* @__PURE__ */ React.createElement(MaturityRankInfoCard, { summary: value.summary })), /* @__PURE__ */ React.createElement(Grid, { item: true, md: 9 }, /* @__PURE__ */ React.createElement(InfoCard, { title: "Checks", variant: "fullHeight" }, /* @__PURE__ */ React.createElement(
|
|
40
|
+
Grid,
|
|
41
|
+
{
|
|
42
|
+
item: true,
|
|
43
|
+
container: true,
|
|
44
|
+
direction: "column",
|
|
45
|
+
justifyContent: "space-between",
|
|
46
|
+
alignItems: "stretch",
|
|
47
|
+
style: { height: "100%" },
|
|
48
|
+
spacing: 0
|
|
49
|
+
},
|
|
50
|
+
/* @__PURE__ */ React.createElement(Box, { sx: { flexGrow: 1 } }, /* @__PURE__ */ React.createElement(Grid, { item: true }, /* @__PURE__ */ React.createElement(
|
|
51
|
+
MaturityCheckTable,
|
|
52
|
+
{
|
|
53
|
+
checks: value.checks.filter(
|
|
54
|
+
(x) => x.check.metadata.rank === Rank.Bronze
|
|
55
|
+
),
|
|
56
|
+
facts: value.facts,
|
|
57
|
+
category: Rank.Bronze,
|
|
58
|
+
rank: value.rank
|
|
59
|
+
}
|
|
60
|
+
), /* @__PURE__ */ React.createElement(
|
|
61
|
+
MaturityCheckTable,
|
|
62
|
+
{
|
|
63
|
+
checks: value.checks.filter(
|
|
64
|
+
(x) => x.check.metadata.rank === Rank.Silver
|
|
65
|
+
),
|
|
66
|
+
facts: value.facts,
|
|
67
|
+
category: Rank.Silver,
|
|
68
|
+
rank: value.rank
|
|
69
|
+
}
|
|
70
|
+
), /* @__PURE__ */ React.createElement(
|
|
71
|
+
MaturityCheckTable,
|
|
72
|
+
{
|
|
73
|
+
checks: value.checks.filter(
|
|
74
|
+
(x) => x.check.metadata.rank === Rank.Gold
|
|
75
|
+
),
|
|
76
|
+
facts: value.facts,
|
|
77
|
+
category: Rank.Gold,
|
|
78
|
+
rank: value.rank
|
|
79
|
+
}
|
|
80
|
+
)))
|
|
81
|
+
))));
|
|
82
|
+
};
|
|
83
|
+
|
|
84
|
+
export { MaturityScorePage };
|
|
85
|
+
//# sourceMappingURL=MaturityScorePage.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MaturityScorePage.esm.js","sources":["../../../src/components/MaturityScorePage/MaturityScorePage.tsx"],"sourcesContent":["/*\n * Copyright 2025 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport React from 'react';\nimport useAsyncRetry from 'react-use/lib/useAsync';\n\nimport { EmptyState, InfoCard, Progress } from '@backstage/core-components';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { getCompoundEntityRef } from '@backstage/catalog-model';\nimport { useEntity } from '@backstage/plugin-catalog-react';\nimport Grid from '@mui/material/Grid';\nimport Alert from '@mui/material/Alert';\nimport { maturityApiRef } from '../../api';\nimport { MaturityRankInfoCard } from '../MaturityRankInfoCard';\nimport { Rank } from '@backstage-community/plugin-tech-insights-maturity-common';\nimport { Box } from '@material-ui/core';\nimport { MaturityCheckTable } from './maturityTableRows';\n\nexport const MaturityScorePage = () => {\n const { entity } = useEntity();\n const api = useApi(maturityApiRef);\n\n const { loading, error, value } = useAsyncRetry(async () => {\n const score = await api.getMaturityScore(entity);\n const facts = await api.getFacts(\n getCompoundEntityRef(entity),\n score.checks?.flatMap(x => x.check.factIds),\n );\n\n return {\n checks: score.checks,\n rank: score.rank,\n summary: score.summary,\n facts,\n };\n }, [api]);\n\n if (loading) {\n return <Progress />;\n } else if (error) {\n return <Alert severity=\"error\">{error.message}</Alert>;\n } else if (!value) {\n return <EmptyState missing=\"info\" title=\"No information to display\" />;\n }\n\n return (\n <Grid container>\n <Grid item md={3}>\n <MaturityRankInfoCard summary={value.summary} />\n </Grid>\n <Grid item md={9}>\n <InfoCard title=\"Checks\" variant=\"fullHeight\">\n <Grid\n item\n container\n direction=\"column\"\n justifyContent=\"space-between\"\n alignItems=\"stretch\"\n style={{ height: '100%' }}\n spacing={0}\n >\n <Box sx={{ flexGrow: 1 }}>\n <Grid item>\n <MaturityCheckTable\n checks={value.checks.filter(\n x => x.check.metadata.rank === Rank.Bronze,\n )}\n facts={value.facts}\n category={Rank.Bronze}\n rank={value.rank}\n />\n <MaturityCheckTable\n checks={value.checks.filter(\n x => x.check.metadata.rank === Rank.Silver,\n )}\n facts={value.facts}\n category={Rank.Silver}\n rank={value.rank}\n />\n <MaturityCheckTable\n checks={value.checks.filter(\n x => x.check.metadata.rank === Rank.Gold,\n )}\n facts={value.facts}\n category={Rank.Gold}\n rank={value.rank}\n />\n </Grid>\n </Box>\n </Grid>\n </InfoCard>\n </Grid>\n </Grid>\n );\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import { Link } from '@backstage/core-components';
|
|
2
|
+
import AccessTimeIcon from '@mui/icons-material/AccessTime';
|
|
3
|
+
import ArrowForwardIosSharpIcon from '@mui/icons-material/ArrowForwardIosSharp';
|
|
4
|
+
import CancelTwoToneIcon from '@mui/icons-material/Cancel';
|
|
5
|
+
import CategoryIcon from '@mui/icons-material/Category';
|
|
6
|
+
import CheckCircleTwoToneIcon from '@mui/icons-material/CheckCircleTwoTone';
|
|
7
|
+
import EmojiObjectsIcon from '@mui/icons-material/EmojiObjects';
|
|
8
|
+
import MenuBookIcon from '@mui/icons-material/MenuBook';
|
|
9
|
+
import MuiAccordion from '@mui/material/Accordion';
|
|
10
|
+
import MuiAccordionDetails from '@mui/material/AccordionDetails';
|
|
11
|
+
import MuiAccordionSummary from '@mui/material/AccordionSummary';
|
|
12
|
+
import Grid from '@mui/material/Grid';
|
|
13
|
+
import Stack from '@mui/material/Stack';
|
|
14
|
+
import Tooltip from '@mui/material/Tooltip';
|
|
15
|
+
import Typography from '@mui/material/Typography';
|
|
16
|
+
import { styled, makeStyles } from '@mui/styles';
|
|
17
|
+
import React from 'react';
|
|
18
|
+
import { MaturityRankAvatar } from '../MaturityRankAvatar/MaturityRankAvatar.esm.js';
|
|
19
|
+
|
|
20
|
+
const Accordion = styled((props) => /* @__PURE__ */ React.createElement(MuiAccordion, { disableGutters: true, elevation: 0, square: true, ...props }))(({ theme }) => ({
|
|
21
|
+
border: `1px solid ${theme.palette.divider}`,
|
|
22
|
+
"&:not(:last-child)": {
|
|
23
|
+
borderBottom: 0
|
|
24
|
+
},
|
|
25
|
+
"&:before": {
|
|
26
|
+
display: "none"
|
|
27
|
+
}
|
|
28
|
+
}));
|
|
29
|
+
const AccordionSummary = styled((props) => /* @__PURE__ */ React.createElement(
|
|
30
|
+
MuiAccordionSummary,
|
|
31
|
+
{
|
|
32
|
+
expandIcon: /* @__PURE__ */ React.createElement(ArrowForwardIosSharpIcon, { sx: { fontSize: "0.9rem" } }),
|
|
33
|
+
...props
|
|
34
|
+
}
|
|
35
|
+
))(({ theme }) => ({
|
|
36
|
+
backgroundColor: theme.palette.mode === "dark" ? "rgba(255, 255, 255, .05)" : "rgba(0, 0, 0, .03)",
|
|
37
|
+
flexDirection: "row-reverse",
|
|
38
|
+
width: "100%",
|
|
39
|
+
paddingLeft: theme.spacing(2),
|
|
40
|
+
"& .MuiAccordionSummary-expandIconWrapper.Mui-expanded": {
|
|
41
|
+
transform: "rotate(90deg)"
|
|
42
|
+
},
|
|
43
|
+
"& .MuiAccordionSummary-content": {
|
|
44
|
+
marginLeft: theme.spacing(1)
|
|
45
|
+
}
|
|
46
|
+
}));
|
|
47
|
+
const AccordionDetails = styled(MuiAccordionDetails)(({ theme }) => ({
|
|
48
|
+
padding: theme.spacing(2),
|
|
49
|
+
borderTop: "1px solid rgba(0, 0, 0, .125)"
|
|
50
|
+
}));
|
|
51
|
+
const MaturityCheckTableRow = ({
|
|
52
|
+
checkResult,
|
|
53
|
+
updated
|
|
54
|
+
}) => {
|
|
55
|
+
const [expanded, setExpanded] = React.useState(
|
|
56
|
+
checkResult.result === false
|
|
57
|
+
);
|
|
58
|
+
const handleChange = () => (_event, newExpanded) => {
|
|
59
|
+
setExpanded(newExpanded);
|
|
60
|
+
};
|
|
61
|
+
const useStyles = makeStyles({
|
|
62
|
+
check: {
|
|
63
|
+
marginLeft: "2rem"
|
|
64
|
+
},
|
|
65
|
+
solution: {
|
|
66
|
+
wordBreak: "break-word",
|
|
67
|
+
whiteSpace: "pre-wrap"
|
|
68
|
+
},
|
|
69
|
+
filters: {
|
|
70
|
+
fontSize: 15
|
|
71
|
+
}
|
|
72
|
+
});
|
|
73
|
+
const { check, solution, filters } = useStyles();
|
|
74
|
+
return /* @__PURE__ */ React.createElement("div", null, /* @__PURE__ */ React.createElement(Accordion, { expanded, onChange: handleChange() }, /* @__PURE__ */ React.createElement(AccordionSummary, { "aria-controls": "panel1d-content", id: "panel1d-header" }, /* @__PURE__ */ React.createElement(Grid, { container: true, alignItems: "center", spacing: 2 }, /* @__PURE__ */ React.createElement(Grid, { item: true, xs: 3 }, /* @__PURE__ */ React.createElement(Stack, { direction: "row", spacing: 2, className: check }, /* @__PURE__ */ React.createElement(
|
|
75
|
+
MaturityRankAvatar,
|
|
76
|
+
{
|
|
77
|
+
value: { rank: checkResult.check.metadata.rank },
|
|
78
|
+
size: 25
|
|
79
|
+
}
|
|
80
|
+
), /* @__PURE__ */ React.createElement(Typography, null, checkResult.check.id))), /* @__PURE__ */ React.createElement(Grid, { item: true, xs: 7.5 }, /* @__PURE__ */ React.createElement(Typography, { className: check }, checkResult.check.description)), /* @__PURE__ */ React.createElement(Grid, { item: true, xs: 1.5 }, checkResult.result ? /* @__PURE__ */ React.createElement(
|
|
81
|
+
CheckCircleTwoToneIcon,
|
|
82
|
+
{
|
|
83
|
+
className: check,
|
|
84
|
+
style: { color: "#53d44c" }
|
|
85
|
+
}
|
|
86
|
+
) : /* @__PURE__ */ React.createElement(
|
|
87
|
+
CancelTwoToneIcon,
|
|
88
|
+
{
|
|
89
|
+
className: check,
|
|
90
|
+
style: { color: "#f54040" }
|
|
91
|
+
}
|
|
92
|
+
)))), /* @__PURE__ */ React.createElement(AccordionDetails, null, /* @__PURE__ */ React.createElement(Grid, { container: true, spacing: 2, sx: { paddingLeft: 2, paddingRight: 2 } }, /* @__PURE__ */ React.createElement(Grid, { item: true, xs: 9 }, /* @__PURE__ */ React.createElement(Stack, { spacing: 1 }, /* @__PURE__ */ React.createElement(Stack, { spacing: 1, direction: "row" }, /* @__PURE__ */ React.createElement(Tooltip, { title: "Solution: How to pass the check" }, /* @__PURE__ */ React.createElement(EmojiObjectsIcon, { color: "warning" })), /* @__PURE__ */ React.createElement(Typography, { className: solution }, checkResult.check.metadata?.solution)), /* @__PURE__ */ React.createElement(Stack, { spacing: 1, direction: "row" }, /* @__PURE__ */ React.createElement(Tooltip, { title: "Update: Last time the maturity check was updated" }, /* @__PURE__ */ React.createElement(AccessTimeIcon, { color: "primary" })), /* @__PURE__ */ React.createElement(Typography, { variant: "subtitle2", className: filters }, updated ? `Updated ${updated}` : "Not yet run")))), /* @__PURE__ */ React.createElement(Grid, { item: true, xs: 3 }, /* @__PURE__ */ React.createElement(Stack, { spacing: 1 }, /* @__PURE__ */ React.createElement(Stack, { spacing: 1, direction: "row" }, /* @__PURE__ */ React.createElement(Tooltip, { title: "Category: The category for this check" }, /* @__PURE__ */ React.createElement(CategoryIcon, { color: "primary" })), /* @__PURE__ */ React.createElement(Typography, { variant: "subtitle1", className: filters }, checkResult.check.metadata?.category)), /* @__PURE__ */ React.createElement(Stack, { spacing: 1, direction: "row" }, /* @__PURE__ */ React.createElement(Tooltip, { title: "Reference: Consult the documentation linked here for more background info." }, /* @__PURE__ */ React.createElement(MenuBookIcon, { color: "primary" })), /* @__PURE__ */ React.createElement(Typography, null, /* @__PURE__ */ React.createElement(Link, { to: checkResult.check.links?.at(0)?.url ?? "" }, checkResult.check.links?.at(0)?.title)))))))));
|
|
93
|
+
};
|
|
94
|
+
const MaturityCheckTable = ({
|
|
95
|
+
rank,
|
|
96
|
+
category,
|
|
97
|
+
checks,
|
|
98
|
+
facts
|
|
99
|
+
}) => {
|
|
100
|
+
const [expanded, setExpanded] = React.useState(
|
|
101
|
+
rank.rank + 1 === category
|
|
102
|
+
);
|
|
103
|
+
const handleChange = () => (_event, newExpanded) => {
|
|
104
|
+
setExpanded(newExpanded);
|
|
105
|
+
};
|
|
106
|
+
if (checks.length === 0) return /* @__PURE__ */ React.createElement(React.Fragment, null);
|
|
107
|
+
return /* @__PURE__ */ React.createElement("div", null, /* @__PURE__ */ React.createElement(Accordion, { expanded, onChange: handleChange() }, /* @__PURE__ */ React.createElement(AccordionSummary, { "aria-controls": "panel1d-content", id: "panel1d-header" }, /* @__PURE__ */ React.createElement(Grid, { container: true, justifyContent: "flex-end" }, /* @__PURE__ */ React.createElement(Grid, { item: true }, /* @__PURE__ */ React.createElement(
|
|
108
|
+
MaturityRankAvatar,
|
|
109
|
+
{
|
|
110
|
+
value: { rank: category, isMaxRank: category <= rank.rank },
|
|
111
|
+
variant: "chip"
|
|
112
|
+
}
|
|
113
|
+
)))), /* @__PURE__ */ React.createElement(AccordionDetails, null, /* @__PURE__ */ React.createElement(Grid, { container: true, spacing: 1 }, /* @__PURE__ */ React.createElement(Grid, { item: true, xs: 12 }, checks?.map((entry) => /* @__PURE__ */ React.createElement(
|
|
114
|
+
MaturityCheckTableRow,
|
|
115
|
+
{
|
|
116
|
+
key: entry.check.id,
|
|
117
|
+
updated: facts[entry.check.factIds[0]]?.timestamp,
|
|
118
|
+
checkResult: entry
|
|
119
|
+
}
|
|
120
|
+
)))))));
|
|
121
|
+
};
|
|
122
|
+
|
|
123
|
+
export { MaturityCheckTable };
|
|
124
|
+
//# sourceMappingURL=maturityTableRows.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"maturityTableRows.esm.js","sources":["../../../src/components/MaturityScorePage/maturityTableRows.tsx"],"sourcesContent":["/*\n * Copyright 2025 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { Link } from '@backstage/core-components';\nimport {\n MaturityCheckResult,\n MaturityRank,\n Rank,\n} from '@backstage-community/plugin-tech-insights-maturity-common';\nimport AccessTimeIcon from '@mui/icons-material/AccessTime';\nimport ArrowForwardIosSharpIcon from '@mui/icons-material/ArrowForwardIosSharp';\nimport CancelTwoToneIcon from '@mui/icons-material/Cancel';\nimport CategoryIcon from '@mui/icons-material/Category';\nimport CheckCircleTwoToneIcon from '@mui/icons-material/CheckCircleTwoTone';\nimport EmojiObjectsIcon from '@mui/icons-material/EmojiObjects';\nimport MenuBookIcon from '@mui/icons-material/MenuBook';\nimport MuiAccordion, { AccordionProps } from '@mui/material/Accordion';\nimport MuiAccordionDetails from '@mui/material/AccordionDetails';\nimport MuiAccordionSummary, {\n AccordionSummaryProps,\n} from '@mui/material/AccordionSummary';\nimport Grid from '@mui/material/Grid';\nimport Stack from '@mui/material/Stack';\nimport Tooltip from '@mui/material/Tooltip';\nimport Typography from '@mui/material/Typography';\nimport { makeStyles, styled } from '@mui/styles';\nimport React from 'react';\nimport { MaturityRankAvatar } from '../MaturityRankAvatar';\nimport { InsightFacts } from '@backstage-community/plugin-tech-insights-common/client';\n\ninterface Props {\n checks: MaturityCheckResult[];\n facts: InsightFacts;\n rank: MaturityRank;\n category: Rank;\n}\n\nconst Accordion = styled((props: AccordionProps) => (\n <MuiAccordion disableGutters elevation={0} square {...props} />\n))(({ theme }) => ({\n border: `1px solid ${theme.palette.divider}`,\n '&:not(:last-child)': {\n borderBottom: 0,\n },\n '&:before': {\n display: 'none',\n },\n}));\n\nconst AccordionSummary = styled((props: AccordionSummaryProps) => (\n <MuiAccordionSummary\n expandIcon={<ArrowForwardIosSharpIcon sx={{ fontSize: '0.9rem' }} />}\n {...props}\n />\n))(({ theme }) => ({\n backgroundColor:\n theme.palette.mode === 'dark'\n ? 'rgba(255, 255, 255, .05)'\n : 'rgba(0, 0, 0, .03)',\n flexDirection: 'row-reverse',\n width: '100%',\n paddingLeft: theme.spacing(2),\n '& .MuiAccordionSummary-expandIconWrapper.Mui-expanded': {\n transform: 'rotate(90deg)',\n },\n '& .MuiAccordionSummary-content': {\n marginLeft: theme.spacing(1),\n },\n}));\n\nconst AccordionDetails = styled(MuiAccordionDetails)(({ theme }) => ({\n padding: theme.spacing(2),\n borderTop: '1px solid rgba(0, 0, 0, .125)',\n}));\n\nconst MaturityCheckTableRow = ({\n checkResult,\n updated,\n}: {\n checkResult: MaturityCheckResult;\n updated: string;\n}) => {\n const [expanded, setExpanded] = React.useState<boolean>(\n checkResult.result === false,\n );\n\n const handleChange =\n () => (_event: React.SyntheticEvent, newExpanded: boolean) => {\n setExpanded(newExpanded);\n };\n\n const useStyles = makeStyles({\n check: {\n marginLeft: '2rem',\n },\n solution: {\n wordBreak: 'break-word',\n whiteSpace: 'pre-wrap',\n },\n filters: {\n fontSize: 15,\n },\n });\n\n const { check, solution, filters } = useStyles();\n return (\n <div>\n <Accordion expanded={expanded} onChange={handleChange()}>\n <AccordionSummary aria-controls=\"panel1d-content\" id=\"panel1d-header\">\n <Grid container alignItems=\"center\" spacing={2}>\n <Grid item xs={3}>\n <Stack direction=\"row\" spacing={2} className={check}>\n <MaturityRankAvatar\n value={{ rank: checkResult.check.metadata.rank }}\n size={25}\n />\n <Typography>{checkResult.check.id}</Typography>\n </Stack>\n </Grid>\n <Grid item xs={7.5}>\n <Typography className={check}>\n {checkResult.check.description}\n </Typography>\n </Grid>\n <Grid item xs={1.5}>\n {checkResult.result ? (\n <CheckCircleTwoToneIcon\n className={check}\n style={{ color: '#53d44c' }}\n />\n ) : (\n <CancelTwoToneIcon\n className={check}\n style={{ color: '#f54040' }}\n />\n )}\n </Grid>\n </Grid>\n </AccordionSummary>\n <AccordionDetails>\n <Grid container spacing={2} sx={{ paddingLeft: 2, paddingRight: 2 }}>\n <Grid item xs={9}>\n <Stack spacing={1}>\n <Stack spacing={1} direction=\"row\">\n <Tooltip title=\"Solution: How to pass the check\">\n <EmojiObjectsIcon color=\"warning\" />\n </Tooltip>\n <Typography className={solution}>\n {checkResult.check.metadata?.solution}\n </Typography>\n </Stack>\n <Stack spacing={1} direction=\"row\">\n <Tooltip title=\"Update: Last time the maturity check was updated\">\n <AccessTimeIcon color=\"primary\" />\n </Tooltip>\n <Typography variant=\"subtitle2\" className={filters}>\n {updated ? `Updated ${updated}` : 'Not yet run'}\n </Typography>\n </Stack>\n </Stack>\n </Grid>\n <Grid item xs={3}>\n <Stack spacing={1}>\n <Stack spacing={1} direction=\"row\">\n <Tooltip title=\"Category: The category for this check\">\n <CategoryIcon color=\"primary\" />\n </Tooltip>\n <Typography variant=\"subtitle1\" className={filters}>\n {checkResult.check.metadata?.category}\n </Typography>\n </Stack>\n <Stack spacing={1} direction=\"row\">\n <Tooltip title=\"Reference: Consult the documentation linked here for more background info.\">\n <MenuBookIcon color=\"primary\" />\n </Tooltip>\n <Typography>\n <Link to={checkResult.check.links?.at(0)?.url ?? ''}>\n {checkResult.check.links?.at(0)?.title}\n </Link>\n </Typography>\n </Stack>\n </Stack>\n </Grid>\n </Grid>\n </AccordionDetails>\n </Accordion>\n </div>\n );\n};\n\nexport const MaturityCheckTable = ({\n rank,\n category,\n checks,\n facts,\n}: Props) => {\n // Expand only the next rank Category needed to level up\n const [expanded, setExpanded] = React.useState<boolean>(\n rank.rank + 1 === category,\n );\n const handleChange =\n () => (_event: React.SyntheticEvent, newExpanded: boolean) => {\n setExpanded(newExpanded);\n };\n\n if (checks.length === 0) return <></>;\n\n return (\n <div>\n <Accordion expanded={expanded} onChange={handleChange()}>\n <AccordionSummary aria-controls=\"panel1d-content\" id=\"panel1d-header\">\n <Grid container justifyContent=\"flex-end\">\n <Grid item>\n <MaturityRankAvatar\n value={{ rank: category, isMaxRank: category <= rank.rank }}\n variant=\"chip\"\n />\n </Grid>\n </Grid>\n </AccordionSummary>\n <AccordionDetails>\n <Grid container spacing={1}>\n <Grid item xs={12}>\n {checks?.map(entry => (\n <MaturityCheckTableRow\n key={entry.check.id}\n updated={facts[entry.check.factIds[0]]?.timestamp}\n checkResult={entry}\n />\n ))}\n </Grid>\n </Grid>\n </AccordionDetails>\n </Accordion>\n </div>\n );\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import LinearProgress from '@mui/material/LinearProgress';
|
|
2
|
+
import Typography from '@mui/material/Typography';
|
|
3
|
+
import Stack from '@mui/material/Stack';
|
|
4
|
+
import React from 'react';
|
|
5
|
+
import { AreaProgress } from '../../helpers/AreaProgress.esm.js';
|
|
6
|
+
|
|
7
|
+
const MaturitySummaryCardContent = ({ summary, variant }) => {
|
|
8
|
+
if (summary && summary.areaSummaries.length > 0) {
|
|
9
|
+
return /* @__PURE__ */ React.createElement(Stack, { spacing: 1 }, summary.areaSummaries.map((x) => /* @__PURE__ */ React.createElement(AreaProgress, { areaSummary: x, variant, key: x.area })));
|
|
10
|
+
} else if (summary) {
|
|
11
|
+
return /* @__PURE__ */ React.createElement(Typography, { variant: "body2", color: "textSecondary", align: "center" }, "No checks available.");
|
|
12
|
+
}
|
|
13
|
+
return /* @__PURE__ */ React.createElement(LinearProgress, { color: "secondary", variant: "indeterminate" });
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
export { MaturitySummaryCardContent };
|
|
17
|
+
//# sourceMappingURL=MaturitySummaryCardContent.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MaturitySummaryCardContent.esm.js","sources":["../../../src/components/MaturitySummaryInfoCard/MaturitySummaryCardContent.tsx"],"sourcesContent":["/*\n * Copyright 2025 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { MaturitySummary } from '@backstage-community/plugin-tech-insights-maturity-common';\nimport LinearProgress from '@mui/material/LinearProgress';\nimport Typography from '@mui/material/Typography';\n\nimport Stack from '@mui/material/Stack';\nimport React from 'react';\nimport { AreaProgress } from '../../helpers/AreaProgress';\n\ntype Props = {\n summary: MaturitySummary | undefined;\n variant?: 'gridItem' | 'infoCard';\n};\n\nexport const MaturitySummaryCardContent = ({ summary, variant }: Props) => {\n if (summary && summary.areaSummaries.length > 0) {\n return (\n <Stack spacing={1}>\n {summary.areaSummaries.map(x => (\n <AreaProgress areaSummary={x} variant={variant} key={x.area} />\n ))}\n </Stack>\n );\n } else if (summary) {\n return (\n <Typography variant=\"body2\" color=\"textSecondary\" align=\"center\">\n No checks available.\n </Typography>\n );\n }\n return <LinearProgress color=\"secondary\" variant=\"indeterminate\" />;\n};\n"],"names":[],"mappings":";;;;;;AA4BO,MAAM,0BAA6B,GAAA,CAAC,EAAE,OAAA,EAAS,SAAqB,KAAA;AACzE,EAAA,IAAI,OAAW,IAAA,OAAA,CAAQ,aAAc,CAAA,MAAA,GAAS,CAAG,EAAA;AAC/C,IAAA,2CACG,KAAM,EAAA,EAAA,OAAA,EAAS,CACb,EAAA,EAAA,OAAA,CAAQ,cAAc,GAAI,CAAA,CAAA,CAAA,qBACxB,KAAA,CAAA,aAAA,CAAA,YAAA,EAAA,EAAa,aAAa,CAAG,EAAA,OAAA,EAAkB,KAAK,CAAE,CAAA,IAAA,EAAM,CAC9D,CACH,CAAA;AAAA,aAEO,OAAS,EAAA;AAClB,IACE,uBAAA,KAAA,CAAA,aAAA,CAAC,cAAW,OAAQ,EAAA,OAAA,EAAQ,OAAM,eAAgB,EAAA,KAAA,EAAM,YAAS,sBAEjE,CAAA;AAAA;AAGJ,EAAA,uBAAQ,KAAA,CAAA,aAAA,CAAA,cAAA,EAAA,EAAe,KAAM,EAAA,WAAA,EAAY,SAAQ,eAAgB,EAAA,CAAA;AACnE;;;;"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import useAsyncRetry from 'react-use/lib/useAsync';
|
|
3
|
+
import { InfoCard } from '@backstage/core-components';
|
|
4
|
+
import { useApi } from '@backstage/core-plugin-api';
|
|
5
|
+
import { useEntity } from '@backstage/plugin-catalog-react';
|
|
6
|
+
import Grid from '@mui/material/Grid';
|
|
7
|
+
import CardContent from '@mui/material/CardContent';
|
|
8
|
+
import { MaturitySummaryCardContent } from './MaturitySummaryCardContent.esm.js';
|
|
9
|
+
import { MaturityHelp } from '../../helpers/MaturityHelp.esm.js';
|
|
10
|
+
import { MaturityRankAvatar } from '../MaturityRankAvatar/MaturityRankAvatar.esm.js';
|
|
11
|
+
import { maturityApiRef } from '../../api/MaturityApi.esm.js';
|
|
12
|
+
import '@backstage/catalog-model';
|
|
13
|
+
import '@backstage-community/plugin-tech-insights';
|
|
14
|
+
import '@backstage-community/plugin-tech-insights-maturity-common';
|
|
15
|
+
|
|
16
|
+
const MaturitySummaryInfoCard = () => {
|
|
17
|
+
const { entity } = useEntity();
|
|
18
|
+
const api = useApi(maturityApiRef);
|
|
19
|
+
const { value, loading } = useAsyncRetry(
|
|
20
|
+
async () => api.getMaturitySummary(entity),
|
|
21
|
+
[api, entity]
|
|
22
|
+
);
|
|
23
|
+
if (!value || loading) return /* @__PURE__ */ React.createElement(React.Fragment, null);
|
|
24
|
+
return /* @__PURE__ */ React.createElement(
|
|
25
|
+
InfoCard,
|
|
26
|
+
{
|
|
27
|
+
title: /* @__PURE__ */ React.createElement(Grid, { container: true }, /* @__PURE__ */ React.createElement(Grid, { item: true, md: 7 }, "Maturity", /* @__PURE__ */ React.createElement(MaturityHelp, null)), /* @__PURE__ */ React.createElement(Grid, { item: true, md: 5 }, /* @__PURE__ */ React.createElement(MaturityRankAvatar, { value, entity, variant: "chip" })))
|
|
28
|
+
},
|
|
29
|
+
/* @__PURE__ */ React.createElement(CardContent, null, /* @__PURE__ */ React.createElement(MaturitySummaryCardContent, { summary: value, variant: "infoCard" }))
|
|
30
|
+
);
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
export { MaturitySummaryInfoCard };
|
|
34
|
+
//# sourceMappingURL=MaturitySummaryInfoCard.esm.js.map
|