@flightctl/ui-components 0.7.2 → 0.8.0-rc1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (408) hide show
  1. package/dist/src/components/DetailsPage/DetailsPageActions.d.ts +1 -1
  2. package/dist/src/components/DetailsPage/DetailsPageActions.d.ts.map +1 -1
  3. package/dist/src/components/DetailsPage/DetailsPageActions.js +1 -1
  4. package/dist/src/components/DetailsPage/DetailsPageActions.js.map +1 -1
  5. package/dist/src/components/Device/AddDeviceModal/AddDeviceModal.d.ts.map +1 -1
  6. package/dist/src/components/Device/AddDeviceModal/AddDeviceModal.js +18 -14
  7. package/dist/src/components/Device/AddDeviceModal/AddDeviceModal.js.map +1 -1
  8. package/dist/src/components/Device/DeviceDetails/DeviceDetailsPage.d.ts.map +1 -1
  9. package/dist/src/components/Device/DeviceDetails/DeviceDetailsPage.js +10 -11
  10. package/dist/src/components/Device/DeviceDetails/DeviceDetailsPage.js.map +1 -1
  11. package/dist/src/components/Device/DeviceDetails/DeviceDetailsTab.d.ts.map +1 -1
  12. package/dist/src/components/Device/DeviceDetails/DeviceDetailsTab.js +31 -10
  13. package/dist/src/components/Device/DeviceDetails/DeviceDetailsTab.js.map +1 -1
  14. package/dist/src/components/Device/DevicesPage/DecommissionedDevicesTable.js +2 -2
  15. package/dist/src/components/Device/DevicesPage/DecommissionedDevicesTable.js.map +1 -1
  16. package/dist/src/components/Device/DevicesPage/EnrolledDevicesTable.js +2 -2
  17. package/dist/src/components/Device/DevicesPage/EnrolledDevicesTable.js.map +1 -1
  18. package/dist/src/components/Device/EditDeviceWizard/EditDeviceWizard.d.ts.map +1 -1
  19. package/dist/src/components/Device/EditDeviceWizard/EditDeviceWizard.js +4 -2
  20. package/dist/src/components/Device/EditDeviceWizard/EditDeviceWizard.js.map +1 -1
  21. package/dist/src/components/Device/EditDeviceWizard/deviceSpecUtils.d.ts.map +1 -1
  22. package/dist/src/components/Device/EditDeviceWizard/deviceSpecUtils.js +29 -1
  23. package/dist/src/components/Device/EditDeviceWizard/deviceSpecUtils.js.map +1 -1
  24. package/dist/src/components/Device/EditDeviceWizard/steps/ApplicationImageForm.d.ts +2 -1
  25. package/dist/src/components/Device/EditDeviceWizard/steps/ApplicationImageForm.d.ts.map +1 -1
  26. package/dist/src/components/Device/EditDeviceWizard/steps/ApplicationImageForm.js +6 -5
  27. package/dist/src/components/Device/EditDeviceWizard/steps/ApplicationImageForm.js.map +1 -1
  28. package/dist/src/components/Device/EditDeviceWizard/steps/ApplicationInlineForm.d.ts +3 -2
  29. package/dist/src/components/Device/EditDeviceWizard/steps/ApplicationInlineForm.d.ts.map +1 -1
  30. package/dist/src/components/Device/EditDeviceWizard/steps/ApplicationInlineForm.js +13 -9
  31. package/dist/src/components/Device/EditDeviceWizard/steps/ApplicationInlineForm.js.map +1 -1
  32. package/dist/src/components/Device/EditDeviceWizard/steps/ApplicationTemplates.d.ts +3 -1
  33. package/dist/src/components/Device/EditDeviceWizard/steps/ApplicationTemplates.d.ts.map +1 -1
  34. package/dist/src/components/Device/EditDeviceWizard/steps/ApplicationTemplates.js +20 -17
  35. package/dist/src/components/Device/EditDeviceWizard/steps/ApplicationTemplates.js.map +1 -1
  36. package/dist/src/components/Device/EditDeviceWizard/steps/ConfigInlineTemplateForm.d.ts +2 -1
  37. package/dist/src/components/Device/EditDeviceWizard/steps/ConfigInlineTemplateForm.d.ts.map +1 -1
  38. package/dist/src/components/Device/EditDeviceWizard/steps/ConfigInlineTemplateForm.js +18 -14
  39. package/dist/src/components/Device/EditDeviceWizard/steps/ConfigInlineTemplateForm.js.map +1 -1
  40. package/dist/src/components/Device/EditDeviceWizard/steps/ConfigWithRepositoryTemplateForm.d.ts +2 -1
  41. package/dist/src/components/Device/EditDeviceWizard/steps/ConfigWithRepositoryTemplateForm.d.ts.map +1 -1
  42. package/dist/src/components/Device/EditDeviceWizard/steps/ConfigWithRepositoryTemplateForm.js +21 -14
  43. package/dist/src/components/Device/EditDeviceWizard/steps/ConfigWithRepositoryTemplateForm.js.map +1 -1
  44. package/dist/src/components/Device/EditDeviceWizard/steps/ConfigurationTemplates.d.ts +3 -1
  45. package/dist/src/components/Device/EditDeviceWizard/steps/ConfigurationTemplates.d.ts.map +1 -1
  46. package/dist/src/components/Device/EditDeviceWizard/steps/ConfigurationTemplates.js +34 -20
  47. package/dist/src/components/Device/EditDeviceWizard/steps/ConfigurationTemplates.js.map +1 -1
  48. package/dist/src/components/Device/EditDeviceWizard/steps/DeviceTemplateStep.d.ts +2 -1
  49. package/dist/src/components/Device/EditDeviceWizard/steps/DeviceTemplateStep.d.ts.map +1 -1
  50. package/dist/src/components/Device/EditDeviceWizard/steps/DeviceTemplateStep.js +14 -15
  51. package/dist/src/components/Device/EditDeviceWizard/steps/DeviceTemplateStep.js.map +1 -1
  52. package/dist/src/components/Device/EditDeviceWizard/steps/DeviceUpdateStep.d.ts +3 -1
  53. package/dist/src/components/Device/EditDeviceWizard/steps/DeviceUpdateStep.d.ts.map +1 -1
  54. package/dist/src/components/Device/EditDeviceWizard/steps/DeviceUpdateStep.js +6 -36
  55. package/dist/src/components/Device/EditDeviceWizard/steps/DeviceUpdateStep.js.map +1 -1
  56. package/dist/src/components/Device/EditDeviceWizard/steps/GeneralInfoStep.js +1 -1
  57. package/dist/src/components/Device/EditDeviceWizard/steps/GeneralInfoStep.js.map +1 -1
  58. package/dist/src/components/Device/EditDeviceWizard/steps/ReviewDeviceStep.js +1 -1
  59. package/dist/src/components/Device/EditDeviceWizard/steps/ReviewDeviceStep.js.map +1 -1
  60. package/dist/src/components/Device/EditDeviceWizard/steps/ReviewUpdatePolicy.js +2 -2
  61. package/dist/src/components/Device/EditDeviceWizard/steps/ReviewUpdatePolicy.js.map +1 -1
  62. package/dist/src/components/Device/EditDeviceWizard/steps/SystemdUnitsForm.d.ts +4 -2
  63. package/dist/src/components/Device/EditDeviceWizard/steps/SystemdUnitsForm.d.ts.map +1 -1
  64. package/dist/src/components/Device/EditDeviceWizard/steps/SystemdUnitsForm.js +19 -1
  65. package/dist/src/components/Device/EditDeviceWizard/steps/SystemdUnitsForm.js.map +1 -1
  66. package/dist/src/components/Device/EditDeviceWizard/utils.d.ts +1 -14
  67. package/dist/src/components/Device/EditDeviceWizard/utils.d.ts.map +1 -1
  68. package/dist/src/components/Device/EditDeviceWizard/utils.js +3 -3
  69. package/dist/src/components/Device/EditDeviceWizard/utils.js.map +1 -1
  70. package/dist/src/components/Device/SystemdUnitsModal/SystemdUnitsModal.d.ts.map +1 -1
  71. package/dist/src/components/Device/SystemdUnitsModal/SystemdUnitsModal.js +28 -26
  72. package/dist/src/components/Device/SystemdUnitsModal/SystemdUnitsModal.js.map +1 -1
  73. package/dist/src/components/EnrollmentRequest/EnrollmentRequestDetails/EnrollmentRequestDetails.d.ts.map +1 -1
  74. package/dist/src/components/EnrollmentRequest/EnrollmentRequestDetails/EnrollmentRequestDetails.js +11 -16
  75. package/dist/src/components/EnrollmentRequest/EnrollmentRequestDetails/EnrollmentRequestDetails.js.map +1 -1
  76. package/dist/src/components/Events/EventItem.d.ts +7 -0
  77. package/dist/src/components/Events/EventItem.d.ts.map +1 -0
  78. package/dist/src/components/Events/EventItem.js +25 -0
  79. package/dist/src/components/Events/EventItem.js.map +1 -0
  80. package/dist/src/components/Events/EventsCard.css +5 -0
  81. package/dist/src/components/Events/EventsCard.d.ts +11 -0
  82. package/dist/src/components/Events/EventsCard.d.ts.map +1 -0
  83. package/dist/src/components/Events/EventsCard.js +81 -0
  84. package/dist/src/components/Events/EventsCard.js.map +1 -0
  85. package/dist/src/components/Events/useEvents.d.ts +21 -0
  86. package/dist/src/components/Events/useEvents.d.ts.map +1 -0
  87. package/dist/src/components/Events/useEvents.js +105 -0
  88. package/dist/src/components/Events/useEvents.js.map +1 -0
  89. package/dist/src/components/Fleet/CreateFleet/CreateFleetWizard.d.ts.map +1 -1
  90. package/dist/src/components/Fleet/CreateFleet/CreateFleetWizard.js +27 -9
  91. package/dist/src/components/Fleet/CreateFleet/CreateFleetWizard.js.map +1 -1
  92. package/dist/src/components/Fleet/CreateFleet/CreateFleetWizardFooter.d.ts +2 -1
  93. package/dist/src/components/Fleet/CreateFleet/CreateFleetWizardFooter.d.ts.map +1 -1
  94. package/dist/src/components/Fleet/CreateFleet/CreateFleetWizardFooter.js +13 -2
  95. package/dist/src/components/Fleet/CreateFleet/CreateFleetWizardFooter.js.map +1 -1
  96. package/dist/src/components/Fleet/CreateFleet/fleetSpecUtils.d.ts +3 -33
  97. package/dist/src/components/Fleet/CreateFleet/fleetSpecUtils.d.ts.map +1 -1
  98. package/dist/src/components/Fleet/CreateFleet/fleetSpecUtils.js +7 -21
  99. package/dist/src/components/Fleet/CreateFleet/fleetSpecUtils.js.map +1 -1
  100. package/dist/src/components/Fleet/CreateFleet/steps/DeviceLabelSelector.d.ts +4 -2
  101. package/dist/src/components/Fleet/CreateFleet/steps/DeviceLabelSelector.d.ts.map +1 -1
  102. package/dist/src/components/Fleet/CreateFleet/steps/DeviceLabelSelector.js +10 -1
  103. package/dist/src/components/Fleet/CreateFleet/steps/DeviceLabelSelector.js.map +1 -1
  104. package/dist/src/components/Fleet/CreateFleet/steps/GeneralInfoStep.d.ts +5 -3
  105. package/dist/src/components/Fleet/CreateFleet/steps/GeneralInfoStep.d.ts.map +1 -1
  106. package/dist/src/components/Fleet/CreateFleet/steps/GeneralInfoStep.js +4 -4
  107. package/dist/src/components/Fleet/CreateFleet/steps/GeneralInfoStep.js.map +1 -1
  108. package/dist/src/components/Fleet/CreateFleet/steps/ReviewStep.d.ts.map +1 -1
  109. package/dist/src/components/Fleet/CreateFleet/steps/ReviewStep.js +10 -9
  110. package/dist/src/components/Fleet/CreateFleet/steps/ReviewStep.js.map +1 -1
  111. package/dist/src/components/Fleet/CreateFleet/steps/UpdatePolicyStep.d.ts +3 -1
  112. package/dist/src/components/Fleet/CreateFleet/steps/UpdatePolicyStep.d.ts.map +1 -1
  113. package/dist/src/components/Fleet/CreateFleet/steps/UpdatePolicyStep.js +8 -86
  114. package/dist/src/components/Fleet/CreateFleet/steps/UpdatePolicyStep.js.map +1 -1
  115. package/dist/src/components/Fleet/CreateFleet/steps/UpdateStepDisruptionBudget.d.ts +3 -1
  116. package/dist/src/components/Fleet/CreateFleet/steps/UpdateStepDisruptionBudget.d.ts.map +1 -1
  117. package/dist/src/components/Fleet/CreateFleet/steps/UpdateStepDisruptionBudget.js +4 -4
  118. package/dist/src/components/Fleet/CreateFleet/steps/UpdateStepDisruptionBudget.js.map +1 -1
  119. package/dist/src/components/Fleet/CreateFleet/steps/UpdateStepRolloutPolicy.d.ts +3 -1
  120. package/dist/src/components/Fleet/CreateFleet/steps/UpdateStepRolloutPolicy.d.ts.map +1 -1
  121. package/dist/src/components/Fleet/CreateFleet/steps/UpdateStepRolloutPolicy.js +16 -13
  122. package/dist/src/components/Fleet/CreateFleet/steps/UpdateStepRolloutPolicy.js.map +1 -1
  123. package/dist/src/components/Fleet/CreateFleet/steps/UpdateStepUpdatePolicy.d.ts +3 -1
  124. package/dist/src/components/Fleet/CreateFleet/steps/UpdateStepUpdatePolicy.d.ts.map +1 -1
  125. package/dist/src/components/Fleet/CreateFleet/steps/UpdateStepUpdatePolicy.js +20 -20
  126. package/dist/src/components/Fleet/CreateFleet/steps/UpdateStepUpdatePolicy.js.map +1 -1
  127. package/dist/src/components/Fleet/CreateFleet/utils.d.ts +1 -1
  128. package/dist/src/components/Fleet/CreateFleet/utils.d.ts.map +1 -1
  129. package/dist/src/components/Fleet/CreateFleet/utils.js +37 -23
  130. package/dist/src/components/Fleet/CreateFleet/utils.js.map +1 -1
  131. package/dist/src/components/Fleet/DeleteFleetModal/DeleteFleetModal.d.ts.map +1 -1
  132. package/dist/src/components/Fleet/DeleteFleetModal/DeleteFleetModal.js +20 -16
  133. package/dist/src/components/Fleet/DeleteFleetModal/DeleteFleetModal.js.map +1 -1
  134. package/dist/src/components/Fleet/FleetDetails/FleetDetailsContent.d.ts.map +1 -1
  135. package/dist/src/components/Fleet/FleetDetails/FleetDetailsContent.js +8 -5
  136. package/dist/src/components/Fleet/FleetDetails/FleetDetailsContent.js.map +1 -1
  137. package/dist/src/components/Fleet/FleetDetails/{FleetDetails.d.ts → FleetDetailsPage.d.ts} +1 -1
  138. package/dist/src/components/Fleet/FleetDetails/FleetDetailsPage.d.ts.map +1 -0
  139. package/dist/src/components/Fleet/FleetDetails/{FleetDetails.js → FleetDetailsPage.js} +23 -17
  140. package/dist/src/components/Fleet/FleetDetails/FleetDetailsPage.js.map +1 -0
  141. package/dist/src/components/Fleet/FleetRow.d.ts.map +1 -1
  142. package/dist/src/components/Fleet/FleetRow.js +9 -12
  143. package/dist/src/components/Fleet/FleetRow.js.map +1 -1
  144. package/dist/src/components/Masthead/UserPreferencesModal.d.ts.map +1 -1
  145. package/dist/src/components/Masthead/UserPreferencesModal.js +14 -15
  146. package/dist/src/components/Masthead/UserPreferencesModal.js.map +1 -1
  147. package/dist/src/components/Masthead/UserPreferencesProvider.d.ts +8 -5
  148. package/dist/src/components/Masthead/UserPreferencesProvider.d.ts.map +1 -1
  149. package/dist/src/components/Masthead/UserPreferencesProvider.js +7 -5
  150. package/dist/src/components/Masthead/UserPreferencesProvider.js.map +1 -1
  151. package/dist/src/components/Repository/CreateRepository/CreateRepositoryForm.d.ts.map +1 -1
  152. package/dist/src/components/Repository/CreateRepository/CreateRepositoryForm.js +11 -7
  153. package/dist/src/components/Repository/CreateRepository/CreateRepositoryForm.js.map +1 -1
  154. package/dist/src/components/Repository/CreateRepository/utils.d.ts.map +1 -1
  155. package/dist/src/components/Repository/CreateRepository/utils.js +2 -3
  156. package/dist/src/components/Repository/CreateRepository/utils.js.map +1 -1
  157. package/dist/src/components/Repository/RepositoryDetails/DeleteRepositoryModal.d.ts.map +1 -1
  158. package/dist/src/components/Repository/RepositoryDetails/DeleteRepositoryModal.js +25 -24
  159. package/dist/src/components/Repository/RepositoryDetails/DeleteRepositoryModal.js.map +1 -1
  160. package/dist/src/components/Repository/RepositoryDetails/RepositoryDetails.d.ts.map +1 -1
  161. package/dist/src/components/Repository/RepositoryDetails/RepositoryDetails.js +22 -8
  162. package/dist/src/components/Repository/RepositoryDetails/RepositoryDetails.js.map +1 -1
  163. package/dist/src/components/ResourceSync/RepositoryResourceSyncList.d.ts.map +1 -1
  164. package/dist/src/components/ResourceSync/RepositoryResourceSyncList.js +18 -15
  165. package/dist/src/components/ResourceSync/RepositoryResourceSyncList.js.map +1 -1
  166. package/dist/src/components/common/CodeEditor/CodeEditorTheme.d.ts +5 -0
  167. package/dist/src/components/common/CodeEditor/CodeEditorTheme.d.ts.map +1 -0
  168. package/dist/src/components/common/CodeEditor/CodeEditorTheme.js +52 -0
  169. package/dist/src/components/common/CodeEditor/CodeEditorTheme.js.map +1 -0
  170. package/dist/src/components/common/CodeEditor/Shortcut.css +22 -0
  171. package/dist/src/components/common/CodeEditor/Shortcut.d.ts +20 -0
  172. package/dist/src/components/common/CodeEditor/Shortcut.d.ts.map +1 -0
  173. package/dist/src/components/common/CodeEditor/Shortcut.js +46 -0
  174. package/dist/src/components/common/CodeEditor/Shortcut.js.map +1 -0
  175. package/dist/src/components/common/CodeEditor/YamlEditor.css +12 -0
  176. package/dist/src/components/common/CodeEditor/YamlEditor.d.ts +16 -0
  177. package/dist/src/components/common/CodeEditor/YamlEditor.d.ts.map +1 -0
  178. package/dist/src/components/common/CodeEditor/YamlEditor.js +48 -0
  179. package/dist/src/components/common/CodeEditor/YamlEditor.js.map +1 -0
  180. package/dist/src/components/common/CodeEditor/YamlEditorBase.css +3 -0
  181. package/dist/src/components/common/CodeEditor/YamlEditorBase.d.ts +11 -0
  182. package/dist/src/components/common/CodeEditor/YamlEditorBase.d.ts.map +1 -0
  183. package/dist/src/components/common/CodeEditor/YamlEditorBase.js +75 -0
  184. package/dist/src/components/common/CodeEditor/YamlEditorBase.js.map +1 -0
  185. package/dist/src/components/common/CodeEditor/useShortcutPopover.d.ts +3 -0
  186. package/dist/src/components/common/CodeEditor/useShortcutPopover.d.ts.map +1 -0
  187. package/dist/src/components/common/CodeEditor/useShortcutPopover.js +26 -0
  188. package/dist/src/components/common/CodeEditor/useShortcutPopover.js.map +1 -0
  189. package/dist/src/components/common/LabelsView.d.ts +1 -3
  190. package/dist/src/components/common/LabelsView.d.ts.map +1 -1
  191. package/dist/src/components/common/LabelsView.js +2 -4
  192. package/dist/src/components/common/LabelsView.js.map +1 -1
  193. package/dist/src/components/common/LeaveFormConfirmation.d.ts.map +1 -1
  194. package/dist/src/components/common/LeaveFormConfirmation.js +8 -7
  195. package/dist/src/components/common/LeaveFormConfirmation.js.map +1 -1
  196. package/dist/src/components/common/TechPreviewBadge.d.ts.map +1 -1
  197. package/dist/src/components/common/TechPreviewBadge.js +3 -2
  198. package/dist/src/components/common/TechPreviewBadge.js.map +1 -1
  199. package/dist/src/components/form/FlightCtlActionGroup.d.ts +1 -1
  200. package/dist/src/components/form/FlightCtlActionGroup.d.ts.map +1 -1
  201. package/dist/src/components/form/FlightCtlActionGroup.js.map +1 -1
  202. package/dist/src/components/form/FormSelect.d.ts +4 -2
  203. package/dist/src/components/form/FormSelect.d.ts.map +1 -1
  204. package/dist/src/components/form/FormSelect.js +12 -1
  205. package/dist/src/components/form/FormSelect.js.map +1 -1
  206. package/dist/src/components/form/FormSelectTypeahead.d.ts +4 -3
  207. package/dist/src/components/form/FormSelectTypeahead.d.ts.map +1 -1
  208. package/dist/src/components/form/FormSelectTypeahead.js +18 -1
  209. package/dist/src/components/form/FormSelectTypeahead.js.map +1 -1
  210. package/dist/src/components/form/LabelsField.d.ts +4 -3
  211. package/dist/src/components/form/LabelsField.d.ts.map +1 -1
  212. package/dist/src/components/form/LabelsField.js +15 -5
  213. package/dist/src/components/form/LabelsField.js.map +1 -1
  214. package/dist/src/components/form/NameField.d.ts +2 -2
  215. package/dist/src/components/form/NameField.d.ts.map +1 -1
  216. package/dist/src/components/form/NameField.js +14 -4
  217. package/dist/src/components/form/NameField.js.map +1 -1
  218. package/dist/src/components/form/RichValidationTextField.d.ts +2 -2
  219. package/dist/src/components/form/RichValidationTextField.d.ts.map +1 -1
  220. package/dist/src/components/form/RichValidationTextField.js +13 -1
  221. package/dist/src/components/form/RichValidationTextField.js.map +1 -1
  222. package/dist/src/components/form/TextListField.d.ts +4 -2
  223. package/dist/src/components/form/TextListField.d.ts.map +1 -1
  224. package/dist/src/components/form/TextListField.js +13 -3
  225. package/dist/src/components/form/TextListField.js.map +1 -1
  226. package/dist/src/components/form/UploadField.d.ts +3 -2
  227. package/dist/src/components/form/UploadField.d.ts.map +1 -1
  228. package/dist/src/components/form/UploadField.js +10 -1
  229. package/dist/src/components/form/UploadField.js.map +1 -1
  230. package/dist/src/components/form/validations.js +1 -1
  231. package/dist/src/components/form/validations.js.map +1 -1
  232. package/dist/src/components/modals/ApproveDeviceModal/ApproveDeviceModal.d.ts.map +1 -1
  233. package/dist/src/components/modals/ApproveDeviceModal/ApproveDeviceModal.js +4 -1
  234. package/dist/src/components/modals/ApproveDeviceModal/ApproveDeviceModal.js.map +1 -1
  235. package/dist/src/components/modals/CreateRepositoryModal/CreateRepositoryModal.d.ts.map +1 -1
  236. package/dist/src/components/modals/CreateRepositoryModal/CreateRepositoryModal.js +5 -3
  237. package/dist/src/components/modals/CreateRepositoryModal/CreateRepositoryModal.js.map +1 -1
  238. package/dist/src/components/modals/DecommissionModal/DecommissionModal.d.ts.map +1 -1
  239. package/dist/src/components/modals/DecommissionModal/DecommissionModal.js +32 -29
  240. package/dist/src/components/modals/DecommissionModal/DecommissionModal.js.map +1 -1
  241. package/dist/src/components/modals/DeleteModal/DeleteModal.d.ts.map +1 -1
  242. package/dist/src/components/modals/DeleteModal/DeleteModal.js +18 -15
  243. package/dist/src/components/modals/DeleteModal/DeleteModal.js.map +1 -1
  244. package/dist/src/components/modals/massModals/MassApproveDeviceModal/MassApproveDeviceModal.d.ts.map +1 -1
  245. package/dist/src/components/modals/massModals/MassApproveDeviceModal/MassApproveDeviceModal.js +33 -30
  246. package/dist/src/components/modals/massModals/MassApproveDeviceModal/MassApproveDeviceModal.js.map +1 -1
  247. package/dist/src/components/modals/massModals/MassDecommissionDeviceModal/MassDecommissionDeviceModal.d.ts.map +1 -1
  248. package/dist/src/components/modals/massModals/MassDecommissionDeviceModal/MassDecommissionDeviceModal.js +27 -24
  249. package/dist/src/components/modals/massModals/MassDecommissionDeviceModal/MassDecommissionDeviceModal.js.map +1 -1
  250. package/dist/src/components/modals/massModals/MassDeleteDeviceModal/MassDeleteDeviceModal.d.ts.map +1 -1
  251. package/dist/src/components/modals/massModals/MassDeleteDeviceModal/MassDeleteDeviceModal.js +26 -23
  252. package/dist/src/components/modals/massModals/MassDeleteDeviceModal/MassDeleteDeviceModal.js.map +1 -1
  253. package/dist/src/components/modals/massModals/MassDeleteFleetModal/MassDeleteFleetModal.d.ts.map +1 -1
  254. package/dist/src/components/modals/massModals/MassDeleteFleetModal/MassDeleteFleetModal.js +30 -25
  255. package/dist/src/components/modals/massModals/MassDeleteFleetModal/MassDeleteFleetModal.js.map +1 -1
  256. package/dist/src/components/modals/massModals/MassDeleteRepositoryModal/MassDeleteRepositoryModal.d.ts.map +1 -1
  257. package/dist/src/components/modals/massModals/MassDeleteRepositoryModal/MassDeleteRepositoryModal.js +29 -26
  258. package/dist/src/components/modals/massModals/MassDeleteRepositoryModal/MassDeleteRepositoryModal.js.map +1 -1
  259. package/dist/src/components/modals/massModals/MassDeleteResourceSyncModal/MassDeleteResourceSyncModal.d.ts +1 -1
  260. package/dist/src/components/modals/massModals/MassDeleteResourceSyncModal/MassDeleteResourceSyncModal.d.ts.map +1 -1
  261. package/dist/src/components/modals/massModals/MassDeleteResourceSyncModal/MassDeleteResourceSyncModal.js +28 -25
  262. package/dist/src/components/modals/massModals/MassDeleteResourceSyncModal/MassDeleteResourceSyncModal.js.map +1 -1
  263. package/dist/src/constants.d.ts +2 -1
  264. package/dist/src/constants.d.ts.map +1 -1
  265. package/dist/src/constants.js +3 -1
  266. package/dist/src/constants.js.map +1 -1
  267. package/dist/src/hooks/useAppLinks.d.ts +5 -0
  268. package/dist/src/hooks/useAppLinks.d.ts.map +1 -0
  269. package/dist/src/hooks/useAppLinks.js +45 -0
  270. package/dist/src/hooks/useAppLinks.js.map +1 -0
  271. package/dist/src/{components/EnrollmentRequest/EnrollmentRequestDetails/useEnrollmentRequestSystemInfo.d.ts → hooks/useDeviceSpecSystemInfo.d.ts} +2 -2
  272. package/dist/src/hooks/useDeviceSpecSystemInfo.d.ts.map +1 -0
  273. package/dist/src/{components/EnrollmentRequest/EnrollmentRequestDetails/useEnrollmentRequestSystemInfo.js → hooks/useDeviceSpecSystemInfo.js} +18 -10
  274. package/dist/src/hooks/useDeviceSpecSystemInfo.js.map +1 -0
  275. package/dist/src/hooks/useFetchPeriodically.d.ts +2 -2
  276. package/dist/src/hooks/useFetchPeriodically.d.ts.map +1 -1
  277. package/dist/src/hooks/useFetchPeriodically.js +1 -1
  278. package/dist/src/hooks/useFetchPeriodically.js.map +1 -1
  279. package/dist/src/hooks/useThemePreferences.d.ts +6 -3
  280. package/dist/src/hooks/useThemePreferences.d.ts.map +1 -1
  281. package/dist/src/hooks/useThemePreferences.js +46 -23
  282. package/dist/src/hooks/useThemePreferences.js.map +1 -1
  283. package/dist/src/types/deviceSpec.d.ts +7 -1
  284. package/dist/src/types/deviceSpec.d.ts.map +1 -1
  285. package/dist/src/types/deviceSpec.js +16 -12
  286. package/dist/src/types/deviceSpec.js.map +1 -1
  287. package/dist/src/types/extraTypes.d.ts +3 -2
  288. package/dist/src/types/extraTypes.d.ts.map +1 -1
  289. package/dist/src/types/extraTypes.js.map +1 -1
  290. package/dist/src/utils/dates.d.ts +2 -1
  291. package/dist/src/utils/dates.d.ts.map +1 -1
  292. package/dist/src/utils/dates.js +20 -20
  293. package/dist/src/utils/dates.js.map +1 -1
  294. package/dist/src/utils/patch.d.ts.map +1 -1
  295. package/dist/src/utils/patch.js +2 -1
  296. package/dist/src/utils/patch.js.map +1 -1
  297. package/package.json +6 -2
  298. package/src/components/DetailsPage/DetailsPageActions.tsx +2 -1
  299. package/src/components/Device/AddDeviceModal/AddDeviceModal.tsx +27 -22
  300. package/src/components/Device/DeviceDetails/DeviceDetailsPage.tsx +10 -19
  301. package/src/components/Device/DeviceDetails/DeviceDetailsTab.tsx +65 -21
  302. package/src/components/Device/DevicesPage/DecommissionedDevicesTable.tsx +2 -2
  303. package/src/components/Device/DevicesPage/EnrolledDevicesTable.tsx +2 -2
  304. package/src/components/Device/EditDeviceWizard/EditDeviceWizard.tsx +6 -1
  305. package/src/components/Device/EditDeviceWizard/deviceSpecUtils.ts +28 -1
  306. package/src/components/Device/EditDeviceWizard/steps/ApplicationImageForm.tsx +19 -5
  307. package/src/components/Device/EditDeviceWizard/steps/ApplicationInlineForm.tsx +53 -23
  308. package/src/components/Device/EditDeviceWizard/steps/ApplicationTemplates.tsx +68 -53
  309. package/src/components/Device/EditDeviceWizard/steps/ConfigInlineTemplateForm.tsx +40 -25
  310. package/src/components/Device/EditDeviceWizard/steps/ConfigWithRepositoryTemplateForm.tsx +39 -5
  311. package/src/components/Device/EditDeviceWizard/steps/ConfigurationTemplates.tsx +81 -38
  312. package/src/components/Device/EditDeviceWizard/steps/DeviceTemplateStep.tsx +15 -19
  313. package/src/components/Device/EditDeviceWizard/steps/DeviceUpdateStep.tsx +7 -47
  314. package/src/components/Device/EditDeviceWizard/steps/GeneralInfoStep.tsx +1 -1
  315. package/src/components/Device/EditDeviceWizard/steps/ReviewDeviceStep.tsx +1 -1
  316. package/src/components/Device/EditDeviceWizard/steps/ReviewUpdatePolicy.tsx +2 -2
  317. package/src/components/Device/EditDeviceWizard/steps/SystemdUnitsForm.tsx +30 -2
  318. package/src/components/Device/EditDeviceWizard/utils.ts +6 -7
  319. package/src/components/Device/SystemdUnitsModal/SystemdUnitsModal.tsx +38 -35
  320. package/src/components/EnrollmentRequest/EnrollmentRequestDetails/EnrollmentRequestDetails.tsx +8 -19
  321. package/src/components/Events/EventItem.tsx +38 -0
  322. package/src/components/Events/EventsCard.css +5 -0
  323. package/src/components/Events/EventsCard.tsx +157 -0
  324. package/src/components/Events/useEvents.ts +136 -0
  325. package/src/components/Fleet/CreateFleet/CreateFleetWizard.tsx +29 -13
  326. package/src/components/Fleet/CreateFleet/CreateFleetWizardFooter.tsx +25 -10
  327. package/src/components/Fleet/CreateFleet/fleetSpecUtils.ts +9 -23
  328. package/src/components/Fleet/CreateFleet/steps/DeviceLabelSelector.tsx +12 -1
  329. package/src/components/Fleet/CreateFleet/steps/GeneralInfoStep.tsx +10 -5
  330. package/src/components/Fleet/CreateFleet/steps/ReviewStep.tsx +20 -17
  331. package/src/components/Fleet/CreateFleet/steps/UpdatePolicyStep.tsx +18 -122
  332. package/src/components/Fleet/CreateFleet/steps/UpdateStepDisruptionBudget.tsx +4 -1
  333. package/src/components/Fleet/CreateFleet/steps/UpdateStepRolloutPolicy.tsx +50 -31
  334. package/src/components/Fleet/CreateFleet/steps/UpdateStepUpdatePolicy.tsx +57 -12
  335. package/src/components/Fleet/CreateFleet/utils.ts +40 -22
  336. package/src/components/Fleet/DeleteFleetModal/DeleteFleetModal.tsx +28 -28
  337. package/src/components/Fleet/FleetDetails/FleetDetailsContent.tsx +10 -9
  338. package/src/components/Fleet/FleetDetails/{FleetDetails.tsx → FleetDetailsPage.tsx} +40 -25
  339. package/src/components/Fleet/FleetRow.tsx +10 -11
  340. package/src/components/Masthead/UserPreferencesModal.tsx +43 -56
  341. package/src/components/Masthead/UserPreferencesProvider.tsx +15 -10
  342. package/src/components/Repository/CreateRepository/CreateRepositoryForm.tsx +14 -15
  343. package/src/components/Repository/CreateRepository/utils.ts +2 -3
  344. package/src/components/Repository/RepositoryDetails/DeleteRepositoryModal.tsx +54 -55
  345. package/src/components/Repository/RepositoryDetails/RepositoryDetails.tsx +47 -14
  346. package/src/components/ResourceSync/RepositoryResourceSyncList.tsx +28 -25
  347. package/src/components/common/CodeEditor/CodeEditorTheme.ts +53 -0
  348. package/src/components/common/CodeEditor/Shortcut.css +22 -0
  349. package/src/components/common/CodeEditor/Shortcut.tsx +90 -0
  350. package/src/components/common/CodeEditor/YamlEditor.css +12 -0
  351. package/src/components/common/CodeEditor/YamlEditor.tsx +81 -0
  352. package/src/components/common/CodeEditor/YamlEditorBase.css +3 -0
  353. package/src/components/common/CodeEditor/YamlEditorBase.tsx +124 -0
  354. package/src/components/common/CodeEditor/useShortcutPopover.tsx +39 -0
  355. package/src/components/common/LabelsView.tsx +2 -11
  356. package/src/components/common/LeaveFormConfirmation.tsx +14 -18
  357. package/src/components/common/TechPreviewBadge.tsx +3 -1
  358. package/src/components/form/FlightCtlActionGroup.tsx +1 -1
  359. package/src/components/form/FormSelect.tsx +14 -3
  360. package/src/components/form/FormSelectTypeahead.tsx +24 -3
  361. package/src/components/form/LabelsField.tsx +20 -20
  362. package/src/components/form/NameField.tsx +18 -4
  363. package/src/components/form/RichValidationTextField.tsx +20 -1
  364. package/src/components/form/TextListField.tsx +19 -3
  365. package/src/components/form/UploadField.tsx +16 -2
  366. package/src/components/form/validations.ts +1 -1
  367. package/src/components/modals/ApproveDeviceModal/ApproveDeviceModal.tsx +12 -7
  368. package/src/components/modals/CreateRepositoryModal/CreateRepositoryModal.tsx +6 -3
  369. package/src/components/modals/DecommissionModal/DecommissionModal.tsx +60 -56
  370. package/src/components/modals/DeleteModal/DeleteModal.tsx +25 -27
  371. package/src/components/modals/massModals/MassApproveDeviceModal/MassApproveDeviceModal.tsx +81 -92
  372. package/src/components/modals/massModals/MassDecommissionDeviceModal/MassDecommissionDeviceModal.tsx +64 -67
  373. package/src/components/modals/massModals/MassDeleteDeviceModal/MassDeleteDeviceModal.tsx +60 -62
  374. package/src/components/modals/massModals/MassDeleteFleetModal/MassDeleteFleetModal.tsx +80 -87
  375. package/src/components/modals/massModals/MassDeleteRepositoryModal/MassDeleteRepositoryModal.tsx +70 -73
  376. package/src/components/modals/massModals/MassDeleteResourceSyncModal/MassDeleteResourceSyncModal.tsx +62 -63
  377. package/src/constants.ts +2 -1
  378. package/src/hooks/useAppLinks.ts +49 -0
  379. package/src/{components/EnrollmentRequest/EnrollmentRequestDetails/useEnrollmentRequestSystemInfo.tsx → hooks/useDeviceSpecSystemInfo.tsx} +15 -7
  380. package/src/hooks/useFetchPeriodically.ts +3 -3
  381. package/src/hooks/useThemePreferences.ts +48 -21
  382. package/src/types/deviceSpec.ts +25 -12
  383. package/src/types/extraTypes.ts +7 -4
  384. package/src/utils/dates.ts +23 -24
  385. package/src/utils/patch.ts +3 -1
  386. package/dist/src/components/Device/DeviceDetails/DeviceStatusDebugModal.css +0 -3
  387. package/dist/src/components/Device/DeviceDetails/DeviceStatusDebugModal.d.ts +0 -9
  388. package/dist/src/components/Device/DeviceDetails/DeviceStatusDebugModal.d.ts.map +0 -1
  389. package/dist/src/components/Device/DeviceDetails/DeviceStatusDebugModal.js +0 -34
  390. package/dist/src/components/Device/DeviceDetails/DeviceStatusDebugModal.js.map +0 -1
  391. package/dist/src/components/EnrollmentRequest/EnrollmentRequestDetails/useEnrollmentRequestSystemInfo.d.ts.map +0 -1
  392. package/dist/src/components/EnrollmentRequest/EnrollmentRequestDetails/useEnrollmentRequestSystemInfo.js.map +0 -1
  393. package/dist/src/components/Fleet/CreateFleet/steps/UpdateConfirmChangesModal.d.ts +0 -9
  394. package/dist/src/components/Fleet/CreateFleet/steps/UpdateConfirmChangesModal.d.ts.map +0 -1
  395. package/dist/src/components/Fleet/CreateFleet/steps/UpdateConfirmChangesModal.js +0 -61
  396. package/dist/src/components/Fleet/CreateFleet/steps/UpdateConfirmChangesModal.js.map +0 -1
  397. package/dist/src/components/Fleet/FleetDetails/FleetDetails.d.ts.map +0 -1
  398. package/dist/src/components/Fleet/FleetDetails/FleetDetails.js.map +0 -1
  399. package/dist/src/components/common/LabelsView.css +0 -9
  400. package/dist/src/links.d.ts +0 -7
  401. package/dist/src/links.d.ts.map +0 -1
  402. package/dist/src/links.js +0 -14
  403. package/dist/src/links.js.map +0 -1
  404. package/src/components/Device/DeviceDetails/DeviceStatusDebugModal.css +0 -3
  405. package/src/components/Device/DeviceDetails/DeviceStatusDebugModal.tsx +0 -60
  406. package/src/components/Fleet/CreateFleet/steps/UpdateConfirmChangesModal.tsx +0 -96
  407. package/src/components/common/LabelsView.css +0 -9
  408. package/src/links.ts +0 -16
@@ -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, refetch] = useFetchPeriodically<EnrollmentRequest>({
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 = useEnrollmentRequestSystemInfo(er?.spec.deviceStatus?.systemInfo, t);
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={er?.metadata.name as string}
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>{er?.metadata.name || '-'}</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={(updateList) => {
213
+ onClose={(isApproved) => {
225
214
  setIsApprovalModalOpen(false);
226
- updateList && refetch();
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,5 @@
1
+ .fctl-events-container {
2
+ /* Make space for the EmptyState content */
3
+ min-height: 300px;
4
+ overflow-y: auto;
5
+ }
@@ -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
- let body;
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) && <GeneralInfoStep isEdit={isEdit} />}
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={isEdit ? t('Review and save') : t('Review and create')}
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
- const title = isEdit ? t('Edit fleet') : t('Create fleet');
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
- const primaryBtn = isReviewStep ? (
43
- <Button variant="primary" onClick={submitForm} isDisabled={isSubmitting} isLoading={isSubmitting}>
44
- {isEdit ? t('Save') : t('Create fleet')}
45
- </Button>
46
- ) : (
47
- <Button variant="primary" onClick={onMoveNext} isDisabled={!isStepValid} ref={buttonRef}>
48
- {t('Next')}
49
- </Button>
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>
@@ -1,6 +1,6 @@
1
1
  import { type DeviceUpdatePolicySpec, FleetSpec, Percentage } from '@flightctl/types';
2
2
 
3
- import { BatchLimitType, UpdatePolicyForm } from './../../../types/deviceSpec';
3
+ import { BatchForm, BatchLimitType, RolloutPolicyForm, UpdatePolicyForm } from './../../../types/deviceSpec';
4
4
  import { fromAPILabel } from '../../../utils/labels';
5
5
  import * as timeUtils from '../../../utils/time';
6
6
  import { schedulesAreEqual } from '../../../utils/patch';
@@ -15,32 +15,14 @@ const numberValue = (value: Percentage | number | undefined) => {
15
15
  return Number(value.replace(/[%]/, ''));
16
16
  };
17
17
 
18
- export const getEmptyInitializedBatch = () => ({
19
- limit: '',
18
+ export const getEmptyInitializedBatch = (): BatchForm => ({
19
+ limit: undefined,
20
20
  limitType: BatchLimitType.BatchLimitPercent,
21
21
  successThreshold: numberValue(DEFAULT_BACKEND_SUCCESS_THRESHOLD_PERCENTAGE),
22
22
  selector: [],
23
23
  });
24
24
 
25
- export const getEmptyUpdateFormParams = () => ({
26
- isEditable: true,
27
- isAdvanced: false,
28
- downloadAndInstallDiffer: false,
29
- // Download schedule
30
- downloadStartsAt: timeUtils.defaultStartTime,
31
- downloadEndsAt: timeUtils.defaultEndTime,
32
- downloadScheduleMode: timeUtils.UpdateScheduleMode.Daily,
33
- downloadWeekDays: [false, false, false, false, false, false, false],
34
- downloadTimeZone: timeUtils.localDeviceTimezone,
35
- // Install schedule (updateSchedule in the API)
36
- installStartsAt: timeUtils.defaultStartTime,
37
- installEndsAt: timeUtils.defaultEndTime,
38
- installScheduleMode: timeUtils.UpdateScheduleMode.Daily,
39
- installWeekDays: [false, false, false, false, false, false, false],
40
- installTimeZone: timeUtils.localDeviceTimezone,
41
- });
42
-
43
- export const getRolloutPolicyValues = (fleetSpec?: FleetSpec) => {
25
+ export const getRolloutPolicyValues = (fleetSpec?: FleetSpec): RolloutPolicyForm => {
44
26
  const batches = (fleetSpec?.rolloutPolicy?.deviceSelection?.sequence || []).map((batch) => ({
45
27
  selector: fromAPILabel(batch.selector?.matchLabels || {}),
46
28
  limit: numberValue(batch.limit),
@@ -52,7 +34,11 @@ export const getRolloutPolicyValues = (fleetSpec?: FleetSpec) => {
52
34
 
53
35
  // If the policy does not specify the timeout, we set the backend's default as the field is required in the UI
54
36
  const updateTimeout = fleetSpec?.rolloutPolicy?.defaultUpdateTimeout || `${DEFAULT_BACKEND_UPDATE_TIMEOUT_MINUTES}m`;
55
- return { isAdvanced: batches.length > 0, batches, updateTimeout: timeUtils.durationToMinutes(updateTimeout) };
37
+ return {
38
+ isAdvanced: batches.length > 0,
39
+ batches: batches.length ? batches : [getEmptyInitializedBatch()],
40
+ updateTimeout: timeUtils.durationToMinutes(updateTimeout),
41
+ };
56
42
  };
57
43
 
58
44
  export const getDisruptionBudgetValues = (fleetSpec?: FleetSpec) => {
@@ -13,6 +13,8 @@ import { FlightCtlLabel } from '../../../../types/extraTypes';
13
13
  import { getApiListCount } from '../../../../utils/api';
14
14
  import { getErrorMessage } from '../../../../utils/error';
15
15
  import { commonQueries } from '../../../../utils/query';
16
+ import LabelsView from '../../../common/LabelsView';
17
+ import { toAPILabel } from '../../../../utils/labels';
16
18
 
17
19
  const validateLabels = (labels: FlightCtlLabel[]) =>
18
20
  hasUniqueLabelKeys(labels) && getInvalidKubernetesLabels(labels).length === 0;
@@ -108,4 +110,13 @@ const DeviceLabelSelector = () => {
108
110
  );
109
111
  };
110
112
 
111
- export default DeviceLabelSelector;
113
+ const DeviceLabelSelectorWrapper = ({ isReadOnly }: { isReadOnly: boolean }) => {
114
+ const [{ value: labels }] = useField<FlightCtlLabel[]>('labels');
115
+
116
+ if (isReadOnly) {
117
+ return <LabelsView prefix="device-selector" labels={toAPILabel(labels)} />;
118
+ }
119
+ return <DeviceLabelSelector />;
120
+ };
121
+
122
+ export default DeviceLabelSelectorWrapper;