@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.
Files changed (242) hide show
  1. package/dist/src/components/DetailsPage/DetailsPage.d.ts +2 -1
  2. package/dist/src/components/DetailsPage/DetailsPage.d.ts.map +1 -1
  3. package/dist/src/components/DetailsPage/DetailsPage.js +2 -1
  4. package/dist/src/components/DetailsPage/DetailsPage.js.map +1 -1
  5. package/dist/src/components/DetailsPage/DetailsPageActions.d.ts +10 -0
  6. package/dist/src/components/DetailsPage/DetailsPageActions.d.ts.map +1 -1
  7. package/dist/src/components/DetailsPage/DetailsPageActions.js +23 -1
  8. package/dist/src/components/DetailsPage/DetailsPageActions.js.map +1 -1
  9. package/dist/src/components/Device/DeviceDetails/DeviceDetailsPage.d.ts.map +1 -1
  10. package/dist/src/components/Device/DeviceDetails/DeviceDetailsPage.js +29 -3
  11. package/dist/src/components/Device/DeviceDetails/DeviceDetailsPage.js.map +1 -1
  12. package/dist/src/components/Device/DeviceDetails/DeviceDetailsTab.d.ts.map +1 -1
  13. package/dist/src/components/Device/DeviceDetails/DeviceDetailsTab.js +0 -4
  14. package/dist/src/components/Device/DeviceDetails/DeviceDetailsTab.js.map +1 -1
  15. package/dist/src/components/Device/DeviceDetails/DeviceDetailsTabContent/StatusContent.d.ts.map +1 -1
  16. package/dist/src/components/Device/DeviceDetails/DeviceDetailsTabContent/StatusContent.js +8 -2
  17. package/dist/src/components/Device/DeviceDetails/DeviceDetailsTabContent/StatusContent.js.map +1 -1
  18. package/dist/src/components/Device/DevicesPage/DecommissionedDeviceTableRow.d.ts.map +1 -1
  19. package/dist/src/components/Device/DevicesPage/DecommissionedDeviceTableRow.js +1 -3
  20. package/dist/src/components/Device/DevicesPage/DecommissionedDeviceTableRow.js.map +1 -1
  21. package/dist/src/components/Device/DevicesPage/DecommissionedDevicesTable.d.ts.map +1 -1
  22. package/dist/src/components/Device/DevicesPage/DecommissionedDevicesTable.js +0 -3
  23. package/dist/src/components/Device/DevicesPage/DecommissionedDevicesTable.js.map +1 -1
  24. package/dist/src/components/Device/DevicesPage/DeviceToolbarFilters.d.ts.map +1 -1
  25. package/dist/src/components/Device/DevicesPage/DeviceToolbarFilters.js +3 -1
  26. package/dist/src/components/Device/DevicesPage/DeviceToolbarFilters.js.map +1 -1
  27. package/dist/src/components/Device/DevicesPage/DevicesPage.d.ts.map +1 -1
  28. package/dist/src/components/Device/DevicesPage/DevicesPage.js +1 -1
  29. package/dist/src/components/Device/DevicesPage/DevicesPage.js.map +1 -1
  30. package/dist/src/components/Device/DevicesPage/EnrolledDeviceTableRow.d.ts +3 -1
  31. package/dist/src/components/Device/DevicesPage/EnrolledDeviceTableRow.d.ts.map +1 -1
  32. package/dist/src/components/Device/DevicesPage/EnrolledDeviceTableRow.js +12 -4
  33. package/dist/src/components/Device/DevicesPage/EnrolledDeviceTableRow.js.map +1 -1
  34. package/dist/src/components/Device/DevicesPage/EnrolledDevicesTable.d.ts +2 -1
  35. package/dist/src/components/Device/DevicesPage/EnrolledDevicesTable.d.ts.map +1 -1
  36. package/dist/src/components/Device/DevicesPage/EnrolledDevicesTable.js +7 -6
  37. package/dist/src/components/Device/DevicesPage/EnrolledDevicesTable.js.map +1 -1
  38. package/dist/src/components/Device/SystemdUnitsModal/TrackSystemdUnitsForm.js +1 -1
  39. package/dist/src/components/Device/SystemdUnitsModal/TrackSystemdUnitsForm.js.map +1 -1
  40. package/dist/src/components/Events/useEvents.d.ts.map +1 -1
  41. package/dist/src/components/Events/useEvents.js +12 -0
  42. package/dist/src/components/Events/useEvents.js.map +1 -1
  43. package/dist/src/components/Fleet/CreateFleet/steps/UpdatePolicyStep.js +1 -1
  44. package/dist/src/components/Fleet/CreateFleet/steps/UpdatePolicyStep.js.map +1 -1
  45. package/dist/src/components/Fleet/FleetDetails/FleetDetailsPage.d.ts.map +1 -1
  46. package/dist/src/components/Fleet/FleetDetails/FleetDetailsPage.js +4 -3
  47. package/dist/src/components/Fleet/FleetDetails/FleetDetailsPage.js.map +1 -1
  48. package/dist/src/components/Fleet/FleetDetails/FleetDevicesCharts.d.ts.map +1 -1
  49. package/dist/src/components/Fleet/FleetDetails/FleetDevicesCharts.js +7 -1
  50. package/dist/src/components/Fleet/FleetDetails/FleetDevicesCharts.js.map +1 -1
  51. package/dist/src/components/Fleet/FleetDetails/FleetRestoreBanner.d.ts +8 -0
  52. package/dist/src/components/Fleet/FleetDetails/FleetRestoreBanner.d.ts.map +1 -0
  53. package/dist/src/components/Fleet/FleetDetails/FleetRestoreBanner.js +36 -0
  54. package/dist/src/components/Fleet/FleetDetails/FleetRestoreBanner.js.map +1 -0
  55. package/dist/src/components/Fleet/FleetsPage.d.ts.map +1 -1
  56. package/dist/src/components/Fleet/FleetsPage.js +2 -0
  57. package/dist/src/components/Fleet/FleetsPage.js.map +1 -1
  58. package/dist/src/components/ListPage/ListPageActions.d.ts +3 -2
  59. package/dist/src/components/ListPage/ListPageActions.d.ts.map +1 -1
  60. package/dist/src/components/ListPage/ListPageActions.js +27 -1
  61. package/dist/src/components/ListPage/ListPageActions.js.map +1 -1
  62. package/dist/src/components/Masthead/CommandLineToolsPage.d.ts.map +1 -1
  63. package/dist/src/components/Masthead/CommandLineToolsPage.js +18 -14
  64. package/dist/src/components/Masthead/CommandLineToolsPage.js.map +1 -1
  65. package/dist/src/components/OverviewPage/Cards/Alerts/AlertsCard.d.ts.map +1 -1
  66. package/dist/src/components/OverviewPage/Cards/Alerts/AlertsCard.js +15 -5
  67. package/dist/src/components/OverviewPage/Cards/Alerts/AlertsCard.js.map +1 -1
  68. package/dist/src/components/OverviewPage/Cards/Status/DeviceStatusChart.d.ts.map +1 -1
  69. package/dist/src/components/OverviewPage/Cards/Status/DeviceStatusChart.js +7 -1
  70. package/dist/src/components/OverviewPage/Cards/Status/DeviceStatusChart.js.map +1 -1
  71. package/dist/src/components/OverviewPage/Overview.d.ts.map +1 -1
  72. package/dist/src/components/OverviewPage/Overview.js +4 -2
  73. package/dist/src/components/OverviewPage/Overview.js.map +1 -1
  74. package/dist/src/components/Status/StatusDisplay.d.ts +3 -1
  75. package/dist/src/components/Status/StatusDisplay.d.ts.map +1 -1
  76. package/dist/src/components/Status/StatusDisplay.js +8 -8
  77. package/dist/src/components/Status/StatusDisplay.js.map +1 -1
  78. package/dist/src/components/SystemRestore/PendingSyncDevicesAlert.d.ts +7 -0
  79. package/dist/src/components/SystemRestore/PendingSyncDevicesAlert.d.ts.map +1 -0
  80. package/dist/src/components/SystemRestore/PendingSyncDevicesAlert.js +22 -0
  81. package/dist/src/components/SystemRestore/PendingSyncDevicesAlert.js.map +1 -0
  82. package/dist/src/components/SystemRestore/SuspendedDevicesAlert.d.ts +16 -0
  83. package/dist/src/components/SystemRestore/SuspendedDevicesAlert.d.ts.map +1 -0
  84. package/dist/src/components/SystemRestore/SuspendedDevicesAlert.js +75 -0
  85. package/dist/src/components/SystemRestore/SuspendedDevicesAlert.js.map +1 -0
  86. package/dist/src/components/SystemRestore/SystemRestoreBanners.css +6 -0
  87. package/dist/src/components/SystemRestore/SystemRestoreBanners.d.ts +28 -0
  88. package/dist/src/components/SystemRestore/SystemRestoreBanners.d.ts.map +1 -0
  89. package/dist/src/components/SystemRestore/SystemRestoreBanners.js +38 -0
  90. package/dist/src/components/SystemRestore/SystemRestoreBanners.js.map +1 -0
  91. package/dist/src/components/charts/utils.js +1 -1
  92. package/dist/src/components/charts/utils.js.map +1 -1
  93. package/dist/src/components/common/OrganizationGuard.d.ts +13 -0
  94. package/dist/src/components/common/OrganizationGuard.d.ts.map +1 -0
  95. package/dist/src/components/common/OrganizationGuard.js +106 -0
  96. package/dist/src/components/common/OrganizationGuard.js.map +1 -0
  97. package/dist/src/components/common/OrganizationSelector.d.ts +8 -0
  98. package/dist/src/components/common/OrganizationSelector.d.ts.map +1 -0
  99. package/dist/src/components/common/OrganizationSelector.js +92 -0
  100. package/dist/src/components/common/OrganizationSelector.js.map +1 -0
  101. package/dist/src/components/common/PageNavigation.d.ts +4 -0
  102. package/dist/src/components/common/PageNavigation.d.ts.map +1 -0
  103. package/dist/src/components/common/PageNavigation.js +46 -0
  104. package/dist/src/components/common/PageNavigation.js.map +1 -0
  105. package/dist/src/components/form/FilterSelect.css +3 -4
  106. package/dist/src/components/form/validations.d.ts +9 -0
  107. package/dist/src/components/form/validations.d.ts.map +1 -1
  108. package/dist/src/components/form/validations.js +12 -1
  109. package/dist/src/components/form/validations.js.map +1 -1
  110. package/dist/src/components/modals/ResumeDevicesModal/ResumeDevicesModal.d.ts +15 -0
  111. package/dist/src/components/modals/ResumeDevicesModal/ResumeDevicesModal.d.ts.map +1 -0
  112. package/dist/src/components/modals/ResumeDevicesModal/ResumeDevicesModal.js +56 -0
  113. package/dist/src/components/modals/ResumeDevicesModal/ResumeDevicesModal.js.map +1 -0
  114. package/dist/src/components/modals/massModals/ResumeDevicesModal/MassResumeDevicesModal.d.ts +7 -0
  115. package/dist/src/components/modals/massModals/ResumeDevicesModal/MassResumeDevicesModal.d.ts.map +1 -0
  116. package/dist/src/components/modals/massModals/ResumeDevicesModal/MassResumeDevicesModal.js +265 -0
  117. package/dist/src/components/modals/massModals/ResumeDevicesModal/MassResumeDevicesModal.js.map +1 -0
  118. package/dist/src/components/modals/massModals/ResumeDevicesModal/ResumeAllDevicesConfirmationDialog.d.ts +9 -0
  119. package/dist/src/components/modals/massModals/ResumeDevicesModal/ResumeAllDevicesConfirmationDialog.d.ts.map +1 -0
  120. package/dist/src/components/modals/massModals/ResumeDevicesModal/ResumeAllDevicesConfirmationDialog.js +27 -0
  121. package/dist/src/components/modals/massModals/ResumeDevicesModal/ResumeAllDevicesConfirmationDialog.js.map +1 -0
  122. package/dist/src/hooks/useAccessReview.d.ts.map +1 -1
  123. package/dist/src/hooks/useAccessReview.js +17 -4
  124. package/dist/src/hooks/useAccessReview.js.map +1 -1
  125. package/dist/src/hooks/useAlertsEnabled.d.ts +2 -0
  126. package/dist/src/hooks/useAlertsEnabled.d.ts.map +1 -0
  127. package/dist/src/hooks/useAlertsEnabled.js +50 -0
  128. package/dist/src/hooks/useAlertsEnabled.js.map +1 -0
  129. package/dist/src/hooks/useAppContext.d.ts +3 -6
  130. package/dist/src/hooks/useAppContext.d.ts.map +1 -1
  131. package/dist/src/hooks/useAppContext.js +1 -0
  132. package/dist/src/hooks/useAppContext.js.map +1 -1
  133. package/dist/src/hooks/useFetch.d.ts +6 -7
  134. package/dist/src/hooks/useFetch.d.ts.map +1 -1
  135. package/dist/src/hooks/useFetch.js +2 -3
  136. package/dist/src/hooks/useFetch.js.map +1 -1
  137. package/dist/src/hooks/useFetchPeriodically.d.ts.map +1 -1
  138. package/dist/src/hooks/useFetchPeriodically.js +4 -9
  139. package/dist/src/hooks/useFetchPeriodically.js.map +1 -1
  140. package/dist/src/hooks/useSystemRestoreContext.d.ts +16 -0
  141. package/dist/src/hooks/useSystemRestoreContext.d.ts.map +1 -0
  142. package/dist/src/hooks/useSystemRestoreContext.js +45 -0
  143. package/dist/src/hooks/useSystemRestoreContext.js.map +1 -0
  144. package/dist/src/types/extraTypes.d.ts +17 -18
  145. package/dist/src/types/extraTypes.d.ts.map +1 -1
  146. package/dist/src/types/extraTypes.js +1 -6
  147. package/dist/src/types/extraTypes.js.map +1 -1
  148. package/dist/src/types/rbac.d.ts +1 -0
  149. package/dist/src/types/rbac.d.ts.map +1 -1
  150. package/dist/src/types/rbac.js +1 -0
  151. package/dist/src/types/rbac.js.map +1 -1
  152. package/dist/src/utils/api.d.ts +2 -15
  153. package/dist/src/utils/api.d.ts.map +1 -1
  154. package/dist/src/utils/api.js +1 -40
  155. package/dist/src/utils/api.js.map +1 -1
  156. package/dist/src/utils/devices.d.ts +2 -0
  157. package/dist/src/utils/devices.d.ts.map +1 -1
  158. package/dist/src/utils/devices.js +11 -1
  159. package/dist/src/utils/devices.js.map +1 -1
  160. package/dist/src/utils/organizationStorage.d.ts +4 -0
  161. package/dist/src/utils/organizationStorage.d.ts.map +1 -0
  162. package/dist/src/utils/organizationStorage.js +18 -0
  163. package/dist/src/utils/organizationStorage.js.map +1 -0
  164. package/dist/src/utils/query.d.ts +2 -0
  165. package/dist/src/utils/query.d.ts.map +1 -1
  166. package/dist/src/utils/query.js +16 -0
  167. package/dist/src/utils/query.js.map +1 -1
  168. package/dist/src/utils/status/common.d.ts +1 -0
  169. package/dist/src/utils/status/common.d.ts.map +1 -1
  170. package/dist/src/utils/status/common.js.map +1 -1
  171. package/dist/src/utils/status/devices.d.ts +5 -0
  172. package/dist/src/utils/status/devices.d.ts.map +1 -1
  173. package/dist/src/utils/status/devices.js +44 -5
  174. package/dist/src/utils/status/devices.js.map +1 -1
  175. package/dist/src/utils/status/fleet.js +1 -1
  176. package/dist/src/utils/status/fleet.js.map +1 -1
  177. package/dist/src/utils/status/repository.js +1 -1
  178. package/dist/src/utils/status/repository.js.map +1 -1
  179. package/package.json +1 -1
  180. package/src/components/DetailsPage/DetailsPage.tsx +3 -0
  181. package/src/components/DetailsPage/DetailsPageActions.tsx +45 -0
  182. package/src/components/Device/DeviceDetails/DeviceDetailsPage.tsx +57 -5
  183. package/src/components/Device/DeviceDetails/DeviceDetailsTab.tsx +0 -5
  184. package/src/components/Device/DeviceDetails/DeviceDetailsTabContent/StatusContent.tsx +11 -3
  185. package/src/components/Device/DevicesPage/DecommissionedDeviceTableRow.tsx +0 -2
  186. package/src/components/Device/DevicesPage/DecommissionedDevicesTable.tsx +0 -3
  187. package/src/components/Device/DevicesPage/DeviceToolbarFilters.tsx +5 -1
  188. package/src/components/Device/DevicesPage/DevicesPage.tsx +1 -0
  189. package/src/components/Device/DevicesPage/EnrolledDeviceTableRow.tsx +15 -3
  190. package/src/components/Device/DevicesPage/EnrolledDevicesTable.tsx +11 -5
  191. package/src/components/Device/SystemdUnitsModal/TrackSystemdUnitsForm.tsx +1 -1
  192. package/src/components/Events/useEvents.ts +12 -0
  193. package/src/components/Fleet/CreateFleet/steps/UpdatePolicyStep.tsx +1 -1
  194. package/src/components/Fleet/FleetDetails/FleetDetailsPage.tsx +4 -5
  195. package/src/components/Fleet/FleetDetails/FleetDevicesCharts.tsx +9 -3
  196. package/src/components/Fleet/FleetDetails/FleetRestoreBanner.tsx +46 -0
  197. package/src/components/Fleet/FleetsPage.tsx +2 -0
  198. package/src/components/ListPage/ListPageActions.tsx +46 -3
  199. package/src/components/Masthead/CommandLineToolsPage.tsx +17 -14
  200. package/src/components/OverviewPage/Cards/Alerts/AlertsCard.tsx +19 -5
  201. package/src/components/OverviewPage/Cards/Status/DeviceStatusChart.tsx +8 -2
  202. package/src/components/OverviewPage/Overview.tsx +5 -2
  203. package/src/components/Status/StatusDisplay.tsx +32 -23
  204. package/src/components/SystemRestore/PendingSyncDevicesAlert.tsx +36 -0
  205. package/src/components/SystemRestore/SuspendedDevicesAlert.tsx +144 -0
  206. package/src/components/SystemRestore/SystemRestoreBanners.css +6 -0
  207. package/src/components/SystemRestore/SystemRestoreBanners.tsx +82 -0
  208. package/src/components/charts/utils.ts +1 -1
  209. package/src/components/common/OrganizationGuard.tsx +124 -0
  210. package/src/components/common/OrganizationSelector.tsx +192 -0
  211. package/src/components/common/PageNavigation.tsx +103 -0
  212. package/src/components/form/FilterSelect.css +3 -4
  213. package/src/components/form/validations.ts +14 -0
  214. package/src/components/modals/ResumeDevicesModal/ResumeDevicesModal.tsx +114 -0
  215. package/src/components/modals/massModals/ResumeDevicesModal/MassResumeDevicesModal.tsx +465 -0
  216. package/src/components/modals/massModals/ResumeDevicesModal/ResumeAllDevicesConfirmationDialog.tsx +55 -0
  217. package/src/hooks/useAccessReview.ts +20 -4
  218. package/src/hooks/useAlertsEnabled.ts +50 -0
  219. package/src/hooks/useAppContext.tsx +9 -7
  220. package/src/hooks/useFetch.ts +1 -3
  221. package/src/hooks/useFetchPeriodically.ts +4 -11
  222. package/src/hooks/useSystemRestoreContext.tsx +54 -0
  223. package/src/types/extraTypes.ts +17 -23
  224. package/src/types/rbac.ts +1 -0
  225. package/src/utils/api.ts +2 -51
  226. package/src/utils/devices.ts +11 -1
  227. package/src/utils/organizationStorage.ts +13 -0
  228. package/src/utils/query.ts +22 -0
  229. package/src/utils/status/common.ts +1 -0
  230. package/src/utils/status/devices.ts +49 -2
  231. package/src/utils/status/fleet.ts +1 -1
  232. package/src/utils/status/repository.ts +1 -1
  233. package/dist/src/hooks/useAlerts.d.ts +0 -26
  234. package/dist/src/hooks/useAlerts.d.ts.map +0 -1
  235. package/dist/src/hooks/useAlerts.js +0 -114
  236. package/dist/src/hooks/useAlerts.js.map +0 -1
  237. package/dist/src/utils/metrics.d.ts +0 -9
  238. package/dist/src/utils/metrics.d.ts.map +0 -1
  239. package/dist/src/utils/metrics.js +0 -48
  240. package/dist/src/utils/metrics.js.map +0 -1
  241. package/src/hooks/useAlerts.ts +0 -147
  242. 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 = getRequestQuery();
27
+ const requestQuery = query.endpoint;
35
28
  if (requestQuery) {
36
29
  try {
37
30
  abortController = new AbortController();
38
- if (id > 0 && prevResolvedQueryHash.current !== queryStringHash) {
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 = queryStringHash;
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, queryStringHash]);
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
+ };
@@ -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, ApiQuery, FlightControlQuery, MetricsQuery } from '../types/extraTypes';
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 };
@@ -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
+ };
@@ -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 };
@@ -20,6 +20,7 @@ export interface StatusItem<T extends string> {
20
20
  label: string;
21
21
  level: StatusLevel;
22
22
  customIcon?: React.ComponentClass<SVGIconProps>;
23
+ customColor?: string;
23
24
  }
24
25
 
25
26
  export const getDefaultStatusIcon = (level: StatusLevel) => {
@@ -1,6 +1,10 @@
1
1
  import { TFunction } from 'react-i18next';
2
- import { PowerOffIcon } from '@patternfly/react-icons/dist/js/icons';
3
- import BanIcon from '@patternfly/react-icons/dist/js/icons/ban-icon';
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,
@@ -30,7 +30,7 @@ export const getFleetSyncStatus = (
30
30
  }
31
31
  return {
32
32
  status: 'SyncPending',
33
- message: t('Waiting for first sync'),
33
+ message: t('Awaiting first sync'),
34
34
  };
35
35
  };
36
36
 
@@ -78,7 +78,7 @@ const getRepositorySyncStatus = (
78
78
  // As a fallback, we indicate the repository is waiting for sync
79
79
  return {
80
80
  status: 'Sync pending',
81
- message: t('Waiting for first sync'),
81
+ message: t('Awaiting first sync'),
82
82
  };
83
83
  };
84
84
 
@@ -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"}