@flightctl/ui-components 0.7.2 → 0.8.0-rc2
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/DetailsPageActions.d.ts +1 -1
- package/dist/src/components/DetailsPage/DetailsPageActions.d.ts.map +1 -1
- package/dist/src/components/DetailsPage/DetailsPageActions.js +1 -1
- package/dist/src/components/DetailsPage/DetailsPageActions.js.map +1 -1
- package/dist/src/components/Device/AddDeviceModal/AddDeviceModal.d.ts.map +1 -1
- package/dist/src/components/Device/AddDeviceModal/AddDeviceModal.js +18 -14
- package/dist/src/components/Device/AddDeviceModal/AddDeviceModal.js.map +1 -1
- package/dist/src/components/Device/DeviceDetails/DeviceDetailsPage.d.ts.map +1 -1
- package/dist/src/components/Device/DeviceDetails/DeviceDetailsPage.js +10 -11
- 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 +31 -10
- package/dist/src/components/Device/DeviceDetails/DeviceDetailsTab.js.map +1 -1
- package/dist/src/components/Device/DevicesPage/DecommissionedDevicesTable.js +2 -2
- package/dist/src/components/Device/DevicesPage/DecommissionedDevicesTable.js.map +1 -1
- package/dist/src/components/Device/DevicesPage/EnrolledDevicesTable.js +2 -2
- package/dist/src/components/Device/DevicesPage/EnrolledDevicesTable.js.map +1 -1
- package/dist/src/components/Device/EditDeviceWizard/EditDeviceWizard.d.ts.map +1 -1
- package/dist/src/components/Device/EditDeviceWizard/EditDeviceWizard.js +4 -2
- package/dist/src/components/Device/EditDeviceWizard/EditDeviceWizard.js.map +1 -1
- package/dist/src/components/Device/EditDeviceWizard/deviceSpecUtils.d.ts.map +1 -1
- package/dist/src/components/Device/EditDeviceWizard/deviceSpecUtils.js +30 -5
- package/dist/src/components/Device/EditDeviceWizard/deviceSpecUtils.js.map +1 -1
- package/dist/src/components/Device/EditDeviceWizard/steps/ApplicationImageForm.d.ts +2 -1
- package/dist/src/components/Device/EditDeviceWizard/steps/ApplicationImageForm.d.ts.map +1 -1
- package/dist/src/components/Device/EditDeviceWizard/steps/ApplicationImageForm.js +6 -5
- package/dist/src/components/Device/EditDeviceWizard/steps/ApplicationImageForm.js.map +1 -1
- package/dist/src/components/Device/EditDeviceWizard/steps/ApplicationInlineForm.d.ts +3 -2
- package/dist/src/components/Device/EditDeviceWizard/steps/ApplicationInlineForm.d.ts.map +1 -1
- package/dist/src/components/Device/EditDeviceWizard/steps/ApplicationInlineForm.js +13 -9
- package/dist/src/components/Device/EditDeviceWizard/steps/ApplicationInlineForm.js.map +1 -1
- package/dist/src/components/Device/EditDeviceWizard/steps/ApplicationTemplates.d.ts +3 -1
- package/dist/src/components/Device/EditDeviceWizard/steps/ApplicationTemplates.d.ts.map +1 -1
- package/dist/src/components/Device/EditDeviceWizard/steps/ApplicationTemplates.js +20 -17
- package/dist/src/components/Device/EditDeviceWizard/steps/ApplicationTemplates.js.map +1 -1
- package/dist/src/components/Device/EditDeviceWizard/steps/ConfigInlineTemplateForm.d.ts +2 -1
- package/dist/src/components/Device/EditDeviceWizard/steps/ConfigInlineTemplateForm.d.ts.map +1 -1
- package/dist/src/components/Device/EditDeviceWizard/steps/ConfigInlineTemplateForm.js +18 -14
- package/dist/src/components/Device/EditDeviceWizard/steps/ConfigInlineTemplateForm.js.map +1 -1
- package/dist/src/components/Device/EditDeviceWizard/steps/ConfigWithRepositoryTemplateForm.d.ts +2 -1
- package/dist/src/components/Device/EditDeviceWizard/steps/ConfigWithRepositoryTemplateForm.d.ts.map +1 -1
- package/dist/src/components/Device/EditDeviceWizard/steps/ConfigWithRepositoryTemplateForm.js +20 -15
- package/dist/src/components/Device/EditDeviceWizard/steps/ConfigWithRepositoryTemplateForm.js.map +1 -1
- package/dist/src/components/Device/EditDeviceWizard/steps/ConfigurationTemplates.d.ts +3 -1
- package/dist/src/components/Device/EditDeviceWizard/steps/ConfigurationTemplates.d.ts.map +1 -1
- package/dist/src/components/Device/EditDeviceWizard/steps/ConfigurationTemplates.js +34 -20
- package/dist/src/components/Device/EditDeviceWizard/steps/ConfigurationTemplates.js.map +1 -1
- package/dist/src/components/Device/EditDeviceWizard/steps/DeviceTemplateStep.d.ts +2 -1
- package/dist/src/components/Device/EditDeviceWizard/steps/DeviceTemplateStep.d.ts.map +1 -1
- package/dist/src/components/Device/EditDeviceWizard/steps/DeviceTemplateStep.js +14 -15
- package/dist/src/components/Device/EditDeviceWizard/steps/DeviceTemplateStep.js.map +1 -1
- package/dist/src/components/Device/EditDeviceWizard/steps/DeviceUpdateStep.d.ts +3 -1
- package/dist/src/components/Device/EditDeviceWizard/steps/DeviceUpdateStep.d.ts.map +1 -1
- package/dist/src/components/Device/EditDeviceWizard/steps/DeviceUpdateStep.js +6 -36
- package/dist/src/components/Device/EditDeviceWizard/steps/DeviceUpdateStep.js.map +1 -1
- package/dist/src/components/Device/EditDeviceWizard/steps/GeneralInfoStep.js +1 -1
- package/dist/src/components/Device/EditDeviceWizard/steps/GeneralInfoStep.js.map +1 -1
- package/dist/src/components/Device/EditDeviceWizard/steps/ReviewDeviceStep.js +1 -1
- package/dist/src/components/Device/EditDeviceWizard/steps/ReviewDeviceStep.js.map +1 -1
- package/dist/src/components/Device/EditDeviceWizard/steps/ReviewUpdatePolicy.js +2 -2
- package/dist/src/components/Device/EditDeviceWizard/steps/ReviewUpdatePolicy.js.map +1 -1
- package/dist/src/components/Device/EditDeviceWizard/steps/SystemdUnitsForm.d.ts +4 -2
- package/dist/src/components/Device/EditDeviceWizard/steps/SystemdUnitsForm.d.ts.map +1 -1
- package/dist/src/components/Device/EditDeviceWizard/steps/SystemdUnitsForm.js +19 -1
- package/dist/src/components/Device/EditDeviceWizard/steps/SystemdUnitsForm.js.map +1 -1
- package/dist/src/components/Device/EditDeviceWizard/utils.d.ts +2 -16
- package/dist/src/components/Device/EditDeviceWizard/utils.d.ts.map +1 -1
- package/dist/src/components/Device/EditDeviceWizard/utils.js +3 -3
- package/dist/src/components/Device/EditDeviceWizard/utils.js.map +1 -1
- package/dist/src/components/Device/SystemdUnitsModal/SystemdUnitsModal.d.ts.map +1 -1
- package/dist/src/components/Device/SystemdUnitsModal/SystemdUnitsModal.js +28 -26
- package/dist/src/components/Device/SystemdUnitsModal/SystemdUnitsModal.js.map +1 -1
- package/dist/src/components/EnrollmentRequest/EnrollmentRequestDetails/EnrollmentRequestDetails.d.ts.map +1 -1
- package/dist/src/components/EnrollmentRequest/EnrollmentRequestDetails/EnrollmentRequestDetails.js +11 -16
- package/dist/src/components/EnrollmentRequest/EnrollmentRequestDetails/EnrollmentRequestDetails.js.map +1 -1
- package/dist/src/components/Events/EventItem.d.ts +7 -0
- package/dist/src/components/Events/EventItem.d.ts.map +1 -0
- package/dist/src/components/Events/EventItem.js +25 -0
- package/dist/src/components/Events/EventItem.js.map +1 -0
- package/dist/src/components/Events/EventsCard.css +5 -0
- package/dist/src/components/Events/EventsCard.d.ts +11 -0
- package/dist/src/components/Events/EventsCard.d.ts.map +1 -0
- package/dist/src/components/Events/EventsCard.js +81 -0
- package/dist/src/components/Events/EventsCard.js.map +1 -0
- package/dist/src/components/Events/useEvents.d.ts +21 -0
- package/dist/src/components/Events/useEvents.d.ts.map +1 -0
- package/dist/src/components/Events/useEvents.js +105 -0
- package/dist/src/components/Events/useEvents.js.map +1 -0
- package/dist/src/components/Fleet/CreateFleet/CreateFleetWizard.d.ts.map +1 -1
- package/dist/src/components/Fleet/CreateFleet/CreateFleetWizard.js +27 -9
- package/dist/src/components/Fleet/CreateFleet/CreateFleetWizard.js.map +1 -1
- package/dist/src/components/Fleet/CreateFleet/CreateFleetWizardFooter.d.ts +2 -1
- package/dist/src/components/Fleet/CreateFleet/CreateFleetWizardFooter.d.ts.map +1 -1
- package/dist/src/components/Fleet/CreateFleet/CreateFleetWizardFooter.js +13 -2
- package/dist/src/components/Fleet/CreateFleet/CreateFleetWizardFooter.js.map +1 -1
- package/dist/src/components/Fleet/CreateFleet/fleetSpecUtils.d.ts +3 -33
- package/dist/src/components/Fleet/CreateFleet/fleetSpecUtils.d.ts.map +1 -1
- package/dist/src/components/Fleet/CreateFleet/fleetSpecUtils.js +7 -21
- package/dist/src/components/Fleet/CreateFleet/fleetSpecUtils.js.map +1 -1
- package/dist/src/components/Fleet/CreateFleet/steps/DeviceLabelSelector.d.ts +4 -2
- package/dist/src/components/Fleet/CreateFleet/steps/DeviceLabelSelector.d.ts.map +1 -1
- package/dist/src/components/Fleet/CreateFleet/steps/DeviceLabelSelector.js +10 -1
- package/dist/src/components/Fleet/CreateFleet/steps/DeviceLabelSelector.js.map +1 -1
- package/dist/src/components/Fleet/CreateFleet/steps/GeneralInfoStep.d.ts +5 -3
- package/dist/src/components/Fleet/CreateFleet/steps/GeneralInfoStep.d.ts.map +1 -1
- package/dist/src/components/Fleet/CreateFleet/steps/GeneralInfoStep.js +4 -4
- package/dist/src/components/Fleet/CreateFleet/steps/GeneralInfoStep.js.map +1 -1
- package/dist/src/components/Fleet/CreateFleet/steps/ReviewStep.d.ts.map +1 -1
- package/dist/src/components/Fleet/CreateFleet/steps/ReviewStep.js +10 -9
- package/dist/src/components/Fleet/CreateFleet/steps/ReviewStep.js.map +1 -1
- package/dist/src/components/Fleet/CreateFleet/steps/UpdatePolicyStep.d.ts +3 -1
- package/dist/src/components/Fleet/CreateFleet/steps/UpdatePolicyStep.d.ts.map +1 -1
- package/dist/src/components/Fleet/CreateFleet/steps/UpdatePolicyStep.js +8 -86
- package/dist/src/components/Fleet/CreateFleet/steps/UpdatePolicyStep.js.map +1 -1
- package/dist/src/components/Fleet/CreateFleet/steps/UpdateStepDisruptionBudget.d.ts +3 -1
- package/dist/src/components/Fleet/CreateFleet/steps/UpdateStepDisruptionBudget.d.ts.map +1 -1
- package/dist/src/components/Fleet/CreateFleet/steps/UpdateStepDisruptionBudget.js +4 -4
- package/dist/src/components/Fleet/CreateFleet/steps/UpdateStepDisruptionBudget.js.map +1 -1
- package/dist/src/components/Fleet/CreateFleet/steps/UpdateStepRolloutPolicy.d.ts +3 -1
- package/dist/src/components/Fleet/CreateFleet/steps/UpdateStepRolloutPolicy.d.ts.map +1 -1
- package/dist/src/components/Fleet/CreateFleet/steps/UpdateStepRolloutPolicy.js +16 -13
- package/dist/src/components/Fleet/CreateFleet/steps/UpdateStepRolloutPolicy.js.map +1 -1
- package/dist/src/components/Fleet/CreateFleet/steps/UpdateStepUpdatePolicy.d.ts +3 -1
- package/dist/src/components/Fleet/CreateFleet/steps/UpdateStepUpdatePolicy.d.ts.map +1 -1
- package/dist/src/components/Fleet/CreateFleet/steps/UpdateStepUpdatePolicy.js +20 -20
- package/dist/src/components/Fleet/CreateFleet/steps/UpdateStepUpdatePolicy.js.map +1 -1
- package/dist/src/components/Fleet/CreateFleet/utils.d.ts +1 -1
- package/dist/src/components/Fleet/CreateFleet/utils.d.ts.map +1 -1
- package/dist/src/components/Fleet/CreateFleet/utils.js +37 -23
- package/dist/src/components/Fleet/CreateFleet/utils.js.map +1 -1
- package/dist/src/components/Fleet/DeleteFleetModal/DeleteFleetModal.d.ts.map +1 -1
- package/dist/src/components/Fleet/DeleteFleetModal/DeleteFleetModal.js +20 -16
- package/dist/src/components/Fleet/DeleteFleetModal/DeleteFleetModal.js.map +1 -1
- package/dist/src/components/Fleet/FleetDetails/FleetDetailsContent.d.ts.map +1 -1
- package/dist/src/components/Fleet/FleetDetails/FleetDetailsContent.js +8 -5
- package/dist/src/components/Fleet/FleetDetails/FleetDetailsContent.js.map +1 -1
- package/dist/src/components/Fleet/FleetDetails/{FleetDetails.d.ts → FleetDetailsPage.d.ts} +1 -1
- package/dist/src/components/Fleet/FleetDetails/FleetDetailsPage.d.ts.map +1 -0
- package/dist/src/components/Fleet/FleetDetails/{FleetDetails.js → FleetDetailsPage.js} +23 -17
- package/dist/src/components/Fleet/FleetDetails/FleetDetailsPage.js.map +1 -0
- package/dist/src/components/Fleet/FleetRow.d.ts.map +1 -1
- package/dist/src/components/Fleet/FleetRow.js +9 -12
- package/dist/src/components/Fleet/FleetRow.js.map +1 -1
- package/dist/src/components/Masthead/UserPreferencesModal.d.ts.map +1 -1
- package/dist/src/components/Masthead/UserPreferencesModal.js +14 -15
- package/dist/src/components/Masthead/UserPreferencesModal.js.map +1 -1
- package/dist/src/components/Masthead/UserPreferencesProvider.d.ts +8 -5
- package/dist/src/components/Masthead/UserPreferencesProvider.d.ts.map +1 -1
- package/dist/src/components/Masthead/UserPreferencesProvider.js +7 -5
- package/dist/src/components/Masthead/UserPreferencesProvider.js.map +1 -1
- package/dist/src/components/Repository/CreateRepository/CreateRepositoryForm.d.ts.map +1 -1
- package/dist/src/components/Repository/CreateRepository/CreateRepositoryForm.js +11 -7
- package/dist/src/components/Repository/CreateRepository/CreateRepositoryForm.js.map +1 -1
- package/dist/src/components/Repository/CreateRepository/utils.d.ts.map +1 -1
- package/dist/src/components/Repository/CreateRepository/utils.js +2 -3
- package/dist/src/components/Repository/CreateRepository/utils.js.map +1 -1
- package/dist/src/components/Repository/RepositoryDetails/DeleteRepositoryModal.d.ts.map +1 -1
- package/dist/src/components/Repository/RepositoryDetails/DeleteRepositoryModal.js +25 -24
- package/dist/src/components/Repository/RepositoryDetails/DeleteRepositoryModal.js.map +1 -1
- package/dist/src/components/Repository/RepositoryDetails/RepositoryDetails.d.ts.map +1 -1
- package/dist/src/components/Repository/RepositoryDetails/RepositoryDetails.js +22 -8
- package/dist/src/components/Repository/RepositoryDetails/RepositoryDetails.js.map +1 -1
- package/dist/src/components/ResourceSync/RepositoryResourceSyncList.d.ts.map +1 -1
- package/dist/src/components/ResourceSync/RepositoryResourceSyncList.js +18 -15
- package/dist/src/components/ResourceSync/RepositoryResourceSyncList.js.map +1 -1
- package/dist/src/components/common/CodeEditor/CodeEditorTheme.d.ts +5 -0
- package/dist/src/components/common/CodeEditor/CodeEditorTheme.d.ts.map +1 -0
- package/dist/src/components/common/CodeEditor/CodeEditorTheme.js +52 -0
- package/dist/src/components/common/CodeEditor/CodeEditorTheme.js.map +1 -0
- package/dist/src/components/common/CodeEditor/Shortcut.css +22 -0
- package/dist/src/components/common/CodeEditor/Shortcut.d.ts +20 -0
- package/dist/src/components/common/CodeEditor/Shortcut.d.ts.map +1 -0
- package/dist/src/components/common/CodeEditor/Shortcut.js +46 -0
- package/dist/src/components/common/CodeEditor/Shortcut.js.map +1 -0
- package/dist/src/components/common/CodeEditor/YamlEditor.css +12 -0
- package/dist/src/components/common/CodeEditor/YamlEditor.d.ts +16 -0
- package/dist/src/components/common/CodeEditor/YamlEditor.d.ts.map +1 -0
- package/dist/src/components/common/CodeEditor/YamlEditor.js +48 -0
- package/dist/src/components/common/CodeEditor/YamlEditor.js.map +1 -0
- package/dist/src/components/common/CodeEditor/YamlEditorBase.css +3 -0
- package/dist/src/components/common/CodeEditor/YamlEditorBase.d.ts +11 -0
- package/dist/src/components/common/CodeEditor/YamlEditorBase.d.ts.map +1 -0
- package/dist/src/components/common/CodeEditor/YamlEditorBase.js +75 -0
- package/dist/src/components/common/CodeEditor/YamlEditorBase.js.map +1 -0
- package/dist/src/components/common/CodeEditor/useShortcutPopover.d.ts +3 -0
- package/dist/src/components/common/CodeEditor/useShortcutPopover.d.ts.map +1 -0
- package/dist/src/components/common/CodeEditor/useShortcutPopover.js +26 -0
- package/dist/src/components/common/CodeEditor/useShortcutPopover.js.map +1 -0
- package/dist/src/components/common/LabelsView.d.ts +1 -3
- package/dist/src/components/common/LabelsView.d.ts.map +1 -1
- package/dist/src/components/common/LabelsView.js +2 -4
- package/dist/src/components/common/LabelsView.js.map +1 -1
- package/dist/src/components/common/LeaveFormConfirmation.d.ts.map +1 -1
- package/dist/src/components/common/LeaveFormConfirmation.js +8 -7
- package/dist/src/components/common/LeaveFormConfirmation.js.map +1 -1
- package/dist/src/components/common/TechPreviewBadge.d.ts.map +1 -1
- package/dist/src/components/common/TechPreviewBadge.js +3 -2
- package/dist/src/components/common/TechPreviewBadge.js.map +1 -1
- package/dist/src/components/form/FlightCtlActionGroup.d.ts +1 -1
- package/dist/src/components/form/FlightCtlActionGroup.d.ts.map +1 -1
- package/dist/src/components/form/FlightCtlActionGroup.js.map +1 -1
- package/dist/src/components/form/FormSelect.d.ts +4 -2
- package/dist/src/components/form/FormSelect.d.ts.map +1 -1
- package/dist/src/components/form/FormSelect.js +12 -1
- package/dist/src/components/form/FormSelect.js.map +1 -1
- package/dist/src/components/form/FormSelectTypeahead.d.ts +4 -3
- package/dist/src/components/form/FormSelectTypeahead.d.ts.map +1 -1
- package/dist/src/components/form/FormSelectTypeahead.js +18 -1
- package/dist/src/components/form/FormSelectTypeahead.js.map +1 -1
- package/dist/src/components/form/LabelsField.d.ts +4 -3
- package/dist/src/components/form/LabelsField.d.ts.map +1 -1
- package/dist/src/components/form/LabelsField.js +15 -5
- package/dist/src/components/form/LabelsField.js.map +1 -1
- package/dist/src/components/form/NameField.d.ts +2 -2
- package/dist/src/components/form/NameField.d.ts.map +1 -1
- package/dist/src/components/form/NameField.js +14 -4
- package/dist/src/components/form/NameField.js.map +1 -1
- package/dist/src/components/form/RichValidationTextField.d.ts +2 -2
- package/dist/src/components/form/RichValidationTextField.d.ts.map +1 -1
- package/dist/src/components/form/RichValidationTextField.js +13 -1
- package/dist/src/components/form/RichValidationTextField.js.map +1 -1
- package/dist/src/components/form/TextListField.d.ts +4 -2
- package/dist/src/components/form/TextListField.d.ts.map +1 -1
- package/dist/src/components/form/TextListField.js +13 -3
- package/dist/src/components/form/TextListField.js.map +1 -1
- package/dist/src/components/form/UploadField.d.ts +3 -2
- package/dist/src/components/form/UploadField.d.ts.map +1 -1
- package/dist/src/components/form/UploadField.js +10 -1
- package/dist/src/components/form/UploadField.js.map +1 -1
- package/dist/src/components/form/validations.d.ts +1 -2
- package/dist/src/components/form/validations.d.ts.map +1 -1
- package/dist/src/components/form/validations.js +1 -4
- package/dist/src/components/form/validations.js.map +1 -1
- package/dist/src/components/modals/ApproveDeviceModal/ApproveDeviceModal.d.ts.map +1 -1
- package/dist/src/components/modals/ApproveDeviceModal/ApproveDeviceModal.js +4 -1
- package/dist/src/components/modals/ApproveDeviceModal/ApproveDeviceModal.js.map +1 -1
- package/dist/src/components/modals/CreateRepositoryModal/CreateRepositoryModal.d.ts.map +1 -1
- package/dist/src/components/modals/CreateRepositoryModal/CreateRepositoryModal.js +5 -3
- package/dist/src/components/modals/CreateRepositoryModal/CreateRepositoryModal.js.map +1 -1
- package/dist/src/components/modals/DecommissionModal/DecommissionModal.d.ts.map +1 -1
- package/dist/src/components/modals/DecommissionModal/DecommissionModal.js +32 -29
- package/dist/src/components/modals/DecommissionModal/DecommissionModal.js.map +1 -1
- package/dist/src/components/modals/DeleteModal/DeleteModal.d.ts.map +1 -1
- package/dist/src/components/modals/DeleteModal/DeleteModal.js +18 -15
- package/dist/src/components/modals/DeleteModal/DeleteModal.js.map +1 -1
- package/dist/src/components/modals/massModals/MassApproveDeviceModal/MassApproveDeviceModal.d.ts.map +1 -1
- package/dist/src/components/modals/massModals/MassApproveDeviceModal/MassApproveDeviceModal.js +33 -30
- package/dist/src/components/modals/massModals/MassApproveDeviceModal/MassApproveDeviceModal.js.map +1 -1
- package/dist/src/components/modals/massModals/MassDecommissionDeviceModal/MassDecommissionDeviceModal.d.ts.map +1 -1
- package/dist/src/components/modals/massModals/MassDecommissionDeviceModal/MassDecommissionDeviceModal.js +27 -24
- package/dist/src/components/modals/massModals/MassDecommissionDeviceModal/MassDecommissionDeviceModal.js.map +1 -1
- package/dist/src/components/modals/massModals/MassDeleteDeviceModal/MassDeleteDeviceModal.d.ts.map +1 -1
- package/dist/src/components/modals/massModals/MassDeleteDeviceModal/MassDeleteDeviceModal.js +26 -23
- package/dist/src/components/modals/massModals/MassDeleteDeviceModal/MassDeleteDeviceModal.js.map +1 -1
- package/dist/src/components/modals/massModals/MassDeleteFleetModal/MassDeleteFleetModal.d.ts.map +1 -1
- package/dist/src/components/modals/massModals/MassDeleteFleetModal/MassDeleteFleetModal.js +30 -25
- package/dist/src/components/modals/massModals/MassDeleteFleetModal/MassDeleteFleetModal.js.map +1 -1
- package/dist/src/components/modals/massModals/MassDeleteRepositoryModal/MassDeleteRepositoryModal.d.ts.map +1 -1
- package/dist/src/components/modals/massModals/MassDeleteRepositoryModal/MassDeleteRepositoryModal.js +29 -26
- package/dist/src/components/modals/massModals/MassDeleteRepositoryModal/MassDeleteRepositoryModal.js.map +1 -1
- package/dist/src/components/modals/massModals/MassDeleteResourceSyncModal/MassDeleteResourceSyncModal.d.ts +1 -1
- package/dist/src/components/modals/massModals/MassDeleteResourceSyncModal/MassDeleteResourceSyncModal.d.ts.map +1 -1
- package/dist/src/components/modals/massModals/MassDeleteResourceSyncModal/MassDeleteResourceSyncModal.js +28 -25
- package/dist/src/components/modals/massModals/MassDeleteResourceSyncModal/MassDeleteResourceSyncModal.js.map +1 -1
- package/dist/src/constants.d.ts +2 -1
- package/dist/src/constants.d.ts.map +1 -1
- package/dist/src/constants.js +3 -1
- package/dist/src/constants.js.map +1 -1
- package/dist/src/hooks/useAppLinks.d.ts +5 -0
- package/dist/src/hooks/useAppLinks.d.ts.map +1 -0
- package/dist/src/hooks/useAppLinks.js +45 -0
- package/dist/src/hooks/useAppLinks.js.map +1 -0
- package/dist/src/{components/EnrollmentRequest/EnrollmentRequestDetails/useEnrollmentRequestSystemInfo.d.ts → hooks/useDeviceSpecSystemInfo.d.ts} +2 -2
- package/dist/src/hooks/useDeviceSpecSystemInfo.d.ts.map +1 -0
- package/dist/src/{components/EnrollmentRequest/EnrollmentRequestDetails/useEnrollmentRequestSystemInfo.js → hooks/useDeviceSpecSystemInfo.js} +18 -10
- package/dist/src/hooks/useDeviceSpecSystemInfo.js.map +1 -0
- package/dist/src/hooks/useFetchPeriodically.d.ts +2 -2
- package/dist/src/hooks/useFetchPeriodically.d.ts.map +1 -1
- package/dist/src/hooks/useFetchPeriodically.js +1 -1
- package/dist/src/hooks/useFetchPeriodically.js.map +1 -1
- package/dist/src/hooks/useThemePreferences.d.ts +6 -3
- package/dist/src/hooks/useThemePreferences.d.ts.map +1 -1
- package/dist/src/hooks/useThemePreferences.js +46 -23
- package/dist/src/hooks/useThemePreferences.js.map +1 -1
- package/dist/src/types/deviceSpec.d.ts +7 -2
- package/dist/src/types/deviceSpec.d.ts.map +1 -1
- package/dist/src/types/deviceSpec.js +16 -12
- package/dist/src/types/deviceSpec.js.map +1 -1
- package/dist/src/types/extraTypes.d.ts +3 -2
- package/dist/src/types/extraTypes.d.ts.map +1 -1
- package/dist/src/types/extraTypes.js.map +1 -1
- package/dist/src/utils/dates.d.ts +2 -1
- package/dist/src/utils/dates.d.ts.map +1 -1
- package/dist/src/utils/dates.js +20 -20
- package/dist/src/utils/dates.js.map +1 -1
- package/dist/src/utils/patch.d.ts.map +1 -1
- package/dist/src/utils/patch.js +2 -1
- package/dist/src/utils/patch.js.map +1 -1
- package/package.json +6 -2
- package/src/components/DetailsPage/DetailsPageActions.tsx +2 -1
- package/src/components/Device/AddDeviceModal/AddDeviceModal.tsx +27 -22
- package/src/components/Device/DeviceDetails/DeviceDetailsPage.tsx +10 -19
- package/src/components/Device/DeviceDetails/DeviceDetailsTab.tsx +65 -21
- package/src/components/Device/DevicesPage/DecommissionedDevicesTable.tsx +2 -2
- package/src/components/Device/DevicesPage/EnrolledDevicesTable.tsx +2 -2
- package/src/components/Device/EditDeviceWizard/EditDeviceWizard.tsx +6 -1
- package/src/components/Device/EditDeviceWizard/deviceSpecUtils.ts +29 -5
- package/src/components/Device/EditDeviceWizard/steps/ApplicationImageForm.tsx +19 -5
- package/src/components/Device/EditDeviceWizard/steps/ApplicationInlineForm.tsx +53 -23
- package/src/components/Device/EditDeviceWizard/steps/ApplicationTemplates.tsx +68 -53
- package/src/components/Device/EditDeviceWizard/steps/ConfigInlineTemplateForm.tsx +40 -25
- package/src/components/Device/EditDeviceWizard/steps/ConfigWithRepositoryTemplateForm.tsx +38 -17
- package/src/components/Device/EditDeviceWizard/steps/ConfigurationTemplates.tsx +81 -38
- package/src/components/Device/EditDeviceWizard/steps/DeviceTemplateStep.tsx +15 -19
- package/src/components/Device/EditDeviceWizard/steps/DeviceUpdateStep.tsx +7 -47
- package/src/components/Device/EditDeviceWizard/steps/GeneralInfoStep.tsx +1 -1
- package/src/components/Device/EditDeviceWizard/steps/ReviewDeviceStep.tsx +1 -1
- package/src/components/Device/EditDeviceWizard/steps/ReviewUpdatePolicy.tsx +2 -2
- package/src/components/Device/EditDeviceWizard/steps/SystemdUnitsForm.tsx +30 -2
- package/src/components/Device/EditDeviceWizard/utils.ts +6 -7
- package/src/components/Device/SystemdUnitsModal/SystemdUnitsModal.tsx +38 -35
- package/src/components/EnrollmentRequest/EnrollmentRequestDetails/EnrollmentRequestDetails.tsx +8 -19
- package/src/components/Events/EventItem.tsx +38 -0
- package/src/components/Events/EventsCard.css +5 -0
- package/src/components/Events/EventsCard.tsx +157 -0
- package/src/components/Events/useEvents.ts +136 -0
- package/src/components/Fleet/CreateFleet/CreateFleetWizard.tsx +29 -13
- package/src/components/Fleet/CreateFleet/CreateFleetWizardFooter.tsx +25 -10
- package/src/components/Fleet/CreateFleet/fleetSpecUtils.ts +9 -23
- package/src/components/Fleet/CreateFleet/steps/DeviceLabelSelector.tsx +12 -1
- package/src/components/Fleet/CreateFleet/steps/GeneralInfoStep.tsx +10 -5
- package/src/components/Fleet/CreateFleet/steps/ReviewStep.tsx +20 -17
- package/src/components/Fleet/CreateFleet/steps/UpdatePolicyStep.tsx +18 -122
- package/src/components/Fleet/CreateFleet/steps/UpdateStepDisruptionBudget.tsx +4 -1
- package/src/components/Fleet/CreateFleet/steps/UpdateStepRolloutPolicy.tsx +50 -31
- package/src/components/Fleet/CreateFleet/steps/UpdateStepUpdatePolicy.tsx +57 -12
- package/src/components/Fleet/CreateFleet/utils.ts +40 -22
- package/src/components/Fleet/DeleteFleetModal/DeleteFleetModal.tsx +28 -28
- package/src/components/Fleet/FleetDetails/FleetDetailsContent.tsx +10 -9
- package/src/components/Fleet/FleetDetails/{FleetDetails.tsx → FleetDetailsPage.tsx} +40 -25
- package/src/components/Fleet/FleetRow.tsx +10 -11
- package/src/components/Masthead/UserPreferencesModal.tsx +43 -56
- package/src/components/Masthead/UserPreferencesProvider.tsx +15 -10
- package/src/components/Repository/CreateRepository/CreateRepositoryForm.tsx +14 -15
- package/src/components/Repository/CreateRepository/utils.ts +2 -3
- package/src/components/Repository/RepositoryDetails/DeleteRepositoryModal.tsx +54 -55
- package/src/components/Repository/RepositoryDetails/RepositoryDetails.tsx +47 -14
- package/src/components/ResourceSync/RepositoryResourceSyncList.tsx +28 -25
- package/src/components/common/CodeEditor/CodeEditorTheme.ts +53 -0
- package/src/components/common/CodeEditor/Shortcut.css +22 -0
- package/src/components/common/CodeEditor/Shortcut.tsx +90 -0
- package/src/components/common/CodeEditor/YamlEditor.css +12 -0
- package/src/components/common/CodeEditor/YamlEditor.tsx +81 -0
- package/src/components/common/CodeEditor/YamlEditorBase.css +3 -0
- package/src/components/common/CodeEditor/YamlEditorBase.tsx +124 -0
- package/src/components/common/CodeEditor/useShortcutPopover.tsx +39 -0
- package/src/components/common/LabelsView.tsx +2 -11
- package/src/components/common/LeaveFormConfirmation.tsx +14 -18
- package/src/components/common/TechPreviewBadge.tsx +3 -1
- package/src/components/form/FlightCtlActionGroup.tsx +1 -1
- package/src/components/form/FormSelect.tsx +14 -3
- package/src/components/form/FormSelectTypeahead.tsx +24 -3
- package/src/components/form/LabelsField.tsx +20 -20
- package/src/components/form/NameField.tsx +18 -4
- package/src/components/form/RichValidationTextField.tsx +20 -1
- package/src/components/form/TextListField.tsx +19 -3
- package/src/components/form/UploadField.tsx +16 -2
- package/src/components/form/validations.ts +1 -4
- package/src/components/modals/ApproveDeviceModal/ApproveDeviceModal.tsx +12 -7
- package/src/components/modals/CreateRepositoryModal/CreateRepositoryModal.tsx +6 -3
- package/src/components/modals/DecommissionModal/DecommissionModal.tsx +60 -56
- package/src/components/modals/DeleteModal/DeleteModal.tsx +25 -27
- package/src/components/modals/massModals/MassApproveDeviceModal/MassApproveDeviceModal.tsx +81 -92
- package/src/components/modals/massModals/MassDecommissionDeviceModal/MassDecommissionDeviceModal.tsx +64 -67
- package/src/components/modals/massModals/MassDeleteDeviceModal/MassDeleteDeviceModal.tsx +60 -62
- package/src/components/modals/massModals/MassDeleteFleetModal/MassDeleteFleetModal.tsx +80 -87
- package/src/components/modals/massModals/MassDeleteRepositoryModal/MassDeleteRepositoryModal.tsx +70 -73
- package/src/components/modals/massModals/MassDeleteResourceSyncModal/MassDeleteResourceSyncModal.tsx +62 -63
- package/src/constants.ts +2 -1
- package/src/hooks/useAppLinks.ts +49 -0
- package/src/{components/EnrollmentRequest/EnrollmentRequestDetails/useEnrollmentRequestSystemInfo.tsx → hooks/useDeviceSpecSystemInfo.tsx} +15 -7
- package/src/hooks/useFetchPeriodically.ts +3 -3
- package/src/hooks/useThemePreferences.ts +48 -21
- package/src/types/deviceSpec.ts +25 -13
- package/src/types/extraTypes.ts +7 -4
- package/src/utils/dates.ts +23 -24
- package/src/utils/patch.ts +3 -1
- package/dist/src/components/Device/DeviceDetails/DeviceStatusDebugModal.css +0 -3
- package/dist/src/components/Device/DeviceDetails/DeviceStatusDebugModal.d.ts +0 -9
- package/dist/src/components/Device/DeviceDetails/DeviceStatusDebugModal.d.ts.map +0 -1
- package/dist/src/components/Device/DeviceDetails/DeviceStatusDebugModal.js +0 -34
- package/dist/src/components/Device/DeviceDetails/DeviceStatusDebugModal.js.map +0 -1
- package/dist/src/components/EnrollmentRequest/EnrollmentRequestDetails/useEnrollmentRequestSystemInfo.d.ts.map +0 -1
- package/dist/src/components/EnrollmentRequest/EnrollmentRequestDetails/useEnrollmentRequestSystemInfo.js.map +0 -1
- package/dist/src/components/Fleet/CreateFleet/steps/UpdateConfirmChangesModal.d.ts +0 -9
- package/dist/src/components/Fleet/CreateFleet/steps/UpdateConfirmChangesModal.d.ts.map +0 -1
- package/dist/src/components/Fleet/CreateFleet/steps/UpdateConfirmChangesModal.js +0 -61
- package/dist/src/components/Fleet/CreateFleet/steps/UpdateConfirmChangesModal.js.map +0 -1
- package/dist/src/components/Fleet/FleetDetails/FleetDetails.d.ts.map +0 -1
- package/dist/src/components/Fleet/FleetDetails/FleetDetails.js.map +0 -1
- package/dist/src/components/common/LabelsView.css +0 -9
- package/dist/src/links.d.ts +0 -7
- package/dist/src/links.d.ts.map +0 -1
- package/dist/src/links.js +0 -14
- package/dist/src/links.js.map +0 -1
- package/src/components/Device/DeviceDetails/DeviceStatusDebugModal.css +0 -3
- package/src/components/Device/DeviceDetails/DeviceStatusDebugModal.tsx +0 -60
- package/src/components/Fleet/CreateFleet/steps/UpdateConfirmChangesModal.tsx +0 -96
- package/src/components/common/LabelsView.css +0 -9
- package/src/links.ts +0 -16
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import * as React from 'react';
|
|
2
2
|
import { Formik } from 'formik';
|
|
3
|
-
import { Modal } from '@patternfly/react-core';
|
|
3
|
+
import { Modal, ModalBody, ModalHeader } from '@patternfly/react-core/next';
|
|
4
4
|
import { Device } from '@flightctl/types';
|
|
5
5
|
|
|
6
6
|
import { useFetch } from '../../../hooks/useFetch';
|
|
@@ -35,44 +35,47 @@ const SystemdUnitsModal: React.FC<SystemdUnitsModalProps> = ({ onClose, device }
|
|
|
35
35
|
);
|
|
36
36
|
|
|
37
37
|
return (
|
|
38
|
-
<Modal
|
|
39
|
-
<
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
38
|
+
<Modal isOpen onClose={() => onClose()} variant="small">
|
|
39
|
+
<ModalHeader title={t('Track systemd services')} />
|
|
40
|
+
<ModalBody>
|
|
41
|
+
<Formik<SystemdUnitsFormValues>
|
|
42
|
+
validationSchema={deviceSystemdUnitsValidationSchema(t)}
|
|
43
|
+
initialValues={{ systemdUnits: currentSystemdUnits }}
|
|
44
|
+
onSubmit={async ({ systemdUnits: updatedSystemdUnits }) => {
|
|
45
|
+
try {
|
|
46
|
+
const currentPatterns = currentSystemdUnits.map((p) => p.pattern);
|
|
47
|
+
const updatedPatterns = updatedSystemdUnits.map((p) => p.pattern);
|
|
46
48
|
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
49
|
+
const patches = getStringListPatches(
|
|
50
|
+
'/spec/systemd',
|
|
51
|
+
currentPatterns,
|
|
52
|
+
updatedPatterns,
|
|
53
|
+
(value: string[]) => ({
|
|
54
|
+
matchPatterns: value,
|
|
55
|
+
}),
|
|
56
|
+
);
|
|
57
|
+
if (patches.length > 0) {
|
|
58
|
+
await patch(`devices/${device.metadata.name}`, patches);
|
|
57
59
|
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
60
|
+
const addedServices: string[] = [];
|
|
61
|
+
updatedPatterns.forEach((newSystemd) => {
|
|
62
|
+
if (!currentPatterns.includes(newSystemd)) {
|
|
63
|
+
addedServices.push(newSystemd);
|
|
64
|
+
}
|
|
65
|
+
});
|
|
64
66
|
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
67
|
+
onClose(true, addedServices);
|
|
68
|
+
} else {
|
|
69
|
+
onClose();
|
|
70
|
+
}
|
|
71
|
+
} catch (err) {
|
|
72
|
+
setError(getErrorMessage(err));
|
|
68
73
|
}
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
>
|
|
74
|
-
<TrackSystemdUnitsForm onClose={onClose} error={error} />
|
|
75
|
-
</Formik>
|
|
74
|
+
}}
|
|
75
|
+
>
|
|
76
|
+
<TrackSystemdUnitsForm onClose={onClose} error={error} />
|
|
77
|
+
</Formik>
|
|
78
|
+
</ModalBody>
|
|
76
79
|
</Modal>
|
|
77
80
|
);
|
|
78
81
|
};
|
package/src/components/EnrollmentRequest/EnrollmentRequestDetails/EnrollmentRequestDetails.tsx
CHANGED
|
@@ -33,11 +33,11 @@ import LabelWithHelperText from '../../common/WithHelperText';
|
|
|
33
33
|
import FlightControlDescriptionList from '../../common/FlightCtlDescriptionList';
|
|
34
34
|
import { useTranslation } from '../../../hooks/useTranslation';
|
|
35
35
|
import { ROUTE, useNavigate } from '../../../hooks/useNavigate';
|
|
36
|
+
import { useDeviceSpecSystemInfo } from '../../../hooks/useDeviceSpecSystemInfo';
|
|
36
37
|
import { useAppContext } from '../../../hooks/useAppContext';
|
|
37
38
|
import { useAccessReview } from '../../../hooks/useAccessReview';
|
|
38
39
|
import { RESOURCE, VERB } from '../../../types/rbac';
|
|
39
40
|
import PageWithPermissions from '../../common/PageWithPermissions';
|
|
40
|
-
import { useEnrollmentRequestSystemInfo } from './useEnrollmentRequestSystemInfo';
|
|
41
41
|
|
|
42
42
|
import './EnrollmentRequestDetails.css';
|
|
43
43
|
|
|
@@ -47,7 +47,7 @@ const EnrollmentRequestDetails = () => {
|
|
|
47
47
|
router: { useParams },
|
|
48
48
|
} = useAppContext();
|
|
49
49
|
const { enrollmentRequestId } = useParams() as { enrollmentRequestId: string };
|
|
50
|
-
const [er, loading, error
|
|
50
|
+
const [er, loading, error] = useFetchPeriodically<EnrollmentRequest>({
|
|
51
51
|
endpoint: `enrollmentrequests/${enrollmentRequestId}`,
|
|
52
52
|
});
|
|
53
53
|
const { remove } = useFetch();
|
|
@@ -56,8 +56,9 @@ const EnrollmentRequestDetails = () => {
|
|
|
56
56
|
const [canDelete] = useAccessReview(RESOURCE.ENROLLMENT_REQUEST, VERB.DELETE);
|
|
57
57
|
|
|
58
58
|
const [isApprovalModalOpen, setIsApprovalModalOpen] = React.useState(false);
|
|
59
|
-
const erSystemInfo =
|
|
59
|
+
const erSystemInfo = useDeviceSpecSystemInfo(er?.spec.deviceStatus?.systemInfo, t);
|
|
60
60
|
const hasDefaultLabels = Object.keys(er?.spec.labels || {}).length > 0;
|
|
61
|
+
const deviceId = er?.metadata.name as string;
|
|
61
62
|
|
|
62
63
|
const { deleteAction, deleteModal } = useDeleteAction({
|
|
63
64
|
resourceName: enrollmentRequestId,
|
|
@@ -74,7 +75,7 @@ const EnrollmentRequestDetails = () => {
|
|
|
74
75
|
<DetailsPage
|
|
75
76
|
loading={loading}
|
|
76
77
|
error={error}
|
|
77
|
-
id={
|
|
78
|
+
id={deviceId}
|
|
78
79
|
resourceLink={ROUTE.DEVICES}
|
|
79
80
|
resourceType="Devices"
|
|
80
81
|
resourceTypeLabel={t('Devices')}
|
|
@@ -101,7 +102,7 @@ const EnrollmentRequestDetails = () => {
|
|
|
101
102
|
<FlightControlDescriptionList columnModifier={{ lg: '3Col' }}>
|
|
102
103
|
<DescriptionListGroup>
|
|
103
104
|
<DescriptionListTerm>{t('Name')}</DescriptionListTerm>
|
|
104
|
-
<DescriptionListDescription>{
|
|
105
|
+
<DescriptionListDescription>{deviceId}</DescriptionListDescription>
|
|
105
106
|
</DescriptionListGroup>
|
|
106
107
|
<DescriptionListGroup>
|
|
107
108
|
<DescriptionListTerm>{t('Last seen')}</DescriptionListTerm>
|
|
@@ -109,18 +110,6 @@ const EnrollmentRequestDetails = () => {
|
|
|
109
110
|
{timeSinceText(t, er?.metadata.creationTimestamp)}
|
|
110
111
|
</DescriptionListDescription>
|
|
111
112
|
</DescriptionListGroup>
|
|
112
|
-
<DescriptionListGroup>
|
|
113
|
-
<DescriptionListTerm>{t('Operating system')}</DescriptionListTerm>
|
|
114
|
-
<DescriptionListDescription>
|
|
115
|
-
{er?.spec?.deviceStatus?.systemInfo?.operatingSystem || '-'}
|
|
116
|
-
</DescriptionListDescription>
|
|
117
|
-
</DescriptionListGroup>
|
|
118
|
-
<DescriptionListGroup>
|
|
119
|
-
<DescriptionListTerm>{t('Architecture')}</DescriptionListTerm>
|
|
120
|
-
<DescriptionListDescription>
|
|
121
|
-
{er?.spec?.deviceStatus?.systemInfo?.architecture || '-'}
|
|
122
|
-
</DescriptionListDescription>
|
|
123
|
-
</DescriptionListGroup>
|
|
124
113
|
{hasDefaultLabels && (
|
|
125
114
|
<DescriptionListGroup>
|
|
126
115
|
<DescriptionListTerm>{t('Labels')}</DescriptionListTerm>
|
|
@@ -221,9 +210,9 @@ const EnrollmentRequestDetails = () => {
|
|
|
221
210
|
{er && isApprovalModalOpen && (
|
|
222
211
|
<ApproveDeviceModal
|
|
223
212
|
enrollmentRequest={er}
|
|
224
|
-
onClose={(
|
|
213
|
+
onClose={(isApproved) => {
|
|
225
214
|
setIsApprovalModalOpen(false);
|
|
226
|
-
|
|
215
|
+
isApproved && navigate({ route: ROUTE.DEVICE_DETAILS, postfix: deviceId });
|
|
227
216
|
}}
|
|
228
217
|
/>
|
|
229
218
|
)}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import { Icon, Stack, StackItem, TextContent } from '@patternfly/react-core';
|
|
3
|
+
import InfoCircleIcon from '@patternfly/react-icons/dist/js/icons/info-circle-icon';
|
|
4
|
+
import { ExclamationTriangleIcon } from '@patternfly/react-icons/dist/js/icons/exclamation-triangle-icon';
|
|
5
|
+
|
|
6
|
+
import { Event } from '@flightctl/types';
|
|
7
|
+
import { DisplayEvent } from './useEvents';
|
|
8
|
+
|
|
9
|
+
const NormalEventIcon = () => (
|
|
10
|
+
<Icon status="info" size="md">
|
|
11
|
+
<InfoCircleIcon />
|
|
12
|
+
</Icon>
|
|
13
|
+
);
|
|
14
|
+
|
|
15
|
+
const WarningEventIcon = () => (
|
|
16
|
+
<Icon status="warning" size="md">
|
|
17
|
+
<ExclamationTriangleIcon />
|
|
18
|
+
</Icon>
|
|
19
|
+
);
|
|
20
|
+
|
|
21
|
+
const EventItem = ({ event }: { event: DisplayEvent }) => {
|
|
22
|
+
return (
|
|
23
|
+
<Stack>
|
|
24
|
+
<StackItem>
|
|
25
|
+
{event.type === Event.type.NORMAL ? <NormalEventIcon /> : <WarningEventIcon />}{' '}
|
|
26
|
+
<strong>{event.reasonText}</strong>
|
|
27
|
+
</StackItem>
|
|
28
|
+
{event.message && <StackItem>{event.message}</StackItem>}
|
|
29
|
+
<StackItem>
|
|
30
|
+
<TextContent>
|
|
31
|
+
<small>{event.dateText}</small>
|
|
32
|
+
</TextContent>
|
|
33
|
+
</StackItem>
|
|
34
|
+
</Stack>
|
|
35
|
+
);
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
export default EventItem;
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import {
|
|
3
|
+
Button,
|
|
4
|
+
Card,
|
|
5
|
+
CardBody,
|
|
6
|
+
CardTitle,
|
|
7
|
+
Divider,
|
|
8
|
+
EmptyState,
|
|
9
|
+
EmptyStateBody,
|
|
10
|
+
EmptyStateHeader,
|
|
11
|
+
Flex,
|
|
12
|
+
FlexItem,
|
|
13
|
+
MenuToggle,
|
|
14
|
+
Select,
|
|
15
|
+
SelectList,
|
|
16
|
+
SelectOption,
|
|
17
|
+
Spinner,
|
|
18
|
+
Stack,
|
|
19
|
+
StackItem,
|
|
20
|
+
} from '@patternfly/react-core';
|
|
21
|
+
import SyncAltIcon from '@patternfly/react-icons/dist/js/icons/sync-alt-icon';
|
|
22
|
+
|
|
23
|
+
import { Event, ResourceKind } from '@flightctl/types';
|
|
24
|
+
import { useTranslation } from '../../hooks/useTranslation';
|
|
25
|
+
import { timeSinceEpochText } from '../../utils/dates';
|
|
26
|
+
import useEvents, { DisplayEvent, SelectableEventType } from './useEvents';
|
|
27
|
+
import EventItem from './EventItem';
|
|
28
|
+
|
|
29
|
+
import './EventsCard.css';
|
|
30
|
+
|
|
31
|
+
type EventListProps = {
|
|
32
|
+
kind: ResourceKind;
|
|
33
|
+
objId: string;
|
|
34
|
+
type?: Event.type;
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
const EventEmptyState = ({ hasFilters }: { hasFilters: boolean }) => {
|
|
38
|
+
const { t } = useTranslation();
|
|
39
|
+
return (
|
|
40
|
+
<EmptyState>
|
|
41
|
+
<EmptyStateHeader>{t('No matching events')}</EmptyStateHeader>
|
|
42
|
+
<EmptyStateBody>
|
|
43
|
+
{hasFilters ? t('No events were found based on the current filters') : t('No events were found')}
|
|
44
|
+
</EmptyStateBody>
|
|
45
|
+
</EmptyState>
|
|
46
|
+
);
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
const EventList = ({ events }: { events: DisplayEvent[] }) => {
|
|
50
|
+
// Reference used to give the events panel the correct height
|
|
51
|
+
const topRef = React.useRef<HTMLDivElement>(null);
|
|
52
|
+
const [topY, setTopY] = React.useState<number>(0);
|
|
53
|
+
|
|
54
|
+
React.useEffect(() => {
|
|
55
|
+
if (topRef.current) {
|
|
56
|
+
const boundingRect = topRef.current.getBoundingClientRect();
|
|
57
|
+
if (boundingRect.top > 0) {
|
|
58
|
+
setTopY(Math.ceil(boundingRect.top));
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}, []);
|
|
62
|
+
|
|
63
|
+
return (
|
|
64
|
+
<div ref={topRef} style={{ height: `calc(97vh - ${topY}px)` }}>
|
|
65
|
+
<Stack hasGutter>
|
|
66
|
+
{events.map((event) => {
|
|
67
|
+
return (
|
|
68
|
+
<StackItem key={event.name}>
|
|
69
|
+
<EventItem event={event} />
|
|
70
|
+
</StackItem>
|
|
71
|
+
);
|
|
72
|
+
})}
|
|
73
|
+
</Stack>
|
|
74
|
+
</div>
|
|
75
|
+
);
|
|
76
|
+
};
|
|
77
|
+
|
|
78
|
+
const EventsCard = ({ kind, objId, type = Event.type.WARNING }: EventListProps) => {
|
|
79
|
+
const { t } = useTranslation();
|
|
80
|
+
|
|
81
|
+
const [selectedType, setSelectedType] = React.useState<SelectableEventType>(type);
|
|
82
|
+
const searchCriteria = React.useMemo(
|
|
83
|
+
() => ({
|
|
84
|
+
kind,
|
|
85
|
+
name: objId,
|
|
86
|
+
type: selectedType,
|
|
87
|
+
}),
|
|
88
|
+
[kind, objId, selectedType],
|
|
89
|
+
);
|
|
90
|
+
const [events, isLoading, refetch, isUpdating, lastUpdateTime] = useEvents(searchCriteria, t);
|
|
91
|
+
const [isTypeOpen, setIsTypeOpen] = React.useState<boolean>(false);
|
|
92
|
+
const title =
|
|
93
|
+
lastUpdateTime === 0
|
|
94
|
+
? t('Events')
|
|
95
|
+
: t('Events (updated {{ lastUpdate}})', { lastUpdate: timeSinceEpochText(t, lastUpdateTime) });
|
|
96
|
+
|
|
97
|
+
let content: React.ReactNode;
|
|
98
|
+
if (isLoading && !events) {
|
|
99
|
+
content = <Spinner size="sm" />;
|
|
100
|
+
} else if (!isLoading && events?.length === 0) {
|
|
101
|
+
content = <EventEmptyState hasFilters={selectedType !== 'all'} />;
|
|
102
|
+
} else {
|
|
103
|
+
content = <EventList events={events || []} />;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
return (
|
|
107
|
+
<Card>
|
|
108
|
+
<CardTitle>
|
|
109
|
+
<Flex justifyContent={{ default: 'justifyContentSpaceBetween' }}>
|
|
110
|
+
<FlexItem>{title}</FlexItem>
|
|
111
|
+
<FlexItem>
|
|
112
|
+
<Button
|
|
113
|
+
aria-label={t('Reload events')}
|
|
114
|
+
isDisabled={isLoading || isUpdating}
|
|
115
|
+
variant="plain"
|
|
116
|
+
icon={<SyncAltIcon />}
|
|
117
|
+
onClick={refetch}
|
|
118
|
+
/>
|
|
119
|
+
</FlexItem>
|
|
120
|
+
</Flex>
|
|
121
|
+
</CardTitle>
|
|
122
|
+
<CardBody isFilled={false}>
|
|
123
|
+
<Select
|
|
124
|
+
isOpen={isTypeOpen}
|
|
125
|
+
selected={selectedType}
|
|
126
|
+
onSelect={(_, value) => {
|
|
127
|
+
setSelectedType(value as SelectableEventType);
|
|
128
|
+
setIsTypeOpen(false);
|
|
129
|
+
}}
|
|
130
|
+
toggle={(toggleRef) => (
|
|
131
|
+
<MenuToggle
|
|
132
|
+
ref={toggleRef}
|
|
133
|
+
isExpanded
|
|
134
|
+
onClick={() => {
|
|
135
|
+
setIsTypeOpen((open) => !open);
|
|
136
|
+
}}
|
|
137
|
+
>
|
|
138
|
+
{selectedType === 'all' ? t('All types') : selectedType}
|
|
139
|
+
</MenuToggle>
|
|
140
|
+
)}
|
|
141
|
+
>
|
|
142
|
+
<SelectList>
|
|
143
|
+
<SelectOption value="all">{t('All types')}</SelectOption>
|
|
144
|
+
<SelectOption value={Event.type.NORMAL}>{t('Normal')}</SelectOption>
|
|
145
|
+
<SelectOption value={Event.type.WARNING}>{t('Warning')}</SelectOption>
|
|
146
|
+
</SelectList>
|
|
147
|
+
</Select>
|
|
148
|
+
</CardBody>
|
|
149
|
+
<Divider />
|
|
150
|
+
<CardBody isFilled className="fctl-events-container">
|
|
151
|
+
{content}
|
|
152
|
+
</CardBody>
|
|
153
|
+
</Card>
|
|
154
|
+
);
|
|
155
|
+
};
|
|
156
|
+
|
|
157
|
+
export default EventsCard;
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import { TFunction } from 'react-i18next';
|
|
3
|
+
|
|
4
|
+
import { Event, EventList, ObjectReference, ResourceKind } from '@flightctl/types';
|
|
5
|
+
import { useFetchPeriodically } from '../../hooks/useFetchPeriodically';
|
|
6
|
+
import { EVENT_PAGE_SIZE } from '../../constants';
|
|
7
|
+
import { getDateDisplay } from '../../utils/dates';
|
|
8
|
+
import * as queryUtils from '../../utils/query';
|
|
9
|
+
|
|
10
|
+
const getTimeout = (kind?: ResourceKind) => {
|
|
11
|
+
switch (kind) {
|
|
12
|
+
case ResourceKind.DEVICE:
|
|
13
|
+
return 180000; // 3 minutes
|
|
14
|
+
case ResourceKind.FLEET:
|
|
15
|
+
return 300000; // 5 minutes
|
|
16
|
+
case ResourceKind.REPOSITORY:
|
|
17
|
+
default:
|
|
18
|
+
return 600000; // 10 minutes
|
|
19
|
+
}
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
type UseEventsResult = [
|
|
23
|
+
DisplayEvent[] | undefined, // Event list
|
|
24
|
+
boolean, // isLoading
|
|
25
|
+
VoidFunction, // refetch
|
|
26
|
+
boolean, // isUpdating
|
|
27
|
+
number, // Last update timestamp
|
|
28
|
+
];
|
|
29
|
+
|
|
30
|
+
export type SelectableEventType = Event.type | 'all';
|
|
31
|
+
|
|
32
|
+
// Reduced Event object. All fields should be ready to be displayed in the UI.
|
|
33
|
+
export type DisplayEvent = Pick<Event, 'type' | 'message'> & {
|
|
34
|
+
name: string;
|
|
35
|
+
dateText: string;
|
|
36
|
+
reasonText: string;
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
export type EventSearchCriteria = Partial<ObjectReference> & {
|
|
40
|
+
type: SelectableEventType;
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
const getEventReasonTitles = (t: TFunction, kindType: string): Record<Event.reason, string> => {
|
|
44
|
+
const params = { resourceType: kindType };
|
|
45
|
+
return {
|
|
46
|
+
[Event.reason.RESOURCE_CREATED]: t('{{ resourceType }} was created successfully', params),
|
|
47
|
+
[Event.reason.RESOURCE_CREATION_FAILED]: t('{{ resourceType }} could not be created', params),
|
|
48
|
+
[Event.reason.RESOURCE_DELETED]: t('{{ resourceType }} was deleted successfully', params),
|
|
49
|
+
[Event.reason.RESOURCE_DELETION_FAILED]: t('{{ resourceType }} could not be deleted', params),
|
|
50
|
+
[Event.reason.RESOURCE_UPDATED]: t('{{ resourceType }} was updated successfully', params),
|
|
51
|
+
[Event.reason.RESOURCE_UPDATE_FAILED]: t('{{ resourceType }} could not be updated', params),
|
|
52
|
+
[Event.reason.DEVICE_DECOMMISSIONED]: t('Device decommissioned successfully'),
|
|
53
|
+
[Event.reason.DEVICE_DECOMMISSION_FAILED]: t('Device could not be decommissioned'),
|
|
54
|
+
[Event.reason.DEVICE_CPUNORMAL]: t('CPU utilization has returned to normal'),
|
|
55
|
+
[Event.reason.DEVICE_CPUWARNING]: t('CPU utilization has reached a warning level'),
|
|
56
|
+
[Event.reason.DEVICE_CPUCRITICAL]: t('CPU utilization has reached a critical level'),
|
|
57
|
+
[Event.reason.DEVICE_MEMORY_NORMAL]: t('Memory utilization has returned to normal'),
|
|
58
|
+
[Event.reason.DEVICE_MEMORY_WARNING]: t('Memory utilization has reached a warning level '),
|
|
59
|
+
[Event.reason.DEVICE_MEMORY_CRITICAL]: t('Memory utilization has reached a critical level'),
|
|
60
|
+
[Event.reason.DEVICE_DISK_NORMAL]: t('Disk utilization has returned to normal'),
|
|
61
|
+
[Event.reason.DEVICE_DISK_WARNING]: t('Disk utilization has reached a warning level'),
|
|
62
|
+
[Event.reason.DEVICE_DISK_CRITICAL]: t('Disk utilization has reached a critical level'),
|
|
63
|
+
[Event.reason.DEVICE_APPLICATION_HEALTHY]: t('All application workloads are healthy'),
|
|
64
|
+
[Event.reason.DEVICE_APPLICATION_DEGRADED]: t('Some applications workloads are degraded'),
|
|
65
|
+
[Event.reason.DEVICE_APPLICATION_ERROR]: t('Some application workloads are in error state'),
|
|
66
|
+
[Event.reason.DEVICE_CONNECTED]: t('Device reconnected'),
|
|
67
|
+
[Event.reason.DEVICE_DISCONNECTED]: t('Device is disconnected'),
|
|
68
|
+
[Event.reason.DEVICE_CONTENT_UP_TO_DATE]: t('Device returned to being up-to-date'),
|
|
69
|
+
[Event.reason.DEVICE_CONTENT_UPDATING]: t('Device is updating'),
|
|
70
|
+
[Event.reason.DEVICE_CONTENT_OUT_OF_DATE]: t('Device is out-of-date'),
|
|
71
|
+
};
|
|
72
|
+
};
|
|
73
|
+
|
|
74
|
+
const redundantMessageReasons = [
|
|
75
|
+
Event.reason.RESOURCE_CREATED, // <kind> <name> created successfully
|
|
76
|
+
Event.reason.RESOURCE_UPDATED, // <kind> <name> updated successfully
|
|
77
|
+
Event.reason.RESOURCE_DELETED, // <kind> <name> deleted successfully
|
|
78
|
+
];
|
|
79
|
+
|
|
80
|
+
const displayEventMapper = (event: Event, reasonTxt: string): DisplayEvent => ({
|
|
81
|
+
name: event.metadata.name as string,
|
|
82
|
+
type: event.type,
|
|
83
|
+
dateText: getDateDisplay(event.metadata.creationTimestamp || ''),
|
|
84
|
+
reasonText: reasonTxt || event.reason,
|
|
85
|
+
message: redundantMessageReasons.includes(event.reason) ? '' : event.message,
|
|
86
|
+
});
|
|
87
|
+
|
|
88
|
+
const buildEndpoint = (criteria: EventSearchCriteria) => {
|
|
89
|
+
const params = new URLSearchParams({
|
|
90
|
+
limit: `${EVENT_PAGE_SIZE}`,
|
|
91
|
+
});
|
|
92
|
+
const fieldSelectors: string[] = [];
|
|
93
|
+
if (criteria.kind) {
|
|
94
|
+
queryUtils.addQueryConditions(fieldSelectors, 'involvedObject.kind', [criteria.kind]);
|
|
95
|
+
}
|
|
96
|
+
if (criteria.name) {
|
|
97
|
+
queryUtils.addQueryConditions(fieldSelectors, 'involvedObject.name', [criteria.name]);
|
|
98
|
+
}
|
|
99
|
+
if (criteria.type !== 'all') {
|
|
100
|
+
queryUtils.addQueryConditions(fieldSelectors, 'type', [criteria.type]);
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
if (fieldSelectors.length > 0) {
|
|
104
|
+
params.set('fieldSelector', fieldSelectors.join(','));
|
|
105
|
+
}
|
|
106
|
+
return `events?${params.toString()}`;
|
|
107
|
+
};
|
|
108
|
+
|
|
109
|
+
const useEvents = (criteria: EventSearchCriteria, t: TFunction): UseEventsResult => {
|
|
110
|
+
const [events, setEvents] = React.useState<DisplayEvent[]>();
|
|
111
|
+
const [lastDate, setLastDate] = React.useState<number>(0);
|
|
112
|
+
const timeout = getTimeout(criteria.kind as ResourceKind | undefined);
|
|
113
|
+
|
|
114
|
+
const [eventList, isLoading, , refetch, isUpdating] = useFetchPeriodically<EventList>({
|
|
115
|
+
endpoint: buildEndpoint(criteria),
|
|
116
|
+
timeout,
|
|
117
|
+
});
|
|
118
|
+
|
|
119
|
+
const eventReasonTitles = React.useMemo(() => {
|
|
120
|
+
return getEventReasonTitles(t, criteria.kind || t('Resource'));
|
|
121
|
+
}, [t, criteria.kind]);
|
|
122
|
+
|
|
123
|
+
React.useEffect(() => {
|
|
124
|
+
setEvents(() => {
|
|
125
|
+
return (eventList?.items || []).map((event) => {
|
|
126
|
+
const reason = eventReasonTitles[event.reason];
|
|
127
|
+
return displayEventMapper(event, reason);
|
|
128
|
+
});
|
|
129
|
+
});
|
|
130
|
+
setLastDate(Date.now());
|
|
131
|
+
}, [criteria, eventList?.items, eventReasonTitles]);
|
|
132
|
+
|
|
133
|
+
return [events, isLoading, refetch, isUpdating, lastDate];
|
|
134
|
+
};
|
|
135
|
+
|
|
136
|
+
export default useEvents;
|
|
@@ -78,8 +78,13 @@ const CreateFleetWizard = () => {
|
|
|
78
78
|
const navigate = useNavigate();
|
|
79
79
|
const [currentStep, setCurrentStep] = React.useState<WizardStepType>();
|
|
80
80
|
const [fleetId, fleet, loading, editError] = useEditFleet();
|
|
81
|
+
|
|
82
|
+
const [canEdit] = useAccessReview(RESOURCE.FLEET, VERB.PATCH);
|
|
83
|
+
|
|
81
84
|
const isEdit = !!fleetId;
|
|
82
|
-
|
|
85
|
+
const isReadOnly = !!fleet?.metadata.owner || (isEdit && !canEdit);
|
|
86
|
+
|
|
87
|
+
let body: React.ReactNode;
|
|
83
88
|
|
|
84
89
|
if (loading) {
|
|
85
90
|
body = (
|
|
@@ -93,12 +98,6 @@ const CreateFleetWizard = () => {
|
|
|
93
98
|
{getErrorMessage(editError)}
|
|
94
99
|
</Alert>
|
|
95
100
|
);
|
|
96
|
-
} else if (!!fleet?.metadata.owner) {
|
|
97
|
-
body = (
|
|
98
|
-
<Alert isInline variant="info" title={t('Fleet is non-editable')}>
|
|
99
|
-
{t('This fleet is managed by a resource sync and it cannot be edited directly.')}
|
|
100
|
-
</Alert>
|
|
101
|
-
);
|
|
102
101
|
} else {
|
|
103
102
|
body = (
|
|
104
103
|
<Formik<FleetFormValues>
|
|
@@ -125,12 +124,20 @@ const CreateFleetWizard = () => {
|
|
|
125
124
|
>
|
|
126
125
|
{({ errors: formikErrors }) => {
|
|
127
126
|
const validStepIds = getValidStepIds(formikErrors);
|
|
127
|
+
let reviewStepLabel: string;
|
|
128
|
+
if (isReadOnly) {
|
|
129
|
+
reviewStepLabel = t('Review');
|
|
130
|
+
} else if (isEdit) {
|
|
131
|
+
reviewStepLabel = t('Review and save');
|
|
132
|
+
} else {
|
|
133
|
+
reviewStepLabel = t('Review and create');
|
|
134
|
+
}
|
|
128
135
|
|
|
129
136
|
return (
|
|
130
137
|
<>
|
|
131
138
|
<LeaveFormConfirmation />
|
|
132
139
|
<Wizard
|
|
133
|
-
footer={<CreateFleetWizardFooter isEdit={isEdit} />}
|
|
140
|
+
footer={<CreateFleetWizardFooter isReadOnly={isReadOnly} isEdit={isEdit} />}
|
|
134
141
|
onStepChange={(_, step) => {
|
|
135
142
|
if (error) {
|
|
136
143
|
setError(undefined);
|
|
@@ -140,24 +147,26 @@ const CreateFleetWizard = () => {
|
|
|
140
147
|
className="fctl-create-fleet"
|
|
141
148
|
>
|
|
142
149
|
<WizardStep name={t('General info')} id={generalInfoStepId}>
|
|
143
|
-
{(!currentStep || currentStep?.id === generalInfoStepId) &&
|
|
150
|
+
{(!currentStep || currentStep?.id === generalInfoStepId) && (
|
|
151
|
+
<GeneralInfoStep isEdit={isEdit} isReadOnly={isReadOnly} />
|
|
152
|
+
)}
|
|
144
153
|
</WizardStep>
|
|
145
154
|
<WizardStep
|
|
146
155
|
name={t('Device template')}
|
|
147
156
|
id={deviceTemplateStepId}
|
|
148
157
|
isDisabled={isDisabledStep(deviceTemplateStepId, validStepIds)}
|
|
149
158
|
>
|
|
150
|
-
{currentStep?.id === deviceTemplateStepId && <DeviceTemplateStep isFleet />}
|
|
159
|
+
{currentStep?.id === deviceTemplateStepId && <DeviceTemplateStep isFleet isReadOnly={isReadOnly} />}
|
|
151
160
|
</WizardStep>
|
|
152
161
|
<WizardStep
|
|
153
162
|
name={t('Updates')}
|
|
154
163
|
id={updatePolicyStepId}
|
|
155
164
|
isDisabled={isDisabledStep(updatePolicyStepId, validStepIds)}
|
|
156
165
|
>
|
|
157
|
-
{currentStep?.id === updatePolicyStepId && <UpdatePolicyStep />}
|
|
166
|
+
{currentStep?.id === updatePolicyStepId && <UpdatePolicyStep isReadOnly={isReadOnly} />}
|
|
158
167
|
</WizardStep>
|
|
159
168
|
<WizardStep
|
|
160
|
-
name={
|
|
169
|
+
name={reviewStepLabel}
|
|
161
170
|
id={reviewStepId}
|
|
162
171
|
isDisabled={isDisabledStep(reviewStepId, validStepIds)}
|
|
163
172
|
>
|
|
@@ -171,7 +180,14 @@ const CreateFleetWizard = () => {
|
|
|
171
180
|
);
|
|
172
181
|
}
|
|
173
182
|
|
|
174
|
-
|
|
183
|
+
let title: string;
|
|
184
|
+
if (isReadOnly) {
|
|
185
|
+
title = t('View fleet');
|
|
186
|
+
} else if (isEdit) {
|
|
187
|
+
title = t('Edit fleet');
|
|
188
|
+
} else {
|
|
189
|
+
title = t('Create fleet');
|
|
190
|
+
}
|
|
175
191
|
|
|
176
192
|
return (
|
|
177
193
|
<>
|
|
@@ -13,10 +13,11 @@ import {
|
|
|
13
13
|
import { isUpdatePolicyStepValid, updatePolicyStepId } from './steps/UpdatePolicyStep';
|
|
14
14
|
|
|
15
15
|
type CreateFleetWizardFooterProps = {
|
|
16
|
+
isReadOnly: boolean;
|
|
16
17
|
isEdit: boolean;
|
|
17
18
|
};
|
|
18
19
|
|
|
19
|
-
const CreateFleetWizardFooter = ({ isEdit }: CreateFleetWizardFooterProps) => {
|
|
20
|
+
const CreateFleetWizardFooter = ({ isReadOnly, isEdit }: CreateFleetWizardFooterProps) => {
|
|
20
21
|
const { t } = useTranslation();
|
|
21
22
|
const { goToNextStep, goToPrevStep, activeStep } = useWizardContext();
|
|
22
23
|
const { submitForm, isSubmitting, errors } = useFormikContext<FleetFormValues>();
|
|
@@ -39,15 +40,29 @@ const CreateFleetWizardFooter = ({ isEdit }: CreateFleetWizardFooterProps) => {
|
|
|
39
40
|
buttonRef.current?.blur();
|
|
40
41
|
};
|
|
41
42
|
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
43
|
+
let primaryBtn: React.ReactNode;
|
|
44
|
+
|
|
45
|
+
if (isReviewStep) {
|
|
46
|
+
if (isReadOnly) {
|
|
47
|
+
primaryBtn = (
|
|
48
|
+
<Button variant="primary" onClick={() => navigate(-1)}>
|
|
49
|
+
{t('Close')}
|
|
50
|
+
</Button>
|
|
51
|
+
);
|
|
52
|
+
} else {
|
|
53
|
+
primaryBtn = (
|
|
54
|
+
<Button variant="primary" onClick={submitForm} isDisabled={isSubmitting} isLoading={isSubmitting}>
|
|
55
|
+
{isEdit ? t('Save') : t('Create fleet')}
|
|
56
|
+
</Button>
|
|
57
|
+
);
|
|
58
|
+
}
|
|
59
|
+
} else {
|
|
60
|
+
primaryBtn = (
|
|
61
|
+
<Button variant="primary" onClick={onMoveNext} isDisabled={!isReadOnly && !isStepValid} ref={buttonRef}>
|
|
62
|
+
{t('Next')}
|
|
63
|
+
</Button>
|
|
64
|
+
);
|
|
65
|
+
}
|
|
51
66
|
|
|
52
67
|
return (
|
|
53
68
|
<WizardFooterWrapper>
|