@flightctl/ui-components 0.9.3 → 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/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/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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"devices.js","sourceRoot":"","sources":["../../../../src/utils/status/devices.ts"],"names":[],"mappings":";;;;AACA,
|
|
1
|
+
{"version":3,"file":"devices.js","sourceRoot":"","sources":["../../../../src/utils/status/devices.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fleet.js","sourceRoot":"","sources":["../../../../src/utils/status/fleet.ts"],"names":[],"mappings":";;;AAEA,4CAAoF;AAEpF,oCAA+C;AAE/C,MAAM,2BAA2B,GAAG,WAAW,CAAC;AAEzC,MAAM,iBAAiB,GAAG,CAAC,CAAY,EAAE,EAAE,CAAC,CAAC;IAClD,CAAC,qBAAa,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC;IACtC,OAAO,EAAE,CAAC,CAAC,SAAS,CAAC;IACrB,WAAW,EAAE,CAAC,CAAC,cAAc,CAAC;CAC/B,CAAC,CAAC;AAJU,QAAA,iBAAiB,qBAI3B;AAEI,MAAM,kBAAkB,GAAG,CAChC,KAAY,EACZ,CAAY,EAIZ,EAAE;;IACF,MAAM,cAAc,GAAG,CAAC,CAAA,MAAA,KAAK,CAAC,MAAM,0CAAE,UAAU,KAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,qBAAa,CAAC,UAAU,CAAC,CAAC;IACzG,IAAI,cAAc,EAAE,CAAC;QACnB,MAAM,IAAI,GAAG,cAAc,CAAC,MAAM,KAAK,uBAAe,CAAC,mBAAmB,CAAC;QAC3E,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAA,2BAAmB,EAAC,cAAc,CAAC,CAAC;QAChE,OAAO;YACL,OAAO;YACP,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,qBAAa,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS;SACpD,CAAC;IACJ,CAAC;IACD,OAAO;QACL,MAAM,EAAE,aAAa;QACrB,OAAO,EAAE,CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"fleet.js","sourceRoot":"","sources":["../../../../src/utils/status/fleet.ts"],"names":[],"mappings":";;;AAEA,4CAAoF;AAEpF,oCAA+C;AAE/C,MAAM,2BAA2B,GAAG,WAAW,CAAC;AAEzC,MAAM,iBAAiB,GAAG,CAAC,CAAY,EAAE,EAAE,CAAC,CAAC;IAClD,CAAC,qBAAa,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC;IACtC,OAAO,EAAE,CAAC,CAAC,SAAS,CAAC;IACrB,WAAW,EAAE,CAAC,CAAC,cAAc,CAAC;CAC/B,CAAC,CAAC;AAJU,QAAA,iBAAiB,qBAI3B;AAEI,MAAM,kBAAkB,GAAG,CAChC,KAAY,EACZ,CAAY,EAIZ,EAAE;;IACF,MAAM,cAAc,GAAG,CAAC,CAAA,MAAA,KAAK,CAAC,MAAM,0CAAE,UAAU,KAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,qBAAa,CAAC,UAAU,CAAC,CAAC;IACzG,IAAI,cAAc,EAAE,CAAC;QACnB,MAAM,IAAI,GAAG,cAAc,CAAC,MAAM,KAAK,uBAAe,CAAC,mBAAmB,CAAC;QAC3E,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAA,2BAAmB,EAAC,cAAc,CAAC,CAAC;QAChE,OAAO;YACL,OAAO;YACP,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,qBAAa,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS;SACpD,CAAC;IACJ,CAAC;IACD,OAAO;QACL,MAAM,EAAE,aAAa;QACrB,OAAO,EAAE,CAAC,CAAC,qBAAqB,CAAC;KAClC,CAAC;AACJ,CAAC,CAAC;AApBW,QAAA,kBAAkB,sBAoB7B;AAEF,MAAM,6BAA6B,GAAG,CAAC,SAAoB,EAAE,EAAE,CAC7D,SAAS,CAAC,IAAI,KAAK,qBAAa,CAAC,sBAAsB;IACvD,SAAS,CAAC,MAAM,KAAK,uBAAe,CAAC,oBAAoB;IACzD,SAAS,CAAC,MAAM,KAAK,2BAA2B,CAAC;AAE5C,MAAM,4BAA4B,GAAG,CAAC,KAAY,EAAE,CAAY,EAAE,EAAE;;IACzE,MAAM,sBAAsB,GAAG,MAAA,MAAA,KAAK,CAAC,MAAM,0CAAE,UAAU,0CAAE,IAAI,CAAC,6BAA6B,CAAC,CAAC;IAE7F,IAAI,sBAAsB,EAAE,CAAC;QAC3B,OAAO,IAAA,2BAAmB,EAAC,sBAAsB,CAAC,IAAI,CAAC,CAAC,4CAA4C,CAAC,CAAC;IACxG,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC,CAAC;AAPW,QAAA,4BAA4B,gCAOvC"}
|
|
@@ -60,7 +60,7 @@ const getRepositorySyncStatus = (repository, t = (s) => s) => {
|
|
|
60
60
|
// As a fallback, we indicate the repository is waiting for sync
|
|
61
61
|
return {
|
|
62
62
|
status: 'Sync pending',
|
|
63
|
-
message: t('
|
|
63
|
+
message: t('Awaiting first sync'),
|
|
64
64
|
};
|
|
65
65
|
};
|
|
66
66
|
exports.getRepositorySyncStatus = getRepositorySyncStatus;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"repository.js","sourceRoot":"","sources":["../../../../src/utils/status/repository.ts"],"names":[],"mappings":";;;AACA,4CAAuG;AACvG,oCAAyC;AACzC,oCAA+C;AAW/C,MAAM,sBAAsB,GAAG,CAAC,CAAY,EAAE,EAAE,CAAC,CAAC;IAChD,CAAC,qBAAa,CAAC,kBAAkB,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC;IAC/C,YAAY,EAAE,CAAC,CAAC,YAAY,CAAC;IAC7B,CAAC,qBAAa,CAAC,0BAA0B,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC;IACvD,YAAY,EAAE,CAAC,CAAC,YAAY,CAAC;IAC7B,CAAC,qBAAa,CAAC,oBAAoB,CAAC,EAAE,CAAC,CAAC,YAAY,CAAC;IACrD,gBAAgB,EAAE,CAAC,CAAC,gBAAgB,CAAC;IACrC,cAAc,EAAE,CAAC,CAAC,cAAc,CAAC;CAClC,CAAC,CAAC;AA8F2E,wDAAsB;AA5FpG,MAAM,uBAAuB,GAAG,CAC9B,UAAqC,EACrC,IAAe,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,EAI/B,EAAE;;IACF,MAAM,UAAU,GAAG,MAAA,UAAU,CAAC,MAAM,0CAAE,UAAU,CAAC;IAEjD,MAAM,mBAAmB,GAAG,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,qBAAa,CAAC,oBAAoB,CAAC,CAAC;IACnG,IAAI,CAAA,mBAAmB,aAAnB,mBAAmB,uBAAnB,mBAAmB,CAAE,MAAM,MAAK,uBAAe,CAAC,oBAAoB,EAAE,CAAC;QACzE,OAAO;YACL,MAAM,EAAE,gBAAgB;YACxB,OAAO,EAAE,IAAA,2BAAmB,EAAC,mBAAmB,CAAC;SAClD,CAAC;IACJ,CAAC;IAED,MAAM,eAAe,GAAG,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,qBAAa,CAAC,0BAA0B,CAAC,CAAC;IACrG,IAAI,CAAA,eAAe,aAAf,eAAe,uBAAf,eAAe,CAAE,MAAM,MAAK,uBAAe,CAAC,oBAAoB,EAAE,CAAC;QACrE,OAAO;YACL,MAAM,EAAE,YAAY;YACpB,OAAO,EAAE,IAAA,2BAAmB,EAAC,eAAe,CAAC;SAC9C,CAAC;IACJ,CAAC;IAED,MAAM,eAAe,GAAG,UAAU,aAAV,UAAU,uBAAV,UAAU,CAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,qBAAa,CAAC,kBAAkB,CAAC,CAAC;IAC7F,IAAI,CAAA,eAAe,aAAf,eAAe,uBAAf,eAAe,CAAE,MAAM,MAAK,uBAAe,CAAC,oBAAoB,EAAE,CAAC;QACrE,OAAO;YACL,MAAM,EAAE,YAAY;YACpB,OAAO,EAAE,IAAA,2BAAmB,EAAC,eAAe,CAAC;SAC9C,CAAC;IACJ,CAAC;IAED,wFAAwF;IACxF,IAAI,eAAe,EAAE,CAAC;QACpB,OAAO;YACL,MAAM,EAAE,qBAAa,CAAC,kBAAkB;YACxC,OAAO,EAAE,EAAE;SACZ,CAAC;IACJ,CAAC;IACD,IAAI,eAAe,EAAE,CAAC;QACpB,OAAO;YACL,MAAM,EAAE,qBAAa,CAAC,0BAA0B;YAChD,OAAO,EAAE,EAAE;SACZ,CAAC;IACJ,CAAC;IACD,IAAI,mBAAmB,EAAE,CAAC;QACxB,OAAO;YACL,MAAM,EAAE,qBAAa,CAAC,oBAAoB;YAC1C,OAAO,EAAE,EAAE;SACZ,CAAC;IACJ,CAAC;IAED,gEAAgE;IAChE,OAAO;QACL,MAAM,EAAE,cAAc;QACtB,OAAO,EAAE,CAAC,CAAC,
|
|
1
|
+
{"version":3,"file":"repository.js","sourceRoot":"","sources":["../../../../src/utils/status/repository.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -31,6 +31,7 @@ export type DetailsPageProps = {
|
|
|
31
31
|
resourceLink: Route;
|
|
32
32
|
actions?: React.ReactNode;
|
|
33
33
|
nav?: React.ReactNode;
|
|
34
|
+
banner?: React.ReactNode;
|
|
34
35
|
};
|
|
35
36
|
|
|
36
37
|
const DetailsPage = ({
|
|
@@ -45,6 +46,7 @@ const DetailsPage = ({
|
|
|
45
46
|
resourceTypeLabel,
|
|
46
47
|
actions,
|
|
47
48
|
nav,
|
|
49
|
+
banner,
|
|
48
50
|
}: DetailsPageProps) => {
|
|
49
51
|
const { t } = useTranslation();
|
|
50
52
|
let content = children;
|
|
@@ -86,6 +88,7 @@ const DetailsPage = ({
|
|
|
86
88
|
<SplitItem>{actions}</SplitItem>
|
|
87
89
|
</Split>
|
|
88
90
|
</PageSection>
|
|
91
|
+
{banner}
|
|
89
92
|
{nav && (
|
|
90
93
|
<PageSection variant="light" type="nav" className="fctl-details-page__nav">
|
|
91
94
|
{nav}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import * as React from 'react';
|
|
2
2
|
import { Dropdown, DropdownItem, MenuToggle } from '@patternfly/react-core';
|
|
3
|
+
import { Trans } from 'react-i18next';
|
|
3
4
|
|
|
4
5
|
import { DeviceDecommissionTargetType } from '@flightctl/types';
|
|
5
6
|
|
|
@@ -7,6 +8,7 @@ import { useTranslation } from '../../hooks/useTranslation';
|
|
|
7
8
|
import { getDisabledTooltipProps } from '../../utils/tooltip';
|
|
8
9
|
import DeleteModal from '../modals/DeleteModal/DeleteModal';
|
|
9
10
|
import DecommissionModal from '../modals/DecommissionModal/DecommissionModal';
|
|
11
|
+
import ResumeDevicesModal from '../modals/ResumeDevicesModal/ResumeDevicesModal';
|
|
10
12
|
|
|
11
13
|
type DeleteActionProps = {
|
|
12
14
|
onDelete: () => Promise<unknown>;
|
|
@@ -21,6 +23,13 @@ type DecommissionActionProps = {
|
|
|
21
23
|
disabledReason?: string;
|
|
22
24
|
};
|
|
23
25
|
|
|
26
|
+
type ResumeActionProps = {
|
|
27
|
+
deviceId: string;
|
|
28
|
+
alias?: string;
|
|
29
|
+
disabledReason?: string;
|
|
30
|
+
onResumeComplete?: () => void;
|
|
31
|
+
};
|
|
32
|
+
|
|
24
33
|
export const useDeleteAction = ({
|
|
25
34
|
resourceType,
|
|
26
35
|
resourceName,
|
|
@@ -73,6 +82,42 @@ export const useDecommissionAction = ({ onDecommission, disabledReason }: Decomm
|
|
|
73
82
|
return { decommissionAction, decommissionModal };
|
|
74
83
|
};
|
|
75
84
|
|
|
85
|
+
export const useResumeAction = ({ disabledReason, deviceId, alias, onResumeComplete }: ResumeActionProps) => {
|
|
86
|
+
const { t } = useTranslation();
|
|
87
|
+
const [isResumeModalOpen, setIsResumeModalOpen] = React.useState(false);
|
|
88
|
+
const resumeProps = getDisabledTooltipProps(disabledReason);
|
|
89
|
+
const deviceNameOrAlias = alias || deviceId;
|
|
90
|
+
const resumeAction = (
|
|
91
|
+
<DropdownItem onClick={() => setIsResumeModalOpen(true)} {...resumeProps}>
|
|
92
|
+
{t('Resume device')}
|
|
93
|
+
</DropdownItem>
|
|
94
|
+
);
|
|
95
|
+
|
|
96
|
+
const resumeSelector = {
|
|
97
|
+
fieldSelector: `metadata.name=${deviceId}`,
|
|
98
|
+
};
|
|
99
|
+
const resumeModal = isResumeModalOpen && (
|
|
100
|
+
<ResumeDevicesModal
|
|
101
|
+
mode="device"
|
|
102
|
+
title={
|
|
103
|
+
<Trans t={t}>
|
|
104
|
+
You are about to resume device <strong>{deviceNameOrAlias}</strong>
|
|
105
|
+
</Trans>
|
|
106
|
+
}
|
|
107
|
+
selector={resumeSelector}
|
|
108
|
+
expectedCount={1}
|
|
109
|
+
onClose={(hasResumed) => {
|
|
110
|
+
setIsResumeModalOpen(false);
|
|
111
|
+
if (hasResumed) {
|
|
112
|
+
onResumeComplete?.();
|
|
113
|
+
}
|
|
114
|
+
}}
|
|
115
|
+
/>
|
|
116
|
+
);
|
|
117
|
+
|
|
118
|
+
return { resumeAction, resumeModal };
|
|
119
|
+
};
|
|
120
|
+
|
|
76
121
|
const DetailsPageActions = ({ children }: React.PropsWithChildren) => {
|
|
77
122
|
const { t } = useTranslation();
|
|
78
123
|
const [actionsOpen, setActionsOpen] = React.useState(false);
|
|
@@ -1,25 +1,37 @@
|
|
|
1
1
|
import * as React from 'react';
|
|
2
|
+
import { Trans } from 'react-i18next';
|
|
2
3
|
import { Button, DropdownItem, DropdownList, Nav, NavList } from '@patternfly/react-core';
|
|
3
4
|
|
|
4
|
-
import {
|
|
5
|
+
import {
|
|
6
|
+
Device,
|
|
7
|
+
DeviceDecommission,
|
|
8
|
+
DeviceDecommissionTargetType,
|
|
9
|
+
DeviceSummaryStatusType,
|
|
10
|
+
ResourceKind,
|
|
11
|
+
} from '@flightctl/types';
|
|
5
12
|
import { useFetchPeriodically } from '../../../hooks/useFetchPeriodically';
|
|
6
13
|
import { useFetch } from '../../../hooks/useFetch';
|
|
7
14
|
import { getDisabledTooltipProps } from '../../../utils/tooltip';
|
|
8
15
|
import DetailsPage from '../../DetailsPage/DetailsPage';
|
|
9
|
-
import DetailsPageActions, {
|
|
16
|
+
import DetailsPageActions, {
|
|
17
|
+
useDecommissionAction,
|
|
18
|
+
useDeleteAction,
|
|
19
|
+
useResumeAction,
|
|
20
|
+
} from '../../DetailsPage/DetailsPageActions';
|
|
10
21
|
import { useTranslation } from '../../../hooks/useTranslation';
|
|
11
22
|
import { ROUTE, useNavigate } from '../../../hooks/useNavigate';
|
|
12
23
|
import { useAppContext } from '../../../hooks/useAppContext';
|
|
13
24
|
import DeviceDetailsTab from './DeviceDetailsTab';
|
|
14
25
|
import TerminalTab from './TerminalTab';
|
|
15
26
|
import NavItem from '../../NavItem/NavItem';
|
|
16
|
-
import { getEditDisabledReason, isDeviceEnrolled } from '../../../utils/devices';
|
|
27
|
+
import { getEditDisabledReason, getResumeDisabledReason, isDeviceEnrolled } from '../../../utils/devices';
|
|
17
28
|
import { RESOURCE, VERB } from '../../../types/rbac';
|
|
18
29
|
import { useAccessReview } from '../../../hooks/useAccessReview';
|
|
19
30
|
import EventsCard from '../../Events/EventsCard';
|
|
20
31
|
import PageWithPermissions from '../../common/PageWithPermissions';
|
|
21
32
|
import YamlEditor from '../../common/CodeEditor/YamlEditor';
|
|
22
33
|
import DeviceAliasEdit from './DeviceAliasEdit';
|
|
34
|
+
import { SystemRestoreBanners } from '../../SystemRestore/SystemRestoreBanners';
|
|
23
35
|
|
|
24
36
|
type DeviceDetailsPageProps = React.PropsWithChildren<{ hideTerminal?: boolean }>;
|
|
25
37
|
|
|
@@ -35,12 +47,14 @@ const DeviceDetailsPage = ({ children, hideTerminal }: DeviceDetailsPageProps) =
|
|
|
35
47
|
|
|
36
48
|
const deviceLabels = device?.metadata.labels;
|
|
37
49
|
const deviceAlias = deviceLabels?.alias;
|
|
50
|
+
const deviceNameOrAlias = deviceAlias || deviceId;
|
|
38
51
|
const isEnrolled = !device || isDeviceEnrolled(device);
|
|
39
52
|
|
|
40
53
|
const [hasTerminalAccess] = useAccessReview(RESOURCE.DEVICE_CONSOLE, VERB.GET);
|
|
41
54
|
const [canDelete] = useAccessReview(RESOURCE.DEVICE, VERB.DELETE);
|
|
42
55
|
const [canEdit] = useAccessReview(RESOURCE.DEVICE, VERB.PATCH);
|
|
43
56
|
const [canDecommission] = useAccessReview(RESOURCE.DEVICE_DECOMMISSION, VERB.UPDATE);
|
|
57
|
+
const [canResume] = useAccessReview(RESOURCE.DEVICE_RESUME, VERB.UPDATE);
|
|
44
58
|
|
|
45
59
|
const canOpenTerminal = hasTerminalAccess && isEnrolled;
|
|
46
60
|
|
|
@@ -49,7 +63,7 @@ const DeviceDetailsPage = ({ children, hideTerminal }: DeviceDetailsPageProps) =
|
|
|
49
63
|
await remove(`devices/${deviceId}`);
|
|
50
64
|
navigate(ROUTE.DEVICES);
|
|
51
65
|
},
|
|
52
|
-
resourceName:
|
|
66
|
+
resourceName: deviceNameOrAlias,
|
|
53
67
|
resourceType: 'device',
|
|
54
68
|
buttonLabel: isEnrolled ? undefined : t('Delete forever'),
|
|
55
69
|
});
|
|
@@ -64,7 +78,33 @@ const DeviceDetailsPage = ({ children, hideTerminal }: DeviceDetailsPageProps) =
|
|
|
64
78
|
},
|
|
65
79
|
});
|
|
66
80
|
|
|
81
|
+
const { resumeAction, resumeModal } = useResumeAction({
|
|
82
|
+
deviceId,
|
|
83
|
+
alias: deviceAlias,
|
|
84
|
+
disabledReason: device ? getResumeDisabledReason(device, t) : undefined,
|
|
85
|
+
onResumeComplete: refetch,
|
|
86
|
+
});
|
|
87
|
+
|
|
67
88
|
const editActionProps = device ? getDisabledTooltipProps(getEditDisabledReason(device, t)) : undefined;
|
|
89
|
+
const resumeDevice = {
|
|
90
|
+
actionText: t('Resume device'),
|
|
91
|
+
title: (
|
|
92
|
+
<Trans t={t}>
|
|
93
|
+
You are about to resume <strong>{deviceNameOrAlias}</strong>
|
|
94
|
+
</Trans>
|
|
95
|
+
),
|
|
96
|
+
requestSelector: {
|
|
97
|
+
fieldSelector: `metadata.name=${deviceId}`,
|
|
98
|
+
},
|
|
99
|
+
};
|
|
100
|
+
|
|
101
|
+
const deviceSummaryStatus = device?.status?.summary.status;
|
|
102
|
+
const deviceSummary = {
|
|
103
|
+
[DeviceSummaryStatusType.DeviceSummaryStatusConflictPaused]:
|
|
104
|
+
deviceSummaryStatus === DeviceSummaryStatusType.DeviceSummaryStatusConflictPaused ? 1 : 0,
|
|
105
|
+
[DeviceSummaryStatusType.DeviceSummaryStatusAwaitingReconnect]:
|
|
106
|
+
deviceSummaryStatus === DeviceSummaryStatusType.DeviceSummaryStatusAwaitingReconnect ? 1 : 0,
|
|
107
|
+
};
|
|
68
108
|
|
|
69
109
|
return (
|
|
70
110
|
<DetailsPage
|
|
@@ -86,6 +126,17 @@ const DeviceDetailsPage = ({ children, hideTerminal }: DeviceDetailsPageProps) =
|
|
|
86
126
|
deviceAlias
|
|
87
127
|
)
|
|
88
128
|
}
|
|
129
|
+
banner={
|
|
130
|
+
device && (
|
|
131
|
+
<SystemRestoreBanners
|
|
132
|
+
mode="device"
|
|
133
|
+
resumeAction={resumeDevice}
|
|
134
|
+
summaryStatus={deviceSummary}
|
|
135
|
+
onResumeComplete={refetch}
|
|
136
|
+
className="pf-v5-u-pt-0 pf-v5-u-px-lg"
|
|
137
|
+
/>
|
|
138
|
+
)
|
|
139
|
+
}
|
|
89
140
|
resourceLink={ROUTE.DEVICES}
|
|
90
141
|
resourceType="Devices"
|
|
91
142
|
resourceTypeLabel={t('Devices')}
|
|
@@ -111,6 +162,7 @@ const DeviceDetailsPage = ({ children, hideTerminal }: DeviceDetailsPageProps) =
|
|
|
111
162
|
{t('Edit device configurations')}
|
|
112
163
|
</DropdownItem>
|
|
113
164
|
)}
|
|
165
|
+
{canResume && resumeAction}
|
|
114
166
|
{canDecommission && decommissionAction}
|
|
115
167
|
</DropdownList>
|
|
116
168
|
</DetailsPageActions>
|
|
@@ -143,7 +195,7 @@ const DeviceDetailsPage = ({ children, hideTerminal }: DeviceDetailsPageProps) =
|
|
|
143
195
|
</Routes>
|
|
144
196
|
)}
|
|
145
197
|
|
|
146
|
-
{deleteModal || decommissionModal}
|
|
198
|
+
{deleteModal || decommissionModal || resumeModal}
|
|
147
199
|
</DetailsPage>
|
|
148
200
|
);
|
|
149
201
|
};
|
|
@@ -13,7 +13,6 @@ import {
|
|
|
13
13
|
|
|
14
14
|
import { Device } from '@flightctl/types';
|
|
15
15
|
import { isDeviceEnrolled } from '../../../utils/devices';
|
|
16
|
-
import { timeSinceText } from '../../../utils/dates';
|
|
17
16
|
|
|
18
17
|
import { useTranslation } from '../../../hooks/useTranslation';
|
|
19
18
|
import { useDeviceSpecSystemInfo } from '../../../hooks/useDeviceSpecSystemInfo';
|
|
@@ -192,10 +191,6 @@ const DecommissionedDeviceDetails = ({ device, children }: React.PropsWithChildr
|
|
|
192
191
|
<DeviceLifecycleStatus device={device} />
|
|
193
192
|
</DescriptionListDescription>
|
|
194
193
|
</DescriptionListGroup>
|
|
195
|
-
<DescriptionListGroup>
|
|
196
|
-
<DescriptionListTerm>{t('Last seen')}</DescriptionListTerm>
|
|
197
|
-
<DescriptionListDescription>{timeSinceText(t, device.status.lastSeen)}</DescriptionListDescription>
|
|
198
|
-
</DescriptionListGroup>
|
|
199
194
|
{children}
|
|
200
195
|
</FlightControlDescriptionList>
|
|
201
196
|
</DetailsPageCardBody>
|
|
@@ -6,9 +6,9 @@ import {
|
|
|
6
6
|
DescriptionListTerm,
|
|
7
7
|
} from '@patternfly/react-core';
|
|
8
8
|
|
|
9
|
-
import { Device } from '@flightctl/types';
|
|
10
|
-
import { timeSinceText } from '../../../../utils/dates';
|
|
9
|
+
import { Device, DeviceLastSeen } from '@flightctl/types';
|
|
11
10
|
import { useTranslation } from '../../../../hooks/useTranslation';
|
|
11
|
+
import { useFetchPeriodically } from '../../../../hooks/useFetchPeriodically';
|
|
12
12
|
import DetailsPageCard, { DetailsPageCardBody } from '../../../DetailsPage/DetailsPageCard';
|
|
13
13
|
import FlightControlDescriptionList from '../../../common/FlightCtlDescriptionList';
|
|
14
14
|
import LabelWithHelperText from '../../../common/WithHelperText';
|
|
@@ -16,10 +16,18 @@ import ApplicationSummaryStatus from '../../../Status/ApplicationSummaryStatus';
|
|
|
16
16
|
import DeviceStatus from '../../../Status/DeviceStatus';
|
|
17
17
|
import SystemUpdateStatus from '../../../Status/SystemUpdateStatus';
|
|
18
18
|
import IntegrityStatus from '../../../Status/IntegrityStatus';
|
|
19
|
+
import { timeSinceText } from '../../../../utils/dates';
|
|
20
|
+
|
|
21
|
+
const LAST_SEEN_REFRESH_INTERVAL = 60 * 1000; // 1 minute
|
|
19
22
|
|
|
20
23
|
const StatusContent = ({ device }: { device: Required<Device> }) => {
|
|
21
24
|
const { t } = useTranslation();
|
|
22
25
|
|
|
26
|
+
const [lastSeenResponse] = useFetchPeriodically<DeviceLastSeen>({
|
|
27
|
+
endpoint: `devices/${device.metadata.name}/lastseen`,
|
|
28
|
+
timeout: LAST_SEEN_REFRESH_INTERVAL,
|
|
29
|
+
});
|
|
30
|
+
|
|
23
31
|
return (
|
|
24
32
|
<DetailsPageCard>
|
|
25
33
|
<CardTitle>{t('System status')}</CardTitle>
|
|
@@ -73,7 +81,7 @@ const StatusContent = ({ device }: { device: Required<Device> }) => {
|
|
|
73
81
|
</DescriptionListGroup>
|
|
74
82
|
<DescriptionListGroup>
|
|
75
83
|
<DescriptionListTerm>{t('Last seen')}</DescriptionListTerm>
|
|
76
|
-
<DescriptionListDescription>{timeSinceText(t,
|
|
84
|
+
<DescriptionListDescription>{timeSinceText(t, lastSeenResponse?.lastSeen)}</DescriptionListDescription>
|
|
77
85
|
</DescriptionListGroup>
|
|
78
86
|
</FlightControlDescriptionList>
|
|
79
87
|
</DetailsPageCardBody>
|
|
@@ -2,7 +2,6 @@ import * as React from 'react';
|
|
|
2
2
|
import { ActionsColumn, OnSelect, Td, Tr } from '@patternfly/react-table';
|
|
3
3
|
|
|
4
4
|
import { Device } from '@flightctl/types';
|
|
5
|
-
import { timeSinceText } from '../../../utils/dates';
|
|
6
5
|
import { ListAction } from '../../ListPage/types';
|
|
7
6
|
import { useTranslation } from '../../../hooks/useTranslation';
|
|
8
7
|
import { ROUTE, useNavigate } from '../../../hooks/useNavigate';
|
|
@@ -49,7 +48,6 @@ const DecommissionedDeviceTableRow = ({
|
|
|
49
48
|
<Td dataLabel={t('Device status')}>
|
|
50
49
|
<DeviceLifecycleStatus device={device} />
|
|
51
50
|
</Td>
|
|
52
|
-
<Td dataLabel={t('Last seen')}>{timeSinceText(t, device.status?.lastSeen)}</Td>
|
|
53
51
|
{canDelete && (
|
|
54
52
|
<Td isActionCell>
|
|
55
53
|
<ActionsColumn
|
|
@@ -40,6 +40,9 @@ type LabelFleetSelectorProps = {
|
|
|
40
40
|
placeholder?: string;
|
|
41
41
|
};
|
|
42
42
|
|
|
43
|
+
// Escapes special characters (eg. 'hello.world' becomes 'hello\\.world')
|
|
44
|
+
const escapeRegExp = (text: string) => text.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
45
|
+
|
|
43
46
|
const LabelFleetResults = ({
|
|
44
47
|
filterText,
|
|
45
48
|
allLabels,
|
|
@@ -56,7 +59,8 @@ const LabelFleetResults = ({
|
|
|
56
59
|
allLabels: FlightCtlLabel[];
|
|
57
60
|
}) => {
|
|
58
61
|
const { t } = useTranslation();
|
|
59
|
-
|
|
62
|
+
|
|
63
|
+
const regexp = React.useMemo(() => new RegExp(`(${escapeRegExp(filterText)})`, 'g'), [filterText]);
|
|
60
64
|
|
|
61
65
|
const searchHighlighter = React.useCallback(
|
|
62
66
|
(text: string) => {
|
|
@@ -3,8 +3,7 @@ import { ActionsColumn, OnSelect, Td, Tr } from '@patternfly/react-table';
|
|
|
3
3
|
|
|
4
4
|
import { Device } from '@flightctl/types';
|
|
5
5
|
import DeviceFleet from '../DeviceDetails/DeviceFleet';
|
|
6
|
-
import {
|
|
7
|
-
import { getDecommissionDisabledReason, getEditDisabledReason } from '../../../utils/devices';
|
|
6
|
+
import { getDecommissionDisabledReason, getEditDisabledReason, getResumeDisabledReason } from '../../../utils/devices';
|
|
8
7
|
import { getDisabledTooltipProps } from '../../../utils/tooltip';
|
|
9
8
|
import { ListAction } from '../../ListPage/types';
|
|
10
9
|
import ApplicationSummaryStatus from '../../Status/ApplicationSummaryStatus';
|
|
@@ -22,6 +21,8 @@ type EnrolledDeviceTableRowProps = {
|
|
|
22
21
|
canEdit: boolean;
|
|
23
22
|
canDecommission: boolean;
|
|
24
23
|
decommissionAction: ListAction;
|
|
24
|
+
canResume: boolean;
|
|
25
|
+
resumeAction: ListAction;
|
|
25
26
|
};
|
|
26
27
|
|
|
27
28
|
const EnrolledDeviceTableRow = ({
|
|
@@ -32,6 +33,8 @@ const EnrolledDeviceTableRow = ({
|
|
|
32
33
|
canEdit,
|
|
33
34
|
canDecommission,
|
|
34
35
|
decommissionAction,
|
|
36
|
+
canResume,
|
|
37
|
+
resumeAction,
|
|
35
38
|
}: EnrolledDeviceTableRowProps) => {
|
|
36
39
|
const { t } = useTranslation();
|
|
37
40
|
const navigate = useNavigate();
|
|
@@ -39,6 +42,7 @@ const EnrolledDeviceTableRow = ({
|
|
|
39
42
|
const deviceAlias = device.metadata.labels?.alias;
|
|
40
43
|
const editActionProps = getDisabledTooltipProps(getEditDisabledReason(device, t));
|
|
41
44
|
const decommissionDisabledReason = getDecommissionDisabledReason(device, t);
|
|
45
|
+
const resumeDisabledReason = getResumeDisabledReason(device, t);
|
|
42
46
|
|
|
43
47
|
return (
|
|
44
48
|
<Tr>
|
|
@@ -67,7 +71,6 @@ const EnrolledDeviceTableRow = ({
|
|
|
67
71
|
<Td dataLabel={t('System update status')}>
|
|
68
72
|
<SystemUpdateStatus deviceStatus={device.status} />
|
|
69
73
|
</Td>
|
|
70
|
-
<Td dataLabel={t('Last seen')}>{timeSinceText(t, device.status?.lastSeen)}</Td>
|
|
71
74
|
<Td isActionCell>
|
|
72
75
|
<ActionsColumn
|
|
73
76
|
items={[
|
|
@@ -84,6 +87,15 @@ const EnrolledDeviceTableRow = ({
|
|
|
84
87
|
title: t('View device details'),
|
|
85
88
|
onClick: () => navigate({ route: ROUTE.DEVICE_DETAILS, postfix: deviceName }),
|
|
86
89
|
},
|
|
90
|
+
...(canResume
|
|
91
|
+
? [
|
|
92
|
+
resumeAction({
|
|
93
|
+
resourceId: deviceName,
|
|
94
|
+
resourceName: deviceAlias,
|
|
95
|
+
disabledReason: resumeDisabledReason,
|
|
96
|
+
}),
|
|
97
|
+
]
|
|
98
|
+
: []),
|
|
87
99
|
...(canDecommission
|
|
88
100
|
? [
|
|
89
101
|
decommissionAction({
|
|
@@ -20,7 +20,7 @@ import {
|
|
|
20
20
|
} from '../../Status/utils';
|
|
21
21
|
|
|
22
22
|
import Table, { ApiSortTableColumn } from '../../Table/Table';
|
|
23
|
-
import { useDecommissionListAction } from '../../ListPage/ListPageActions';
|
|
23
|
+
import { useDecommissionListAction, useResumeListAction } from '../../ListPage/ListPageActions';
|
|
24
24
|
import TablePagination from '../../Table/TablePagination';
|
|
25
25
|
import MassDecommissionDeviceModal from '../../modals/massModals/MassDecommissionDeviceModal/MassDecommissionDeviceModal';
|
|
26
26
|
import AddDeviceModal from '../AddDeviceModal/AddDeviceModal';
|
|
@@ -28,6 +28,7 @@ import { EnrolledDevicesEmptyState } from './DevicesEmptyStates';
|
|
|
28
28
|
import DeviceTableToolbar from './DeviceTableToolbar';
|
|
29
29
|
import EnrolledDeviceTableRow from './EnrolledDeviceTableRow';
|
|
30
30
|
import { FilterSearchParams } from '../../../utils/status/devices';
|
|
31
|
+
import { GlobalSystemRestoreBanners } from '../../SystemRestore/SystemRestoreBanners';
|
|
31
32
|
|
|
32
33
|
interface EnrolledDeviceTableProps {
|
|
33
34
|
devices: Array<Device>;
|
|
@@ -43,6 +44,7 @@ interface EnrolledDeviceTableProps {
|
|
|
43
44
|
setSelectedLabels: (labels: FlightCtlLabel[]) => void;
|
|
44
45
|
isFilterUpdating: boolean;
|
|
45
46
|
pagination: Pick<PaginationDetails<DeviceList>, 'currentPage' | 'setCurrentPage' | 'itemCount'>;
|
|
47
|
+
refetchDevices: VoidFunction;
|
|
46
48
|
// getSortParams: (columnIndex: number) => ThProps['sort'];
|
|
47
49
|
}
|
|
48
50
|
|
|
@@ -68,9 +70,6 @@ const getDeviceColumns = (t: TFunction): ApiSortTableColumn[] => [
|
|
|
68
70
|
name: t('Update status'),
|
|
69
71
|
helperText: getUpdateStatusHelperText(t),
|
|
70
72
|
},
|
|
71
|
-
{
|
|
72
|
-
name: t('Last seen'),
|
|
73
|
-
},
|
|
74
73
|
];
|
|
75
74
|
|
|
76
75
|
const EnrolledDevicesTable = ({
|
|
@@ -87,6 +86,7 @@ const EnrolledDevicesTable = ({
|
|
|
87
86
|
hasFiltersEnabled,
|
|
88
87
|
isFilterUpdating,
|
|
89
88
|
pagination,
|
|
89
|
+
refetchDevices,
|
|
90
90
|
}: EnrolledDeviceTableProps) => {
|
|
91
91
|
const { t } = useTranslation();
|
|
92
92
|
const { put } = useFetch();
|
|
@@ -97,6 +97,7 @@ const EnrolledDevicesTable = ({
|
|
|
97
97
|
|
|
98
98
|
const { onRowSelect, hasSelectedRows, isAllSelected, isRowSelected, setAllSelected } = useTableSelect();
|
|
99
99
|
|
|
100
|
+
const { action: resumeDeviceAction, modal: resumeDeviceModal } = useResumeListAction(refetchDevices);
|
|
100
101
|
const { action: decommissionDeviceAction, modal: decommissionDeviceModal } = useDecommissionListAction({
|
|
101
102
|
resourceType: 'Device',
|
|
102
103
|
onConfirm: async (deviceId: string, params) => {
|
|
@@ -109,6 +110,7 @@ const EnrolledDevicesTable = ({
|
|
|
109
110
|
|
|
110
111
|
const [canEdit] = useAccessReview(RESOURCE.DEVICE, VERB.PATCH);
|
|
111
112
|
const [canDecommission] = useAccessReview(RESOURCE.DEVICE_DECOMMISSION, VERB.UPDATE);
|
|
113
|
+
const [canResume] = useAccessReview(RESOURCE.DEVICE_RESUME, VERB.UPDATE);
|
|
112
114
|
|
|
113
115
|
const clearAllFilters = () => {
|
|
114
116
|
if (hasFiltersEnabled) {
|
|
@@ -125,6 +127,8 @@ const EnrolledDevicesTable = ({
|
|
|
125
127
|
|
|
126
128
|
return (
|
|
127
129
|
<>
|
|
130
|
+
<GlobalSystemRestoreBanners onResumeComplete={refetchDevices} />
|
|
131
|
+
|
|
128
132
|
<DeviceTableToolbar
|
|
129
133
|
nameOrAlias={nameOrAlias}
|
|
130
134
|
setNameOrAlias={setNameOrAlias}
|
|
@@ -186,6 +190,8 @@ const EnrolledDevicesTable = ({
|
|
|
186
190
|
canEdit={canEdit}
|
|
187
191
|
canDecommission={canDecommission}
|
|
188
192
|
decommissionAction={decommissionDeviceAction}
|
|
193
|
+
canResume={canResume}
|
|
194
|
+
resumeAction={resumeDeviceAction}
|
|
189
195
|
/>
|
|
190
196
|
))}
|
|
191
197
|
</Tbody>
|
|
@@ -194,7 +200,7 @@ const EnrolledDevicesTable = ({
|
|
|
194
200
|
{!hasFiltersEnabled && devices.length === 0 && (
|
|
195
201
|
<EnrolledDevicesEmptyState onAddDevice={() => setAddDeviceModal(true)} />
|
|
196
202
|
)}
|
|
197
|
-
{decommissionDeviceModal}
|
|
203
|
+
{decommissionDeviceModal || resumeDeviceModal}
|
|
198
204
|
{addDeviceModal && <AddDeviceModal onClose={() => setAddDeviceModal(false)} />}
|
|
199
205
|
{isMassDecommissionModalOpen && (
|
|
200
206
|
<MassDecommissionDeviceModal
|
|
@@ -50,6 +50,7 @@ const getEventReasonTitles = (t: TFunction, kindType: string): Record<Event.reas
|
|
|
50
50
|
[Event.reason.RESOURCE_DELETION_FAILED]: t('{{ resourceType }} could not be deleted', params),
|
|
51
51
|
[Event.reason.RESOURCE_UPDATED]: t('{{ resourceType }} was updated successfully', params),
|
|
52
52
|
[Event.reason.RESOURCE_UPDATE_FAILED]: t('{{ resourceType }} could not be updated', params),
|
|
53
|
+
[Event.reason.SYSTEM_RESTORED]: t('The system was restored from a backup'),
|
|
53
54
|
// Device events
|
|
54
55
|
[Event.reason.DEVICE_DECOMMISSIONED]: t('Device decommissioned successfully'),
|
|
55
56
|
[Event.reason.DEVICE_DECOMMISSION_FAILED]: t('Device could not be decommissioned'),
|
|
@@ -71,21 +72,32 @@ const getEventReasonTitles = (t: TFunction, kindType: string): Record<Event.reas
|
|
|
71
72
|
[Event.reason.DEVICE_CONTENT_UP_TO_DATE]: t('Device returned to being up-to-date'),
|
|
72
73
|
[Event.reason.DEVICE_CONTENT_UPDATING]: t('Device is updating'),
|
|
73
74
|
[Event.reason.DEVICE_CONTENT_OUT_OF_DATE]: t('Device is out-of-date'),
|
|
75
|
+
[Event.reason.DEVICE_UPDATE_FAILED]: t('Device update failed'),
|
|
74
76
|
[Event.reason.DEVICE_MULTIPLE_OWNERS_DETECTED]: t('Detected device ownership conflict'),
|
|
75
77
|
[Event.reason.DEVICE_MULTIPLE_OWNERS_RESOLVED]: t('Device ownership conflict has been resolved'),
|
|
76
78
|
[Event.reason.DEVICE_SPEC_VALID]: t('Device specification has returned to a valid state'),
|
|
77
79
|
[Event.reason.DEVICE_SPEC_INVALID]: t('Device specification is invalid'),
|
|
80
|
+
[Event.reason.DEVICE_CONFLICT_PAUSED]: t('Device is paused after database restore'),
|
|
81
|
+
[Event.reason.DEVICE_CONFLICT_RESOLVED]: t('Device conflict has been resolved'),
|
|
78
82
|
// Enrollment request events
|
|
79
83
|
[Event.reason.ENROLLMENT_REQUEST_APPROVED]: t('Enrollment request was approved'),
|
|
80
84
|
[Event.reason.ENROLLMENT_REQUEST_APPROVAL_FAILED]: t('Enrollment request approval failed'),
|
|
81
85
|
// Internal task events
|
|
82
86
|
[Event.reason.INTERNAL_TASK_FAILED]: t('Internal task failed'),
|
|
87
|
+
[Event.reason.INTERNAL_TASK_PERMANENTLY_FAILED]: t('Internal task permanently failed'),
|
|
83
88
|
// Repository events
|
|
84
89
|
[Event.reason.REPOSITORY_ACCESSIBLE]: t('Repository is accessible'),
|
|
85
90
|
[Event.reason.REPOSITORY_INACCESSIBLE]: t('Repository is inaccessible'),
|
|
91
|
+
[Event.reason.REFERENCED_REPOSITORY_UPDATED]: t('Referenced repository was updated'),
|
|
86
92
|
// Fleet events
|
|
93
|
+
[Event.reason.FLEET_VALID]: t('Fleet specification is valid'),
|
|
94
|
+
[Event.reason.FLEET_INVALID]: t('Fleet specification is invalid'),
|
|
87
95
|
[Event.reason.FLEET_ROLLOUT_STARTED]: t('Fleet rollout started'),
|
|
88
96
|
[Event.reason.FLEET_ROLLOUT_CREATED]: t('Fleet rollout created'),
|
|
97
|
+
[Event.reason.FLEET_ROLLOUT_FAILED]: t('Fleet rollout failed'),
|
|
98
|
+
[Event.reason.FLEET_ROLLOUT_COMPLETED]: t('Fleet rollout completed'),
|
|
99
|
+
[Event.reason.FLEET_ROLLOUT_BATCH_DISPATCHED]: t('Fleet rollout batch dispatched'),
|
|
100
|
+
[Event.reason.FLEET_ROLLOUT_DEVICE_SELECTED]: t('Fleet rollout device selected'),
|
|
89
101
|
[Event.reason.FLEET_ROLLOUT_BATCH_COMPLETED]: t('Fleet rollout batch completed'),
|
|
90
102
|
// Resource sync events
|
|
91
103
|
[Event.reason.RESOURCE_SYNC_SYNCED]: t('Resourcesync synchronization completed', params),
|
|
@@ -27,7 +27,7 @@ const UpdatePolicyStep = ({ isReadOnly }: { isReadOnly: boolean }) => {
|
|
|
27
27
|
return (
|
|
28
28
|
<Grid lg={8}>
|
|
29
29
|
<FlightCtlForm>
|
|
30
|
-
<CheckboxField name="useBasicUpdateConfig" label={t('Use basic configurations')} />
|
|
30
|
+
<CheckboxField name="useBasicUpdateConfig" label={t('Use basic configurations')} isDisabled={isReadOnly} />
|
|
31
31
|
{!useBasicUpdateConfig ? (
|
|
32
32
|
<FormSection title={t('Advanced configurations')} titleElement="h1" className="pf-v5-u-mt-sm">
|
|
33
33
|
{/* Rollout policies */}
|
|
@@ -13,8 +13,9 @@ import NavItem from '../../NavItem/NavItem';
|
|
|
13
13
|
import DetailsPage from '../../DetailsPage/DetailsPage';
|
|
14
14
|
import DetailsPageActions from '../../DetailsPage/DetailsPageActions';
|
|
15
15
|
import DeleteFleetModal from '../DeleteFleetModal/DeleteFleetModal';
|
|
16
|
-
import FleetDetailsContent from './FleetDetailsContent';
|
|
17
16
|
import YamlEditor from '../../common/CodeEditor/YamlEditor';
|
|
17
|
+
import FleetDetailsContent from './FleetDetailsContent';
|
|
18
|
+
import FleetRestoreBanner from './FleetRestoreBanner';
|
|
18
19
|
|
|
19
20
|
const FleetDetailPage = () => {
|
|
20
21
|
const { t } = useTranslation();
|
|
@@ -45,6 +46,7 @@ const FleetDetailPage = () => {
|
|
|
45
46
|
resourceLink={ROUTE.FLEETS}
|
|
46
47
|
resourceType="Fleets"
|
|
47
48
|
resourceTypeLabel={t('Fleets')}
|
|
49
|
+
banner={<FleetRestoreBanner fleet={fleet} refetch={refetch} />}
|
|
48
50
|
nav={
|
|
49
51
|
<Nav variant="tertiary">
|
|
50
52
|
<NavList>
|
|
@@ -98,10 +100,7 @@ const FleetDetailPage = () => {
|
|
|
98
100
|
<Routes>
|
|
99
101
|
<Route index element={<Navigate to="details" replace />} />
|
|
100
102
|
<Route path="details" element={<FleetDetailsContent fleet={fleet} />} />
|
|
101
|
-
<Route
|
|
102
|
-
path="yaml"
|
|
103
|
-
element={<YamlEditor filename={fleet.metadata.name || 'fleet'} apiObj={fleet} refetch={refetch} />}
|
|
104
|
-
/>
|
|
103
|
+
<Route path="yaml" element={<YamlEditor filename={fleetId} apiObj={fleet} refetch={refetch} />} />
|
|
105
104
|
</Routes>
|
|
106
105
|
{isDeleteModalOpen && (
|
|
107
106
|
<DeleteFleetModal
|