@flightctl/ui-components 0.0.10 → 0.4.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 (452) hide show
  1. package/dist/src/components/DetailsPage/Tables/ApplicationsTable.css +7 -0
  2. package/dist/src/components/DetailsPage/Tables/ApplicationsTable.d.ts +8 -1
  3. package/dist/src/components/DetailsPage/Tables/ApplicationsTable.d.ts.map +1 -1
  4. package/dist/src/components/DetailsPage/Tables/ApplicationsTable.js +91 -9
  5. package/dist/src/components/DetailsPage/Tables/ApplicationsTable.js.map +1 -1
  6. package/dist/src/components/Device/AddDeviceModal/AddDeviceModal.d.ts.map +1 -1
  7. package/dist/src/components/Device/AddDeviceModal/AddDeviceModal.js +15 -51
  8. package/dist/src/components/Device/AddDeviceModal/AddDeviceModal.js.map +1 -1
  9. package/dist/src/components/Device/DeviceDetails/DeviceApplications.d.ts +10 -0
  10. package/dist/src/components/Device/DeviceDetails/DeviceApplications.d.ts.map +1 -0
  11. package/dist/src/components/Device/DeviceDetails/DeviceApplications.js +65 -0
  12. package/dist/src/components/Device/DeviceDetails/DeviceApplications.js.map +1 -0
  13. package/dist/src/components/Device/DeviceDetails/DeviceDetailsPage.d.ts +5 -4
  14. package/dist/src/components/Device/DeviceDetails/DeviceDetailsPage.d.ts.map +1 -1
  15. package/dist/src/components/Device/DeviceDetails/DeviceDetailsPage.js +18 -9
  16. package/dist/src/components/Device/DeviceDetails/DeviceDetailsPage.js.map +1 -1
  17. package/dist/src/components/Device/DeviceDetails/DeviceDetailsTab.d.ts +3 -4
  18. package/dist/src/components/Device/DeviceDetails/DeviceDetailsTab.d.ts.map +1 -1
  19. package/dist/src/components/Device/DeviceDetails/DeviceDetailsTab.js +6 -18
  20. package/dist/src/components/Device/DeviceDetails/DeviceDetailsTab.js.map +1 -1
  21. package/dist/src/components/Device/DeviceDetails/TerminalTab.d.ts +4 -3
  22. package/dist/src/components/Device/DeviceDetails/TerminalTab.d.ts.map +1 -1
  23. package/dist/src/components/Device/DeviceDetails/TerminalTab.js +13 -4
  24. package/dist/src/components/Device/DeviceDetails/TerminalTab.js.map +1 -1
  25. package/dist/src/components/Device/DevicesPage/DeviceFilterSelect.d.ts.map +1 -1
  26. package/dist/src/components/Device/DevicesPage/DeviceFilterSelect.js +4 -14
  27. package/dist/src/components/Device/DevicesPage/DeviceFilterSelect.js.map +1 -1
  28. package/dist/src/components/Device/DevicesPage/DeviceTableRow.d.ts +2 -0
  29. package/dist/src/components/Device/DevicesPage/DeviceTableRow.d.ts.map +1 -1
  30. package/dist/src/components/Device/DevicesPage/DeviceTableRow.js +14 -6
  31. package/dist/src/components/Device/DevicesPage/DeviceTableRow.js.map +1 -1
  32. package/dist/src/components/Device/DevicesPage/DeviceTableToolbar.d.ts +0 -3
  33. package/dist/src/components/Device/DevicesPage/DeviceTableToolbar.d.ts.map +1 -1
  34. package/dist/src/components/Device/DevicesPage/DeviceTableToolbar.js +2 -2
  35. package/dist/src/components/Device/DevicesPage/DeviceTableToolbar.js.map +1 -1
  36. package/dist/src/components/Device/DevicesPage/DeviceToolbarFilters.d.ts +1 -4
  37. package/dist/src/components/Device/DevicesPage/DeviceToolbarFilters.d.ts.map +1 -1
  38. package/dist/src/components/Device/DevicesPage/DeviceToolbarFilters.js +70 -16
  39. package/dist/src/components/Device/DevicesPage/DeviceToolbarFilters.js.map +1 -1
  40. package/dist/src/components/Device/DevicesPage/DevicesPage.d.ts +6 -8
  41. package/dist/src/components/Device/DevicesPage/DevicesPage.d.ts.map +1 -1
  42. package/dist/src/components/Device/DevicesPage/DevicesPage.js +41 -37
  43. package/dist/src/components/Device/DevicesPage/DevicesPage.js.map +1 -1
  44. package/dist/src/components/Device/DevicesPage/types.d.ts +1 -10
  45. package/dist/src/components/Device/DevicesPage/types.d.ts.map +1 -1
  46. package/dist/src/components/Device/DevicesPage/types.js.map +1 -1
  47. package/dist/src/components/Device/DevicesPage/useDevices.d.ts +9 -10
  48. package/dist/src/components/Device/DevicesPage/useDevices.d.ts.map +1 -1
  49. package/dist/src/components/Device/DevicesPage/useDevices.js +9 -29
  50. package/dist/src/components/Device/DevicesPage/useDevices.js.map +1 -1
  51. package/dist/src/components/Device/EditDeviceWizard/EditDeviceWizard.d.ts +2 -2
  52. package/dist/src/components/Device/EditDeviceWizard/EditDeviceWizard.d.ts.map +1 -1
  53. package/dist/src/components/Device/EditDeviceWizard/EditDeviceWizard.js +19 -4
  54. package/dist/src/components/Device/EditDeviceWizard/EditDeviceWizard.js.map +1 -1
  55. package/dist/src/components/Device/EditDeviceWizard/deviceSpecUtils.d.ts +7 -2
  56. package/dist/src/components/Device/EditDeviceWizard/deviceSpecUtils.d.ts.map +1 -1
  57. package/dist/src/components/Device/EditDeviceWizard/deviceSpecUtils.js +99 -7
  58. package/dist/src/components/Device/EditDeviceWizard/deviceSpecUtils.js.map +1 -1
  59. package/dist/src/components/Device/EditDeviceWizard/steps/ApplicationTemplates.d.ts +5 -0
  60. package/dist/src/components/Device/EditDeviceWizard/steps/ApplicationTemplates.d.ts.map +1 -0
  61. package/dist/src/components/Device/EditDeviceWizard/steps/{ApplicationsForm.js → ApplicationTemplates.js} +31 -24
  62. package/dist/src/components/Device/EditDeviceWizard/steps/ApplicationTemplates.js.map +1 -0
  63. package/dist/src/components/Device/EditDeviceWizard/steps/ConfigInlineTemplateForm.d.ts.map +1 -1
  64. package/dist/src/components/Device/EditDeviceWizard/steps/ConfigInlineTemplateForm.js +9 -10
  65. package/dist/src/components/Device/EditDeviceWizard/steps/ConfigInlineTemplateForm.js.map +1 -1
  66. package/dist/src/components/Device/EditDeviceWizard/steps/ConfigWithRepositoryTemplateForm.d.ts +2 -1
  67. package/dist/src/components/Device/EditDeviceWizard/steps/ConfigWithRepositoryTemplateForm.d.ts.map +1 -1
  68. package/dist/src/components/Device/EditDeviceWizard/steps/ConfigWithRepositoryTemplateForm.js +5 -6
  69. package/dist/src/components/Device/EditDeviceWizard/steps/ConfigWithRepositoryTemplateForm.js.map +1 -1
  70. package/dist/src/components/Device/EditDeviceWizard/steps/ConfigurationTemplates.d.ts +4 -0
  71. package/dist/src/components/Device/EditDeviceWizard/steps/ConfigurationTemplates.d.ts.map +1 -0
  72. package/dist/src/components/Device/EditDeviceWizard/steps/{ConfigTemplateForm.js → ConfigurationTemplates.js} +42 -28
  73. package/dist/src/components/Device/EditDeviceWizard/steps/ConfigurationTemplates.js.map +1 -0
  74. package/dist/src/components/Device/EditDeviceWizard/steps/DeviceTemplateStep.d.ts.map +1 -1
  75. package/dist/src/components/Device/EditDeviceWizard/steps/DeviceTemplateStep.js +53 -12
  76. package/dist/src/components/Device/EditDeviceWizard/steps/DeviceTemplateStep.js.map +1 -1
  77. package/dist/src/components/Device/EditDeviceWizard/steps/ReviewTrackedSystemdServices.d.ts +7 -0
  78. package/dist/src/components/Device/EditDeviceWizard/steps/ReviewTrackedSystemdServices.d.ts.map +1 -0
  79. package/dist/src/components/Device/EditDeviceWizard/steps/ReviewTrackedSystemdServices.js +13 -0
  80. package/dist/src/components/Device/EditDeviceWizard/steps/ReviewTrackedSystemdServices.js.map +1 -0
  81. package/dist/src/components/Device/EditDeviceWizard/steps/SystemdUnitsForm.d.ts +4 -0
  82. package/dist/src/components/Device/EditDeviceWizard/steps/SystemdUnitsForm.d.ts.map +1 -0
  83. package/dist/src/components/Device/EditDeviceWizard/steps/SystemdUnitsForm.js +38 -0
  84. package/dist/src/components/Device/EditDeviceWizard/steps/SystemdUnitsForm.js.map +1 -0
  85. package/dist/src/components/Device/EditDeviceWizard/types.d.ts +3 -0
  86. package/dist/src/components/Device/EditDeviceWizard/types.d.ts.map +1 -1
  87. package/dist/src/components/Device/EditDeviceWizard/utils.d.ts +1 -0
  88. package/dist/src/components/Device/EditDeviceWizard/utils.d.ts.map +1 -1
  89. package/dist/src/components/Device/EditDeviceWizard/utils.js +5 -2
  90. package/dist/src/components/Device/EditDeviceWizard/utils.js.map +1 -1
  91. package/dist/src/components/Device/{MatchPatternsModal/MatchPatternsModal.d.ts → SystemdUnitsModal/SystemdUnitsModal.d.ts} +6 -6
  92. package/dist/src/components/Device/SystemdUnitsModal/SystemdUnitsModal.d.ts.map +1 -0
  93. package/dist/src/components/Device/{MatchPatternsModal/MatchPatternsModal.js → SystemdUnitsModal/SystemdUnitsModal.js} +28 -15
  94. package/dist/src/components/Device/SystemdUnitsModal/SystemdUnitsModal.js.map +1 -0
  95. package/dist/src/components/Device/SystemdUnitsModal/TrackSystemdUnitsForm.d.ts +15 -0
  96. package/dist/src/components/Device/SystemdUnitsModal/TrackSystemdUnitsForm.d.ts.map +1 -0
  97. package/dist/src/components/Device/SystemdUnitsModal/TrackSystemdUnitsForm.js +57 -0
  98. package/dist/src/components/Device/SystemdUnitsModal/TrackSystemdUnitsForm.js.map +1 -0
  99. package/dist/src/components/EnrollmentRequest/EnrollmentRequestDetails/EnrollmentRequestDetails.d.ts +2 -2
  100. package/dist/src/components/EnrollmentRequest/EnrollmentRequestDetails/EnrollmentRequestDetails.d.ts.map +1 -1
  101. package/dist/src/components/EnrollmentRequest/EnrollmentRequestDetails/EnrollmentRequestDetails.js +14 -4
  102. package/dist/src/components/EnrollmentRequest/EnrollmentRequestDetails/EnrollmentRequestDetails.js.map +1 -1
  103. package/dist/src/components/EnrollmentRequest/EnrollmentRequestList.d.ts +9 -0
  104. package/dist/src/components/EnrollmentRequest/EnrollmentRequestList.d.ts.map +1 -0
  105. package/dist/src/components/{Device/DevicesPage → EnrollmentRequest}/EnrollmentRequestList.js +40 -38
  106. package/dist/src/components/EnrollmentRequest/EnrollmentRequestList.js.map +1 -0
  107. package/dist/src/components/EnrollmentRequest/EnrollmentRequestTableRow.d.ts +2 -0
  108. package/dist/src/components/EnrollmentRequest/EnrollmentRequestTableRow.d.ts.map +1 -1
  109. package/dist/src/components/EnrollmentRequest/EnrollmentRequestTableRow.js +15 -11
  110. package/dist/src/components/EnrollmentRequest/EnrollmentRequestTableRow.js.map +1 -1
  111. package/dist/src/components/{Device/DevicesPage → EnrollmentRequest}/EnrollmentRequestTableToolbar.d.ts +1 -1
  112. package/dist/src/components/EnrollmentRequest/EnrollmentRequestTableToolbar.d.ts.map +1 -0
  113. package/dist/src/components/{Device/DevicesPage → EnrollmentRequest}/EnrollmentRequestTableToolbar.js +2 -2
  114. package/dist/src/components/EnrollmentRequest/EnrollmentRequestTableToolbar.js.map +1 -0
  115. package/dist/src/components/EnrollmentRequest/useEnrollmentRequests.d.ts +9 -0
  116. package/dist/src/components/EnrollmentRequest/useEnrollmentRequests.d.ts.map +1 -0
  117. package/dist/src/components/EnrollmentRequest/useEnrollmentRequests.js +42 -0
  118. package/dist/src/components/EnrollmentRequest/useEnrollmentRequests.js.map +1 -0
  119. package/dist/src/components/Fleet/CreateFleet/CreateFleetWizard.d.ts +2 -2
  120. package/dist/src/components/Fleet/CreateFleet/CreateFleetWizard.d.ts.map +1 -1
  121. package/dist/src/components/Fleet/CreateFleet/CreateFleetWizard.js +19 -2
  122. package/dist/src/components/Fleet/CreateFleet/CreateFleetWizard.js.map +1 -1
  123. package/dist/src/components/Fleet/CreateFleet/steps/DeviceLabelSelector.d.ts.map +1 -1
  124. package/dist/src/components/Fleet/CreateFleet/steps/DeviceLabelSelector.js +2 -4
  125. package/dist/src/components/Fleet/CreateFleet/steps/DeviceLabelSelector.js.map +1 -1
  126. package/dist/src/components/Fleet/CreateFleet/steps/ReviewStep.d.ts.map +1 -1
  127. package/dist/src/components/Fleet/CreateFleet/steps/ReviewStep.js +6 -1
  128. package/dist/src/components/Fleet/CreateFleet/steps/ReviewStep.js.map +1 -1
  129. package/dist/src/components/Fleet/CreateFleet/utils.d.ts.map +1 -1
  130. package/dist/src/components/Fleet/CreateFleet/utils.js +61 -35
  131. package/dist/src/components/Fleet/CreateFleet/utils.js.map +1 -1
  132. package/dist/src/components/Fleet/FleetDetails/FleetDetails.d.ts +2 -2
  133. package/dist/src/components/Fleet/FleetDetails/FleetDetails.d.ts.map +1 -1
  134. package/dist/src/components/Fleet/FleetDetails/FleetDetails.js +16 -6
  135. package/dist/src/components/Fleet/FleetDetails/FleetDetails.js.map +1 -1
  136. package/dist/src/components/Fleet/FleetResourceSyncs.d.ts +2 -5
  137. package/dist/src/components/Fleet/FleetResourceSyncs.d.ts.map +1 -1
  138. package/dist/src/components/Fleet/FleetResourceSyncs.js +38 -24
  139. package/dist/src/components/Fleet/FleetResourceSyncs.js.map +1 -1
  140. package/dist/src/components/Fleet/FleetRow.d.ts +2 -0
  141. package/dist/src/components/Fleet/FleetRow.d.ts.map +1 -1
  142. package/dist/src/components/Fleet/FleetRow.js +16 -14
  143. package/dist/src/components/Fleet/FleetRow.js.map +1 -1
  144. package/dist/src/components/Fleet/FleetsPage.d.ts +2 -2
  145. package/dist/src/components/Fleet/FleetsPage.d.ts.map +1 -1
  146. package/dist/src/components/Fleet/FleetsPage.js +34 -24
  147. package/dist/src/components/Fleet/FleetsPage.js.map +1 -1
  148. package/dist/src/components/Fleet/ImportFleetWizard/ImportFleetWizard.d.ts +2 -2
  149. package/dist/src/components/Fleet/ImportFleetWizard/ImportFleetWizard.d.ts.map +1 -1
  150. package/dist/src/components/Fleet/ImportFleetWizard/ImportFleetWizard.js +11 -2
  151. package/dist/src/components/Fleet/ImportFleetWizard/ImportFleetWizard.js.map +1 -1
  152. package/dist/src/components/Fleet/ImportFleetWizard/steps/RepositoryStep.d.ts.map +1 -1
  153. package/dist/src/components/Fleet/ImportFleetWizard/steps/RepositoryStep.js +5 -2
  154. package/dist/src/components/Fleet/ImportFleetWizard/steps/RepositoryStep.js.map +1 -1
  155. package/dist/src/components/Fleet/useFleets.d.ts +11 -3
  156. package/dist/src/components/Fleet/useFleets.d.ts.map +1 -1
  157. package/dist/src/components/Fleet/useFleets.js +22 -12
  158. package/dist/src/components/Fleet/useFleets.js.map +1 -1
  159. package/dist/src/components/OverviewPage/Cards/Status/StatusCard.d.ts.map +1 -1
  160. package/dist/src/components/OverviewPage/Cards/Status/StatusCard.js +5 -14
  161. package/dist/src/components/OverviewPage/Cards/Status/StatusCard.js.map +1 -1
  162. package/dist/src/components/OverviewPage/Cards/Status/StatusCardFilters.d.ts +0 -3
  163. package/dist/src/components/OverviewPage/Cards/Status/StatusCardFilters.d.ts.map +1 -1
  164. package/dist/src/components/OverviewPage/Cards/Status/StatusCardFilters.js +2 -2
  165. package/dist/src/components/OverviewPage/Cards/Status/StatusCardFilters.js.map +1 -1
  166. package/dist/src/components/OverviewPage/Overview.d.ts.map +1 -1
  167. package/dist/src/components/OverviewPage/Overview.js +11 -5
  168. package/dist/src/components/OverviewPage/Overview.js.map +1 -1
  169. package/dist/src/components/Repository/CreateRepository/CreateRepository.d.ts +2 -2
  170. package/dist/src/components/Repository/CreateRepository/CreateRepository.d.ts.map +1 -1
  171. package/dist/src/components/Repository/CreateRepository/CreateRepository.js +15 -6
  172. package/dist/src/components/Repository/CreateRepository/CreateRepository.js.map +1 -1
  173. package/dist/src/components/Repository/CreateRepository/CreateRepositoryForm.d.ts.map +1 -1
  174. package/dist/src/components/Repository/CreateRepository/CreateRepositoryForm.js +4 -1
  175. package/dist/src/components/Repository/CreateRepository/CreateRepositoryForm.js.map +1 -1
  176. package/dist/src/components/Repository/CreateRepository/utils.d.ts.map +1 -1
  177. package/dist/src/components/Repository/CreateRepository/utils.js +22 -6
  178. package/dist/src/components/Repository/CreateRepository/utils.js.map +1 -1
  179. package/dist/src/components/Repository/RepositoryDetails/DeleteRepositoryModal.d.ts.map +1 -1
  180. package/dist/src/components/Repository/RepositoryDetails/DeleteRepositoryModal.js +3 -2
  181. package/dist/src/components/Repository/RepositoryDetails/DeleteRepositoryModal.js.map +1 -1
  182. package/dist/src/components/Repository/RepositoryDetails/RepositoryDetails.d.ts +2 -2
  183. package/dist/src/components/Repository/RepositoryDetails/RepositoryDetails.d.ts.map +1 -1
  184. package/dist/src/components/Repository/RepositoryDetails/RepositoryDetails.js +16 -5
  185. package/dist/src/components/Repository/RepositoryDetails/RepositoryDetails.js.map +1 -1
  186. package/dist/src/components/Repository/RepositoryList.d.ts +0 -1
  187. package/dist/src/components/Repository/RepositoryList.d.ts.map +1 -1
  188. package/dist/src/components/Repository/RepositoryList.js +55 -46
  189. package/dist/src/components/Repository/RepositoryList.js.map +1 -1
  190. package/dist/src/components/Repository/useRepositories.d.ts +16 -0
  191. package/dist/src/components/Repository/useRepositories.d.ts.map +1 -0
  192. package/dist/src/components/Repository/useRepositories.js +40 -0
  193. package/dist/src/components/Repository/useRepositories.js.map +1 -0
  194. package/dist/src/components/ResourceSync/RepositoryResourceSyncList.d.ts.map +1 -1
  195. package/dist/src/components/ResourceSync/RepositoryResourceSyncList.js +21 -23
  196. package/dist/src/components/ResourceSync/RepositoryResourceSyncList.js.map +1 -1
  197. package/dist/src/components/Table/Table.d.ts +0 -1
  198. package/dist/src/components/Table/Table.d.ts.map +1 -1
  199. package/dist/src/components/Table/Table.js +2 -2
  200. package/dist/src/components/Table/Table.js.map +1 -1
  201. package/dist/src/components/Table/TablePagination.d.ts +8 -0
  202. package/dist/src/components/Table/TablePagination.d.ts.map +1 -0
  203. package/dist/src/components/Table/TablePagination.js +38 -0
  204. package/dist/src/components/Table/TablePagination.js.map +1 -0
  205. package/dist/src/components/Terminal/Terminal.d.ts.map +1 -1
  206. package/dist/src/components/Terminal/Terminal.js +1 -0
  207. package/dist/src/components/Terminal/Terminal.js.map +1 -1
  208. package/dist/src/components/common/AccessDenied.d.ts +4 -0
  209. package/dist/src/components/common/AccessDenied.d.ts.map +1 -0
  210. package/dist/src/components/common/AccessDenied.js +15 -0
  211. package/dist/src/components/common/AccessDenied.js.map +1 -0
  212. package/dist/src/components/common/ButtonWithPermissions.d.ts +8 -0
  213. package/dist/src/components/common/ButtonWithPermissions.d.ts.map +1 -0
  214. package/dist/src/components/common/ButtonWithPermissions.js +12 -0
  215. package/dist/src/components/common/ButtonWithPermissions.js.map +1 -0
  216. package/dist/src/components/common/LearnMoreLink.d.ts +7 -0
  217. package/dist/src/components/common/LearnMoreLink.d.ts.map +1 -0
  218. package/dist/src/components/common/LearnMoreLink.js +13 -0
  219. package/dist/src/components/common/LearnMoreLink.js.map +1 -0
  220. package/dist/src/components/common/PageWithPermissions.d.ts +7 -0
  221. package/dist/src/components/common/PageWithPermissions.d.ts.map +1 -0
  222. package/dist/src/components/common/PageWithPermissions.js +17 -0
  223. package/dist/src/components/common/PageWithPermissions.js.map +1 -0
  224. package/dist/src/components/form/FilterSelect.d.ts +2 -4
  225. package/dist/src/components/form/FilterSelect.d.ts.map +1 -1
  226. package/dist/src/components/form/FilterSelect.js.map +1 -1
  227. package/dist/src/components/form/FlightCtlForm.css +3 -0
  228. package/dist/src/components/form/FlightCtlForm.d.ts +1 -0
  229. package/dist/src/components/form/FlightCtlForm.d.ts.map +1 -1
  230. package/dist/src/components/form/FlightCtlForm.js +2 -1
  231. package/dist/src/components/form/FlightCtlForm.js.map +1 -1
  232. package/dist/src/components/form/FormSelect.d.ts +1 -0
  233. package/dist/src/components/form/FormSelect.d.ts.map +1 -1
  234. package/dist/src/components/form/FormSelect.js +14 -2
  235. package/dist/src/components/form/FormSelect.js.map +1 -1
  236. package/dist/src/components/form/LabelsField.d.ts +2 -1
  237. package/dist/src/components/form/LabelsField.d.ts.map +1 -1
  238. package/dist/src/components/form/LabelsField.js +6 -6
  239. package/dist/src/components/form/LabelsField.js.map +1 -1
  240. package/dist/src/components/form/validations.d.ts +13 -2
  241. package/dist/src/components/form/validations.d.ts.map +1 -1
  242. package/dist/src/components/form/validations.js +39 -24
  243. package/dist/src/components/form/validations.js.map +1 -1
  244. package/dist/src/components/modals/ApproveDeviceModal/ApproveDeviceModal.d.ts.map +1 -1
  245. package/dist/src/components/modals/ApproveDeviceModal/ApproveDeviceModal.js +2 -5
  246. package/dist/src/components/modals/ApproveDeviceModal/ApproveDeviceModal.js.map +1 -1
  247. package/dist/src/components/modals/EditLabelsModal/EditLabelsForm.d.ts +2 -1
  248. package/dist/src/components/modals/EditLabelsModal/EditLabelsForm.d.ts.map +1 -1
  249. package/dist/src/components/modals/EditLabelsModal/EditLabelsForm.js +4 -4
  250. package/dist/src/components/modals/EditLabelsModal/EditLabelsForm.js.map +1 -1
  251. package/dist/src/components/modals/massModals/MassApproveDeviceModal/MassApproveDeviceModal.d.ts.map +1 -1
  252. package/dist/src/components/modals/massModals/MassApproveDeviceModal/MassApproveDeviceModal.js +2 -3
  253. package/dist/src/components/modals/massModals/MassApproveDeviceModal/MassApproveDeviceModal.js.map +1 -1
  254. package/dist/src/components/modals/massModals/MassDeleteRepositoryModal/MassDeleteRepositoryModal.d.ts +1 -1
  255. package/dist/src/components/modals/massModals/MassDeleteRepositoryModal/MassDeleteRepositoryModal.d.ts.map +1 -1
  256. package/dist/src/components/modals/massModals/MassDeleteRepositoryModal/MassDeleteRepositoryModal.js +6 -5
  257. package/dist/src/components/modals/massModals/MassDeleteRepositoryModal/MassDeleteRepositoryModal.js.map +1 -1
  258. package/dist/src/constants.d.ts +2 -1
  259. package/dist/src/constants.d.ts.map +1 -1
  260. package/dist/src/constants.js +3 -1
  261. package/dist/src/constants.js.map +1 -1
  262. package/dist/src/hooks/useAccessReview.d.ts +4 -0
  263. package/dist/src/hooks/useAccessReview.d.ts.map +1 -0
  264. package/dist/src/hooks/useAccessReview.js +33 -0
  265. package/dist/src/hooks/useAccessReview.js.map +1 -0
  266. package/dist/src/hooks/useAppContext.d.ts +4 -3
  267. package/dist/src/hooks/useAppContext.d.ts.map +1 -1
  268. package/dist/src/hooks/useAppContext.js +2 -2
  269. package/dist/src/hooks/useAppContext.js.map +1 -1
  270. package/dist/src/hooks/useFetch.d.ts +4 -2
  271. package/dist/src/hooks/useFetch.d.ts.map +1 -1
  272. package/dist/src/hooks/useFetchPeriodically.d.ts +1 -1
  273. package/dist/src/hooks/useFetchPeriodically.d.ts.map +1 -1
  274. package/dist/src/hooks/useFetchPeriodically.js +4 -1
  275. package/dist/src/hooks/useFetchPeriodically.js.map +1 -1
  276. package/dist/src/hooks/useFleetImportAccessReview.d.ts +3 -0
  277. package/dist/src/hooks/useFleetImportAccessReview.d.ts.map +1 -0
  278. package/dist/src/hooks/useFleetImportAccessReview.js +12 -0
  279. package/dist/src/hooks/useFleetImportAccessReview.js.map +1 -0
  280. package/dist/src/hooks/useTablePagination.d.ts +10 -0
  281. package/dist/src/hooks/useTablePagination.d.ts.map +1 -0
  282. package/dist/src/hooks/useTablePagination.js +33 -0
  283. package/dist/src/hooks/useTablePagination.js.map +1 -0
  284. package/dist/src/hooks/useWebSocket.d.ts +2 -2
  285. package/dist/src/hooks/useWebSocket.d.ts.map +1 -1
  286. package/dist/src/hooks/useWebSocket.js.map +1 -1
  287. package/dist/src/links.d.ts +3 -0
  288. package/dist/src/links.d.ts.map +1 -0
  289. package/dist/src/links.js +6 -0
  290. package/dist/src/links.js.map +1 -0
  291. package/dist/src/types/rbac.d.ts +18 -0
  292. package/dist/src/types/rbac.d.ts.map +1 -0
  293. package/dist/src/types/rbac.js +23 -0
  294. package/dist/src/types/rbac.js.map +1 -0
  295. package/dist/src/utils/api.d.ts +3 -3
  296. package/dist/src/utils/api.d.ts.map +1 -1
  297. package/dist/src/utils/api.js.map +1 -1
  298. package/dist/src/utils/labels.d.ts +1 -1
  299. package/dist/src/utils/labels.d.ts.map +1 -1
  300. package/dist/src/utils/labels.js +4 -8
  301. package/dist/src/utils/labels.js.map +1 -1
  302. package/dist/src/utils/query.d.ts +9 -0
  303. package/dist/src/utils/query.d.ts.map +1 -1
  304. package/dist/src/utils/query.js +33 -1
  305. package/dist/src/utils/query.js.map +1 -1
  306. package/dist/src/utils/search.d.ts +1 -0
  307. package/dist/src/utils/search.d.ts.map +1 -1
  308. package/dist/src/utils/search.js +7 -7
  309. package/dist/src/utils/search.js.map +1 -1
  310. package/package.json +5 -5
  311. package/src/components/DetailsPage/Tables/ApplicationsTable.css +7 -0
  312. package/src/components/DetailsPage/Tables/ApplicationsTable.tsx +150 -13
  313. package/src/components/Device/AddDeviceModal/AddDeviceModal.tsx +31 -132
  314. package/src/components/Device/DeviceDetails/DeviceApplications.tsx +102 -0
  315. package/src/components/Device/DeviceDetails/DeviceDetailsPage.tsx +33 -16
  316. package/src/components/Device/DeviceDetails/DeviceDetailsTab.tsx +8 -38
  317. package/src/components/Device/DeviceDetails/TerminalTab.tsx +21 -4
  318. package/src/components/Device/DevicesPage/DeviceFilterSelect.tsx +13 -34
  319. package/src/components/Device/DevicesPage/DeviceTableRow.tsx +21 -9
  320. package/src/components/Device/DevicesPage/DeviceTableToolbar.tsx +0 -7
  321. package/src/components/Device/DevicesPage/DeviceToolbarFilters.tsx +93 -40
  322. package/src/components/Device/DevicesPage/DevicesPage.tsx +64 -58
  323. package/src/components/Device/DevicesPage/types.ts +1 -13
  324. package/src/components/Device/DevicesPage/useDevices.ts +19 -38
  325. package/src/components/Device/EditDeviceWizard/EditDeviceWizard.tsx +24 -4
  326. package/src/components/Device/EditDeviceWizard/deviceSpecUtils.ts +156 -47
  327. package/src/components/Device/EditDeviceWizard/steps/{ApplicationsForm.tsx → ApplicationTemplates.tsx} +89 -53
  328. package/src/components/Device/EditDeviceWizard/steps/ConfigInlineTemplateForm.tsx +22 -26
  329. package/src/components/Device/EditDeviceWizard/steps/ConfigWithRepositoryTemplateForm.tsx +17 -12
  330. package/src/components/Device/EditDeviceWizard/steps/{ConfigTemplateForm.tsx → ConfigurationTemplates.tsx} +110 -52
  331. package/src/components/Device/EditDeviceWizard/steps/DeviceTemplateStep.tsx +108 -11
  332. package/src/components/Device/EditDeviceWizard/steps/ReviewTrackedSystemdServices.tsx +19 -0
  333. package/src/components/Device/EditDeviceWizard/steps/SystemdUnitsForm.tsx +75 -0
  334. package/src/components/Device/EditDeviceWizard/types.ts +3 -0
  335. package/src/components/Device/EditDeviceWizard/utils.ts +14 -4
  336. package/src/components/Device/{MatchPatternsModal/MatchPatternsModal.tsx → SystemdUnitsModal/SystemdUnitsModal.tsx} +36 -19
  337. package/src/components/Device/SystemdUnitsModal/TrackSystemdUnitsForm.tsx +114 -0
  338. package/src/components/EnrollmentRequest/EnrollmentRequestDetails/EnrollmentRequestDetails.tsx +28 -9
  339. package/src/components/{Device/DevicesPage → EnrollmentRequest}/EnrollmentRequestList.tsx +57 -48
  340. package/src/components/EnrollmentRequest/EnrollmentRequestTableRow.tsx +28 -17
  341. package/src/components/{Device/DevicesPage → EnrollmentRequest}/EnrollmentRequestTableToolbar.tsx +3 -2
  342. package/src/components/EnrollmentRequest/useEnrollmentRequests.ts +63 -0
  343. package/src/components/Fleet/CreateFleet/CreateFleetWizard.tsx +28 -2
  344. package/src/components/Fleet/CreateFleet/steps/DeviceLabelSelector.tsx +2 -5
  345. package/src/components/Fleet/CreateFleet/steps/ReviewStep.tsx +7 -0
  346. package/src/components/Fleet/CreateFleet/utils.ts +101 -49
  347. package/src/components/Fleet/FleetDetails/FleetDetails.tsx +57 -36
  348. package/src/components/Fleet/FleetResourceSyncs.tsx +53 -41
  349. package/src/components/Fleet/FleetRow.tsx +28 -16
  350. package/src/components/Fleet/FleetsPage.tsx +63 -53
  351. package/src/components/Fleet/ImportFleetWizard/ImportFleetWizard.tsx +16 -3
  352. package/src/components/Fleet/ImportFleetWizard/steps/RepositoryStep.tsx +25 -19
  353. package/src/components/Fleet/useFleets.ts +40 -22
  354. package/src/components/OverviewPage/Cards/Status/StatusCard.tsx +5 -18
  355. package/src/components/OverviewPage/Cards/Status/StatusCardFilters.tsx +0 -7
  356. package/src/components/OverviewPage/Overview.tsx +20 -8
  357. package/src/components/Repository/CreateRepository/CreateRepository.tsx +25 -9
  358. package/src/components/Repository/CreateRepository/CreateRepositoryForm.tsx +5 -2
  359. package/src/components/Repository/CreateRepository/utils.ts +23 -7
  360. package/src/components/Repository/RepositoryDetails/DeleteRepositoryModal.tsx +5 -3
  361. package/src/components/Repository/RepositoryDetails/RepositoryDetails.tsx +32 -10
  362. package/src/components/Repository/RepositoryList.tsx +113 -71
  363. package/src/components/Repository/useRepositories.ts +59 -0
  364. package/src/components/ResourceSync/RepositoryResourceSyncList.tsx +41 -40
  365. package/src/components/Table/Table.tsx +3 -4
  366. package/src/components/Table/TablePagination.tsx +74 -0
  367. package/src/components/Terminal/Terminal.tsx +1 -0
  368. package/src/components/common/AccessDenied.tsx +17 -0
  369. package/src/components/common/ButtonWithPermissions.tsx +14 -0
  370. package/src/components/common/LearnMoreLink.tsx +26 -0
  371. package/src/components/common/PageWithPermissions.tsx +19 -0
  372. package/src/components/form/FilterSelect.tsx +2 -4
  373. package/src/components/form/FlightCtlForm.css +3 -0
  374. package/src/components/form/FlightCtlForm.tsx +3 -1
  375. package/src/components/form/FormSelect.tsx +22 -2
  376. package/src/components/form/LabelsField.tsx +17 -13
  377. package/src/components/form/validations.ts +53 -25
  378. package/src/components/modals/ApproveDeviceModal/ApproveDeviceModal.tsx +2 -5
  379. package/src/components/modals/EditLabelsModal/EditLabelsForm.tsx +9 -4
  380. package/src/components/modals/massModals/MassApproveDeviceModal/MassApproveDeviceModal.tsx +2 -4
  381. package/src/components/modals/massModals/MassDeleteRepositoryModal/MassDeleteRepositoryModal.tsx +8 -5
  382. package/src/constants.ts +2 -1
  383. package/src/hooks/useAccessReview.ts +33 -0
  384. package/src/hooks/useAppContext.tsx +6 -5
  385. package/src/hooks/useFetchPeriodically.ts +4 -0
  386. package/src/hooks/useFleetImportAccessReview.ts +8 -0
  387. package/src/hooks/useTablePagination.tsx +44 -0
  388. package/src/hooks/useWebSocket.ts +4 -4
  389. package/src/links.ts +5 -0
  390. package/src/types/rbac.ts +18 -0
  391. package/src/utils/api.ts +3 -3
  392. package/src/utils/labels.ts +3 -7
  393. package/src/utils/query.ts +41 -0
  394. package/src/utils/search.ts +1 -1
  395. package/dist/src/components/DetailsPage/Tables/SystemdDetailsTable.d.ts +0 -12
  396. package/dist/src/components/DetailsPage/Tables/SystemdDetailsTable.d.ts.map +0 -1
  397. package/dist/src/components/DetailsPage/Tables/SystemdDetailsTable.js +0 -40
  398. package/dist/src/components/DetailsPage/Tables/SystemdDetailsTable.js.map +0 -1
  399. package/dist/src/components/Device/DeviceDetails/SystemdTable.d.ts +0 -10
  400. package/dist/src/components/Device/DeviceDetails/SystemdTable.d.ts.map +0 -1
  401. package/dist/src/components/Device/DeviceDetails/SystemdTable.js +0 -38
  402. package/dist/src/components/Device/DeviceDetails/SystemdTable.js.map +0 -1
  403. package/dist/src/components/Device/DevicesPage/EnrollmentRequestList.d.ts +0 -6
  404. package/dist/src/components/Device/DevicesPage/EnrollmentRequestList.d.ts.map +0 -1
  405. package/dist/src/components/Device/DevicesPage/EnrollmentRequestList.js.map +0 -1
  406. package/dist/src/components/Device/DevicesPage/EnrollmentRequestTableToolbar.d.ts.map +0 -1
  407. package/dist/src/components/Device/DevicesPage/EnrollmentRequestTableToolbar.js.map +0 -1
  408. package/dist/src/components/Device/EditDeviceWizard/steps/ApplicationsForm.d.ts +0 -5
  409. package/dist/src/components/Device/EditDeviceWizard/steps/ApplicationsForm.d.ts.map +0 -1
  410. package/dist/src/components/Device/EditDeviceWizard/steps/ApplicationsForm.js.map +0 -1
  411. package/dist/src/components/Device/EditDeviceWizard/steps/ConfigTemplateForm.d.ts +0 -4
  412. package/dist/src/components/Device/EditDeviceWizard/steps/ConfigTemplateForm.d.ts.map +0 -1
  413. package/dist/src/components/Device/EditDeviceWizard/steps/ConfigTemplateForm.js.map +0 -1
  414. package/dist/src/components/Device/MatchPatternsModal/MatchPatternsForm.d.ts +0 -11
  415. package/dist/src/components/Device/MatchPatternsModal/MatchPatternsForm.d.ts.map +0 -1
  416. package/dist/src/components/Device/MatchPatternsModal/MatchPatternsForm.js +0 -39
  417. package/dist/src/components/Device/MatchPatternsModal/MatchPatternsForm.js.map +0 -1
  418. package/dist/src/components/Device/MatchPatternsModal/MatchPatternsModal.d.ts.map +0 -1
  419. package/dist/src/components/Device/MatchPatternsModal/MatchPatternsModal.js.map +0 -1
  420. package/dist/src/components/common/HelperTextItems.d.ts +0 -3
  421. package/dist/src/components/common/HelperTextItems.d.ts.map +0 -1
  422. package/dist/src/components/common/HelperTextItems.js +0 -17
  423. package/dist/src/components/common/HelperTextItems.js.map +0 -1
  424. package/dist/src/hooks/useApiTableSort.d.ts +0 -8
  425. package/dist/src/hooks/useApiTableSort.d.ts.map +0 -1
  426. package/dist/src/hooks/useApiTableSort.js +0 -44
  427. package/dist/src/hooks/useApiTableSort.js.map +0 -1
  428. package/dist/src/hooks/useTableSort.d.ts +0 -7
  429. package/dist/src/hooks/useTableSort.d.ts.map +0 -1
  430. package/dist/src/hooks/useTableSort.js +0 -38
  431. package/dist/src/hooks/useTableSort.js.map +0 -1
  432. package/dist/src/utils/sort/generic.d.ts +0 -5
  433. package/dist/src/utils/sort/generic.d.ts.map +0 -1
  434. package/dist/src/utils/sort/generic.js +0 -10
  435. package/dist/src/utils/sort/generic.js.map +0 -1
  436. package/dist/src/utils/sort/repository.d.ts +0 -6
  437. package/dist/src/utils/sort/repository.d.ts.map +0 -1
  438. package/dist/src/utils/sort/repository.js +0 -28
  439. package/dist/src/utils/sort/repository.js.map +0 -1
  440. package/dist/src/utils/sort/resourceSync.d.ts +0 -6
  441. package/dist/src/utils/sort/resourceSync.d.ts.map +0 -1
  442. package/dist/src/utils/sort/resourceSync.js +0 -29
  443. package/dist/src/utils/sort/resourceSync.js.map +0 -1
  444. package/src/components/DetailsPage/Tables/SystemdDetailsTable.tsx +0 -63
  445. package/src/components/Device/DeviceDetails/SystemdTable.tsx +0 -65
  446. package/src/components/Device/MatchPatternsModal/MatchPatternsForm.tsx +0 -92
  447. package/src/components/common/HelperTextItems.tsx +0 -25
  448. package/src/hooks/useApiTableSort.ts +0 -49
  449. package/src/hooks/useTableSort.ts +0 -42
  450. package/src/utils/sort/generic.ts +0 -8
  451. package/src/utils/sort/repository.ts +0 -28
  452. package/src/utils/sort/resourceSync.ts +0 -30
@@ -1,6 +1,5 @@
1
1
  import * as React from 'react';
2
2
  import {
3
- Alert,
4
3
  CardTitle,
5
4
  DescriptionListDescription,
6
5
  DescriptionListGroup,
@@ -13,52 +12,36 @@ import {
13
12
  StackItem,
14
13
  } from '@patternfly/react-core';
15
14
 
16
- import { Device, TemplateVersion } from '@flightctl/types';
15
+ import { Device } from '@flightctl/types';
17
16
  import { timeSinceText } from '../../../utils/dates';
18
- import ApplicationsTable from '../../DetailsPage/Tables/ApplicationsTable';
19
17
  import DeviceStatus from '../../Status/DeviceStatus';
20
18
  import { useTranslation } from '../../../hooks/useTranslation';
21
19
  import EditLabelsForm from '../../modals/EditLabelsModal/EditLabelsForm';
22
20
  import ResourceLink from '../../common/ResourceLink';
23
- import DeviceFleet from './DeviceFleet';
24
- import DeviceOs from './DeviceOs';
25
21
  import DetailsPageCard, { DetailsPageCardBody } from '../../DetailsPage/DetailsPageCard';
26
- import SystemdTable from './SystemdTable';
27
22
  import FlightControlDescriptionList from '../../common/FlightCtlDescriptionList';
28
23
  import RepositorySourceList from '../../Repository/RepositoryDetails/RepositorySourceList';
29
- import { getErrorMessage } from '../../../utils/error';
30
24
  import ApplicationSummaryStatus from '../../Status/ApplicationSummaryStatus';
31
25
  import WithHelperText from '../../common/WithHelperText';
32
26
  import SystemUpdateStatus from '../../Status/SystemUpdateStatus';
33
27
  import DeviceResourceStatus from '../../Status/DeviceResourceStatus';
28
+ import DeviceFleet from './DeviceFleet';
29
+ import DeviceOs from './DeviceOs';
30
+ import DeviceApplications from './DeviceApplications';
34
31
 
35
32
  import './DeviceDetailsTab.css';
36
33
 
37
34
  type DeviceDetailsTabProps = {
38
35
  device: Required<Device>;
39
36
  refetch: VoidFunction;
40
- tv: TemplateVersion | undefined;
41
- errorTv: unknown;
37
+ canEdit: boolean;
42
38
  };
43
39
 
44
- const DeviceDetailsTab = ({
45
- device,
46
- refetch,
47
- tv,
48
- errorTv,
49
- children,
50
- }: React.PropsWithChildren<DeviceDetailsTabProps>) => {
40
+ const DeviceDetailsTab = ({ device, refetch, children, canEdit }: React.PropsWithChildren<DeviceDetailsTabProps>) => {
51
41
  const { t } = useTranslation();
52
42
 
53
43
  return (
54
44
  <Grid hasGutter>
55
- {!!errorTv && (
56
- <GridItem md={12}>
57
- <Alert isInline variant="warning" title={t('Some device details could not be loaded.')}>
58
- {getErrorMessage(errorTv)}
59
- </Alert>
60
- </GridItem>
61
- )}
62
45
  <GridItem md={12}>
63
46
  <DetailsPageCard>
64
47
  <DetailsPageCardBody>
@@ -85,7 +68,7 @@ const DeviceDetailsTab = ({
85
68
  <StackItem className="fctl-device-details-tab__label">{t('Labels')}</StackItem>
86
69
  </Stack>
87
70
  <StackItem>
88
- <EditLabelsForm device={device} onDeviceUpdate={refetch} />
71
+ <EditLabelsForm device={device} onDeviceUpdate={refetch} canEdit={canEdit} />
89
72
  </StackItem>
90
73
  </FlexItem>
91
74
  </Flex>
@@ -194,20 +177,7 @@ const DeviceDetailsTab = ({
194
177
  </DetailsPageCard>
195
178
  </GridItem>
196
179
  <GridItem md={12} lg={6}>
197
- <DetailsPageCard>
198
- <CardTitle>{t('Applications')}</CardTitle>
199
- <DetailsPageCardBody>
200
- <ApplicationsTable appsStatus={device.status.applications} />
201
- </DetailsPageCardBody>
202
- </DetailsPageCard>
203
- </GridItem>
204
- <GridItem md={12} lg={6}>
205
- <DetailsPageCard>
206
- <CardTitle>{t('System services')}</CardTitle>
207
- <DetailsPageCardBody>
208
- <SystemdTable device={device} templateVersion={tv} onSystemdUnitsUpdate={refetch} />
209
- </DetailsPageCardBody>
210
- </DetailsPageCard>
180
+ <DeviceApplications device={device} refetch={refetch} canEdit={canEdit} />
211
181
  </GridItem>
212
182
  </Grid>
213
183
  );
@@ -6,13 +6,21 @@ import { 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';
9
+ import PageWithPermissions from '../../common/PageWithPermissions';
10
+ import { useAccessReview } from '../../../hooks/useAccessReview';
11
+ import { RESOURCE, VERB } from '../../../types/rbac';
9
12
 
10
- const TerminalTab = ({ device }: { device: Device }) => {
13
+ type TerminalTabProps = {
14
+ device: Device;
15
+ };
16
+
17
+ const TerminalTab = ({ device }: TerminalTabProps) => {
11
18
  const { t } = useTranslation();
12
19
  const terminal = React.useRef<ImperativeTerminalType>(null);
13
20
 
14
- const onMsgReceived = React.useCallback((message: string) => {
15
- terminal.current?.onDataReceived(message);
21
+ const onMsgReceived = React.useCallback(async (message: Blob) => {
22
+ const msg = await message.text();
23
+ terminal.current?.onDataReceived(msg);
16
24
  }, []);
17
25
 
18
26
  const { sendMessage, isClosed, error, reconnect } = useWebSocket(
@@ -50,4 +58,13 @@ const TerminalTab = ({ device }: { device: Device }) => {
50
58
  );
51
59
  };
52
60
 
53
- export default TerminalTab;
61
+ const TerminalTabWithPermissions = (props: TerminalTabProps) => {
62
+ const [allowed, loading] = useAccessReview(RESOURCE.DEVICE_CONSOLE, VERB.GET);
63
+ return (
64
+ <PageWithPermissions allowed={allowed} loading={loading}>
65
+ <TerminalTab {...props} />
66
+ </PageWithPermissions>
67
+ );
68
+ };
69
+
70
+ export default TerminalTabWithPermissions;
@@ -4,8 +4,7 @@ import { TFunction } from 'i18next';
4
4
 
5
5
  import { useTranslation } from '../../../hooks/useTranslation';
6
6
  import FilterSelect, { FilterSelectGroup } from '../../form/FilterSelect';
7
- import { fuzzySeach } from '../../../utils/search';
8
- import { FilterOptionsFC, FilterStatusMap, UpdateStatus } from './types';
7
+ import { FilterStatusMap, UpdateStatus } from './types';
9
8
  import StatusDisplay from '../../Status/StatusDisplay';
10
9
  import { DeviceSummaryStatus, FilterSearchParams, getDeviceStatusItems } from '../../../utils/status/devices';
11
10
  import { StatusItem } from '../../../utils/status/common';
@@ -38,29 +37,6 @@ export const getStatusItem = (
38
37
  }
39
38
  };
40
39
 
41
- const FilterOption: FilterOptionsFC = ({ items, selectedFilters, onClick, filter }) => {
42
- const { t } = useTranslation();
43
- const filteredItems = items.filter((statusItem) => fuzzySeach(filter, statusItem.label));
44
- if (!filteredItems.length) {
45
- return (
46
- <SelectOption key="no-option" isDisabled>
47
- {t('No status available')}
48
- </SelectOption>
49
- );
50
- }
51
- return filteredItems.map((statusItem) => (
52
- <SelectOption
53
- onClick={() => onClick(statusItem.id)}
54
- key={statusItem.id}
55
- hasCheckbox
56
- value={statusItem.id}
57
- isSelected={selectedFilters.includes(statusItem.id)}
58
- >
59
- <StatusDisplay item={statusItem} />
60
- </SelectOption>
61
- ));
62
- };
63
-
64
40
  type DeviceStatusFilterProps = {
65
41
  activeStatuses: FilterStatusMap;
66
42
  updateStatus: UpdateStatus;
@@ -69,7 +45,6 @@ type DeviceStatusFilterProps = {
69
45
 
70
46
  const DeviceStatusFilter = ({ activeStatuses, updateStatus, isFilterUpdating }: DeviceStatusFilterProps) => {
71
47
  const { t } = useTranslation();
72
- const [filter, setFilter] = React.useState('');
73
48
 
74
49
  const selectedFilters = Object.values(activeStatuses).reduce((acc, curr) => {
75
50
  acc += curr.length;
@@ -80,8 +55,6 @@ const DeviceStatusFilter = ({ activeStatuses, updateStatus, isFilterUpdating }:
80
55
  <FilterSelect
81
56
  selectedFilters={selectedFilters}
82
57
  placeholder={t('Filter by status')}
83
- filter={filter}
84
- setFilter={setFilter}
85
58
  isFilterUpdating={isFilterUpdating}
86
59
  >
87
60
  <SelectList>
@@ -89,15 +62,21 @@ const DeviceStatusFilter = ({ activeStatuses, updateStatus, isFilterUpdating }:
89
62
  {Object.keys(activeStatuses).map((k) => {
90
63
  const key = k as keyof FilterStatusMap;
91
64
  const { title, items } = getStatusItem(t, key);
65
+ const currentItems = activeStatuses[key] as unknown as DeviceSummaryStatus[];
92
66
  return (
93
67
  <GridItem key={key} span={4}>
94
68
  <FilterSelectGroup label={title}>
95
- <FilterOption
96
- filter={filter}
97
- items={items}
98
- selectedFilters={activeStatuses[key]}
99
- onClick={(value) => updateStatus(key, value)}
100
- />
69
+ {items.map((statusItem) => (
70
+ <SelectOption
71
+ onClick={() => updateStatus(key, statusItem.id)}
72
+ key={statusItem.id}
73
+ hasCheckbox
74
+ value={statusItem.id}
75
+ isSelected={currentItems.includes(statusItem.id)}
76
+ >
77
+ <StatusDisplay item={statusItem} />
78
+ </SelectOption>
79
+ ))}
101
80
  </FilterSelectGroup>
102
81
  </GridItem>
103
82
  );
@@ -19,6 +19,8 @@ type DeviceTableRowProps = {
19
19
  rowIndex: number;
20
20
  onRowSelect: (device: Device) => OnSelect;
21
21
  isRowSelected: (device: Device) => boolean;
22
+ canDelete: boolean;
23
+ canEdit: boolean;
22
24
  };
23
25
 
24
26
  const DeviceTableRow: React.FC<DeviceTableRowProps> = ({
@@ -27,6 +29,8 @@ const DeviceTableRow: React.FC<DeviceTableRowProps> = ({
27
29
  rowIndex,
28
30
  onRowSelect,
29
31
  isRowSelected,
32
+ canDelete,
33
+ canEdit,
30
34
  }) => {
31
35
  const { t } = useTranslation();
32
36
  const navigate = useNavigate();
@@ -72,19 +76,27 @@ const DeviceTableRow: React.FC<DeviceTableRowProps> = ({
72
76
  <Td isActionCell>
73
77
  <ActionsColumn
74
78
  items={[
75
- {
76
- title: t('Edit device configurations'),
77
- onClick: () => navigate({ route: ROUTE.DEVICE_EDIT, postfix: deviceName }),
78
- ...editActionProps,
79
- },
79
+ ...(canEdit
80
+ ? [
81
+ {
82
+ title: t('Edit device configurations'),
83
+ onClick: () => navigate({ route: ROUTE.DEVICE_EDIT, postfix: deviceName }),
84
+ ...editActionProps,
85
+ },
86
+ ]
87
+ : []),
80
88
  {
81
89
  title: t('View device details'),
82
90
  onClick: () => navigate({ route: ROUTE.DEVICE_DETAILS, postfix: deviceName }),
83
91
  },
84
- deleteAction({
85
- resourceId: deviceName,
86
- resourceName: deviceAlias,
87
- }),
92
+ ...(canDelete
93
+ ? [
94
+ deleteAction({
95
+ resourceId: deviceName,
96
+ resourceName: deviceAlias,
97
+ }),
98
+ ]
99
+ : []),
88
100
  ]}
89
101
  />
90
102
  </Td>
@@ -11,7 +11,6 @@ import {
11
11
  ToolbarItem,
12
12
  } from '@patternfly/react-core';
13
13
 
14
- import { Fleet } from '@flightctl/types';
15
14
  import { TableTextSearchProps } from '../../Table/TableTextSearch';
16
15
  import { useTranslation } from '../../../hooks/useTranslation';
17
16
  import DeviceStatusFilter, { getStatusItem } from './DeviceFilterSelect';
@@ -23,14 +22,12 @@ import DeviceTableToolbarFilters from './DeviceToolbarFilters';
23
22
  type DeviceTableToolbarProps = {
24
23
  nameOrAlias: TableTextSearchProps['value'];
25
24
  setNameOrAlias: TableTextSearchProps['setValue'];
26
- allLabels: FlightCtlLabel[];
27
25
  ownerFleets: string[];
28
26
  setOwnerFleets: (ownerFleets: string[]) => void;
29
27
  activeStatuses: FilterStatusMap;
30
28
  setActiveStatuses: (statuses: FilterStatusMap) => void;
31
29
  selectedLabels: FlightCtlLabel[];
32
30
  setSelectedLabels: (labels: FlightCtlLabel[]) => void;
33
- fleets: Fleet[];
34
31
  isFilterUpdating: boolean;
35
32
  };
36
33
 
@@ -42,10 +39,8 @@ const DeviceTableToolbar: React.FC<React.PropsWithChildren<DeviceTableToolbarPro
42
39
  setNameOrAlias,
43
40
  activeStatuses,
44
41
  setActiveStatuses,
45
- allLabels,
46
42
  selectedLabels,
47
43
  setSelectedLabels,
48
- fleets,
49
44
  isFilterUpdating,
50
45
  } = rest;
51
46
 
@@ -86,12 +81,10 @@ const DeviceTableToolbar: React.FC<React.PropsWithChildren<DeviceTableToolbarPro
86
81
  </ToolbarItem>
87
82
  <ToolbarItem variant="search-filter">
88
83
  <DeviceTableToolbarFilters
89
- allLabels={allLabels}
90
84
  selectedLabels={selectedLabels}
91
85
  selectedFleetNames={ownerFleets}
92
86
  setSelectedLabels={setSelectedLabels}
93
87
  setSelectedFleets={setOwnerFleets}
94
- fleets={fleets}
95
88
  nameOrAlias={nameOrAlias}
96
89
  setNameOrAlias={setNameOrAlias}
97
90
  />
@@ -9,6 +9,7 @@ import {
9
9
  SelectGroup,
10
10
  SelectList,
11
11
  SelectOption,
12
+ Spinner,
12
13
  TextInputGroup,
13
14
  TextInputGroupMain,
14
15
  TextInputGroupUtilities,
@@ -16,13 +17,16 @@ import {
16
17
  import { TimesIcon } from '@patternfly/react-icons/dist/js/icons/times-icon';
17
18
  import { SearchIcon } from '@patternfly/react-icons/dist/js/icons/search-icon';
18
19
 
19
- import { Fleet } from '@flightctl/types';
20
+ import { DeviceList, Fleet, FleetList } from '@flightctl/types';
20
21
  import { FlightCtlLabel } from '../../../types/extraTypes';
22
+ import { isPromiseFulfilled } from '../../../types/typeUtils';
21
23
 
22
24
  import TableTextSearch, { TableTextSearchProps } from '../../Table/TableTextSearch';
23
25
  import { useTranslation } from '../../../hooks/useTranslation';
24
- import { fuzzySeach, getSearchResultsCount } from '../../../utils/search';
25
- import { filterDevicesLabels, labelToString } from '../../../utils/labels';
26
+ import { useFetch } from '../../../hooks/useFetch';
27
+ import { commonQueries as queries } from '../../../utils/query';
28
+ import { MAX_TOTAL_SEARCH_RESULTS, getSearchResultsCount } from '../../../utils/search';
29
+ import { labelToString, stringToLabel } from '../../../utils/labels';
26
30
 
27
31
  import './DeviceToolbarFilters.css';
28
32
 
@@ -30,8 +34,6 @@ const NAME_SEARCH = 'NameAndAlias';
30
34
  const LABEL_SEARCH = 'LabelsAndFleets';
31
35
 
32
36
  type LabelFleetSelectorProps = {
33
- fleets: Fleet[];
34
- allLabels: FlightCtlLabel[];
35
37
  selectedFleetNames: string[];
36
38
  selectedLabels: FlightCtlLabel[];
37
39
  onSelect: (type: 'fleet' | 'label', value: string) => void;
@@ -40,18 +42,25 @@ type LabelFleetSelectorProps = {
40
42
 
41
43
  const LabelFleetResults = ({
42
44
  allLabels,
43
- fleets,
44
- selectedLabels,
45
- filterText,
46
- }: Omit<LabelFleetSelectorProps, 'onSelect' | 'devices'> & { filterText: string }) => {
45
+ fleetNames,
46
+ isUpdating,
47
+ }: {
48
+ isUpdating: boolean;
49
+ fleetNames: string[];
50
+ allLabels: FlightCtlLabel[];
51
+ }) => {
47
52
  const { t } = useTranslation();
48
53
 
49
- const availableFleetNames = fleets
50
- .filter((f) => fuzzySeach(filterText, f.metadata.name))
51
- .map((f) => f.metadata.name || '');
54
+ if (isUpdating) {
55
+ return (
56
+ <div className="fctl-device-toolbar-filters__hint">
57
+ <Spinner size="md" className="pf-v5-u-mr-sm" />
58
+ {t('Searching...')}
59
+ </div>
60
+ );
61
+ }
52
62
 
53
- const filteredLabels = filterDevicesLabels(allLabels, selectedLabels, filterText);
54
- const [visibleLabels, visibleFleets] = getSearchResultsCount(filteredLabels.length, availableFleetNames.length);
63
+ const [visibleLabels, visibleFleets] = getSearchResultsCount(allLabels.length, fleetNames.length);
55
64
  if (visibleLabels + visibleFleets === 0) {
56
65
  return <div className="fctl-device-toolbar-filters__hint">{t('No results')}</div>;
57
66
  }
@@ -61,9 +70,10 @@ const LabelFleetResults = ({
61
70
  {visibleLabels > 0 && (
62
71
  <SelectGroup label={t('Labels')}>
63
72
  <SelectList id="select-typeahead-labels-listbox">
64
- {filteredLabels
73
+ {allLabels
65
74
  .filter((_, index) => index < visibleLabels)
66
- .map((labelStr) => {
75
+ .map((label) => {
76
+ const labelStr = labelToString(label);
67
77
  return (
68
78
  <SelectOption key={`label@@${labelStr}`} value={`label@@${labelStr}`}>
69
79
  {labelStr}
@@ -76,7 +86,7 @@ const LabelFleetResults = ({
76
86
  {visibleFleets > 0 && (
77
87
  <SelectGroup label={t('Fleets')}>
78
88
  <SelectList id="select-typeahead-fleets-listbox">
79
- {availableFleetNames
89
+ {fleetNames
80
90
  .filter((_, index) => index < visibleFleets)
81
91
  .map((fleetName) => (
82
92
  <SelectOption key={`fleet@@${fleetName}`} value={`fleet@@${fleetName}`}>
@@ -90,24 +100,24 @@ const LabelFleetResults = ({
90
100
  );
91
101
  };
92
102
 
93
- const LabelFleetSelector = ({
94
- fleets,
95
- selectedFleetNames,
96
- allLabels,
97
- selectedLabels,
98
- onSelect,
99
- placeholder,
100
- }: LabelFleetSelectorProps) => {
103
+ const LabelFleetSelector = ({ selectedFleetNames, selectedLabels, onSelect, placeholder }: LabelFleetSelectorProps) => {
101
104
  const [isOpen, setIsOpen] = React.useState(false);
102
105
  const [filterText, setFilterText] = React.useState<string>('');
106
+ const [fleetNameResults, setFleetNameResults] = React.useState<string[]>([]);
107
+ const [labelResults, setLabelResults] = React.useState<FlightCtlLabel[]>([]);
108
+ const [isUpdating, setIsUpdating] = React.useState<boolean>(false);
109
+
110
+ const { get } = useFetch();
103
111
 
104
112
  const textInputRef = React.useRef<HTMLInputElement>();
105
113
 
106
114
  const { t } = useTranslation();
107
115
 
108
116
  const onToggleClick = () => {
117
+ if (!isOpen) {
118
+ textInputRef?.current?.focus();
119
+ }
109
120
  setIsOpen(!isOpen);
110
- textInputRef?.current?.focus();
111
121
  };
112
122
 
113
123
  const onClearButtonClick = () => {
@@ -127,8 +137,61 @@ const LabelFleetSelector = ({
127
137
  }
128
138
  };
129
139
 
140
+ 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 }),
144
+ );
145
+
146
+ const fleetMatches = get<FleetList>(queries.getFleetsWithNameMatching(val, { limit: MAX_TOTAL_SEARCH_RESULTS }));
147
+
148
+ const [labelMatchResult, fleetMatchResult] = await Promise.allSettled([labelMatches, fleetMatches]);
149
+
150
+ let newLabels: FlightCtlLabel[] = [];
151
+ 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();
165
+ }
166
+
167
+ let newFleets: string[] = [];
168
+ if (isPromiseFulfilled(fleetMatchResult)) {
169
+ newFleets = fleetMatchResult.value.items?.map((fleet: Fleet) => fleet.metadata.name || '') || [];
170
+ }
171
+ setLabelResults(newLabels);
172
+ setFleetNameResults(newFleets);
173
+ setIsUpdating(false);
174
+ };
175
+
176
+ // eslint-disable-next-line react-hooks/exhaustive-deps
177
+ const debouncedUpdate = React.useCallback(
178
+ debounce((val: string) => {
179
+ fetchTextMatches(val);
180
+ }, 800),
181
+ [],
182
+ );
183
+
130
184
  const onTextInputChange = (_event: React.FormEvent<HTMLInputElement>, value: string) => {
131
- setFilterText(value);
185
+ if (value) {
186
+ setFilterText(value);
187
+ if (!isUpdating) {
188
+ // Start showing the spinner before the debounced function is triggered
189
+ setIsUpdating(true);
190
+ }
191
+ void debouncedUpdate(value);
192
+ } else {
193
+ setFilterText('');
194
+ }
132
195
  };
133
196
 
134
197
  const selectedIds = selectedFleetNames
@@ -194,22 +257,16 @@ const LabelFleetSelector = ({
194
257
  }}
195
258
  toggle={toggle}
196
259
  >
197
- <LabelFleetResults
198
- fleets={fleets}
199
- filterText={filterText}
200
- selectedFleetNames={selectedFleetNames}
201
- allLabels={allLabels}
202
- selectedLabels={selectedLabels}
203
- />
260
+ {filterText && (
261
+ <LabelFleetResults isUpdating={isUpdating} fleetNames={fleetNameResults} allLabels={labelResults} />
262
+ )}
204
263
  </Select>
205
264
  );
206
265
  };
207
266
 
208
267
  type DeviceToolbarFilterProps = {
209
- fleets: Fleet[];
210
268
  selectedFleetNames: string[];
211
269
  setSelectedFleets: (ownerFleets: string[]) => void;
212
- allLabels: FlightCtlLabel[];
213
270
  selectedLabels: FlightCtlLabel[];
214
271
  setSelectedLabels: (labels: FlightCtlLabel[]) => void;
215
272
  nameOrAlias?: TableTextSearchProps['value'];
@@ -217,10 +274,8 @@ type DeviceToolbarFilterProps = {
217
274
  };
218
275
 
219
276
  const DeviceToolbarFilter = ({
220
- fleets,
221
277
  selectedFleetNames,
222
278
  setSelectedFleets,
223
- allLabels,
224
279
  selectedLabels,
225
280
  setSelectedLabels,
226
281
  nameOrAlias,
@@ -318,8 +373,6 @@ const DeviceToolbarFilter = ({
318
373
  ) : (
319
374
  <LabelFleetSelector
320
375
  placeholder={setNameOrAlias ? undefined : t('Filter by labels and fleets')}
321
- allLabels={allLabels}
322
- fleets={fleets}
323
376
  selectedFleetNames={selectedFleetNames}
324
377
  selectedLabels={selectedLabels}
325
378
  onSelect={onSelectFleetOrLabel}