@backstage-community/plugin-tech-insights-maturity 0.4.0 → 0.5.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 +26 -0
- package/README.md +1 -1
- package/dist/components/MaturityRankChip/MaturityRankChip.esm.js +36 -0
- package/dist/components/MaturityRankChip/MaturityRankChip.esm.js.map +1 -0
- package/dist/components/{MaturityRankAvatar/MaturityRankAvatar.esm.js → MaturityRankIcon/MaturityRankIcon.esm.js} +5 -42
- package/dist/components/MaturityRankIcon/MaturityRankIcon.esm.js.map +1 -0
- package/dist/components/MaturityRankInfoCard/MaturityRankInfoCard.esm.js +3 -3
- package/dist/components/MaturityRankInfoCard/MaturityRankInfoCard.esm.js.map +1 -1
- package/dist/components/MaturityRankWidget/MaturityRankWidget.esm.js +2 -2
- package/dist/components/MaturityRankWidget/MaturityRankWidget.esm.js.map +1 -1
- package/dist/components/MaturityScorePage/MaturityScorePage.esm.js +1 -1
- package/dist/components/MaturityScorePage/MaturityScorePage.esm.js.map +1 -1
- package/dist/components/MaturityScorePage/maturityTableRows.esm.js +114 -106
- package/dist/components/MaturityScorePage/maturityTableRows.esm.js.map +1 -1
- package/dist/components/MaturitySummaryInfoCard/MaturitySummaryInfoCard.esm.js +2 -2
- package/dist/components/MaturitySummaryInfoCard/MaturitySummaryInfoCard.esm.js.map +1 -1
- package/dist/components/MaturitySummaryPage/MaturitySummaryPage.esm.js +1 -1
- package/dist/components/MaturitySummaryPage/MaturitySummaryPage.esm.js.map +1 -1
- package/dist/components/MaturitySummaryTable/MaturitySummaryTable.esm.js +4 -3
- package/dist/components/MaturitySummaryTable/MaturitySummaryTable.esm.js.map +1 -1
- package/dist/helpers/AreaProgress.esm.js +2 -2
- package/dist/helpers/AreaProgress.esm.js.map +1 -1
- package/package.json +7 -7
- package/dist/components/MaturityRankAvatar/MaturityRankAvatar.esm.js.map +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,31 @@
|
|
|
1
1
|
# @backstage-community/plugin-tech-insights-maturity
|
|
2
2
|
|
|
3
|
+
## 0.5.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- 7de2f90: Display Multiple links
|
|
8
|
+
Display errorInfo facts description and value if check result is false and fact type is not boolean
|
|
9
|
+
Update layout of maturity check accordion summary display
|
|
10
|
+
bugfix: Remove local implementation of accordion
|
|
11
|
+
|
|
12
|
+
### Patch Changes
|
|
13
|
+
|
|
14
|
+
- 98fb7ac: Display the check name in the maturity results table instead of the id
|
|
15
|
+
|
|
16
|
+
## 0.4.1
|
|
17
|
+
|
|
18
|
+
### Patch Changes
|
|
19
|
+
|
|
20
|
+
- 34aa972: Updated dependency `@mui/icons-material` to `5.18.0`.
|
|
21
|
+
Updated dependency `@mui/material` to `5.18.0`.
|
|
22
|
+
Updated dependency `@mui/styles` to `5.18.0`.
|
|
23
|
+
Updated dependency `@mui/lab` to `5.0.0-alpha.177`.
|
|
24
|
+
- Updated dependencies [ba5bf7b]
|
|
25
|
+
- @backstage-community/plugin-tech-insights-common@0.7.1
|
|
26
|
+
- @backstage-community/plugin-tech-insights-maturity-common@0.3.1
|
|
27
|
+
- @backstage-community/plugin-tech-insights-react@1.2.1
|
|
28
|
+
|
|
3
29
|
## 0.4.0
|
|
4
30
|
|
|
5
31
|
### Minor Changes
|
package/README.md
CHANGED
|
@@ -63,7 +63,7 @@ Note: This only applies to entities of Kind: 'Component'
|
|
|
63
63
|
```tsx
|
|
64
64
|
// packages/app/src/components/catalog/EntityPage.tsx
|
|
65
65
|
|
|
66
|
-
import { EntityMaturityScorecardContent } from '@backstage-community/plugin-tech-
|
|
66
|
+
import { EntityMaturityScorecardContent } from '@backstage-community/plugin-tech-insights-maturity';
|
|
67
67
|
|
|
68
68
|
const componentEntityPage = (
|
|
69
69
|
<EntityLayoutWrapper>
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { jsx } from 'react/jsx-runtime';
|
|
2
|
+
import { Rank } from '@backstage-community/plugin-tech-insights-maturity-common';
|
|
3
|
+
import Avatar from '@mui/material/Avatar';
|
|
4
|
+
import Chip from '@mui/material/Chip';
|
|
5
|
+
import Tooltip from '@mui/material/Tooltip';
|
|
6
|
+
import { MaturityLink } from '../../helpers/MaturityLink.esm.js';
|
|
7
|
+
import getRankImg from '../../helpers/Rank.esm.js';
|
|
8
|
+
|
|
9
|
+
const MaturityRankChip = ({ className, entity, value }) => {
|
|
10
|
+
const rank = value.rank;
|
|
11
|
+
const tooltip = value.isMaxRank ? "All required tasks have been completed!" : `Increase your rank by completing all ${Rank[rank]} rank tasks!`;
|
|
12
|
+
const result = /* @__PURE__ */ jsx(Tooltip, { title: tooltip, arrow: true, children: /* @__PURE__ */ jsx(
|
|
13
|
+
Chip,
|
|
14
|
+
{
|
|
15
|
+
avatar: /* @__PURE__ */ jsx(
|
|
16
|
+
Avatar,
|
|
17
|
+
{
|
|
18
|
+
alt: Rank[rank],
|
|
19
|
+
src: getRankImg(rank),
|
|
20
|
+
className,
|
|
21
|
+
style: { width: 27, height: 27 }
|
|
22
|
+
}
|
|
23
|
+
),
|
|
24
|
+
label: Rank[rank],
|
|
25
|
+
color: value.isMaxRank ? "success" : "default",
|
|
26
|
+
clickable: entity !== void 0
|
|
27
|
+
}
|
|
28
|
+
) });
|
|
29
|
+
if (entity !== void 0) {
|
|
30
|
+
return /* @__PURE__ */ jsx(MaturityLink, { entity, children: result });
|
|
31
|
+
}
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
export { MaturityRankChip };
|
|
36
|
+
//# sourceMappingURL=MaturityRankChip.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MaturityRankChip.esm.js","sources":["../../../src/components/MaturityRankChip/MaturityRankChip.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 { Rank } 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 { MaturityLink } from '../../helpers/MaturityLink';\nimport getRankImg from '../../helpers/Rank';\n\ntype Props = {\n value: { rank: Rank; isMaxRank: boolean };\n className?: string;\n size?: number;\n entity?: Entity;\n};\n\nexport const MaturityRankChip = ({ className, entity, value }: Props) => {\n const rank = value.rank;\n const tooltip = value.isMaxRank\n ? 'All required tasks have been completed!'\n : `Increase your rank by completing all ${Rank[rank]} rank tasks!`;\n\n const result = (\n <Tooltip title={tooltip} arrow>\n <Chip\n avatar={\n <Avatar\n alt={Rank[rank]}\n src={getRankImg(rank)}\n className={className}\n style={{ width: 27, height: 27 }}\n />\n }\n label={Rank[rank]}\n color={value.isMaxRank ? 'success' : 'default'}\n clickable={entity !== undefined}\n />\n </Tooltip>\n );\n\n // Wrap with Entity link if Entity is provided\n if (entity !== undefined) {\n return <MaturityLink entity={entity}>{result}</MaturityLink>;\n }\n\n return result;\n};\n"],"names":[],"mappings":";;;;;;;;AA8BO,MAAM,mBAAmB,CAAC,EAAE,SAAW,EAAA,MAAA,EAAQ,OAAmB,KAAA;AACvE,EAAA,MAAM,OAAO,KAAM,CAAA,IAAA;AACnB,EAAA,MAAM,UAAU,KAAM,CAAA,SAAA,GAClB,4CACA,CAAwC,qCAAA,EAAA,IAAA,CAAK,IAAI,CAAC,CAAA,YAAA,CAAA;AAEtD,EAAA,MAAM,yBACH,GAAA,CAAA,OAAA,EAAA,EAAQ,KAAO,EAAA,OAAA,EAAS,OAAK,IAC5B,EAAA,QAAA,kBAAA,GAAA;AAAA,IAAC,IAAA;AAAA,IAAA;AAAA,MACC,MACE,kBAAA,GAAA;AAAA,QAAC,MAAA;AAAA,QAAA;AAAA,UACC,GAAA,EAAK,KAAK,IAAI,CAAA;AAAA,UACd,GAAA,EAAK,WAAW,IAAI,CAAA;AAAA,UACpB,SAAA;AAAA,UACA,KAAO,EAAA,EAAE,KAAO,EAAA,EAAA,EAAI,QAAQ,EAAG;AAAA;AAAA,OACjC;AAAA,MAEF,KAAA,EAAO,KAAK,IAAI,CAAA;AAAA,MAChB,KAAA,EAAO,KAAM,CAAA,SAAA,GAAY,SAAY,GAAA,SAAA;AAAA,MACrC,WAAW,MAAW,KAAA,KAAA;AAAA;AAAA,GAE1B,EAAA,CAAA;AAIF,EAAA,IAAI,WAAW,KAAW,CAAA,EAAA;AACxB,IAAO,uBAAA,GAAA,CAAC,YAAa,EAAA,EAAA,MAAA,EAAiB,QAAO,EAAA,MAAA,EAAA,CAAA;AAAA;AAG/C,EAAO,OAAA,MAAA;AACT;;;;"}
|
|
@@ -1,44 +1,16 @@
|
|
|
1
1
|
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
2
2
|
import { Rank } from '@backstage-community/plugin-tech-insights-maturity-common';
|
|
3
3
|
import Avatar from '@mui/material/Avatar';
|
|
4
|
-
import Chip from '@mui/material/Chip';
|
|
5
4
|
import Tooltip from '@mui/material/Tooltip';
|
|
6
5
|
import { Circle } from 'rc-progress';
|
|
7
6
|
import getRankImg from '../../helpers/Rank.esm.js';
|
|
8
7
|
import { getNextRankColor, pluralize } from '../../helpers/utils.esm.js';
|
|
9
|
-
import { MaturityLink } from '../../helpers/MaturityLink.esm.js';
|
|
10
8
|
|
|
11
|
-
const
|
|
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__ */ jsx(
|
|
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 = ({
|
|
9
|
+
const MaturityRankIcon = ({
|
|
36
10
|
className,
|
|
37
|
-
entity,
|
|
38
11
|
progress,
|
|
39
12
|
size = 27,
|
|
40
|
-
value
|
|
41
|
-
variant
|
|
13
|
+
value
|
|
42
14
|
}) => {
|
|
43
15
|
let result;
|
|
44
16
|
const rank = value.rank;
|
|
@@ -53,7 +25,7 @@ const MaturityRankAvatar = ({
|
|
|
53
25
|
style: { width: size, height: size }
|
|
54
26
|
}
|
|
55
27
|
);
|
|
56
|
-
let tooltip =
|
|
28
|
+
let tooltip = Rank[rank];
|
|
57
29
|
if (progress !== void 0) {
|
|
58
30
|
const remainingTasks = progress.totalChecks - progress.passedChecks;
|
|
59
31
|
const remainingTasksTip = `(${remainingTasks} task${pluralize(
|
|
@@ -85,18 +57,9 @@ const MaturityRankAvatar = ({
|
|
|
85
57
|
]
|
|
86
58
|
}
|
|
87
59
|
);
|
|
88
|
-
} else {
|
|
89
|
-
tooltip = Rank[rank];
|
|
90
|
-
}
|
|
91
|
-
if (variant === "chip") {
|
|
92
|
-
tooltip = value.isMaxRank ? "All required tasks have been completed!" : `Increase your rank by completing all ${Rank[rank + 1]} rank tasks!`;
|
|
93
|
-
result = /* @__PURE__ */ jsx(ChipWrapper, { rank, size, isMaxRank: value.isMaxRank, children: result });
|
|
94
|
-
}
|
|
95
|
-
if (entity !== void 0) {
|
|
96
|
-
result = /* @__PURE__ */ jsx("div", { children: /* @__PURE__ */ jsx(MaturityLink, { entity, children: result }) });
|
|
97
60
|
}
|
|
98
61
|
return /* @__PURE__ */ jsx(Tooltip, { title: tooltip, arrow: true, children: result });
|
|
99
62
|
};
|
|
100
63
|
|
|
101
|
-
export {
|
|
102
|
-
//# sourceMappingURL=
|
|
64
|
+
export { MaturityRankIcon };
|
|
65
|
+
//# sourceMappingURL=MaturityRankIcon.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MaturityRankIcon.esm.js","sources":["../../../src/components/MaturityRankIcon/MaturityRankIcon.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 {\n MaturityProgress,\n Rank,\n} from '@backstage-community/plugin-tech-insights-maturity-common';\nimport Avatar from '@mui/material/Avatar';\nimport Tooltip from '@mui/material/Tooltip';\nimport { Circle } from 'rc-progress';\nimport getRankImg from '../../helpers/Rank';\nimport { getNextRankColor, pluralize } from '../../helpers/utils';\n\ntype Props = {\n value: { rank: Rank; isMaxRank?: boolean };\n className?: string;\n size?: number;\n progress?: MaturityProgress;\n};\n\nexport const MaturityRankIcon = ({\n className,\n progress,\n size = 27,\n value,\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 = Rank[rank];\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 }\n\n // Wrap with tooltip and return\n return (\n <Tooltip title={tooltip} arrow>\n {result}\n </Tooltip>\n );\n};\n"],"names":[],"mappings":";;;;;;;;AAgCO,MAAM,mBAAmB,CAAC;AAAA,EAC/B,SAAA;AAAA,EACA,QAAA;AAAA,EACA,IAAO,GAAA,EAAA;AAAA,EACP;AACF,CAAa,KAAA;AACX,EAAI,IAAA,MAAA;AACJ,EAAA,MAAM,OAAO,KAAM,CAAA,IAAA;AACnB,EAAA,MAAM,OAAU,GAAA,KAAA,CAAM,SAAY,GAAA,KAAA,CAAM,OAAO,IAAK,CAAA,IAAA;AAEpD,EAAM,MAAA,GAAA,GAAM,WAAW,IAAI,CAAA;AAG3B,EACE,MAAA,mBAAA,GAAA;AAAA,IAAC,MAAA;AAAA,IAAA;AAAA,MACC,GAAA,EAAK,KAAK,IAAI,CAAA;AAAA,MACd,GAAK,EAAA,GAAA;AAAA,MACL,SAAA;AAAA,MACA,KAAO,EAAA,EAAE,KAAO,EAAA,IAAA,EAAM,QAAQ,IAAK;AAAA;AAAA,GACrC;AAGF,EAAI,IAAA,OAAA,GAAU,KAAK,IAAI,CAAA;AAGvB,EAAA,IAAI,aAAa,KAAW,CAAA,EAAA;AAC1B,IAAM,MAAA,cAAA,GAAiB,QAAS,CAAA,WAAA,GAAc,QAAS,CAAA,YAAA;AACvD,IAAM,MAAA,iBAAA,GAAoB,CAAI,CAAA,EAAA,cAAc,CAAQ,KAAA,EAAA,SAAA;AAAA,MAClD;AAAA,KACD,CAAA,MAAA,CAAA;AACD,IAAA,OAAA,GAAU,MAAM,SACZ,GAAA,CAAA,EAAG,IAAK,CAAA,IAAI,CAAC,CACb,cAAA,CAAA,GAAA,CAAA,EAAG,QAAS,CAAA,UAAU,QAAQ,IAAK,CAAA,IAAA,GAAO,CAAC,CAAC,IAAI,iBAAiB,CAAA,CAAA;AAErE,IACE,MAAA,mBAAA,IAAA;AAAA,MAAC,KAAA;AAAA,MAAA;AAAA,QACC,KAAO,EAAA;AAAA,UACL,OAAS,EAAA,MAAA;AAAA,UACT,QAAU,EAAA,UAAA;AAAA,UACV,UAAY,EAAA,QAAA;AAAA,UACZ,cAAgB,EAAA;AAAA,SAClB;AAAA,QAEA,QAAA,EAAA;AAAA,0BAAA,GAAA;AAAA,YAAC,MAAA;AAAA,YAAA;AAAA,cACC,WAAA,EAAa,gBAAiB,CAAA,IAAA,EAAM,OAAO,CAAA;AAAA,cAC3C,UAAW,EAAA,oBAAA;AAAA,cACX,WAAa,EAAA,EAAA;AAAA,cACb,UAAY,EAAA,EAAA;AAAA,cACZ,SAAS,QAAS,CAAA,UAAA;AAAA,cAClB,KAAA,EAAO,EAAE,KAAO,EAAA,IAAA,GAAO,OAAO,CAAG,EAAA,MAAA,EAAQ,IAAO,GAAA,IAAA,GAAO,CAAE;AAAA;AAAA,WAC3D;AAAA,0BACA,GAAA,CAAC,SAAI,KAAO,EAAA,EAAE,QAAQ,CAAG,EAAA,QAAA,EAAU,UAAW,EAAA,EAAI,QAAO,EAAA,MAAA,EAAA;AAAA;AAAA;AAAA,KAC3D;AAAA;AAKJ,EAAA,2BACG,OAAQ,EAAA,EAAA,KAAA,EAAO,OAAS,EAAA,KAAA,EAAK,MAC3B,QACH,EAAA,MAAA,EAAA,CAAA;AAEJ;;;;"}
|
|
@@ -9,7 +9,7 @@ import Divider from '@mui/material/Divider';
|
|
|
9
9
|
import Stack from '@mui/material/Stack';
|
|
10
10
|
import { MaturitySummaryCardContent } from '../MaturitySummaryInfoCard/MaturitySummaryCardContent.esm.js';
|
|
11
11
|
import { MaturityHelp } from '../../helpers/MaturityHelp.esm.js';
|
|
12
|
-
import {
|
|
12
|
+
import { MaturityRankIcon } from '../MaturityRankIcon/MaturityRankIcon.esm.js';
|
|
13
13
|
|
|
14
14
|
const useStyles = makeStyles({
|
|
15
15
|
content: {
|
|
@@ -47,7 +47,7 @@ function rankProgress(rank, value) {
|
|
|
47
47
|
}
|
|
48
48
|
function getRankAvatarProgress(rank, value) {
|
|
49
49
|
return /* @__PURE__ */ jsx(
|
|
50
|
-
|
|
50
|
+
MaturityRankIcon,
|
|
51
51
|
{
|
|
52
52
|
value: { rank, isMaxRank: true },
|
|
53
53
|
size: 25,
|
|
@@ -73,7 +73,7 @@ const MaturityRankInfoCard = ({ summary }) => {
|
|
|
73
73
|
] }) }),
|
|
74
74
|
/* @__PURE__ */ jsxs(CardContent, { children: [
|
|
75
75
|
/* @__PURE__ */ jsx(
|
|
76
|
-
|
|
76
|
+
MaturityRankIcon,
|
|
77
77
|
{
|
|
78
78
|
value: summary,
|
|
79
79
|
size: 80,
|
|
@@ -1 +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 { Fragment } 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 {
|
|
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 { Fragment } 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 { MaturityRankIcon } from '../MaturityRankIcon';\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 <MaturityRankIcon\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 <Fragment>\n Maturity Rank\n <MaturityHelp />\n </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 <MaturityRankIcon\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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"}
|
|
@@ -6,7 +6,7 @@ import '@backstage/catalog-model';
|
|
|
6
6
|
import '@backstage/plugin-catalog-react';
|
|
7
7
|
import '@backstage-community/plugin-tech-insights-react';
|
|
8
8
|
import '@backstage-community/plugin-tech-insights-maturity-common';
|
|
9
|
-
import {
|
|
9
|
+
import { MaturityRankChip } from '../MaturityRankChip/MaturityRankChip.esm.js';
|
|
10
10
|
|
|
11
11
|
const MaturityRankWidget = ({ entity }) => {
|
|
12
12
|
const api = useApi(maturityApiRef);
|
|
@@ -15,7 +15,7 @@ const MaturityRankWidget = ({ entity }) => {
|
|
|
15
15
|
[api, entity]
|
|
16
16
|
);
|
|
17
17
|
if (loading || !value) return /* @__PURE__ */ jsx(Fragment, {});
|
|
18
|
-
return /* @__PURE__ */ jsx(
|
|
18
|
+
return /* @__PURE__ */ jsx(MaturityRankChip, { entity, value });
|
|
19
19
|
};
|
|
20
20
|
|
|
21
21
|
export { MaturityRankWidget };
|
|
@@ -1 +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 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 {
|
|
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 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 { MaturityRankChip } from '../MaturityRankChip';\n\ntype Props = {\n entity: Entity;\n};\n\nexport const MaturityRankWidget = ({ entity }: Props) => {\n const api = useApi(maturityApiRef);\n\n const { value, loading } = useAsyncRetry(\n async () => api.getMaturityRank(entity),\n [api, entity],\n );\n\n if (loading || !value) return <></>;\n\n return <MaturityRankChip entity={entity} value={value} />;\n};\n"],"names":[],"mappings":";;;;;;;;;;AA0BO,MAAM,kBAAqB,GAAA,CAAC,EAAE,MAAA,EAAoB,KAAA;AACvD,EAAM,MAAA,GAAA,GAAM,OAAO,cAAc,CAAA;AAEjC,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,GAAA,CAAA,QAAA,EAAA,EAAA,CAAA;AAEhC,EAAO,uBAAA,GAAA,CAAC,gBAAiB,EAAA,EAAA,MAAA,EAAgB,KAAc,EAAA,CAAA;AACzD;;;;"}
|
|
@@ -36,7 +36,7 @@ const MaturityScorePage = () => {
|
|
|
36
36
|
} else if (!value) {
|
|
37
37
|
return /* @__PURE__ */ jsx(EmptyState, { missing: "info", title: "No information to display" });
|
|
38
38
|
}
|
|
39
|
-
return /* @__PURE__ */ jsxs(Grid, { container: true, children: [
|
|
39
|
+
return /* @__PURE__ */ jsxs(Grid, { container: true, spacing: 1, children: [
|
|
40
40
|
/* @__PURE__ */ jsx(Grid, { item: true, md: 3, children: /* @__PURE__ */ jsx(MaturityRankInfoCard, { summary: value.summary }) }),
|
|
41
41
|
/* @__PURE__ */ jsx(Grid, { item: true, md: 9, children: /* @__PURE__ */ jsx(InfoCard, { title: "Checks", variant: "fullHeight", children: /* @__PURE__ */ jsx(
|
|
42
42
|
Grid,
|
|
@@ -1 +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 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 '@mui/material/Box';\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":";;;;;;;;;;;;;;;AA6BO,MAAM,oBAAoB,MAAM;AACrC,EAAM,MAAA,EAAE,MAAO,EAAA,GAAI,SAAU,EAAA;AAC7B,EAAM,MAAA,GAAA,GAAM,OAAO,cAAc,CAAA;AAEjC,EAAA,MAAM,EAAE,OAAS,EAAA,KAAA,EAAO,KAAM,EAAA,GAAI,cAAc,YAAY;AAC1D,IAAA,MAAM,KAAQ,GAAA,MAAM,GAAI,CAAA,gBAAA,CAAiB,MAAM,CAAA;AAC/C,IAAM,MAAA,KAAA,GAAQ,MAAM,GAAI,CAAA,QAAA;AAAA,MACtB,qBAAqB,MAAM,CAAA;AAAA,MAC3B,MAAM,MAAQ,EAAA,OAAA,CAAQ,CAAK,CAAA,KAAA,CAAA,CAAE,MAAM,OAAO;AAAA,KAC5C;AAEA,IAAO,OAAA;AAAA,MACL,QAAQ,KAAM,CAAA,MAAA;AAAA,MACd,MAAM,KAAM,CAAA,IAAA;AAAA,MACZ,SAAS,KAAM,CAAA,OAAA;AAAA,MACf;AAAA,KACF;AAAA,GACF,EAAG,CAAC,GAAG,CAAC,CAAA;AAER,EAAA,IAAI,OAAS,EAAA;AACX,IAAA,2BAAQ,QAAS,EAAA,EAAA,CAAA;AAAA,aACR,KAAO,EAAA;AAChB,IAAA,uBAAQ,GAAA,CAAA,KAAA,EAAA,EAAM,QAAS,EAAA,OAAA,EAAS,gBAAM,OAAQ,EAAA,CAAA;AAAA,GAChD,MAAA,IAAW,CAAC,KAAO,EAAA;AACjB,IAAA,uBAAQ,GAAA,CAAA,UAAA,EAAA,EAAW,OAAQ,EAAA,MAAA,EAAO,OAAM,2BAA4B,EAAA,CAAA;AAAA;AAGtE,
|
|
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 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 '@mui/material/Box';\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 spacing={1}>\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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"}
|
|
@@ -1,54 +1,25 @@
|
|
|
1
1
|
import { jsx, Fragment, jsxs } from 'react/jsx-runtime';
|
|
2
2
|
import { Link } from '@backstage/core-components';
|
|
3
|
+
import Accordion from '@mui/material/Accordion';
|
|
3
4
|
import AccessTimeIcon from '@mui/icons-material/AccessTime';
|
|
4
|
-
import
|
|
5
|
+
import AccordionSummary from '@mui/material/AccordionSummary';
|
|
6
|
+
import AccordionDetails from '@mui/material/AccordionDetails';
|
|
5
7
|
import CancelTwoToneIcon from '@mui/icons-material/Cancel';
|
|
6
8
|
import CategoryIcon from '@mui/icons-material/Category';
|
|
7
9
|
import CheckCircleTwoToneIcon from '@mui/icons-material/CheckCircleTwoTone';
|
|
8
10
|
import EmojiObjectsIcon from '@mui/icons-material/EmojiObjects';
|
|
9
11
|
import MenuBookIcon from '@mui/icons-material/MenuBook';
|
|
10
|
-
import MuiAccordion from '@mui/material/Accordion';
|
|
11
|
-
import MuiAccordionDetails from '@mui/material/AccordionDetails';
|
|
12
|
-
import MuiAccordionSummary from '@mui/material/AccordionSummary';
|
|
13
12
|
import Grid from '@mui/material/Grid';
|
|
14
13
|
import Stack from '@mui/material/Stack';
|
|
15
14
|
import Tooltip from '@mui/material/Tooltip';
|
|
16
15
|
import Typography from '@mui/material/Typography';
|
|
17
|
-
import {
|
|
18
|
-
import { useState } from 'react';
|
|
19
|
-
import {
|
|
16
|
+
import { makeStyles } from '@mui/styles';
|
|
17
|
+
import React, { useState } from 'react';
|
|
18
|
+
import { MaturityRankChip } from '../MaturityRankChip/MaturityRankChip.esm.js';
|
|
19
|
+
import ArrowDropDownIcon from '@mui/icons-material/ArrowDropDown';
|
|
20
|
+
import ErrorOutlineIcon from '@mui/icons-material/ErrorOutline';
|
|
21
|
+
import ExpandMoreIcon from '@mui/icons-material/ExpandMore';
|
|
20
22
|
|
|
21
|
-
const Accordion = styled((props) => /* @__PURE__ */ jsx(MuiAccordion, { disableGutters: true, elevation: 0, square: true, ...props }))(({ theme }) => ({
|
|
22
|
-
border: `1px solid ${theme.palette.divider}`,
|
|
23
|
-
"&:not(:last-child)": {
|
|
24
|
-
borderBottom: 0
|
|
25
|
-
},
|
|
26
|
-
"&:before": {
|
|
27
|
-
display: "none"
|
|
28
|
-
}
|
|
29
|
-
}));
|
|
30
|
-
const AccordionSummary = styled((props) => /* @__PURE__ */ jsx(
|
|
31
|
-
MuiAccordionSummary,
|
|
32
|
-
{
|
|
33
|
-
expandIcon: /* @__PURE__ */ jsx(ArrowForwardIosSharpIcon, { sx: { fontSize: "0.9rem" } }),
|
|
34
|
-
...props
|
|
35
|
-
}
|
|
36
|
-
))(({ theme }) => ({
|
|
37
|
-
backgroundColor: theme.palette.mode === "dark" ? "rgba(255, 255, 255, .05)" : "rgba(0, 0, 0, .03)",
|
|
38
|
-
flexDirection: "row-reverse",
|
|
39
|
-
width: "100%",
|
|
40
|
-
paddingLeft: theme.spacing(2),
|
|
41
|
-
"& .MuiAccordionSummary-expandIconWrapper.Mui-expanded": {
|
|
42
|
-
transform: "rotate(90deg)"
|
|
43
|
-
},
|
|
44
|
-
"& .MuiAccordionSummary-content": {
|
|
45
|
-
marginLeft: theme.spacing(1)
|
|
46
|
-
}
|
|
47
|
-
}));
|
|
48
|
-
const AccordionDetails = styled(MuiAccordionDetails)(({ theme }) => ({
|
|
49
|
-
padding: theme.spacing(2),
|
|
50
|
-
borderTop: "1px solid rgba(0, 0, 0, .125)"
|
|
51
|
-
}));
|
|
52
23
|
const MaturityCheckTableRow = ({
|
|
53
24
|
checkResult,
|
|
54
25
|
updated
|
|
@@ -72,56 +43,77 @@ const MaturityCheckTableRow = ({
|
|
|
72
43
|
}
|
|
73
44
|
});
|
|
74
45
|
const { check, solution, filters } = useStyles();
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
46
|
+
const errorInfo = Object.values(checkResult.facts).filter(
|
|
47
|
+
(fact) => fact.type !== "boolean"
|
|
48
|
+
);
|
|
49
|
+
return /* @__PURE__ */ jsx("div", { children: /* @__PURE__ */ jsxs(
|
|
50
|
+
Accordion,
|
|
51
|
+
{
|
|
52
|
+
expanded,
|
|
53
|
+
onChange: handleChange(),
|
|
54
|
+
elevation: 2,
|
|
55
|
+
sx: { border: "1px solid rgba(173, 172, 172, 0.26)" },
|
|
56
|
+
children: [
|
|
57
|
+
/* @__PURE__ */ jsx(AccordionSummary, { expandIcon: /* @__PURE__ */ jsx(ArrowDropDownIcon, {}), children: /* @__PURE__ */ jsxs(Grid, { container: true, alignItems: "center", spacing: 2, children: [
|
|
58
|
+
/* @__PURE__ */ jsx(Grid, { item: true, xs: 3, children: /* @__PURE__ */ jsx(Typography, { children: checkResult.check.name }) }),
|
|
59
|
+
/* @__PURE__ */ jsx(Grid, { item: true, xs: 7.5, children: /* @__PURE__ */ jsx(Typography, { className: check, children: checkResult.check.description }) }),
|
|
60
|
+
/* @__PURE__ */ jsx(Grid, { item: true, xs: 1.5, children: checkResult.result ? /* @__PURE__ */ jsx(
|
|
61
|
+
CheckCircleTwoToneIcon,
|
|
62
|
+
{
|
|
63
|
+
className: check,
|
|
64
|
+
style: { color: "#53d44c" }
|
|
65
|
+
}
|
|
66
|
+
) : /* @__PURE__ */ jsx(
|
|
67
|
+
CancelTwoToneIcon,
|
|
68
|
+
{
|
|
69
|
+
className: check,
|
|
70
|
+
style: { color: "#f54040" }
|
|
71
|
+
}
|
|
72
|
+
) })
|
|
73
|
+
] }) }),
|
|
74
|
+
/* @__PURE__ */ jsx(AccordionDetails, { children: /* @__PURE__ */ jsxs(Grid, { container: true, spacing: 1, sx: { paddingLeft: 1, paddingRight: 1 }, children: [
|
|
75
|
+
/* @__PURE__ */ jsx(Grid, { item: true, xs: 9, children: /* @__PURE__ */ jsxs(Stack, { spacing: 1, children: [
|
|
76
|
+
/* @__PURE__ */ jsxs(Stack, { spacing: 1, direction: "row", children: [
|
|
77
|
+
/* @__PURE__ */ jsx(Tooltip, { title: "Solution: How to pass the check", children: /* @__PURE__ */ jsx(EmojiObjectsIcon, { color: "warning" }) }),
|
|
78
|
+
/* @__PURE__ */ jsx(Typography, { className: solution, children: checkResult.check.metadata?.solution })
|
|
79
|
+
] }),
|
|
80
|
+
checkResult.result === false && errorInfo.length > 0 && /* @__PURE__ */ jsxs(Stack, { spacing: 1, direction: "row", children: [
|
|
81
|
+
/* @__PURE__ */ jsx(Tooltip, { title: "Error: The fact(s) that caused this check to fail", children: /* @__PURE__ */ jsx(ErrorOutlineIcon, { color: "error" }) }),
|
|
82
|
+
/* @__PURE__ */ jsx(
|
|
83
|
+
Typography,
|
|
84
|
+
{
|
|
85
|
+
variant: "subtitle2",
|
|
86
|
+
className: filters,
|
|
87
|
+
color: "secondary",
|
|
88
|
+
children: errorInfo.map((fact, index) => /* @__PURE__ */ jsxs(React.Fragment, { children: [
|
|
89
|
+
index > 0 && /* @__PURE__ */ jsx("br", {}),
|
|
90
|
+
`${fact.description}: ${fact.value}`
|
|
91
|
+
] }, fact.id))
|
|
92
|
+
}
|
|
93
|
+
)
|
|
94
|
+
] }),
|
|
95
|
+
/* @__PURE__ */ jsxs(Stack, { spacing: 1, direction: "row", children: [
|
|
96
|
+
/* @__PURE__ */ jsx(Tooltip, { title: "Reference: Consult the documentation linked here for more background info.", children: /* @__PURE__ */ jsx(MenuBookIcon, { color: "primary" }) }),
|
|
97
|
+
/* @__PURE__ */ jsx(Typography, { children: checkResult.check.links?.map((link, index) => /* @__PURE__ */ jsxs(React.Fragment, { children: [
|
|
98
|
+
index > 0 && ", ",
|
|
99
|
+
/* @__PURE__ */ jsx(Link, { to: link.url, children: link.title })
|
|
100
|
+
] }, link.url)) })
|
|
101
|
+
] })
|
|
102
|
+
] }) }),
|
|
103
|
+
/* @__PURE__ */ jsx(Grid, { item: true, xs: 3, children: /* @__PURE__ */ jsxs(Stack, { spacing: 0.2, children: [
|
|
104
|
+
/* @__PURE__ */ jsxs(Stack, { spacing: 1, direction: "row", children: [
|
|
105
|
+
/* @__PURE__ */ jsx(Tooltip, { title: "Category: The category for this check", children: /* @__PURE__ */ jsx(CategoryIcon, { color: "primary" }) }),
|
|
106
|
+
/* @__PURE__ */ jsx(Typography, { variant: "subtitle1", className: filters, children: checkResult.check.metadata?.category })
|
|
107
|
+
] }),
|
|
108
|
+
/* @__PURE__ */ jsxs(Stack, { spacing: 1, direction: "row", children: [
|
|
109
|
+
/* @__PURE__ */ jsx(Tooltip, { title: "Update: Last time the maturity check was updated", children: /* @__PURE__ */ jsx(AccessTimeIcon, { color: "primary" }) }),
|
|
110
|
+
/* @__PURE__ */ jsx(Typography, { variant: "subtitle2", className: filters, children: updated ? `${updated.slice(0, 19)}` : "Not yet run" })
|
|
111
|
+
] })
|
|
112
|
+
] }) })
|
|
113
|
+
] }) })
|
|
114
|
+
]
|
|
115
|
+
}
|
|
116
|
+
) });
|
|
125
117
|
};
|
|
126
118
|
const MaturityCheckTable = ({
|
|
127
119
|
rank,
|
|
@@ -130,27 +122,43 @@ const MaturityCheckTable = ({
|
|
|
130
122
|
facts
|
|
131
123
|
}) => {
|
|
132
124
|
const [expanded, setExpanded] = useState(rank.rank + 1 === category);
|
|
125
|
+
if (checks.length === 0) return /* @__PURE__ */ jsx(Fragment, {});
|
|
133
126
|
const handleChange = () => (_event, newExpanded) => {
|
|
134
127
|
setExpanded(newExpanded);
|
|
135
128
|
};
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
129
|
+
return /* @__PURE__ */ jsx("div", { children: /* @__PURE__ */ jsxs(
|
|
130
|
+
Accordion,
|
|
131
|
+
{
|
|
132
|
+
expanded,
|
|
133
|
+
onChange: handleChange(),
|
|
134
|
+
elevation: 1,
|
|
135
|
+
sx: { border: "1.5px solid rgba(173, 172, 172, 0.26)" },
|
|
136
|
+
children: [
|
|
137
|
+
/* @__PURE__ */ jsx(
|
|
138
|
+
AccordionSummary,
|
|
139
|
+
{
|
|
140
|
+
expandIcon: /* @__PURE__ */ jsx(ExpandMoreIcon, {}),
|
|
141
|
+
"aria-controls": "panel2-content",
|
|
142
|
+
id: "panel2-header",
|
|
143
|
+
children: /* @__PURE__ */ jsx(
|
|
144
|
+
MaturityRankChip,
|
|
145
|
+
{
|
|
146
|
+
value: { rank: category, isMaxRank: category <= rank.rank }
|
|
147
|
+
}
|
|
148
|
+
)
|
|
149
|
+
}
|
|
150
|
+
),
|
|
151
|
+
/* @__PURE__ */ jsx(AccordionDetails, { children: /* @__PURE__ */ jsx(Grid, { container: true, spacing: 1, children: /* @__PURE__ */ jsx(Grid, { item: true, xs: 12, children: checks?.map((entry) => /* @__PURE__ */ jsx(
|
|
152
|
+
MaturityCheckTableRow,
|
|
153
|
+
{
|
|
154
|
+
updated: facts[entry.check.factIds[0]]?.timestamp,
|
|
155
|
+
checkResult: entry
|
|
156
|
+
},
|
|
157
|
+
entry.check.id
|
|
158
|
+
)) }) }) })
|
|
159
|
+
]
|
|
160
|
+
}
|
|
161
|
+
) });
|
|
154
162
|
};
|
|
155
163
|
|
|
156
164
|
export { MaturityCheckTable };
|
|
@@ -1 +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 type { SyntheticEvent } from 'react';\nimport { useState } from 'react';\nimport { MaturityRankAvatar } from '../MaturityRankAvatar';\nimport { InsightFacts } from '@backstage-community/plugin-tech-insights-common';\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] = useState<boolean>(\n checkResult.result === false,\n );\n\n const handleChange = () => (_event: 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] = useState<boolean>(rank.rank + 1 === category);\n const handleChange = () => (_event: 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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"}
|
|
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 Accordion from '@mui/material/Accordion';\nimport AccessTimeIcon from '@mui/icons-material/AccessTime';\nimport AccordionSummary from '@mui/material/AccordionSummary';\nimport AccordionDetails from '@mui/material/AccordionDetails';\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 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 } from '@mui/styles';\nimport type { SyntheticEvent } from 'react';\nimport React, { useState } from 'react';\nimport { InsightFacts } from '@backstage-community/plugin-tech-insights-common';\nimport { MaturityRankChip } from '../MaturityRankChip';\nimport ArrowDropDownIcon from '@mui/icons-material/ArrowDropDown';\nimport ErrorOutlineIcon from '@mui/icons-material/ErrorOutline';\nimport ExpandMoreIcon from '@mui/icons-material/ExpandMore';\n\ninterface Props {\n checks: MaturityCheckResult[];\n facts: InsightFacts;\n rank: MaturityRank;\n category: Rank;\n}\n\nconst MaturityCheckTableRow = ({\n checkResult,\n updated,\n}: {\n checkResult: MaturityCheckResult;\n updated: string;\n}) => {\n const [expanded, setExpanded] = useState<boolean>(\n checkResult.result === false,\n );\n\n const handleChange = () => (_event: 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 const errorInfo = Object.values(checkResult.facts).filter(\n fact => fact.type !== 'boolean',\n );\n\n return (\n <div>\n <Accordion\n expanded={expanded}\n onChange={handleChange()}\n elevation={2}\n sx={{ border: '1px solid rgba(173, 172, 172, 0.26)' }}\n >\n <AccordionSummary expandIcon={<ArrowDropDownIcon />}>\n <Grid container alignItems=\"center\" spacing={2}>\n <Grid item xs={3}>\n <Typography>{checkResult.check.name}</Typography>\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={1} sx={{ paddingLeft: 1, paddingRight: 1 }}>\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 {checkResult.result === false && errorInfo.length > 0 && (\n <Stack spacing={1} direction=\"row\">\n <Tooltip title=\"Error: The fact(s) that caused this check to fail\">\n <ErrorOutlineIcon color=\"error\" />\n </Tooltip>\n <Typography\n variant=\"subtitle2\"\n className={filters}\n color=\"secondary\"\n >\n {errorInfo.map((fact, index) => (\n <React.Fragment key={fact.id}>\n {index > 0 && <br />}\n {`${fact.description}: ${fact.value}`}\n </React.Fragment>\n ))}\n </Typography>\n </Stack>\n )}\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 {checkResult.check.links?.map((link, index) => (\n <React.Fragment key={link.url}>\n {index > 0 && ', '}\n <Link to={link.url}>{link.title}</Link>\n </React.Fragment>\n ))}\n </Typography>\n </Stack>\n </Stack>\n </Grid>\n <Grid item xs={3}>\n <Stack spacing={0.2}>\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=\"Update: Last time the maturity check was updated\">\n <AccessTimeIcon color=\"primary\" />\n </Tooltip>\n <Typography variant=\"subtitle2\" className={filters}>\n {updated ? `${updated.slice(0, 19)}` : 'Not yet run'}\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] = useState<boolean>(rank.rank + 1 === category);\n if (checks.length === 0) return <></>;\n\n const handleChange = () => (_event: SyntheticEvent, newExpanded: boolean) => {\n setExpanded(newExpanded);\n };\n\n return (\n <div>\n <Accordion\n expanded={expanded}\n onChange={handleChange()}\n elevation={1}\n sx={{ border: '1.5px solid rgba(173, 172, 172, 0.26)' }}\n >\n <AccordionSummary\n expandIcon={<ExpandMoreIcon />}\n aria-controls=\"panel2-content\"\n id=\"panel2-header\"\n >\n <MaturityRankChip\n value={{ rank: category, isMaxRank: category <= rank.rank }}\n />\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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"}
|
|
@@ -7,11 +7,11 @@ import Grid from '@mui/material/Grid';
|
|
|
7
7
|
import CardContent from '@mui/material/CardContent';
|
|
8
8
|
import { MaturitySummaryCardContent } from './MaturitySummaryCardContent.esm.js';
|
|
9
9
|
import { MaturityHelp } from '../../helpers/MaturityHelp.esm.js';
|
|
10
|
-
import { MaturityRankAvatar } from '../MaturityRankAvatar/MaturityRankAvatar.esm.js';
|
|
11
10
|
import { maturityApiRef } from '../../api/MaturityApi.esm.js';
|
|
12
11
|
import '@backstage/catalog-model';
|
|
13
12
|
import '@backstage-community/plugin-tech-insights-react';
|
|
14
13
|
import '@backstage-community/plugin-tech-insights-maturity-common';
|
|
14
|
+
import { MaturityRankChip } from '../MaturityRankChip/MaturityRankChip.esm.js';
|
|
15
15
|
|
|
16
16
|
const MaturitySummaryInfoCard = () => {
|
|
17
17
|
const { entity } = useEntity();
|
|
@@ -29,7 +29,7 @@ const MaturitySummaryInfoCard = () => {
|
|
|
29
29
|
"Maturity",
|
|
30
30
|
/* @__PURE__ */ jsx(MaturityHelp, {})
|
|
31
31
|
] }),
|
|
32
|
-
/* @__PURE__ */ jsx(Grid, { item: true, md: 5, children: /* @__PURE__ */ jsx(
|
|
32
|
+
/* @__PURE__ */ jsx(Grid, { item: true, md: 5, children: /* @__PURE__ */ jsx(MaturityRankChip, { value, entity }) })
|
|
33
33
|
] }),
|
|
34
34
|
children: /* @__PURE__ */ jsx(CardContent, { children: /* @__PURE__ */ jsx(MaturitySummaryCardContent, { summary: value, variant: "infoCard" }) })
|
|
35
35
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MaturitySummaryInfoCard.esm.js","sources":["../../../src/components/MaturitySummaryInfoCard/MaturitySummaryInfoCard.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 useAsyncRetry from 'react-use/lib/useAsync';\n\nimport { InfoCard } from '@backstage/core-components';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { useEntity } from '@backstage/plugin-catalog-react';\nimport Grid from '@mui/material/Grid';\nimport CardContent from '@mui/material/CardContent';\nimport { MaturitySummaryCardContent } from './MaturitySummaryCardContent';\nimport { MaturityHelp } from '../../helpers/MaturityHelp';\nimport {
|
|
1
|
+
{"version":3,"file":"MaturitySummaryInfoCard.esm.js","sources":["../../../src/components/MaturitySummaryInfoCard/MaturitySummaryInfoCard.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 useAsyncRetry from 'react-use/lib/useAsync';\n\nimport { InfoCard } from '@backstage/core-components';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { useEntity } from '@backstage/plugin-catalog-react';\nimport Grid from '@mui/material/Grid';\nimport CardContent from '@mui/material/CardContent';\nimport { MaturitySummaryCardContent } from './MaturitySummaryCardContent';\nimport { MaturityHelp } from '../../helpers/MaturityHelp';\nimport { maturityApiRef } from '../../api';\nimport { MaturityRankChip } from '../MaturityRankChip';\n\nexport const MaturitySummaryInfoCard = () => {\n const { entity } = useEntity();\n\n const api = useApi(maturityApiRef);\n const { value, loading } = useAsyncRetry(\n async () => api.getMaturitySummary(entity),\n [api, entity],\n );\n\n if (!value || loading) return <></>;\n\n return (\n <InfoCard\n title={\n <Grid container>\n <Grid item md={7}>\n Maturity\n <MaturityHelp />\n </Grid>\n <Grid item md={5}>\n <MaturityRankChip value={value} entity={entity} />\n </Grid>\n </Grid>\n }\n >\n <CardContent>\n <MaturitySummaryCardContent summary={value} variant=\"infoCard\" />\n </CardContent>\n </InfoCard>\n );\n};\n"],"names":[],"mappings":";;;;;;;;;;;;;;;AA2BO,MAAM,0BAA0B,MAAM;AAC3C,EAAM,MAAA,EAAE,MAAO,EAAA,GAAI,SAAU,EAAA;AAE7B,EAAM,MAAA,GAAA,GAAM,OAAO,cAAc,CAAA;AACjC,EAAM,MAAA,EAAE,KAAO,EAAA,OAAA,EAAY,GAAA,aAAA;AAAA,IACzB,YAAY,GAAI,CAAA,kBAAA,CAAmB,MAAM,CAAA;AAAA,IACzC,CAAC,KAAK,MAAM;AAAA,GACd;AAEA,EAAA,IAAI,CAAC,KAAA,IAAS,OAAS,EAAA,uBAAS,GAAA,CAAA,QAAA,EAAA,EAAA,CAAA;AAEhC,EACE,uBAAA,GAAA;AAAA,IAAC,QAAA;AAAA,IAAA;AAAA,MACC,KACE,kBAAA,IAAA,CAAC,IAAK,EAAA,EAAA,SAAA,EAAS,IACb,EAAA,QAAA,EAAA;AAAA,wBAAA,IAAA,CAAC,IAAK,EAAA,EAAA,IAAA,EAAI,IAAC,EAAA,EAAA,EAAI,CAAG,EAAA,QAAA,EAAA;AAAA,UAAA,UAAA;AAAA,8BAEf,YAAa,EAAA,EAAA;AAAA,SAChB,EAAA,CAAA;AAAA,wBACA,GAAA,CAAC,IAAK,EAAA,EAAA,IAAA,EAAI,IAAC,EAAA,EAAA,EAAI,GACb,QAAC,kBAAA,GAAA,CAAA,gBAAA,EAAA,EAAiB,KAAc,EAAA,MAAA,EAAgB,CAClD,EAAA;AAAA,OACF,EAAA,CAAA;AAAA,MAGF,QAAA,kBAAA,GAAA,CAAC,eACC,QAAC,kBAAA,GAAA,CAAA,0BAAA,EAAA,EAA2B,SAAS,KAAO,EAAA,OAAA,EAAQ,YAAW,CACjE,EAAA;AAAA;AAAA,GACF;AAEJ;;;;"}
|
|
@@ -28,7 +28,7 @@ const MaturitySummaryPage = () => {
|
|
|
28
28
|
} else if (!value) {
|
|
29
29
|
return /* @__PURE__ */ jsx(EmptyState, { missing: "info", title: "No information to display" });
|
|
30
30
|
}
|
|
31
|
-
return /* @__PURE__ */ jsxs(Grid, { container: true, children: [
|
|
31
|
+
return /* @__PURE__ */ jsxs(Grid, { container: true, spacing: 1, children: [
|
|
32
32
|
/* @__PURE__ */ jsx(Grid, { item: true, md: 3, children: /* @__PURE__ */ jsx(MaturityRankInfoCard, { summary: value }) }),
|
|
33
33
|
/* @__PURE__ */ jsx(Grid, { item: true, md: 9, children: entities && /* @__PURE__ */ jsx(MaturitySummaryTable, { entities }) })
|
|
34
34
|
] });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MaturitySummaryPage.esm.js","sources":["../../../src/components/MaturitySummaryPage/MaturitySummaryPage.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 useAsyncRetry from 'react-use/lib/useAsync';\n\nimport { useApi } from '@backstage/core-plugin-api';\nimport { useEntity, useRelatedEntities } from '@backstage/plugin-catalog-react';\nimport { EmptyState, Progress } from '@backstage/core-components';\nimport Alert from '@mui/material/Alert';\nimport Grid from '@mui/material/Grid';\nimport { MaturityRankInfoCard } from '../MaturityRankInfoCard';\nimport { MaturitySummaryTable } from '../MaturitySummaryTable';\nimport { getSubEntityFilter } from '../../helpers/utils';\nimport { maturityApiRef } from '../../api';\n\nexport const MaturitySummaryPage = () => {\n const { entity } = useEntity();\n const { entities } = useRelatedEntities(entity, getSubEntityFilter(entity));\n\n const api = useApi(maturityApiRef);\n const { value, loading, error } = useAsyncRetry(\n async () => api.getMaturitySummary(entity),\n [api, entity],\n );\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} />\n </Grid>\n <Grid item md={9}>\n {entities && <MaturitySummaryTable entities={entities} />}\n </Grid>\n </Grid>\n );\n};\n"],"names":[],"mappings":";;;;;;;;;;;;;;;AA2BO,MAAM,sBAAsB,MAAM;AACvC,EAAM,MAAA,EAAE,MAAO,EAAA,GAAI,SAAU,EAAA;AAC7B,EAAA,MAAM,EAAE,QAAS,EAAA,GAAI,mBAAmB,MAAQ,EAAA,kBAAA,CAAmB,MAAM,CAAC,CAAA;AAE1E,EAAM,MAAA,GAAA,GAAM,OAAO,cAAc,CAAA;AACjC,EAAA,MAAM,EAAE,KAAA,EAAO,OAAS,EAAA,KAAA,EAAU,GAAA,aAAA;AAAA,IAChC,YAAY,GAAI,CAAA,kBAAA,CAAmB,MAAM,CAAA;AAAA,IACzC,CAAC,KAAK,MAAM;AAAA,GACd;AAEA,EAAA,IAAI,OAAS,EAAA;AACX,IAAA,2BAAQ,QAAS,EAAA,EAAA,CAAA;AAAA,aACR,KAAO,EAAA;AAChB,IAAA,uBAAQ,GAAA,CAAA,KAAA,EAAA,EAAM,QAAS,EAAA,OAAA,EAAS,gBAAM,OAAQ,EAAA,CAAA;AAAA,GAChD,MAAA,IAAW,CAAC,KAAO,EAAA;AACjB,IAAA,uBAAQ,GAAA,CAAA,UAAA,EAAA,EAAW,OAAQ,EAAA,MAAA,EAAO,OAAM,2BAA4B,EAAA,CAAA;AAAA;AAGtE,
|
|
1
|
+
{"version":3,"file":"MaturitySummaryPage.esm.js","sources":["../../../src/components/MaturitySummaryPage/MaturitySummaryPage.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 useAsyncRetry from 'react-use/lib/useAsync';\n\nimport { useApi } from '@backstage/core-plugin-api';\nimport { useEntity, useRelatedEntities } from '@backstage/plugin-catalog-react';\nimport { EmptyState, Progress } from '@backstage/core-components';\nimport Alert from '@mui/material/Alert';\nimport Grid from '@mui/material/Grid';\nimport { MaturityRankInfoCard } from '../MaturityRankInfoCard';\nimport { MaturitySummaryTable } from '../MaturitySummaryTable';\nimport { getSubEntityFilter } from '../../helpers/utils';\nimport { maturityApiRef } from '../../api';\n\nexport const MaturitySummaryPage = () => {\n const { entity } = useEntity();\n const { entities } = useRelatedEntities(entity, getSubEntityFilter(entity));\n\n const api = useApi(maturityApiRef);\n const { value, loading, error } = useAsyncRetry(\n async () => api.getMaturitySummary(entity),\n [api, entity],\n );\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 spacing={1}>\n <Grid item md={3}>\n <MaturityRankInfoCard summary={value} />\n </Grid>\n <Grid item md={9}>\n {entities && <MaturitySummaryTable entities={entities} />}\n </Grid>\n </Grid>\n );\n};\n"],"names":[],"mappings":";;;;;;;;;;;;;;;AA2BO,MAAM,sBAAsB,MAAM;AACvC,EAAM,MAAA,EAAE,MAAO,EAAA,GAAI,SAAU,EAAA;AAC7B,EAAA,MAAM,EAAE,QAAS,EAAA,GAAI,mBAAmB,MAAQ,EAAA,kBAAA,CAAmB,MAAM,CAAC,CAAA;AAE1E,EAAM,MAAA,GAAA,GAAM,OAAO,cAAc,CAAA;AACjC,EAAA,MAAM,EAAE,KAAA,EAAO,OAAS,EAAA,KAAA,EAAU,GAAA,aAAA;AAAA,IAChC,YAAY,GAAI,CAAA,kBAAA,CAAmB,MAAM,CAAA;AAAA,IACzC,CAAC,KAAK,MAAM;AAAA,GACd;AAEA,EAAA,IAAI,OAAS,EAAA;AACX,IAAA,2BAAQ,QAAS,EAAA,EAAA,CAAA;AAAA,aACR,KAAO,EAAA;AAChB,IAAA,uBAAQ,GAAA,CAAA,KAAA,EAAA,EAAM,QAAS,EAAA,OAAA,EAAS,gBAAM,OAAQ,EAAA,CAAA;AAAA,GAChD,MAAA,IAAW,CAAC,KAAO,EAAA;AACjB,IAAA,uBAAQ,GAAA,CAAA,UAAA,EAAA,EAAW,OAAQ,EAAA,MAAA,EAAO,OAAM,2BAA4B,EAAA,CAAA;AAAA;AAGtE,EAAA,uBACG,IAAA,CAAA,IAAA,EAAA,EAAK,SAAS,EAAA,IAAA,EAAC,SAAS,CACvB,EAAA,QAAA,EAAA;AAAA,oBAAC,GAAA,CAAA,IAAA,EAAA,EAAK,MAAI,IAAC,EAAA,EAAA,EAAI,GACb,QAAC,kBAAA,GAAA,CAAA,oBAAA,EAAA,EAAqB,OAAS,EAAA,KAAA,EAAO,CACxC,EAAA,CAAA;AAAA,oBACA,GAAA,CAAC,IAAK,EAAA,EAAA,IAAA,EAAI,IAAC,EAAA,EAAA,EAAI,GACZ,QAAY,EAAA,QAAA,oBAAA,GAAA,CAAC,oBAAqB,EAAA,EAAA,QAAA,EAAoB,CACzD,EAAA;AAAA,GACF,EAAA,CAAA;AAEJ;;;;"}
|
|
@@ -14,7 +14,8 @@ import '@backstage/plugin-catalog-react';
|
|
|
14
14
|
import '@backstage-community/plugin-tech-insights-react';
|
|
15
15
|
import { getNextRankColor, pluralize } from '../../helpers/utils.esm.js';
|
|
16
16
|
import { MaturityLink } from '../../helpers/MaturityLink.esm.js';
|
|
17
|
-
import {
|
|
17
|
+
import { MaturityRankIcon } from '../MaturityRankIcon/MaturityRankIcon.esm.js';
|
|
18
|
+
import { MaturityRankChip } from '../MaturityRankChip/MaturityRankChip.esm.js';
|
|
18
19
|
|
|
19
20
|
const OverallCell = ({
|
|
20
21
|
areaSummary
|
|
@@ -80,7 +81,7 @@ const ProgressCell = ({
|
|
|
80
81
|
}) => {
|
|
81
82
|
if (!areaSummary) return /* @__PURE__ */ jsx(Fragment, {});
|
|
82
83
|
return /* @__PURE__ */ jsx(
|
|
83
|
-
|
|
84
|
+
MaturityRankIcon,
|
|
84
85
|
{
|
|
85
86
|
value: areaSummary,
|
|
86
87
|
size: 25,
|
|
@@ -151,7 +152,7 @@ function MaturitySummaryTable({
|
|
|
151
152
|
field: "summary.rank",
|
|
152
153
|
width: "10%",
|
|
153
154
|
...style,
|
|
154
|
-
render: (row) => /* @__PURE__ */ jsx(
|
|
155
|
+
render: (row) => /* @__PURE__ */ jsx(MaturityRankChip, { value: row.summary, size: 25 })
|
|
155
156
|
},
|
|
156
157
|
{
|
|
157
158
|
title: "Next Rank",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MaturitySummaryTable.esm.js","sources":["../../../src/components/MaturitySummaryTable/MaturitySummaryTable.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 { Table, TableColumn } from '@backstage/core-components';\nimport { useApi } from '@backstage/core-plugin-api';\nimport {\n EntityMaturitySummary,\n MaturitySummaryByArea,\n Rank,\n} from '@backstage-community/plugin-tech-insights-maturity-common';\nimport Stack from '@mui/material/Stack';\nimport { useTheme } from '@mui/material/styles';\n\nimport Tooltip from '@mui/material/Tooltip';\nimport Typography from '@mui/material/Typography';\nimport { Circle, Line } from 'rc-progress';\n\nimport useAsyncRetry from 'react-use/lib/useAsync';\nimport { maturityApiRef } from '../../api';\nimport { getNextRankColor, pluralize } from '../../helpers/utils';\nimport { MaturityLink } from '../../helpers/MaturityLink';\nimport { MaturityRankAvatar } from '../MaturityRankAvatar';\n\nconst OverallCell = ({\n areaSummary,\n}: {\n areaSummary: MaturitySummaryByArea;\n}) => {\n const { area, rank, maxRank, progress } = areaSummary;\n\n return (\n <Stack\n direction=\"row\"\n spacing={1}\n alignItems=\"center\"\n style={{ padding: '0.6rem 0' }}\n >\n <Circle\n key={area}\n strokeColor={getNextRankColor(rank, maxRank)}\n trailColor=\"rgba(0, 0, 0, 0.1)\"\n strokeWidth={10}\n trailWidth={10}\n percent={progress.percentage}\n style={{ width: '25pt' }}\n />\n <Typography variant=\"button\">{`${progress.percentage}%`}</Typography>\n </Stack>\n );\n};\n\nconst NextRankCell = ({\n areaSummary,\n}: {\n areaSummary: MaturitySummaryByArea;\n}) => {\n const { rank, maxRank, isMaxRank, rankProgress } = areaSummary;\n\n const nextRankName = isMaxRank ? Rank[maxRank] : Rank[rank + 1];\n const incompleteTasks = rankProgress.totalChecks - rankProgress.passedChecks;\n const taskCaption = `${incompleteTasks} ${nextRankName} task${pluralize(\n incompleteTasks,\n )} left`;\n const taskTooltip = `${rankProgress.percentage}% to ${nextRankName} (${\n rankProgress.passedChecks\n }/${rankProgress.totalChecks} task${pluralize(\n rankProgress.totalChecks,\n )} completed)`;\n\n const progressCaption = isMaxRank ? 'Max rank!' : taskCaption;\n const progressTooltip = isMaxRank ? 'Max rank!' : taskTooltip;\n\n return (\n <Tooltip title={progressTooltip} arrow>\n <Stack>\n <Typography variant=\"caption\" color=\"textSecondary\">\n {progressCaption}\n </Typography>\n <Line\n strokeColor={getNextRankColor(rank, maxRank)}\n trailColor=\"rgba(0, 0, 0, 0.1)\"\n strokeWidth={2}\n trailWidth={2}\n percent={rankProgress.percentage}\n style={{ padding: '0.4rem 0' }}\n data-testid=\"progressbar\"\n />\n </Stack>\n </Tooltip>\n );\n};\n\nconst ProgressCell = ({\n areaSummary,\n}: {\n areaSummary?: MaturitySummaryByArea;\n}) => {\n if (!areaSummary) return <></>;\n\n return (\n <MaturityRankAvatar\n value={areaSummary}\n size={25}\n progress={areaSummary.rankProgress}\n />\n );\n};\n\nexport function MaturitySummaryTable({\n entities,\n}: Readonly<{ entities: Entity[] }>) {\n const theme = useTheme();\n\n const api = useApi(maturityApiRef);\n const { value } = useAsyncRetry(\n async () => api.getBulkMaturitySummary(entities),\n [api, entities],\n );\n\n const style = {\n sorting: false,\n cellStyle: {\n fontSize: '1.2rem',\n paddingTop: '0.4rem',\n paddingBottom: '0.4rem',\n verticalAlign: 'center',\n },\n };\n\n const columns: TableColumn<EntityMaturitySummary>[] = [\n {\n title: 'Rank',\n field: 'summary.rank',\n hiddenByColumnsButton: true,\n defaultSort: 'asc',\n customSort: (a, b) => {\n const isNotSameRank = a.summary.rank !== b.summary.rank;\n const progA = a.summary.isMaxRank ? 100 : a.summary.progress.percentage;\n const progB = b.summary.isMaxRank ? 100 : b.summary.progress.percentage;\n\n // Sort by rank, or by overall progress within same rank.\n return isNotSameRank ? a.summary.rank - b.summary.rank : progA - progB;\n },\n hidden: true,\n },\n {\n title: 'Name',\n field: 'displayName',\n hiddenByColumnsButton: true,\n width: '22%',\n ...style,\n render: row => (\n <b>\n <MaturityLink entity={row.entity} />\n </b>\n ),\n },\n {\n title: 'Overall',\n tooltip: 'Progress toward achieving full maturity',\n field: 'summary.progress.percentage',\n width: '13%',\n ...style,\n hidden: true,\n render: row => (\n <OverallCell\n areaSummary={{\n area: '',\n ...row.summary,\n }}\n />\n ),\n },\n {\n title: 'Rank',\n tooltip: 'Current overall rank',\n field: 'summary.rank',\n width: '10%',\n ...style,\n render: row => (\n <MaturityRankAvatar value={row.summary} size={25} variant=\"chip\" />\n ),\n },\n {\n title: 'Next Rank',\n tooltip: 'Progress toward achieving next rank',\n field: 'summary.rankProgress.percentage',\n width: '15%',\n ...style,\n render: row => (\n <NextRankCell\n areaSummary={{\n area: '',\n ...row.summary,\n }}\n />\n ),\n },\n ];\n\n // Dynamically add each category column\n const categories = value\n ?.flatMap(x => x.summary.areaSummaries)\n .map(x => x.area)\n .filter((x, i, a) => a.indexOf(x) === i);\n categories?.forEach(category => {\n const column = {\n title: category,\n field: `summary.areaSummaries.${category}`,\n width: '10%',\n ...style,\n render: (row: EntityMaturitySummary) => (\n <ProgressCell\n areaSummary={row.summary.areaSummaries.find(x => x.area === category)}\n />\n ),\n };\n\n columns.push(column);\n });\n\n if (!value) return <></>;\n\n return (\n <Table\n title=\"Component Maturity\"\n subtitle=\"View this entity's children in order of lowest to highest Maturity.\"\n columns={columns}\n data={value ?? []}\n options={{\n pageSize: 10,\n columnsButton: true,\n rowStyle: {\n backgroundColor: theme.palette.background.paper,\n borderTop: `1px solid ${theme.palette.background.default}`,\n borderBottom: `1px solid ${theme.palette.background.default}`,\n },\n }}\n />\n );\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;AAoCA,MAAM,cAAc,CAAC;AAAA,EACnB;AACF,CAEM,KAAA;AACJ,EAAA,MAAM,EAAE,IAAA,EAAM,IAAM,EAAA,OAAA,EAAS,UAAa,GAAA,WAAA;AAE1C,EACE,uBAAA,IAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAU,EAAA,KAAA;AAAA,MACV,OAAS,EAAA,CAAA;AAAA,MACT,UAAW,EAAA,QAAA;AAAA,MACX,KAAA,EAAO,EAAE,OAAA,EAAS,UAAW,EAAA;AAAA,MAE7B,QAAA,EAAA;AAAA,wBAAA,GAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YAEC,WAAA,EAAa,gBAAiB,CAAA,IAAA,EAAM,OAAO,CAAA;AAAA,YAC3C,UAAW,EAAA,oBAAA;AAAA,YACX,WAAa,EAAA,EAAA;AAAA,YACb,UAAY,EAAA,EAAA;AAAA,YACZ,SAAS,QAAS,CAAA,UAAA;AAAA,YAClB,KAAA,EAAO,EAAE,KAAA,EAAO,MAAO;AAAA,WAAA;AAAA,UANlB;AAAA,SAOP;AAAA,4BACC,UAAW,EAAA,EAAA,OAAA,EAAQ,UAAU,QAAG,EAAA,CAAA,EAAA,QAAA,CAAS,UAAU,CAAI,CAAA,CAAA,EAAA;AAAA;AAAA;AAAA,GAC1D;AAEJ,CAAA;AAEA,MAAM,eAAe,CAAC;AAAA,EACpB;AACF,CAEM,KAAA;AACJ,EAAA,MAAM,EAAE,IAAA,EAAM,OAAS,EAAA,SAAA,EAAW,cAAiB,GAAA,WAAA;AAEnD,EAAA,MAAM,eAAe,SAAY,GAAA,IAAA,CAAK,OAAO,CAAI,GAAA,IAAA,CAAK,OAAO,CAAC,CAAA;AAC9D,EAAM,MAAA,eAAA,GAAkB,YAAa,CAAA,WAAA,GAAc,YAAa,CAAA,YAAA;AAChE,EAAA,MAAM,WAAc,GAAA,CAAA,EAAG,eAAe,CAAA,CAAA,EAAI,YAAY,CAAQ,KAAA,EAAA,SAAA;AAAA,IAC5D;AAAA,GACD,CAAA,KAAA,CAAA;AACD,EAAA,MAAM,WAAc,GAAA,CAAA,EAAG,YAAa,CAAA,UAAU,CAAQ,KAAA,EAAA,YAAY,CAChE,EAAA,EAAA,YAAA,CAAa,YACf,CAAA,CAAA,EAAI,YAAa,CAAA,WAAW,CAAQ,KAAA,EAAA,SAAA;AAAA,IAClC,YAAa,CAAA;AAAA,GACd,CAAA,WAAA,CAAA;AAED,EAAM,MAAA,eAAA,GAAkB,YAAY,WAAc,GAAA,WAAA;AAClD,EAAM,MAAA,eAAA,GAAkB,YAAY,WAAc,GAAA,WAAA;AAElD,EAAA,2BACG,OAAQ,EAAA,EAAA,KAAA,EAAO,iBAAiB,KAAK,EAAA,IAAA,EACpC,+BAAC,KACC,EAAA,EAAA,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,UAAW,EAAA,EAAA,OAAA,EAAQ,SAAU,EAAA,KAAA,EAAM,iBACjC,QACH,EAAA,eAAA,EAAA,CAAA;AAAA,oBACA,GAAA;AAAA,MAAC,IAAA;AAAA,MAAA;AAAA,QACC,WAAA,EAAa,gBAAiB,CAAA,IAAA,EAAM,OAAO,CAAA;AAAA,QAC3C,UAAW,EAAA,oBAAA;AAAA,QACX,WAAa,EAAA,CAAA;AAAA,QACb,UAAY,EAAA,CAAA;AAAA,QACZ,SAAS,YAAa,CAAA,UAAA;AAAA,QACtB,KAAA,EAAO,EAAE,OAAA,EAAS,UAAW,EAAA;AAAA,QAC7B,aAAY,EAAA;AAAA;AAAA;AACd,GAAA,EACF,CACF,EAAA,CAAA;AAEJ,CAAA;AAEA,MAAM,eAAe,CAAC;AAAA,EACpB;AACF,CAEM,KAAA;AACJ,EAAI,IAAA,CAAC,WAAa,EAAA,uBAAS,GAAA,CAAA,QAAA,EAAA,EAAA,CAAA;AAE3B,EACE,uBAAA,GAAA;AAAA,IAAC,kBAAA;AAAA,IAAA;AAAA,MACC,KAAO,EAAA,WAAA;AAAA,MACP,IAAM,EAAA,EAAA;AAAA,MACN,UAAU,WAAY,CAAA;AAAA;AAAA,GACxB;AAEJ,CAAA;AAEO,SAAS,oBAAqB,CAAA;AAAA,EACnC;AACF,CAAqC,EAAA;AACnC,EAAA,MAAM,QAAQ,QAAS,EAAA;AAEvB,EAAM,MAAA,GAAA,GAAM,OAAO,cAAc,CAAA;AACjC,EAAM,MAAA,EAAE,OAAU,GAAA,aAAA;AAAA,IAChB,YAAY,GAAI,CAAA,sBAAA,CAAuB,QAAQ,CAAA;AAAA,IAC/C,CAAC,KAAK,QAAQ;AAAA,GAChB;AAEA,EAAA,MAAM,KAAQ,GAAA;AAAA,IACZ,OAAS,EAAA,KAAA;AAAA,IACT,SAAW,EAAA;AAAA,MACT,QAAU,EAAA,QAAA;AAAA,MACV,UAAY,EAAA,QAAA;AAAA,MACZ,aAAe,EAAA,QAAA;AAAA,MACf,aAAe,EAAA;AAAA;AACjB,GACF;AAEA,EAAA,MAAM,OAAgD,GAAA;AAAA,IACpD;AAAA,MACE,KAAO,EAAA,MAAA;AAAA,MACP,KAAO,EAAA,cAAA;AAAA,MACP,qBAAuB,EAAA,IAAA;AAAA,MACvB,WAAa,EAAA,KAAA;AAAA,MACb,UAAA,EAAY,CAAC,CAAA,EAAG,CAAM,KAAA;AACpB,QAAA,MAAM,aAAgB,GAAA,CAAA,CAAE,OAAQ,CAAA,IAAA,KAAS,EAAE,OAAQ,CAAA,IAAA;AACnD,QAAA,MAAM,QAAQ,CAAE,CAAA,OAAA,CAAQ,YAAY,GAAM,GAAA,CAAA,CAAE,QAAQ,QAAS,CAAA,UAAA;AAC7D,QAAA,MAAM,QAAQ,CAAE,CAAA,OAAA,CAAQ,YAAY,GAAM,GAAA,CAAA,CAAE,QAAQ,QAAS,CAAA,UAAA;AAG7D,QAAA,OAAO,gBAAgB,CAAE,CAAA,OAAA,CAAQ,OAAO,CAAE,CAAA,OAAA,CAAQ,OAAO,KAAQ,GAAA,KAAA;AAAA,OACnE;AAAA,MACA,MAAQ,EAAA;AAAA,KACV;AAAA,IACA;AAAA,MACE,KAAO,EAAA,MAAA;AAAA,MACP,KAAO,EAAA,aAAA;AAAA,MACP,qBAAuB,EAAA,IAAA;AAAA,MACvB,KAAO,EAAA,KAAA;AAAA,MACP,GAAG,KAAA;AAAA,MACH,MAAA,EAAQ,yBACL,GAAA,CAAA,GAAA,EAAA,EACC,8BAAC,YAAa,EAAA,EAAA,MAAA,EAAQ,GAAI,CAAA,MAAA,EAAQ,CACpC,EAAA;AAAA,KAEJ;AAAA,IACA;AAAA,MACE,KAAO,EAAA,SAAA;AAAA,MACP,OAAS,EAAA,yCAAA;AAAA,MACT,KAAO,EAAA,6BAAA;AAAA,MACP,KAAO,EAAA,KAAA;AAAA,MACP,GAAG,KAAA;AAAA,MACH,MAAQ,EAAA,IAAA;AAAA,MACR,QAAQ,CACN,GAAA,qBAAA,GAAA;AAAA,QAAC,WAAA;AAAA,QAAA;AAAA,UACC,WAAa,EAAA;AAAA,YACX,IAAM,EAAA,EAAA;AAAA,YACN,GAAG,GAAI,CAAA;AAAA;AACT;AAAA;AACF,KAEJ;AAAA,IACA;AAAA,MACE,KAAO,EAAA,MAAA;AAAA,MACP,OAAS,EAAA,sBAAA;AAAA,MACT,KAAO,EAAA,cAAA;AAAA,MACP,KAAO,EAAA,KAAA;AAAA,MACP,GAAG,KAAA;AAAA,MACH,MAAA,EAAQ,CACN,GAAA,qBAAA,GAAA,CAAC,kBAAmB,EAAA,EAAA,KAAA,EAAO,IAAI,OAAS,EAAA,IAAA,EAAM,EAAI,EAAA,OAAA,EAAQ,MAAO,EAAA;AAAA,KAErE;AAAA,IACA;AAAA,MACE,KAAO,EAAA,WAAA;AAAA,MACP,OAAS,EAAA,qCAAA;AAAA,MACT,KAAO,EAAA,iCAAA;AAAA,MACP,KAAO,EAAA,KAAA;AAAA,MACP,GAAG,KAAA;AAAA,MACH,QAAQ,CACN,GAAA,qBAAA,GAAA;AAAA,QAAC,YAAA;AAAA,QAAA;AAAA,UACC,WAAa,EAAA;AAAA,YACX,IAAM,EAAA,EAAA;AAAA,YACN,GAAG,GAAI,CAAA;AAAA;AACT;AAAA;AACF;AAEJ,GACF;AAGA,EAAM,MAAA,UAAA,GAAa,OACf,OAAQ,CAAA,CAAA,CAAA,KAAK,EAAE,OAAQ,CAAA,aAAa,CACrC,CAAA,GAAA,CAAI,CAAK,CAAA,KAAA,CAAA,CAAE,IAAI,CACf,CAAA,MAAA,CAAO,CAAC,CAAG,EAAA,CAAA,EAAG,MAAM,CAAE,CAAA,OAAA,CAAQ,CAAC,CAAA,KAAM,CAAC,CAAA;AACzC,EAAA,UAAA,EAAY,QAAQ,CAAY,QAAA,KAAA;AAC9B,IAAA,MAAM,MAAS,GAAA;AAAA,MACb,KAAO,EAAA,QAAA;AAAA,MACP,KAAA,EAAO,yBAAyB,QAAQ,CAAA,CAAA;AAAA,MACxC,KAAO,EAAA,KAAA;AAAA,MACP,GAAG,KAAA;AAAA,MACH,MAAA,EAAQ,CAAC,GACP,qBAAA,GAAA;AAAA,QAAC,YAAA;AAAA,QAAA;AAAA,UACC,WAAA,EAAa,IAAI,OAAQ,CAAA,aAAA,CAAc,KAAK,CAAK,CAAA,KAAA,CAAA,CAAE,SAAS,QAAQ;AAAA;AAAA;AACtE,KAEJ;AAEA,IAAA,OAAA,CAAQ,KAAK,MAAM,CAAA;AAAA,GACpB,CAAA;AAED,EAAI,IAAA,CAAC,KAAO,EAAA,uBAAS,GAAA,CAAA,QAAA,EAAA,EAAA,CAAA;AAErB,EACE,uBAAA,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,KAAM,EAAA,oBAAA;AAAA,MACN,QAAS,EAAA,qEAAA;AAAA,MACT,OAAA;AAAA,MACA,IAAA,EAAM,SAAS,EAAC;AAAA,MAChB,OAAS,EAAA;AAAA,QACP,QAAU,EAAA,EAAA;AAAA,QACV,aAAe,EAAA,IAAA;AAAA,QACf,QAAU,EAAA;AAAA,UACR,eAAA,EAAiB,KAAM,CAAA,OAAA,CAAQ,UAAW,CAAA,KAAA;AAAA,UAC1C,SAAW,EAAA,CAAA,UAAA,EAAa,KAAM,CAAA,OAAA,CAAQ,WAAW,OAAO,CAAA,CAAA;AAAA,UACxD,YAAc,EAAA,CAAA,UAAA,EAAa,KAAM,CAAA,OAAA,CAAQ,WAAW,OAAO,CAAA;AAAA;AAC7D;AACF;AAAA,GACF;AAEJ;;;;"}
|
|
1
|
+
{"version":3,"file":"MaturitySummaryTable.esm.js","sources":["../../../src/components/MaturitySummaryTable/MaturitySummaryTable.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 { Table, TableColumn } from '@backstage/core-components';\nimport { useApi } from '@backstage/core-plugin-api';\nimport {\n EntityMaturitySummary,\n MaturitySummaryByArea,\n Rank,\n} from '@backstage-community/plugin-tech-insights-maturity-common';\nimport Stack from '@mui/material/Stack';\nimport { useTheme } from '@mui/material/styles';\n\nimport Tooltip from '@mui/material/Tooltip';\nimport Typography from '@mui/material/Typography';\nimport { Circle, Line } from 'rc-progress';\n\nimport useAsyncRetry from 'react-use/lib/useAsync';\nimport { maturityApiRef } from '../../api';\nimport { getNextRankColor, pluralize } from '../../helpers/utils';\nimport { MaturityLink } from '../../helpers/MaturityLink';\nimport { MaturityRankIcon } from '../MaturityRankIcon';\nimport { MaturityRankChip } from '../MaturityRankChip';\n\nconst OverallCell = ({\n areaSummary,\n}: {\n areaSummary: MaturitySummaryByArea;\n}) => {\n const { area, rank, maxRank, progress } = areaSummary;\n\n return (\n <Stack\n direction=\"row\"\n spacing={1}\n alignItems=\"center\"\n style={{ padding: '0.6rem 0' }}\n >\n <Circle\n key={area}\n strokeColor={getNextRankColor(rank, maxRank)}\n trailColor=\"rgba(0, 0, 0, 0.1)\"\n strokeWidth={10}\n trailWidth={10}\n percent={progress.percentage}\n style={{ width: '25pt' }}\n />\n <Typography variant=\"button\">{`${progress.percentage}%`}</Typography>\n </Stack>\n );\n};\n\nconst NextRankCell = ({\n areaSummary,\n}: {\n areaSummary: MaturitySummaryByArea;\n}) => {\n const { rank, maxRank, isMaxRank, rankProgress } = areaSummary;\n\n const nextRankName = isMaxRank ? Rank[maxRank] : Rank[rank + 1];\n const incompleteTasks = rankProgress.totalChecks - rankProgress.passedChecks;\n const taskCaption = `${incompleteTasks} ${nextRankName} task${pluralize(\n incompleteTasks,\n )} left`;\n const taskTooltip = `${rankProgress.percentage}% to ${nextRankName} (${\n rankProgress.passedChecks\n }/${rankProgress.totalChecks} task${pluralize(\n rankProgress.totalChecks,\n )} completed)`;\n\n const progressCaption = isMaxRank ? 'Max rank!' : taskCaption;\n const progressTooltip = isMaxRank ? 'Max rank!' : taskTooltip;\n\n return (\n <Tooltip title={progressTooltip} arrow>\n <Stack>\n <Typography variant=\"caption\" color=\"textSecondary\">\n {progressCaption}\n </Typography>\n <Line\n strokeColor={getNextRankColor(rank, maxRank)}\n trailColor=\"rgba(0, 0, 0, 0.1)\"\n strokeWidth={2}\n trailWidth={2}\n percent={rankProgress.percentage}\n style={{ padding: '0.4rem 0' }}\n data-testid=\"progressbar\"\n />\n </Stack>\n </Tooltip>\n );\n};\n\nconst ProgressCell = ({\n areaSummary,\n}: {\n areaSummary?: MaturitySummaryByArea;\n}) => {\n if (!areaSummary) return <></>;\n\n return (\n <MaturityRankIcon\n value={areaSummary}\n size={25}\n progress={areaSummary.rankProgress}\n />\n );\n};\n\nexport function MaturitySummaryTable({\n entities,\n}: Readonly<{ entities: Entity[] }>) {\n const theme = useTheme();\n\n const api = useApi(maturityApiRef);\n const { value } = useAsyncRetry(\n async () => api.getBulkMaturitySummary(entities),\n [api, entities],\n );\n\n const style = {\n sorting: false,\n cellStyle: {\n fontSize: '1.2rem',\n paddingTop: '0.4rem',\n paddingBottom: '0.4rem',\n verticalAlign: 'center',\n },\n };\n\n const columns: TableColumn<EntityMaturitySummary>[] = [\n {\n title: 'Rank',\n field: 'summary.rank',\n hiddenByColumnsButton: true,\n defaultSort: 'asc',\n customSort: (a, b) => {\n const isNotSameRank = a.summary.rank !== b.summary.rank;\n const progA = a.summary.isMaxRank ? 100 : a.summary.progress.percentage;\n const progB = b.summary.isMaxRank ? 100 : b.summary.progress.percentage;\n\n // Sort by rank, or by overall progress within same rank.\n return isNotSameRank ? a.summary.rank - b.summary.rank : progA - progB;\n },\n hidden: true,\n },\n {\n title: 'Name',\n field: 'displayName',\n hiddenByColumnsButton: true,\n width: '22%',\n ...style,\n render: row => (\n <b>\n <MaturityLink entity={row.entity} />\n </b>\n ),\n },\n {\n title: 'Overall',\n tooltip: 'Progress toward achieving full maturity',\n field: 'summary.progress.percentage',\n width: '13%',\n ...style,\n hidden: true,\n render: row => (\n <OverallCell\n areaSummary={{\n area: '',\n ...row.summary,\n }}\n />\n ),\n },\n {\n title: 'Rank',\n tooltip: 'Current overall rank',\n field: 'summary.rank',\n width: '10%',\n ...style,\n render: row => <MaturityRankChip value={row.summary} size={25} />,\n },\n {\n title: 'Next Rank',\n tooltip: 'Progress toward achieving next rank',\n field: 'summary.rankProgress.percentage',\n width: '15%',\n ...style,\n render: row => (\n <NextRankCell\n areaSummary={{\n area: '',\n ...row.summary,\n }}\n />\n ),\n },\n ];\n\n // Dynamically add each category column\n const categories = value\n ?.flatMap(x => x.summary.areaSummaries)\n .map(x => x.area)\n .filter((x, i, a) => a.indexOf(x) === i);\n categories?.forEach(category => {\n const column = {\n title: category,\n field: `summary.areaSummaries.${category}`,\n width: '10%',\n ...style,\n render: (row: EntityMaturitySummary) => (\n <ProgressCell\n areaSummary={row.summary.areaSummaries.find(x => x.area === category)}\n />\n ),\n };\n\n columns.push(column);\n });\n\n if (!value) return <></>;\n\n return (\n <Table\n title=\"Component Maturity\"\n subtitle=\"View this entity's children in order of lowest to highest Maturity.\"\n columns={columns}\n data={value ?? []}\n options={{\n pageSize: 10,\n columnsButton: true,\n rowStyle: {\n backgroundColor: theme.palette.background.paper,\n borderTop: `1px solid ${theme.palette.background.default}`,\n borderBottom: `1px solid ${theme.palette.background.default}`,\n },\n }}\n />\n );\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;AAqCA,MAAM,cAAc,CAAC;AAAA,EACnB;AACF,CAEM,KAAA;AACJ,EAAA,MAAM,EAAE,IAAA,EAAM,IAAM,EAAA,OAAA,EAAS,UAAa,GAAA,WAAA;AAE1C,EACE,uBAAA,IAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,SAAU,EAAA,KAAA;AAAA,MACV,OAAS,EAAA,CAAA;AAAA,MACT,UAAW,EAAA,QAAA;AAAA,MACX,KAAA,EAAO,EAAE,OAAA,EAAS,UAAW,EAAA;AAAA,MAE7B,QAAA,EAAA;AAAA,wBAAA,GAAA;AAAA,UAAC,MAAA;AAAA,UAAA;AAAA,YAEC,WAAA,EAAa,gBAAiB,CAAA,IAAA,EAAM,OAAO,CAAA;AAAA,YAC3C,UAAW,EAAA,oBAAA;AAAA,YACX,WAAa,EAAA,EAAA;AAAA,YACb,UAAY,EAAA,EAAA;AAAA,YACZ,SAAS,QAAS,CAAA,UAAA;AAAA,YAClB,KAAA,EAAO,EAAE,KAAA,EAAO,MAAO;AAAA,WAAA;AAAA,UANlB;AAAA,SAOP;AAAA,4BACC,UAAW,EAAA,EAAA,OAAA,EAAQ,UAAU,QAAG,EAAA,CAAA,EAAA,QAAA,CAAS,UAAU,CAAI,CAAA,CAAA,EAAA;AAAA;AAAA;AAAA,GAC1D;AAEJ,CAAA;AAEA,MAAM,eAAe,CAAC;AAAA,EACpB;AACF,CAEM,KAAA;AACJ,EAAA,MAAM,EAAE,IAAA,EAAM,OAAS,EAAA,SAAA,EAAW,cAAiB,GAAA,WAAA;AAEnD,EAAA,MAAM,eAAe,SAAY,GAAA,IAAA,CAAK,OAAO,CAAI,GAAA,IAAA,CAAK,OAAO,CAAC,CAAA;AAC9D,EAAM,MAAA,eAAA,GAAkB,YAAa,CAAA,WAAA,GAAc,YAAa,CAAA,YAAA;AAChE,EAAA,MAAM,WAAc,GAAA,CAAA,EAAG,eAAe,CAAA,CAAA,EAAI,YAAY,CAAQ,KAAA,EAAA,SAAA;AAAA,IAC5D;AAAA,GACD,CAAA,KAAA,CAAA;AACD,EAAA,MAAM,WAAc,GAAA,CAAA,EAAG,YAAa,CAAA,UAAU,CAAQ,KAAA,EAAA,YAAY,CAChE,EAAA,EAAA,YAAA,CAAa,YACf,CAAA,CAAA,EAAI,YAAa,CAAA,WAAW,CAAQ,KAAA,EAAA,SAAA;AAAA,IAClC,YAAa,CAAA;AAAA,GACd,CAAA,WAAA,CAAA;AAED,EAAM,MAAA,eAAA,GAAkB,YAAY,WAAc,GAAA,WAAA;AAClD,EAAM,MAAA,eAAA,GAAkB,YAAY,WAAc,GAAA,WAAA;AAElD,EAAA,2BACG,OAAQ,EAAA,EAAA,KAAA,EAAO,iBAAiB,KAAK,EAAA,IAAA,EACpC,+BAAC,KACC,EAAA,EAAA,QAAA,EAAA;AAAA,oBAAA,GAAA,CAAC,UAAW,EAAA,EAAA,OAAA,EAAQ,SAAU,EAAA,KAAA,EAAM,iBACjC,QACH,EAAA,eAAA,EAAA,CAAA;AAAA,oBACA,GAAA;AAAA,MAAC,IAAA;AAAA,MAAA;AAAA,QACC,WAAA,EAAa,gBAAiB,CAAA,IAAA,EAAM,OAAO,CAAA;AAAA,QAC3C,UAAW,EAAA,oBAAA;AAAA,QACX,WAAa,EAAA,CAAA;AAAA,QACb,UAAY,EAAA,CAAA;AAAA,QACZ,SAAS,YAAa,CAAA,UAAA;AAAA,QACtB,KAAA,EAAO,EAAE,OAAA,EAAS,UAAW,EAAA;AAAA,QAC7B,aAAY,EAAA;AAAA;AAAA;AACd,GAAA,EACF,CACF,EAAA,CAAA;AAEJ,CAAA;AAEA,MAAM,eAAe,CAAC;AAAA,EACpB;AACF,CAEM,KAAA;AACJ,EAAI,IAAA,CAAC,WAAa,EAAA,uBAAS,GAAA,CAAA,QAAA,EAAA,EAAA,CAAA;AAE3B,EACE,uBAAA,GAAA;AAAA,IAAC,gBAAA;AAAA,IAAA;AAAA,MACC,KAAO,EAAA,WAAA;AAAA,MACP,IAAM,EAAA,EAAA;AAAA,MACN,UAAU,WAAY,CAAA;AAAA;AAAA,GACxB;AAEJ,CAAA;AAEO,SAAS,oBAAqB,CAAA;AAAA,EACnC;AACF,CAAqC,EAAA;AACnC,EAAA,MAAM,QAAQ,QAAS,EAAA;AAEvB,EAAM,MAAA,GAAA,GAAM,OAAO,cAAc,CAAA;AACjC,EAAM,MAAA,EAAE,OAAU,GAAA,aAAA;AAAA,IAChB,YAAY,GAAI,CAAA,sBAAA,CAAuB,QAAQ,CAAA;AAAA,IAC/C,CAAC,KAAK,QAAQ;AAAA,GAChB;AAEA,EAAA,MAAM,KAAQ,GAAA;AAAA,IACZ,OAAS,EAAA,KAAA;AAAA,IACT,SAAW,EAAA;AAAA,MACT,QAAU,EAAA,QAAA;AAAA,MACV,UAAY,EAAA,QAAA;AAAA,MACZ,aAAe,EAAA,QAAA;AAAA,MACf,aAAe,EAAA;AAAA;AACjB,GACF;AAEA,EAAA,MAAM,OAAgD,GAAA;AAAA,IACpD;AAAA,MACE,KAAO,EAAA,MAAA;AAAA,MACP,KAAO,EAAA,cAAA;AAAA,MACP,qBAAuB,EAAA,IAAA;AAAA,MACvB,WAAa,EAAA,KAAA;AAAA,MACb,UAAA,EAAY,CAAC,CAAA,EAAG,CAAM,KAAA;AACpB,QAAA,MAAM,aAAgB,GAAA,CAAA,CAAE,OAAQ,CAAA,IAAA,KAAS,EAAE,OAAQ,CAAA,IAAA;AACnD,QAAA,MAAM,QAAQ,CAAE,CAAA,OAAA,CAAQ,YAAY,GAAM,GAAA,CAAA,CAAE,QAAQ,QAAS,CAAA,UAAA;AAC7D,QAAA,MAAM,QAAQ,CAAE,CAAA,OAAA,CAAQ,YAAY,GAAM,GAAA,CAAA,CAAE,QAAQ,QAAS,CAAA,UAAA;AAG7D,QAAA,OAAO,gBAAgB,CAAE,CAAA,OAAA,CAAQ,OAAO,CAAE,CAAA,OAAA,CAAQ,OAAO,KAAQ,GAAA,KAAA;AAAA,OACnE;AAAA,MACA,MAAQ,EAAA;AAAA,KACV;AAAA,IACA;AAAA,MACE,KAAO,EAAA,MAAA;AAAA,MACP,KAAO,EAAA,aAAA;AAAA,MACP,qBAAuB,EAAA,IAAA;AAAA,MACvB,KAAO,EAAA,KAAA;AAAA,MACP,GAAG,KAAA;AAAA,MACH,MAAA,EAAQ,yBACL,GAAA,CAAA,GAAA,EAAA,EACC,8BAAC,YAAa,EAAA,EAAA,MAAA,EAAQ,GAAI,CAAA,MAAA,EAAQ,CACpC,EAAA;AAAA,KAEJ;AAAA,IACA;AAAA,MACE,KAAO,EAAA,SAAA;AAAA,MACP,OAAS,EAAA,yCAAA;AAAA,MACT,KAAO,EAAA,6BAAA;AAAA,MACP,KAAO,EAAA,KAAA;AAAA,MACP,GAAG,KAAA;AAAA,MACH,MAAQ,EAAA,IAAA;AAAA,MACR,QAAQ,CACN,GAAA,qBAAA,GAAA;AAAA,QAAC,WAAA;AAAA,QAAA;AAAA,UACC,WAAa,EAAA;AAAA,YACX,IAAM,EAAA,EAAA;AAAA,YACN,GAAG,GAAI,CAAA;AAAA;AACT;AAAA;AACF,KAEJ;AAAA,IACA;AAAA,MACE,KAAO,EAAA,MAAA;AAAA,MACP,OAAS,EAAA,sBAAA;AAAA,MACT,KAAO,EAAA,cAAA;AAAA,MACP,KAAO,EAAA,KAAA;AAAA,MACP,GAAG,KAAA;AAAA,MACH,MAAA,EAAQ,yBAAQ,GAAA,CAAA,gBAAA,EAAA,EAAiB,OAAO,GAAI,CAAA,OAAA,EAAS,MAAM,EAAI,EAAA;AAAA,KACjE;AAAA,IACA;AAAA,MACE,KAAO,EAAA,WAAA;AAAA,MACP,OAAS,EAAA,qCAAA;AAAA,MACT,KAAO,EAAA,iCAAA;AAAA,MACP,KAAO,EAAA,KAAA;AAAA,MACP,GAAG,KAAA;AAAA,MACH,QAAQ,CACN,GAAA,qBAAA,GAAA;AAAA,QAAC,YAAA;AAAA,QAAA;AAAA,UACC,WAAa,EAAA;AAAA,YACX,IAAM,EAAA,EAAA;AAAA,YACN,GAAG,GAAI,CAAA;AAAA;AACT;AAAA;AACF;AAEJ,GACF;AAGA,EAAM,MAAA,UAAA,GAAa,OACf,OAAQ,CAAA,CAAA,CAAA,KAAK,EAAE,OAAQ,CAAA,aAAa,CACrC,CAAA,GAAA,CAAI,CAAK,CAAA,KAAA,CAAA,CAAE,IAAI,CACf,CAAA,MAAA,CAAO,CAAC,CAAG,EAAA,CAAA,EAAG,MAAM,CAAE,CAAA,OAAA,CAAQ,CAAC,CAAA,KAAM,CAAC,CAAA;AACzC,EAAA,UAAA,EAAY,QAAQ,CAAY,QAAA,KAAA;AAC9B,IAAA,MAAM,MAAS,GAAA;AAAA,MACb,KAAO,EAAA,QAAA;AAAA,MACP,KAAA,EAAO,yBAAyB,QAAQ,CAAA,CAAA;AAAA,MACxC,KAAO,EAAA,KAAA;AAAA,MACP,GAAG,KAAA;AAAA,MACH,MAAA,EAAQ,CAAC,GACP,qBAAA,GAAA;AAAA,QAAC,YAAA;AAAA,QAAA;AAAA,UACC,WAAA,EAAa,IAAI,OAAQ,CAAA,aAAA,CAAc,KAAK,CAAK,CAAA,KAAA,CAAA,CAAE,SAAS,QAAQ;AAAA;AAAA;AACtE,KAEJ;AAEA,IAAA,OAAA,CAAQ,KAAK,MAAM,CAAA;AAAA,GACpB,CAAA;AAED,EAAI,IAAA,CAAC,KAAO,EAAA,uBAAS,GAAA,CAAA,QAAA,EAAA,EAAA,CAAA;AAErB,EACE,uBAAA,GAAA;AAAA,IAAC,KAAA;AAAA,IAAA;AAAA,MACC,KAAM,EAAA,oBAAA;AAAA,MACN,QAAS,EAAA,qEAAA;AAAA,MACT,OAAA;AAAA,MACA,IAAA,EAAM,SAAS,EAAC;AAAA,MAChB,OAAS,EAAA;AAAA,QACP,QAAU,EAAA,EAAA;AAAA,QACV,aAAe,EAAA,IAAA;AAAA,QACf,QAAU,EAAA;AAAA,UACR,eAAA,EAAiB,KAAM,CAAA,OAAA,CAAQ,UAAW,CAAA,KAAA;AAAA,UAC1C,SAAW,EAAA,CAAA,UAAA,EAAa,KAAM,CAAA,OAAA,CAAQ,WAAW,OAAO,CAAA,CAAA;AAAA,UACxD,YAAc,EAAA,CAAA,UAAA,EAAa,KAAM,CAAA,OAAA,CAAQ,WAAW,OAAO,CAAA;AAAA;AAC7D;AACF;AAAA,GACF;AAEJ;;;;"}
|
|
@@ -7,7 +7,7 @@ import Stack from '@mui/material/Stack';
|
|
|
7
7
|
import Tooltip from '@mui/material/Tooltip';
|
|
8
8
|
import { Line } from 'rc-progress';
|
|
9
9
|
import { pluralize, getNextRankColor } from './utils.esm.js';
|
|
10
|
-
import {
|
|
10
|
+
import { MaturityRankIcon } from '../components/MaturityRankIcon/MaturityRankIcon.esm.js';
|
|
11
11
|
|
|
12
12
|
const AreaProgress = ({ areaSummary, variant }) => {
|
|
13
13
|
const { area, progress, rankProgress, rank, maxRank, isMaxRank } = areaSummary;
|
|
@@ -33,7 +33,7 @@ const AreaProgress = ({ areaSummary, variant }) => {
|
|
|
33
33
|
const logoSize = variant === "infoCard" ? 20 : 17;
|
|
34
34
|
result = /* @__PURE__ */ jsxs(Stack, { children: [
|
|
35
35
|
/* @__PURE__ */ jsxs(Stack, { direction: "row", spacing: 1, children: [
|
|
36
|
-
/* @__PURE__ */ jsx(
|
|
36
|
+
/* @__PURE__ */ jsx(MaturityRankIcon, { value: areaSummary, size: logoSize }),
|
|
37
37
|
/* @__PURE__ */ jsx(Typography, { variant: fontVariant, gutterBottom: true, color: "textPrimary", children: area }),
|
|
38
38
|
/* @__PURE__ */ jsx(Typography, { variant: fontVariant, color: "textSecondary", children: progressCaption })
|
|
39
39
|
] }),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AreaProgress.esm.js","sources":["../../src/helpers/AreaProgress.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 {\n MaturitySummaryByArea,\n Rank,\n} from '@backstage-community/plugin-tech-insights-maturity-common';\nimport Typography from '@mui/material/Typography';\nimport Box from '@mui/material/Box';\nimport LinearProgress from '@mui/material/LinearProgress';\nimport Stack from '@mui/material/Stack';\nimport Tooltip from '@mui/material/Tooltip';\nimport { Line } from 'rc-progress';\nimport { getNextRankColor, pluralize } from './utils';\nimport {
|
|
1
|
+
{"version":3,"file":"AreaProgress.esm.js","sources":["../../src/helpers/AreaProgress.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 {\n MaturitySummaryByArea,\n Rank,\n} from '@backstage-community/plugin-tech-insights-maturity-common';\nimport Typography from '@mui/material/Typography';\nimport Box from '@mui/material/Box';\nimport LinearProgress from '@mui/material/LinearProgress';\nimport Stack from '@mui/material/Stack';\nimport Tooltip from '@mui/material/Tooltip';\nimport { Line } from 'rc-progress';\nimport { getNextRankColor, pluralize } from './utils';\nimport { MaturityRankIcon } from '../components/MaturityRankIcon';\n\ntype Props = {\n areaSummary: MaturitySummaryByArea;\n variant?: 'gridItem' | 'infoCard';\n};\n\nexport const AreaProgress = ({ areaSummary, variant }: Props) => {\n const { area, progress, rankProgress, rank, maxRank, isMaxRank } =\n areaSummary;\n let result = <LinearProgress color=\"secondary\" variant=\"indeterminate\" />;\n\n if (progress) {\n const nextRankName = isMaxRank ? Rank[maxRank] : Rank[rank + 1];\n const progressCaption = isMaxRank\n ? 'Max rank!'\n : `${rankProgress.percentage}% to ${nextRankName}`;\n\n const remainingRankTasks =\n rankProgress.totalChecks - rankProgress.passedChecks;\n const rankCheckInfo = `${remainingRankTasks} task${pluralize(\n remainingRankTasks,\n )} left to reach ${nextRankName} rank in this area`;\n const rankProgressTooltip = isMaxRank ? '' : rankCheckInfo;\n\n const remainingTasks = progress.totalChecks - progress.passedChecks;\n const checkInfo = `${remainingTasks} task${pluralize(\n remainingTasks,\n )} left until area is fully mature (currently ${progress.percentage}%)`;\n const progressTooltip = (\n <>\n {rankProgressTooltip}\n {rankProgressTooltip !== '' && <br />}\n {checkInfo}\n </>\n );\n\n const fontVariant = variant === 'infoCard' ? 'body1' : 'body2';\n const logoSize = variant === 'infoCard' ? 20 : 17;\n\n result = (\n <Stack key={area}>\n <Stack direction=\"row\" spacing={1}>\n <MaturityRankIcon value={areaSummary} size={logoSize} />\n <Typography variant={fontVariant} gutterBottom color=\"textPrimary\">\n {area}\n </Typography>\n <Typography variant={fontVariant} color=\"textSecondary\">\n {progressCaption}\n </Typography>\n </Stack>\n <Tooltip title={progressTooltip}>\n <Box>\n <Line\n key={area}\n strokeColor={getNextRankColor(rank, maxRank)}\n trailColor=\"rgba(0, 0, 0, 0.1)\"\n strokeWidth={2}\n trailWidth={2}\n percent={rankProgress.percentage}\n data-testid=\"progressbar\"\n />\n </Box>\n </Tooltip>\n </Stack>\n );\n }\n\n return result;\n};\n"],"names":[],"mappings":";;;;;;;;;;;AAiCO,MAAM,YAAe,GAAA,CAAC,EAAE,WAAA,EAAa,SAAqB,KAAA;AAC/D,EAAA,MAAM,EAAE,IAAM,EAAA,QAAA,EAAU,cAAc,IAAM,EAAA,OAAA,EAAS,WACnD,GAAA,WAAA;AACF,EAAA,IAAI,yBAAU,GAAA,CAAA,cAAA,EAAA,EAAe,KAAM,EAAA,WAAA,EAAY,SAAQ,eAAgB,EAAA,CAAA;AAEvE,EAAA,IAAI,QAAU,EAAA;AACZ,IAAA,MAAM,eAAe,SAAY,GAAA,IAAA,CAAK,OAAO,CAAI,GAAA,IAAA,CAAK,OAAO,CAAC,CAAA;AAC9D,IAAA,MAAM,kBAAkB,SACpB,GAAA,WAAA,GACA,GAAG,YAAa,CAAA,UAAU,QAAQ,YAAY,CAAA,CAAA;AAElD,IAAM,MAAA,kBAAA,GACJ,YAAa,CAAA,WAAA,GAAc,YAAa,CAAA,YAAA;AAC1C,IAAM,MAAA,aAAA,GAAgB,CAAG,EAAA,kBAAkB,CAAQ,KAAA,EAAA,SAAA;AAAA,MACjD;AAAA,KACD,kBAAkB,YAAY,CAAA,kBAAA,CAAA;AAC/B,IAAM,MAAA,mBAAA,GAAsB,YAAY,EAAK,GAAA,aAAA;AAE7C,IAAM,MAAA,cAAA,GAAiB,QAAS,CAAA,WAAA,GAAc,QAAS,CAAA,YAAA;AACvD,IAAM,MAAA,SAAA,GAAY,CAAG,EAAA,cAAc,CAAQ,KAAA,EAAA,SAAA;AAAA,MACzC;AAAA,KACD,CAA+C,4CAAA,EAAA,QAAA,CAAS,UAAU,CAAA,EAAA,CAAA;AACnE,IAAA,MAAM,kCAED,IAAA,CAAA,QAAA,EAAA,EAAA,QAAA,EAAA;AAAA,MAAA,mBAAA;AAAA,MACA,mBAAA,KAAwB,EAAM,oBAAA,GAAA,CAAC,IAAG,EAAA,EAAA,CAAA;AAAA,MAClC;AAAA,KACH,EAAA,CAAA;AAGF,IAAM,MAAA,WAAA,GAAc,OAAY,KAAA,UAAA,GAAa,OAAU,GAAA,OAAA;AACvD,IAAM,MAAA,QAAA,GAAW,OAAY,KAAA,UAAA,GAAa,EAAK,GAAA,EAAA;AAE/C,IAAA,MAAA,wBACG,KACC,EAAA,EAAA,QAAA,EAAA;AAAA,sBAAA,IAAA,CAAC,KAAM,EAAA,EAAA,SAAA,EAAU,KAAM,EAAA,OAAA,EAAS,CAC9B,EAAA,QAAA,EAAA;AAAA,wBAAA,GAAA,CAAC,gBAAiB,EAAA,EAAA,KAAA,EAAO,WAAa,EAAA,IAAA,EAAM,QAAU,EAAA,CAAA;AAAA,wBACtD,GAAA,CAAC,cAAW,OAAS,EAAA,WAAA,EAAa,cAAY,IAAC,EAAA,KAAA,EAAM,eAClD,QACH,EAAA,IAAA,EAAA,CAAA;AAAA,4BACC,UAAW,EAAA,EAAA,OAAA,EAAS,WAAa,EAAA,KAAA,EAAM,iBACrC,QACH,EAAA,eAAA,EAAA;AAAA,OACF,EAAA,CAAA;AAAA,sBACC,GAAA,CAAA,OAAA,EAAA,EAAQ,KAAO,EAAA,eAAA,EACd,8BAAC,GACC,EAAA,EAAA,QAAA,kBAAA,GAAA;AAAA,QAAC,IAAA;AAAA,QAAA;AAAA,UAEC,WAAA,EAAa,gBAAiB,CAAA,IAAA,EAAM,OAAO,CAAA;AAAA,UAC3C,UAAW,EAAA,oBAAA;AAAA,UACX,WAAa,EAAA,CAAA;AAAA,UACb,UAAY,EAAA,CAAA;AAAA,UACZ,SAAS,YAAa,CAAA,UAAA;AAAA,UACtB,aAAY,EAAA;AAAA,SAAA;AAAA,QANP;AAAA,SAQT,CACF,EAAA;AAAA,KAAA,EAAA,EAtBU,IAuBZ,CAAA;AAAA;AAIJ,EAAO,OAAA,MAAA;AACT;;;;"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@backstage-community/plugin-tech-insights-maturity",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.5.0",
|
|
4
4
|
"main": "./dist/index.esm.js",
|
|
5
5
|
"types": "./dist/index.d.ts",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -56,9 +56,9 @@
|
|
|
56
56
|
"postpack": "backstage-cli package postpack"
|
|
57
57
|
},
|
|
58
58
|
"dependencies": {
|
|
59
|
-
"@backstage-community/plugin-tech-insights-common": "^0.7.
|
|
60
|
-
"@backstage-community/plugin-tech-insights-maturity-common": "^0.3.
|
|
61
|
-
"@backstage-community/plugin-tech-insights-react": "^1.2.
|
|
59
|
+
"@backstage-community/plugin-tech-insights-common": "^0.7.1",
|
|
60
|
+
"@backstage-community/plugin-tech-insights-maturity-common": "^0.3.1",
|
|
61
|
+
"@backstage-community/plugin-tech-insights-react": "^1.2.1",
|
|
62
62
|
"@backstage/catalog-client": "^1.10.0",
|
|
63
63
|
"@backstage/catalog-model": "^1.7.4",
|
|
64
64
|
"@backstage/core-components": "^0.17.2",
|
|
@@ -66,9 +66,9 @@
|
|
|
66
66
|
"@backstage/plugin-catalog-react": "^1.18.0",
|
|
67
67
|
"@backstage/theme": "^0.6.6",
|
|
68
68
|
"@backstage/version-bridge": "^1.0.11",
|
|
69
|
-
"@mui/icons-material": "5.
|
|
70
|
-
"@mui/material": "5.
|
|
71
|
-
"@mui/styles": "5.
|
|
69
|
+
"@mui/icons-material": "5.18.0",
|
|
70
|
+
"@mui/material": "5.18.0",
|
|
71
|
+
"@mui/styles": "5.18.0",
|
|
72
72
|
"@mui/x-charts": "6.19.8",
|
|
73
73
|
"@types/d3-scale": "^4.0.8",
|
|
74
74
|
"@types/d3-shape": "^3.1.7",
|
|
@@ -1 +0,0 @@
|
|
|
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 type { JSX } 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: 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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"}
|