@backstage-community/plugin-apiiro 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +12 -0
- package/README.md +232 -0
- package/config.d.ts +30 -0
- package/dist/App.esm.js +12 -0
- package/dist/App.esm.js.map +1 -0
- package/dist/api/index.esm.js +71 -0
- package/dist/api/index.esm.js.map +1 -0
- package/dist/assets/BulleyeIcon.esm.js +454 -0
- package/dist/assets/BulleyeIcon.esm.js.map +1 -0
- package/dist/assets/NoResultIcon.esm.js +146 -0
- package/dist/assets/NoResultIcon.esm.js.map +1 -0
- package/dist/assets/RiskIcon.esm.js +27 -0
- package/dist/assets/RiskIcon.esm.js.map +1 -0
- package/dist/assets/SettingIcon.esm.js +49 -0
- package/dist/assets/SettingIcon.esm.js.map +1 -0
- package/dist/assets/apiiroLogo/apiiroLogo.esm.js +21 -0
- package/dist/assets/apiiroLogo/apiiroLogo.esm.js.map +1 -0
- package/dist/assets/apiiroLogo/apiiroSidebar.esm.js +23 -0
- package/dist/assets/apiiroLogo/apiiroSidebar.esm.js.map +1 -0
- package/dist/assets/apiiroLogo/apiiroSmall.esm.js +19 -0
- package/dist/assets/apiiroLogo/apiiroSmall.esm.js.map +1 -0
- package/dist/assets/languageIcons/C.esm.js +7 -0
- package/dist/assets/languageIcons/C.esm.js.map +1 -0
- package/dist/assets/languageIcons/Cicd.esm.js +7 -0
- package/dist/assets/languageIcons/Cicd.esm.js.map +1 -0
- package/dist/assets/languageIcons/Clojure.esm.js +7 -0
- package/dist/assets/languageIcons/Clojure.esm.js.map +1 -0
- package/dist/assets/languageIcons/Cpp.esm.js +7 -0
- package/dist/assets/languageIcons/Cpp.esm.js.map +1 -0
- package/dist/assets/languageIcons/Csharp.esm.js +7 -0
- package/dist/assets/languageIcons/Csharp.esm.js.map +1 -0
- package/dist/assets/languageIcons/Dart.esm.js +7 -0
- package/dist/assets/languageIcons/Dart.esm.js.map +1 -0
- package/dist/assets/languageIcons/Go.esm.js +7 -0
- package/dist/assets/languageIcons/Go.esm.js.map +1 -0
- package/dist/assets/languageIcons/Groovy.esm.js +7 -0
- package/dist/assets/languageIcons/Groovy.esm.js.map +1 -0
- package/dist/assets/languageIcons/HTML.esm.js +7 -0
- package/dist/assets/languageIcons/HTML.esm.js.map +1 -0
- package/dist/assets/languageIcons/HclLanguage.esm.js +7 -0
- package/dist/assets/languageIcons/HclLanguage.esm.js.map +1 -0
- package/dist/assets/languageIcons/Java.esm.js +7 -0
- package/dist/assets/languageIcons/Java.esm.js.map +1 -0
- package/dist/assets/languageIcons/Javascript.esm.js +7 -0
- package/dist/assets/languageIcons/Javascript.esm.js.map +1 -0
- package/dist/assets/languageIcons/Kotlin.esm.js +7 -0
- package/dist/assets/languageIcons/Kotlin.esm.js.map +1 -0
- package/dist/assets/languageIcons/ObjectiveC.esm.js +7 -0
- package/dist/assets/languageIcons/ObjectiveC.esm.js.map +1 -0
- package/dist/assets/languageIcons/PHP.esm.js +7 -0
- package/dist/assets/languageIcons/PHP.esm.js.map +1 -0
- package/dist/assets/languageIcons/Perl.esm.js +13 -0
- package/dist/assets/languageIcons/Perl.esm.js.map +1 -0
- package/dist/assets/languageIcons/Python.esm.js +7 -0
- package/dist/assets/languageIcons/Python.esm.js.map +1 -0
- package/dist/assets/languageIcons/Ruby.esm.js +7 -0
- package/dist/assets/languageIcons/Ruby.esm.js.map +1 -0
- package/dist/assets/languageIcons/Rust.esm.js +7 -0
- package/dist/assets/languageIcons/Rust.esm.js.map +1 -0
- package/dist/assets/languageIcons/Scala.esm.js +7 -0
- package/dist/assets/languageIcons/Scala.esm.js.map +1 -0
- package/dist/assets/languageIcons/Swift.esm.js +7 -0
- package/dist/assets/languageIcons/Swift.esm.js.map +1 -0
- package/dist/assets/languageIcons/Terraform.esm.js +7 -0
- package/dist/assets/languageIcons/Terraform.esm.js.map +1 -0
- package/dist/assets/languageIcons/Typescript.esm.js +7 -0
- package/dist/assets/languageIcons/Typescript.esm.js.map +1 -0
- package/dist/assets/languageIcons/Unknown.esm.js +7 -0
- package/dist/assets/languageIcons/Unknown.esm.js.map +1 -0
- package/dist/assets/languageIcons/VB.esm.js +10 -0
- package/dist/assets/languageIcons/VB.esm.js.map +1 -0
- package/dist/assets/languageIcons/YAML.esm.js +7 -0
- package/dist/assets/languageIcons/YAML.esm.js.map +1 -0
- package/dist/assets/providerIcons/Azure.esm.js +7 -0
- package/dist/assets/providerIcons/Azure.esm.js.map +1 -0
- package/dist/assets/providerIcons/Bitbucket.esm.js +7 -0
- package/dist/assets/providerIcons/Bitbucket.esm.js.map +1 -0
- package/dist/assets/providerIcons/Gitlab.esm.js +7 -0
- package/dist/assets/providerIcons/Gitlab.esm.js.map +1 -0
- package/dist/components/ApiiroSidebar.esm.js +10 -0
- package/dist/components/ApiiroSidebar.esm.js.map +1 -0
- package/dist/components/ApplicationsList/ApplicationsList.esm.js +196 -0
- package/dist/components/ApplicationsList/ApplicationsList.esm.js.map +1 -0
- package/dist/components/CalendarDatePicker.esm.js +154 -0
- package/dist/components/CalendarDatePicker.esm.js.map +1 -0
- package/dist/components/CalendarDatePicker.styles.esm.js +198 -0
- package/dist/components/CalendarDatePicker.styles.esm.js.map +1 -0
- package/dist/components/Chip.esm.js +60 -0
- package/dist/components/Chip.esm.js.map +1 -0
- package/dist/components/ChipsList.esm.js +207 -0
- package/dist/components/ChipsList.esm.js.map +1 -0
- package/dist/components/ComponentDisplay.esm.js +42 -0
- package/dist/components/ComponentDisplay.esm.js.map +1 -0
- package/dist/components/DataGrid/CustomColumnMenu.esm.js +29 -0
- package/dist/components/DataGrid/CustomColumnMenu.esm.js.map +1 -0
- package/dist/components/DataGrid/CustomPagination.esm.js +113 -0
- package/dist/components/DataGrid/CustomPagination.esm.js.map +1 -0
- package/dist/components/DataGrid/CustomSearchToolbar.esm.js +117 -0
- package/dist/components/DataGrid/CustomSearchToolbar.esm.js.map +1 -0
- package/dist/components/DataGrid/DataGrid.esm.js +336 -0
- package/dist/components/DataGrid/DataGrid.esm.js.map +1 -0
- package/dist/components/DataGrid/PinColumnMenuItem.esm.js +24 -0
- package/dist/components/DataGrid/PinColumnMenuItem.esm.js.map +1 -0
- package/dist/components/DueDate.esm.js +34 -0
- package/dist/components/DueDate.esm.js.map +1 -0
- package/dist/components/Header.esm.js +27 -0
- package/dist/components/Header.esm.js.map +1 -0
- package/dist/components/MainContributors/MainContributors.esm.js +62 -0
- package/dist/components/MainContributors/MainContributors.esm.js.map +1 -0
- package/dist/components/MetricsGroup/TabMetricsGroup.esm.js +37 -0
- package/dist/components/MetricsGroup/TabMetricsGroup.esm.js.map +1 -0
- package/dist/components/MetricsGroup/WidgetMetricsGroup.esm.js +36 -0
- package/dist/components/MetricsGroup/WidgetMetricsGroup.esm.js.map +1 -0
- package/dist/components/RepositoryDisplay/RepositoryDisplay.esm.js +121 -0
- package/dist/components/RepositoryDisplay/RepositoryDisplay.esm.js.map +1 -0
- package/dist/components/RiskLevel.esm.js +88 -0
- package/dist/components/RiskLevel.esm.js.map +1 -0
- package/dist/components/RiskStatus.esm.js +58 -0
- package/dist/components/RiskStatus.esm.js.map +1 -0
- package/dist/components/SimpleTooltip.esm.js +24 -0
- package/dist/components/SimpleTooltip.esm.js.map +1 -0
- package/dist/components/SourcesDisplay.esm.js +47 -0
- package/dist/components/SourcesDisplay.esm.js.map +1 -0
- package/dist/components/TagsList/TagsList.esm.js +38 -0
- package/dist/components/TagsList/TagsList.esm.js.map +1 -0
- package/dist/components/TeamsDisplay.esm.js +47 -0
- package/dist/components/TeamsDisplay.esm.js.map +1 -0
- package/dist/components/charts/ColumnChart.esm.js +402 -0
- package/dist/components/charts/ColumnChart.esm.js.map +1 -0
- package/dist/components/charts/GaugeChart.esm.js +249 -0
- package/dist/components/charts/GaugeChart.esm.js.map +1 -0
- package/dist/components/charts/LineChart.esm.js +328 -0
- package/dist/components/charts/LineChart.esm.js.map +1 -0
- package/dist/components/charts/PieChart.esm.js +233 -0
- package/dist/components/charts/PieChart.esm.js.map +1 -0
- package/dist/components/common/ChartBox.esm.js +88 -0
- package/dist/components/common/ChartBox.esm.js.map +1 -0
- package/dist/components/common/CustomTooltip.esm.js +255 -0
- package/dist/components/common/CustomTooltip.esm.js.map +1 -0
- package/dist/components/common/ErrorSnackbar.esm.js +39 -0
- package/dist/components/common/ErrorSnackbar.esm.js.map +1 -0
- package/dist/components/common/NotFound.esm.js +30 -0
- package/dist/components/common/NotFound.esm.js.map +1 -0
- package/dist/components/common/SomethingWentWrong.esm.js +35 -0
- package/dist/components/common/SomethingWentWrong.esm.js.map +1 -0
- package/dist/components/common/languageIcons.esm.js +61 -0
- package/dist/components/common/languageIcons.esm.js.map +1 -0
- package/dist/components/common/logoSpinner.esm.js +28 -0
- package/dist/components/common/logoSpinner.esm.js.map +1 -0
- package/dist/components/common/scmProviders.esm.js +41 -0
- package/dist/components/common/scmProviders.esm.js.map +1 -0
- package/dist/components/filters/DiscoveredOnFilter.esm.js +284 -0
- package/dist/components/filters/DiscoveredOnFilter.esm.js.map +1 -0
- package/dist/components/filters/FilterDropdown.esm.js +325 -0
- package/dist/components/filters/FilterDropdown.esm.js.map +1 -0
- package/dist/components/filters/FilterDropdownClear.esm.js +45 -0
- package/dist/components/filters/FilterDropdownClear.esm.js.map +1 -0
- package/dist/components/filters/FilterDropdownList.esm.js +102 -0
- package/dist/components/filters/FilterDropdownList.esm.js.map +1 -0
- package/dist/components/filters/FilterDropdownSearch.esm.js +65 -0
- package/dist/components/filters/FilterDropdownSearch.esm.js.map +1 -0
- package/dist/components/filters/RiskInsightFilter.esm.js +579 -0
- package/dist/components/filters/RiskInsightFilter.esm.js.map +1 -0
- package/dist/components/tiles/MttrVsSLATile.esm.js +170 -0
- package/dist/components/tiles/MttrVsSLATile.esm.js.map +1 -0
- package/dist/components/tiles/RiskOverTimeTile.esm.js +311 -0
- package/dist/components/tiles/RiskOverTimeTile.esm.js.map +1 -0
- package/dist/components/tiles/SLAAdherenceTile.esm.js +115 -0
- package/dist/components/tiles/SLAAdherenceTile.esm.js.map +1 -0
- package/dist/components/tiles/StatusTile.esm.js +235 -0
- package/dist/components/tiles/StatusTile.esm.js.map +1 -0
- package/dist/components/tiles/TopLanguagesTile.esm.js +234 -0
- package/dist/components/tiles/TopLanguagesTile.esm.js.map +1 -0
- package/dist/components/tiles/TopRiskTile.esm.js +208 -0
- package/dist/components/tiles/TopRiskTile.esm.js.map +1 -0
- package/dist/hooks/useUrlFilters.esm.js +102 -0
- package/dist/hooks/useUrlFilters.esm.js.map +1 -0
- package/dist/index.d.ts +28 -0
- package/dist/index.esm.js +42 -0
- package/dist/index.esm.js.map +1 -0
- package/dist/pages/Repositories/Repositories.esm.js +102 -0
- package/dist/pages/Repositories/Repositories.esm.js.map +1 -0
- package/dist/pages/Repositories/tableConfig.esm.js +294 -0
- package/dist/pages/Repositories/tableConfig.esm.js.map +1 -0
- package/dist/pages/Risks/Risks.esm.js +258 -0
- package/dist/pages/Risks/Risks.esm.js.map +1 -0
- package/dist/pages/Risks/tableConfig.esm.js +305 -0
- package/dist/pages/Risks/tableConfig.esm.js.map +1 -0
- package/dist/pages/tab/Tab.esm.js +147 -0
- package/dist/pages/tab/Tab.esm.js.map +1 -0
- package/dist/pages/tab/TabProvider.esm.js +11 -0
- package/dist/pages/tab/TabProvider.esm.js.map +1 -0
- package/dist/pages/widget/Widget.esm.js +161 -0
- package/dist/pages/widget/Widget.esm.js.map +1 -0
- package/dist/pages/widget/WidgetProvider.esm.js +12 -0
- package/dist/pages/widget/WidgetProvider.esm.js.map +1 -0
- package/dist/plugin.esm.js +30 -0
- package/dist/plugin.esm.js.map +1 -0
- package/dist/queries/filterOptions.queries.esm.js +46 -0
- package/dist/queries/filterOptions.queries.esm.js.map +1 -0
- package/dist/queries/mttr-statistics.queries.esm.js +61 -0
- package/dist/queries/mttr-statistics.queries.esm.js.map +1 -0
- package/dist/queries/repository.queries.esm.js +60 -0
- package/dist/queries/repository.queries.esm.js.map +1 -0
- package/dist/queries/risk-score-over-time.queries.esm.js +61 -0
- package/dist/queries/risk-score-over-time.queries.esm.js.map +1 -0
- package/dist/queries/risks.queries.esm.js +65 -0
- package/dist/queries/risks.queries.esm.js.map +1 -0
- package/dist/queries/sla-breach.queries.esm.js +57 -0
- package/dist/queries/sla-breach.queries.esm.js.map +1 -0
- package/dist/queries/top-risks.queries.esm.js +47 -0
- package/dist/queries/top-risks.queries.esm.js.map +1 -0
- package/dist/routes.esm.js +8 -0
- package/dist/routes.esm.js.map +1 -0
- package/dist/theme/themeUtils.esm.js +290 -0
- package/dist/theme/themeUtils.esm.js.map +1 -0
- package/dist/utils/dateFormatter.esm.js +67 -0
- package/dist/utils/dateFormatter.esm.js.map +1 -0
- package/dist/utils/numberFormatter.esm.js +21 -0
- package/dist/utils/numberFormatter.esm.js.map +1 -0
- package/dist/utils/utils.esm.js +27 -0
- package/dist/utils/utils.esm.js.map +1 -0
- package/package.json +90 -0
|
@@ -0,0 +1,161 @@
|
|
|
1
|
+
import { jsx, Fragment, jsxs } from 'react/jsx-runtime';
|
|
2
|
+
import { useApi, fetchApiRef } from '@backstage/core-plugin-api';
|
|
3
|
+
import { apiiroApiRef } from '../../api/index.esm.js';
|
|
4
|
+
import { useRepositoriesData } from '../../queries/repository.queries.esm.js';
|
|
5
|
+
import '@tanstack/react-query';
|
|
6
|
+
import { useEntity } from '@backstage/plugin-catalog-react';
|
|
7
|
+
import { WidgetMetricsGroup } from '../../components/MetricsGroup/WidgetMetricsGroup.esm.js';
|
|
8
|
+
import '../../components/common/ChartBox.esm.js';
|
|
9
|
+
import 'react';
|
|
10
|
+
import 'react-dom';
|
|
11
|
+
import { styled, useTheme } from '@mui/material/styles';
|
|
12
|
+
import { NotFound } from '../../components/common/NotFound.esm.js';
|
|
13
|
+
import { SomethingWentWrong } from '../../components/common/SomethingWentWrong.esm.js';
|
|
14
|
+
import { LogoSpinner } from '../../components/common/logoSpinner.esm.js';
|
|
15
|
+
import Box from '@mui/material/Box';
|
|
16
|
+
import { ApiiroLogo } from '../../assets/apiiroLogo/apiiroLogo.esm.js';
|
|
17
|
+
import '@mui/material/SvgIcon';
|
|
18
|
+
import { APIIRO_PROJECT_ANNOTATION } from '@backstage-community/plugin-apiiro-common';
|
|
19
|
+
import { getLogoContainerColors } from '../../theme/themeUtils.esm.js';
|
|
20
|
+
import { stringifyEntityRef } from '@backstage/catalog-model';
|
|
21
|
+
|
|
22
|
+
const LogoContainer = styled(Box)(({ theme }) => {
|
|
23
|
+
const logoColors = getLogoContainerColors(theme);
|
|
24
|
+
return {
|
|
25
|
+
display: "flex",
|
|
26
|
+
flexDirection: "row",
|
|
27
|
+
justifyContent: "center",
|
|
28
|
+
alignItems: "center",
|
|
29
|
+
padding: "12px 15px",
|
|
30
|
+
gap: "10px",
|
|
31
|
+
width: "109px",
|
|
32
|
+
height: "40px",
|
|
33
|
+
background: logoColors.background,
|
|
34
|
+
borderRadius: "10px",
|
|
35
|
+
"& svg": {
|
|
36
|
+
width: "79px",
|
|
37
|
+
height: "22px",
|
|
38
|
+
"& path": {
|
|
39
|
+
fill: logoColors.logoFill
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
});
|
|
44
|
+
const Widget = () => {
|
|
45
|
+
const theme = useTheme();
|
|
46
|
+
const connectBackendApi = useApi(apiiroApiRef);
|
|
47
|
+
const { fetch } = useApi(fetchApiRef);
|
|
48
|
+
const { entity } = useEntity();
|
|
49
|
+
const repoId = entity?.metadata?.annotations?.[APIIRO_PROJECT_ANNOTATION] || void 0;
|
|
50
|
+
const entityRef = stringifyEntityRef(entity);
|
|
51
|
+
const { repositoriesData, repositoriesDataLoading, repositoriesDataError } = useRepositoriesData({
|
|
52
|
+
fetchApi: fetch,
|
|
53
|
+
connectApi: connectBackendApi,
|
|
54
|
+
enabled: true,
|
|
55
|
+
repositoryKey: repoId,
|
|
56
|
+
entityRef
|
|
57
|
+
});
|
|
58
|
+
if (repositoriesDataLoading) {
|
|
59
|
+
return /* @__PURE__ */ jsx(Fragment, { children: /* @__PURE__ */ jsxs(
|
|
60
|
+
Box,
|
|
61
|
+
{
|
|
62
|
+
display: "flex",
|
|
63
|
+
justifyContent: "flex-start",
|
|
64
|
+
alignItems: "center",
|
|
65
|
+
flexDirection: "column",
|
|
66
|
+
minHeight: "300px",
|
|
67
|
+
sx: {
|
|
68
|
+
border: `1px solid ${theme.palette.divider}`,
|
|
69
|
+
borderRadius: "12px",
|
|
70
|
+
backgroundColor: theme.palette.background.paper,
|
|
71
|
+
boxShadow: theme.shadows[1]
|
|
72
|
+
},
|
|
73
|
+
children: [
|
|
74
|
+
/* @__PURE__ */ jsx(LogoContainer, { sx: { alignSelf: "flex-end" }, children: /* @__PURE__ */ jsx(ApiiroLogo, {}) }),
|
|
75
|
+
/* @__PURE__ */ jsx(
|
|
76
|
+
Box,
|
|
77
|
+
{
|
|
78
|
+
display: "flex",
|
|
79
|
+
justifyContent: "center",
|
|
80
|
+
alignItems: "center",
|
|
81
|
+
minHeight: "250px",
|
|
82
|
+
children: /* @__PURE__ */ jsx(LogoSpinner, {})
|
|
83
|
+
}
|
|
84
|
+
)
|
|
85
|
+
]
|
|
86
|
+
}
|
|
87
|
+
) });
|
|
88
|
+
}
|
|
89
|
+
if (repositoriesDataError) {
|
|
90
|
+
return /* @__PURE__ */ jsx(Fragment, { children: /* @__PURE__ */ jsxs(
|
|
91
|
+
Box,
|
|
92
|
+
{
|
|
93
|
+
display: "flex",
|
|
94
|
+
justifyContent: "center",
|
|
95
|
+
alignItems: "center",
|
|
96
|
+
flexDirection: "column",
|
|
97
|
+
minHeight: "300px",
|
|
98
|
+
sx: {
|
|
99
|
+
border: `1px solid ${theme.palette.divider}`,
|
|
100
|
+
borderRadius: "12px",
|
|
101
|
+
backgroundColor: theme.palette.background.paper,
|
|
102
|
+
boxShadow: theme.shadows[1]
|
|
103
|
+
},
|
|
104
|
+
children: [
|
|
105
|
+
/* @__PURE__ */ jsx(LogoContainer, { sx: { alignSelf: "flex-end" }, children: /* @__PURE__ */ jsx(ApiiroLogo, {}) }),
|
|
106
|
+
/* @__PURE__ */ jsx(
|
|
107
|
+
SomethingWentWrong,
|
|
108
|
+
{
|
|
109
|
+
statusCode: repositoriesDataError?.details?.status
|
|
110
|
+
}
|
|
111
|
+
)
|
|
112
|
+
]
|
|
113
|
+
}
|
|
114
|
+
) });
|
|
115
|
+
}
|
|
116
|
+
const repositories = repositoriesData?.repositories;
|
|
117
|
+
if (!repositories || repositories.length === 0) {
|
|
118
|
+
return /* @__PURE__ */ jsx(Fragment, { children: /* @__PURE__ */ jsxs(
|
|
119
|
+
Box,
|
|
120
|
+
{
|
|
121
|
+
display: "flex",
|
|
122
|
+
justifyContent: "flex-start",
|
|
123
|
+
alignItems: "center",
|
|
124
|
+
flexDirection: "column",
|
|
125
|
+
minHeight: "300px",
|
|
126
|
+
sx: {
|
|
127
|
+
border: `1px solid ${theme.palette.divider}`,
|
|
128
|
+
borderRadius: "12px",
|
|
129
|
+
backgroundColor: theme.palette.background.paper,
|
|
130
|
+
boxShadow: theme.shadows[1]
|
|
131
|
+
},
|
|
132
|
+
children: [
|
|
133
|
+
/* @__PURE__ */ jsx(LogoContainer, { sx: { alignSelf: "flex-end" }, children: /* @__PURE__ */ jsx(ApiiroLogo, {}) }),
|
|
134
|
+
/* @__PURE__ */ jsx(
|
|
135
|
+
Box,
|
|
136
|
+
{
|
|
137
|
+
display: "flex",
|
|
138
|
+
justifyContent: "center",
|
|
139
|
+
alignItems: "center",
|
|
140
|
+
minHeight: "250px",
|
|
141
|
+
children: /* @__PURE__ */ jsx(NotFound, { message: "Results for this repository are either unavailable on Apiiro or cannot be accessed." })
|
|
142
|
+
}
|
|
143
|
+
)
|
|
144
|
+
]
|
|
145
|
+
}
|
|
146
|
+
) });
|
|
147
|
+
}
|
|
148
|
+
const repositoryData = repositories[0];
|
|
149
|
+
return /* @__PURE__ */ jsx(Fragment, { children: /* @__PURE__ */ jsx(
|
|
150
|
+
WidgetMetricsGroup,
|
|
151
|
+
{
|
|
152
|
+
repositoryData,
|
|
153
|
+
repoId,
|
|
154
|
+
entityRef,
|
|
155
|
+
entity
|
|
156
|
+
}
|
|
157
|
+
) });
|
|
158
|
+
};
|
|
159
|
+
|
|
160
|
+
export { Widget };
|
|
161
|
+
//# sourceMappingURL=Widget.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Widget.esm.js","sources":["../../../src/pages/widget/Widget.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 { useApi } from '@backstage/core-plugin-api';\nimport { apiiroApiRef } from '../../api';\nimport { fetchApiRef } from '@backstage/core-plugin-api';\nimport { useRepositoriesData } from '../../queries';\nimport { useEntity } from '@backstage/plugin-catalog-react';\nimport { WidgetMetricsGroup } from '../../components/MetricsGroup/WidgetMetricsGroup';\nimport { NotFound, SomethingWentWrong } from '../../components/common';\nimport { LogoSpinner } from '../../components/common/logoSpinner';\nimport Box from '@mui/material/Box';\nimport { styled, useTheme } from '@mui/material/styles';\nimport { ApiiroLogo } from '../../assets/apiiroLogo';\nimport { APIIRO_PROJECT_ANNOTATION } from '@backstage-community/plugin-apiiro-common';\nimport { getLogoContainerColors } from '../../theme/themeUtils';\nimport { stringifyEntityRef } from '@backstage/catalog-model';\n\nconst LogoContainer = styled(Box)(({ theme }) => {\n const logoColors = getLogoContainerColors(theme);\n return {\n display: 'flex',\n flexDirection: 'row',\n justifyContent: 'center',\n alignItems: 'center',\n padding: '12px 15px',\n gap: '10px',\n width: '109px',\n height: '40px',\n background: logoColors.background,\n borderRadius: '10px',\n '& svg': {\n width: '79px',\n height: '22px',\n '& path': {\n fill: logoColors.logoFill,\n },\n },\n };\n});\n\nexport const Widget = () => {\n const theme = useTheme();\n const connectBackendApi = useApi(apiiroApiRef);\n const { fetch } = useApi(fetchApiRef);\n const { entity } = useEntity();\n const repoId =\n entity?.metadata?.annotations?.[APIIRO_PROJECT_ANNOTATION] || undefined;\n const entityRef = stringifyEntityRef(entity);\n\n const { repositoriesData, repositoriesDataLoading, repositoriesDataError } =\n useRepositoriesData({\n fetchApi: fetch,\n connectApi: connectBackendApi,\n enabled: true,\n repositoryKey: repoId,\n entityRef,\n });\n\n if (repositoriesDataLoading) {\n return (\n <>\n <Box\n display=\"flex\"\n justifyContent=\"flex-start\"\n alignItems=\"center\"\n flexDirection=\"column\"\n minHeight=\"300px\"\n sx={{\n border: `1px solid ${theme.palette.divider}`,\n borderRadius: '12px',\n backgroundColor: theme.palette.background.paper,\n boxShadow: theme.shadows[1],\n }}\n >\n <LogoContainer sx={{ alignSelf: 'flex-end' }}>\n <ApiiroLogo />\n </LogoContainer>\n <Box\n display=\"flex\"\n justifyContent=\"center\"\n alignItems=\"center\"\n minHeight=\"250px\"\n >\n <LogoSpinner />\n </Box>\n </Box>\n </>\n );\n }\n\n if (repositoriesDataError) {\n return (\n <>\n <Box\n display=\"flex\"\n justifyContent=\"center\"\n alignItems=\"center\"\n flexDirection=\"column\"\n minHeight=\"300px\"\n sx={{\n border: `1px solid ${theme.palette.divider}`,\n borderRadius: '12px',\n backgroundColor: theme.palette.background.paper,\n boxShadow: theme.shadows[1],\n }}\n >\n <LogoContainer sx={{ alignSelf: 'flex-end' }}>\n <ApiiroLogo />\n </LogoContainer>\n <SomethingWentWrong\n statusCode={repositoriesDataError?.details?.status}\n />\n </Box>\n </>\n );\n }\n\n const repositories = repositoriesData?.repositories;\n\n if (!repositories || repositories.length === 0) {\n return (\n <>\n <Box\n display=\"flex\"\n justifyContent=\"flex-start\"\n alignItems=\"center\"\n flexDirection=\"column\"\n minHeight=\"300px\"\n sx={{\n border: `1px solid ${theme.palette.divider}`,\n borderRadius: '12px',\n backgroundColor: theme.palette.background.paper,\n boxShadow: theme.shadows[1],\n }}\n >\n <LogoContainer sx={{ alignSelf: 'flex-end' }}>\n <ApiiroLogo />\n </LogoContainer>\n <Box\n display=\"flex\"\n justifyContent=\"center\"\n alignItems=\"center\"\n minHeight=\"250px\"\n >\n <NotFound message=\"Results for this repository are either unavailable on Apiiro or cannot be accessed.\" />\n </Box>\n </Box>\n </>\n );\n }\n const repositoryData = repositories[0];\n\n return (\n <>\n <WidgetMetricsGroup\n repositoryData={repositoryData}\n repoId={repoId!}\n entityRef={entityRef}\n entity={entity}\n />\n </>\n );\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { jsx } from 'react/jsx-runtime';
|
|
2
|
+
import { QueryClientProvider } from '@tanstack/react-query';
|
|
3
|
+
import { queryClient } from '../../api/index.esm.js';
|
|
4
|
+
import { Widget } from './Widget.esm.js';
|
|
5
|
+
import { InfoCard } from '@backstage/core-components';
|
|
6
|
+
|
|
7
|
+
const ApiiroWidget = () => {
|
|
8
|
+
return /* @__PURE__ */ jsx(QueryClientProvider, { client: queryClient, children: /* @__PURE__ */ jsx(InfoCard, { title: "Apiiro Metrics", children: /* @__PURE__ */ jsx(Widget, {}) }) });
|
|
9
|
+
};
|
|
10
|
+
|
|
11
|
+
export { ApiiroWidget };
|
|
12
|
+
//# sourceMappingURL=WidgetProvider.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WidgetProvider.esm.js","sources":["../../../src/pages/widget/WidgetProvider.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 { QueryClientProvider } from '@tanstack/react-query';\nimport { queryClient } from '../../api';\nimport { Widget } from './Widget';\nimport { InfoCard } from '@backstage/core-components';\n\n/** @public */\nexport const ApiiroWidget = () => {\n return (\n <QueryClientProvider client={queryClient}>\n <InfoCard title=\"Apiiro Metrics\">\n <Widget />\n </InfoCard>\n </QueryClientProvider>\n );\n};\n"],"names":[],"mappings":";;;;;;AAqBO,MAAM,eAAe,MAAM;AAChC,EAAA,uBACE,GAAA,CAAC,mBAAA,EAAA,EAAoB,MAAA,EAAQ,WAAA,EAC3B,QAAA,kBAAA,GAAA,CAAC,QAAA,EAAA,EAAS,KAAA,EAAM,gBAAA,EACd,QAAA,kBAAA,GAAA,CAAC,MAAA,EAAA,EAAO,CAAA,EACV,CAAA,EACF,CAAA;AAEJ;;;;"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { createPlugin, createApiFactory, configApiRef, discoveryApiRef, createRoutableExtension } from '@backstage/core-plugin-api';
|
|
2
|
+
import { rootRouteRef } from './routes.esm.js';
|
|
3
|
+
import { ApiiroClient, apiiroApiRef } from './api/index.esm.js';
|
|
4
|
+
|
|
5
|
+
const apiiroPlugin = createPlugin({
|
|
6
|
+
id: "apiiro-plugin",
|
|
7
|
+
routes: {
|
|
8
|
+
root: rootRouteRef
|
|
9
|
+
},
|
|
10
|
+
apis: [
|
|
11
|
+
createApiFactory({
|
|
12
|
+
api: apiiroApiRef,
|
|
13
|
+
deps: {
|
|
14
|
+
discoveryApi: discoveryApiRef,
|
|
15
|
+
configApi: configApiRef
|
|
16
|
+
},
|
|
17
|
+
factory: ({ discoveryApi, configApi }) => new ApiiroClient({ discoveryApi, configApi })
|
|
18
|
+
})
|
|
19
|
+
]
|
|
20
|
+
});
|
|
21
|
+
const ApiiroPage = apiiroPlugin.provide(
|
|
22
|
+
createRoutableExtension({
|
|
23
|
+
name: "ApiiroPage",
|
|
24
|
+
component: () => import('./App.esm.js').then((m) => m.App),
|
|
25
|
+
mountPoint: rootRouteRef
|
|
26
|
+
})
|
|
27
|
+
);
|
|
28
|
+
|
|
29
|
+
export { ApiiroPage, apiiroPlugin };
|
|
30
|
+
//# sourceMappingURL=plugin.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin.esm.js","sources":["../src/plugin.ts"],"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 createApiFactory,\n createPlugin,\n createRoutableExtension,\n discoveryApiRef,\n configApiRef,\n} from '@backstage/core-plugin-api';\n\nimport { rootRouteRef } from './routes';\nimport { apiiroApiRef, ApiiroClient } from './api';\n\n/** @public */\nexport const apiiroPlugin = createPlugin({\n id: 'apiiro-plugin',\n routes: {\n root: rootRouteRef,\n },\n apis: [\n createApiFactory({\n api: apiiroApiRef,\n deps: {\n discoveryApi: discoveryApiRef,\n configApi: configApiRef,\n },\n factory: ({ discoveryApi, configApi }) =>\n new ApiiroClient({ discoveryApi, configApi }),\n }),\n ],\n});\n\n/** @public */\nexport const ApiiroPage = apiiroPlugin.provide(\n createRoutableExtension({\n name: 'ApiiroPage',\n component: () => import('./App').then(m => m.App),\n mountPoint: rootRouteRef,\n }),\n);\n"],"names":[],"mappings":";;;;AA2BO,MAAM,eAAe,YAAA,CAAa;AAAA,EACvC,EAAA,EAAI,eAAA;AAAA,EACJ,MAAA,EAAQ;AAAA,IACN,IAAA,EAAM;AAAA,GACR;AAAA,EACA,IAAA,EAAM;AAAA,IACJ,gBAAA,CAAiB;AAAA,MACf,GAAA,EAAK,YAAA;AAAA,MACL,IAAA,EAAM;AAAA,QACJ,YAAA,EAAc,eAAA;AAAA,QACd,SAAA,EAAW;AAAA,OACb;AAAA,MACA,OAAA,EAAS,CAAC,EAAE,YAAA,EAAc,SAAA,EAAU,KAClC,IAAI,YAAA,CAAa,EAAE,YAAA,EAAc,SAAA,EAAW;AAAA,KAC/C;AAAA;AAEL,CAAC;AAGM,MAAM,aAAa,YAAA,CAAa,OAAA;AAAA,EACrC,uBAAA,CAAwB;AAAA,IACtB,IAAA,EAAM,YAAA;AAAA,IACN,SAAA,EAAW,MAAM,OAAO,cAAO,EAAE,IAAA,CAAK,CAAA,CAAA,KAAK,EAAE,GAAG,CAAA;AAAA,IAChD,UAAA,EAAY;AAAA,GACb;AACH;;;;"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { useQuery } from '@tanstack/react-query';
|
|
2
|
+
import { get } from '../api/index.esm.js';
|
|
3
|
+
|
|
4
|
+
const getFilterOptionsData = async ({
|
|
5
|
+
fetchApi,
|
|
6
|
+
signal,
|
|
7
|
+
connectApi
|
|
8
|
+
}) => {
|
|
9
|
+
const url = await connectApi.discoveryApi.getBaseUrl("apiiro");
|
|
10
|
+
return await get(
|
|
11
|
+
fetchApi,
|
|
12
|
+
`${url}/filterOptions`,
|
|
13
|
+
{
|
|
14
|
+
signal
|
|
15
|
+
}
|
|
16
|
+
);
|
|
17
|
+
};
|
|
18
|
+
function useFilterOptionsData({
|
|
19
|
+
fetchApi,
|
|
20
|
+
connectApi
|
|
21
|
+
}) {
|
|
22
|
+
const {
|
|
23
|
+
data: filterOptionsData,
|
|
24
|
+
error: filterOptionsDataError,
|
|
25
|
+
isLoading: filterOptionsDataLoading
|
|
26
|
+
} = useQuery({
|
|
27
|
+
queryKey: ["GET_FILTER_OPTIONS" /* GET_FILTER_OPTIONS */],
|
|
28
|
+
queryFn: ({ signal }) => getFilterOptionsData({
|
|
29
|
+
fetchApi,
|
|
30
|
+
signal,
|
|
31
|
+
connectApi
|
|
32
|
+
}),
|
|
33
|
+
staleTime: 5 * 60 * 1e3,
|
|
34
|
+
// 5 minutes - filter options don't change frequently
|
|
35
|
+
gcTime: 10 * 60 * 1e3
|
|
36
|
+
// 10 minutes
|
|
37
|
+
});
|
|
38
|
+
return {
|
|
39
|
+
filterOptionsData,
|
|
40
|
+
filterOptionsDataError,
|
|
41
|
+
filterOptionsDataLoading
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
export { useFilterOptionsData };
|
|
46
|
+
//# sourceMappingURL=filterOptions.queries.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filterOptions.queries.esm.js","sources":["../../src/queries/filterOptions.queries.ts"],"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 { useQuery } from '@tanstack/react-query';\nimport { get } from '../api';\nimport { Query } from './queries.type';\n\nexport enum FILTER_OPTIONS_QUERY_KEY {\n GET_FILTER_OPTIONS = 'GET_FILTER_OPTIONS',\n}\n\n// Filter option types\nexport type FilterOption = {\n name: string;\n displayName: string;\n sortOrder: number;\n group: string | null;\n groupOrder: number;\n hierarchy: string | null;\n};\n\nexport type FilterDefinition = {\n name: string;\n displayName: string;\n isGrouped: boolean;\n filterOptions: FilterOption[];\n sortOrder: number;\n filterType: 'dateRange' | 'checkbox';\n isAdditional: boolean;\n defaultValue: string | null;\n defaultValues: string[] | null;\n supportedOperators: string[];\n};\n\nexport type FilterOptionsSuccessResponseData = FilterDefinition[];\n\ninterface FilterOptionsQuery extends Query {}\n\nconst getFilterOptionsData = async ({\n fetchApi,\n signal,\n connectApi,\n}: FilterOptionsQuery): Promise<FilterOptionsSuccessResponseData> => {\n const url = await connectApi.discoveryApi.getBaseUrl('apiiro');\n return await get<FilterOptionsSuccessResponseData>(\n fetchApi,\n `${url}/filterOptions`,\n {\n signal,\n },\n );\n};\n\nexport function useFilterOptionsData({\n fetchApi,\n connectApi,\n}: Omit<FilterOptionsQuery, 'signal'>) {\n const {\n data: filterOptionsData,\n error: filterOptionsDataError,\n isLoading: filterOptionsDataLoading,\n } = useQuery({\n queryKey: [FILTER_OPTIONS_QUERY_KEY.GET_FILTER_OPTIONS],\n queryFn: ({ signal }) =>\n getFilterOptionsData({\n fetchApi,\n signal,\n connectApi,\n }),\n staleTime: 5 * 60 * 1000, // 5 minutes - filter options don't change frequently\n gcTime: 10 * 60 * 1000, // 10 minutes\n });\n\n return {\n filterOptionsData,\n filterOptionsDataError,\n filterOptionsDataLoading,\n };\n}\n"],"names":[],"mappings":";;;AAkDA,MAAM,uBAAuB,OAAO;AAAA,EAClC,QAAA;AAAA,EACA,MAAA;AAAA,EACA;AACF,CAAA,KAAqE;AACnE,EAAA,MAAM,GAAA,GAAM,MAAM,UAAA,CAAW,YAAA,CAAa,WAAW,QAAQ,CAAA;AAC7D,EAAA,OAAO,MAAM,GAAA;AAAA,IACX,QAAA;AAAA,IACA,GAAG,GAAG,CAAA,cAAA,CAAA;AAAA,IACN;AAAA,MACE;AAAA;AACF,GACF;AACF,CAAA;AAEO,SAAS,oBAAA,CAAqB;AAAA,EACnC,QAAA;AAAA,EACA;AACF,CAAA,EAAuC;AACrC,EAAA,MAAM;AAAA,IACJ,IAAA,EAAM,iBAAA;AAAA,IACN,KAAA,EAAO,sBAAA;AAAA,IACP,SAAA,EAAW;AAAA,MACT,QAAA,CAAS;AAAA,IACX,QAAA,EAAU,CAAC,oBAAA,0BAA2C;AAAA,IACtD,OAAA,EAAS,CAAC,EAAE,MAAA,OACV,oBAAA,CAAqB;AAAA,MACnB,QAAA;AAAA,MACA,MAAA;AAAA,MACA;AAAA,KACD,CAAA;AAAA,IACH,SAAA,EAAW,IAAI,EAAA,GAAK,GAAA;AAAA;AAAA,IACpB,MAAA,EAAQ,KAAK,EAAA,GAAK;AAAA;AAAA,GACnB,CAAA;AAED,EAAA,OAAO;AAAA,IACL,iBAAA;AAAA,IACA,sBAAA;AAAA,IACA;AAAA,GACF;AACF;;;;"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { useQuery } from '@tanstack/react-query';
|
|
2
|
+
import { post } from '../api/index.esm.js';
|
|
3
|
+
|
|
4
|
+
const getMttrStatisticsData = async ({
|
|
5
|
+
fetchApi,
|
|
6
|
+
signal,
|
|
7
|
+
connectApi,
|
|
8
|
+
repositoryKey,
|
|
9
|
+
entityRef
|
|
10
|
+
}) => {
|
|
11
|
+
const url = await connectApi.discoveryApi.getBaseUrl("apiiro");
|
|
12
|
+
const body = {};
|
|
13
|
+
if (repositoryKey) {
|
|
14
|
+
body.repositoryKey = repositoryKey;
|
|
15
|
+
}
|
|
16
|
+
if (entityRef) {
|
|
17
|
+
body.entityRef = entityRef;
|
|
18
|
+
}
|
|
19
|
+
return await post(
|
|
20
|
+
fetchApi,
|
|
21
|
+
`${url}/mttr-statistics`,
|
|
22
|
+
{
|
|
23
|
+
signal,
|
|
24
|
+
body
|
|
25
|
+
}
|
|
26
|
+
);
|
|
27
|
+
};
|
|
28
|
+
function useMttrStatisticsData({
|
|
29
|
+
fetchApi,
|
|
30
|
+
connectApi,
|
|
31
|
+
repositoryKey,
|
|
32
|
+
entityRef
|
|
33
|
+
}) {
|
|
34
|
+
const {
|
|
35
|
+
data: mttrStatisticsData,
|
|
36
|
+
error: mttrStatisticsDataError,
|
|
37
|
+
isLoading: mttrStatisticsDataLoading
|
|
38
|
+
} = useQuery({
|
|
39
|
+
queryKey: [
|
|
40
|
+
"GET_MTTR_STATISTICS" /* GET_MTTR_STATISTICS */,
|
|
41
|
+
repositoryKey,
|
|
42
|
+
entityRef
|
|
43
|
+
],
|
|
44
|
+
queryFn: ({ signal }) => repositoryKey || entityRef ? getMttrStatisticsData({
|
|
45
|
+
fetchApi,
|
|
46
|
+
signal,
|
|
47
|
+
connectApi,
|
|
48
|
+
repositoryKey,
|
|
49
|
+
entityRef
|
|
50
|
+
}) : Promise.resolve([]),
|
|
51
|
+
enabled: !!(repositoryKey || entityRef)
|
|
52
|
+
});
|
|
53
|
+
return {
|
|
54
|
+
mttrStatisticsData,
|
|
55
|
+
mttrStatisticsDataError,
|
|
56
|
+
mttrStatisticsDataLoading
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
export { useMttrStatisticsData };
|
|
61
|
+
//# sourceMappingURL=mttr-statistics.queries.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mttr-statistics.queries.esm.js","sources":["../../src/queries/mttr-statistics.queries.ts"],"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 { useQuery } from '@tanstack/react-query';\nimport { post } from '../api';\nimport { Query, MttrStatisticsSuccessResponseData } from './queries.type';\n\nexport enum MTTR_STATISTICS_QUERY_KEY {\n GET_MTTR_STATISTICS = 'GET_MTTR_STATISTICS',\n}\n\nconst getMttrStatisticsData = async ({\n fetchApi,\n signal,\n connectApi,\n repositoryKey,\n entityRef,\n}: Query & {\n repositoryKey?: string;\n entityRef?: string;\n}) => {\n const url = await connectApi.discoveryApi.getBaseUrl('apiiro');\n const body: any = {};\n\n if (repositoryKey) {\n body.repositoryKey = repositoryKey;\n }\n\n if (entityRef) {\n body.entityRef = entityRef;\n }\n\n return await post<MttrStatisticsSuccessResponseData>(\n fetchApi,\n `${url}/mttr-statistics`,\n {\n signal,\n body,\n },\n );\n};\n\nexport function useMttrStatisticsData({\n fetchApi,\n connectApi,\n repositoryKey,\n entityRef,\n}: Omit<Query, 'signal'> & {\n repositoryKey?: string;\n entityRef?: string;\n}) {\n const {\n data: mttrStatisticsData,\n error: mttrStatisticsDataError,\n isLoading: mttrStatisticsDataLoading,\n } = useQuery({\n queryKey: [\n MTTR_STATISTICS_QUERY_KEY.GET_MTTR_STATISTICS,\n repositoryKey,\n entityRef,\n ],\n queryFn: ({ signal }) =>\n repositoryKey || entityRef\n ? getMttrStatisticsData({\n fetchApi,\n signal,\n connectApi,\n repositoryKey,\n entityRef,\n })\n : Promise.resolve([]),\n enabled: !!(repositoryKey || entityRef),\n });\n\n return {\n mttrStatisticsData,\n mttrStatisticsDataError,\n mttrStatisticsDataLoading,\n };\n}\n"],"names":[],"mappings":";;;AAuBA,MAAM,wBAAwB,OAAO;AAAA,EACnC,QAAA;AAAA,EACA,MAAA;AAAA,EACA,UAAA;AAAA,EACA,aAAA;AAAA,EACA;AACF,CAAA,KAGM;AACJ,EAAA,MAAM,GAAA,GAAM,MAAM,UAAA,CAAW,YAAA,CAAa,WAAW,QAAQ,CAAA;AAC7D,EAAA,MAAM,OAAY,EAAC;AAEnB,EAAA,IAAI,aAAA,EAAe;AACjB,IAAA,IAAA,CAAK,aAAA,GAAgB,aAAA;AAAA,EACvB;AAEA,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,IAAA,CAAK,SAAA,GAAY,SAAA;AAAA,EACnB;AAEA,EAAA,OAAO,MAAM,IAAA;AAAA,IACX,QAAA;AAAA,IACA,GAAG,GAAG,CAAA,gBAAA,CAAA;AAAA,IACN;AAAA,MACE,MAAA;AAAA,MACA;AAAA;AACF,GACF;AACF,CAAA;AAEO,SAAS,qBAAA,CAAsB;AAAA,EACpC,QAAA;AAAA,EACA,UAAA;AAAA,EACA,aAAA;AAAA,EACA;AACF,CAAA,EAGG;AACD,EAAA,MAAM;AAAA,IACJ,IAAA,EAAM,kBAAA;AAAA,IACN,KAAA,EAAO,uBAAA;AAAA,IACP,SAAA,EAAW;AAAA,MACT,QAAA,CAAS;AAAA,IACX,QAAA,EAAU;AAAA,MACR,qBAAA;AAAA,MACA,aAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,SAAS,CAAC,EAAE,QAAO,KACjB,aAAA,IAAiB,YACb,qBAAA,CAAsB;AAAA,MACpB,QAAA;AAAA,MACA,MAAA;AAAA,MACA,UAAA;AAAA,MACA,aAAA;AAAA,MACA;AAAA,KACD,CAAA,GACD,OAAA,CAAQ,OAAA,CAAQ,EAAE,CAAA;AAAA,IACxB,OAAA,EAAS,CAAC,EAAE,aAAA,IAAiB,SAAA;AAAA,GAC9B,CAAA;AAED,EAAA,OAAO;AAAA,IACL,kBAAA;AAAA,IACA,uBAAA;AAAA,IACA;AAAA,GACF;AACF;;;;"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { useQuery } from '@tanstack/react-query';
|
|
2
|
+
import { post } from '../api/index.esm.js';
|
|
3
|
+
|
|
4
|
+
const getRepositoriesData = async ({
|
|
5
|
+
fetchApi,
|
|
6
|
+
signal,
|
|
7
|
+
connectApi,
|
|
8
|
+
repositoryKey,
|
|
9
|
+
entityRef
|
|
10
|
+
}) => {
|
|
11
|
+
const url = await connectApi.discoveryApi.getBaseUrl("apiiro");
|
|
12
|
+
const body = {};
|
|
13
|
+
if (repositoryKey) {
|
|
14
|
+
body.repositoryKey = repositoryKey;
|
|
15
|
+
}
|
|
16
|
+
if (entityRef) {
|
|
17
|
+
body.entityRef = entityRef;
|
|
18
|
+
}
|
|
19
|
+
const requestBody = Object.keys(body).length > 0 ? body : void 0;
|
|
20
|
+
return await post(
|
|
21
|
+
fetchApi,
|
|
22
|
+
`${url}/repositories`,
|
|
23
|
+
{
|
|
24
|
+
signal,
|
|
25
|
+
body: requestBody
|
|
26
|
+
}
|
|
27
|
+
);
|
|
28
|
+
};
|
|
29
|
+
function useRepositoriesData({
|
|
30
|
+
fetchApi,
|
|
31
|
+
connectApi,
|
|
32
|
+
enabled = true,
|
|
33
|
+
repositoryKey,
|
|
34
|
+
entityRef
|
|
35
|
+
}) {
|
|
36
|
+
const {
|
|
37
|
+
data: repositoriesData,
|
|
38
|
+
error: queryError,
|
|
39
|
+
isLoading: repositoriesDataLoading
|
|
40
|
+
} = useQuery({
|
|
41
|
+
queryKey: ["GET_REPOSITORIES" /* GET_REPOSITORIES */, repositoryKey, entityRef],
|
|
42
|
+
queryFn: ({ signal }) => getRepositoriesData({
|
|
43
|
+
fetchApi,
|
|
44
|
+
signal,
|
|
45
|
+
connectApi,
|
|
46
|
+
repositoryKey,
|
|
47
|
+
entityRef
|
|
48
|
+
}),
|
|
49
|
+
enabled
|
|
50
|
+
});
|
|
51
|
+
const repositoriesDataError = queryError ? queryError : null;
|
|
52
|
+
return {
|
|
53
|
+
repositoriesData,
|
|
54
|
+
repositoriesDataError,
|
|
55
|
+
repositoriesDataLoading
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
export { useRepositoriesData };
|
|
60
|
+
//# sourceMappingURL=repository.queries.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repository.queries.esm.js","sources":["../../src/queries/repository.queries.ts"],"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 { useQuery } from '@tanstack/react-query';\nimport { post } from '../api';\nimport { ApiError, Query, RepositorySuccessResponseData } from './queries.type';\n\ntype UseRepositoriesDataResult = {\n repositoriesData: RepositorySuccessResponseData | undefined;\n repositoriesDataError: ApiError | null;\n repositoriesDataLoading: boolean;\n};\n\nexport enum REPOSITORY_QUERY_KEY {\n GET_REPOSITORIES = 'GET_REPOSITORIES',\n}\n\nconst getRepositoriesData = async ({\n fetchApi,\n signal,\n connectApi,\n repositoryKey,\n entityRef,\n}: Query & { repositoryKey?: string; entityRef?: string }) => {\n const url = await connectApi.discoveryApi.getBaseUrl('apiiro');\n const body: any = {};\n\n if (repositoryKey) {\n body.repositoryKey = repositoryKey;\n }\n\n if (entityRef) {\n body.entityRef = entityRef;\n }\n\n const requestBody = Object.keys(body).length > 0 ? body : undefined;\n\n return await post<RepositorySuccessResponseData>(\n fetchApi,\n `${url}/repositories`,\n {\n signal,\n body: requestBody,\n },\n );\n};\n\nexport function useRepositoriesData({\n fetchApi,\n connectApi,\n enabled = true,\n repositoryKey,\n entityRef,\n}: Omit<Query, 'signal'> & {\n enabled?: boolean;\n repositoryKey?: string;\n entityRef?: string;\n}): UseRepositoriesDataResult {\n const {\n data: repositoriesData,\n error: queryError,\n isLoading: repositoriesDataLoading,\n } = useQuery({\n queryKey: [REPOSITORY_QUERY_KEY.GET_REPOSITORIES, repositoryKey, entityRef],\n queryFn: ({ signal }) =>\n getRepositoriesData({\n fetchApi,\n signal,\n connectApi,\n repositoryKey,\n entityRef,\n }),\n enabled,\n });\n\n // Transform the error to match ApiError\n const repositoriesDataError = queryError ? (queryError as ApiError) : null;\n\n return {\n repositoriesData,\n repositoriesDataError,\n repositoriesDataLoading,\n };\n}\n"],"names":[],"mappings":";;;AA6BA,MAAM,sBAAsB,OAAO;AAAA,EACjC,QAAA;AAAA,EACA,MAAA;AAAA,EACA,UAAA;AAAA,EACA,aAAA;AAAA,EACA;AACF,CAAA,KAA8D;AAC5D,EAAA,MAAM,GAAA,GAAM,MAAM,UAAA,CAAW,YAAA,CAAa,WAAW,QAAQ,CAAA;AAC7D,EAAA,MAAM,OAAY,EAAC;AAEnB,EAAA,IAAI,aAAA,EAAe;AACjB,IAAA,IAAA,CAAK,aAAA,GAAgB,aAAA;AAAA,EACvB;AAEA,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,IAAA,CAAK,SAAA,GAAY,SAAA;AAAA,EACnB;AAEA,EAAA,MAAM,cAAc,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA,CAAE,MAAA,GAAS,IAAI,IAAA,GAAO,MAAA;AAE1D,EAAA,OAAO,MAAM,IAAA;AAAA,IACX,QAAA;AAAA,IACA,GAAG,GAAG,CAAA,aAAA,CAAA;AAAA,IACN;AAAA,MACE,MAAA;AAAA,MACA,IAAA,EAAM;AAAA;AACR,GACF;AACF,CAAA;AAEO,SAAS,mBAAA,CAAoB;AAAA,EAClC,QAAA;AAAA,EACA,UAAA;AAAA,EACA,OAAA,GAAU,IAAA;AAAA,EACV,aAAA;AAAA,EACA;AACF,CAAA,EAI8B;AAC5B,EAAA,MAAM;AAAA,IACJ,IAAA,EAAM,gBAAA;AAAA,IACN,KAAA,EAAO,UAAA;AAAA,IACP,SAAA,EAAW;AAAA,MACT,QAAA,CAAS;AAAA,IACX,QAAA,EAAU,CAAC,kBAAA,yBAAuC,aAAA,EAAe,SAAS,CAAA;AAAA,IAC1E,OAAA,EAAS,CAAC,EAAE,MAAA,OACV,mBAAA,CAAoB;AAAA,MAClB,QAAA;AAAA,MACA,MAAA;AAAA,MACA,UAAA;AAAA,MACA,aAAA;AAAA,MACA;AAAA,KACD,CAAA;AAAA,IACH;AAAA,GACD,CAAA;AAGD,EAAA,MAAM,qBAAA,GAAwB,aAAc,UAAA,GAA0B,IAAA;AAEtE,EAAA,OAAO;AAAA,IACL,gBAAA;AAAA,IACA,qBAAA;AAAA,IACA;AAAA,GACF;AACF;;;;"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { useQuery } from '@tanstack/react-query';
|
|
2
|
+
import { post } from '../api/index.esm.js';
|
|
3
|
+
|
|
4
|
+
const getRiskScoreOverTimeData = async ({
|
|
5
|
+
fetchApi,
|
|
6
|
+
signal,
|
|
7
|
+
connectApi,
|
|
8
|
+
repositoryKey,
|
|
9
|
+
entityRef
|
|
10
|
+
}) => {
|
|
11
|
+
const url = await connectApi.discoveryApi.getBaseUrl("apiiro");
|
|
12
|
+
const body = {};
|
|
13
|
+
if (repositoryKey) {
|
|
14
|
+
body.repositoryKey = repositoryKey;
|
|
15
|
+
}
|
|
16
|
+
if (entityRef) {
|
|
17
|
+
body.entityRef = entityRef;
|
|
18
|
+
}
|
|
19
|
+
return await post(
|
|
20
|
+
fetchApi,
|
|
21
|
+
`${url}/risk-score-over-time`,
|
|
22
|
+
{
|
|
23
|
+
signal,
|
|
24
|
+
body
|
|
25
|
+
}
|
|
26
|
+
);
|
|
27
|
+
};
|
|
28
|
+
function useRiskScoreOverTimeData({
|
|
29
|
+
fetchApi,
|
|
30
|
+
connectApi,
|
|
31
|
+
repositoryKey,
|
|
32
|
+
entityRef
|
|
33
|
+
}) {
|
|
34
|
+
const {
|
|
35
|
+
data: riskScoreOverTimeData,
|
|
36
|
+
error: riskScoreOverTimeDataError,
|
|
37
|
+
isLoading: riskScoreOverTimeDataLoading
|
|
38
|
+
} = useQuery({
|
|
39
|
+
queryKey: [
|
|
40
|
+
"GET_RISK_SCORE_OVER_TIME" /* GET_RISK_SCORE_OVER_TIME */,
|
|
41
|
+
repositoryKey,
|
|
42
|
+
entityRef
|
|
43
|
+
],
|
|
44
|
+
queryFn: ({ signal }) => repositoryKey || entityRef ? getRiskScoreOverTimeData({
|
|
45
|
+
fetchApi,
|
|
46
|
+
signal,
|
|
47
|
+
connectApi,
|
|
48
|
+
repositoryKey,
|
|
49
|
+
entityRef
|
|
50
|
+
}) : Promise.resolve([]),
|
|
51
|
+
enabled: !!(repositoryKey || entityRef)
|
|
52
|
+
});
|
|
53
|
+
return {
|
|
54
|
+
riskScoreOverTimeData,
|
|
55
|
+
riskScoreOverTimeDataError,
|
|
56
|
+
riskScoreOverTimeDataLoading
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
export { useRiskScoreOverTimeData };
|
|
61
|
+
//# sourceMappingURL=risk-score-over-time.queries.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"risk-score-over-time.queries.esm.js","sources":["../../src/queries/risk-score-over-time.queries.ts"],"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 { useQuery } from '@tanstack/react-query';\nimport { post } from '../api';\nimport { Query, RiskScoreOverTimeSuccessResponseData } from './queries.type';\n\nexport enum RISK_SCORE_OVER_TIME_QUERY_KEY {\n GET_RISK_SCORE_OVER_TIME = 'GET_RISK_SCORE_OVER_TIME',\n}\n\nconst getRiskScoreOverTimeData = async ({\n fetchApi,\n signal,\n connectApi,\n repositoryKey,\n entityRef,\n}: Query & { repositoryKey?: string; entityRef?: string }) => {\n const url = await connectApi.discoveryApi.getBaseUrl('apiiro');\n const body: any = {};\n\n if (repositoryKey) {\n body.repositoryKey = repositoryKey;\n }\n\n if (entityRef) {\n body.entityRef = entityRef;\n }\n\n return await post<RiskScoreOverTimeSuccessResponseData>(\n fetchApi,\n `${url}/risk-score-over-time`,\n {\n signal,\n body,\n },\n );\n};\n\nexport function useRiskScoreOverTimeData({\n fetchApi,\n connectApi,\n repositoryKey,\n entityRef,\n}: Omit<Query, 'signal'> & { repositoryKey?: string; entityRef?: string }) {\n const {\n data: riskScoreOverTimeData,\n error: riskScoreOverTimeDataError,\n isLoading: riskScoreOverTimeDataLoading,\n } = useQuery({\n queryKey: [\n RISK_SCORE_OVER_TIME_QUERY_KEY.GET_RISK_SCORE_OVER_TIME,\n repositoryKey,\n entityRef,\n ],\n queryFn: ({ signal }) =>\n repositoryKey || entityRef\n ? getRiskScoreOverTimeData({\n fetchApi,\n signal,\n connectApi,\n repositoryKey,\n entityRef,\n })\n : Promise.resolve([]),\n enabled: !!(repositoryKey || entityRef),\n });\n\n return {\n riskScoreOverTimeData,\n riskScoreOverTimeDataError,\n riskScoreOverTimeDataLoading,\n };\n}\n"],"names":[],"mappings":";;;AAuBA,MAAM,2BAA2B,OAAO;AAAA,EACtC,QAAA;AAAA,EACA,MAAA;AAAA,EACA,UAAA;AAAA,EACA,aAAA;AAAA,EACA;AACF,CAAA,KAA8D;AAC5D,EAAA,MAAM,GAAA,GAAM,MAAM,UAAA,CAAW,YAAA,CAAa,WAAW,QAAQ,CAAA;AAC7D,EAAA,MAAM,OAAY,EAAC;AAEnB,EAAA,IAAI,aAAA,EAAe;AACjB,IAAA,IAAA,CAAK,aAAA,GAAgB,aAAA;AAAA,EACvB;AAEA,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,IAAA,CAAK,SAAA,GAAY,SAAA;AAAA,EACnB;AAEA,EAAA,OAAO,MAAM,IAAA;AAAA,IACX,QAAA;AAAA,IACA,GAAG,GAAG,CAAA,qBAAA,CAAA;AAAA,IACN;AAAA,MACE,MAAA;AAAA,MACA;AAAA;AACF,GACF;AACF,CAAA;AAEO,SAAS,wBAAA,CAAyB;AAAA,EACvC,QAAA;AAAA,EACA,UAAA;AAAA,EACA,aAAA;AAAA,EACA;AACF,CAAA,EAA2E;AACzE,EAAA,MAAM;AAAA,IACJ,IAAA,EAAM,qBAAA;AAAA,IACN,KAAA,EAAO,0BAAA;AAAA,IACP,SAAA,EAAW;AAAA,MACT,QAAA,CAAS;AAAA,IACX,QAAA,EAAU;AAAA,MACR,0BAAA;AAAA,MACA,aAAA;AAAA,MACA;AAAA,KACF;AAAA,IACA,SAAS,CAAC,EAAE,QAAO,KACjB,aAAA,IAAiB,YACb,wBAAA,CAAyB;AAAA,MACvB,QAAA;AAAA,MACA,MAAA;AAAA,MACA,UAAA;AAAA,MACA,aAAA;AAAA,MACA;AAAA,KACD,CAAA,GACD,OAAA,CAAQ,OAAA,CAAQ,EAAE,CAAA;AAAA,IACxB,OAAA,EAAS,CAAC,EAAE,aAAA,IAAiB,SAAA;AAAA,GAC9B,CAAA;AAED,EAAA,OAAO;AAAA,IACL,qBAAA;AAAA,IACA,0BAAA;AAAA,IACA;AAAA,GACF;AACF;;;;"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { useQuery } from '@tanstack/react-query';
|
|
2
|
+
import { post } from '../api/index.esm.js';
|
|
3
|
+
|
|
4
|
+
const getRisksData = async ({
|
|
5
|
+
fetchApi,
|
|
6
|
+
signal,
|
|
7
|
+
connectApi,
|
|
8
|
+
repositoryKey,
|
|
9
|
+
entityRef,
|
|
10
|
+
filters
|
|
11
|
+
}) => {
|
|
12
|
+
const url = await connectApi.discoveryApi.getBaseUrl("apiiro");
|
|
13
|
+
const body = { filters };
|
|
14
|
+
if (repositoryKey) {
|
|
15
|
+
body.repositoryKey = repositoryKey;
|
|
16
|
+
}
|
|
17
|
+
if (entityRef) {
|
|
18
|
+
body.entityRef = entityRef;
|
|
19
|
+
}
|
|
20
|
+
return await post(fetchApi, `${url}/risks`, {
|
|
21
|
+
signal,
|
|
22
|
+
body
|
|
23
|
+
});
|
|
24
|
+
};
|
|
25
|
+
function useRisksData({
|
|
26
|
+
fetchApi,
|
|
27
|
+
connectApi,
|
|
28
|
+
repositoryKey,
|
|
29
|
+
entityRef,
|
|
30
|
+
filters
|
|
31
|
+
}) {
|
|
32
|
+
const {
|
|
33
|
+
data: risksData,
|
|
34
|
+
error: risksDataError,
|
|
35
|
+
isLoading: risksDataLoading
|
|
36
|
+
} = useQuery({
|
|
37
|
+
queryKey: ["GET_RISKS" /* GET_RISKS */, repositoryKey, entityRef, filters],
|
|
38
|
+
queryFn: ({ signal }) => getRisksData({
|
|
39
|
+
fetchApi,
|
|
40
|
+
signal,
|
|
41
|
+
connectApi,
|
|
42
|
+
repositoryKey,
|
|
43
|
+
entityRef,
|
|
44
|
+
filters
|
|
45
|
+
}),
|
|
46
|
+
enabled: !!(repositoryKey || entityRef),
|
|
47
|
+
staleTime: 2 * 60 * 1e3,
|
|
48
|
+
// Consider data fresh for 2 minutes
|
|
49
|
+
gcTime: 5 * 60 * 1e3,
|
|
50
|
+
// Keep in cache for 5 minutes
|
|
51
|
+
refetchOnMount: "always",
|
|
52
|
+
// Always refetch but don't block with loading if cache exists
|
|
53
|
+
refetchOnWindowFocus: false
|
|
54
|
+
// Don't refetch on window focus to avoid unnecessary calls
|
|
55
|
+
});
|
|
56
|
+
return {
|
|
57
|
+
risksData,
|
|
58
|
+
risksDataError,
|
|
59
|
+
risksDataLoading
|
|
60
|
+
// Only show loading on initial load, not during background refetch
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
export { useRisksData };
|
|
65
|
+
//# sourceMappingURL=risks.queries.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"risks.queries.esm.js","sources":["../../src/queries/risks.queries.ts"],"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 { useQuery } from '@tanstack/react-query';\nimport { post } from '../api';\nimport { Query } from './queries.type';\n\nexport enum RISK_QUERY_KEY {\n GET_RISKS = 'GET_RISKS',\n}\n\ninterface RisksQuery extends Query {\n repositoryKey?: string;\n entityRef?: string;\n filters?: {\n RiskCategory?: string[];\n RiskLevel?: string[];\n FindingCategory?: string[];\n RiskInsight?: string[];\n DiscoveredOn?: {\n start?: string;\n end?: string;\n };\n };\n}\n\nconst getRisksData = async ({\n fetchApi,\n signal,\n connectApi,\n repositoryKey,\n entityRef,\n filters,\n}: RisksQuery) => {\n const url = await connectApi.discoveryApi.getBaseUrl('apiiro');\n const body: any = { filters };\n\n if (repositoryKey) {\n body.repositoryKey = repositoryKey;\n }\n\n if (entityRef) {\n body.entityRef = entityRef;\n }\n\n return await post<any>(fetchApi, `${url}/risks`, {\n signal,\n body,\n });\n};\n\nexport function useRisksData({\n fetchApi,\n connectApi,\n repositoryKey,\n entityRef,\n filters,\n}: Omit<RisksQuery, 'signal'>) {\n const {\n data: risksData,\n error: risksDataError,\n isLoading: risksDataLoading,\n } = useQuery({\n queryKey: [RISK_QUERY_KEY.GET_RISKS, repositoryKey, entityRef, filters],\n queryFn: ({ signal }) =>\n getRisksData({\n fetchApi,\n signal,\n connectApi,\n repositoryKey,\n entityRef,\n filters,\n }),\n enabled: !!(repositoryKey || entityRef),\n staleTime: 2 * 60 * 1000, // Consider data fresh for 2 minutes\n gcTime: 5 * 60 * 1000, // Keep in cache for 5 minutes\n refetchOnMount: 'always', // Always refetch but don't block with loading if cache exists\n refetchOnWindowFocus: false, // Don't refetch on window focus to avoid unnecessary calls\n });\n\n return {\n risksData,\n risksDataError,\n risksDataLoading, // Only show loading on initial load, not during background refetch\n };\n}\n"],"names":[],"mappings":";;;AAsCA,MAAM,eAAe,OAAO;AAAA,EAC1B,QAAA;AAAA,EACA,MAAA;AAAA,EACA,UAAA;AAAA,EACA,aAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAA,KAAkB;AAChB,EAAA,MAAM,GAAA,GAAM,MAAM,UAAA,CAAW,YAAA,CAAa,WAAW,QAAQ,CAAA;AAC7D,EAAA,MAAM,IAAA,GAAY,EAAE,OAAA,EAAQ;AAE5B,EAAA,IAAI,aAAA,EAAe;AACjB,IAAA,IAAA,CAAK,aAAA,GAAgB,aAAA;AAAA,EACvB;AAEA,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,IAAA,CAAK,SAAA,GAAY,SAAA;AAAA,EACnB;AAEA,EAAA,OAAO,MAAM,IAAA,CAAU,QAAA,EAAU,CAAA,EAAG,GAAG,CAAA,MAAA,CAAA,EAAU;AAAA,IAC/C,MAAA;AAAA,IACA;AAAA,GACD,CAAA;AACH,CAAA;AAEO,SAAS,YAAA,CAAa;AAAA,EAC3B,QAAA;AAAA,EACA,UAAA;AAAA,EACA,aAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAA,EAA+B;AAC7B,EAAA,MAAM;AAAA,IACJ,IAAA,EAAM,SAAA;AAAA,IACN,KAAA,EAAO,cAAA;AAAA,IACP,SAAA,EAAW;AAAA,MACT,QAAA,CAAS;AAAA,IACX,QAAA,EAAU,CAAC,WAAA,kBAA0B,aAAA,EAAe,WAAW,OAAO,CAAA;AAAA,IACtE,OAAA,EAAS,CAAC,EAAE,MAAA,OACV,YAAA,CAAa;AAAA,MACX,QAAA;AAAA,MACA,MAAA;AAAA,MACA,UAAA;AAAA,MACA,aAAA;AAAA,MACA,SAAA;AAAA,MACA;AAAA,KACD,CAAA;AAAA,IACH,OAAA,EAAS,CAAC,EAAE,aAAA,IAAiB,SAAA,CAAA;AAAA,IAC7B,SAAA,EAAW,IAAI,EAAA,GAAK,GAAA;AAAA;AAAA,IACpB,MAAA,EAAQ,IAAI,EAAA,GAAK,GAAA;AAAA;AAAA,IACjB,cAAA,EAAgB,QAAA;AAAA;AAAA,IAChB,oBAAA,EAAsB;AAAA;AAAA,GACvB,CAAA;AAED,EAAA,OAAO;AAAA,IACL,SAAA;AAAA,IACA,cAAA;AAAA,IACA;AAAA;AAAA,GACF;AACF;;;;"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import { useQuery } from '@tanstack/react-query';
|
|
2
|
+
import { post } from '../api/index.esm.js';
|
|
3
|
+
|
|
4
|
+
const getSlaBreachData = async ({
|
|
5
|
+
fetchApi,
|
|
6
|
+
signal,
|
|
7
|
+
connectApi,
|
|
8
|
+
repositoryKey,
|
|
9
|
+
entityRef
|
|
10
|
+
}) => {
|
|
11
|
+
const url = await connectApi.discoveryApi.getBaseUrl("apiiro");
|
|
12
|
+
const body = {};
|
|
13
|
+
if (repositoryKey) {
|
|
14
|
+
body.repositoryKey = repositoryKey;
|
|
15
|
+
}
|
|
16
|
+
if (entityRef) {
|
|
17
|
+
body.entityRef = entityRef;
|
|
18
|
+
}
|
|
19
|
+
return await post(
|
|
20
|
+
fetchApi,
|
|
21
|
+
`${url}/sla-breach`,
|
|
22
|
+
{
|
|
23
|
+
signal,
|
|
24
|
+
body
|
|
25
|
+
}
|
|
26
|
+
);
|
|
27
|
+
};
|
|
28
|
+
function useSlaBreachData({
|
|
29
|
+
fetchApi,
|
|
30
|
+
connectApi,
|
|
31
|
+
repositoryKey,
|
|
32
|
+
entityRef
|
|
33
|
+
}) {
|
|
34
|
+
const {
|
|
35
|
+
data: slaBreachData,
|
|
36
|
+
error: slaBreachDataError,
|
|
37
|
+
isLoading: slaBreachDataLoading
|
|
38
|
+
} = useQuery({
|
|
39
|
+
queryKey: ["GET_SLA_BREACH" /* GET_SLA_BREACH */, repositoryKey, entityRef],
|
|
40
|
+
queryFn: ({ signal }) => repositoryKey || entityRef ? getSlaBreachData({
|
|
41
|
+
fetchApi,
|
|
42
|
+
signal,
|
|
43
|
+
connectApi,
|
|
44
|
+
repositoryKey,
|
|
45
|
+
entityRef
|
|
46
|
+
}) : Promise.resolve([]),
|
|
47
|
+
enabled: !!(repositoryKey || entityRef)
|
|
48
|
+
});
|
|
49
|
+
return {
|
|
50
|
+
slaBreachData,
|
|
51
|
+
slaBreachDataError,
|
|
52
|
+
slaBreachDataLoading
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
export { useSlaBreachData };
|
|
57
|
+
//# sourceMappingURL=sla-breach.queries.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sla-breach.queries.esm.js","sources":["../../src/queries/sla-breach.queries.ts"],"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 { useQuery } from '@tanstack/react-query';\nimport { post } from '../api';\nimport { Query, SlaBreachSuccessResponseData } from './queries.type';\n\nexport enum SLA_BREACH_QUERY_KEY {\n GET_SLA_BREACH = 'GET_SLA_BREACH',\n}\n\nconst getSlaBreachData = async ({\n fetchApi,\n signal,\n connectApi,\n repositoryKey,\n entityRef,\n}: Query & { repositoryKey?: string; entityRef?: string }) => {\n const url = await connectApi.discoveryApi.getBaseUrl('apiiro');\n const body: any = {};\n\n if (repositoryKey) {\n body.repositoryKey = repositoryKey;\n }\n\n if (entityRef) {\n body.entityRef = entityRef;\n }\n\n return await post<SlaBreachSuccessResponseData>(\n fetchApi,\n `${url}/sla-breach`,\n {\n signal,\n body,\n },\n );\n};\n\nexport function useSlaBreachData({\n fetchApi,\n connectApi,\n repositoryKey,\n entityRef,\n}: Omit<Query, 'signal'> & { repositoryKey?: string; entityRef?: string }) {\n const {\n data: slaBreachData,\n error: slaBreachDataError,\n isLoading: slaBreachDataLoading,\n } = useQuery({\n queryKey: [SLA_BREACH_QUERY_KEY.GET_SLA_BREACH, repositoryKey, entityRef],\n queryFn: ({ signal }) =>\n repositoryKey || entityRef\n ? getSlaBreachData({\n fetchApi,\n signal,\n connectApi,\n repositoryKey,\n entityRef,\n })\n : Promise.resolve([]),\n enabled: !!(repositoryKey || entityRef),\n });\n\n return {\n slaBreachData,\n slaBreachDataError,\n slaBreachDataLoading,\n };\n}\n"],"names":[],"mappings":";;;AAuBA,MAAM,mBAAmB,OAAO;AAAA,EAC9B,QAAA;AAAA,EACA,MAAA;AAAA,EACA,UAAA;AAAA,EACA,aAAA;AAAA,EACA;AACF,CAAA,KAA8D;AAC5D,EAAA,MAAM,GAAA,GAAM,MAAM,UAAA,CAAW,YAAA,CAAa,WAAW,QAAQ,CAAA;AAC7D,EAAA,MAAM,OAAY,EAAC;AAEnB,EAAA,IAAI,aAAA,EAAe;AACjB,IAAA,IAAA,CAAK,aAAA,GAAgB,aAAA;AAAA,EACvB;AAEA,EAAA,IAAI,SAAA,EAAW;AACb,IAAA,IAAA,CAAK,SAAA,GAAY,SAAA;AAAA,EACnB;AAEA,EAAA,OAAO,MAAM,IAAA;AAAA,IACX,QAAA;AAAA,IACA,GAAG,GAAG,CAAA,WAAA,CAAA;AAAA,IACN;AAAA,MACE,MAAA;AAAA,MACA;AAAA;AACF,GACF;AACF,CAAA;AAEO,SAAS,gBAAA,CAAiB;AAAA,EAC/B,QAAA;AAAA,EACA,UAAA;AAAA,EACA,aAAA;AAAA,EACA;AACF,CAAA,EAA2E;AACzE,EAAA,MAAM;AAAA,IACJ,IAAA,EAAM,aAAA;AAAA,IACN,KAAA,EAAO,kBAAA;AAAA,IACP,SAAA,EAAW;AAAA,MACT,QAAA,CAAS;AAAA,IACX,QAAA,EAAU,CAAC,gBAAA,uBAAqC,aAAA,EAAe,SAAS,CAAA;AAAA,IACxE,SAAS,CAAC,EAAE,QAAO,KACjB,aAAA,IAAiB,YACb,gBAAA,CAAiB;AAAA,MACf,QAAA;AAAA,MACA,MAAA;AAAA,MACA,UAAA;AAAA,MACA,aAAA;AAAA,MACA;AAAA,KACD,CAAA,GACD,OAAA,CAAQ,OAAA,CAAQ,EAAE,CAAA;AAAA,IACxB,OAAA,EAAS,CAAC,EAAE,aAAA,IAAiB,SAAA;AAAA,GAC9B,CAAA;AAED,EAAA,OAAO;AAAA,IACL,aAAA;AAAA,IACA,kBAAA;AAAA,IACA;AAAA,GACF;AACF;;;;"}
|