@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.
Files changed (410) 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 +30 -5
  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 +20 -15
  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 +2 -16
  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.d.ts +1 -2
  231. package/dist/src/components/form/validations.d.ts.map +1 -1
  232. package/dist/src/components/form/validations.js +1 -4
  233. package/dist/src/components/form/validations.js.map +1 -1
  234. package/dist/src/components/modals/ApproveDeviceModal/ApproveDeviceModal.d.ts.map +1 -1
  235. package/dist/src/components/modals/ApproveDeviceModal/ApproveDeviceModal.js +4 -1
  236. package/dist/src/components/modals/ApproveDeviceModal/ApproveDeviceModal.js.map +1 -1
  237. package/dist/src/components/modals/CreateRepositoryModal/CreateRepositoryModal.d.ts.map +1 -1
  238. package/dist/src/components/modals/CreateRepositoryModal/CreateRepositoryModal.js +5 -3
  239. package/dist/src/components/modals/CreateRepositoryModal/CreateRepositoryModal.js.map +1 -1
  240. package/dist/src/components/modals/DecommissionModal/DecommissionModal.d.ts.map +1 -1
  241. package/dist/src/components/modals/DecommissionModal/DecommissionModal.js +32 -29
  242. package/dist/src/components/modals/DecommissionModal/DecommissionModal.js.map +1 -1
  243. package/dist/src/components/modals/DeleteModal/DeleteModal.d.ts.map +1 -1
  244. package/dist/src/components/modals/DeleteModal/DeleteModal.js +18 -15
  245. package/dist/src/components/modals/DeleteModal/DeleteModal.js.map +1 -1
  246. package/dist/src/components/modals/massModals/MassApproveDeviceModal/MassApproveDeviceModal.d.ts.map +1 -1
  247. package/dist/src/components/modals/massModals/MassApproveDeviceModal/MassApproveDeviceModal.js +33 -30
  248. package/dist/src/components/modals/massModals/MassApproveDeviceModal/MassApproveDeviceModal.js.map +1 -1
  249. package/dist/src/components/modals/massModals/MassDecommissionDeviceModal/MassDecommissionDeviceModal.d.ts.map +1 -1
  250. package/dist/src/components/modals/massModals/MassDecommissionDeviceModal/MassDecommissionDeviceModal.js +27 -24
  251. package/dist/src/components/modals/massModals/MassDecommissionDeviceModal/MassDecommissionDeviceModal.js.map +1 -1
  252. package/dist/src/components/modals/massModals/MassDeleteDeviceModal/MassDeleteDeviceModal.d.ts.map +1 -1
  253. package/dist/src/components/modals/massModals/MassDeleteDeviceModal/MassDeleteDeviceModal.js +26 -23
  254. package/dist/src/components/modals/massModals/MassDeleteDeviceModal/MassDeleteDeviceModal.js.map +1 -1
  255. package/dist/src/components/modals/massModals/MassDeleteFleetModal/MassDeleteFleetModal.d.ts.map +1 -1
  256. package/dist/src/components/modals/massModals/MassDeleteFleetModal/MassDeleteFleetModal.js +30 -25
  257. package/dist/src/components/modals/massModals/MassDeleteFleetModal/MassDeleteFleetModal.js.map +1 -1
  258. package/dist/src/components/modals/massModals/MassDeleteRepositoryModal/MassDeleteRepositoryModal.d.ts.map +1 -1
  259. package/dist/src/components/modals/massModals/MassDeleteRepositoryModal/MassDeleteRepositoryModal.js +29 -26
  260. package/dist/src/components/modals/massModals/MassDeleteRepositoryModal/MassDeleteRepositoryModal.js.map +1 -1
  261. package/dist/src/components/modals/massModals/MassDeleteResourceSyncModal/MassDeleteResourceSyncModal.d.ts +1 -1
  262. package/dist/src/components/modals/massModals/MassDeleteResourceSyncModal/MassDeleteResourceSyncModal.d.ts.map +1 -1
  263. package/dist/src/components/modals/massModals/MassDeleteResourceSyncModal/MassDeleteResourceSyncModal.js +28 -25
  264. package/dist/src/components/modals/massModals/MassDeleteResourceSyncModal/MassDeleteResourceSyncModal.js.map +1 -1
  265. package/dist/src/constants.d.ts +2 -1
  266. package/dist/src/constants.d.ts.map +1 -1
  267. package/dist/src/constants.js +3 -1
  268. package/dist/src/constants.js.map +1 -1
  269. package/dist/src/hooks/useAppLinks.d.ts +5 -0
  270. package/dist/src/hooks/useAppLinks.d.ts.map +1 -0
  271. package/dist/src/hooks/useAppLinks.js +45 -0
  272. package/dist/src/hooks/useAppLinks.js.map +1 -0
  273. package/dist/src/{components/EnrollmentRequest/EnrollmentRequestDetails/useEnrollmentRequestSystemInfo.d.ts → hooks/useDeviceSpecSystemInfo.d.ts} +2 -2
  274. package/dist/src/hooks/useDeviceSpecSystemInfo.d.ts.map +1 -0
  275. package/dist/src/{components/EnrollmentRequest/EnrollmentRequestDetails/useEnrollmentRequestSystemInfo.js → hooks/useDeviceSpecSystemInfo.js} +18 -10
  276. package/dist/src/hooks/useDeviceSpecSystemInfo.js.map +1 -0
  277. package/dist/src/hooks/useFetchPeriodically.d.ts +2 -2
  278. package/dist/src/hooks/useFetchPeriodically.d.ts.map +1 -1
  279. package/dist/src/hooks/useFetchPeriodically.js +1 -1
  280. package/dist/src/hooks/useFetchPeriodically.js.map +1 -1
  281. package/dist/src/hooks/useThemePreferences.d.ts +6 -3
  282. package/dist/src/hooks/useThemePreferences.d.ts.map +1 -1
  283. package/dist/src/hooks/useThemePreferences.js +46 -23
  284. package/dist/src/hooks/useThemePreferences.js.map +1 -1
  285. package/dist/src/types/deviceSpec.d.ts +7 -2
  286. package/dist/src/types/deviceSpec.d.ts.map +1 -1
  287. package/dist/src/types/deviceSpec.js +16 -12
  288. package/dist/src/types/deviceSpec.js.map +1 -1
  289. package/dist/src/types/extraTypes.d.ts +3 -2
  290. package/dist/src/types/extraTypes.d.ts.map +1 -1
  291. package/dist/src/types/extraTypes.js.map +1 -1
  292. package/dist/src/utils/dates.d.ts +2 -1
  293. package/dist/src/utils/dates.d.ts.map +1 -1
  294. package/dist/src/utils/dates.js +20 -20
  295. package/dist/src/utils/dates.js.map +1 -1
  296. package/dist/src/utils/patch.d.ts.map +1 -1
  297. package/dist/src/utils/patch.js +2 -1
  298. package/dist/src/utils/patch.js.map +1 -1
  299. package/package.json +6 -2
  300. package/src/components/DetailsPage/DetailsPageActions.tsx +2 -1
  301. package/src/components/Device/AddDeviceModal/AddDeviceModal.tsx +27 -22
  302. package/src/components/Device/DeviceDetails/DeviceDetailsPage.tsx +10 -19
  303. package/src/components/Device/DeviceDetails/DeviceDetailsTab.tsx +65 -21
  304. package/src/components/Device/DevicesPage/DecommissionedDevicesTable.tsx +2 -2
  305. package/src/components/Device/DevicesPage/EnrolledDevicesTable.tsx +2 -2
  306. package/src/components/Device/EditDeviceWizard/EditDeviceWizard.tsx +6 -1
  307. package/src/components/Device/EditDeviceWizard/deviceSpecUtils.ts +29 -5
  308. package/src/components/Device/EditDeviceWizard/steps/ApplicationImageForm.tsx +19 -5
  309. package/src/components/Device/EditDeviceWizard/steps/ApplicationInlineForm.tsx +53 -23
  310. package/src/components/Device/EditDeviceWizard/steps/ApplicationTemplates.tsx +68 -53
  311. package/src/components/Device/EditDeviceWizard/steps/ConfigInlineTemplateForm.tsx +40 -25
  312. package/src/components/Device/EditDeviceWizard/steps/ConfigWithRepositoryTemplateForm.tsx +38 -17
  313. package/src/components/Device/EditDeviceWizard/steps/ConfigurationTemplates.tsx +81 -38
  314. package/src/components/Device/EditDeviceWizard/steps/DeviceTemplateStep.tsx +15 -19
  315. package/src/components/Device/EditDeviceWizard/steps/DeviceUpdateStep.tsx +7 -47
  316. package/src/components/Device/EditDeviceWizard/steps/GeneralInfoStep.tsx +1 -1
  317. package/src/components/Device/EditDeviceWizard/steps/ReviewDeviceStep.tsx +1 -1
  318. package/src/components/Device/EditDeviceWizard/steps/ReviewUpdatePolicy.tsx +2 -2
  319. package/src/components/Device/EditDeviceWizard/steps/SystemdUnitsForm.tsx +30 -2
  320. package/src/components/Device/EditDeviceWizard/utils.ts +6 -7
  321. package/src/components/Device/SystemdUnitsModal/SystemdUnitsModal.tsx +38 -35
  322. package/src/components/EnrollmentRequest/EnrollmentRequestDetails/EnrollmentRequestDetails.tsx +8 -19
  323. package/src/components/Events/EventItem.tsx +38 -0
  324. package/src/components/Events/EventsCard.css +5 -0
  325. package/src/components/Events/EventsCard.tsx +157 -0
  326. package/src/components/Events/useEvents.ts +136 -0
  327. package/src/components/Fleet/CreateFleet/CreateFleetWizard.tsx +29 -13
  328. package/src/components/Fleet/CreateFleet/CreateFleetWizardFooter.tsx +25 -10
  329. package/src/components/Fleet/CreateFleet/fleetSpecUtils.ts +9 -23
  330. package/src/components/Fleet/CreateFleet/steps/DeviceLabelSelector.tsx +12 -1
  331. package/src/components/Fleet/CreateFleet/steps/GeneralInfoStep.tsx +10 -5
  332. package/src/components/Fleet/CreateFleet/steps/ReviewStep.tsx +20 -17
  333. package/src/components/Fleet/CreateFleet/steps/UpdatePolicyStep.tsx +18 -122
  334. package/src/components/Fleet/CreateFleet/steps/UpdateStepDisruptionBudget.tsx +4 -1
  335. package/src/components/Fleet/CreateFleet/steps/UpdateStepRolloutPolicy.tsx +50 -31
  336. package/src/components/Fleet/CreateFleet/steps/UpdateStepUpdatePolicy.tsx +57 -12
  337. package/src/components/Fleet/CreateFleet/utils.ts +40 -22
  338. package/src/components/Fleet/DeleteFleetModal/DeleteFleetModal.tsx +28 -28
  339. package/src/components/Fleet/FleetDetails/FleetDetailsContent.tsx +10 -9
  340. package/src/components/Fleet/FleetDetails/{FleetDetails.tsx → FleetDetailsPage.tsx} +40 -25
  341. package/src/components/Fleet/FleetRow.tsx +10 -11
  342. package/src/components/Masthead/UserPreferencesModal.tsx +43 -56
  343. package/src/components/Masthead/UserPreferencesProvider.tsx +15 -10
  344. package/src/components/Repository/CreateRepository/CreateRepositoryForm.tsx +14 -15
  345. package/src/components/Repository/CreateRepository/utils.ts +2 -3
  346. package/src/components/Repository/RepositoryDetails/DeleteRepositoryModal.tsx +54 -55
  347. package/src/components/Repository/RepositoryDetails/RepositoryDetails.tsx +47 -14
  348. package/src/components/ResourceSync/RepositoryResourceSyncList.tsx +28 -25
  349. package/src/components/common/CodeEditor/CodeEditorTheme.ts +53 -0
  350. package/src/components/common/CodeEditor/Shortcut.css +22 -0
  351. package/src/components/common/CodeEditor/Shortcut.tsx +90 -0
  352. package/src/components/common/CodeEditor/YamlEditor.css +12 -0
  353. package/src/components/common/CodeEditor/YamlEditor.tsx +81 -0
  354. package/src/components/common/CodeEditor/YamlEditorBase.css +3 -0
  355. package/src/components/common/CodeEditor/YamlEditorBase.tsx +124 -0
  356. package/src/components/common/CodeEditor/useShortcutPopover.tsx +39 -0
  357. package/src/components/common/LabelsView.tsx +2 -11
  358. package/src/components/common/LeaveFormConfirmation.tsx +14 -18
  359. package/src/components/common/TechPreviewBadge.tsx +3 -1
  360. package/src/components/form/FlightCtlActionGroup.tsx +1 -1
  361. package/src/components/form/FormSelect.tsx +14 -3
  362. package/src/components/form/FormSelectTypeahead.tsx +24 -3
  363. package/src/components/form/LabelsField.tsx +20 -20
  364. package/src/components/form/NameField.tsx +18 -4
  365. package/src/components/form/RichValidationTextField.tsx +20 -1
  366. package/src/components/form/TextListField.tsx +19 -3
  367. package/src/components/form/UploadField.tsx +16 -2
  368. package/src/components/form/validations.ts +1 -4
  369. package/src/components/modals/ApproveDeviceModal/ApproveDeviceModal.tsx +12 -7
  370. package/src/components/modals/CreateRepositoryModal/CreateRepositoryModal.tsx +6 -3
  371. package/src/components/modals/DecommissionModal/DecommissionModal.tsx +60 -56
  372. package/src/components/modals/DeleteModal/DeleteModal.tsx +25 -27
  373. package/src/components/modals/massModals/MassApproveDeviceModal/MassApproveDeviceModal.tsx +81 -92
  374. package/src/components/modals/massModals/MassDecommissionDeviceModal/MassDecommissionDeviceModal.tsx +64 -67
  375. package/src/components/modals/massModals/MassDeleteDeviceModal/MassDeleteDeviceModal.tsx +60 -62
  376. package/src/components/modals/massModals/MassDeleteFleetModal/MassDeleteFleetModal.tsx +80 -87
  377. package/src/components/modals/massModals/MassDeleteRepositoryModal/MassDeleteRepositoryModal.tsx +70 -73
  378. package/src/components/modals/massModals/MassDeleteResourceSyncModal/MassDeleteResourceSyncModal.tsx +62 -63
  379. package/src/constants.ts +2 -1
  380. package/src/hooks/useAppLinks.ts +49 -0
  381. package/src/{components/EnrollmentRequest/EnrollmentRequestDetails/useEnrollmentRequestSystemInfo.tsx → hooks/useDeviceSpecSystemInfo.tsx} +15 -7
  382. package/src/hooks/useFetchPeriodically.ts +3 -3
  383. package/src/hooks/useThemePreferences.ts +48 -21
  384. package/src/types/deviceSpec.ts +25 -13
  385. package/src/types/extraTypes.ts +7 -4
  386. package/src/utils/dates.ts +23 -24
  387. package/src/utils/patch.ts +3 -1
  388. package/dist/src/components/Device/DeviceDetails/DeviceStatusDebugModal.css +0 -3
  389. package/dist/src/components/Device/DeviceDetails/DeviceStatusDebugModal.d.ts +0 -9
  390. package/dist/src/components/Device/DeviceDetails/DeviceStatusDebugModal.d.ts.map +0 -1
  391. package/dist/src/components/Device/DeviceDetails/DeviceStatusDebugModal.js +0 -34
  392. package/dist/src/components/Device/DeviceDetails/DeviceStatusDebugModal.js.map +0 -1
  393. package/dist/src/components/EnrollmentRequest/EnrollmentRequestDetails/useEnrollmentRequestSystemInfo.d.ts.map +0 -1
  394. package/dist/src/components/EnrollmentRequest/EnrollmentRequestDetails/useEnrollmentRequestSystemInfo.js.map +0 -1
  395. package/dist/src/components/Fleet/CreateFleet/steps/UpdateConfirmChangesModal.d.ts +0 -9
  396. package/dist/src/components/Fleet/CreateFleet/steps/UpdateConfirmChangesModal.d.ts.map +0 -1
  397. package/dist/src/components/Fleet/CreateFleet/steps/UpdateConfirmChangesModal.js +0 -61
  398. package/dist/src/components/Fleet/CreateFleet/steps/UpdateConfirmChangesModal.js.map +0 -1
  399. package/dist/src/components/Fleet/FleetDetails/FleetDetails.d.ts.map +0 -1
  400. package/dist/src/components/Fleet/FleetDetails/FleetDetails.js.map +0 -1
  401. package/dist/src/components/common/LabelsView.css +0 -9
  402. package/dist/src/links.d.ts +0 -7
  403. package/dist/src/links.d.ts.map +0 -1
  404. package/dist/src/links.js +0 -14
  405. package/dist/src/links.js.map +0 -1
  406. package/src/components/Device/DeviceDetails/DeviceStatusDebugModal.css +0 -3
  407. package/src/components/Device/DeviceDetails/DeviceStatusDebugModal.tsx +0 -60
  408. package/src/components/Fleet/CreateFleet/steps/UpdateConfirmChangesModal.tsx +0 -96
  409. package/src/components/common/LabelsView.css +0 -9
  410. 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 title={t('Track systemd services')} isOpen onClose={() => onClose()} variant="small">
39
- <Formik<SystemdUnitsFormValues>
40
- validationSchema={deviceSystemdUnitsValidationSchema(t)}
41
- initialValues={{ systemdUnits: currentSystemdUnits }}
42
- onSubmit={async ({ systemdUnits: updatedSystemdUnits }) => {
43
- try {
44
- const currentPatterns = currentSystemdUnits.map((p) => p.pattern);
45
- const updatedPatterns = updatedSystemdUnits.map((p) => p.pattern);
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
- const patches = getStringListPatches(
48
- '/spec/systemd',
49
- currentPatterns,
50
- updatedPatterns,
51
- (value: string[]) => ({
52
- matchPatterns: value,
53
- }),
54
- );
55
- if (patches.length > 0) {
56
- await patch(`devices/${device.metadata.name}`, patches);
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
- const addedServices: string[] = [];
59
- updatedPatterns.forEach((newSystemd) => {
60
- if (!currentPatterns.includes(newSystemd)) {
61
- addedServices.push(newSystemd);
62
- }
63
- });
60
+ const addedServices: string[] = [];
61
+ updatedPatterns.forEach((newSystemd) => {
62
+ if (!currentPatterns.includes(newSystemd)) {
63
+ addedServices.push(newSystemd);
64
+ }
65
+ });
64
66
 
65
- onClose(true, addedServices);
66
- } else {
67
- onClose();
67
+ onClose(true, addedServices);
68
+ } else {
69
+ onClose();
70
+ }
71
+ } catch (err) {
72
+ setError(getErrorMessage(err));
68
73
  }
69
- } catch (err) {
70
- setError(getErrorMessage(err));
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
  };
@@ -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>