@backstage-community/plugin-apiiro 0.1.0 → 1.0.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 +23 -0
- package/README.md +91 -12
- package/config.d.ts +14 -0
- package/dist/App.esm.js +96 -4
- package/dist/App.esm.js.map +1 -1
- package/dist/api/index.esm.js +6 -0
- package/dist/api/index.esm.js.map +1 -1
- package/dist/assets/SettingIcon.esm.js +1 -0
- package/dist/assets/SettingIcon.esm.js.map +1 -1
- package/dist/components/ApiiroSidebar.esm.js.map +1 -1
- package/dist/components/CalendarDatePicker.esm.js.map +1 -1
- package/dist/components/DataGrid/DataGrid.esm.js +1 -0
- package/dist/components/DataGrid/DataGrid.esm.js.map +1 -1
- package/dist/components/MetricsGroup/TabMetricsGroup.esm.js +28 -4
- package/dist/components/MetricsGroup/TabMetricsGroup.esm.js.map +1 -1
- package/dist/components/MetricsGroup/WidgetMetricsGroup.esm.js +30 -7
- package/dist/components/MetricsGroup/WidgetMetricsGroup.esm.js.map +1 -1
- package/dist/components/RiskLevel.esm.js +1 -0
- package/dist/components/RiskLevel.esm.js.map +1 -1
- package/dist/components/charts/GaugeChart.esm.js +8 -6
- package/dist/components/charts/GaugeChart.esm.js.map +1 -1
- package/dist/components/common/StatusContainer.esm.js +123 -0
- package/dist/components/common/StatusContainer.esm.js.map +1 -0
- package/dist/components/filters/DiscoveredOnFilter.esm.js +1 -1
- package/dist/components/filters/DiscoveredOnFilter.esm.js.map +1 -1
- package/dist/components/tiles/MttrVsSLATile.esm.js +31 -14
- package/dist/components/tiles/MttrVsSLATile.esm.js.map +1 -1
- package/dist/components/tiles/RiskOverTimeTile.esm.js +15 -12
- package/dist/components/tiles/RiskOverTimeTile.esm.js.map +1 -1
- package/dist/components/tiles/SLAAdherenceTile.esm.js +15 -12
- package/dist/components/tiles/SLAAdherenceTile.esm.js.map +1 -1
- package/dist/components/tiles/StatusTile.esm.js +98 -66
- package/dist/components/tiles/StatusTile.esm.js.map +1 -1
- package/dist/components/tiles/TopLanguagesTile.esm.js +1 -0
- package/dist/components/tiles/TopLanguagesTile.esm.js.map +1 -1
- package/dist/components/tiles/TopRiskTile.esm.js +19 -16
- package/dist/components/tiles/TopRiskTile.esm.js.map +1 -1
- package/dist/index.d.ts +31 -6
- package/dist/index.esm.js +2 -1
- package/dist/index.esm.js.map +1 -1
- package/dist/pages/Applications/Applications.esm.js +104 -0
- package/dist/pages/Applications/Applications.esm.js.map +1 -0
- package/dist/pages/Applications/tableConfig.esm.js +147 -0
- package/dist/pages/Applications/tableConfig.esm.js.map +1 -0
- package/dist/pages/Repositories/Repositories.esm.js +26 -26
- package/dist/pages/Repositories/Repositories.esm.js.map +1 -1
- package/dist/pages/Repositories/tableConfig.esm.js +3 -2
- package/dist/pages/Repositories/tableConfig.esm.js.map +1 -1
- package/dist/pages/Risks/Risks.esm.js +9 -3
- package/dist/pages/Risks/Risks.esm.js.map +1 -1
- package/dist/pages/Risks/tableConfig.esm.js +25 -11
- package/dist/pages/Risks/tableConfig.esm.js.map +1 -1
- package/dist/pages/tab/ComponentTab.esm.js +72 -0
- package/dist/pages/tab/ComponentTab.esm.js.map +1 -0
- package/dist/pages/tab/SystemTab.esm.js +159 -0
- package/dist/pages/tab/SystemTab.esm.js.map +1 -0
- package/dist/pages/tab/TabProvider.esm.js +9 -3
- package/dist/pages/tab/TabProvider.esm.js.map +1 -1
- package/dist/pages/widget/ComponentWidget.esm.js +67 -0
- package/dist/pages/widget/ComponentWidget.esm.js.map +1 -0
- package/dist/pages/widget/SystemWidget.esm.js +81 -0
- package/dist/pages/widget/SystemWidget.esm.js.map +1 -0
- package/dist/pages/widget/WidgetProvider.esm.js +9 -3
- package/dist/pages/widget/WidgetProvider.esm.js.map +1 -1
- package/dist/plugin.esm.js.map +1 -1
- package/dist/queries/application.queries.esm.js +64 -0
- package/dist/queries/application.queries.esm.js.map +1 -0
- package/dist/queries/mttr-statistics.queries.esm.js +19 -12
- package/dist/queries/mttr-statistics.queries.esm.js.map +1 -1
- package/dist/queries/repository.queries.esm.js +19 -8
- package/dist/queries/repository.queries.esm.js.map +1 -1
- package/dist/queries/risk-score-over-time.queries.esm.js +19 -12
- package/dist/queries/risk-score-over-time.queries.esm.js.map +1 -1
- package/dist/queries/risks.queries.esm.js +19 -7
- package/dist/queries/risks.queries.esm.js.map +1 -1
- package/dist/queries/sla-breach.queries.esm.js +22 -11
- package/dist/queries/sla-breach.queries.esm.js.map +1 -1
- package/dist/queries/top-risks.queries.esm.js +19 -7
- package/dist/queries/top-risks.queries.esm.js.map +1 -1
- package/dist/theme/themeUtils.esm.js +5 -2
- package/dist/theme/themeUtils.esm.js.map +1 -1
- package/dist/utils/utils.esm.js +3 -2
- package/dist/utils/utils.esm.js.map +1 -1
- package/package.json +12 -12
- package/dist/pages/tab/Tab.esm.js +0 -147
- package/dist/pages/tab/Tab.esm.js.map +0 -1
- package/dist/pages/widget/Widget.esm.js +0 -161
- package/dist/pages/widget/Widget.esm.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Risks.esm.js","sources":["../../../src/pages/Risks/Risks.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 { useMemo, useRef, useState } from 'react';\n\nimport { fetchApiRef, useApi } from '@backstage/core-plugin-api';\nimport { apiiroApiRef } from '../../api';\nimport { DataGrid } from '../../components/DataGrid';\nimport { useUrlFilters } from '../../hooks';\nimport {\n createDefaultQuickRanges,\n CalendarQuickRange,\n CalendarDateValue,\n DiscoveredOnFilter,\n FilterDropdown,\n RiskInsightFilter,\n RiskInsightOption,\n RiskLevel,\n} from '../../components';\nimport { ErrorSnackbar } from '../../components/common/ErrorSnackbar';\nimport { useRisksData } from '../../queries';\nimport {\n useFilterOptionsData,\n FilterDefinition,\n} from '../../queries/filterOptions.queries';\nimport { columnVisibilityModal, risksColumns } from './tableConfig';\nimport Box from '@mui/material/Box';\n\n// Helper function to format date without timezone conversion\nconst formatDateForAPI = (date: Date): string => {\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, '0');\n const day = String(date.getDate()).padStart(2, '0');\n return `${year}-${month}-${day}`;\n};\n\n// Helper functions to transform API data to component format\nconst transformToDropdownOptions = (filterDef: FilterDefinition) => {\n return filterDef.filterOptions.map(option => ({\n value: option.name,\n label: option.displayName,\n }));\n};\n\nconst transformToRiskLevelOptions = (filterDef: FilterDefinition) => {\n return filterDef.filterOptions.map(option => ({\n value: option.name,\n label: option.displayName,\n icon: <RiskLevel level={option.name as any} iconSize=\"large\" />,\n }));\n};\n\nconst transformToRiskInsightOptions = (\n filterDef: FilterDefinition,\n): RiskInsightOption[] => {\n return filterDef.filterOptions.map(option => ({\n name: option.name,\n displayName: option.displayName,\n description: option.displayName, // Use displayName as description fallback\n sentiment: 'Neutral' as const,\n sortOrder: option.sortOrder,\n group: option.group || 'General',\n groupOrder: option.groupOrder,\n }));\n};\n\n// Constants to prevent recreation on every render\nconst INITIAL_SORTING = [\n {\n field: 'riskLevel',\n sort: 'desc' as const,\n },\n];\n\nconst PAGE_SIZE_OPTIONS = [10, 20, 50, 100];\n\nconst DATA_GRID_FEATURES = {\n quickSearch: true,\n columnPinning: true,\n columnReordering: true,\n customPagination: true,\n columnMenu: true,\n persistLayout: true,\n} as const;\n\nexport const Risks = ({\n repoId,\n entityRef,\n}: {\n repoId: string | undefined;\n entityRef: string;\n}) => {\n const connectBackendApi = useApi(apiiroApiRef);\n const { fetch } = useApi(fetchApiRef);\n const quickRanges = useMemo(() => createDefaultQuickRanges(), []);\n\n // Use URL filters hook\n const {\n filters,\n setRiskCategoryFilter,\n setRiskLevelFilter,\n setFindingCategoryFilter,\n setRiskInsightFilter,\n setDiscoveredOnRange,\n setSelectedPreset,\n } = useUrlFilters();\n\n // Extract filter values from the hook\n const riskCategoryFilter = filters.riskCategory;\n const riskLevelFilter = filters.riskLevel;\n const findingCategoryFilter = filters.findingCategory;\n const riskInsightFilter = filters.riskInsight;\n const discoveredOnRange = filters.discoveredOnRange;\n const selectedPreset = filters.selectedPreset;\n\n const [isPresetSelection, setIsPresetSelection] = useState(false);\n const presetSelectionRef = useRef(false);\n\n // Fetch filter options from API\n const {\n filterOptionsData,\n filterOptionsDataLoading,\n filterOptionsDataError,\n } = useFilterOptionsData({\n connectApi: connectBackendApi,\n fetchApi: fetch,\n });\n\n // Transform API data to component format\n const riskCategoryOptions = useMemo(() => {\n const filterDef = filterOptionsData?.find(f => f.name === 'RiskCategory');\n return filterDef ? transformToDropdownOptions(filterDef) : [];\n }, [filterOptionsData]);\n\n const riskLevelOptions = useMemo(() => {\n const filterDef = filterOptionsData?.find(f => f.name === 'RiskLevel');\n return filterDef ? transformToRiskLevelOptions(filterDef) : [];\n }, [filterOptionsData]);\n\n const findingCategoryOptions = useMemo(() => {\n const filterDef = filterOptionsData?.find(\n f => f.name === 'FindingCategory',\n );\n return filterDef ? transformToDropdownOptions(filterDef) : [];\n }, [filterOptionsData]);\n\n const riskInsightOptions = useMemo(() => {\n const filterDef = filterOptionsData?.find(f => f.name === 'RiskInsight');\n return filterDef ? transformToRiskInsightOptions(filterDef) : [];\n }, [filterOptionsData]);\n\n const { risksData, risksDataLoading, risksDataError } = useRisksData({\n connectApi: connectBackendApi,\n fetchApi: fetch,\n repositoryKey: repoId!,\n entityRef: entityRef,\n filters: {\n ...(riskCategoryFilter.length > 0 && {\n RiskCategory: riskCategoryFilter,\n }),\n ...(riskLevelFilter.length > 0 && { RiskLevel: riskLevelFilter }),\n ...(findingCategoryFilter.length > 0 && {\n FindingCategory: findingCategoryFilter,\n }),\n ...(riskInsightFilter.length > 0 && { RiskInsight: riskInsightFilter }),\n ...(Array.isArray(discoveredOnRange) &&\n discoveredOnRange[0] instanceof Date &&\n discoveredOnRange[1] instanceof Date && {\n DiscoveredOn: {\n start: formatDateForAPI(discoveredOnRange[0]),\n end: formatDateForAPI(discoveredOnRange[1]),\n },\n }),\n },\n });\n\n // Memoize rows to prevent unnecessary re-renders that cause pagination flickering\n const rows = useMemo(() => risksData?.risks || [], [risksData?.risks]);\n\n const handlePresetSelect = (range: CalendarQuickRange) => {\n setIsPresetSelection(true);\n presetSelectionRef.current = true;\n setSelectedPreset(range.value);\n const nextValue = range.getRange();\n setDiscoveredOnRange(nextValue ?? []);\n };\n\n const handleCalendarChange = (value: CalendarDateValue) => {\n if (isPresetSelection || presetSelectionRef.current) {\n setIsPresetSelection(false);\n presetSelectionRef.current = false;\n return;\n }\n setDiscoveredOnRange(value);\n setSelectedPreset('');\n };\n\n return (\n <>\n <DataGrid<any>\n getRowId={row => row.id}\n loading={risksDataLoading}\n tableKey=\"risks\"\n columns={risksColumns}\n rows={rows}\n dataLabel=\"risks\"\n searchBarPlaceHolder=\"Search risk name...\"\n customFilters={\n <Box sx={{ display: 'flex', gap: 1, flexWrap: 'wrap' }}>\n <FilterDropdown\n label=\"Risk category\"\n options={riskCategoryOptions}\n selectedValues={riskCategoryFilter}\n onChange={setRiskCategoryFilter}\n loading={filterOptionsDataLoading}\n />\n <FilterDropdown\n label=\"Risk level\"\n options={riskLevelOptions}\n selectedValues={riskLevelFilter}\n onChange={setRiskLevelFilter}\n loading={filterOptionsDataLoading}\n />\n <FilterDropdown\n label=\"Finding category\"\n options={findingCategoryOptions}\n selectedValues={findingCategoryFilter}\n onChange={setFindingCategoryFilter}\n loading={filterOptionsDataLoading}\n />\n <RiskInsightFilter\n label=\"Insights\"\n options={riskInsightOptions}\n selectedValues={riskInsightFilter}\n onChange={setRiskInsightFilter}\n loading={filterOptionsDataLoading}\n />\n <DiscoveredOnFilter\n value={discoveredOnRange}\n onChange={handleCalendarChange}\n selectedQuickRange={selectedPreset}\n onQuickRangeSelect={handlePresetSelect}\n quickRanges={quickRanges}\n loading={filterOptionsDataLoading}\n />\n </Box>\n }\n features={DATA_GRID_FEATURES}\n initialState={{\n sorting: {\n sortModel: INITIAL_SORTING,\n },\n }}\n initialPageSize={PAGE_SIZE_OPTIONS[0]}\n pageSizeOptions={PAGE_SIZE_OPTIONS}\n columnVisibility={columnVisibilityModal}\n />\n\n <ErrorSnackbar error={risksDataError} />\n <ErrorSnackbar error={filterOptionsDataError} />\n </>\n );\n};\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Risks.esm.js","sources":["../../../src/pages/Risks/Risks.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 { useMemo, useRef, useState } from 'react';\n\nimport { fetchApiRef, useApi } from '@backstage/core-plugin-api';\nimport { apiiroApiRef } from '../../api';\nimport { DataGrid } from '../../components/DataGrid';\nimport { useUrlFilters } from '../../hooks';\nimport {\n createDefaultQuickRanges,\n CalendarQuickRange,\n CalendarDateValue,\n DiscoveredOnFilter,\n FilterDropdown,\n RiskInsightFilter,\n RiskInsightOption,\n RiskLevel,\n} from '../../components';\nimport { ErrorSnackbar } from '../../components/common/ErrorSnackbar';\nimport { useRisksData } from '../../queries';\nimport {\n useFilterOptionsData,\n FilterDefinition,\n} from '../../queries/filterOptions.queries';\nimport { columnVisibilityModal, getRisksColumns } from './tableConfig';\nimport Box from '@mui/material/Box';\n\n// Helper function to format date without timezone conversion\nconst formatDateForAPI = (date: Date): string => {\n const year = date.getFullYear();\n const month = String(date.getMonth() + 1).padStart(2, '0');\n const day = String(date.getDate()).padStart(2, '0');\n return `${year}-${month}-${day}`;\n};\n\n// Helper functions to transform API data to component format\nconst transformToDropdownOptions = (filterDef: FilterDefinition) => {\n return filterDef.filterOptions.map(option => ({\n value: option.name,\n label: option.displayName,\n }));\n};\n\nconst transformToRiskLevelOptions = (filterDef: FilterDefinition) => {\n return filterDef.filterOptions.map(option => ({\n value: option.name,\n label: option.displayName,\n icon: <RiskLevel level={option.name as any} iconSize=\"large\" />,\n }));\n};\n\nconst transformToRiskInsightOptions = (\n filterDef: FilterDefinition,\n): RiskInsightOption[] => {\n return filterDef.filterOptions.map(option => ({\n name: option.name,\n displayName: option.displayName,\n description: option.displayName, // Use displayName as description fallback\n sentiment: 'Neutral' as const,\n sortOrder: option.sortOrder,\n group: option.group || 'General',\n groupOrder: option.groupOrder,\n }));\n};\n\n// Constants to prevent recreation on every render\nconst INITIAL_SORTING = [\n {\n field: 'riskLevel',\n sort: 'desc' as const,\n },\n];\n\nconst PAGE_SIZE_OPTIONS = [10, 20, 50, 100];\n\nconst DATA_GRID_FEATURES = {\n quickSearch: true,\n columnPinning: true,\n columnReordering: true,\n customPagination: true,\n columnMenu: true,\n persistLayout: true,\n} as const;\n\nexport const Risks = ({\n repoId,\n entityRef,\n applicationId,\n}: {\n repoId?: string;\n entityRef: string;\n applicationId?: string;\n}) => {\n const connectBackendApi = useApi(apiiroApiRef);\n const { fetch } = useApi(fetchApiRef);\n const quickRanges = useMemo(() => createDefaultQuickRanges(), []);\n\n // Use URL filters hook\n const {\n filters,\n setRiskCategoryFilter,\n setRiskLevelFilter,\n setFindingCategoryFilter,\n setRiskInsightFilter,\n setDiscoveredOnRange,\n setSelectedPreset,\n } = useUrlFilters();\n\n // Extract filter values from the hook\n const riskCategoryFilter = filters.riskCategory;\n const riskLevelFilter = filters.riskLevel;\n const findingCategoryFilter = filters.findingCategory;\n const riskInsightFilter = filters.riskInsight;\n const discoveredOnRange = filters.discoveredOnRange;\n const selectedPreset = filters.selectedPreset;\n\n const [isPresetSelection, setIsPresetSelection] = useState(false);\n const presetSelectionRef = useRef(false);\n\n // Fetch filter options from API\n const {\n filterOptionsData,\n filterOptionsDataLoading,\n filterOptionsDataError,\n } = useFilterOptionsData({\n connectApi: connectBackendApi,\n fetchApi: fetch,\n });\n\n // Transform API data to component format\n const riskCategoryOptions = useMemo(() => {\n const filterDef = filterOptionsData?.find(f => f.name === 'RiskCategory');\n return filterDef ? transformToDropdownOptions(filterDef) : [];\n }, [filterOptionsData]);\n\n const riskLevelOptions = useMemo(() => {\n const filterDef = filterOptionsData?.find(f => f.name === 'RiskLevel');\n return filterDef ? transformToRiskLevelOptions(filterDef) : [];\n }, [filterOptionsData]);\n\n const findingCategoryOptions = useMemo(() => {\n const filterDef = filterOptionsData?.find(\n f => f.name === 'FindingCategory',\n );\n return filterDef ? transformToDropdownOptions(filterDef) : [];\n }, [filterOptionsData]);\n\n const riskInsightOptions = useMemo(() => {\n const filterDef = filterOptionsData?.find(f => f.name === 'RiskInsight');\n return filterDef ? transformToRiskInsightOptions(filterDef) : [];\n }, [filterOptionsData]);\n\n const { risksData, risksDataLoading, risksDataError } = useRisksData({\n connectApi: connectBackendApi,\n fetchApi: fetch,\n repositoryId: repoId,\n entityRef: entityRef,\n applicationId: applicationId,\n filters: {\n ...(riskCategoryFilter.length > 0 && {\n RiskCategory: riskCategoryFilter,\n }),\n ...(riskLevelFilter.length > 0 && { RiskLevel: riskLevelFilter }),\n ...(findingCategoryFilter.length > 0 && {\n FindingCategory: findingCategoryFilter,\n }),\n ...(riskInsightFilter.length > 0 && { RiskInsight: riskInsightFilter }),\n ...(Array.isArray(discoveredOnRange) &&\n discoveredOnRange[0] instanceof Date &&\n discoveredOnRange[1] instanceof Date && {\n DiscoveredOn: {\n start: formatDateForAPI(discoveredOnRange[0]),\n end: formatDateForAPI(discoveredOnRange[1]),\n },\n }),\n },\n });\n\n // Memoize rows to prevent unnecessary re-renders that cause pagination flickering\n const rows = useMemo(() => risksData?.risks || [], [risksData?.risks]);\n\n const risksColumns = useMemo(\n () => getRisksColumns(connectBackendApi, repoId, applicationId),\n [connectBackendApi, repoId, applicationId],\n );\n\n const handlePresetSelect = (range: CalendarQuickRange) => {\n setIsPresetSelection(true);\n presetSelectionRef.current = true;\n setSelectedPreset(range.value);\n const nextValue = range.getRange();\n setDiscoveredOnRange(nextValue ?? []);\n };\n\n const handleCalendarChange = (value: CalendarDateValue) => {\n if (isPresetSelection || presetSelectionRef.current) {\n setIsPresetSelection(false);\n presetSelectionRef.current = false;\n return;\n }\n setDiscoveredOnRange(value);\n setSelectedPreset('');\n };\n\n return (\n <>\n <DataGrid<any>\n getRowId={row => row.id}\n loading={risksDataLoading}\n tableKey=\"risks\"\n columns={risksColumns}\n rows={rows}\n dataLabel=\"risks\"\n searchBarPlaceHolder=\"Search risk name...\"\n customFilters={\n <Box sx={{ display: 'flex', gap: 1, flexWrap: 'wrap' }}>\n <FilterDropdown\n label=\"Risk category\"\n options={riskCategoryOptions}\n selectedValues={riskCategoryFilter}\n onChange={setRiskCategoryFilter}\n loading={filterOptionsDataLoading}\n />\n <FilterDropdown\n label=\"Risk level\"\n options={riskLevelOptions}\n selectedValues={riskLevelFilter}\n onChange={setRiskLevelFilter}\n loading={filterOptionsDataLoading}\n />\n <FilterDropdown\n label=\"Finding category\"\n options={findingCategoryOptions}\n selectedValues={findingCategoryFilter}\n onChange={setFindingCategoryFilter}\n loading={filterOptionsDataLoading}\n />\n <RiskInsightFilter\n label=\"Insights\"\n options={riskInsightOptions}\n selectedValues={riskInsightFilter}\n onChange={setRiskInsightFilter}\n loading={filterOptionsDataLoading}\n />\n <DiscoveredOnFilter\n value={discoveredOnRange}\n onChange={handleCalendarChange}\n selectedQuickRange={selectedPreset}\n onQuickRangeSelect={handlePresetSelect}\n quickRanges={quickRanges}\n loading={filterOptionsDataLoading}\n />\n </Box>\n }\n features={DATA_GRID_FEATURES}\n initialState={{\n sorting: {\n sortModel: INITIAL_SORTING,\n },\n }}\n initialPageSize={PAGE_SIZE_OPTIONS[0]}\n pageSizeOptions={PAGE_SIZE_OPTIONS}\n columnVisibility={columnVisibilityModal}\n />\n\n <ErrorSnackbar error={risksDataError} />\n <ErrorSnackbar error={filterOptionsDataError} />\n </>\n );\n};\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyCA,MAAM,gBAAA,GAAmB,CAAC,IAAA,KAAuB;AAC/C,EAAA,MAAM,IAAA,GAAO,KAAK,WAAA,EAAY;AAC9B,EAAA,MAAM,KAAA,GAAQ,OAAO,IAAA,CAAK,QAAA,KAAa,CAAC,CAAA,CAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAA;AACzD,EAAA,MAAM,GAAA,GAAM,OAAO,IAAA,CAAK,OAAA,EAAS,CAAA,CAAE,QAAA,CAAS,GAAG,GAAG,CAAA;AAClD,EAAA,OAAO,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,KAAK,IAAI,GAAG,CAAA,CAAA;AAChC,CAAA;AAGA,MAAM,0BAAA,GAA6B,CAAC,SAAA,KAAgC;AAClE,EAAA,OAAO,SAAA,CAAU,aAAA,CAAc,GAAA,CAAI,CAAA,MAAA,MAAW;AAAA,IAC5C,OAAO,MAAA,CAAO,IAAA;AAAA,IACd,OAAO,MAAA,CAAO;AAAA,GAChB,CAAE,CAAA;AACJ,CAAA;AAEA,MAAM,2BAAA,GAA8B,CAAC,SAAA,KAAgC;AACnE,EAAA,OAAO,SAAA,CAAU,aAAA,CAAc,GAAA,CAAI,CAAA,MAAA,MAAW;AAAA,IAC5C,OAAO,MAAA,CAAO,IAAA;AAAA,IACd,OAAO,MAAA,CAAO,WAAA;AAAA,IACd,sBAAM,GAAA,CAAC,SAAA,EAAA,EAAU,OAAO,MAAA,CAAO,IAAA,EAAa,UAAS,OAAA,EAAQ;AAAA,GAC/D,CAAE,CAAA;AACJ,CAAA;AAEA,MAAM,6BAAA,GAAgC,CACpC,SAAA,KACwB;AACxB,EAAA,OAAO,SAAA,CAAU,aAAA,CAAc,GAAA,CAAI,CAAA,MAAA,MAAW;AAAA,IAC5C,MAAM,MAAA,CAAO,IAAA;AAAA,IACb,aAAa,MAAA,CAAO,WAAA;AAAA,IACpB,aAAa,MAAA,CAAO,WAAA;AAAA;AAAA,IACpB,SAAA,EAAW,SAAA;AAAA,IACX,WAAW,MAAA,CAAO,SAAA;AAAA,IAClB,KAAA,EAAO,OAAO,KAAA,IAAS,SAAA;AAAA,IACvB,YAAY,MAAA,CAAO;AAAA,GACrB,CAAE,CAAA;AACJ,CAAA;AAGA,MAAM,eAAA,GAAkB;AAAA,EACtB;AAAA,IACE,KAAA,EAAO,WAAA;AAAA,IACP,IAAA,EAAM;AAAA;AAEV,CAAA;AAEA,MAAM,iBAAA,GAAoB,CAAC,EAAA,EAAI,EAAA,EAAI,IAAI,GAAG,CAAA;AAE1C,MAAM,kBAAA,GAAqB;AAAA,EACzB,WAAA,EAAa,IAAA;AAAA,EACb,aAAA,EAAe,IAAA;AAAA,EACf,gBAAA,EAAkB,IAAA;AAAA,EAClB,gBAAA,EAAkB,IAAA;AAAA,EAClB,UAAA,EAAY,IAAA;AAAA,EACZ,aAAA,EAAe;AACjB,CAAA;AAEO,MAAM,QAAQ,CAAC;AAAA,EACpB,MAAA;AAAA,EACA,SAAA;AAAA,EACA;AACF,CAAA,KAIM;AACJ,EAAA,MAAM,iBAAA,GAAoB,OAAO,YAAY,CAAA;AAC7C,EAAA,MAAM,EAAE,KAAA,EAAM,GAAI,MAAA,CAAO,WAAW,CAAA;AACpC,EAAA,MAAM,cAAc,OAAA,CAAQ,MAAM,wBAAA,EAAyB,EAAG,EAAE,CAAA;AAGhE,EAAA,MAAM;AAAA,IACJ,OAAA;AAAA,IACA,qBAAA;AAAA,IACA,kBAAA;AAAA,IACA,wBAAA;AAAA,IACA,oBAAA;AAAA,IACA,oBAAA;AAAA,IACA;AAAA,MACE,aAAA,EAAc;AAGlB,EAAA,MAAM,qBAAqB,OAAA,CAAQ,YAAA;AACnC,EAAA,MAAM,kBAAkB,OAAA,CAAQ,SAAA;AAChC,EAAA,MAAM,wBAAwB,OAAA,CAAQ,eAAA;AACtC,EAAA,MAAM,oBAAoB,OAAA,CAAQ,WAAA;AAClC,EAAA,MAAM,oBAAoB,OAAA,CAAQ,iBAAA;AAClC,EAAA,MAAM,iBAAiB,OAAA,CAAQ,cAAA;AAE/B,EAAA,MAAM,CAAC,iBAAA,EAAmB,oBAAoB,CAAA,GAAI,SAAS,KAAK,CAAA;AAChE,EAAA,MAAM,kBAAA,GAAqB,OAAO,KAAK,CAAA;AAGvC,EAAA,MAAM;AAAA,IACJ,iBAAA;AAAA,IACA,wBAAA;AAAA,IACA;AAAA,MACE,oBAAA,CAAqB;AAAA,IACvB,UAAA,EAAY,iBAAA;AAAA,IACZ,QAAA,EAAU;AAAA,GACX,CAAA;AAGD,EAAA,MAAM,mBAAA,GAAsB,QAAQ,MAAM;AACxC,IAAA,MAAM,YAAY,iBAAA,EAAmB,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,SAAS,cAAc,CAAA;AACxE,IAAA,OAAO,SAAA,GAAY,0BAAA,CAA2B,SAAS,CAAA,GAAI,EAAC;AAAA,EAC9D,CAAA,EAAG,CAAC,iBAAiB,CAAC,CAAA;AAEtB,EAAA,MAAM,gBAAA,GAAmB,QAAQ,MAAM;AACrC,IAAA,MAAM,YAAY,iBAAA,EAAmB,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,SAAS,WAAW,CAAA;AACrE,IAAA,OAAO,SAAA,GAAY,2BAAA,CAA4B,SAAS,CAAA,GAAI,EAAC;AAAA,EAC/D,CAAA,EAAG,CAAC,iBAAiB,CAAC,CAAA;AAEtB,EAAA,MAAM,sBAAA,GAAyB,QAAQ,MAAM;AAC3C,IAAA,MAAM,YAAY,iBAAA,EAAmB,IAAA;AAAA,MACnC,CAAA,CAAA,KAAK,EAAE,IAAA,KAAS;AAAA,KAClB;AACA,IAAA,OAAO,SAAA,GAAY,0BAAA,CAA2B,SAAS,CAAA,GAAI,EAAC;AAAA,EAC9D,CAAA,EAAG,CAAC,iBAAiB,CAAC,CAAA;AAEtB,EAAA,MAAM,kBAAA,GAAqB,QAAQ,MAAM;AACvC,IAAA,MAAM,YAAY,iBAAA,EAAmB,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,SAAS,aAAa,CAAA;AACvE,IAAA,OAAO,SAAA,GAAY,6BAAA,CAA8B,SAAS,CAAA,GAAI,EAAC;AAAA,EACjE,CAAA,EAAG,CAAC,iBAAiB,CAAC,CAAA;AAEtB,EAAA,MAAM,EAAE,SAAA,EAAW,gBAAA,EAAkB,cAAA,KAAmB,YAAA,CAAa;AAAA,IACnE,UAAA,EAAY,iBAAA;AAAA,IACZ,QAAA,EAAU,KAAA;AAAA,IACV,YAAA,EAAc,MAAA;AAAA,IACd,SAAA;AAAA,IACA,aAAA;AAAA,IACA,OAAA,EAAS;AAAA,MACP,GAAI,kBAAA,CAAmB,MAAA,GAAS,CAAA,IAAK;AAAA,QACnC,YAAA,EAAc;AAAA,OAChB;AAAA,MACA,GAAI,eAAA,CAAgB,MAAA,GAAS,CAAA,IAAK,EAAE,WAAW,eAAA,EAAgB;AAAA,MAC/D,GAAI,qBAAA,CAAsB,MAAA,GAAS,CAAA,IAAK;AAAA,QACtC,eAAA,EAAiB;AAAA,OACnB;AAAA,MACA,GAAI,iBAAA,CAAkB,MAAA,GAAS,CAAA,IAAK,EAAE,aAAa,iBAAA,EAAkB;AAAA,MACrE,GAAI,KAAA,CAAM,OAAA,CAAQ,iBAAiB,CAAA,IACjC,iBAAA,CAAkB,CAAC,CAAA,YAAa,IAAA,IAChC,iBAAA,CAAkB,CAAC,CAAA,YAAa,IAAA,IAAQ;AAAA,QACtC,YAAA,EAAc;AAAA,UACZ,KAAA,EAAO,gBAAA,CAAiB,iBAAA,CAAkB,CAAC,CAAC,CAAA;AAAA,UAC5C,GAAA,EAAK,gBAAA,CAAiB,iBAAA,CAAkB,CAAC,CAAC;AAAA;AAC5C;AACF;AACJ,GACD,CAAA;AAGD,EAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,MAAM,SAAA,EAAW,KAAA,IAAS,EAAC,EAAG,CAAC,SAAA,EAAW,KAAK,CAAC,CAAA;AAErE,EAAA,MAAM,YAAA,GAAe,OAAA;AAAA,IACnB,MAAM,eAAA,CAAgB,iBAAA,EAAmB,MAAA,EAAQ,aAAa,CAAA;AAAA,IAC9D,CAAC,iBAAA,EAAmB,MAAA,EAAQ,aAAa;AAAA,GAC3C;AAEA,EAAA,MAAM,kBAAA,GAAqB,CAAC,KAAA,KAA8B;AACxD,IAAA,oBAAA,CAAqB,IAAI,CAAA;AACzB,IAAA,kBAAA,CAAmB,OAAA,GAAU,IAAA;AAC7B,IAAA,iBAAA,CAAkB,MAAM,KAAK,CAAA;AAC7B,IAAA,MAAM,SAAA,GAAY,MAAM,QAAA,EAAS;AACjC,IAAA,oBAAA,CAAqB,SAAA,IAAa,EAAE,CAAA;AAAA,EACtC,CAAA;AAEA,EAAA,MAAM,oBAAA,GAAuB,CAAC,KAAA,KAA6B;AACzD,IAAA,IAAI,iBAAA,IAAqB,mBAAmB,OAAA,EAAS;AACnD,MAAA,oBAAA,CAAqB,KAAK,CAAA;AAC1B,MAAA,kBAAA,CAAmB,OAAA,GAAU,KAAA;AAC7B,MAAA;AAAA,IACF;AACA,IAAA,oBAAA,CAAqB,KAAK,CAAA;AAC1B,IAAA,iBAAA,CAAkB,EAAE,CAAA;AAAA,EACtB,CAAA;AAEA,EAAA,uBACE,IAAA,CAAA,QAAA,EAAA,EACE,QAAA,EAAA;AAAA,oBAAA,GAAA;AAAA,MAAC,QAAA;AAAA,MAAA;AAAA,QACC,QAAA,EAAU,SAAO,GAAA,CAAI,EAAA;AAAA,QACrB,OAAA,EAAS,gBAAA;AAAA,QACT,QAAA,EAAS,OAAA;AAAA,QACT,OAAA,EAAS,YAAA;AAAA,QACT,IAAA;AAAA,QACA,SAAA,EAAU,OAAA;AAAA,QACV,oBAAA,EAAqB,qBAAA;AAAA,QACrB,aAAA,kBACE,IAAA,CAAC,GAAA,EAAA,EAAI,EAAA,EAAI,EAAE,OAAA,EAAS,MAAA,EAAQ,GAAA,EAAK,CAAA,EAAG,QAAA,EAAU,MAAA,EAAO,EACnD,QAAA,EAAA;AAAA,0BAAA,GAAA;AAAA,YAAC,cAAA;AAAA,YAAA;AAAA,cACC,KAAA,EAAM,eAAA;AAAA,cACN,OAAA,EAAS,mBAAA;AAAA,cACT,cAAA,EAAgB,kBAAA;AAAA,cAChB,QAAA,EAAU,qBAAA;AAAA,cACV,OAAA,EAAS;AAAA;AAAA,WACX;AAAA,0BACA,GAAA;AAAA,YAAC,cAAA;AAAA,YAAA;AAAA,cACC,KAAA,EAAM,YAAA;AAAA,cACN,OAAA,EAAS,gBAAA;AAAA,cACT,cAAA,EAAgB,eAAA;AAAA,cAChB,QAAA,EAAU,kBAAA;AAAA,cACV,OAAA,EAAS;AAAA;AAAA,WACX;AAAA,0BACA,GAAA;AAAA,YAAC,cAAA;AAAA,YAAA;AAAA,cACC,KAAA,EAAM,kBAAA;AAAA,cACN,OAAA,EAAS,sBAAA;AAAA,cACT,cAAA,EAAgB,qBAAA;AAAA,cAChB,QAAA,EAAU,wBAAA;AAAA,cACV,OAAA,EAAS;AAAA;AAAA,WACX;AAAA,0BACA,GAAA;AAAA,YAAC,iBAAA;AAAA,YAAA;AAAA,cACC,KAAA,EAAM,UAAA;AAAA,cACN,OAAA,EAAS,kBAAA;AAAA,cACT,cAAA,EAAgB,iBAAA;AAAA,cAChB,QAAA,EAAU,oBAAA;AAAA,cACV,OAAA,EAAS;AAAA;AAAA,WACX;AAAA,0BACA,GAAA;AAAA,YAAC,kBAAA;AAAA,YAAA;AAAA,cACC,KAAA,EAAO,iBAAA;AAAA,cACP,QAAA,EAAU,oBAAA;AAAA,cACV,kBAAA,EAAoB,cAAA;AAAA,cACpB,kBAAA,EAAoB,kBAAA;AAAA,cACpB,WAAA;AAAA,cACA,OAAA,EAAS;AAAA;AAAA;AACX,SAAA,EACF,CAAA;AAAA,QAEF,QAAA,EAAU,kBAAA;AAAA,QACV,YAAA,EAAc;AAAA,UACZ,OAAA,EAAS;AAAA,YACP,SAAA,EAAW;AAAA;AACb,SACF;AAAA,QACA,eAAA,EAAiB,kBAAkB,CAAC,CAAA;AAAA,QACpC,eAAA,EAAiB,iBAAA;AAAA,QACjB,gBAAA,EAAkB;AAAA;AAAA,KACpB;AAAA,oBAEA,GAAA,CAAC,aAAA,EAAA,EAAc,KAAA,EAAO,cAAA,EAAgB,CAAA;AAAA,oBACtC,GAAA,CAAC,aAAA,EAAA,EAAc,KAAA,EAAO,sBAAA,EAAwB;AAAA,GAAA,EAChD,CAAA;AAEJ;;;;"}
|
|
@@ -20,6 +20,7 @@ import '@mui/icons-material/Clear';
|
|
|
20
20
|
import '@mui/material/IconButton';
|
|
21
21
|
import '../../components/common/ChartBox.esm.js';
|
|
22
22
|
import 'react-dom';
|
|
23
|
+
import '../../components/common/StatusContainer.esm.js';
|
|
23
24
|
import '../../components/common/logoSpinner.esm.js';
|
|
24
25
|
import '@mui/material/Chip';
|
|
25
26
|
import { ChipsList } from '../../components/ChipsList.esm.js';
|
|
@@ -47,7 +48,7 @@ import '@mui/icons-material/Close';
|
|
|
47
48
|
import { formatDate } from '../../utils/dateFormatter.esm.js';
|
|
48
49
|
import { APIIRO_DEFAULT_BASE_URL } from '@backstage-community/plugin-apiiro-common';
|
|
49
50
|
|
|
50
|
-
const
|
|
51
|
+
const getRisksColumns = (apiiroApi, repoId, applicationId) => [
|
|
51
52
|
{
|
|
52
53
|
field: "riskStatus",
|
|
53
54
|
headerName: "Risk Status",
|
|
@@ -80,16 +81,29 @@ const risksColumns = [
|
|
|
80
81
|
minWidth: 220,
|
|
81
82
|
headerAlign: "center",
|
|
82
83
|
valueGetter: (_, row) => row.ruleName,
|
|
83
|
-
renderCell: (params) =>
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
84
|
+
renderCell: (params) => {
|
|
85
|
+
const profileType = repoId ? "repositories" : "applications";
|
|
86
|
+
const profileId = repoId || applicationId;
|
|
87
|
+
const queryParams = new URLSearchParams({
|
|
88
|
+
trigger: params.row.id
|
|
89
|
+
});
|
|
90
|
+
if (apiiroApi.getRedirectDevView()) {
|
|
91
|
+
queryParams.append("devView", "true");
|
|
92
|
+
} else {
|
|
93
|
+
queryParams.append("fl[RiskStatus][values][0]", params.row.riskStatus);
|
|
91
94
|
}
|
|
92
|
-
|
|
95
|
+
const url = `${APIIRO_DEFAULT_BASE_URL}/profiles/${profileType}/${profileId}/risk/development?${queryParams.toString()}`;
|
|
96
|
+
return /* @__PURE__ */ jsx(SimpleTooltip, { title: params.value ?? "", children: /* @__PURE__ */ jsx(
|
|
97
|
+
Link,
|
|
98
|
+
{
|
|
99
|
+
href: url,
|
|
100
|
+
target: "_blank",
|
|
101
|
+
rel: "noopener noreferrer",
|
|
102
|
+
color: "inherit",
|
|
103
|
+
children: params.value ?? ""
|
|
104
|
+
}
|
|
105
|
+
) });
|
|
106
|
+
}
|
|
93
107
|
},
|
|
94
108
|
{
|
|
95
109
|
field: "component",
|
|
@@ -301,5 +315,5 @@ const columnVisibilityModal = {
|
|
|
301
315
|
findingCategory: false
|
|
302
316
|
};
|
|
303
317
|
|
|
304
|
-
export { columnVisibilityModal,
|
|
318
|
+
export { columnVisibilityModal, getRisksColumns };
|
|
305
319
|
//# sourceMappingURL=tableConfig.esm.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tableConfig.esm.js","sources":["../../../src/pages/Risks/tableConfig.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 '@mui/material/Link';\nimport { GridColDef } from '@mui/x-data-grid';\nimport {\n ApplicationsList,\n ChipsList,\n ComponentDisplay,\n DueDateDisplay,\n MainContributors,\n RepositoryDisplay,\n RiskLevel,\n RiskStatus,\n SimpleTooltip,\n SourcesDisplay,\n TagsList,\n TeamsDisplay,\n} from '../../components';\nimport { formatDate } from '../../utils/dateFormatter';\nimport { APIIRO_DEFAULT_BASE_URL } from '@backstage-community/plugin-apiiro-common';\n\nexport const risksColumns: GridColDef[] = [\n {\n field: 'riskStatus',\n headerName: 'Risk Status',\n flex: 1,\n minWidth: 150,\n headerAlign: 'center',\n valueGetter: (_, row) => row.riskStatus,\n renderCell: (params: any) => (\n <SimpleTooltip title={params.value ?? ''} centered>\n <RiskStatus status={params.value} iconSize=\"large\" />\n </SimpleTooltip>\n ),\n },\n {\n field: 'riskLevel',\n headerName: 'Risk Level',\n flex: 1,\n minWidth: 150,\n headerAlign: 'center',\n valueGetter: (_, row) => row.riskLevel,\n sortComparator: (v1: string, v2: string) => {\n const riskOrder = { Critical: 3, High: 2, Medium: 1, Low: 0 };\n const order1 = riskOrder[v1 as keyof typeof riskOrder] ?? -1;\n const order2 = riskOrder[v2 as keyof typeof riskOrder] ?? -1;\n return order1 - order2;\n },\n renderCell: (params: any) => (\n <SimpleTooltip title={params.value ?? ''} centered>\n <RiskLevel level={params.value} iconSize=\"large\" />\n </SimpleTooltip>\n ),\n },\n {\n field: 'policyName',\n headerName: 'Policy Name',\n flex: 1,\n hideable: false,\n minWidth: 220,\n headerAlign: 'center',\n valueGetter: (_, row) => row.ruleName,\n renderCell: (params: any) => (\n <SimpleTooltip title={params.value ?? ''}>\n <Link\n href={`${APIIRO_DEFAULT_BASE_URL}/profiles/repositories/${params.row.entity?.details?.key}/risk/development?fl[RiskStatus][values][0]=${params.row.riskStatus}&trigger=${params.row.id}`}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n color=\"inherit\"\n >\n {params.value ?? ''}\n </Link>\n </SimpleTooltip>\n ),\n },\n {\n field: 'component',\n headerName: 'Component',\n flex: 1,\n minWidth: 200,\n valueGetter: (_, row) => row.component,\n renderCell: (params: any) => (\n <ComponentDisplay\n filePath={params.row.sourceCode?.filePath}\n component={params.value ?? ''}\n />\n ),\n },\n {\n field: 'insights',\n headerName: 'Insights',\n flex: 1,\n headerAlign: 'center',\n minWidth: 300,\n valueGetter: (_, row) =>\n row.insights.map((insight: any) => insight.name).join(', '),\n renderCell: (params: any) => {\n const insights = params.row.insights || [];\n return (\n <ChipsList\n items={insights.map((insight: any) => ({\n id: insight.name,\n label: insight.name,\n tooltip: insight.reason,\n }))}\n maxVisible={1}\n gap={0}\n variant=\"outlined\"\n chipSx={{\n maxWidth: '200px',\n '& .MuiChip-label': {\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n },\n }}\n />\n );\n },\n },\n {\n field: 'applications',\n headerName: 'Applications',\n flex: 1,\n minWidth: 280,\n headerAlign: 'center',\n renderCell: (params: any) => (\n <ApplicationsList applications={params.row.applications || []} />\n ),\n },\n {\n field: 'repository',\n headerName: 'Repository',\n flex: 1,\n minWidth: 280,\n headerAlign: 'center',\n renderCell: (params: any) => (\n <RepositoryDisplay entity={params.row.entity} />\n ),\n },\n {\n field: 'riskCategory',\n headerName: 'Risk Category',\n flex: 1,\n minWidth: 150,\n headerAlign: 'center',\n valueGetter: (_, row) => row.riskCategory,\n renderCell: (params: any) => (\n <SimpleTooltip title={params.value ?? ''} centered>\n {params.value ?? ''}\n </SimpleTooltip>\n ),\n },\n {\n field: 'discoveredOn',\n headerName: 'Discovered On',\n flex: 1,\n headerAlign: 'center',\n minWidth: 150,\n valueGetter: (_, row) => row.discoveredOn,\n renderCell: (params: any) => {\n const formattedDate = formatDate(params.value);\n return (\n <SimpleTooltip title={formattedDate} centered>\n {formattedDate}\n </SimpleTooltip>\n );\n },\n },\n {\n field: 'source',\n headerName: 'Source',\n flex: 1,\n minWidth: 200,\n headerAlign: 'center',\n valueGetter: (_, row) =>\n row.source.map((source: any) => source.name).join(', '),\n renderCell: (params: any) => (\n <SourcesDisplay sources={params.row.source || []} />\n ),\n },\n {\n field: 'orgTeams',\n headerName: 'Teams',\n flex: 1,\n minWidth: 150,\n headerAlign: 'center',\n valueGetter: (_, row) =>\n row.orgTeams.map((orgTeam: any) => orgTeam.name).join(', '),\n renderCell: (params: any) => (\n <TeamsDisplay teams={params.row.orgTeams || []} />\n ),\n },\n {\n field: 'mainContributor',\n headerName: 'Main Contributor',\n flex: 1,\n minWidth: 150,\n headerAlign: 'center',\n renderCell: (params: any) => (\n <MainContributors contributors={params.row.contributors || []} />\n ),\n },\n {\n field: 'applicationTags',\n headerName: 'Application Tags',\n flex: 1,\n minWidth: 270,\n headerAlign: 'center',\n renderCell: (params: any) => (\n <TagsList tags={params.row.applicationTags || []} />\n ),\n },\n {\n field: 'repositoryTags',\n headerName: 'Repository Tags',\n flex: 1,\n minWidth: 270,\n headerAlign: 'center',\n renderCell: (params: any) => (\n <TagsList tags={params.row.repositoryTags || []} />\n ),\n },\n {\n field: 'repositoryGroup',\n headerName: 'Repository Group',\n flex: 1,\n minWidth: 150,\n headerAlign: 'center',\n valueGetter: (_, row) => row.entity?.details?.repositoryGroup,\n renderCell: (params: any) => (\n <SimpleTooltip title={params.value ?? ''} centered>\n {params.value ?? ''}\n </SimpleTooltip>\n ),\n },\n {\n field: 'dueDate',\n headerName: 'Due Date',\n flex: 1,\n minWidth: 150,\n type: 'date',\n headerAlign: 'center',\n valueGetter: (_, row) => (row.dueDate ? new Date(row.dueDate) : null),\n renderCell: (params: any) => {\n return <DueDateDisplay dateString={params.value} />;\n },\n },\n {\n field: 'serverUrl',\n headerName: 'Server URL',\n flex: 1,\n minWidth: 150,\n valueGetter: (_, row) => row.entity?.details?.serverUrl,\n renderCell: (params: any) => {\n return (\n <SimpleTooltip title={params.value ?? ''}>\n <Link\n href={params.value}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n style={{ textDecoration: 'underline' }}\n >\n {params.value}\n </Link>\n </SimpleTooltip>\n );\n },\n },\n {\n field: 'findingName',\n headerName: 'Finding Name',\n flex: 1,\n minWidth: 180,\n headerAlign: 'center',\n valueGetter: (_, row) => row.findingName,\n renderCell: (params: any) => {\n return (\n <SimpleTooltip title={params.value ?? ''}>\n {params.value ?? ''}\n </SimpleTooltip>\n );\n },\n },\n {\n field: 'findingCategory',\n headerName: 'Finding Category',\n flex: 1,\n minWidth: 180,\n headerAlign: 'center',\n valueGetter: (_, row) => row.findingCategory,\n renderCell: (params: any) => {\n return (\n <SimpleTooltip title={params.value ?? ''} centered>\n {params.value ?? ''}\n </SimpleTooltip>\n );\n },\n },\n];\n\nexport const columnVisibilityModal = {\n riskStatus: true,\n riskLevel: true,\n policyName: true,\n component: true,\n insights: true,\n applications: true,\n repository: true,\n riskCategory: true,\n discoveredOn: true,\n source: true,\n orgTeams: true,\n mainContributor: true,\n applicationTags: false,\n repositoryTags: false,\n repositoryGroup: false,\n dueDate: false,\n serverUrl: false,\n findingName: false,\n findingCategory: false,\n};\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"tableConfig.esm.js","sources":["../../../src/pages/Risks/tableConfig.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 '@mui/material/Link';\nimport { GridColDef } from '@mui/x-data-grid';\nimport {\n ApplicationsList,\n ChipsList,\n ComponentDisplay,\n DueDateDisplay,\n MainContributors,\n RepositoryDisplay,\n RiskLevel,\n RiskStatus,\n SimpleTooltip,\n SourcesDisplay,\n TagsList,\n TeamsDisplay,\n} from '../../components';\nimport { formatDate } from '../../utils/dateFormatter';\nimport { APIIRO_DEFAULT_BASE_URL } from '@backstage-community/plugin-apiiro-common';\nimport { ApiiroApi } from '../../api';\n\nexport const getRisksColumns = (\n apiiroApi: ApiiroApi,\n repoId?: string,\n applicationId?: string,\n): GridColDef[] => [\n {\n field: 'riskStatus',\n headerName: 'Risk Status',\n flex: 1,\n minWidth: 150,\n headerAlign: 'center',\n valueGetter: (_, row) => row.riskStatus,\n renderCell: (params: any) => (\n <SimpleTooltip title={params.value ?? ''} centered>\n <RiskStatus status={params.value} iconSize=\"large\" />\n </SimpleTooltip>\n ),\n },\n {\n field: 'riskLevel',\n headerName: 'Risk Level',\n flex: 1,\n minWidth: 150,\n headerAlign: 'center',\n valueGetter: (_, row) => row.riskLevel,\n sortComparator: (v1: string, v2: string) => {\n const riskOrder = { Critical: 3, High: 2, Medium: 1, Low: 0 };\n const order1 = riskOrder[v1 as keyof typeof riskOrder] ?? -1;\n const order2 = riskOrder[v2 as keyof typeof riskOrder] ?? -1;\n return order1 - order2;\n },\n renderCell: (params: any) => (\n <SimpleTooltip title={params.value ?? ''} centered>\n <RiskLevel level={params.value} iconSize=\"large\" />\n </SimpleTooltip>\n ),\n },\n {\n field: 'policyName',\n headerName: 'Policy Name',\n flex: 1,\n hideable: false,\n minWidth: 220,\n headerAlign: 'center',\n valueGetter: (_, row) => row.ruleName,\n renderCell: (params: any) => {\n const profileType = repoId ? 'repositories' : 'applications';\n const profileId = repoId || applicationId;\n const queryParams = new URLSearchParams({\n trigger: params.row.id,\n });\n\n if (apiiroApi.getRedirectDevView()) {\n queryParams.append('devView', 'true');\n } else {\n queryParams.append('fl[RiskStatus][values][0]', params.row.riskStatus);\n }\n\n const url = `${APIIRO_DEFAULT_BASE_URL}/profiles/${profileType}/${profileId}/risk/development?${queryParams.toString()}`;\n\n return (\n <SimpleTooltip title={params.value ?? ''}>\n <Link\n href={url}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n color=\"inherit\"\n >\n {params.value ?? ''}\n </Link>\n </SimpleTooltip>\n );\n },\n },\n {\n field: 'component',\n headerName: 'Component',\n flex: 1,\n minWidth: 200,\n valueGetter: (_, row) => row.component,\n renderCell: (params: any) => (\n <ComponentDisplay\n filePath={params.row.sourceCode?.filePath}\n component={params.value ?? ''}\n />\n ),\n },\n {\n field: 'insights',\n headerName: 'Insights',\n flex: 1,\n headerAlign: 'center',\n minWidth: 300,\n valueGetter: (_, row) =>\n row.insights.map((insight: any) => insight.name).join(', '),\n renderCell: (params: any) => {\n const insights = params.row.insights || [];\n return (\n <ChipsList\n items={insights.map((insight: any) => ({\n id: insight.name,\n label: insight.name,\n tooltip: insight.reason,\n }))}\n maxVisible={1}\n gap={0}\n variant=\"outlined\"\n chipSx={{\n maxWidth: '200px',\n '& .MuiChip-label': {\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n },\n }}\n />\n );\n },\n },\n {\n field: 'applications',\n headerName: 'Applications',\n flex: 1,\n minWidth: 280,\n headerAlign: 'center',\n renderCell: (params: any) => (\n <ApplicationsList applications={params.row.applications || []} />\n ),\n },\n {\n field: 'repository',\n headerName: 'Repository',\n flex: 1,\n minWidth: 280,\n headerAlign: 'center',\n renderCell: (params: any) => (\n <RepositoryDisplay entity={params.row.entity} />\n ),\n },\n {\n field: 'riskCategory',\n headerName: 'Risk Category',\n flex: 1,\n minWidth: 150,\n headerAlign: 'center',\n valueGetter: (_, row) => row.riskCategory,\n renderCell: (params: any) => (\n <SimpleTooltip title={params.value ?? ''} centered>\n {params.value ?? ''}\n </SimpleTooltip>\n ),\n },\n {\n field: 'discoveredOn',\n headerName: 'Discovered On',\n flex: 1,\n headerAlign: 'center',\n minWidth: 150,\n valueGetter: (_, row) => row.discoveredOn,\n renderCell: (params: any) => {\n const formattedDate = formatDate(params.value);\n return (\n <SimpleTooltip title={formattedDate} centered>\n {formattedDate}\n </SimpleTooltip>\n );\n },\n },\n {\n field: 'source',\n headerName: 'Source',\n flex: 1,\n minWidth: 200,\n headerAlign: 'center',\n valueGetter: (_, row) =>\n row.source.map((source: any) => source.name).join(', '),\n renderCell: (params: any) => (\n <SourcesDisplay sources={params.row.source || []} />\n ),\n },\n {\n field: 'orgTeams',\n headerName: 'Teams',\n flex: 1,\n minWidth: 150,\n headerAlign: 'center',\n valueGetter: (_, row) =>\n row.orgTeams.map((orgTeam: any) => orgTeam.name).join(', '),\n renderCell: (params: any) => (\n <TeamsDisplay teams={params.row.orgTeams || []} />\n ),\n },\n {\n field: 'mainContributor',\n headerName: 'Main Contributor',\n flex: 1,\n minWidth: 150,\n headerAlign: 'center',\n renderCell: (params: any) => (\n <MainContributors contributors={params.row.contributors || []} />\n ),\n },\n {\n field: 'applicationTags',\n headerName: 'Application Tags',\n flex: 1,\n minWidth: 270,\n headerAlign: 'center',\n renderCell: (params: any) => (\n <TagsList tags={params.row.applicationTags || []} />\n ),\n },\n {\n field: 'repositoryTags',\n headerName: 'Repository Tags',\n flex: 1,\n minWidth: 270,\n headerAlign: 'center',\n renderCell: (params: any) => (\n <TagsList tags={params.row.repositoryTags || []} />\n ),\n },\n {\n field: 'repositoryGroup',\n headerName: 'Repository Group',\n flex: 1,\n minWidth: 150,\n headerAlign: 'center',\n valueGetter: (_, row) => row.entity?.details?.repositoryGroup,\n renderCell: (params: any) => (\n <SimpleTooltip title={params.value ?? ''} centered>\n {params.value ?? ''}\n </SimpleTooltip>\n ),\n },\n {\n field: 'dueDate',\n headerName: 'Due Date',\n flex: 1,\n minWidth: 150,\n type: 'date',\n headerAlign: 'center',\n valueGetter: (_, row) => (row.dueDate ? new Date(row.dueDate) : null),\n renderCell: (params: any) => {\n return <DueDateDisplay dateString={params.value} />;\n },\n },\n {\n field: 'serverUrl',\n headerName: 'Server URL',\n flex: 1,\n minWidth: 150,\n valueGetter: (_, row) => row.entity?.details?.serverUrl,\n renderCell: (params: any) => {\n return (\n <SimpleTooltip title={params.value ?? ''}>\n <Link\n href={params.value}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n style={{ textDecoration: 'underline' }}\n >\n {params.value}\n </Link>\n </SimpleTooltip>\n );\n },\n },\n {\n field: 'findingName',\n headerName: 'Finding Name',\n flex: 1,\n minWidth: 180,\n headerAlign: 'center',\n valueGetter: (_, row) => row.findingName,\n renderCell: (params: any) => {\n return (\n <SimpleTooltip title={params.value ?? ''}>\n {params.value ?? ''}\n </SimpleTooltip>\n );\n },\n },\n {\n field: 'findingCategory',\n headerName: 'Finding Category',\n flex: 1,\n minWidth: 180,\n headerAlign: 'center',\n valueGetter: (_, row) => row.findingCategory,\n renderCell: (params: any) => {\n return (\n <SimpleTooltip title={params.value ?? ''} centered>\n {params.value ?? ''}\n </SimpleTooltip>\n );\n },\n },\n];\n\nexport const columnVisibilityModal = {\n riskStatus: true,\n riskLevel: true,\n policyName: true,\n component: true,\n insights: true,\n applications: true,\n repository: true,\n riskCategory: true,\n discoveredOn: true,\n source: true,\n orgTeams: true,\n mainContributor: true,\n applicationTags: false,\n repositoryTags: false,\n repositoryGroup: false,\n dueDate: false,\n serverUrl: false,\n findingName: false,\n findingCategory: false,\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
2
|
+
import { Content } from '@backstage/core-components';
|
|
3
|
+
import { TabMetricsGroup } from '../../components/MetricsGroup/TabMetricsGroup.esm.js';
|
|
4
|
+
import { useApi, fetchApiRef } from '@backstage/core-plugin-api';
|
|
5
|
+
import { apiiroApiRef } from '../../api/index.esm.js';
|
|
6
|
+
import { useRepositoriesData } from '../../queries/repository.queries.esm.js';
|
|
7
|
+
import '@tanstack/react-query';
|
|
8
|
+
import { useEntity } from '@backstage/plugin-catalog-react';
|
|
9
|
+
import '../../components/common/ChartBox.esm.js';
|
|
10
|
+
import 'react';
|
|
11
|
+
import 'react-dom';
|
|
12
|
+
import '@mui/material/styles';
|
|
13
|
+
import '@mui/material/Box';
|
|
14
|
+
import '@mui/material/Typography';
|
|
15
|
+
import { StatusContainer } from '../../components/common/StatusContainer.esm.js';
|
|
16
|
+
import { Risks } from '../Risks/Risks.esm.js';
|
|
17
|
+
import { APIIRO_PROJECT_ANNOTATION } from '@backstage-community/plugin-apiiro-common';
|
|
18
|
+
import { stringifyEntityRef } from '@backstage/catalog-model';
|
|
19
|
+
|
|
20
|
+
const ComponentTab = () => {
|
|
21
|
+
const connectBackendApi = useApi(apiiroApiRef);
|
|
22
|
+
const { fetch } = useApi(fetchApiRef);
|
|
23
|
+
const { entity } = useEntity();
|
|
24
|
+
const repoId = entity?.metadata?.annotations?.[APIIRO_PROJECT_ANNOTATION] || void 0;
|
|
25
|
+
const entityRef = stringifyEntityRef(entity);
|
|
26
|
+
const { repositoriesData, repositoriesDataLoading, repositoriesDataError } = useRepositoriesData({
|
|
27
|
+
connectApi: connectBackendApi,
|
|
28
|
+
fetchApi: fetch,
|
|
29
|
+
enabled: !!repoId,
|
|
30
|
+
repositoryId: repoId,
|
|
31
|
+
entityRef
|
|
32
|
+
});
|
|
33
|
+
if (!repoId) {
|
|
34
|
+
return /* @__PURE__ */ jsx(
|
|
35
|
+
StatusContainer,
|
|
36
|
+
{
|
|
37
|
+
isLoading: false,
|
|
38
|
+
isEmpty: true,
|
|
39
|
+
wrapper: Content,
|
|
40
|
+
notFoundMessage: "The Apiiro annotation hasn't been configured, or the result for this repository is not available in Apiiro.",
|
|
41
|
+
children: null
|
|
42
|
+
}
|
|
43
|
+
);
|
|
44
|
+
}
|
|
45
|
+
const repositories = repositoriesData?.repositories;
|
|
46
|
+
const repositoryData = repositories?.[0];
|
|
47
|
+
return /* @__PURE__ */ jsx(
|
|
48
|
+
StatusContainer,
|
|
49
|
+
{
|
|
50
|
+
isLoading: repositoriesDataLoading,
|
|
51
|
+
error: repositoriesDataError,
|
|
52
|
+
isEmpty: !repositories || repositories.length === 0,
|
|
53
|
+
wrapper: Content,
|
|
54
|
+
notFoundMessage: "Results for this repository are either unavailable on Apiiro or can not be accessed.",
|
|
55
|
+
children: /* @__PURE__ */ jsxs(Content, { children: [
|
|
56
|
+
/* @__PURE__ */ jsx(
|
|
57
|
+
TabMetricsGroup,
|
|
58
|
+
{
|
|
59
|
+
repositoryData,
|
|
60
|
+
entity,
|
|
61
|
+
repoId,
|
|
62
|
+
entityRef
|
|
63
|
+
}
|
|
64
|
+
),
|
|
65
|
+
/* @__PURE__ */ jsx(Risks, { repoId, entityRef })
|
|
66
|
+
] })
|
|
67
|
+
}
|
|
68
|
+
);
|
|
69
|
+
};
|
|
70
|
+
|
|
71
|
+
export { ComponentTab };
|
|
72
|
+
//# sourceMappingURL=ComponentTab.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ComponentTab.esm.js","sources":["../../../src/pages/tab/ComponentTab.tsx"],"sourcesContent":["/*\n * Copyright 2026 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { Content } from '@backstage/core-components';\nimport { TabMetricsGroup } from '../../components/MetricsGroup';\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 { StatusContainer } from '../../components/common';\nimport { Risks } from '../Risks';\nimport { APIIRO_PROJECT_ANNOTATION } from '@backstage-community/plugin-apiiro-common';\nimport { stringifyEntityRef } from '@backstage/catalog-model';\n\nexport const ComponentTab = () => {\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 connectApi: connectBackendApi,\n fetchApi: fetch,\n enabled: !!repoId,\n repositoryId: repoId,\n entityRef: entityRef,\n });\n\n if (!repoId) {\n return (\n <StatusContainer\n isLoading={false}\n isEmpty\n wrapper={Content}\n notFoundMessage=\"The Apiiro annotation hasn't been configured, or the result for this repository is not available in Apiiro.\"\n >\n {null}\n </StatusContainer>\n );\n }\n\n const repositories = repositoriesData?.repositories;\n const repositoryData = repositories?.[0];\n\n return (\n <StatusContainer\n isLoading={repositoriesDataLoading}\n error={repositoriesDataError}\n isEmpty={!repositories || repositories.length === 0}\n wrapper={Content}\n notFoundMessage=\"Results for this repository are either unavailable on Apiiro or can not be accessed.\"\n >\n <Content>\n <TabMetricsGroup\n repositoryData={repositoryData!}\n entity={entity}\n repoId={repoId!}\n entityRef={entityRef}\n />\n <Risks repoId={repoId!} entityRef={entityRef} />\n </Content>\n </StatusContainer>\n );\n};\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;AA2BO,MAAM,eAAe,MAAM;AAChC,EAAA,MAAM,iBAAA,GAAoB,OAAO,YAAY,CAAA;AAC7C,EAAA,MAAM,EAAE,KAAA,EAAM,GAAI,MAAA,CAAO,WAAW,CAAA;AACpC,EAAA,MAAM,EAAE,MAAA,EAAO,GAAI,SAAA,EAAU;AAC7B,EAAA,MAAM,MAAA,GACJ,MAAA,EAAQ,QAAA,EAAU,WAAA,GAAc,yBAAyB,CAAA,IAAK,MAAA;AAChE,EAAA,MAAM,SAAA,GAAY,mBAAmB,MAAM,CAAA;AAE3C,EAAA,MAAM,EAAE,gBAAA,EAAkB,uBAAA,EAAyB,qBAAA,KACjD,mBAAA,CAAoB;AAAA,IAClB,UAAA,EAAY,iBAAA;AAAA,IACZ,QAAA,EAAU,KAAA;AAAA,IACV,OAAA,EAAS,CAAC,CAAC,MAAA;AAAA,IACX,YAAA,EAAc,MAAA;AAAA,IACd;AAAA,GACD,CAAA;AAEH,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,uBACE,GAAA;AAAA,MAAC,eAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAW,KAAA;AAAA,QACX,OAAA,EAAO,IAAA;AAAA,QACP,OAAA,EAAS,OAAA;AAAA,QACT,eAAA,EAAgB,6GAAA;AAAA,QAEf,QAAA,EAAA;AAAA;AAAA,KACH;AAAA,EAEJ;AAEA,EAAA,MAAM,eAAe,gBAAA,EAAkB,YAAA;AACvC,EAAA,MAAM,cAAA,GAAiB,eAAe,CAAC,CAAA;AAEvC,EAAA,uBACE,GAAA;AAAA,IAAC,eAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,uBAAA;AAAA,MACX,KAAA,EAAO,qBAAA;AAAA,MACP,OAAA,EAAS,CAAC,YAAA,IAAgB,YAAA,CAAa,MAAA,KAAW,CAAA;AAAA,MAClD,OAAA,EAAS,OAAA;AAAA,MACT,eAAA,EAAgB,sFAAA;AAAA,MAEhB,+BAAC,OAAA,EAAA,EACC,QAAA,EAAA;AAAA,wBAAA,GAAA;AAAA,UAAC,eAAA;AAAA,UAAA;AAAA,YACC,cAAA;AAAA,YACA,MAAA;AAAA,YACA,MAAA;AAAA,YACA;AAAA;AAAA,SACF;AAAA,wBACA,GAAA,CAAC,KAAA,EAAA,EAAM,MAAA,EAAiB,SAAA,EAAsB;AAAA,OAAA,EAChD;AAAA;AAAA,GACF;AAEJ;;;;"}
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
|
|
2
|
+
import { Content } from '@backstage/core-components';
|
|
3
|
+
import { TabMetricsGroup } from '../../components/MetricsGroup/TabMetricsGroup.esm.js';
|
|
4
|
+
import { useApi, fetchApiRef } from '@backstage/core-plugin-api';
|
|
5
|
+
import { apiiroApiRef } from '../../api/index.esm.js';
|
|
6
|
+
import '@tanstack/react-query';
|
|
7
|
+
import { useApplicationsData } from '../../queries/application.queries.esm.js';
|
|
8
|
+
import { useEntity } from '@backstage/plugin-catalog-react';
|
|
9
|
+
import '../../components/common/ChartBox.esm.js';
|
|
10
|
+
import { useState } from 'react';
|
|
11
|
+
import 'react-dom';
|
|
12
|
+
import '@mui/material/styles';
|
|
13
|
+
import Box from '@mui/material/Box';
|
|
14
|
+
import Typography from '@mui/material/Typography';
|
|
15
|
+
import { StatusContainer } from '../../components/common/StatusContainer.esm.js';
|
|
16
|
+
import { Risks } from '../Risks/Risks.esm.js';
|
|
17
|
+
import { APIIRO_APPLICATION_ANNOTATION } from '@backstage-community/plugin-apiiro-common';
|
|
18
|
+
import { stringifyEntityRef } from '@backstage/catalog-model';
|
|
19
|
+
import { RepositoriesContent } from '../Repositories/Repositories.esm.js';
|
|
20
|
+
import Tabs from '@mui/material/Tabs';
|
|
21
|
+
import Tab from '@mui/material/Tab';
|
|
22
|
+
import { isApiiroMetricViewAvailable } from '../../utils/utils.esm.js';
|
|
23
|
+
|
|
24
|
+
const SystemTab = () => {
|
|
25
|
+
const [activeTab, setActiveTab] = useState(0);
|
|
26
|
+
const connectBackendApi = useApi(apiiroApiRef);
|
|
27
|
+
const { fetch } = useApi(fetchApiRef);
|
|
28
|
+
const { entity } = useEntity();
|
|
29
|
+
const enableApplicationsView = connectBackendApi.getEnableApplicationsView();
|
|
30
|
+
const defaultViewChart = connectBackendApi.getDefaultAllowMetricsView();
|
|
31
|
+
const displayRepositories = isApiiroMetricViewAvailable(entity) ?? defaultViewChart;
|
|
32
|
+
const applicationId = entity?.metadata?.annotations?.[APIIRO_APPLICATION_ANNOTATION] || void 0;
|
|
33
|
+
const entityRef = stringifyEntityRef(entity);
|
|
34
|
+
const handleTabChange = (_event, newValue) => {
|
|
35
|
+
setActiveTab(newValue);
|
|
36
|
+
};
|
|
37
|
+
const { applicationsData, applicationsDataLoading, applicationsDataError } = useApplicationsData({
|
|
38
|
+
connectApi: connectBackendApi,
|
|
39
|
+
fetchApi: fetch,
|
|
40
|
+
enabled: enableApplicationsView && !!applicationId,
|
|
41
|
+
applicationId,
|
|
42
|
+
entityRef
|
|
43
|
+
});
|
|
44
|
+
if (!enableApplicationsView) {
|
|
45
|
+
return /* @__PURE__ */ jsx(
|
|
46
|
+
StatusContainer,
|
|
47
|
+
{
|
|
48
|
+
isLoading: false,
|
|
49
|
+
isEmpty: true,
|
|
50
|
+
wrapper: Content,
|
|
51
|
+
notFoundMessage: "Please enable the applications view in the Apiiro plugin configuration.",
|
|
52
|
+
children: null
|
|
53
|
+
}
|
|
54
|
+
);
|
|
55
|
+
}
|
|
56
|
+
if (!applicationId) {
|
|
57
|
+
return /* @__PURE__ */ jsx(
|
|
58
|
+
StatusContainer,
|
|
59
|
+
{
|
|
60
|
+
isLoading: false,
|
|
61
|
+
isEmpty: true,
|
|
62
|
+
wrapper: Content,
|
|
63
|
+
notFoundMessage: "The Apiiro annotation hasn't been configured, or the result for this application is not available in Apiiro.",
|
|
64
|
+
children: null
|
|
65
|
+
}
|
|
66
|
+
);
|
|
67
|
+
}
|
|
68
|
+
const applications = applicationsData?.applications;
|
|
69
|
+
return /* @__PURE__ */ jsx(
|
|
70
|
+
StatusContainer,
|
|
71
|
+
{
|
|
72
|
+
isLoading: applicationsDataLoading,
|
|
73
|
+
error: applicationsDataError,
|
|
74
|
+
isEmpty: !applications || applications.length === 0,
|
|
75
|
+
wrapper: Content,
|
|
76
|
+
notFoundMessage: "Results for this application are either unavailable on Apiiro or can not be accessed.",
|
|
77
|
+
children: /* @__PURE__ */ jsxs(Content, { children: [
|
|
78
|
+
/* @__PURE__ */ jsx(
|
|
79
|
+
TabMetricsGroup,
|
|
80
|
+
{
|
|
81
|
+
applicationData: applications?.[0],
|
|
82
|
+
entity,
|
|
83
|
+
entityRef,
|
|
84
|
+
applicationId
|
|
85
|
+
}
|
|
86
|
+
),
|
|
87
|
+
displayRepositories ? /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
88
|
+
/* @__PURE__ */ jsx(Box, { sx: { borderBottom: 1, borderColor: "divider", mb: 2, mt: 2 }, children: /* @__PURE__ */ jsxs(
|
|
89
|
+
Tabs,
|
|
90
|
+
{
|
|
91
|
+
value: activeTab,
|
|
92
|
+
onChange: handleTabChange,
|
|
93
|
+
"aria-label": "Application content tabs",
|
|
94
|
+
textColor: "inherit",
|
|
95
|
+
TabIndicatorProps: {
|
|
96
|
+
style: { backgroundColor: "currentColor" }
|
|
97
|
+
},
|
|
98
|
+
children: [
|
|
99
|
+
/* @__PURE__ */ jsx(
|
|
100
|
+
Tab,
|
|
101
|
+
{
|
|
102
|
+
label: /* @__PURE__ */ jsx(
|
|
103
|
+
Typography,
|
|
104
|
+
{
|
|
105
|
+
variant: "h6",
|
|
106
|
+
sx: {
|
|
107
|
+
color: "text.primary",
|
|
108
|
+
opacity: activeTab === 0 ? 1 : 0.6
|
|
109
|
+
},
|
|
110
|
+
children: "Repositories"
|
|
111
|
+
}
|
|
112
|
+
),
|
|
113
|
+
sx: {
|
|
114
|
+
textTransform: "none",
|
|
115
|
+
minWidth: "auto",
|
|
116
|
+
px: 2,
|
|
117
|
+
"&:hover": {
|
|
118
|
+
backgroundColor: "action.hover"
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
),
|
|
123
|
+
/* @__PURE__ */ jsx(
|
|
124
|
+
Tab,
|
|
125
|
+
{
|
|
126
|
+
label: /* @__PURE__ */ jsx(
|
|
127
|
+
Typography,
|
|
128
|
+
{
|
|
129
|
+
variant: "h6",
|
|
130
|
+
sx: {
|
|
131
|
+
color: "text.primary",
|
|
132
|
+
opacity: activeTab === 1 ? 1 : 0.6
|
|
133
|
+
},
|
|
134
|
+
children: "Risks"
|
|
135
|
+
}
|
|
136
|
+
),
|
|
137
|
+
sx: {
|
|
138
|
+
textTransform: "none",
|
|
139
|
+
minWidth: "auto",
|
|
140
|
+
px: 2,
|
|
141
|
+
"&:hover": {
|
|
142
|
+
backgroundColor: "action.hover"
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
)
|
|
147
|
+
]
|
|
148
|
+
}
|
|
149
|
+
) }),
|
|
150
|
+
activeTab === 0 && /* @__PURE__ */ jsx(RepositoriesContent, { applicationId }),
|
|
151
|
+
activeTab === 1 && /* @__PURE__ */ jsx(Risks, { entityRef, applicationId })
|
|
152
|
+
] }) : /* @__PURE__ */ jsx(Risks, { entityRef, applicationId })
|
|
153
|
+
] })
|
|
154
|
+
}
|
|
155
|
+
);
|
|
156
|
+
};
|
|
157
|
+
|
|
158
|
+
export { SystemTab };
|
|
159
|
+
//# sourceMappingURL=SystemTab.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SystemTab.esm.js","sources":["../../../src/pages/tab/SystemTab.tsx"],"sourcesContent":["/*\n * Copyright 2026 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { Content } from '@backstage/core-components';\nimport { TabMetricsGroup } from '../../components/MetricsGroup';\nimport { useApi } from '@backstage/core-plugin-api';\nimport { apiiroApiRef } from '../../api';\nimport { fetchApiRef } from '@backstage/core-plugin-api';\nimport { useApplicationsData } from '../../queries';\nimport { useEntity } from '@backstage/plugin-catalog-react';\nimport { StatusContainer } from '../../components/common';\nimport { Risks } from '../Risks';\nimport { APIIRO_APPLICATION_ANNOTATION } from '@backstage-community/plugin-apiiro-common';\nimport { stringifyEntityRef } from '@backstage/catalog-model';\nimport { RepositoriesContent } from '../Repositories';\nimport Typography from '@mui/material/Typography';\nimport Box from '@mui/material/Box';\nimport Tabs from '@mui/material/Tabs';\nimport Tab from '@mui/material/Tab';\nimport { useState } from 'react';\nimport { isApiiroMetricViewAvailable } from '../../utils';\n\nexport const SystemTab = () => {\n const [activeTab, setActiveTab] = useState(0);\n const connectBackendApi = useApi(apiiroApiRef);\n const { fetch } = useApi(fetchApiRef);\n const { entity } = useEntity();\n const enableApplicationsView = connectBackendApi.getEnableApplicationsView();\n const defaultViewChart = connectBackendApi.getDefaultAllowMetricsView();\n const displayRepositories =\n isApiiroMetricViewAvailable(entity) ?? defaultViewChart;\n const applicationId =\n entity?.metadata?.annotations?.[APIIRO_APPLICATION_ANNOTATION] || undefined;\n const entityRef = stringifyEntityRef(entity);\n\n const handleTabChange = (_event: React.SyntheticEvent, newValue: number) => {\n setActiveTab(newValue);\n };\n\n const { applicationsData, applicationsDataLoading, applicationsDataError } =\n useApplicationsData({\n connectApi: connectBackendApi,\n fetchApi: fetch,\n enabled: enableApplicationsView && !!applicationId,\n applicationId,\n entityRef,\n });\n\n if (!enableApplicationsView) {\n return (\n <StatusContainer\n isLoading={false}\n isEmpty\n wrapper={Content}\n notFoundMessage=\"Please enable the applications view in the Apiiro plugin configuration.\"\n >\n {null}\n </StatusContainer>\n );\n }\n\n if (!applicationId) {\n return (\n <StatusContainer\n isLoading={false}\n isEmpty\n wrapper={Content}\n notFoundMessage=\"The Apiiro annotation hasn't been configured, or the result for this application is not available in Apiiro.\"\n >\n {null}\n </StatusContainer>\n );\n }\n\n const applications = applicationsData?.applications;\n\n return (\n <StatusContainer\n isLoading={applicationsDataLoading}\n error={applicationsDataError}\n isEmpty={!applications || applications.length === 0}\n wrapper={Content}\n notFoundMessage=\"Results for this application are either unavailable on Apiiro or can not be accessed.\"\n >\n <Content>\n <TabMetricsGroup\n applicationData={applications?.[0]}\n entity={entity}\n entityRef={entityRef}\n applicationId={applicationId}\n />\n {displayRepositories ? (\n <>\n <Box sx={{ borderBottom: 1, borderColor: 'divider', mb: 2, mt: 2 }}>\n <Tabs\n value={activeTab}\n onChange={handleTabChange}\n aria-label=\"Application content tabs\"\n textColor=\"inherit\"\n TabIndicatorProps={{\n style: { backgroundColor: 'currentColor' },\n }}\n >\n <Tab\n label={\n <Typography\n variant=\"h6\"\n sx={{\n color: 'text.primary',\n opacity: activeTab === 0 ? 1 : 0.6,\n }}\n >\n Repositories\n </Typography>\n }\n sx={{\n textTransform: 'none',\n minWidth: 'auto',\n px: 2,\n '&:hover': {\n backgroundColor: 'action.hover',\n },\n }}\n />\n <Tab\n label={\n <Typography\n variant=\"h6\"\n sx={{\n color: 'text.primary',\n opacity: activeTab === 1 ? 1 : 0.6,\n }}\n >\n Risks\n </Typography>\n }\n sx={{\n textTransform: 'none',\n minWidth: 'auto',\n px: 2,\n '&:hover': {\n backgroundColor: 'action.hover',\n },\n }}\n />\n </Tabs>\n </Box>\n\n {activeTab === 0 && (\n <RepositoriesContent applicationId={applicationId} />\n )}\n {activeTab === 1 && (\n <Risks entityRef={entityRef} applicationId={applicationId} />\n )}\n </>\n ) : (\n <Risks entityRef={entityRef} applicationId={applicationId} />\n )}\n </Content>\n </StatusContainer>\n );\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -1,10 +1,16 @@
|
|
|
1
|
-
import { jsx } from 'react/jsx-runtime';
|
|
1
|
+
import { jsxs, jsx } from 'react/jsx-runtime';
|
|
2
2
|
import { QueryClientProvider } from '@tanstack/react-query';
|
|
3
3
|
import { queryClient } from '../../api/index.esm.js';
|
|
4
|
-
import {
|
|
4
|
+
import { ComponentTab } from './ComponentTab.esm.js';
|
|
5
|
+
import { useEntity } from '@backstage/plugin-catalog-react';
|
|
6
|
+
import { SystemTab } from './SystemTab.esm.js';
|
|
5
7
|
|
|
6
8
|
const ApiiroTab = () => {
|
|
7
|
-
|
|
9
|
+
const { entity } = useEntity();
|
|
10
|
+
return /* @__PURE__ */ jsxs(QueryClientProvider, { client: queryClient, children: [
|
|
11
|
+
entity.kind === "Component" && /* @__PURE__ */ jsx(ComponentTab, {}),
|
|
12
|
+
entity.kind === "System" && /* @__PURE__ */ jsx(SystemTab, {})
|
|
13
|
+
] });
|
|
8
14
|
};
|
|
9
15
|
|
|
10
16
|
export { ApiiroTab };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TabProvider.esm.js","sources":["../../../src/pages/tab/TabProvider.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 {
|
|
1
|
+
{"version":3,"file":"TabProvider.esm.js","sources":["../../../src/pages/tab/TabProvider.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 { ComponentTab } from './ComponentTab';\nimport { useEntity } from '@backstage/plugin-catalog-react';\nimport { SystemTab } from './SystemTab';\n\n/**\n * Entity tab component that displays Apiiro security insights for system and component entities.\n * Shows metrics, risks, and other security-related information for a specific entity.\n * @public\n */\nexport const ApiiroTab = () => {\n const { entity } = useEntity();\n return (\n <QueryClientProvider client={queryClient}>\n {entity.kind === 'Component' && <ComponentTab />}\n {entity.kind === 'System' && <SystemTab />}\n </QueryClientProvider>\n );\n};\n"],"names":[],"mappings":";;;;;;;AA0BO,MAAM,YAAY,MAAM;AAC7B,EAAA,MAAM,EAAE,MAAA,EAAO,GAAI,SAAA,EAAU;AAC7B,EAAA,uBACE,IAAA,CAAC,mBAAA,EAAA,EAAoB,MAAA,EAAQ,WAAA,EAC1B,QAAA,EAAA;AAAA,IAAA,MAAA,CAAO,IAAA,KAAS,WAAA,oBAAe,GAAA,CAAC,YAAA,EAAA,EAAa,CAAA;AAAA,IAC7C,MAAA,CAAO,IAAA,KAAS,QAAA,oBAAY,GAAA,CAAC,SAAA,EAAA,EAAU;AAAA,GAAA,EAC1C,CAAA;AAEJ;;;;"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { jsx } from 'react/jsx-runtime';
|
|
2
|
+
import { Content } from '@backstage/core-components';
|
|
3
|
+
import { useApi, fetchApiRef } from '@backstage/core-plugin-api';
|
|
4
|
+
import { apiiroApiRef } from '../../api/index.esm.js';
|
|
5
|
+
import { useRepositoriesData } from '../../queries/repository.queries.esm.js';
|
|
6
|
+
import '@tanstack/react-query';
|
|
7
|
+
import { useEntity } from '@backstage/plugin-catalog-react';
|
|
8
|
+
import { WidgetMetricsGroup } from '../../components/MetricsGroup/WidgetMetricsGroup.esm.js';
|
|
9
|
+
import '../../components/common/ChartBox.esm.js';
|
|
10
|
+
import 'react';
|
|
11
|
+
import 'react-dom';
|
|
12
|
+
import '@mui/material/styles';
|
|
13
|
+
import '@mui/material/Box';
|
|
14
|
+
import '@mui/material/Typography';
|
|
15
|
+
import { StatusContainer } from '../../components/common/StatusContainer.esm.js';
|
|
16
|
+
import { APIIRO_PROJECT_ANNOTATION } from '@backstage-community/plugin-apiiro-common';
|
|
17
|
+
import { stringifyEntityRef } from '@backstage/catalog-model';
|
|
18
|
+
|
|
19
|
+
const ComponentWidget = () => {
|
|
20
|
+
const connectBackendApi = useApi(apiiroApiRef);
|
|
21
|
+
const { fetch } = useApi(fetchApiRef);
|
|
22
|
+
const { entity } = useEntity();
|
|
23
|
+
const repoId = entity?.metadata?.annotations?.[APIIRO_PROJECT_ANNOTATION] || void 0;
|
|
24
|
+
const entityRef = stringifyEntityRef(entity);
|
|
25
|
+
const { repositoriesData, repositoriesDataLoading, repositoriesDataError } = useRepositoriesData({
|
|
26
|
+
fetchApi: fetch,
|
|
27
|
+
connectApi: connectBackendApi,
|
|
28
|
+
enabled: !!repoId,
|
|
29
|
+
repositoryId: repoId,
|
|
30
|
+
entityRef
|
|
31
|
+
});
|
|
32
|
+
if (!repoId) {
|
|
33
|
+
return /* @__PURE__ */ jsx(
|
|
34
|
+
StatusContainer,
|
|
35
|
+
{
|
|
36
|
+
isLoading: false,
|
|
37
|
+
isEmpty: true,
|
|
38
|
+
wrapper: Content,
|
|
39
|
+
notFoundMessage: "The Apiiro annotation hasn't been configured, or the result for this repository is not available in Apiiro.",
|
|
40
|
+
children: null
|
|
41
|
+
}
|
|
42
|
+
);
|
|
43
|
+
}
|
|
44
|
+
const repositories = repositoriesData?.repositories;
|
|
45
|
+
const repositoryData = repositories?.[0];
|
|
46
|
+
return /* @__PURE__ */ jsx(
|
|
47
|
+
StatusContainer,
|
|
48
|
+
{
|
|
49
|
+
isLoading: repositoriesDataLoading,
|
|
50
|
+
error: repositoriesDataError,
|
|
51
|
+
isEmpty: !repositories || repositories.length === 0,
|
|
52
|
+
notFoundMessage: "Results for this repository are either unavailable on Apiiro or can not be accessed.",
|
|
53
|
+
children: /* @__PURE__ */ jsx(
|
|
54
|
+
WidgetMetricsGroup,
|
|
55
|
+
{
|
|
56
|
+
repositoryData,
|
|
57
|
+
repoId,
|
|
58
|
+
entityRef,
|
|
59
|
+
entity
|
|
60
|
+
}
|
|
61
|
+
)
|
|
62
|
+
}
|
|
63
|
+
);
|
|
64
|
+
};
|
|
65
|
+
|
|
66
|
+
export { ComponentWidget };
|
|
67
|
+
//# sourceMappingURL=ComponentWidget.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ComponentWidget.esm.js","sources":["../../../src/pages/widget/ComponentWidget.tsx"],"sourcesContent":["/*\n * Copyright 2026 The Backstage Authors\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { Content } from '@backstage/core-components';\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 { StatusContainer } from '../../components/common';\nimport { APIIRO_PROJECT_ANNOTATION } from '@backstage-community/plugin-apiiro-common';\nimport { stringifyEntityRef } from '@backstage/catalog-model';\n\nexport const ComponentWidget = () => {\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: !!repoId,\n repositoryId: repoId,\n entityRef,\n });\n\n if (!repoId) {\n return (\n <StatusContainer\n isLoading={false}\n isEmpty\n wrapper={Content}\n notFoundMessage=\"The Apiiro annotation hasn't been configured, or the result for this repository is not available in Apiiro.\"\n >\n {null}\n </StatusContainer>\n );\n }\n\n const repositories = repositoriesData?.repositories;\n const repositoryData = repositories?.[0];\n\n return (\n <StatusContainer\n isLoading={repositoriesDataLoading}\n error={repositoriesDataError}\n isEmpty={!repositories || repositories.length === 0}\n notFoundMessage=\"Results for this repository are either unavailable on Apiiro or can not be accessed.\"\n >\n <WidgetMetricsGroup\n repositoryData={repositoryData!}\n repoId={repoId!}\n entityRef={entityRef}\n entity={entity}\n />\n </StatusContainer>\n );\n};\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;AA0BO,MAAM,kBAAkB,MAAM;AACnC,EAAA,MAAM,iBAAA,GAAoB,OAAO,YAAY,CAAA;AAC7C,EAAA,MAAM,EAAE,KAAA,EAAM,GAAI,MAAA,CAAO,WAAW,CAAA;AACpC,EAAA,MAAM,EAAE,MAAA,EAAO,GAAI,SAAA,EAAU;AAC7B,EAAA,MAAM,MAAA,GACJ,MAAA,EAAQ,QAAA,EAAU,WAAA,GAAc,yBAAyB,CAAA,IAAK,MAAA;AAChE,EAAA,MAAM,SAAA,GAAY,mBAAmB,MAAM,CAAA;AAE3C,EAAA,MAAM,EAAE,gBAAA,EAAkB,uBAAA,EAAyB,qBAAA,KACjD,mBAAA,CAAoB;AAAA,IAClB,QAAA,EAAU,KAAA;AAAA,IACV,UAAA,EAAY,iBAAA;AAAA,IACZ,OAAA,EAAS,CAAC,CAAC,MAAA;AAAA,IACX,YAAA,EAAc,MAAA;AAAA,IACd;AAAA,GACD,CAAA;AAEH,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,uBACE,GAAA;AAAA,MAAC,eAAA;AAAA,MAAA;AAAA,QACC,SAAA,EAAW,KAAA;AAAA,QACX,OAAA,EAAO,IAAA;AAAA,QACP,OAAA,EAAS,OAAA;AAAA,QACT,eAAA,EAAgB,6GAAA;AAAA,QAEf,QAAA,EAAA;AAAA;AAAA,KACH;AAAA,EAEJ;AAEA,EAAA,MAAM,eAAe,gBAAA,EAAkB,YAAA;AACvC,EAAA,MAAM,cAAA,GAAiB,eAAe,CAAC,CAAA;AAEvC,EAAA,uBACE,GAAA;AAAA,IAAC,eAAA;AAAA,IAAA;AAAA,MACC,SAAA,EAAW,uBAAA;AAAA,MACX,KAAA,EAAO,qBAAA;AAAA,MACP,OAAA,EAAS,CAAC,YAAA,IAAgB,YAAA,CAAa,MAAA,KAAW,CAAA;AAAA,MAClD,eAAA,EAAgB,sFAAA;AAAA,MAEhB,QAAA,kBAAA,GAAA;AAAA,QAAC,kBAAA;AAAA,QAAA;AAAA,UACC,cAAA;AAAA,UACA,MAAA;AAAA,UACA,SAAA;AAAA,UACA;AAAA;AAAA;AACF;AAAA,GACF;AAEJ;;;;"}
|