@flightctl/ui-components 0.5.1 → 0.6.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 (456) hide show
  1. package/dist/src/components/DetailsPage/DetailsPage.d.ts +3 -2
  2. package/dist/src/components/DetailsPage/DetailsPage.d.ts.map +1 -1
  3. package/dist/src/components/DetailsPage/DetailsPage.js +2 -2
  4. package/dist/src/components/DetailsPage/DetailsPage.js.map +1 -1
  5. package/dist/src/components/DetailsPage/Tables/ApplicationsTable.d.ts.map +1 -1
  6. package/dist/src/components/DetailsPage/Tables/ApplicationsTable.js +5 -3
  7. package/dist/src/components/DetailsPage/Tables/ApplicationsTable.js.map +1 -1
  8. package/dist/src/components/Device/AddDeviceModal/AddDeviceModal.d.ts.map +1 -1
  9. package/dist/src/components/Device/AddDeviceModal/AddDeviceModal.js +4 -5
  10. package/dist/src/components/Device/AddDeviceModal/AddDeviceModal.js.map +1 -1
  11. package/dist/src/components/Device/DeviceDetails/DeviceAliasEdit.d.ts +10 -0
  12. package/dist/src/components/Device/DeviceDetails/DeviceAliasEdit.d.ts.map +1 -0
  13. package/dist/src/components/Device/DeviceDetails/DeviceAliasEdit.js +110 -0
  14. package/dist/src/components/Device/DeviceDetails/DeviceAliasEdit.js.map +1 -0
  15. package/dist/src/components/Device/DeviceDetails/DeviceApplications.d.ts.map +1 -1
  16. package/dist/src/components/Device/DeviceDetails/DeviceApplications.js +7 -1
  17. package/dist/src/components/Device/DeviceDetails/DeviceApplications.js.map +1 -1
  18. package/dist/src/components/Device/DeviceDetails/DeviceDetailsPage.d.ts.map +1 -1
  19. package/dist/src/components/Device/DeviceDetails/DeviceDetailsPage.js +9 -6
  20. package/dist/src/components/Device/DeviceDetails/DeviceDetailsPage.js.map +1 -1
  21. package/dist/src/components/Device/DeviceDetails/DeviceDetailsTab.d.ts.map +1 -1
  22. package/dist/src/components/Device/DeviceDetails/DeviceDetailsTab.js +1 -1
  23. package/dist/src/components/Device/DeviceDetails/DeviceDetailsTab.js.map +1 -1
  24. package/dist/src/components/Device/DeviceDetails/DeviceDetailsTabContent/StatusContent.d.ts.map +1 -1
  25. package/dist/src/components/Device/DeviceDetails/DeviceDetailsTabContent/StatusContent.js +3 -3
  26. package/dist/src/components/Device/DeviceDetails/DeviceDetailsTabContent/StatusContent.js.map +1 -1
  27. package/dist/src/components/Device/DeviceDetails/DeviceDetailsTabContent/SystemResourcesContent.js +3 -3
  28. package/dist/src/components/Device/DeviceDetails/TerminalTab.d.ts.map +1 -1
  29. package/dist/src/components/Device/DeviceDetails/TerminalTab.js +34 -3
  30. package/dist/src/components/Device/DeviceDetails/TerminalTab.js.map +1 -1
  31. package/dist/src/components/Device/DevicesPage/DecommissionedDevicesTable.d.ts.map +1 -1
  32. package/dist/src/components/Device/DevicesPage/DecommissionedDevicesTable.js +1 -1
  33. package/dist/src/components/Device/DevicesPage/DecommissionedDevicesTable.js.map +1 -1
  34. package/dist/src/components/Device/DevicesPage/DeviceToolbarFilters.d.ts.map +1 -1
  35. package/dist/src/components/Device/DevicesPage/DeviceToolbarFilters.js +35 -30
  36. package/dist/src/components/Device/DevicesPage/DeviceToolbarFilters.js.map +1 -1
  37. package/dist/src/components/Device/DevicesPage/DevicesPage.d.ts.map +1 -1
  38. package/dist/src/components/Device/DevicesPage/DevicesPage.js +11 -2
  39. package/dist/src/components/Device/DevicesPage/DevicesPage.js.map +1 -1
  40. package/dist/src/components/Device/DevicesPage/EnrolledDevicesTable.d.ts.map +1 -1
  41. package/dist/src/components/Device/DevicesPage/EnrolledDevicesTable.js +14 -11
  42. package/dist/src/components/Device/DevicesPage/EnrolledDevicesTable.js.map +1 -1
  43. package/dist/src/components/Device/EditDeviceWizard/EditDeviceWizard.d.ts.map +1 -1
  44. package/dist/src/components/Device/EditDeviceWizard/EditDeviceWizard.js +9 -2
  45. package/dist/src/components/Device/EditDeviceWizard/EditDeviceWizard.js.map +1 -1
  46. package/dist/src/components/Device/EditDeviceWizard/EditDeviceWizardFooter.d.ts.map +1 -1
  47. package/dist/src/components/Device/EditDeviceWizard/EditDeviceWizardFooter.js +21 -6
  48. package/dist/src/components/Device/EditDeviceWizard/EditDeviceWizardFooter.js.map +1 -1
  49. package/dist/src/components/Device/EditDeviceWizard/EditDeviceWizardNav.d.ts.map +1 -1
  50. package/dist/src/components/Device/EditDeviceWizard/EditDeviceWizardNav.js +11 -4
  51. package/dist/src/components/Device/EditDeviceWizard/EditDeviceWizardNav.js.map +1 -1
  52. package/dist/src/components/Device/EditDeviceWizard/deviceSpecUtils.d.ts +6 -5
  53. package/dist/src/components/Device/EditDeviceWizard/deviceSpecUtils.d.ts.map +1 -1
  54. package/dist/src/components/Device/EditDeviceWizard/deviceSpecUtils.js +123 -10
  55. package/dist/src/components/Device/EditDeviceWizard/deviceSpecUtils.js.map +1 -1
  56. package/dist/src/components/Device/EditDeviceWizard/steps/ApplicationImageForm.d.ts +8 -0
  57. package/dist/src/components/Device/EditDeviceWizard/steps/ApplicationImageForm.d.ts.map +1 -0
  58. package/dist/src/components/Device/EditDeviceWizard/steps/ApplicationImageForm.js +19 -0
  59. package/dist/src/components/Device/EditDeviceWizard/steps/ApplicationImageForm.js.map +1 -0
  60. package/dist/src/components/Device/EditDeviceWizard/steps/ApplicationInlineForm.d.ts +8 -0
  61. package/dist/src/components/Device/EditDeviceWizard/steps/ApplicationInlineForm.d.ts.map +1 -0
  62. package/dist/src/components/Device/EditDeviceWizard/steps/ApplicationInlineForm.js +49 -0
  63. package/dist/src/components/Device/EditDeviceWizard/steps/ApplicationInlineForm.js.map +1 -0
  64. package/dist/src/components/Device/EditDeviceWizard/steps/ApplicationTemplates.d.ts.map +1 -1
  65. package/dist/src/components/Device/EditDeviceWizard/steps/ApplicationTemplates.js +52 -19
  66. package/dist/src/components/Device/EditDeviceWizard/steps/ApplicationTemplates.js.map +1 -1
  67. package/dist/src/components/Device/EditDeviceWizard/steps/ConfigInlineTemplateForm.d.ts.map +1 -1
  68. package/dist/src/components/Device/EditDeviceWizard/steps/ConfigInlineTemplateForm.js +13 -16
  69. package/dist/src/components/Device/EditDeviceWizard/steps/ConfigInlineTemplateForm.js.map +1 -1
  70. package/dist/src/components/Device/EditDeviceWizard/steps/ConfigK8sSecretTemplateForm.d.ts.map +1 -1
  71. package/dist/src/components/Device/EditDeviceWizard/steps/ConfigK8sSecretTemplateForm.js.map +1 -1
  72. package/dist/src/components/Device/EditDeviceWizard/steps/ConfigWithRepositoryTemplateForm.d.ts.map +1 -1
  73. package/dist/src/components/Device/EditDeviceWizard/steps/ConfigWithRepositoryTemplateForm.js +5 -5
  74. package/dist/src/components/Device/EditDeviceWizard/steps/ConfigWithRepositoryTemplateForm.js.map +1 -1
  75. package/dist/src/components/Device/EditDeviceWizard/steps/ConfigurationTemplates.d.ts.map +1 -1
  76. package/dist/src/components/Device/EditDeviceWizard/steps/ConfigurationTemplates.js +2 -2
  77. package/dist/src/components/Device/EditDeviceWizard/steps/ConfigurationTemplates.js.map +1 -1
  78. package/dist/src/components/Device/EditDeviceWizard/steps/DeviceTemplateStep.d.ts +1 -1
  79. package/dist/src/components/Device/EditDeviceWizard/steps/DeviceTemplateStep.d.ts.map +1 -1
  80. package/dist/src/components/Device/EditDeviceWizard/steps/DeviceTemplateStep.js +16 -16
  81. package/dist/src/components/Device/EditDeviceWizard/steps/DeviceTemplateStep.js.map +1 -1
  82. package/dist/src/components/Device/EditDeviceWizard/steps/DeviceUpdateStep.d.ts +8 -0
  83. package/dist/src/components/Device/EditDeviceWizard/steps/DeviceUpdateStep.d.ts.map +1 -0
  84. package/dist/src/components/Device/EditDeviceWizard/steps/DeviceUpdateStep.js +58 -0
  85. package/dist/src/components/Device/EditDeviceWizard/steps/DeviceUpdateStep.js.map +1 -0
  86. package/dist/src/components/Device/EditDeviceWizard/steps/GeneralInfoStep.d.ts +1 -1
  87. package/dist/src/components/Device/EditDeviceWizard/steps/GeneralInfoStep.d.ts.map +1 -1
  88. package/dist/src/components/Device/EditDeviceWizard/steps/ReviewApplications.d.ts +2 -2
  89. package/dist/src/components/Device/EditDeviceWizard/steps/ReviewApplications.d.ts.map +1 -1
  90. package/dist/src/components/Device/EditDeviceWizard/steps/ReviewApplications.js +17 -12
  91. package/dist/src/components/Device/EditDeviceWizard/steps/ReviewApplications.js.map +1 -1
  92. package/dist/src/components/Device/EditDeviceWizard/steps/ReviewDeviceStep.js +1 -1
  93. package/dist/src/components/Device/EditDeviceWizard/steps/ReviewTrackedSystemdServices.d.ts +2 -4
  94. package/dist/src/components/Device/EditDeviceWizard/steps/ReviewTrackedSystemdServices.d.ts.map +1 -1
  95. package/dist/src/components/Device/EditDeviceWizard/steps/ReviewTrackedSystemdServices.js.map +1 -1
  96. package/dist/src/components/Device/EditDeviceWizard/steps/ReviewUpdatePolicy.d.ts +1 -1
  97. package/dist/src/components/Device/EditDeviceWizard/steps/ReviewUpdatePolicy.d.ts.map +1 -1
  98. package/dist/src/components/Device/EditDeviceWizard/steps/ReviewUpdatePolicy.js.map +1 -1
  99. package/dist/src/components/Device/EditDeviceWizard/utils.d.ts +29 -3
  100. package/dist/src/components/Device/EditDeviceWizard/utils.d.ts.map +1 -1
  101. package/dist/src/components/Device/EditDeviceWizard/utils.js +8 -7
  102. package/dist/src/components/Device/EditDeviceWizard/utils.js.map +1 -1
  103. package/dist/src/components/Device/SystemdUnitsModal/SystemdUnitsModal.d.ts.map +1 -1
  104. package/dist/src/components/Device/SystemdUnitsModal/SystemdUnitsModal.js.map +1 -1
  105. package/dist/src/components/Device/SystemdUnitsModal/TrackSystemdUnitsForm.d.ts +1 -4
  106. package/dist/src/components/Device/SystemdUnitsModal/TrackSystemdUnitsForm.d.ts.map +1 -1
  107. package/dist/src/components/Device/SystemdUnitsModal/TrackSystemdUnitsForm.js.map +1 -1
  108. package/dist/src/components/EnrollmentRequest/EnrollmentRequestDetails/EnrollmentRequestDetails.d.ts.map +1 -1
  109. package/dist/src/components/EnrollmentRequest/EnrollmentRequestDetails/EnrollmentRequestDetails.js +5 -5
  110. package/dist/src/components/EnrollmentRequest/EnrollmentRequestDetails/EnrollmentRequestDetails.js.map +1 -1
  111. package/dist/src/components/EnrollmentRequest/EnrollmentRequestList.d.ts +2 -1
  112. package/dist/src/components/EnrollmentRequest/EnrollmentRequestList.d.ts.map +1 -1
  113. package/dist/src/components/EnrollmentRequest/EnrollmentRequestList.js +19 -11
  114. package/dist/src/components/EnrollmentRequest/EnrollmentRequestList.js.map +1 -1
  115. package/dist/src/components/EnrollmentRequest/EnrollmentRequestTableRow.d.ts.map +1 -1
  116. package/dist/src/components/EnrollmentRequest/EnrollmentRequestTableRow.js +5 -1
  117. package/dist/src/components/EnrollmentRequest/EnrollmentRequestTableRow.js.map +1 -1
  118. package/dist/src/components/EnrollmentRequest/useEnrollmentRequests.d.ts +2 -1
  119. package/dist/src/components/EnrollmentRequest/useEnrollmentRequests.d.ts.map +1 -1
  120. package/dist/src/components/EnrollmentRequest/useEnrollmentRequests.js +8 -4
  121. package/dist/src/components/EnrollmentRequest/useEnrollmentRequests.js.map +1 -1
  122. package/dist/src/components/Fleet/CreateFleet/CreateFleetWizard.d.ts.map +1 -1
  123. package/dist/src/components/Fleet/CreateFleet/CreateFleetWizard.js +2 -2
  124. package/dist/src/components/Fleet/CreateFleet/CreateFleetWizard.js.map +1 -1
  125. package/dist/src/components/Fleet/CreateFleet/CreateFleetWizardFooter.d.ts.map +1 -1
  126. package/dist/src/components/Fleet/CreateFleet/CreateFleetWizardFooter.js +8 -1
  127. package/dist/src/components/Fleet/CreateFleet/CreateFleetWizardFooter.js.map +1 -1
  128. package/dist/src/components/Fleet/CreateFleet/fleetSpecUtils.d.ts +19 -2
  129. package/dist/src/components/Fleet/CreateFleet/fleetSpecUtils.d.ts.map +1 -1
  130. package/dist/src/components/Fleet/CreateFleet/fleetSpecUtils.js +53 -18
  131. package/dist/src/components/Fleet/CreateFleet/fleetSpecUtils.js.map +1 -1
  132. package/dist/src/components/Fleet/CreateFleet/steps/DeviceLabelSelector.js +1 -1
  133. package/dist/src/components/Fleet/CreateFleet/steps/DeviceLabelSelector.js.map +1 -1
  134. package/dist/src/components/Fleet/CreateFleet/steps/GeneralInfoStep.d.ts +1 -1
  135. package/dist/src/components/Fleet/CreateFleet/steps/GeneralInfoStep.d.ts.map +1 -1
  136. package/dist/src/components/Fleet/CreateFleet/steps/GeneralInfoStep.js +1 -2
  137. package/dist/src/components/Fleet/CreateFleet/steps/GeneralInfoStep.js.map +1 -1
  138. package/dist/src/components/Fleet/CreateFleet/steps/ReviewStep.js +1 -1
  139. package/dist/src/components/Fleet/CreateFleet/steps/UpdateConfirmChangesModal.d.ts +1 -1
  140. package/dist/src/components/Fleet/CreateFleet/steps/UpdateConfirmChangesModal.d.ts.map +1 -1
  141. package/dist/src/components/Fleet/CreateFleet/steps/UpdateConfirmChangesModal.js +9 -0
  142. package/dist/src/components/Fleet/CreateFleet/steps/UpdateConfirmChangesModal.js.map +1 -1
  143. package/dist/src/components/Fleet/CreateFleet/steps/UpdatePolicyStep.d.ts +1 -1
  144. package/dist/src/components/Fleet/CreateFleet/steps/UpdatePolicyStep.d.ts.map +1 -1
  145. package/dist/src/components/Fleet/CreateFleet/steps/UpdatePolicyStep.js +22 -9
  146. package/dist/src/components/Fleet/CreateFleet/steps/UpdatePolicyStep.js.map +1 -1
  147. package/dist/src/components/Fleet/CreateFleet/steps/UpdateStepDisruptionBudget.d.ts.map +1 -1
  148. package/dist/src/components/Fleet/CreateFleet/steps/UpdateStepDisruptionBudget.js +4 -4
  149. package/dist/src/components/Fleet/CreateFleet/steps/UpdateStepDisruptionBudget.js.map +1 -1
  150. package/dist/src/components/Fleet/CreateFleet/steps/UpdateStepRolloutPolicy.d.ts.map +1 -1
  151. package/dist/src/components/Fleet/CreateFleet/steps/UpdateStepRolloutPolicy.js +5 -5
  152. package/dist/src/components/Fleet/CreateFleet/steps/UpdateStepRolloutPolicy.js.map +1 -1
  153. package/dist/src/components/Fleet/CreateFleet/steps/UpdateStepUpdatePolicy.css +3 -0
  154. package/dist/src/components/Fleet/CreateFleet/steps/UpdateStepUpdatePolicy.d.ts +9 -0
  155. package/dist/src/components/Fleet/CreateFleet/steps/UpdateStepUpdatePolicy.d.ts.map +1 -0
  156. package/dist/src/components/Fleet/CreateFleet/steps/UpdateStepUpdatePolicy.js +127 -0
  157. package/dist/src/components/Fleet/CreateFleet/steps/UpdateStepUpdatePolicy.js.map +1 -0
  158. package/dist/src/components/Fleet/CreateFleet/utils.d.ts +1 -1
  159. package/dist/src/components/Fleet/CreateFleet/utils.d.ts.map +1 -1
  160. package/dist/src/components/Fleet/CreateFleet/utils.js +13 -4
  161. package/dist/src/components/Fleet/CreateFleet/utils.js.map +1 -1
  162. package/dist/src/components/Fleet/FleetsPage.d.ts.map +1 -1
  163. package/dist/src/components/Fleet/FleetsPage.js +8 -12
  164. package/dist/src/components/Fleet/FleetsPage.js.map +1 -1
  165. package/dist/src/components/Fleet/ImportFleetWizard/steps/ResourceSyncStep.js +1 -1
  166. package/dist/src/components/Fleet/ImportFleetWizard/steps/ResourceSyncStep.js.map +1 -1
  167. package/dist/src/components/ListPage/ListPage.d.ts +1 -0
  168. package/dist/src/components/ListPage/ListPage.d.ts.map +1 -1
  169. package/dist/src/components/ListPage/ListPage.js +3 -3
  170. package/dist/src/components/ListPage/ListPage.js.map +1 -1
  171. package/dist/src/components/Masthead/CommandLineToolsPage.d.ts +4 -0
  172. package/dist/src/components/Masthead/CommandLineToolsPage.d.ts.map +1 -0
  173. package/dist/src/components/Masthead/CommandLineToolsPage.js +90 -0
  174. package/dist/src/components/Masthead/CommandLineToolsPage.js.map +1 -0
  175. package/dist/src/components/Masthead/UserPreferencesModal.d.ts.map +1 -0
  176. package/dist/src/components/Masthead/UserPreferencesModal.js.map +1 -0
  177. package/dist/src/components/Masthead/UserPreferencesProvider.d.ts.map +1 -0
  178. package/dist/src/components/Masthead/UserPreferencesProvider.js.map +1 -0
  179. package/dist/src/components/OverviewPage/Cards/Status/StatusCard.js +3 -3
  180. package/dist/src/components/OverviewPage/Cards/Status/StatusCard.js.map +1 -1
  181. package/dist/src/components/OverviewPage/Cards/Tasks/TasksCard.d.ts +4 -0
  182. package/dist/src/components/OverviewPage/Cards/Tasks/TasksCard.d.ts.map +1 -0
  183. package/dist/src/components/OverviewPage/Cards/{ToDo/ToDoCard.js → Tasks/TasksCard.js} +4 -4
  184. package/dist/src/components/OverviewPage/Cards/Tasks/TasksCard.js.map +1 -0
  185. package/dist/src/components/OverviewPage/Overview.js +2 -2
  186. package/dist/src/components/OverviewPage/Overview.js.map +1 -1
  187. package/dist/src/components/Repository/CreateRepository/CreateRepositoryForm.d.ts.map +1 -1
  188. package/dist/src/components/Repository/CreateRepository/CreateRepositoryForm.js +6 -5
  189. package/dist/src/components/Repository/CreateRepository/CreateRepositoryForm.js.map +1 -1
  190. package/dist/src/components/Repository/CreateRepository/CreateResourceSyncsForm.d.ts.map +1 -1
  191. package/dist/src/components/Repository/CreateRepository/CreateResourceSyncsForm.js +3 -3
  192. package/dist/src/components/Repository/CreateRepository/CreateResourceSyncsForm.js.map +1 -1
  193. package/dist/src/components/Repository/CreateRepository/utils.d.ts.map +1 -1
  194. package/dist/src/components/Repository/CreateRepository/utils.js +4 -1
  195. package/dist/src/components/Repository/CreateRepository/utils.js.map +1 -1
  196. package/dist/src/components/Repository/RepositoryDetails/RepositoryResourceSyncsCard.d.ts.map +1 -1
  197. package/dist/src/components/Repository/RepositoryDetails/RepositoryResourceSyncsCard.js +1 -1
  198. package/dist/src/components/Repository/RepositoryDetails/RepositoryResourceSyncsCard.js.map +1 -1
  199. package/dist/src/components/Repository/RepositoryList.d.ts.map +1 -1
  200. package/dist/src/components/Repository/RepositoryList.js +3 -11
  201. package/dist/src/components/Repository/RepositoryList.js.map +1 -1
  202. package/dist/src/components/ResourceSync/RepositoryResourceSyncList.d.ts.map +1 -1
  203. package/dist/src/components/ResourceSync/RepositoryResourceSyncList.js +3 -6
  204. package/dist/src/components/ResourceSync/RepositoryResourceSyncList.js.map +1 -1
  205. package/dist/src/components/Status/DeviceResourceStatus.js +3 -3
  206. package/dist/src/components/Status/utils.d.ts.map +1 -1
  207. package/dist/src/components/Status/utils.js +3 -3
  208. package/dist/src/components/Status/utils.js.map +1 -1
  209. package/dist/src/components/Table/Table.d.ts +2 -1
  210. package/dist/src/components/Table/Table.d.ts.map +1 -1
  211. package/dist/src/components/Table/Table.js +9 -5
  212. package/dist/src/components/Table/Table.js.map +1 -1
  213. package/dist/src/components/Table/TablePagination.d.ts.map +1 -1
  214. package/dist/src/components/Table/TablePagination.js +1 -1
  215. package/dist/src/components/Table/TablePagination.js.map +1 -1
  216. package/dist/src/components/Terminal/Terminal.d.ts +1 -1
  217. package/dist/src/components/Terminal/Terminal.d.ts.map +1 -1
  218. package/dist/src/components/Terminal/Terminal.js +10 -3
  219. package/dist/src/components/Terminal/Terminal.js.map +1 -1
  220. package/dist/src/components/charts/DonutChart.js +1 -1
  221. package/dist/src/components/charts/DonutChart.js.map +1 -1
  222. package/dist/src/components/common/LeaveFormConfirmation.js +1 -1
  223. package/dist/src/components/common/LeaveFormConfirmation.js.map +1 -1
  224. package/dist/src/components/common/WithHelperText.d.ts +10 -5
  225. package/dist/src/components/common/WithHelperText.d.ts.map +1 -1
  226. package/dist/src/components/common/WithHelperText.js +13 -8
  227. package/dist/src/components/common/WithHelperText.js.map +1 -1
  228. package/dist/src/components/form/CheckboxField.d.ts +6 -3
  229. package/dist/src/components/form/CheckboxField.d.ts.map +1 -1
  230. package/dist/src/components/form/CheckboxField.js +20 -1
  231. package/dist/src/components/form/CheckboxField.js.map +1 -1
  232. package/dist/src/components/form/FormSelectTypeahead.d.ts +3 -3
  233. package/dist/src/components/form/FormSelectTypeahead.d.ts.map +1 -1
  234. package/dist/src/components/form/FormSelectTypeahead.js +43 -53
  235. package/dist/src/components/form/FormSelectTypeahead.js.map +1 -1
  236. package/dist/src/components/form/RichValidationTextField.d.ts +1 -1
  237. package/dist/src/components/form/RichValidationTextField.d.ts.map +1 -1
  238. package/dist/src/components/form/RichValidationTextField.js +8 -4
  239. package/dist/src/components/form/RichValidationTextField.js.map +1 -1
  240. package/dist/src/components/form/validations.d.ts +44 -4
  241. package/dist/src/components/form/validations.d.ts.map +1 -1
  242. package/dist/src/components/form/validations.js +148 -25
  243. package/dist/src/components/form/validations.js.map +1 -1
  244. package/dist/src/components/modals/ApproveDeviceModal/ApproveDeviceForm.js +5 -3
  245. package/dist/src/components/modals/ApproveDeviceModal/ApproveDeviceForm.js.map +1 -1
  246. package/dist/src/components/modals/ApproveDeviceModal/ApproveDeviceModal.d.ts.map +1 -1
  247. package/dist/src/components/modals/ApproveDeviceModal/ApproveDeviceModal.js +3 -2
  248. package/dist/src/components/modals/ApproveDeviceModal/ApproveDeviceModal.js.map +1 -1
  249. package/dist/src/components/modals/EditLabelsModal/EditLabelsForm.d.ts.map +1 -1
  250. package/dist/src/components/modals/EditLabelsModal/EditLabelsForm.js +7 -12
  251. package/dist/src/components/modals/EditLabelsModal/EditLabelsForm.js.map +1 -1
  252. package/dist/src/components/modals/massModals/MassDecommissionDeviceModal/MassDecommissionDeviceModal.js +4 -4
  253. package/dist/src/components/modals/massModals/MassDecommissionDeviceModal/MassDecommissionDeviceModal.js.map +1 -1
  254. package/dist/src/components/modals/massModals/MassDeleteDeviceModal/MassDeleteDeviceModal.js +4 -4
  255. package/dist/src/components/modals/massModals/MassDeleteDeviceModal/MassDeleteDeviceModal.js.map +1 -1
  256. package/dist/src/components/modals/massModals/MassDeleteFleetModal/MassDeleteFleetModal.js +2 -2
  257. package/dist/src/components/modals/massModals/MassDeleteFleetModal/MassDeleteFleetModal.js.map +1 -1
  258. package/dist/src/components/modals/massModals/MassDeleteRepositoryModal/MassDeleteRepositoryModal.js +2 -2
  259. package/dist/src/components/modals/massModals/MassDeleteRepositoryModal/MassDeleteRepositoryModal.js.map +1 -1
  260. package/dist/src/hooks/timeZones.d.ts +3 -0
  261. package/dist/src/hooks/timeZones.d.ts.map +1 -0
  262. package/dist/src/hooks/timeZones.js +607 -0
  263. package/dist/src/hooks/timeZones.js.map +1 -0
  264. package/dist/src/hooks/useAppContext.d.ts +14 -8
  265. package/dist/src/hooks/useAppContext.d.ts.map +1 -1
  266. package/dist/src/hooks/useAppContext.js +13 -6
  267. package/dist/src/hooks/useAppContext.js.map +1 -1
  268. package/dist/src/hooks/useFetch.d.ts +3 -5
  269. package/dist/src/hooks/useFetch.d.ts.map +1 -1
  270. package/dist/src/hooks/useFetch.js +3 -2
  271. package/dist/src/hooks/useFetch.js.map +1 -1
  272. package/dist/src/hooks/useNavigate.d.ts +2 -1
  273. package/dist/src/hooks/useNavigate.d.ts.map +1 -1
  274. package/dist/src/hooks/useNavigate.js +1 -0
  275. package/dist/src/hooks/useNavigate.js.map +1 -1
  276. package/dist/src/hooks/useTimeZones.d.ts +4 -0
  277. package/dist/src/hooks/useTimeZones.d.ts.map +1 -0
  278. package/dist/src/hooks/useTimeZones.js +22 -0
  279. package/dist/src/hooks/useTimeZones.js.map +1 -0
  280. package/dist/src/hooks/useWebSocket.d.ts +6 -2
  281. package/dist/src/hooks/useWebSocket.d.ts.map +1 -1
  282. package/dist/src/hooks/useWebSocket.js +22 -7
  283. package/dist/src/hooks/useWebSocket.js.map +1 -1
  284. package/dist/src/links.d.ts +3 -0
  285. package/dist/src/links.d.ts.map +1 -1
  286. package/dist/src/links.js +10 -3
  287. package/dist/src/links.js.map +1 -1
  288. package/dist/src/types/deviceSpec.d.ts +93 -5
  289. package/dist/src/types/deviceSpec.d.ts.map +1 -1
  290. package/dist/src/types/deviceSpec.js +28 -2
  291. package/dist/src/types/deviceSpec.js.map +1 -1
  292. package/dist/src/types/extraTypes.d.ts +19 -1
  293. package/dist/src/types/extraTypes.d.ts.map +1 -1
  294. package/dist/src/types/extraTypes.js.map +1 -1
  295. package/dist/src/utils/labels.d.ts +1 -0
  296. package/dist/src/utils/labels.d.ts.map +1 -1
  297. package/dist/src/utils/labels.js +9 -2
  298. package/dist/src/utils/labels.js.map +1 -1
  299. package/dist/src/utils/patch.d.ts +13 -5
  300. package/dist/src/utils/patch.d.ts.map +1 -1
  301. package/dist/src/utils/patch.js +115 -71
  302. package/dist/src/utils/patch.js.map +1 -1
  303. package/dist/src/utils/query.d.ts +1 -0
  304. package/dist/src/utils/query.d.ts.map +1 -1
  305. package/dist/src/utils/query.js +10 -3
  306. package/dist/src/utils/query.js.map +1 -1
  307. package/dist/src/utils/search.d.ts +6 -0
  308. package/dist/src/utils/search.d.ts.map +1 -1
  309. package/dist/src/utils/search.js +9 -1
  310. package/dist/src/utils/search.js.map +1 -1
  311. package/dist/src/utils/time.d.ts +31 -0
  312. package/dist/src/utils/time.d.ts.map +1 -0
  313. package/dist/src/utils/time.js +134 -0
  314. package/dist/src/utils/time.js.map +1 -0
  315. package/package.json +1 -4
  316. package/src/components/DetailsPage/DetailsPage.tsx +6 -4
  317. package/src/components/DetailsPage/Tables/ApplicationsTable.tsx +6 -3
  318. package/src/components/Device/AddDeviceModal/AddDeviceModal.tsx +4 -13
  319. package/src/components/Device/DeviceDetails/DeviceAliasEdit.tsx +180 -0
  320. package/src/components/Device/DeviceDetails/DeviceApplications.tsx +8 -1
  321. package/src/components/Device/DeviceDetails/DeviceDetailsPage.tsx +21 -5
  322. package/src/components/Device/DeviceDetails/DeviceDetailsTab.tsx +3 -4
  323. package/src/components/Device/DeviceDetails/DeviceDetailsTabContent/StatusContent.tsx +7 -10
  324. package/src/components/Device/DeviceDetails/DeviceDetailsTabContent/SystemResourcesContent.tsx +3 -3
  325. package/src/components/Device/DeviceDetails/TerminalTab.tsx +43 -5
  326. package/src/components/Device/DevicesPage/DecommissionedDevicesTable.tsx +2 -1
  327. package/src/components/Device/DevicesPage/DeviceToolbarFilters.tsx +66 -38
  328. package/src/components/Device/DevicesPage/DevicesPage.tsx +11 -2
  329. package/src/components/Device/DevicesPage/EnrolledDevicesTable.tsx +16 -11
  330. package/src/components/Device/EditDeviceWizard/EditDeviceWizard.tsx +11 -2
  331. package/src/components/Device/EditDeviceWizard/EditDeviceWizardFooter.tsx +22 -6
  332. package/src/components/Device/EditDeviceWizard/EditDeviceWizardNav.tsx +15 -2
  333. package/src/components/Device/EditDeviceWizard/deviceSpecUtils.ts +147 -14
  334. package/src/components/Device/EditDeviceWizard/steps/ApplicationImageForm.tsx +28 -0
  335. package/src/components/Device/EditDeviceWizard/steps/ApplicationInlineForm.tsx +94 -0
  336. package/src/components/Device/EditDeviceWizard/steps/ApplicationTemplates.tsx +81 -50
  337. package/src/components/Device/EditDeviceWizard/steps/ConfigInlineTemplateForm.tsx +23 -28
  338. package/src/components/Device/EditDeviceWizard/steps/ConfigK8sSecretTemplateForm.tsx +1 -2
  339. package/src/components/Device/EditDeviceWizard/steps/ConfigWithRepositoryTemplateForm.tsx +18 -39
  340. package/src/components/Device/EditDeviceWizard/steps/ConfigurationTemplates.tsx +8 -14
  341. package/src/components/Device/EditDeviceWizard/steps/DeviceTemplateStep.tsx +26 -39
  342. package/src/components/Device/EditDeviceWizard/steps/DeviceUpdateStep.tsx +88 -0
  343. package/src/components/Device/EditDeviceWizard/steps/GeneralInfoStep.tsx +1 -1
  344. package/src/components/Device/EditDeviceWizard/steps/ReviewApplications.tsx +18 -19
  345. package/src/components/Device/EditDeviceWizard/steps/ReviewDeviceStep.tsx +3 -3
  346. package/src/components/Device/EditDeviceWizard/steps/ReviewTrackedSystemdServices.tsx +2 -2
  347. package/src/components/Device/EditDeviceWizard/steps/ReviewUpdatePolicy.tsx +2 -1
  348. package/src/components/Device/EditDeviceWizard/steps/SystemdUnitsForm.tsx +1 -1
  349. package/src/components/Device/EditDeviceWizard/utils.ts +16 -9
  350. package/src/components/Device/SystemdUnitsModal/SystemdUnitsModal.tsx +7 -6
  351. package/src/components/Device/SystemdUnitsModal/TrackSystemdUnitsForm.tsx +1 -5
  352. package/src/components/EnrollmentRequest/EnrollmentRequestDetails/EnrollmentRequestDetails.tsx +7 -9
  353. package/src/components/EnrollmentRequest/EnrollmentRequestList.tsx +30 -17
  354. package/src/components/EnrollmentRequest/EnrollmentRequestTableRow.tsx +5 -1
  355. package/src/components/EnrollmentRequest/useEnrollmentRequests.ts +12 -4
  356. package/src/components/Fleet/CreateFleet/CreateFleetWizard.tsx +4 -3
  357. package/src/components/Fleet/CreateFleet/CreateFleetWizardFooter.tsx +9 -2
  358. package/src/components/Fleet/CreateFleet/fleetSpecUtils.ts +51 -17
  359. package/src/components/Fleet/CreateFleet/steps/DeviceLabelSelector.tsx +1 -1
  360. package/src/components/Fleet/CreateFleet/steps/GeneralInfoStep.tsx +2 -13
  361. package/src/components/Fleet/CreateFleet/steps/ReviewStep.tsx +3 -3
  362. package/src/components/Fleet/CreateFleet/steps/UpdateConfirmChangesModal.tsx +10 -1
  363. package/src/components/Fleet/CreateFleet/steps/UpdatePolicyStep.tsx +49 -16
  364. package/src/components/Fleet/CreateFleet/steps/UpdateStepDisruptionBudget.tsx +18 -33
  365. package/src/components/Fleet/CreateFleet/steps/UpdateStepRolloutPolicy.tsx +14 -24
  366. package/src/components/Fleet/CreateFleet/steps/UpdateStepUpdatePolicy.css +3 -0
  367. package/src/components/Fleet/CreateFleet/steps/UpdateStepUpdatePolicy.tsx +246 -0
  368. package/src/components/Fleet/CreateFleet/utils.ts +23 -7
  369. package/src/components/Fleet/FleetsPage.tsx +15 -17
  370. package/src/components/Fleet/ImportFleetWizard/steps/ResourceSyncStep.tsx +1 -1
  371. package/src/components/ListPage/ListPage.tsx +7 -4
  372. package/src/components/Masthead/CommandLineToolsPage.tsx +179 -0
  373. package/src/components/OverviewPage/Cards/Status/StatusCard.tsx +6 -6
  374. package/src/components/OverviewPage/Cards/{ToDo/ToDoCard.tsx → Tasks/TasksCard.tsx} +3 -3
  375. package/src/components/OverviewPage/Overview.tsx +2 -2
  376. package/src/components/Repository/CreateRepository/CreateRepositoryForm.tsx +11 -26
  377. package/src/components/Repository/CreateRepository/CreateResourceSyncsForm.tsx +8 -17
  378. package/src/components/Repository/CreateRepository/utils.ts +4 -1
  379. package/src/components/Repository/RepositoryDetails/RepositoryResourceSyncsCard.tsx +3 -4
  380. package/src/components/Repository/RepositoryList.tsx +9 -16
  381. package/src/components/ResourceSync/RepositoryResourceSyncList.tsx +7 -11
  382. package/src/components/Status/DeviceResourceStatus.tsx +4 -4
  383. package/src/components/Status/utils.ts +3 -5
  384. package/src/components/Table/Table.tsx +32 -9
  385. package/src/components/Table/TablePagination.tsx +0 -1
  386. package/src/components/Terminal/Terminal.tsx +10 -4
  387. package/src/components/charts/DonutChart.tsx +2 -2
  388. package/src/components/common/LeaveFormConfirmation.tsx +2 -2
  389. package/src/components/common/WithHelperText.tsx +53 -21
  390. package/src/components/form/CheckboxField.tsx +28 -3
  391. package/src/components/form/FormSelectTypeahead.tsx +53 -80
  392. package/src/components/form/RichValidationTextField.tsx +73 -62
  393. package/src/components/form/validations.ts +207 -28
  394. package/src/components/modals/ApproveDeviceModal/ApproveDeviceForm.tsx +5 -5
  395. package/src/components/modals/ApproveDeviceModal/ApproveDeviceModal.tsx +3 -2
  396. package/src/components/modals/EditLabelsModal/EditLabelsForm.tsx +9 -20
  397. package/src/components/modals/massModals/MassDecommissionDeviceModal/MassDecommissionDeviceModal.tsx +2 -2
  398. package/src/components/modals/massModals/MassDeleteDeviceModal/MassDeleteDeviceModal.tsx +2 -2
  399. package/src/components/modals/massModals/MassDeleteFleetModal/MassDeleteFleetModal.tsx +2 -2
  400. package/src/components/modals/massModals/MassDeleteRepositoryModal/MassDeleteRepositoryModal.tsx +2 -2
  401. package/src/hooks/timeZones.ts +606 -0
  402. package/src/hooks/useAppContext.tsx +20 -10
  403. package/src/hooks/useFetch.ts +3 -2
  404. package/src/hooks/useNavigate.tsx +1 -0
  405. package/src/hooks/useTimeZones.ts +26 -0
  406. package/src/hooks/useWebSocket.ts +29 -7
  407. package/src/links.ts +13 -4
  408. package/src/types/deviceSpec.ts +118 -2
  409. package/src/types/extraTypes.ts +33 -1
  410. package/src/utils/labels.ts +7 -1
  411. package/src/utils/patch.ts +126 -72
  412. package/src/utils/query.ts +13 -4
  413. package/src/utils/search.ts +8 -0
  414. package/src/utils/time.ts +147 -0
  415. package/dist/jest.config.d.ts +0 -12
  416. package/dist/jest.config.d.ts.map +0 -1
  417. package/dist/jest.config.js +0 -24
  418. package/dist/jest.config.js.map +0 -1
  419. package/dist/src/components/DetailsPage/DetailsPage.spec.d.ts +0 -2
  420. package/dist/src/components/DetailsPage/DetailsPage.spec.d.ts.map +0 -1
  421. package/dist/src/components/DetailsPage/DetailsPage.spec.js +0 -81
  422. package/dist/src/components/DetailsPage/DetailsPage.spec.js.map +0 -1
  423. package/dist/src/components/Device/EditDeviceWizard/types.d.ts +0 -23
  424. package/dist/src/components/Device/EditDeviceWizard/types.d.ts.map +0 -1
  425. package/dist/src/components/Device/EditDeviceWizard/types.js +0 -3
  426. package/dist/src/components/Device/EditDeviceWizard/types.js.map +0 -1
  427. package/dist/src/components/Fleet/CreateFleet/types.d.ts +0 -29
  428. package/dist/src/components/Fleet/CreateFleet/types.d.ts.map +0 -1
  429. package/dist/src/components/Fleet/CreateFleet/types.js +0 -9
  430. package/dist/src/components/Fleet/CreateFleet/types.js.map +0 -1
  431. package/dist/src/components/OverviewPage/Cards/ToDo/ToDoCard.d.ts +0 -4
  432. package/dist/src/components/OverviewPage/Cards/ToDo/ToDoCard.d.ts.map +0 -1
  433. package/dist/src/components/OverviewPage/Cards/ToDo/ToDoCard.js.map +0 -1
  434. package/dist/src/components/UserPreferences/UserPreferencesModal.d.ts.map +0 -1
  435. package/dist/src/components/UserPreferences/UserPreferencesModal.js.map +0 -1
  436. package/dist/src/components/UserPreferences/UserPreferencesProvider.d.ts.map +0 -1
  437. package/dist/src/components/UserPreferences/UserPreferencesProvider.js.map +0 -1
  438. package/dist/src/setupTests.d.ts +0 -2
  439. package/dist/src/setupTests.d.ts.map +0 -1
  440. package/dist/src/setupTests.js +0 -24
  441. package/dist/src/setupTests.js.map +0 -1
  442. package/dist/src/tests/test-utils.d.ts +0 -7
  443. package/dist/src/tests/test-utils.d.ts.map +0 -1
  444. package/dist/src/tests/test-utils.js +0 -21
  445. package/dist/src/tests/test-utils.js.map +0 -1
  446. package/src/components/DetailsPage/DetailsPage.spec.tsx +0 -128
  447. package/src/components/Device/EditDeviceWizard/types.ts +0 -22
  448. package/src/components/Fleet/CreateFleet/types.ts +0 -33
  449. package/src/setupTests.ts +0 -21
  450. package/src/tests/test-utils.tsx +0 -21
  451. /package/dist/src/components/{UserPreferences → Masthead}/UserPreferencesModal.d.ts +0 -0
  452. /package/dist/src/components/{UserPreferences → Masthead}/UserPreferencesModal.js +0 -0
  453. /package/dist/src/components/{UserPreferences → Masthead}/UserPreferencesProvider.d.ts +0 -0
  454. /package/dist/src/components/{UserPreferences → Masthead}/UserPreferencesProvider.js +0 -0
  455. /package/src/components/{UserPreferences → Masthead}/UserPreferencesModal.tsx +0 -0
  456. /package/src/components/{UserPreferences → Masthead}/UserPreferencesProvider.tsx +0 -0
@@ -1,8 +1,8 @@
1
1
  import * as React from 'react';
2
- import { Alert, AlertActionLink, Stack, StackItem } from '@patternfly/react-core';
2
+ import { Alert, AlertActionLink, Bullseye, Spinner, Stack, StackItem } from '@patternfly/react-core';
3
3
  import { Device } from '@flightctl/types';
4
4
 
5
- import { useWebSocket } from '../../../hooks/useWebSocket';
5
+ import { WsMetadata, useWebSocket } from '../../../hooks/useWebSocket';
6
6
  import ErrorAlert from '../../ErrorAlert/ErrorAlert';
7
7
  import { useTranslation } from '../../../hooks/useTranslation';
8
8
  import Terminal, { ImperativeTerminalType } from '../../Terminal/Terminal';
@@ -14,16 +14,54 @@ type TerminalTabProps = {
14
14
  device: Device;
15
15
  };
16
16
 
17
+ const wsMeta: WsMetadata = {
18
+ tty: true,
19
+ term: 'xterm-256color',
20
+ };
21
+
17
22
  const TerminalTab = ({ device }: TerminalTabProps) => {
18
23
  const { t } = useTranslation();
19
24
  const terminal = React.useRef<ImperativeTerminalType>(null);
20
25
 
21
26
  const onMsgReceived = React.useCallback(async (message: Blob) => {
22
- const msg = await message.text();
23
- terminal.current?.onDataReceived(msg);
27
+ try {
28
+ const bytes = new Uint8Array(await message.arrayBuffer());
29
+ const msgType = bytes[0];
30
+ const decoder = new TextDecoder();
31
+ let str = decoder.decode(bytes.slice(1));
32
+
33
+ if (msgType === 3) {
34
+ try {
35
+ const err = JSON.parse(str) as { code: number; status: string };
36
+ if (err.status === 'Failure') {
37
+ str = `command terminated with non-zero exit code: exit status ${err.code}`;
38
+ } else {
39
+ return;
40
+ }
41
+ } catch {
42
+ // Nothing to do
43
+ }
44
+ }
45
+ terminal.current?.onDataReceived(str);
46
+ } catch (err) {
47
+ // eslint-disable-next-line
48
+ console.error(err);
49
+ }
24
50
  }, []);
25
51
 
26
- const { sendMessage, isClosed, error, reconnect } = useWebSocket(device.metadata.name || '', onMsgReceived);
52
+ const { sendMessage, isClosed, error, reconnect, isConnecting } = useWebSocket(
53
+ device.metadata.name || '',
54
+ onMsgReceived,
55
+ wsMeta,
56
+ );
57
+
58
+ if (isConnecting) {
59
+ return (
60
+ <Bullseye>
61
+ <Spinner />
62
+ </Bullseye>
63
+ );
64
+ }
27
65
 
28
66
  if (error) {
29
67
  return <ErrorAlert error={error} />;
@@ -115,7 +115,8 @@ const DecommissionedDevicesTable = ({
115
115
  aria-label={t('Devices table')}
116
116
  loading={isFilterUpdating}
117
117
  columns={deviceColumns}
118
- emptyFilters={!hasFiltersEnabled}
118
+ hasFilters={hasFiltersEnabled}
119
+ clearFilters={() => setNameOrAlias('')}
119
120
  emptyData={devices.length === 0}
120
121
  isAllSelected={isAllSelected}
121
122
  onSelectAll={setAllSelected}
@@ -17,7 +17,7 @@ import {
17
17
  import { TimesIcon } from '@patternfly/react-icons/dist/js/icons/times-icon';
18
18
  import { SearchIcon } from '@patternfly/react-icons/dist/js/icons/search-icon';
19
19
 
20
- import { DeviceList, Fleet, FleetList } from '@flightctl/types';
20
+ import { Fleet, FleetList, LabelList } from '@flightctl/types';
21
21
  import { FlightCtlLabel } from '../../../types/extraTypes';
22
22
  import { isPromiseFulfilled } from '../../../types/typeUtils';
23
23
 
@@ -25,7 +25,7 @@ import TableTextSearch, { TableTextSearchProps } from '../../Table/TableTextSear
25
25
  import { useTranslation } from '../../../hooks/useTranslation';
26
26
  import { useFetch } from '../../../hooks/useFetch';
27
27
  import { commonQueries as queries } from '../../../utils/query';
28
- import { MAX_TOTAL_SEARCH_RESULTS, getSearchResultsCount } from '../../../utils/search';
28
+ import { MAX_TOTAL_SEARCH_RESULTS, getEmptyFleetSearch, getSearchResultsCount } from '../../../utils/search';
29
29
  import { labelToString, stringToLabel } from '../../../utils/labels';
30
30
 
31
31
  import './DeviceToolbarFilters.css';
@@ -41,15 +41,32 @@ type LabelFleetSelectorProps = {
41
41
  };
42
42
 
43
43
  const LabelFleetResults = ({
44
+ filterText,
44
45
  allLabels,
45
46
  fleetNames,
46
47
  isUpdating,
48
+ selectedFleetNames,
49
+ selectedLabels,
47
50
  }: {
51
+ filterText: string;
48
52
  isUpdating: boolean;
49
53
  fleetNames: string[];
54
+ selectedLabels: FlightCtlLabel[];
55
+ selectedFleetNames: string[];
50
56
  allLabels: FlightCtlLabel[];
51
57
  }) => {
52
58
  const { t } = useTranslation();
59
+ const regexp = React.useMemo(() => new RegExp(`(${filterText})`, 'g'), [filterText]);
60
+
61
+ const searchHighlighter = React.useCallback(
62
+ (text: string) => {
63
+ return text
64
+ .split(regexp)
65
+ .filter(Boolean)
66
+ .map((part, index) => (part.trim() === filterText ? <strong key={`part-${index}`}>{part}</strong> : part));
67
+ },
68
+ [filterText, regexp],
69
+ );
53
70
 
54
71
  if (isUpdating) {
55
72
  return (
@@ -74,9 +91,16 @@ const LabelFleetResults = ({
74
91
  .filter((_, index) => index < visibleLabels)
75
92
  .map((label) => {
76
93
  const labelStr = labelToString(label);
94
+ const labelStrParts = searchHighlighter(labelStr);
95
+ const isSelected = selectedLabels.map(labelToString).includes(labelStr);
77
96
  return (
78
- <SelectOption key={`label@@${labelStr}`} value={`label@@${labelStr}`}>
79
- {labelStr}
97
+ <SelectOption
98
+ key={`label@@${labelStr}`}
99
+ value={`label@@${labelStr}`}
100
+ hasCheckbox
101
+ isSelected={isSelected}
102
+ >
103
+ <span>{labelStrParts}</span>
80
104
  </SelectOption>
81
105
  );
82
106
  })}
@@ -88,11 +112,19 @@ const LabelFleetResults = ({
88
112
  <SelectList id="select-typeahead-fleets-listbox">
89
113
  {fleetNames
90
114
  .filter((_, index) => index < visibleFleets)
91
- .map((fleetName) => (
92
- <SelectOption key={`fleet@@${fleetName}`} value={`fleet@@${fleetName}`}>
93
- {fleetName}
94
- </SelectOption>
95
- ))}
115
+ .map((fleetName) => {
116
+ const fleetNameParts = searchHighlighter(fleetName);
117
+ return (
118
+ <SelectOption
119
+ key={`fleet@@${fleetName}`}
120
+ value={`fleet@@${fleetName}`}
121
+ hasCheckbox
122
+ isSelected={selectedFleetNames.includes(fleetName)}
123
+ >
124
+ <span>{fleetNameParts}</span>
125
+ </SelectOption>
126
+ );
127
+ })}
96
128
  </SelectList>
97
129
  </SelectGroup>
98
130
  )}
@@ -127,6 +159,7 @@ const LabelFleetSelector = ({ selectedFleetNames, selectedLabels, onSelect, plac
127
159
 
128
160
  const closeMenu = () => {
129
161
  setIsOpen(false);
162
+ setFilterText('');
130
163
  };
131
164
 
132
165
  const onInputClick = () => {
@@ -138,30 +171,20 @@ const LabelFleetSelector = ({ selectedFleetNames, selectedLabels, onSelect, plac
138
171
  };
139
172
 
140
173
  const fetchTextMatches = async (val: string) => {
141
- const labelMatches = get<DeviceList>(
142
- // We ask for more items since can't get a precise amount of labels while querying for devices
143
- queries.getDevicesWithExactLabelMatching([stringToLabel(val)], { limit: MAX_TOTAL_SEARCH_RESULTS * 2 }),
174
+ const searchOnlyLabels = val.includes('=');
175
+ const labelMatches = get<LabelList>(
176
+ queries.getDevicesWithPartialLabelMatching(val, { limit: MAX_TOTAL_SEARCH_RESULTS }),
144
177
  );
145
178
 
146
- const fleetMatches = get<FleetList>(queries.getFleetsWithNameMatching(val, { limit: MAX_TOTAL_SEARCH_RESULTS }));
179
+ const fleetMatches = searchOnlyLabels
180
+ ? Promise.resolve(getEmptyFleetSearch())
181
+ : get<FleetList>(queries.getFleetsWithNameMatching(val, { limit: MAX_TOTAL_SEARCH_RESULTS }));
147
182
 
148
183
  const [labelMatchResult, fleetMatchResult] = await Promise.allSettled([labelMatches, fleetMatches]);
149
184
 
150
185
  let newLabels: FlightCtlLabel[] = [];
151
186
  if (isPromiseFulfilled(labelMatchResult)) {
152
- // In case we somehow still receive partial label matches, we extract the actual labels
153
- const matchingLabels = labelMatchResult.value.items.reduce((prevLabels, newDevice) => {
154
- const deviceLabels = newDevice.metadata.labels || {};
155
- Object.entries(deviceLabels).forEach(([key, value]) => {
156
- const labelText = labelToString({ key, value });
157
- if (labelText.includes(val) && !prevLabels.includes(labelText)) {
158
- prevLabels.push(labelText);
159
- }
160
- });
161
- return prevLabels;
162
- }, [] as string[]);
163
-
164
- newLabels = matchingLabels.map(stringToLabel).sort();
187
+ newLabels = labelMatchResult.value.map(stringToLabel);
165
188
  }
166
189
 
167
190
  let newFleets: string[] = [];
@@ -194,10 +217,6 @@ const LabelFleetSelector = ({ selectedFleetNames, selectedLabels, onSelect, plac
194
217
  }
195
218
  };
196
219
 
197
- const selectedIds = selectedFleetNames
198
- .map((fleetName) => `fleet@@${fleetName}`)
199
- .concat(selectedLabels.map((label) => `label@@${labelToString(label)}`));
200
-
201
220
  const toggle = (toggleRef: React.Ref<MenuToggleElement>) => (
202
221
  <MenuToggle
203
222
  className="fctl-device-toolbar-filters__toggle"
@@ -240,7 +259,6 @@ const LabelFleetSelector = ({ selectedFleetNames, selectedLabels, onSelect, plac
240
259
  <Select
241
260
  id="fleet-label-typeahead-select-listbox"
242
261
  isOpen={isOpen}
243
- selected={selectedIds}
244
262
  onSelect={(_event, value) => {
245
263
  const valStr = value as string;
246
264
  const id = valStr.split('@@')[1];
@@ -249,8 +267,6 @@ const LabelFleetSelector = ({ selectedFleetNames, selectedLabels, onSelect, plac
249
267
  } else {
250
268
  onSelect('label', id);
251
269
  }
252
- setIsOpen(false);
253
- setFilterText('');
254
270
  }}
255
271
  onOpenChange={(isOpen) => {
256
272
  !isOpen && closeMenu();
@@ -258,7 +274,14 @@ const LabelFleetSelector = ({ selectedFleetNames, selectedLabels, onSelect, plac
258
274
  toggle={toggle}
259
275
  >
260
276
  {filterText && (
261
- <LabelFleetResults isUpdating={isUpdating} fleetNames={fleetNameResults} allLabels={labelResults} />
277
+ <LabelFleetResults
278
+ isUpdating={isUpdating}
279
+ filterText={filterText}
280
+ fleetNames={fleetNameResults}
281
+ selectedFleetNames={selectedFleetNames}
282
+ allLabels={labelResults}
283
+ selectedLabels={selectedLabels}
284
+ />
262
285
  )}
263
286
  </Select>
264
287
  );
@@ -324,16 +347,21 @@ const DeviceToolbarFilter = ({
324
347
  };
325
348
 
326
349
  const onSelectFleetOrLabel = (type: 'fleet' | 'label', id: string) => {
327
- // Selecting a previously selected label does nothing. Labels can only be removed from the chips.
328
350
  if (type === 'fleet') {
329
351
  const isSelected = selectedFleetNames.includes(id);
330
- if (!isSelected) {
352
+
353
+ if (isSelected) {
354
+ setSelectedFleets(selectedFleetNames.filter((name) => name !== id));
355
+ } else {
331
356
  setSelectedFleets(selectedFleetNames.concat([id]));
332
357
  }
333
358
  } else {
334
359
  const isSelected = selectedLabels.some((label) => labelToString(label) === id);
335
- if (!isSelected) {
336
- const [key, val] = id.split('=');
360
+ const [key, val] = id.split('=');
361
+
362
+ if (isSelected) {
363
+ setSelectedLabels(selectedLabels.filter((label) => label.key !== key || label.value !== val));
364
+ } else {
337
365
  setSelectedLabels(selectedLabels.concat([{ key, value: val }]));
338
366
  }
339
367
  }
@@ -36,6 +36,15 @@ const DevicesPage = ({ canListER }: { canListER: boolean }) => {
36
36
  setSelectedLabels,
37
37
  } = useDeviceBackendFilters();
38
38
  const [onlyDecommissioned, setOnlyDecommissioned] = React.useState<boolean>(false);
39
+ const [showDeviceListBadge, setShowDeviceListBadge] = React.useState<boolean>(true);
40
+
41
+ const onEmptyErChanged = React.useCallback((isEmpty: boolean) => {
42
+ if (isEmpty) {
43
+ setShowDeviceListBadge(true);
44
+ } else {
45
+ setShowDeviceListBadge(false);
46
+ }
47
+ }, []);
39
48
 
40
49
  const { currentPage, setCurrentPage, onPageFetched, nextContinue, itemCount } = useTablePagination<DeviceList>(
41
50
  onlyDecommissioned ? undefined : removeDecommissionedDevices,
@@ -62,9 +71,9 @@ const DevicesPage = ({ canListER }: { canListER: boolean }) => {
62
71
 
63
72
  return (
64
73
  <>
65
- {canListER && <EnrollmentRequestList refetchDevices={refetch} />}
74
+ {canListER && <EnrollmentRequestList onEmptyListChanged={onEmptyErChanged} refetchDevices={refetch} />}
66
75
 
67
- <ListPage title={t('Devices')}>
76
+ <ListPage title={t('Devices')} withBadge={showDeviceListBadge}>
68
77
  {/* When searching for decommissioned devices we want to avoid showing the enrolled devices */}
69
78
  <ListPageBody error={error} loading={loading || (onlyDecommissioned && updating && !hasFiltersEnabled)}>
70
79
  {onlyDecommissioned ? (
@@ -110,6 +110,19 @@ const EnrolledDevicesTable = ({
110
110
  const [canEdit] = useAccessReview(RESOURCE.DEVICE, VERB.PATCH);
111
111
  const [canDecommission] = useAccessReview(RESOURCE.DEVICE_DECOMMISSION, VERB.UPDATE);
112
112
 
113
+ const clearAllFilters = () => {
114
+ if (hasFiltersEnabled) {
115
+ setActiveStatuses({
116
+ [FilterSearchParams.AppStatus]: [],
117
+ [FilterSearchParams.DeviceStatus]: [],
118
+ [FilterSearchParams.UpdatedStatus]: [],
119
+ });
120
+ setOwnerFleets([]);
121
+ setNameOrAlias('');
122
+ setSelectedLabels([]);
123
+ }
124
+ };
125
+
113
126
  return (
114
127
  <>
115
128
  <DeviceTableToolbar
@@ -145,16 +158,7 @@ const EnrolledDevicesTable = ({
145
158
  label={t('Show only decommissioned devices')}
146
159
  isChecked={false}
147
160
  onChange={() => {
148
- if (hasFiltersEnabled) {
149
- setActiveStatuses({
150
- [FilterSearchParams.AppStatus]: [],
151
- [FilterSearchParams.DeviceStatus]: [],
152
- [FilterSearchParams.UpdatedStatus]: [],
153
- });
154
- setOwnerFleets([]);
155
- setNameOrAlias('');
156
- setSelectedLabels([]);
157
- }
161
+ clearAllFilters();
158
162
  setOnlyDecommissioned(true);
159
163
  }}
160
164
  ouiaId={t('Show only decommissioned devices')}
@@ -165,7 +169,8 @@ const EnrolledDevicesTable = ({
165
169
  aria-label={t('Enrolled devices table')}
166
170
  loading={isFilterUpdating}
167
171
  columns={deviceColumns}
168
- emptyFilters={!hasFiltersEnabled}
172
+ hasFilters={hasFiltersEnabled}
173
+ clearFilters={clearAllFilters}
169
174
  emptyData={devices.length === 0}
170
175
  isAllSelected={isAllSelected}
171
176
  onSelectAll={setAllSelected}
@@ -14,7 +14,8 @@ import {
14
14
  } from '@patternfly/react-core';
15
15
 
16
16
  import { Device } from '@flightctl/types';
17
- import { EditDeviceFormValues } from './types';
17
+ import { getUpdatePolicyValues } from '../../Fleet/CreateFleet/fleetSpecUtils';
18
+ import { EditDeviceFormValues } from './../../../types/deviceSpec';
18
19
  import { getErrorMessage } from '../../../utils/error';
19
20
  import { fromAPILabel } from '../../../utils/labels';
20
21
  import { getEditDisabledReason } from '../../../utils/devices';
@@ -24,6 +25,7 @@ import LeaveFormConfirmation from '../../common/LeaveFormConfirmation';
24
25
  import ErrorBoundary from '../../common/ErrorBoundary';
25
26
  import GeneralInfoStep, { generalInfoStepId, isGeneralInfoStepValid } from './steps/GeneralInfoStep';
26
27
  import DeviceTemplateStep, { deviceTemplateStepId, isDeviceTemplateStepValid } from './steps/DeviceTemplateStep';
28
+ import DeviceUpdateStep, { deviceUpdatePolicyStepId, isUpdatePolicyStepValid } from './steps/DeviceUpdateStep';
27
29
  import ReviewDeviceStep, { reviewDeviceStepId } from './steps/ReviewDeviceStep';
28
30
  import { getDevicePatches, getValidationSchema } from './utils';
29
31
  import { getApplicationValues, getConfigTemplatesValues, hasMicroshiftRegistrationConfig } from './deviceSpecUtils';
@@ -82,6 +84,7 @@ const EditDeviceWizard = () => {
82
84
  applications: getApplicationValues(device.spec),
83
85
  systemdUnits: [],
84
86
  registerMicroShift,
87
+ updatePolicy: getUpdatePolicyValues(device.spec?.updatePolicy),
85
88
  }}
86
89
  validationSchema={getValidationSchema(t)}
87
90
  validateOnMount
@@ -101,9 +104,12 @@ const EditDeviceWizard = () => {
101
104
  {({ values, errors: formikErrors }) => {
102
105
  const generalStepValid = isGeneralInfoStepValid(formikErrors);
103
106
  const templateStepValid = isDeviceTemplateStepValid(formikErrors);
107
+ const updateStepValid = isUpdatePolicyStepValid(formikErrors);
104
108
 
105
109
  const canEditTemplate = !values.fleetMatch;
106
110
  const isTemplateStepDisabled = !(generalStepValid && canEditTemplate);
111
+ const isUpdateStepDisabled = !templateStepValid;
112
+
107
113
  return (
108
114
  <>
109
115
  <LeaveFormConfirmation />
@@ -123,7 +129,10 @@ const EditDeviceWizard = () => {
123
129
  <WizardStep name={t('Device template')} id={deviceTemplateStepId} isDisabled={isTemplateStepDisabled}>
124
130
  <DeviceTemplateStep isFleet={false} />
125
131
  </WizardStep>
126
- <WizardStep name={t('Review and save')} id={reviewDeviceStepId} isDisabled={!templateStepValid}>
132
+ <WizardStep name={t('Updates')} id={deviceUpdatePolicyStepId} isDisabled={isUpdateStepDisabled}>
133
+ <DeviceUpdateStep />
134
+ </WizardStep>
135
+ <WizardStep name={t('Review and save')} id={reviewDeviceStepId} isDisabled={!updateStepValid}>
127
136
  <ReviewDeviceStep error={submitError} />
128
137
  </WizardStep>
129
138
  </Wizard>
@@ -2,34 +2,50 @@ import * as React from 'react';
2
2
  import { useFormikContext } from 'formik';
3
3
  import { Button, WizardFooterWrapper, useWizardContext } from '@patternfly/react-core';
4
4
 
5
- import { EditDeviceFormValues } from './types';
5
+ import { EditDeviceFormValues } from '../../../types/deviceSpec';
6
6
  import { useTranslation } from '../../../hooks/useTranslation';
7
7
  import { useNavigate } from '../../../hooks/useNavigate';
8
8
  import { generalInfoStepId, isGeneralInfoStepValid } from './steps/GeneralInfoStep';
9
9
  import { deviceTemplateStepId, isDeviceTemplateStepValid } from './steps/DeviceTemplateStep';
10
10
  import { reviewDeviceStepId } from './steps/ReviewDeviceStep';
11
+ import { deviceUpdatePolicyStepId, isUpdatePolicyStepValid } from './steps/DeviceUpdateStep';
11
12
 
12
13
  const EditDeviceWizardFooter = () => {
13
14
  const { t } = useTranslation();
14
15
  const { goToNextStep, goToPrevStep, activeStep } = useWizardContext();
15
16
  const { submitForm, isSubmitting, errors } = useFormikContext<EditDeviceFormValues>();
16
17
  const navigate = useNavigate();
18
+ const buttonRef = React.useRef<HTMLButtonElement>();
17
19
 
18
20
  const isSubmitStep = activeStep.id === reviewDeviceStepId;
19
21
 
20
22
  let isStepValid = true;
21
- if (activeStep.id === generalInfoStepId) {
22
- isStepValid = isGeneralInfoStepValid(errors);
23
- } else if (activeStep.id === deviceTemplateStepId) {
24
- isStepValid = isDeviceTemplateStepValid(errors);
23
+ switch (activeStep.id) {
24
+ case generalInfoStepId:
25
+ isStepValid = isGeneralInfoStepValid(errors);
26
+ break;
27
+ case deviceTemplateStepId:
28
+ isStepValid = isDeviceTemplateStepValid(errors);
29
+ break;
30
+ case deviceUpdatePolicyStepId:
31
+ isStepValid = isUpdatePolicyStepValid(errors);
32
+ break;
33
+ default:
34
+ break;
25
35
  }
26
36
 
37
+ const onMoveNext = () => {
38
+ goToNextStep();
39
+ // Blur the button, otherwise it keeps the focus from the previous click
40
+ buttonRef.current?.blur();
41
+ };
42
+
27
43
  const primaryBtn = isSubmitStep ? (
28
44
  <Button variant="primary" onClick={submitForm} isDisabled={isSubmitting} isLoading={isSubmitting}>
29
45
  {t('Save')}
30
46
  </Button>
31
47
  ) : (
32
- <Button variant="primary" onClick={goToNextStep} isDisabled={!isStepValid}>
48
+ <Button variant="primary" onClick={onMoveNext} isDisabled={!isStepValid} ref={buttonRef}>
33
49
  {t('Next')}
34
50
  </Button>
35
51
  );
@@ -7,7 +7,8 @@ import { TFunction } from 'react-i18next';
7
7
 
8
8
  const generalInfoStepIndex = 0;
9
9
  const deviceTemplateStepIndex = 1;
10
- const reviewDeviceStepIndex = 2;
10
+ const deviceUpdatesStepIndex = 2;
11
+ const reviewDeviceStepIndex = 3;
11
12
 
12
13
  const disabledTemplateReason = (t: TFunction) =>
13
14
  t('The device will be bound to a fleet. As a result, its configurations cannot be edited directly.');
@@ -17,6 +18,7 @@ const EditDeviceWizardNav = () => {
17
18
  const { activeStep, steps, goToStepByIndex } = useWizardContext();
18
19
 
19
20
  const isEditTemplateDisabled = steps[deviceTemplateStepIndex]?.isDisabled;
21
+ const isDeviceUpdatesDisabled = steps[deviceUpdatesStepIndex]?.isDisabled;
20
22
  const isReviewDeviceDisabled = steps[reviewDeviceStepIndex]?.isDisabled;
21
23
 
22
24
  return (
@@ -39,8 +41,19 @@ const EditDeviceWizardNav = () => {
39
41
  goToStepByIndex(deviceTemplateStepIndex + 1);
40
42
  }
41
43
  }}
44
+ />
45
+ <WizardNavItem
46
+ stepIndex={deviceUpdatesStepIndex}
47
+ content={t('Updates')}
48
+ isCurrent={activeStep?.index === deviceUpdatesStepIndex + 1}
49
+ isDisabled={isDeviceUpdatesDisabled}
50
+ onClick={() => {
51
+ if (!isDeviceUpdatesDisabled) {
52
+ goToStepByIndex(deviceUpdatesStepIndex + 1);
53
+ }
54
+ }}
42
55
  >
43
- {isEditTemplateDisabled && (
56
+ {isDeviceUpdatesDisabled && (
44
57
  <Tooltip content={disabledTemplateReason(t)}>
45
58
  <Icon status="info" size="sm">
46
59
  <InfoCircleIcon />