@flightctl/ui-components 0.9.2 → 0.10.0-rc1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/src/components/DetailsPage/DetailsPage.d.ts +2 -1
- package/dist/src/components/DetailsPage/DetailsPage.d.ts.map +1 -1
- package/dist/src/components/DetailsPage/DetailsPage.js +2 -1
- package/dist/src/components/DetailsPage/DetailsPage.js.map +1 -1
- package/dist/src/components/DetailsPage/DetailsPageActions.d.ts +10 -0
- package/dist/src/components/DetailsPage/DetailsPageActions.d.ts.map +1 -1
- package/dist/src/components/DetailsPage/DetailsPageActions.js +23 -1
- package/dist/src/components/DetailsPage/DetailsPageActions.js.map +1 -1
- package/dist/src/components/Device/DeviceDetails/DeviceDetailsPage.d.ts.map +1 -1
- package/dist/src/components/Device/DeviceDetails/DeviceDetailsPage.js +29 -3
- package/dist/src/components/Device/DeviceDetails/DeviceDetailsPage.js.map +1 -1
- package/dist/src/components/Device/DeviceDetails/DeviceDetailsTab.d.ts.map +1 -1
- package/dist/src/components/Device/DeviceDetails/DeviceDetailsTab.js +0 -4
- package/dist/src/components/Device/DeviceDetails/DeviceDetailsTab.js.map +1 -1
- package/dist/src/components/Device/DeviceDetails/DeviceDetailsTabContent/StatusContent.d.ts.map +1 -1
- package/dist/src/components/Device/DeviceDetails/DeviceDetailsTabContent/StatusContent.js +8 -2
- package/dist/src/components/Device/DeviceDetails/DeviceDetailsTabContent/StatusContent.js.map +1 -1
- package/dist/src/components/Device/DevicesPage/DecommissionedDeviceTableRow.d.ts.map +1 -1
- package/dist/src/components/Device/DevicesPage/DecommissionedDeviceTableRow.js +1 -3
- package/dist/src/components/Device/DevicesPage/DecommissionedDeviceTableRow.js.map +1 -1
- package/dist/src/components/Device/DevicesPage/DecommissionedDevicesTable.d.ts.map +1 -1
- package/dist/src/components/Device/DevicesPage/DecommissionedDevicesTable.js +0 -3
- package/dist/src/components/Device/DevicesPage/DecommissionedDevicesTable.js.map +1 -1
- package/dist/src/components/Device/DevicesPage/DeviceToolbarFilters.d.ts.map +1 -1
- package/dist/src/components/Device/DevicesPage/DeviceToolbarFilters.js +3 -1
- package/dist/src/components/Device/DevicesPage/DeviceToolbarFilters.js.map +1 -1
- package/dist/src/components/Device/DevicesPage/DevicesPage.d.ts.map +1 -1
- package/dist/src/components/Device/DevicesPage/DevicesPage.js +1 -1
- package/dist/src/components/Device/DevicesPage/DevicesPage.js.map +1 -1
- package/dist/src/components/Device/DevicesPage/EnrolledDeviceTableRow.d.ts +3 -1
- package/dist/src/components/Device/DevicesPage/EnrolledDeviceTableRow.d.ts.map +1 -1
- package/dist/src/components/Device/DevicesPage/EnrolledDeviceTableRow.js +12 -4
- package/dist/src/components/Device/DevicesPage/EnrolledDeviceTableRow.js.map +1 -1
- package/dist/src/components/Device/DevicesPage/EnrolledDevicesTable.d.ts +2 -1
- package/dist/src/components/Device/DevicesPage/EnrolledDevicesTable.d.ts.map +1 -1
- package/dist/src/components/Device/DevicesPage/EnrolledDevicesTable.js +7 -6
- package/dist/src/components/Device/DevicesPage/EnrolledDevicesTable.js.map +1 -1
- package/dist/src/components/Device/SystemdUnitsModal/TrackSystemdUnitsForm.js +1 -1
- package/dist/src/components/Device/SystemdUnitsModal/TrackSystemdUnitsForm.js.map +1 -1
- package/dist/src/components/Events/useEvents.d.ts.map +1 -1
- package/dist/src/components/Events/useEvents.js +12 -0
- package/dist/src/components/Events/useEvents.js.map +1 -1
- package/dist/src/components/Fleet/CreateFleet/steps/UpdatePolicyStep.js +1 -1
- package/dist/src/components/Fleet/CreateFleet/steps/UpdatePolicyStep.js.map +1 -1
- package/dist/src/components/Fleet/FleetDetails/FleetDetailsPage.d.ts.map +1 -1
- package/dist/src/components/Fleet/FleetDetails/FleetDetailsPage.js +4 -3
- package/dist/src/components/Fleet/FleetDetails/FleetDetailsPage.js.map +1 -1
- package/dist/src/components/Fleet/FleetDetails/FleetDevicesCharts.d.ts.map +1 -1
- package/dist/src/components/Fleet/FleetDetails/FleetDevicesCharts.js +7 -1
- package/dist/src/components/Fleet/FleetDetails/FleetDevicesCharts.js.map +1 -1
- package/dist/src/components/Fleet/FleetDetails/FleetRestoreBanner.d.ts +8 -0
- package/dist/src/components/Fleet/FleetDetails/FleetRestoreBanner.d.ts.map +1 -0
- package/dist/src/components/Fleet/FleetDetails/FleetRestoreBanner.js +36 -0
- package/dist/src/components/Fleet/FleetDetails/FleetRestoreBanner.js.map +1 -0
- package/dist/src/components/Fleet/FleetsPage.d.ts.map +1 -1
- package/dist/src/components/Fleet/FleetsPage.js +2 -0
- package/dist/src/components/Fleet/FleetsPage.js.map +1 -1
- package/dist/src/components/ListPage/ListPageActions.d.ts +3 -2
- package/dist/src/components/ListPage/ListPageActions.d.ts.map +1 -1
- package/dist/src/components/ListPage/ListPageActions.js +27 -1
- package/dist/src/components/ListPage/ListPageActions.js.map +1 -1
- package/dist/src/components/Masthead/CommandLineToolsPage.d.ts.map +1 -1
- package/dist/src/components/Masthead/CommandLineToolsPage.js +18 -14
- package/dist/src/components/Masthead/CommandLineToolsPage.js.map +1 -1
- package/dist/src/components/OverviewPage/Cards/Alerts/AlertsCard.d.ts.map +1 -1
- package/dist/src/components/OverviewPage/Cards/Alerts/AlertsCard.js +15 -5
- package/dist/src/components/OverviewPage/Cards/Alerts/AlertsCard.js.map +1 -1
- package/dist/src/components/OverviewPage/Cards/Status/DeviceStatusChart.d.ts.map +1 -1
- package/dist/src/components/OverviewPage/Cards/Status/DeviceStatusChart.js +7 -1
- package/dist/src/components/OverviewPage/Cards/Status/DeviceStatusChart.js.map +1 -1
- package/dist/src/components/OverviewPage/Overview.d.ts.map +1 -1
- package/dist/src/components/OverviewPage/Overview.js +4 -2
- package/dist/src/components/OverviewPage/Overview.js.map +1 -1
- package/dist/src/components/Status/StatusDisplay.d.ts +3 -1
- package/dist/src/components/Status/StatusDisplay.d.ts.map +1 -1
- package/dist/src/components/Status/StatusDisplay.js +8 -8
- package/dist/src/components/Status/StatusDisplay.js.map +1 -1
- package/dist/src/components/SystemRestore/PendingSyncDevicesAlert.d.ts +7 -0
- package/dist/src/components/SystemRestore/PendingSyncDevicesAlert.d.ts.map +1 -0
- package/dist/src/components/SystemRestore/PendingSyncDevicesAlert.js +22 -0
- package/dist/src/components/SystemRestore/PendingSyncDevicesAlert.js.map +1 -0
- package/dist/src/components/SystemRestore/SuspendedDevicesAlert.d.ts +16 -0
- package/dist/src/components/SystemRestore/SuspendedDevicesAlert.d.ts.map +1 -0
- package/dist/src/components/SystemRestore/SuspendedDevicesAlert.js +75 -0
- package/dist/src/components/SystemRestore/SuspendedDevicesAlert.js.map +1 -0
- package/dist/src/components/SystemRestore/SystemRestoreBanners.css +6 -0
- package/dist/src/components/SystemRestore/SystemRestoreBanners.d.ts +28 -0
- package/dist/src/components/SystemRestore/SystemRestoreBanners.d.ts.map +1 -0
- package/dist/src/components/SystemRestore/SystemRestoreBanners.js +38 -0
- package/dist/src/components/SystemRestore/SystemRestoreBanners.js.map +1 -0
- package/dist/src/components/charts/utils.js +1 -1
- package/dist/src/components/charts/utils.js.map +1 -1
- package/dist/src/components/common/OrganizationGuard.d.ts +13 -0
- package/dist/src/components/common/OrganizationGuard.d.ts.map +1 -0
- package/dist/src/components/common/OrganizationGuard.js +106 -0
- package/dist/src/components/common/OrganizationGuard.js.map +1 -0
- package/dist/src/components/common/OrganizationSelector.d.ts +8 -0
- package/dist/src/components/common/OrganizationSelector.d.ts.map +1 -0
- package/dist/src/components/common/OrganizationSelector.js +92 -0
- package/dist/src/components/common/OrganizationSelector.js.map +1 -0
- package/dist/src/components/common/PageNavigation.d.ts +4 -0
- package/dist/src/components/common/PageNavigation.d.ts.map +1 -0
- package/dist/src/components/common/PageNavigation.js +46 -0
- package/dist/src/components/common/PageNavigation.js.map +1 -0
- package/dist/src/components/form/FilterSelect.css +3 -4
- package/dist/src/components/form/validations.d.ts +9 -0
- package/dist/src/components/form/validations.d.ts.map +1 -1
- package/dist/src/components/form/validations.js +12 -1
- package/dist/src/components/form/validations.js.map +1 -1
- package/dist/src/components/modals/ResumeDevicesModal/ResumeDevicesModal.d.ts +15 -0
- package/dist/src/components/modals/ResumeDevicesModal/ResumeDevicesModal.d.ts.map +1 -0
- package/dist/src/components/modals/ResumeDevicesModal/ResumeDevicesModal.js +56 -0
- package/dist/src/components/modals/ResumeDevicesModal/ResumeDevicesModal.js.map +1 -0
- package/dist/src/components/modals/massModals/ResumeDevicesModal/MassResumeDevicesModal.d.ts +7 -0
- package/dist/src/components/modals/massModals/ResumeDevicesModal/MassResumeDevicesModal.d.ts.map +1 -0
- package/dist/src/components/modals/massModals/ResumeDevicesModal/MassResumeDevicesModal.js +265 -0
- package/dist/src/components/modals/massModals/ResumeDevicesModal/MassResumeDevicesModal.js.map +1 -0
- package/dist/src/components/modals/massModals/ResumeDevicesModal/ResumeAllDevicesConfirmationDialog.d.ts +9 -0
- package/dist/src/components/modals/massModals/ResumeDevicesModal/ResumeAllDevicesConfirmationDialog.d.ts.map +1 -0
- package/dist/src/components/modals/massModals/ResumeDevicesModal/ResumeAllDevicesConfirmationDialog.js +27 -0
- package/dist/src/components/modals/massModals/ResumeDevicesModal/ResumeAllDevicesConfirmationDialog.js.map +1 -0
- package/dist/src/hooks/useAccessReview.d.ts.map +1 -1
- package/dist/src/hooks/useAccessReview.js +17 -4
- package/dist/src/hooks/useAccessReview.js.map +1 -1
- package/dist/src/hooks/useAlertsEnabled.d.ts +2 -0
- package/dist/src/hooks/useAlertsEnabled.d.ts.map +1 -0
- package/dist/src/hooks/useAlertsEnabled.js +50 -0
- package/dist/src/hooks/useAlertsEnabled.js.map +1 -0
- package/dist/src/hooks/useAppContext.d.ts +3 -6
- package/dist/src/hooks/useAppContext.d.ts.map +1 -1
- package/dist/src/hooks/useAppContext.js +1 -0
- package/dist/src/hooks/useAppContext.js.map +1 -1
- package/dist/src/hooks/useFetch.d.ts +6 -7
- package/dist/src/hooks/useFetch.d.ts.map +1 -1
- package/dist/src/hooks/useFetch.js +2 -3
- package/dist/src/hooks/useFetch.js.map +1 -1
- package/dist/src/hooks/useFetchPeriodically.d.ts.map +1 -1
- package/dist/src/hooks/useFetchPeriodically.js +4 -9
- package/dist/src/hooks/useFetchPeriodically.js.map +1 -1
- package/dist/src/hooks/useSystemRestoreContext.d.ts +16 -0
- package/dist/src/hooks/useSystemRestoreContext.d.ts.map +1 -0
- package/dist/src/hooks/useSystemRestoreContext.js +45 -0
- package/dist/src/hooks/useSystemRestoreContext.js.map +1 -0
- package/dist/src/types/extraTypes.d.ts +17 -18
- package/dist/src/types/extraTypes.d.ts.map +1 -1
- package/dist/src/types/extraTypes.js +1 -6
- package/dist/src/types/extraTypes.js.map +1 -1
- package/dist/src/types/rbac.d.ts +1 -0
- package/dist/src/types/rbac.d.ts.map +1 -1
- package/dist/src/types/rbac.js +1 -0
- package/dist/src/types/rbac.js.map +1 -1
- package/dist/src/utils/api.d.ts +2 -15
- package/dist/src/utils/api.d.ts.map +1 -1
- package/dist/src/utils/api.js +1 -40
- package/dist/src/utils/api.js.map +1 -1
- package/dist/src/utils/devices.d.ts +2 -0
- package/dist/src/utils/devices.d.ts.map +1 -1
- package/dist/src/utils/devices.js +11 -1
- package/dist/src/utils/devices.js.map +1 -1
- package/dist/src/utils/organizationStorage.d.ts +4 -0
- package/dist/src/utils/organizationStorage.d.ts.map +1 -0
- package/dist/src/utils/organizationStorage.js +18 -0
- package/dist/src/utils/organizationStorage.js.map +1 -0
- package/dist/src/utils/query.d.ts +2 -0
- package/dist/src/utils/query.d.ts.map +1 -1
- package/dist/src/utils/query.js +16 -0
- package/dist/src/utils/query.js.map +1 -1
- package/dist/src/utils/status/common.d.ts +1 -0
- package/dist/src/utils/status/common.d.ts.map +1 -1
- package/dist/src/utils/status/common.js.map +1 -1
- package/dist/src/utils/status/devices.d.ts +5 -0
- package/dist/src/utils/status/devices.d.ts.map +1 -1
- package/dist/src/utils/status/devices.js +44 -5
- package/dist/src/utils/status/devices.js.map +1 -1
- package/dist/src/utils/status/fleet.js +1 -1
- package/dist/src/utils/status/fleet.js.map +1 -1
- package/dist/src/utils/status/repository.js +1 -1
- package/dist/src/utils/status/repository.js.map +1 -1
- package/package.json +1 -1
- package/src/components/DetailsPage/DetailsPage.tsx +3 -0
- package/src/components/DetailsPage/DetailsPageActions.tsx +45 -0
- package/src/components/Device/DeviceDetails/DeviceDetailsPage.tsx +57 -5
- package/src/components/Device/DeviceDetails/DeviceDetailsTab.tsx +0 -5
- package/src/components/Device/DeviceDetails/DeviceDetailsTabContent/StatusContent.tsx +11 -3
- package/src/components/Device/DevicesPage/DecommissionedDeviceTableRow.tsx +0 -2
- package/src/components/Device/DevicesPage/DecommissionedDevicesTable.tsx +0 -3
- package/src/components/Device/DevicesPage/DeviceToolbarFilters.tsx +5 -1
- package/src/components/Device/DevicesPage/DevicesPage.tsx +1 -0
- package/src/components/Device/DevicesPage/EnrolledDeviceTableRow.tsx +15 -3
- package/src/components/Device/DevicesPage/EnrolledDevicesTable.tsx +11 -5
- package/src/components/Device/SystemdUnitsModal/TrackSystemdUnitsForm.tsx +1 -1
- package/src/components/Events/useEvents.ts +12 -0
- package/src/components/Fleet/CreateFleet/steps/UpdatePolicyStep.tsx +1 -1
- package/src/components/Fleet/FleetDetails/FleetDetailsPage.tsx +4 -5
- package/src/components/Fleet/FleetDetails/FleetDevicesCharts.tsx +9 -3
- package/src/components/Fleet/FleetDetails/FleetRestoreBanner.tsx +46 -0
- package/src/components/Fleet/FleetsPage.tsx +2 -0
- package/src/components/ListPage/ListPageActions.tsx +46 -3
- package/src/components/Masthead/CommandLineToolsPage.tsx +17 -14
- package/src/components/OverviewPage/Cards/Alerts/AlertsCard.tsx +19 -5
- package/src/components/OverviewPage/Cards/Status/DeviceStatusChart.tsx +8 -2
- package/src/components/OverviewPage/Overview.tsx +5 -2
- package/src/components/Status/StatusDisplay.tsx +32 -23
- package/src/components/SystemRestore/PendingSyncDevicesAlert.tsx +36 -0
- package/src/components/SystemRestore/SuspendedDevicesAlert.tsx +144 -0
- package/src/components/SystemRestore/SystemRestoreBanners.css +6 -0
- package/src/components/SystemRestore/SystemRestoreBanners.tsx +82 -0
- package/src/components/charts/utils.ts +1 -1
- package/src/components/common/OrganizationGuard.tsx +124 -0
- package/src/components/common/OrganizationSelector.tsx +192 -0
- package/src/components/common/PageNavigation.tsx +103 -0
- package/src/components/form/FilterSelect.css +3 -4
- package/src/components/form/validations.ts +14 -0
- package/src/components/modals/ResumeDevicesModal/ResumeDevicesModal.tsx +114 -0
- package/src/components/modals/massModals/ResumeDevicesModal/MassResumeDevicesModal.tsx +465 -0
- package/src/components/modals/massModals/ResumeDevicesModal/ResumeAllDevicesConfirmationDialog.tsx +55 -0
- package/src/hooks/useAccessReview.ts +20 -4
- package/src/hooks/useAlertsEnabled.ts +50 -0
- package/src/hooks/useAppContext.tsx +9 -7
- package/src/hooks/useFetch.ts +1 -3
- package/src/hooks/useFetchPeriodically.ts +4 -11
- package/src/hooks/useSystemRestoreContext.tsx +54 -0
- package/src/types/extraTypes.ts +17 -23
- package/src/types/rbac.ts +1 -0
- package/src/utils/api.ts +2 -51
- package/src/utils/devices.ts +11 -1
- package/src/utils/organizationStorage.ts +13 -0
- package/src/utils/query.ts +22 -0
- package/src/utils/status/common.ts +1 -0
- package/src/utils/status/devices.ts +49 -2
- package/src/utils/status/fleet.ts +1 -1
- package/src/utils/status/repository.ts +1 -1
- package/dist/src/hooks/useAlerts.d.ts +0 -26
- package/dist/src/hooks/useAlerts.d.ts.map +0 -1
- package/dist/src/hooks/useAlerts.js +0 -114
- package/dist/src/hooks/useAlerts.js.map +0 -1
- package/dist/src/utils/metrics.d.ts +0 -9
- package/dist/src/utils/metrics.d.ts.map +0 -1
- package/dist/src/utils/metrics.js +0 -48
- package/dist/src/utils/metrics.js.map +0 -1
- package/src/hooks/useAlerts.ts +0 -147
- package/src/utils/metrics.ts +0 -49
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import * as React from 'react';
|
|
2
2
|
import { ApiQuery } from '../types/extraTypes';
|
|
3
|
-
import { getQueryStringHash, getRequestQueryString } from '../utils/api';
|
|
4
3
|
|
|
5
4
|
import { useFetch } from './useFetch';
|
|
6
5
|
|
|
@@ -20,22 +19,16 @@ export const useFetchPeriodically = <R>(
|
|
|
20
19
|
|
|
21
20
|
const { get } = useFetch();
|
|
22
21
|
|
|
23
|
-
// When the query parameters change, the hash will too. We must perform a refetch outside the timeout loop
|
|
24
|
-
const queryStringHash = getQueryStringHash(query);
|
|
25
|
-
|
|
26
|
-
// Callback that generates the updated query for refreshes. It may provide updated values for parameters such as from/to for metric queries
|
|
27
|
-
const getRequestQuery = React.useCallback(() => getRequestQueryString(query), [query]);
|
|
28
|
-
|
|
29
22
|
React.useEffect(() => {
|
|
30
23
|
let abortController: AbortController;
|
|
31
24
|
|
|
32
25
|
const fetchPeriodically = async (id: number) => {
|
|
33
26
|
while (ref.current === id) {
|
|
34
|
-
const requestQuery =
|
|
27
|
+
const requestQuery = query.endpoint;
|
|
35
28
|
if (requestQuery) {
|
|
36
29
|
try {
|
|
37
30
|
abortController = new AbortController();
|
|
38
|
-
if (id > 0 && prevResolvedQueryHash.current !==
|
|
31
|
+
if (id > 0 && prevResolvedQueryHash.current !== query.endpoint) {
|
|
39
32
|
setIsUpdating(true);
|
|
40
33
|
}
|
|
41
34
|
|
|
@@ -66,7 +59,7 @@ export const useFetchPeriodically = <R>(
|
|
|
66
59
|
setError(undefined);
|
|
67
60
|
setData(undefined);
|
|
68
61
|
}
|
|
69
|
-
prevResolvedQueryHash.current =
|
|
62
|
+
prevResolvedQueryHash.current = query.endpoint;
|
|
70
63
|
await new Promise((resolve) => setTimeout(resolve, query.timeout || TIMEOUT));
|
|
71
64
|
}
|
|
72
65
|
};
|
|
@@ -78,7 +71,7 @@ export const useFetchPeriodically = <R>(
|
|
|
78
71
|
abortController?.abort();
|
|
79
72
|
};
|
|
80
73
|
// eslint-disable-next-line
|
|
81
|
-
}, [get, forceUpdate,
|
|
74
|
+
}, [get, forceUpdate, query.endpoint]);
|
|
82
75
|
|
|
83
76
|
const refetch = React.useCallback(() => setForceUpdate((val) => val + 1), []);
|
|
84
77
|
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import { DeviceSummaryStatusType, DevicesSummary } from '@flightctl/types';
|
|
3
|
+
import { useDevicesSummary } from '../components/Device/DevicesPage/useDevices';
|
|
4
|
+
import { useAccessReview } from './useAccessReview';
|
|
5
|
+
import { RESOURCE, VERB } from '../types/rbac';
|
|
6
|
+
|
|
7
|
+
interface SystemRestoreContextData {
|
|
8
|
+
summaryStatus: DevicesSummary['summaryStatus'] | undefined;
|
|
9
|
+
isLoading: boolean;
|
|
10
|
+
pendingSyncCount: number;
|
|
11
|
+
suspendedCount: number;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
const SystemRestoreContext = React.createContext<SystemRestoreContextData | undefined>(undefined);
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Provider that fetches global (unfiltered) devices summary for system restore alerts.
|
|
18
|
+
* This provides data needed for showing consistent restore banners across all pages.
|
|
19
|
+
*/
|
|
20
|
+
export const SystemRestoreProvider = ({ children }: React.PropsWithChildren) => {
|
|
21
|
+
const [canListDevices] = useAccessReview(RESOURCE.DEVICE, VERB.LIST);
|
|
22
|
+
|
|
23
|
+
// We obtain the unfiltered device summary to detect if any devices are in system restore statuses
|
|
24
|
+
const [devicesSummary, isLoading] = useDevicesSummary({});
|
|
25
|
+
|
|
26
|
+
const contextValue = React.useMemo(() => {
|
|
27
|
+
const pendingSyncCount = canListDevices
|
|
28
|
+
? devicesSummary?.summaryStatus?.[DeviceSummaryStatusType.DeviceSummaryStatusAwaitingReconnect] || 0
|
|
29
|
+
: 0;
|
|
30
|
+
|
|
31
|
+
const suspendedCount = canListDevices
|
|
32
|
+
? devicesSummary?.summaryStatus?.[DeviceSummaryStatusType.DeviceSummaryStatusConflictPaused] || 0
|
|
33
|
+
: 0;
|
|
34
|
+
|
|
35
|
+
return {
|
|
36
|
+
summaryStatus: canListDevices ? devicesSummary?.summaryStatus : undefined,
|
|
37
|
+
isLoading: canListDevices ? isLoading : false,
|
|
38
|
+
pendingSyncCount,
|
|
39
|
+
suspendedCount,
|
|
40
|
+
};
|
|
41
|
+
}, [devicesSummary, isLoading, canListDevices]);
|
|
42
|
+
|
|
43
|
+
return <SystemRestoreContext.Provider value={contextValue}>{children}</SystemRestoreContext.Provider>;
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
export const useSystemRestore = (): SystemRestoreContextData => {
|
|
47
|
+
const context = React.useContext(SystemRestoreContext);
|
|
48
|
+
|
|
49
|
+
if (context === undefined) {
|
|
50
|
+
throw new Error('useSystemRestore must be used within a SystemRestoreProvider');
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
return context;
|
|
54
|
+
};
|
package/src/types/extraTypes.ts
CHANGED
|
@@ -12,22 +12,6 @@ import {
|
|
|
12
12
|
ResourceSync,
|
|
13
13
|
} from '@flightctl/types';
|
|
14
14
|
|
|
15
|
-
export enum FlightControlMetrics {
|
|
16
|
-
ACTIVE_AGENT_COUNT_METRIC = 'flightctl_devicesimulator_active_agent_count',
|
|
17
|
-
TOTAL_API_REQUESTS_METRIC = 'flightctl_devicesimulator_api_requests_total',
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
export type MetricValue = [number, number | string];
|
|
21
|
-
|
|
22
|
-
export interface PrometheusMetric {
|
|
23
|
-
metric: {
|
|
24
|
-
__name__: FlightControlMetrics;
|
|
25
|
-
job: string;
|
|
26
|
-
};
|
|
27
|
-
value?: MetricValue;
|
|
28
|
-
values?: Array<MetricValue>;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
15
|
export interface FlightCtlLabel {
|
|
32
16
|
key: string;
|
|
33
17
|
value?: string;
|
|
@@ -39,15 +23,8 @@ export interface ApiQuery {
|
|
|
39
23
|
timeout?: number;
|
|
40
24
|
}
|
|
41
25
|
|
|
42
|
-
export interface MetricsQuery {
|
|
43
|
-
metrics: FlightControlMetrics[];
|
|
44
|
-
period: string;
|
|
45
|
-
}
|
|
46
|
-
|
|
47
26
|
export type FleetConditionType = ConditionType.FleetValid | 'Invalid' | 'SyncPending';
|
|
48
27
|
|
|
49
|
-
export type FlightControlQuery = ApiQuery | MetricsQuery;
|
|
50
|
-
|
|
51
28
|
export enum DeviceAnnotation {
|
|
52
29
|
TemplateVersion = 'fleet-controller/templateVersion',
|
|
53
30
|
RenderedVersion = 'device-controller/renderedVersion',
|
|
@@ -81,3 +58,20 @@ export type CliArtifactsResponse = {
|
|
|
81
58
|
baseUrl: string;
|
|
82
59
|
artifacts: CliArtifact[];
|
|
83
60
|
};
|
|
61
|
+
|
|
62
|
+
// AlertManager alert structure
|
|
63
|
+
export type AlertManagerAlert = {
|
|
64
|
+
fingerprint: string;
|
|
65
|
+
labels: Record<string, string>;
|
|
66
|
+
annotations: Record<string, string>;
|
|
67
|
+
startsAt: string;
|
|
68
|
+
endsAt: string;
|
|
69
|
+
updatedAt: string;
|
|
70
|
+
status: {
|
|
71
|
+
state: string;
|
|
72
|
+
inhibitedBy: string[];
|
|
73
|
+
mutedBy: string[];
|
|
74
|
+
silencedBy: string[];
|
|
75
|
+
};
|
|
76
|
+
receivers: Array<{ name: string }>;
|
|
77
|
+
};
|
package/src/types/rbac.ts
CHANGED
|
@@ -13,6 +13,7 @@ export enum RESOURCE {
|
|
|
13
13
|
DEVICE = 'devices',
|
|
14
14
|
DEVICE_CONSOLE = 'devices/console',
|
|
15
15
|
DEVICE_DECOMMISSION = 'devices/decommission',
|
|
16
|
+
DEVICE_RESUME = 'devices/resume',
|
|
16
17
|
REPOSITORY = 'repositories',
|
|
17
18
|
RESOURCE_SYNC = 'resourcesyncs',
|
|
18
19
|
ENROLLMENT_REQUEST = 'enrollmentrequests',
|
package/src/utils/api.ts
CHANGED
|
@@ -10,47 +10,7 @@ import {
|
|
|
10
10
|
ResourceSyncList,
|
|
11
11
|
} from '@flightctl/types';
|
|
12
12
|
|
|
13
|
-
import { AnnotationType
|
|
14
|
-
import { getPeriodTimestamps } from '../utils/metrics';
|
|
15
|
-
|
|
16
|
-
const isApiQuery = (query: ApiQuery | MetricsQuery): query is ApiQuery => 'endpoint' in query;
|
|
17
|
-
|
|
18
|
-
const getApiQueryString = (apiQuery: ApiQuery) => apiQuery.endpoint;
|
|
19
|
-
|
|
20
|
-
const getMetricsQueryString = (metricsQuery: MetricsQuery) => {
|
|
21
|
-
const { metrics, period } = metricsQuery;
|
|
22
|
-
const range = getPeriodTimestamps(period);
|
|
23
|
-
|
|
24
|
-
const metric = metrics.length === 1 ? metrics[0] : `__name__=~"${metrics.join('|')}"`;
|
|
25
|
-
let query = `query=${metric}`;
|
|
26
|
-
if (range) {
|
|
27
|
-
query += `&start=${range.from}&end=${range.to}&step=${range.step}`;
|
|
28
|
-
}
|
|
29
|
-
return query;
|
|
30
|
-
};
|
|
31
|
-
|
|
32
|
-
/**
|
|
33
|
-
* Builds the query string hash that identifies this query based only on its parameters
|
|
34
|
-
* @param queryObj
|
|
35
|
-
*/
|
|
36
|
-
const getQueryStringHash = (queryObj: FlightControlQuery) => {
|
|
37
|
-
if (isApiQuery(queryObj)) {
|
|
38
|
-
return getApiQueryString(queryObj);
|
|
39
|
-
}
|
|
40
|
-
// We just need to generate a unique string based on the data, but without the timestamps
|
|
41
|
-
return `metric=${queryObj.metrics.join(',')}&period=${queryObj.period}`;
|
|
42
|
-
};
|
|
43
|
-
|
|
44
|
-
/**
|
|
45
|
-
* Builds the query string that should be triggered, adding time parameters etc to the base query string
|
|
46
|
-
* @param queryObj
|
|
47
|
-
*/
|
|
48
|
-
const getRequestQueryString = (queryObj: FlightControlQuery) => {
|
|
49
|
-
if (isApiQuery(queryObj)) {
|
|
50
|
-
return getApiQueryString(queryObj);
|
|
51
|
-
}
|
|
52
|
-
return getMetricsQueryString(queryObj);
|
|
53
|
-
};
|
|
13
|
+
import { AnnotationType } from '../types/extraTypes';
|
|
54
14
|
|
|
55
15
|
export type ApiList = EnrollmentRequestList | DeviceList | FleetList | RepositoryList | ResourceSyncList;
|
|
56
16
|
|
|
@@ -82,13 +42,4 @@ const getCondition = (
|
|
|
82
42
|
return undefined;
|
|
83
43
|
};
|
|
84
44
|
|
|
85
|
-
export {
|
|
86
|
-
isApiQuery,
|
|
87
|
-
getRequestQueryString,
|
|
88
|
-
getQueryStringHash,
|
|
89
|
-
getMetadataAnnotation,
|
|
90
|
-
getApiQueryString,
|
|
91
|
-
getMetricsQueryString,
|
|
92
|
-
getApiListCount,
|
|
93
|
-
getCondition,
|
|
94
|
-
};
|
|
45
|
+
export { getMetadataAnnotation, getApiListCount, getCondition };
|
package/src/utils/devices.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Device, ObjectMeta } from '@flightctl/types';
|
|
1
|
+
import { Device, DeviceSummaryStatusType, ObjectMeta } from '@flightctl/types';
|
|
2
2
|
import { TFunction } from 'react-i18next';
|
|
3
3
|
|
|
4
4
|
const deviceFleetRegExp = /^Fleet\/(?<fleetName>.*)$/;
|
|
@@ -26,3 +26,13 @@ export const getDecommissionDisabledReason = (device: Device, t: TFunction) => {
|
|
|
26
26
|
}
|
|
27
27
|
return undefined;
|
|
28
28
|
};
|
|
29
|
+
|
|
30
|
+
export const isDeviceResumable = (device: Device) =>
|
|
31
|
+
device.status?.summary.status === DeviceSummaryStatusType.DeviceSummaryStatusConflictPaused;
|
|
32
|
+
|
|
33
|
+
export const getResumeDisabledReason = (device: Device, t: TFunction) => {
|
|
34
|
+
if (!isDeviceResumable(device)) {
|
|
35
|
+
return t('Device is not suspended.');
|
|
36
|
+
}
|
|
37
|
+
return undefined;
|
|
38
|
+
};
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export const ORGANIZATION_STORAGE_KEY = 'flightctl-current-organization';
|
|
2
|
+
|
|
3
|
+
export const getCurrentOrganizationId = (): string | null => {
|
|
4
|
+
return localStorage.getItem(ORGANIZATION_STORAGE_KEY);
|
|
5
|
+
};
|
|
6
|
+
|
|
7
|
+
export const storeCurrentOrganizationId = (orgId: string): void => {
|
|
8
|
+
if (orgId) {
|
|
9
|
+
localStorage.setItem(ORGANIZATION_STORAGE_KEY, orgId);
|
|
10
|
+
} else {
|
|
11
|
+
localStorage.removeItem(ORGANIZATION_STORAGE_KEY);
|
|
12
|
+
}
|
|
13
|
+
};
|
package/src/utils/query.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { FlightCtlLabel } from '../types/extraTypes';
|
|
2
2
|
import { labelToExactApiMatchString, textToPartialApiMatchString } from './labels';
|
|
3
|
+
import { DeviceSummaryStatusType } from '@flightctl/types';
|
|
3
4
|
|
|
4
5
|
const addQueryConditions = (fieldSelectors: string[], fieldSelector: string, values?: string[]) => {
|
|
5
6
|
if (values?.length === 1) {
|
|
@@ -74,6 +75,27 @@ export const commonQueries = {
|
|
|
74
75
|
return `resourcesyncs?${searchParams.toString()}`;
|
|
75
76
|
},
|
|
76
77
|
getRepositoryById: (repositoryId: string) => `repositories/${repositoryId}`,
|
|
78
|
+
getSuspendedDeviceCountByLabels: (labels: FlightCtlLabel[]) => {
|
|
79
|
+
const searchParams = new URLSearchParams({
|
|
80
|
+
limit: '1',
|
|
81
|
+
});
|
|
82
|
+
searchParams.set('labelSelector', labels.map(labelToExactApiMatchString).join(','));
|
|
83
|
+
searchParams.set(
|
|
84
|
+
'fieldSelector',
|
|
85
|
+
`status.summary.status=${DeviceSummaryStatusType.DeviceSummaryStatusConflictPaused}`,
|
|
86
|
+
);
|
|
87
|
+
return `devices?${searchParams.toString()}`;
|
|
88
|
+
},
|
|
89
|
+
getAllSuspendedDevicesCount: () => {
|
|
90
|
+
const searchParams = new URLSearchParams({
|
|
91
|
+
limit: '1',
|
|
92
|
+
});
|
|
93
|
+
searchParams.set(
|
|
94
|
+
'fieldSelector',
|
|
95
|
+
`status.summary.status=${DeviceSummaryStatusType.DeviceSummaryStatusConflictPaused}`,
|
|
96
|
+
);
|
|
97
|
+
return `devices?${searchParams.toString()}`;
|
|
98
|
+
},
|
|
77
99
|
};
|
|
78
100
|
|
|
79
101
|
export { addQueryConditions, addTextContainsCondition, setLabelParams };
|
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
import { TFunction } from 'react-i18next';
|
|
2
|
-
import { PowerOffIcon } from '@patternfly/react-icons/dist/js/icons';
|
|
3
|
-
import
|
|
2
|
+
import { PowerOffIcon } from '@patternfly/react-icons/dist/js/icons/power-off-icon';
|
|
3
|
+
import { PauseCircleIcon } from '@patternfly/react-icons/dist/js/icons/pause-circle-icon';
|
|
4
|
+
import { BanIcon } from '@patternfly/react-icons/dist/js/icons/ban-icon';
|
|
5
|
+
import { PendingIcon } from '@patternfly/react-icons/dist/js/icons/pending-icon';
|
|
6
|
+
import suspendedColor from '@patternfly/react-tokens/dist/js/global_palette_orange_300';
|
|
7
|
+
import pendingSyncColor from '@patternfly/react-tokens/dist/js/global_palette_blue_300';
|
|
4
8
|
|
|
5
9
|
import {
|
|
6
10
|
ApplicationsSummaryStatusType,
|
|
@@ -77,8 +81,51 @@ export const getDeviceStatusItems = (t: TFunction): StatusItem<DeviceSummaryStat
|
|
|
77
81
|
label: t('Online'),
|
|
78
82
|
level: 'success',
|
|
79
83
|
},
|
|
84
|
+
{
|
|
85
|
+
id: DeviceSummaryStatusType.DeviceSummaryStatusAwaitingReconnect,
|
|
86
|
+
label: t('Pending sync'),
|
|
87
|
+
level: 'info',
|
|
88
|
+
customIcon: PendingIcon,
|
|
89
|
+
customColor: pendingSyncColor.value,
|
|
90
|
+
},
|
|
91
|
+
{
|
|
92
|
+
id: DeviceSummaryStatusType.DeviceSummaryStatusConflictPaused,
|
|
93
|
+
label: t('Suspended'),
|
|
94
|
+
level: 'custom',
|
|
95
|
+
customIcon: PauseCircleIcon,
|
|
96
|
+
customColor: suspendedColor.value,
|
|
97
|
+
},
|
|
80
98
|
];
|
|
81
99
|
|
|
100
|
+
/**
|
|
101
|
+
* Returns device status items for the Overview page, allowing to exclude statuses.
|
|
102
|
+
* If "AwaitingReconnect" or "ConflictPaused" statuses are present, they are ordered at the beginning
|
|
103
|
+
*/
|
|
104
|
+
export const getOverviewDeviceStatusItems = (
|
|
105
|
+
t: TFunction,
|
|
106
|
+
excludeStatuses?: DeviceSummaryStatusType[],
|
|
107
|
+
): StatusItem<DeviceSummaryStatusType>[] => {
|
|
108
|
+
const allStatusItems = getDeviceStatusItems(t);
|
|
109
|
+
|
|
110
|
+
const filteredItems = excludeStatuses
|
|
111
|
+
? allStatusItems.filter((item) => !excludeStatuses.includes(item.id))
|
|
112
|
+
: allStatusItems;
|
|
113
|
+
|
|
114
|
+
const priorityStatuses = [
|
|
115
|
+
DeviceSummaryStatusType.DeviceSummaryStatusAwaitingReconnect,
|
|
116
|
+
DeviceSummaryStatusType.DeviceSummaryStatusConflictPaused,
|
|
117
|
+
];
|
|
118
|
+
|
|
119
|
+
const priorityItems = filteredItems.filter((item) => priorityStatuses.includes(item.id));
|
|
120
|
+
const otherItems = filteredItems.filter((item) => !priorityStatuses.includes(item.id));
|
|
121
|
+
|
|
122
|
+
const orderedPriorityItems = priorityStatuses
|
|
123
|
+
.map((status) => priorityItems.find((item) => item.id === status))
|
|
124
|
+
.filter(Boolean) as StatusItem<DeviceSummaryStatusType>[];
|
|
125
|
+
|
|
126
|
+
return [...orderedPriorityItems, ...otherItems];
|
|
127
|
+
};
|
|
128
|
+
|
|
82
129
|
export const getDeviceLifecycleStatusItems = (t: TFunction): StatusItem<DeviceLifecycleStatusType>[] => [
|
|
83
130
|
{
|
|
84
131
|
id: DeviceLifecycleStatusType.DeviceLifecycleStatusDecommissioned,
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
type AlertManagerAlert = {
|
|
2
|
-
fingerprint: string;
|
|
3
|
-
labels: {
|
|
4
|
-
alertname: string;
|
|
5
|
-
org_id: string;
|
|
6
|
-
resource: string;
|
|
7
|
-
[key: string]: string;
|
|
8
|
-
};
|
|
9
|
-
annotations: Record<string, string>;
|
|
10
|
-
startsAt: string;
|
|
11
|
-
endsAt: string;
|
|
12
|
-
updatedAt: string;
|
|
13
|
-
status: {
|
|
14
|
-
state: string;
|
|
15
|
-
inhibitedBy: string[];
|
|
16
|
-
mutedBy: string[];
|
|
17
|
-
silencedBy: string[];
|
|
18
|
-
};
|
|
19
|
-
receivers: Array<{
|
|
20
|
-
name: string;
|
|
21
|
-
}>;
|
|
22
|
-
};
|
|
23
|
-
export declare const useAlerts: (refreshInterval?: number) => [AlertManagerAlert[], boolean, unknown, VoidFunction];
|
|
24
|
-
export declare const useAlertsEnabled: () => boolean;
|
|
25
|
-
export type { AlertManagerAlert };
|
|
26
|
-
//# sourceMappingURL=useAlerts.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useAlerts.d.ts","sourceRoot":"","sources":["../../../src/hooks/useAlerts.ts"],"names":[],"mappings":"AAMA,KAAK,iBAAiB,GAAG;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE;QACN,SAAS,EAAE,MAAM,CAAC;QAClB,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,EAAE,MAAM,CAAC;QACjB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC;KACvB,CAAC;IACF,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE;QACN,KAAK,EAAE,MAAM,CAAC;QACd,WAAW,EAAE,MAAM,EAAE,CAAC;QACtB,OAAO,EAAE,MAAM,EAAE,CAAC;QAClB,UAAU,EAAE,MAAM,EAAE,CAAC;KACtB,CAAC;IACF,SAAS,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACpC,CAAC;AAIF,eAAO,MAAM,SAAS,qBACH,MAAM,KACtB,CAAC,iBAAiB,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,CAyDtD,CAAC;AAQF,eAAO,MAAM,gBAAgB,QAAO,OAgDnC,CAAC;AAEF,YAAY,EAAE,iBAAiB,EAAE,CAAC"}
|
|
@@ -1,114 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.useAlertsEnabled = exports.useAlerts = void 0;
|
|
4
|
-
const tslib_1 = require("tslib");
|
|
5
|
-
const React = tslib_1.__importStar(require("react"));
|
|
6
|
-
const useAppContext_1 = require("./useAppContext");
|
|
7
|
-
const useAccessReview_1 = require("./useAccessReview");
|
|
8
|
-
const rbac_1 = require("../types/rbac");
|
|
9
|
-
const DEFAULT_REFRESH_INTERVAL = 30000; // 30 seconds
|
|
10
|
-
const useAlerts = (refreshInterval = DEFAULT_REFRESH_INTERVAL) => {
|
|
11
|
-
const { getAlerts } = (0, useAppContext_1.useAppContext)();
|
|
12
|
-
const [alerts, setAlerts] = React.useState([]);
|
|
13
|
-
const [isLoading, setIsLoading] = React.useState(true);
|
|
14
|
-
const [error, setError] = React.useState();
|
|
15
|
-
const [forceRefresh, setForceRefresh] = React.useState(0);
|
|
16
|
-
const refetch = React.useCallback(() => {
|
|
17
|
-
setForceRefresh((prev) => prev + 1);
|
|
18
|
-
}, []);
|
|
19
|
-
React.useEffect(() => {
|
|
20
|
-
let abortController;
|
|
21
|
-
let intervalId;
|
|
22
|
-
const fetchAlerts = () => tslib_1.__awaiter(void 0, void 0, void 0, function* () {
|
|
23
|
-
if (!getAlerts) {
|
|
24
|
-
setIsLoading(false);
|
|
25
|
-
return;
|
|
26
|
-
}
|
|
27
|
-
try {
|
|
28
|
-
abortController = new AbortController();
|
|
29
|
-
const alertsData = yield getAlerts(abortController.signal);
|
|
30
|
-
setAlerts(alertsData || []);
|
|
31
|
-
setError(undefined);
|
|
32
|
-
}
|
|
33
|
-
catch (err) {
|
|
34
|
-
if (!abortController.signal.aborted) {
|
|
35
|
-
setError(err);
|
|
36
|
-
setAlerts([]);
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
finally {
|
|
40
|
-
if (!abortController.signal.aborted) {
|
|
41
|
-
setIsLoading(false);
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
});
|
|
45
|
-
// Initial fetch
|
|
46
|
-
fetchAlerts();
|
|
47
|
-
// Set up periodic refresh only if getAlerts is available
|
|
48
|
-
if (getAlerts && refreshInterval > 0) {
|
|
49
|
-
intervalId = setInterval(() => {
|
|
50
|
-
fetchAlerts();
|
|
51
|
-
}, refreshInterval);
|
|
52
|
-
}
|
|
53
|
-
return () => {
|
|
54
|
-
if (intervalId) {
|
|
55
|
-
clearInterval(intervalId);
|
|
56
|
-
}
|
|
57
|
-
abortController === null || abortController === void 0 ? void 0 : abortController.abort();
|
|
58
|
-
};
|
|
59
|
-
}, [getAlerts, refreshInterval, forceRefresh]);
|
|
60
|
-
return [alerts, isLoading, error, refetch];
|
|
61
|
-
};
|
|
62
|
-
exports.useAlerts = useAlerts;
|
|
63
|
-
// Type guard to check if error is HttpError with status property
|
|
64
|
-
const isHttpError = (error) => {
|
|
65
|
-
const errorObj = error;
|
|
66
|
-
return typeof error === 'object' && error !== null && 'status' in error && typeof errorObj.status === 'number';
|
|
67
|
-
};
|
|
68
|
-
const useAlertsEnabled = () => {
|
|
69
|
-
const { getAlerts } = (0, useAppContext_1.useAppContext)();
|
|
70
|
-
const [alertsEnabled, setAlertsEnabled] = React.useState(false);
|
|
71
|
-
const [canListAlerts, alertsLoading] = (0, useAccessReview_1.useAccessReview)(rbac_1.RESOURCE.ALERTS, rbac_1.VERB.LIST);
|
|
72
|
-
const checkServiceEnabled = Boolean(getAlerts) && !alertsLoading && canListAlerts;
|
|
73
|
-
React.useEffect(() => {
|
|
74
|
-
let abortController;
|
|
75
|
-
const checkAlertServiceEnabled = () => tslib_1.__awaiter(void 0, void 0, void 0, function* () {
|
|
76
|
-
if (!getAlerts) {
|
|
77
|
-
// If getAlerts is not available, alerts are disabled
|
|
78
|
-
setAlertsEnabled(false);
|
|
79
|
-
return;
|
|
80
|
-
}
|
|
81
|
-
try {
|
|
82
|
-
abortController = new AbortController();
|
|
83
|
-
yield getAlerts(abortController.signal);
|
|
84
|
-
setAlertsEnabled(true);
|
|
85
|
-
}
|
|
86
|
-
catch (err) {
|
|
87
|
-
if (!abortController.signal.aborted) {
|
|
88
|
-
// Check if AlertManager is disabled (501 Not Implemented) or unavailable (500 Internal Server Error)
|
|
89
|
-
if (isHttpError(err) && (err.status === 501 || err.status === 500)) {
|
|
90
|
-
setAlertsEnabled(false);
|
|
91
|
-
}
|
|
92
|
-
else {
|
|
93
|
-
// For other errors, assume alerts are enabled but there's a temporary issue
|
|
94
|
-
setAlertsEnabled(true);
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
});
|
|
99
|
-
if (checkServiceEnabled) {
|
|
100
|
-
// Check only if we know that the user has permisions to read the alerts
|
|
101
|
-
checkAlertServiceEnabled();
|
|
102
|
-
}
|
|
103
|
-
else if (!getAlerts) {
|
|
104
|
-
// If getAlerts is not available, immediately set to disabled
|
|
105
|
-
setAlertsEnabled(false);
|
|
106
|
-
}
|
|
107
|
-
return () => {
|
|
108
|
-
abortController === null || abortController === void 0 ? void 0 : abortController.abort();
|
|
109
|
-
};
|
|
110
|
-
}, [getAlerts, checkServiceEnabled]);
|
|
111
|
-
return alertsEnabled;
|
|
112
|
-
};
|
|
113
|
-
exports.useAlertsEnabled = useAlertsEnabled;
|
|
114
|
-
//# sourceMappingURL=useAlerts.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"useAlerts.js","sourceRoot":"","sources":["../../../src/hooks/useAlerts.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
import { MetricValue, PrometheusMetric } from '../types/extraTypes';
|
|
2
|
-
declare const getMetricSeries: (metrics: PrometheusMetric[], name: string) => MetricValue[];
|
|
3
|
-
declare const getPeriodTimestamps: (period: string) => {
|
|
4
|
-
from: number;
|
|
5
|
-
to: number;
|
|
6
|
-
step: number;
|
|
7
|
-
};
|
|
8
|
-
export { getMetricSeries, getPeriodTimestamps };
|
|
9
|
-
//# sourceMappingURL=metrics.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../../../src/utils/metrics.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAEpE,QAAA,MAAM,eAAe,YAAa,gBAAgB,EAAE,QAAQ,MAAM,KAAG,WAAW,EAQ/E,CAAC;AAGF,QAAA,MAAM,mBAAmB,WAAY,MAAM;;;;CAiC1C,CAAC;AAEF,OAAO,EAAE,eAAe,EAAE,mBAAmB,EAAE,CAAC"}
|
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.getPeriodTimestamps = exports.getMetricSeries = void 0;
|
|
4
|
-
const getMetricSeries = (metrics, name) => {
|
|
5
|
-
const metricItem = metrics.find((metric) => {
|
|
6
|
-
if (metric.metric.__name__ !== name) {
|
|
7
|
-
return false;
|
|
8
|
-
}
|
|
9
|
-
return true;
|
|
10
|
-
});
|
|
11
|
-
return (metricItem === null || metricItem === void 0 ? void 0 : metricItem.values) || [];
|
|
12
|
-
};
|
|
13
|
-
exports.getMetricSeries = getMetricSeries;
|
|
14
|
-
// TODO use a standard library for the calculation
|
|
15
|
-
const getPeriodTimestamps = (period) => {
|
|
16
|
-
const to = Date.now();
|
|
17
|
-
let step = 5;
|
|
18
|
-
let from;
|
|
19
|
-
switch (period) {
|
|
20
|
-
case '15m':
|
|
21
|
-
from = to - 15 * 60 * 1000;
|
|
22
|
-
break;
|
|
23
|
-
case '30m':
|
|
24
|
-
from = to - 30 * 60 * 1000;
|
|
25
|
-
break;
|
|
26
|
-
case '1h':
|
|
27
|
-
from = to - 1 * 60 * 60 * 1000;
|
|
28
|
-
step = 20;
|
|
29
|
-
break;
|
|
30
|
-
case '8h':
|
|
31
|
-
from = to - 8 * 60 * 60 * 1000;
|
|
32
|
-
step = 30;
|
|
33
|
-
break;
|
|
34
|
-
case '24h':
|
|
35
|
-
step = 120;
|
|
36
|
-
from = to - 24 * 60 * 60 * 1000;
|
|
37
|
-
break;
|
|
38
|
-
case '72h':
|
|
39
|
-
default:
|
|
40
|
-
step = 600;
|
|
41
|
-
from = to - 72 * 60 * 60 * 1000;
|
|
42
|
-
break;
|
|
43
|
-
}
|
|
44
|
-
// Prometheus query requires seconds, not milliseconds
|
|
45
|
-
return { from: from / 1000, to: to / 1000, step };
|
|
46
|
-
};
|
|
47
|
-
exports.getPeriodTimestamps = getPeriodTimestamps;
|
|
48
|
-
//# sourceMappingURL=metrics.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"metrics.js","sourceRoot":"","sources":["../../../src/utils/metrics.ts"],"names":[],"mappings":";;;AAEA,MAAM,eAAe,GAAG,CAAC,OAA2B,EAAE,IAAY,EAAiB,EAAE;IACnF,MAAM,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE;QACzC,IAAI,MAAM,CAAC,MAAM,CAAC,QAAQ,KAAK,IAAI,EAAE,CAAC;YACpC,OAAO,KAAK,CAAC;QACf,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC;IACH,OAAO,CAAA,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,MAAM,KAAI,EAAE,CAAC;AAClC,CAAC,CAAC;AAsCO,0CAAe;AApCxB,kDAAkD;AAClD,MAAM,mBAAmB,GAAG,CAAC,MAAc,EAAE,EAAE;IAC7C,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAEtB,IAAI,IAAI,GAAG,CAAC,CAAC;IAEb,IAAI,IAAY,CAAC;IACjB,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,KAAK;YACR,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;YAC3B,MAAM;QACR,KAAK,KAAK;YACR,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;YAC3B,MAAM;QACR,KAAK,IAAI;YACP,IAAI,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;YAC/B,IAAI,GAAG,EAAE,CAAC;YACV,MAAM;QACR,KAAK,IAAI;YACP,IAAI,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;YAC/B,IAAI,GAAG,EAAE,CAAC;YACV,MAAM;QACR,KAAK,KAAK;YACR,IAAI,GAAG,GAAG,CAAC;YACX,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;YAChC,MAAM;QACR,KAAK,KAAK,CAAC;QACX;YACE,IAAI,GAAG,GAAG,CAAC;YACX,IAAI,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC;YAChC,MAAM;IACV,CAAC;IACD,sDAAsD;IACtD,OAAO,EAAE,IAAI,EAAE,IAAI,GAAG,IAAI,EAAE,EAAE,EAAE,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,CAAC;AACpD,CAAC,CAAC;AAEwB,kDAAmB"}
|