@flightctl/ui-components 0.10.0-rc7 → 1.0.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 (437) hide show
  1. package/dist/src/components/AuthProvider/AuthProviderDetails/AuthProviderDetails.d.ts +4 -0
  2. package/dist/src/components/AuthProvider/AuthProviderDetails/AuthProviderDetails.d.ts.map +1 -0
  3. package/dist/src/components/AuthProvider/AuthProviderDetails/AuthProviderDetails.js +57 -0
  4. package/dist/src/components/AuthProvider/AuthProviderDetails/AuthProviderDetails.js.map +1 -0
  5. package/dist/src/components/AuthProvider/AuthProviderDetails/AuthProviderDetailsTab.d.ts +7 -0
  6. package/dist/src/components/AuthProvider/AuthProviderDetails/AuthProviderDetailsTab.d.ts.map +1 -0
  7. package/dist/src/components/AuthProvider/AuthProviderDetails/AuthProviderDetailsTab.js +118 -0
  8. package/dist/src/components/AuthProvider/AuthProviderDetails/AuthProviderDetailsTab.js.map +1 -0
  9. package/dist/src/components/AuthProvider/AuthProviderDetails/DeleteAuthProviderModal.d.ts +9 -0
  10. package/dist/src/components/AuthProvider/AuthProviderDetails/DeleteAuthProviderModal.d.ts.map +1 -0
  11. package/dist/src/components/AuthProvider/AuthProviderDetails/DeleteAuthProviderModal.js +55 -0
  12. package/dist/src/components/AuthProvider/AuthProviderDetails/DeleteAuthProviderModal.js.map +1 -0
  13. package/dist/src/components/AuthProvider/AuthProviderDetails/RoleAssigmentDetails.d.ts +7 -0
  14. package/dist/src/components/AuthProvider/AuthProviderDetails/RoleAssigmentDetails.d.ts.map +1 -0
  15. package/dist/src/components/AuthProvider/AuthProviderDetails/RoleAssigmentDetails.js +35 -0
  16. package/dist/src/components/AuthProvider/AuthProviderDetails/RoleAssigmentDetails.js.map +1 -0
  17. package/dist/src/components/AuthProvider/AuthProviderRow.d.ts +8 -0
  18. package/dist/src/components/AuthProvider/AuthProviderRow.d.ts.map +1 -0
  19. package/dist/src/components/AuthProvider/AuthProviderRow.js +67 -0
  20. package/dist/src/components/AuthProvider/AuthProviderRow.js.map +1 -0
  21. package/dist/src/components/AuthProvider/AuthProvidersPage.d.ts +4 -0
  22. package/dist/src/components/AuthProvider/AuthProvidersPage.d.ts.map +1 -0
  23. package/dist/src/components/AuthProvider/AuthProvidersPage.js +90 -0
  24. package/dist/src/components/AuthProvider/AuthProvidersPage.js.map +1 -0
  25. package/dist/src/components/AuthProvider/CreateAuthProvider/AuthOrganizationAssignment.d.ts +4 -0
  26. package/dist/src/components/AuthProvider/CreateAuthProvider/AuthOrganizationAssignment.d.ts.map +1 -0
  27. package/dist/src/components/AuthProvider/CreateAuthProvider/AuthOrganizationAssignment.js +39 -0
  28. package/dist/src/components/AuthProvider/CreateAuthProvider/AuthOrganizationAssignment.js.map +1 -0
  29. package/dist/src/components/AuthProvider/CreateAuthProvider/AuthProviderHelperText.d.ts +6 -0
  30. package/dist/src/components/AuthProvider/CreateAuthProvider/AuthProviderHelperText.d.ts.map +1 -0
  31. package/dist/src/components/AuthProvider/CreateAuthProvider/AuthProviderHelperText.js +87 -0
  32. package/dist/src/components/AuthProvider/CreateAuthProvider/AuthProviderHelperText.js.map +1 -0
  33. package/dist/src/components/AuthProvider/CreateAuthProvider/CreateAuthProvider.d.ts +4 -0
  34. package/dist/src/components/AuthProvider/CreateAuthProvider/CreateAuthProvider.d.ts.map +1 -0
  35. package/dist/src/components/AuthProvider/CreateAuthProvider/CreateAuthProvider.js +94 -0
  36. package/dist/src/components/AuthProvider/CreateAuthProvider/CreateAuthProvider.js.map +1 -0
  37. package/dist/src/components/AuthProvider/CreateAuthProvider/CreateAuthProviderForm.d.ts +13 -0
  38. package/dist/src/components/AuthProvider/CreateAuthProvider/CreateAuthProviderForm.d.ts.map +1 -0
  39. package/dist/src/components/AuthProvider/CreateAuthProvider/CreateAuthProviderForm.js +161 -0
  40. package/dist/src/components/AuthProvider/CreateAuthProvider/CreateAuthProviderForm.js.map +1 -0
  41. package/dist/src/components/AuthProvider/CreateAuthProvider/Oauth2ProviderFields.d.ts +4 -0
  42. package/dist/src/components/AuthProvider/CreateAuthProvider/Oauth2ProviderFields.d.ts.map +1 -0
  43. package/dist/src/components/AuthProvider/CreateAuthProvider/Oauth2ProviderFields.js +19 -0
  44. package/dist/src/components/AuthProvider/CreateAuthProvider/Oauth2ProviderFields.js.map +1 -0
  45. package/dist/src/components/AuthProvider/CreateAuthProvider/RoleAssignmentSection.d.ts +4 -0
  46. package/dist/src/components/AuthProvider/CreateAuthProvider/RoleAssignmentSection.d.ts.map +1 -0
  47. package/dist/src/components/AuthProvider/CreateAuthProvider/RoleAssignmentSection.js +71 -0
  48. package/dist/src/components/AuthProvider/CreateAuthProvider/RoleAssignmentSection.js.map +1 -0
  49. package/dist/src/components/AuthProvider/CreateAuthProvider/types.d.ts +57 -0
  50. package/dist/src/components/AuthProvider/CreateAuthProvider/types.d.ts.map +1 -0
  51. package/dist/src/components/AuthProvider/CreateAuthProvider/types.js +33 -0
  52. package/dist/src/components/AuthProvider/CreateAuthProvider/types.js.map +1 -0
  53. package/dist/src/components/AuthProvider/CreateAuthProvider/utils.d.ts +15 -0
  54. package/dist/src/components/AuthProvider/CreateAuthProvider/utils.d.ts.map +1 -0
  55. package/dist/src/components/AuthProvider/CreateAuthProvider/utils.js +466 -0
  56. package/dist/src/components/AuthProvider/CreateAuthProvider/utils.js.map +1 -0
  57. package/dist/src/components/AuthProvider/TestConnectionModal/TestConnectionModal.d.ts +9 -0
  58. package/dist/src/components/AuthProvider/TestConnectionModal/TestConnectionModal.d.ts.map +1 -0
  59. package/dist/src/components/AuthProvider/TestConnectionModal/TestConnectionModal.js +67 -0
  60. package/dist/src/components/AuthProvider/TestConnectionModal/TestConnectionModal.js.map +1 -0
  61. package/dist/src/components/AuthProvider/useAuthProviders.d.ts +8 -0
  62. package/dist/src/components/AuthProvider/useAuthProviders.d.ts.map +1 -0
  63. package/dist/src/components/AuthProvider/useAuthProviders.js +19 -0
  64. package/dist/src/components/AuthProvider/useAuthProviders.js.map +1 -0
  65. package/dist/src/components/DetailsPage/DetailsPage.d.ts +1 -1
  66. package/dist/src/components/DetailsPage/DetailsPage.d.ts.map +1 -1
  67. package/dist/src/components/DetailsPage/DetailsPageActions.d.ts.map +1 -1
  68. package/dist/src/components/DetailsPage/DetailsPageActions.js +1 -1
  69. package/dist/src/components/DetailsPage/DetailsPageActions.js.map +1 -1
  70. package/dist/src/components/DetailsPage/Tables/ApplicationsTable.d.ts +1 -7
  71. package/dist/src/components/DetailsPage/Tables/ApplicationsTable.d.ts.map +1 -1
  72. package/dist/src/components/DetailsPage/Tables/ApplicationsTable.js +26 -81
  73. package/dist/src/components/DetailsPage/Tables/ApplicationsTable.js.map +1 -1
  74. package/dist/src/components/DetailsPage/Tables/SystemdUnitsTable.d.ts +8 -0
  75. package/dist/src/components/DetailsPage/Tables/SystemdUnitsTable.d.ts.map +1 -0
  76. package/dist/src/components/DetailsPage/Tables/SystemdUnitsTable.js +67 -0
  77. package/dist/src/components/DetailsPage/Tables/SystemdUnitsTable.js.map +1 -0
  78. package/dist/src/components/Device/DeviceDetails/DeviceApplications.d.ts +1 -3
  79. package/dist/src/components/Device/DeviceDetails/DeviceApplications.d.ts.map +1 -1
  80. package/dist/src/components/Device/DeviceDetails/DeviceApplications.js +5 -49
  81. package/dist/src/components/Device/DeviceDetails/DeviceApplications.js.map +1 -1
  82. package/dist/src/components/Device/DeviceDetails/DeviceDetailsPage.d.ts.map +1 -1
  83. package/dist/src/components/Device/DeviceDetails/DeviceDetailsPage.js +15 -9
  84. package/dist/src/components/Device/DeviceDetails/DeviceDetailsPage.js.map +1 -1
  85. package/dist/src/components/Device/DeviceDetails/DeviceDetailsTab.d.ts.map +1 -1
  86. package/dist/src/components/Device/DeviceDetails/DeviceDetailsTab.js +5 -2
  87. package/dist/src/components/Device/DeviceDetails/DeviceDetailsTab.js.map +1 -1
  88. package/dist/src/components/Device/DeviceDetails/DeviceSystemdUnits.d.ts +8 -0
  89. package/dist/src/components/Device/DeviceDetails/DeviceSystemdUnits.d.ts.map +1 -0
  90. package/dist/src/components/Device/DeviceDetails/DeviceSystemdUnits.js +19 -0
  91. package/dist/src/components/Device/DeviceDetails/DeviceSystemdUnits.js.map +1 -0
  92. package/dist/src/components/Device/DeviceDetails/TerminalTab.d.ts.map +1 -1
  93. package/dist/src/components/Device/DeviceDetails/TerminalTab.js +36 -10
  94. package/dist/src/components/Device/DeviceDetails/TerminalTab.js.map +1 -1
  95. package/dist/src/components/Device/DevicesPage/DecommissionedDevicesTable.d.ts.map +1 -1
  96. package/dist/src/components/Device/DevicesPage/DecommissionedDevicesTable.js +7 -3
  97. package/dist/src/components/Device/DevicesPage/DecommissionedDevicesTable.js.map +1 -1
  98. package/dist/src/components/Device/DevicesPage/DevicesEmptyStates.d.ts.map +1 -1
  99. package/dist/src/components/Device/DevicesPage/DevicesEmptyStates.js +3 -2
  100. package/dist/src/components/Device/DevicesPage/DevicesEmptyStates.js.map +1 -1
  101. package/dist/src/components/Device/DevicesPage/DevicesPage.d.ts.map +1 -1
  102. package/dist/src/components/Device/DevicesPage/DevicesPage.js +9 -15
  103. package/dist/src/components/Device/DevicesPage/DevicesPage.js.map +1 -1
  104. package/dist/src/components/Device/DevicesPage/EnrolledDevicesTable.d.ts.map +1 -1
  105. package/dist/src/components/Device/DevicesPage/EnrolledDevicesTable.js +8 -4
  106. package/dist/src/components/Device/DevicesPage/EnrolledDevicesTable.js.map +1 -1
  107. package/dist/src/components/Device/EditDeviceWizard/EditDeviceWizard.d.ts.map +1 -1
  108. package/dist/src/components/Device/EditDeviceWizard/EditDeviceWizard.js +4 -3
  109. package/dist/src/components/Device/EditDeviceWizard/EditDeviceWizard.js.map +1 -1
  110. package/dist/src/components/Device/EditDeviceWizard/deviceSpecUtils.d.ts +2 -1
  111. package/dist/src/components/Device/EditDeviceWizard/deviceSpecUtils.d.ts.map +1 -1
  112. package/dist/src/components/Device/EditDeviceWizard/deviceSpecUtils.js +235 -56
  113. package/dist/src/components/Device/EditDeviceWizard/deviceSpecUtils.js.map +1 -1
  114. package/dist/src/components/Device/EditDeviceWizard/steps/ApplicationContainerForm.css +5 -0
  115. package/dist/src/components/Device/EditDeviceWizard/steps/ApplicationContainerForm.d.ts +10 -0
  116. package/dist/src/components/Device/EditDeviceWizard/steps/ApplicationContainerForm.d.ts.map +1 -0
  117. package/dist/src/components/Device/EditDeviceWizard/steps/ApplicationContainerForm.js +167 -0
  118. package/dist/src/components/Device/EditDeviceWizard/steps/ApplicationContainerForm.js.map +1 -0
  119. package/dist/src/components/Device/EditDeviceWizard/steps/ApplicationImageForm.d.ts +2 -2
  120. package/dist/src/components/Device/EditDeviceWizard/steps/ApplicationImageForm.d.ts.map +1 -1
  121. package/dist/src/components/Device/EditDeviceWizard/steps/ApplicationInlineForm.d.ts +2 -2
  122. package/dist/src/components/Device/EditDeviceWizard/steps/ApplicationInlineForm.d.ts.map +1 -1
  123. package/dist/src/components/Device/EditDeviceWizard/steps/ApplicationTemplates.d.ts.map +1 -1
  124. package/dist/src/components/Device/EditDeviceWizard/steps/ApplicationTemplates.js +100 -38
  125. package/dist/src/components/Device/EditDeviceWizard/steps/ApplicationTemplates.js.map +1 -1
  126. package/dist/src/components/Device/EditDeviceWizard/steps/ApplicationVolumeForm.d.ts +11 -0
  127. package/dist/src/components/Device/EditDeviceWizard/steps/ApplicationVolumeForm.d.ts.map +1 -0
  128. package/dist/src/components/Device/EditDeviceWizard/steps/ApplicationVolumeForm.js +63 -0
  129. package/dist/src/components/Device/EditDeviceWizard/steps/ApplicationVolumeForm.js.map +1 -0
  130. package/dist/src/components/Device/EditDeviceWizard/steps/ConfigurationTemplates.d.ts.map +1 -1
  131. package/dist/src/components/Device/EditDeviceWizard/steps/ConfigurationTemplates.js +6 -4
  132. package/dist/src/components/Device/EditDeviceWizard/steps/ConfigurationTemplates.js.map +1 -1
  133. package/dist/src/components/Device/EditDeviceWizard/steps/DeviceTemplateStep.js +1 -1
  134. package/dist/src/components/Device/EditDeviceWizard/steps/DeviceTemplateStep.js.map +1 -1
  135. package/dist/src/components/Device/EditDeviceWizard/steps/ReviewApplications.d.ts.map +1 -1
  136. package/dist/src/components/Device/EditDeviceWizard/steps/ReviewApplications.js +21 -10
  137. package/dist/src/components/Device/EditDeviceWizard/steps/ReviewApplications.js.map +1 -1
  138. package/dist/src/components/Device/EditDeviceWizard/utils.d.ts +55 -3
  139. package/dist/src/components/Device/EditDeviceWizard/utils.d.ts.map +1 -1
  140. package/dist/src/components/Device/EditDeviceWizard/utils.js +5 -2
  141. package/dist/src/components/Device/EditDeviceWizard/utils.js.map +1 -1
  142. package/dist/src/components/EnrollmentRequest/EnrollmentRequestDetails/EnrollmentRequestDetails.d.ts.map +1 -1
  143. package/dist/src/components/EnrollmentRequest/EnrollmentRequestDetails/EnrollmentRequestDetails.js +9 -4
  144. package/dist/src/components/EnrollmentRequest/EnrollmentRequestDetails/EnrollmentRequestDetails.js.map +1 -1
  145. package/dist/src/components/EnrollmentRequest/EnrollmentRequestList.d.ts +1 -3
  146. package/dist/src/components/EnrollmentRequest/EnrollmentRequestList.d.ts.map +1 -1
  147. package/dist/src/components/EnrollmentRequest/EnrollmentRequestList.js +8 -9
  148. package/dist/src/components/EnrollmentRequest/EnrollmentRequestList.js.map +1 -1
  149. package/dist/src/components/Fleet/CreateFleet/CreateFleetWizard.d.ts.map +1 -1
  150. package/dist/src/components/Fleet/CreateFleet/CreateFleetWizard.js +10 -5
  151. package/dist/src/components/Fleet/CreateFleet/CreateFleetWizard.js.map +1 -1
  152. package/dist/src/components/Fleet/CreateFleet/utils.d.ts.map +1 -1
  153. package/dist/src/components/Fleet/CreateFleet/utils.js +2 -5
  154. package/dist/src/components/Fleet/CreateFleet/utils.js.map +1 -1
  155. package/dist/src/components/Fleet/FleetDetails/FleetDetailsPage.d.ts.map +1 -1
  156. package/dist/src/components/Fleet/FleetDetails/FleetDetailsPage.js +11 -6
  157. package/dist/src/components/Fleet/FleetDetails/FleetDetailsPage.js.map +1 -1
  158. package/dist/src/components/Fleet/FleetDetails/FleetYaml.d.ts +9 -0
  159. package/dist/src/components/Fleet/FleetDetails/FleetYaml.d.ts.map +1 -0
  160. package/dist/src/components/Fleet/FleetDetails/FleetYaml.js +13 -0
  161. package/dist/src/components/Fleet/FleetDetails/FleetYaml.js.map +1 -0
  162. package/dist/src/components/Fleet/FleetResourceSyncs.d.ts.map +1 -1
  163. package/dist/src/components/Fleet/FleetResourceSyncs.js +3 -2
  164. package/dist/src/components/Fleet/FleetResourceSyncs.js.map +1 -1
  165. package/dist/src/components/Fleet/FleetsPage.d.ts.map +1 -1
  166. package/dist/src/components/Fleet/FleetsPage.js +22 -13
  167. package/dist/src/components/Fleet/FleetsPage.js.map +1 -1
  168. package/dist/src/components/Fleet/ImportFleetWizard/ImportFleetWizard.d.ts.map +1 -1
  169. package/dist/src/components/Fleet/ImportFleetWizard/ImportFleetWizard.js +9 -2
  170. package/dist/src/components/Fleet/ImportFleetWizard/ImportFleetWizard.js.map +1 -1
  171. package/dist/src/components/Fleet/ImportFleetWizard/steps/RepositoryStep.d.ts.map +1 -1
  172. package/dist/src/components/Fleet/ImportFleetWizard/steps/RepositoryStep.js +3 -2
  173. package/dist/src/components/Fleet/ImportFleetWizard/steps/RepositoryStep.js.map +1 -1
  174. package/dist/src/components/ListPage/ListPage.d.ts +0 -1
  175. package/dist/src/components/ListPage/ListPage.d.ts.map +1 -1
  176. package/dist/src/components/ListPage/ListPage.js +2 -5
  177. package/dist/src/components/ListPage/ListPage.js.map +1 -1
  178. package/dist/src/components/Login/ProviderSelector.d.ts +11 -0
  179. package/dist/src/components/Login/ProviderSelector.d.ts.map +1 -0
  180. package/dist/src/components/Login/ProviderSelector.js +66 -0
  181. package/dist/src/components/Login/ProviderSelector.js.map +1 -0
  182. package/dist/src/components/Login/TokenLoginForm.d.ts +9 -0
  183. package/dist/src/components/Login/TokenLoginForm.d.ts.map +1 -0
  184. package/dist/src/components/Login/TokenLoginForm.js +107 -0
  185. package/dist/src/components/Login/TokenLoginForm.js.map +1 -0
  186. package/dist/src/components/Masthead/CommandLineToolsPage.d.ts.map +1 -1
  187. package/dist/src/components/Masthead/CommandLineToolsPage.js +1 -6
  188. package/dist/src/components/Masthead/CommandLineToolsPage.js.map +1 -1
  189. package/dist/src/components/OverviewPage/Cards/Alerts/AlertsCard.d.ts.map +1 -1
  190. package/dist/src/components/OverviewPage/Cards/Alerts/AlertsCard.js +2 -0
  191. package/dist/src/components/OverviewPage/Cards/Alerts/AlertsCard.js.map +1 -1
  192. package/dist/src/components/OverviewPage/Overview.d.ts.map +1 -1
  193. package/dist/src/components/OverviewPage/Overview.js +8 -4
  194. package/dist/src/components/OverviewPage/Overview.js.map +1 -1
  195. package/dist/src/components/OverviewPage/OverviewPage.d.ts.map +1 -1
  196. package/dist/src/components/OverviewPage/OverviewPage.js +3 -8
  197. package/dist/src/components/OverviewPage/OverviewPage.js.map +1 -1
  198. package/dist/src/components/Repository/CreateRepository/CreateRepository.d.ts.map +1 -1
  199. package/dist/src/components/Repository/CreateRepository/CreateRepository.js +3 -2
  200. package/dist/src/components/Repository/CreateRepository/CreateRepository.js.map +1 -1
  201. package/dist/src/components/Repository/CreateRepository/CreateRepositoryForm.d.ts.map +1 -1
  202. package/dist/src/components/Repository/CreateRepository/CreateRepositoryForm.js +3 -2
  203. package/dist/src/components/Repository/CreateRepository/CreateRepositoryForm.js.map +1 -1
  204. package/dist/src/components/Repository/RepositoryDetails/RepositoryDetails.d.ts.map +1 -1
  205. package/dist/src/components/Repository/RepositoryDetails/RepositoryDetails.js +11 -6
  206. package/dist/src/components/Repository/RepositoryDetails/RepositoryDetails.js.map +1 -1
  207. package/dist/src/components/Repository/RepositoryList.d.ts.map +1 -1
  208. package/dist/src/components/Repository/RepositoryList.js +11 -5
  209. package/dist/src/components/Repository/RepositoryList.js.map +1 -1
  210. package/dist/src/components/ResourceSync/RepositoryResourceSyncList.d.ts.map +1 -1
  211. package/dist/src/components/ResourceSync/RepositoryResourceSyncList.js +7 -3
  212. package/dist/src/components/ResourceSync/RepositoryResourceSyncList.js.map +1 -1
  213. package/dist/src/components/Terminal/Terminal.css +12 -1
  214. package/dist/src/components/Terminal/Terminal.js +3 -3
  215. package/dist/src/components/Terminal/Terminal.js.map +1 -1
  216. package/dist/src/components/common/CodeEditor/YamlEditor.d.ts +7 -5
  217. package/dist/src/components/common/CodeEditor/YamlEditor.d.ts.map +1 -1
  218. package/dist/src/components/common/CodeEditor/YamlEditor.js +142 -10
  219. package/dist/src/components/common/CodeEditor/YamlEditor.js.map +1 -1
  220. package/dist/src/components/common/CodeEditor/YamlEditorBase.d.ts +7 -1
  221. package/dist/src/components/common/CodeEditor/YamlEditorBase.d.ts.map +1 -1
  222. package/dist/src/components/common/CodeEditor/YamlEditorBase.js +16 -8
  223. package/dist/src/components/common/CodeEditor/YamlEditorBase.js.map +1 -1
  224. package/dist/src/components/common/OrganizationGuard.d.ts +1 -1
  225. package/dist/src/components/common/OrganizationGuard.d.ts.map +1 -1
  226. package/dist/src/components/common/OrganizationGuard.js +16 -22
  227. package/dist/src/components/common/OrganizationGuard.js.map +1 -1
  228. package/dist/src/components/common/OrganizationSelector.d.ts.map +1 -1
  229. package/dist/src/components/common/OrganizationSelector.js +20 -6
  230. package/dist/src/components/common/OrganizationSelector.js.map +1 -1
  231. package/dist/src/components/common/PageNavigation.css +9 -0
  232. package/dist/src/components/common/PageNavigation.d.ts +4 -1
  233. package/dist/src/components/common/PageNavigation.d.ts.map +1 -1
  234. package/dist/src/components/common/PageNavigation.js +25 -10
  235. package/dist/src/components/common/PageNavigation.js.map +1 -1
  236. package/dist/src/components/common/PermissionsContext.d.ts +14 -0
  237. package/dist/src/components/common/PermissionsContext.d.ts.map +1 -0
  238. package/dist/src/components/common/PermissionsContext.js +84 -0
  239. package/dist/src/components/common/PermissionsContext.js.map +1 -0
  240. package/dist/src/components/form/FilterSelect.d.ts.map +1 -1
  241. package/dist/src/components/form/FilterSelect.js +1 -1
  242. package/dist/src/components/form/FilterSelect.js.map +1 -1
  243. package/dist/src/components/form/FormSelect.d.ts.map +1 -1
  244. package/dist/src/components/form/FormSelect.js +1 -1
  245. package/dist/src/components/form/FormSelect.js.map +1 -1
  246. package/dist/src/components/form/FormSelectTypeahead.d.ts.map +1 -1
  247. package/dist/src/components/form/FormSelectTypeahead.js +84 -4
  248. package/dist/src/components/form/FormSelectTypeahead.js.map +1 -1
  249. package/dist/src/components/form/ListItemField.d.ts +12 -0
  250. package/dist/src/components/form/ListItemField.d.ts.map +1 -0
  251. package/dist/src/components/form/ListItemField.js +67 -0
  252. package/dist/src/components/form/ListItemField.js.map +1 -0
  253. package/dist/src/components/form/NameField.d.ts +1 -1
  254. package/dist/src/components/form/NameField.d.ts.map +1 -1
  255. package/dist/src/components/form/NameField.js +4 -2
  256. package/dist/src/components/form/NameField.js.map +1 -1
  257. package/dist/src/components/form/SwitchField.d.ts +2 -1
  258. package/dist/src/components/form/SwitchField.d.ts.map +1 -1
  259. package/dist/src/components/form/SwitchField.js +2 -2
  260. package/dist/src/components/form/SwitchField.js.map +1 -1
  261. package/dist/src/components/form/validations.d.ts +64 -4
  262. package/dist/src/components/form/validations.d.ts.map +1 -1
  263. package/dist/src/components/form/validations.js +340 -41
  264. package/dist/src/components/form/validations.js.map +1 -1
  265. package/dist/src/constants.d.ts +1 -1
  266. package/dist/src/constants.d.ts.map +1 -1
  267. package/dist/src/constants.js +1 -1
  268. package/dist/src/constants.js.map +1 -1
  269. package/dist/src/hooks/useAlertsEnabled.d.ts.map +1 -1
  270. package/dist/src/hooks/useAlertsEnabled.js +10 -4
  271. package/dist/src/hooks/useAlertsEnabled.js.map +1 -1
  272. package/dist/src/hooks/useAppContext.d.ts +4 -2
  273. package/dist/src/hooks/useAppContext.d.ts.map +1 -1
  274. package/dist/src/hooks/useAppContext.js +4 -1
  275. package/dist/src/hooks/useAppContext.js.map +1 -1
  276. package/dist/src/hooks/useFetch.d.ts +0 -1
  277. package/dist/src/hooks/useFetch.d.ts.map +1 -1
  278. package/dist/src/hooks/useNavigate.d.ts +6 -2
  279. package/dist/src/hooks/useNavigate.d.ts.map +1 -1
  280. package/dist/src/hooks/useNavigate.js +4 -0
  281. package/dist/src/hooks/useNavigate.js.map +1 -1
  282. package/dist/src/hooks/usePendingEnrollmentRequestsCount.d.ts.map +1 -1
  283. package/dist/src/hooks/usePendingEnrollmentRequestsCount.js +9 -1
  284. package/dist/src/hooks/usePendingEnrollmentRequestsCount.js.map +1 -1
  285. package/dist/src/hooks/useSystemRestoreContext.d.ts.map +1 -1
  286. package/dist/src/hooks/useSystemRestoreContext.js +3 -2
  287. package/dist/src/hooks/useSystemRestoreContext.js.map +1 -1
  288. package/dist/src/hooks/useWebSocket.d.ts.map +1 -1
  289. package/dist/src/hooks/useWebSocket.js +47 -19
  290. package/dist/src/hooks/useWebSocket.js.map +1 -1
  291. package/dist/src/types/deviceSpec.d.ts +50 -15
  292. package/dist/src/types/deviceSpec.d.ts.map +1 -1
  293. package/dist/src/types/deviceSpec.js +17 -8
  294. package/dist/src/types/deviceSpec.js.map +1 -1
  295. package/dist/src/types/extraTypes.d.ts +14 -2
  296. package/dist/src/types/extraTypes.d.ts.map +1 -1
  297. package/dist/src/types/extraTypes.js +11 -1
  298. package/dist/src/types/extraTypes.js.map +1 -1
  299. package/dist/src/types/rbac.d.ts +2 -1
  300. package/dist/src/types/rbac.d.ts.map +1 -1
  301. package/dist/src/types/rbac.js +1 -0
  302. package/dist/src/types/rbac.js.map +1 -1
  303. package/dist/src/utils/authProvider.d.ts +4 -0
  304. package/dist/src/utils/authProvider.d.ts.map +1 -0
  305. package/dist/src/utils/authProvider.js +22 -0
  306. package/dist/src/utils/authProvider.js.map +1 -0
  307. package/dist/src/utils/error.d.ts +1 -0
  308. package/dist/src/utils/error.d.ts.map +1 -1
  309. package/dist/src/utils/error.js +6 -1
  310. package/dist/src/utils/error.js.map +1 -1
  311. package/dist/src/utils/k8sProvider.d.ts +3 -0
  312. package/dist/src/utils/k8sProvider.d.ts.map +1 -0
  313. package/dist/src/utils/k8sProvider.js +18 -0
  314. package/dist/src/utils/k8sProvider.js.map +1 -0
  315. package/dist/src/utils/patch.d.ts.map +1 -1
  316. package/dist/src/utils/patch.js +3 -1
  317. package/dist/src/utils/patch.js.map +1 -1
  318. package/dist/src/utils/status/applications.d.ts.map +1 -1
  319. package/dist/src/utils/status/applications.js +7 -0
  320. package/dist/src/utils/status/applications.js.map +1 -1
  321. package/package.json +1 -1
  322. package/src/components/AuthProvider/AuthProviderDetails/AuthProviderDetails.tsx +111 -0
  323. package/src/components/AuthProvider/AuthProviderDetails/AuthProviderDetailsTab.tsx +239 -0
  324. package/src/components/AuthProvider/AuthProviderDetails/DeleteAuthProviderModal.tsx +95 -0
  325. package/src/components/AuthProvider/AuthProviderDetails/RoleAssigmentDetails.tsx +53 -0
  326. package/src/components/AuthProvider/AuthProviderRow.tsx +84 -0
  327. package/src/components/AuthProvider/AuthProvidersPage.tsx +168 -0
  328. package/src/components/AuthProvider/CreateAuthProvider/AuthOrganizationAssignment.tsx +102 -0
  329. package/src/components/AuthProvider/CreateAuthProvider/AuthProviderHelperText.tsx +78 -0
  330. package/src/components/AuthProvider/CreateAuthProvider/CreateAuthProvider.tsx +145 -0
  331. package/src/components/AuthProvider/CreateAuthProvider/CreateAuthProviderForm.tsx +284 -0
  332. package/src/components/AuthProvider/CreateAuthProvider/Oauth2ProviderFields.tsx +24 -0
  333. package/src/components/AuthProvider/CreateAuthProvider/RoleAssignmentSection.tsx +165 -0
  334. package/src/components/AuthProvider/CreateAuthProvider/types.ts +96 -0
  335. package/src/components/AuthProvider/CreateAuthProvider/utils.ts +557 -0
  336. package/src/components/AuthProvider/TestConnectionModal/TestConnectionModal.tsx +136 -0
  337. package/src/components/AuthProvider/useAuthProviders.ts +18 -0
  338. package/src/components/DetailsPage/DetailsPage.tsx +1 -1
  339. package/src/components/DetailsPage/DetailsPageActions.tsx +2 -0
  340. package/src/components/DetailsPage/Tables/ApplicationsTable.tsx +29 -132
  341. package/src/components/DetailsPage/Tables/SystemdUnitsTable.tsx +98 -0
  342. package/src/components/Device/DeviceDetails/DeviceApplications.tsx +3 -73
  343. package/src/components/Device/DeviceDetails/DeviceDetailsPage.tsx +19 -9
  344. package/src/components/Device/DeviceDetails/DeviceDetailsTab.tsx +6 -2
  345. package/src/components/Device/DeviceDetails/DeviceSystemdUnits.tsx +30 -0
  346. package/src/components/Device/DeviceDetails/TerminalTab.tsx +57 -24
  347. package/src/components/Device/DevicesPage/DecommissionedDevicesTable.tsx +8 -3
  348. package/src/components/Device/DevicesPage/DevicesEmptyStates.tsx +3 -2
  349. package/src/components/Device/DevicesPage/DevicesPage.tsx +9 -15
  350. package/src/components/Device/DevicesPage/EnrolledDevicesTable.tsx +9 -4
  351. package/src/components/Device/EditDeviceWizard/EditDeviceWizard.tsx +10 -4
  352. package/src/components/Device/EditDeviceWizard/deviceSpecUtils.ts +295 -60
  353. package/src/components/Device/EditDeviceWizard/steps/ApplicationContainerForm.css +5 -0
  354. package/src/components/Device/EditDeviceWizard/steps/ApplicationContainerForm.tsx +312 -0
  355. package/src/components/Device/EditDeviceWizard/steps/ApplicationImageForm.tsx +2 -2
  356. package/src/components/Device/EditDeviceWizard/steps/ApplicationInlineForm.tsx +3 -3
  357. package/src/components/Device/EditDeviceWizard/steps/ApplicationTemplates.tsx +196 -80
  358. package/src/components/Device/EditDeviceWizard/steps/ApplicationVolumeForm.tsx +149 -0
  359. package/src/components/Device/EditDeviceWizard/steps/ConfigurationTemplates.tsx +6 -4
  360. package/src/components/Device/EditDeviceWizard/steps/DeviceTemplateStep.tsx +1 -1
  361. package/src/components/Device/EditDeviceWizard/steps/ReviewApplications.tsx +26 -10
  362. package/src/components/Device/EditDeviceWizard/utils.ts +15 -1
  363. package/src/components/EnrollmentRequest/EnrollmentRequestDetails/EnrollmentRequestDetails.tsx +10 -4
  364. package/src/components/EnrollmentRequest/EnrollmentRequestList.tsx +9 -13
  365. package/src/components/Fleet/CreateFleet/CreateFleetWizard.tsx +11 -8
  366. package/src/components/Fleet/CreateFleet/utils.ts +2 -4
  367. package/src/components/Fleet/FleetDetails/FleetDetailsPage.tsx +11 -6
  368. package/src/components/Fleet/FleetDetails/FleetYaml.tsx +13 -0
  369. package/src/components/Fleet/FleetResourceSyncs.tsx +3 -2
  370. package/src/components/Fleet/FleetsPage.tsx +34 -27
  371. package/src/components/Fleet/ImportFleetWizard/ImportFleetWizard.tsx +10 -2
  372. package/src/components/Fleet/ImportFleetWizard/steps/RepositoryStep.tsx +3 -2
  373. package/src/components/ListPage/ListPage.tsx +1 -8
  374. package/src/components/Login/ProviderSelector.tsx +114 -0
  375. package/src/components/Login/TokenLoginForm.tsx +202 -0
  376. package/src/components/Masthead/CommandLineToolsPage.tsx +1 -11
  377. package/src/components/OverviewPage/Cards/Alerts/AlertsCard.tsx +2 -0
  378. package/src/components/OverviewPage/Overview.tsx +9 -4
  379. package/src/components/OverviewPage/OverviewPage.tsx +6 -13
  380. package/src/components/Repository/CreateRepository/CreateRepository.tsx +3 -2
  381. package/src/components/Repository/CreateRepository/CreateRepositoryForm.tsx +3 -2
  382. package/src/components/Repository/RepositoryDetails/RepositoryDetails.tsx +11 -9
  383. package/src/components/Repository/RepositoryList.tsx +11 -5
  384. package/src/components/ResourceSync/RepositoryResourceSyncList.tsx +8 -3
  385. package/src/components/Terminal/Terminal.css +12 -1
  386. package/src/components/Terminal/Terminal.tsx +3 -3
  387. package/src/components/common/CodeEditor/YamlEditor.tsx +195 -15
  388. package/src/components/common/CodeEditor/YamlEditorBase.tsx +42 -8
  389. package/src/components/common/OrganizationGuard.tsx +19 -27
  390. package/src/components/common/OrganizationSelector.tsx +65 -38
  391. package/src/components/common/PageNavigation.css +9 -0
  392. package/src/components/common/PageNavigation.tsx +42 -14
  393. package/src/components/common/PermissionsContext.tsx +108 -0
  394. package/src/components/form/FilterSelect.tsx +2 -0
  395. package/src/components/form/FormSelect.tsx +2 -0
  396. package/src/components/form/FormSelectTypeahead.tsx +97 -4
  397. package/src/components/form/ListItemField.tsx +123 -0
  398. package/src/components/form/NameField.tsx +3 -1
  399. package/src/components/form/SwitchField.tsx +3 -2
  400. package/src/components/form/validations.ts +430 -65
  401. package/src/constants.ts +1 -1
  402. package/src/hooks/useAlertsEnabled.ts +10 -5
  403. package/src/hooks/useAppContext.tsx +4 -3
  404. package/src/hooks/useNavigate.tsx +7 -1
  405. package/src/hooks/usePendingEnrollmentRequestsCount.ts +13 -1
  406. package/src/hooks/useSystemRestoreContext.tsx +3 -2
  407. package/src/hooks/useWebSocket.ts +53 -16
  408. package/src/types/deviceSpec.ts +72 -22
  409. package/src/types/extraTypes.ts +19 -1
  410. package/src/types/rbac.ts +1 -0
  411. package/src/utils/authProvider.ts +20 -0
  412. package/src/utils/error.ts +5 -0
  413. package/src/utils/k8sProvider.ts +11 -0
  414. package/src/utils/patch.ts +3 -1
  415. package/src/utils/status/applications.ts +7 -0
  416. package/dist/src/components/DetailsPage/Tables/ApplicationsTable.css +0 -7
  417. package/dist/src/components/common/ButtonWithPermissions.d.ts +0 -8
  418. package/dist/src/components/common/ButtonWithPermissions.d.ts.map +0 -1
  419. package/dist/src/components/common/ButtonWithPermissions.js +0 -12
  420. package/dist/src/components/common/ButtonWithPermissions.js.map +0 -1
  421. package/dist/src/components/common/TechPreviewBadge.d.ts +0 -4
  422. package/dist/src/components/common/TechPreviewBadge.d.ts.map +0 -1
  423. package/dist/src/components/common/TechPreviewBadge.js +0 -24
  424. package/dist/src/components/common/TechPreviewBadge.js.map +0 -1
  425. package/dist/src/hooks/useAccessReview.d.ts +0 -4
  426. package/dist/src/hooks/useAccessReview.d.ts.map +0 -1
  427. package/dist/src/hooks/useAccessReview.js +0 -46
  428. package/dist/src/hooks/useAccessReview.js.map +0 -1
  429. package/dist/src/hooks/useFleetImportAccessReview.d.ts +0 -3
  430. package/dist/src/hooks/useFleetImportAccessReview.d.ts.map +0 -1
  431. package/dist/src/hooks/useFleetImportAccessReview.js +0 -12
  432. package/dist/src/hooks/useFleetImportAccessReview.js.map +0 -1
  433. package/src/components/DetailsPage/Tables/ApplicationsTable.css +0 -7
  434. package/src/components/common/ButtonWithPermissions.tsx +0 -14
  435. package/src/components/common/TechPreviewBadge.tsx +0 -45
  436. package/src/hooks/useAccessReview.ts +0 -49
  437. package/src/hooks/useFleetImportAccessReview.ts +0 -8
@@ -1,7 +1,7 @@
1
1
  import * as React from 'react';
2
2
  import { DeviceSummaryStatusType, DevicesSummary } from '@flightctl/types';
3
3
  import { useDevicesSummary } from '../components/Device/DevicesPage/useDevices';
4
- import { useAccessReview } from './useAccessReview';
4
+ import { usePermissionsContext } from '../components/common/PermissionsContext';
5
5
  import { RESOURCE, VERB } from '../types/rbac';
6
6
 
7
7
  interface SystemRestoreContextData {
@@ -18,7 +18,8 @@ const SystemRestoreContext = React.createContext<SystemRestoreContextData | unde
18
18
  * This provides data needed for showing consistent restore banners across all pages.
19
19
  */
20
20
  export const SystemRestoreProvider = ({ children }: React.PropsWithChildren) => {
21
- const [canListDevices] = useAccessReview(RESOURCE.DEVICE, VERB.LIST);
21
+ const { checkPermissions } = usePermissionsContext();
22
+ const [canListDevices] = checkPermissions([{ kind: RESOURCE.DEVICE, verb: VERB.LIST }]);
22
23
 
23
24
  // We obtain the unfiltered device summary to detect if any devices are in system restore statuses
24
25
  const [devicesSummary, isLoading] = useDevicesSummary({});
@@ -33,6 +33,7 @@ export const useWebSocket = <T>(
33
33
  } = useAppContext();
34
34
  const { t } = useTranslation();
35
35
  const wsRef = React.useRef<WebSocket>();
36
+ const isMountedRef = React.useRef(true);
36
37
  const [isConnecting, setIsConnecting] = React.useState(true);
37
38
  const [isClosed, setIsClosed] = React.useState(false);
38
39
  const [error, setError] = React.useState<unknown>();
@@ -42,6 +43,13 @@ export const useWebSocket = <T>(
42
43
  wsRef.current?.send(msgToBytes(data, resize));
43
44
  }, []);
44
45
 
46
+ React.useEffect(() => {
47
+ isMountedRef.current = true;
48
+ return () => {
49
+ isMountedRef.current = false;
50
+ };
51
+ }, []);
52
+
45
53
  React.useEffect(() => {
46
54
  try {
47
55
  setIsConnecting(true);
@@ -58,25 +66,49 @@ export const useWebSocket = <T>(
58
66
  }
59
67
 
60
68
  const ws = new WebSocket(`${wsEndpoint}?${params.toString()}`, 'v5.channel.k8s.io');
61
- ws.addEventListener('open', () => setIsConnecting(false));
62
- ws.addEventListener('close', () => {
63
- setIsClosed(true);
69
+
70
+ const handleOpen = () => {
71
+ if (isMountedRef.current) {
72
+ setIsConnecting(false);
73
+ }
74
+ };
75
+
76
+ const handleClose = () => {
77
+ if (isMountedRef.current) {
78
+ setIsClosed(true);
79
+ }
64
80
  wsRef.current = undefined;
65
- });
66
- ws.addEventListener('error', (evt) => {
81
+ };
82
+
83
+ const handleError = (evt: Event) => {
67
84
  // eslint-disable-next-line no-console
68
85
  console.error('Error creating websocket:', evt);
69
- setError(t('Websocket error occured'));
70
- });
86
+ if (isMountedRef.current) {
87
+ setError(t('Websocket error occured'));
88
+ }
89
+ };
90
+
91
+ ws.addEventListener('open', handleOpen);
92
+ ws.addEventListener('close', handleClose);
93
+ ws.addEventListener('error', handleError);
71
94
  wsRef.current = ws;
95
+
96
+ return () => {
97
+ ws.removeEventListener('open', handleOpen);
98
+ ws.removeEventListener('close', handleClose);
99
+ ws.removeEventListener('error', handleError);
100
+ ws.close();
101
+ wsRef.current = undefined;
102
+ };
72
103
  } catch (err) {
73
- setIsConnecting(false);
74
- setError(err);
104
+ if (isMountedRef.current) {
105
+ setIsConnecting(false);
106
+ setError(err);
107
+ }
108
+ return () => {
109
+ // No cleanup needed if WebSocket creation failed
110
+ };
75
111
  }
76
- return () => {
77
- wsRef.current?.close();
78
- wsRef.current = undefined;
79
- };
80
112
  }, [deviceId, organizationId, t, getWsEndpoint, reset, wsMetadata]);
81
113
 
82
114
  const reconnect = React.useCallback(() => {
@@ -86,10 +118,15 @@ export const useWebSocket = <T>(
86
118
  }, []);
87
119
 
88
120
  React.useEffect(() => {
89
- const listener = (evt: MessageEvent<T>) => onMsgReceived(evt.data);
90
- wsRef.current?.addEventListener('message', listener);
121
+ const listener = (evt: MessageEvent<T>) => {
122
+ if (isMountedRef.current) {
123
+ onMsgReceived(evt.data);
124
+ }
125
+ };
126
+ const ws = wsRef.current;
127
+ ws?.addEventListener('message', listener);
91
128
  return () => {
92
- wsRef.current?.removeEventListener('message', listener);
129
+ ws?.removeEventListener('message', listener);
93
130
  };
94
131
  }, [onMsgReceived, reset]);
95
132
 
@@ -1,17 +1,17 @@
1
1
  import {
2
+ AppType,
3
+ ApplicationResourceLimits,
2
4
  ConfigProviderSpec,
3
5
  DisruptionBudget,
4
6
  GitConfigProviderSpec,
5
7
  HttpConfigProviderSpec,
6
8
  ImageApplicationProviderSpec,
7
9
  ImagePullPolicy,
8
- InlineApplicationProviderSpec,
9
10
  InlineConfigProviderSpec,
10
11
  KubernetesSecretProviderSpec,
11
12
  } from '@flightctl/types';
12
- import { FlightCtlLabel } from './extraTypes';
13
+ import { ApplicationProviderSpecFixed, FlightCtlLabel } from './extraTypes';
13
14
  import { UpdateScheduleMode } from '../utils/time';
14
- import { ApplicationProviderSpecFixed } from './extraTypes';
15
15
 
16
16
  export enum ConfigType {
17
17
  GIT = 'git',
@@ -44,26 +44,53 @@ type InlineContent = {
44
44
  };
45
45
 
46
46
  type AppBase = {
47
+ appType: AppType;
47
48
  specType: AppSpecType;
48
- // appType: AppType - commented out for now, since it only accepts one value ("compose")
49
49
  name?: string;
50
50
  variables: { name: string; value: string }[];
51
- volumes?: {
52
- name: string;
53
- reference: string;
54
- pullPolicy?: ImagePullPolicy;
55
- }[];
51
+ volumes?: ApplicationVolumeForm[];
56
52
  };
57
53
 
58
- export type InlineAppForm = AppBase & {
59
- name: string; // name can only be optional for image applications
54
+ export type PortMapping = {
55
+ hostPort: string;
56
+ containerPort: string;
57
+ };
58
+
59
+ export type SingleContainerAppForm = AppBase & {
60
+ appType: AppType.AppTypeContainer;
61
+ specType: AppSpecType.OCI_IMAGE;
62
+ name: string;
63
+ image: string;
64
+ ports?: PortMapping[];
65
+ limits?: ApplicationResourceLimits;
66
+ };
67
+
68
+ export type QuadletImageAppForm = AppBase & {
69
+ appType: AppType.AppTypeQuadlet;
70
+ specType: AppSpecType.OCI_IMAGE;
71
+ image: string;
72
+ };
73
+
74
+ export type QuadletInlineAppForm = AppBase & {
75
+ appType: AppType.AppTypeQuadlet;
76
+ specType: AppSpecType.INLINE;
77
+ name: string; // transforms the field in required
60
78
  files: InlineContent[];
61
79
  };
62
80
 
63
- export type ImageAppForm = AppBase & {
81
+ export type ComposeImageAppForm = AppBase & {
82
+ appType: AppType.AppTypeCompose;
83
+ specType: AppSpecType.OCI_IMAGE;
64
84
  image: string;
65
85
  };
66
86
 
87
+ export type ComposeInlineAppForm = AppBase & {
88
+ appType: AppType.AppTypeCompose;
89
+ specType: AppSpecType.INLINE;
90
+ name: string;
91
+ files: InlineContent[];
92
+ };
93
+
67
94
  export const isGitConfigTemplate = (configTemplate: ConfigTemplate): configTemplate is GitConfigTemplate =>
68
95
  configTemplate.type === ConfigType.GIT;
69
96
 
@@ -81,20 +108,43 @@ export type RepoConfig = GitConfigProviderSpec | HttpConfigProviderSpec;
81
108
  export const isRepoConfig = (config: ConfigSourceProvider): config is RepoConfig =>
82
109
  isGitProviderSpec(config) || isHttpProviderSpec(config);
83
110
 
84
- export type AppForm = ImageAppForm | InlineAppForm;
85
-
86
- export const isInlineAppProvider = (app: ApplicationProviderSpecFixed): app is InlineApplicationProviderSpec =>
87
- 'inline' in app;
88
- export const isImageAppProvider = (app: ApplicationProviderSpecFixed): app is ImageApplicationProviderSpec =>
89
- 'image' in app;
90
-
91
- export const isImageAppForm = (app: AppBase): app is ImageAppForm => app.specType === AppSpecType.OCI_IMAGE;
92
- export const isInlineAppForm = (app: AppBase): app is InlineAppForm => app.specType === AppSpecType.INLINE;
111
+ export type AppForm =
112
+ | QuadletImageAppForm
113
+ | QuadletInlineAppForm
114
+ | ComposeImageAppForm
115
+ | ComposeInlineAppForm
116
+ | SingleContainerAppForm;
117
+
118
+ export const isImageAppProvider = (
119
+ app: ApplicationProviderSpecFixed,
120
+ ): app is ApplicationProviderSpecFixed & ImageApplicationProviderSpec => 'image' in app;
121
+
122
+ // Type guards for the 5 explicit types
123
+ export const isQuadletImageAppForm = (app: AppBase): app is QuadletImageAppForm =>
124
+ app.appType === AppType.AppTypeQuadlet && app.specType === AppSpecType.OCI_IMAGE;
125
+ export const isQuadletInlineAppForm = (app: AppBase): app is QuadletInlineAppForm =>
126
+ app.appType === AppType.AppTypeQuadlet && app.specType === AppSpecType.INLINE;
127
+ export const isComposeImageAppForm = (app: AppBase): app is ComposeImageAppForm =>
128
+ app.appType === AppType.AppTypeCompose && app.specType === AppSpecType.OCI_IMAGE;
129
+ export const isComposeInlineAppForm = (app: AppBase): app is ComposeInlineAppForm =>
130
+ app.appType === AppType.AppTypeCompose && app.specType === AppSpecType.INLINE;
131
+ export const isSingleContainerAppForm = (app: AppBase): app is SingleContainerAppForm =>
132
+ app.appType === AppType.AppTypeContainer;
133
+
134
+ export type ApplicationVolumeForm = {
135
+ name: string;
136
+ imageRef?: string;
137
+ imagePullPolicy?: ImagePullPolicy;
138
+ mountPath?: string;
139
+ };
93
140
 
94
141
  const hasTemplateVariables = (str: string) => /{{.+?}}/.test(str);
95
142
 
96
143
  export const getAppIdentifier = (app: AppForm) => {
97
- if (isImageAppForm(app)) {
144
+ if (isSingleContainerAppForm(app)) {
145
+ return app.name || app.image;
146
+ }
147
+ if (isQuadletImageAppForm(app) || isComposeImageAppForm(app)) {
98
148
  return app.name || app.image;
99
149
  }
100
150
  // Name is mandatory for inline applications
@@ -2,12 +2,15 @@ import {
2
2
  AppType,
3
3
  ApplicationEnvVars,
4
4
  ApplicationVolumeProviderSpec,
5
+ AuthProvider,
5
6
  ConditionType,
6
7
  Device,
7
8
  EnrollmentRequest,
8
9
  FileContent,
9
10
  Fleet,
10
11
  ImageApplicationProviderSpec,
12
+ OAuth2ProviderSpec,
13
+ OIDCProviderSpec,
11
14
  RelativePath,
12
15
  ResourceSync,
13
16
  } from '@flightctl/types';
@@ -44,7 +47,7 @@ export type InlineApplicationFileFixed = FileContent & RelativePath;
44
47
  export type ApplicationProviderSpecFixed = ApplicationEnvVars &
45
48
  ApplicationVolumeProviderSpec & {
46
49
  name?: string;
47
- appType?: AppType;
50
+ appType: AppType;
48
51
  } & (ImageApplicationProviderSpec | { inline: InlineApplicationFileFixed[] });
49
52
 
50
53
  type CliArtifact = {
@@ -75,3 +78,18 @@ export type AlertManagerAlert = {
75
78
  };
76
79
  receivers: Array<{ name: string }>;
77
80
  };
81
+
82
+ // AuthProviders that can be added dynamically to the system can only be OAuth2 or OIDC.
83
+ export type DynamicAuthProviderSpec = OIDCProviderSpec | OAuth2ProviderSpec;
84
+ export type DynamicAuthProvider = AuthProvider & { spec: DynamicAuthProviderSpec };
85
+
86
+ export const isDynamicAuthProvider = (provider: AuthProvider): provider is DynamicAuthProvider =>
87
+ provider.spec.providerType === ProviderType.OIDC || provider.spec.providerType === ProviderType.OAuth2;
88
+
89
+ export enum ProviderType {
90
+ OIDC = 'oidc',
91
+ OAuth2 = 'oauth2',
92
+ K8s = 'k8s',
93
+ AAP = 'aap',
94
+ OpenShift = 'openshift',
95
+ }
package/src/types/rbac.ts CHANGED
@@ -19,4 +19,5 @@ export enum RESOURCE {
19
19
  ENROLLMENT_REQUEST = 'enrollmentrequests',
20
20
  ENROLLMENT_REQUEST_APPROVAL = 'enrollmentrequests/approval',
21
21
  ALERTS = 'alerts',
22
+ AUTH_PROVIDER = 'authproviders',
22
23
  }
@@ -0,0 +1,20 @@
1
+ import { TFunction } from 'react-i18next';
2
+ import { AuthProvider } from '@flightctl/types';
3
+ import { ProviderType } from '../types/extraTypes';
4
+
5
+ export const getProviderDisplayName = (provider: AuthProvider, t: TFunction): string => {
6
+ const spec = provider.spec;
7
+ if ('displayName' in spec && spec.displayName) {
8
+ return spec.displayName;
9
+ }
10
+ if (provider.spec.providerType === ProviderType.OpenShift) {
11
+ return t('OpenShift');
12
+ }
13
+ if (provider.spec.providerType === ProviderType.K8s) {
14
+ return t('Kubernetes');
15
+ }
16
+ if (provider.spec.providerType === ProviderType.AAP) {
17
+ return t('Ansible Automation Platform');
18
+ }
19
+ return provider.metadata.name as string;
20
+ };
@@ -22,3 +22,8 @@ export const getConditionMessage = (condition: Condition, reason?: string): stri
22
22
  [uppercaseSentence(reason || condition.reason), uppercaseSentence(condition.message)]
23
23
  .filter((msg) => !!msg)
24
24
  .join('. ');
25
+
26
+ export const isResourceVersionTestFailure = (error: unknown): boolean => {
27
+ const errorMessage = getErrorMessage(error);
28
+ return errorMessage.includes('Error 400') && errorMessage.includes('/metadata/resourceVersion');
29
+ };
@@ -0,0 +1,11 @@
1
+ // Simple JWT format validation - checks if token has 3 parts separated by dots
2
+ export const isValidJwtTokenFormat = (token: string): boolean => {
3
+ if (!token) return false;
4
+ const parts = token.split('.');
5
+ if (parts.length !== 3) return false;
6
+ // Check that each part contains only valid base64url characters
7
+ const base64urlPattern = /^[A-Za-z0-9_-]+$/;
8
+ return parts.every((part) => part.length > 0 && base64urlPattern.test(part));
9
+ };
10
+
11
+ export const nowInSeconds = () => Math.round(Date.now() / 1000);
@@ -36,7 +36,9 @@ export const appendJSONPatch = <V = unknown>({
36
36
  if (newValue === originalValue) {
37
37
  return;
38
38
  }
39
- if (!newValue && originalValue) {
39
+ // For boolean values, we should never remove them, only set them to true or false
40
+ // For other values, if newValue is falsy and originalValue exists, remove the field
41
+ if (!newValue && originalValue && typeof newValue !== 'boolean') {
40
42
  patches.push({
41
43
  op: 'remove',
42
44
  path,
@@ -5,6 +5,7 @@ import {
5
5
  ApplicationsSummaryStatusType as AppSummaryStatus,
6
6
  } from '@flightctl/types';
7
7
  import { StatusItem } from './common';
8
+ import { ResourcesEmptyIcon } from '@patternfly/react-icons/dist/js/icons/resources-empty-icon';
8
9
 
9
10
  export const getApplicationSummaryStatusItems = (t: TFunction): StatusItem<AppSummaryStatus>[] => [
10
11
  {
@@ -23,6 +24,12 @@ export const getApplicationSummaryStatusItems = (t: TFunction): StatusItem<AppSu
23
24
  label: t('Unknown'),
24
25
  level: 'unknown',
25
26
  },
27
+ {
28
+ id: AppSummaryStatus.ApplicationsSummaryStatusNoApplications,
29
+ label: t('No applications'),
30
+ level: 'info',
31
+ customIcon: ResourcesEmptyIcon,
32
+ },
26
33
  {
27
34
  id: AppSummaryStatus.ApplicationsSummaryStatusHealthy,
28
35
  label: t('Healthy'),
@@ -1,7 +0,0 @@
1
- .fctl-applications-table__row .pf-v5-c-button {
2
- visibility: hidden;
3
- }
4
-
5
- .fctl-applications-table__row:hover .pf-v5-c-button {
6
- visibility: visible;
7
- }
@@ -1,8 +0,0 @@
1
- import * as React from 'react';
2
- import { ButtonProps } from '@patternfly/react-core';
3
- import { AccessReviewResult } from '../../hooks/useAccessReview';
4
- declare const ButtonWithPermissions: ({ permissions, children, ...rest }: ButtonProps & {
5
- permissions: AccessReviewResult;
6
- }) => false | React.JSX.Element;
7
- export default ButtonWithPermissions;
8
- //# sourceMappingURL=ButtonWithPermissions.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ButtonWithPermissions.d.ts","sourceRoot":"","sources":["../../../../src/components/common/ButtonWithPermissions.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAU,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAC7D,OAAO,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAEjE,QAAA,MAAM,qBAAqB;;+BAO1B,CAAC;AAEF,eAAe,qBAAqB,CAAC"}
@@ -1,12 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- const tslib_1 = require("tslib");
4
- const React = tslib_1.__importStar(require("react"));
5
- const react_core_1 = require("@patternfly/react-core");
6
- const ButtonWithPermissions = (_a) => {
7
- var { permissions, children } = _a, rest = tslib_1.__rest(_a, ["permissions", "children"]);
8
- const [allowed] = permissions;
9
- return allowed && React.createElement(react_core_1.Button, Object.assign({}, rest), children);
10
- };
11
- exports.default = ButtonWithPermissions;
12
- //# sourceMappingURL=ButtonWithPermissions.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ButtonWithPermissions.js","sourceRoot":"","sources":["../../../../src/components/common/ButtonWithPermissions.tsx"],"names":[],"mappings":";;;AAAA,qDAA+B;AAC/B,uDAA6D;AAG7D,MAAM,qBAAqB,GAAG,CAAC,EAIqB,EAAE,EAAE;QAJzB,EAC7B,WAAW,EACX,QAAQ,OAE0C,EAD/C,IAAI,sBAHsB,2BAI9B,CADQ;IAEP,MAAM,CAAC,OAAO,CAAC,GAAG,WAAW,CAAC;IAC9B,OAAO,OAAO,IAAI,oBAAC,mBAAM,oBAAK,IAAI,GAAG,QAAQ,CAAU,CAAC;AAC1D,CAAC,CAAC;AAEF,kBAAe,qBAAqB,CAAC"}
@@ -1,4 +0,0 @@
1
- import * as React from 'react';
2
- declare const TechPreviewBadge: () => React.JSX.Element;
3
- export default TechPreviewBadge;
4
- //# sourceMappingURL=TechPreviewBadge.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"TechPreviewBadge.d.ts","sourceRoot":"","sources":["../../../../src/components/common/TechPreviewBadge.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AA2B/B,QAAA,MAAM,gBAAgB,yBAerB,CAAC;AAEF,eAAe,gBAAgB,CAAC"}
@@ -1,24 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- const tslib_1 = require("tslib");
4
- const React = tslib_1.__importStar(require("react"));
5
- const react_core_1 = require("@patternfly/react-core");
6
- const icons_1 = require("@patternfly/react-icons/dist/js/icons");
7
- const useTranslation_1 = require("../../hooks/useTranslation");
8
- const LearnMoreLink_1 = tslib_1.__importDefault(require("./LearnMoreLink"));
9
- // Links to general Red Hat docs
10
- const TECH_PREVIEW_LEVEL_LINK = 'https://access.redhat.com/support/offerings/techpreview';
11
- const TechPreviewPopoverContent = () => {
12
- const { t } = (0, useTranslation_1.useTranslation)();
13
- return (React.createElement(react_core_1.Stack, null,
14
- React.createElement(react_core_1.StackItem, null, t('Technology preview features provide early access to upcoming product innovations, enabling you to test functionality and provide feedback during the development process.')),
15
- React.createElement(react_core_1.StackItem, null,
16
- React.createElement(LearnMoreLink_1.default, { link: TECH_PREVIEW_LEVEL_LINK }))));
17
- };
18
- const TechPreviewBadge = () => {
19
- const { t } = (0, useTranslation_1.useTranslation)();
20
- return (React.createElement(react_core_1.Popover, { "aria-label": t('Technology preview description'), bodyContent: React.createElement(TechPreviewPopoverContent, null), withFocusTrap: true, triggerAction: "click" },
21
- React.createElement(react_core_1.Label, { color: "orange", icon: React.createElement(icons_1.InfoCircleIcon, null) }, t('Technology preview'))));
22
- };
23
- exports.default = TechPreviewBadge;
24
- //# sourceMappingURL=TechPreviewBadge.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"TechPreviewBadge.js","sourceRoot":"","sources":["../../../../src/components/common/TechPreviewBadge.tsx"],"names":[],"mappings":";;;AAAA,qDAA+B;AAC/B,uDAA0E;AAC1E,iEAAuE;AAEvE,+DAA4D;AAC5D,4EAA4C;AAE5C,gCAAgC;AAChC,MAAM,uBAAuB,GAAG,yDAAyD,CAAC;AAE1F,MAAM,yBAAyB,GAAG,GAAG,EAAE;IACrC,MAAM,EAAE,CAAC,EAAE,GAAG,IAAA,+BAAc,GAAE,CAAC;IAE/B,OAAO,CACL,oBAAC,kBAAK;QACJ,oBAAC,sBAAS,QACP,CAAC,CACA,2KAA2K,CAC5K,CACS;QACZ,oBAAC,sBAAS;YACR,oBAAC,uBAAa,IAAC,IAAI,EAAE,uBAAuB,GAAI,CACtC,CACN,CACT,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,gBAAgB,GAAG,GAAG,EAAE;IAC5B,MAAM,EAAE,CAAC,EAAE,GAAG,IAAA,+BAAc,GAAE,CAAC;IAE/B,OAAO,CACL,oBAAC,oBAAO,kBACM,CAAC,CAAC,gCAAgC,CAAC,EAC/C,WAAW,EAAE,oBAAC,yBAAyB,OAAG,EAC1C,aAAa,QACb,aAAa,EAAC,OAAO;QAErB,oBAAC,kBAAK,IAAC,KAAK,EAAC,QAAQ,EAAC,IAAI,EAAE,oBAAC,sBAAc,OAAG,IAC3C,CAAC,CAAC,oBAAoB,CAAC,CAClB,CACA,CACX,CAAC;AACJ,CAAC,CAAC;AAEF,kBAAe,gBAAgB,CAAC"}
@@ -1,4 +0,0 @@
1
- import { RESOURCE, VERB } from '../types/rbac';
2
- export type AccessReviewResult = [boolean, boolean, string | undefined];
3
- export declare const useAccessReview: (kind: RESOURCE, verb: VERB) => AccessReviewResult;
4
- //# sourceMappingURL=useAccessReview.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"useAccessReview.d.ts","sourceRoot":"","sources":["../../../src/hooks/useAccessReview.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAE/C,MAAM,MAAM,kBAAkB,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;AAExE,eAAO,MAAM,eAAe,SAAU,QAAQ,QAAQ,IAAI,uBAyCzD,CAAC"}
@@ -1,46 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.useAccessReview = void 0;
4
- const tslib_1 = require("tslib");
5
- const React = tslib_1.__importStar(require("react"));
6
- const useAppContext_1 = require("./useAppContext");
7
- const error_1 = require("../utils/error");
8
- const useAccessReview = (kind, verb) => {
9
- const [isLoading, setIsLoading] = React.useState(true);
10
- const [error, setError] = React.useState();
11
- const [isAllowed, setIsAllowed] = React.useState(false);
12
- const { fetch: { checkPermissions }, } = (0, useAppContext_1.useAppContext)();
13
- React.useEffect(() => {
14
- let isMounted = true;
15
- const doItAsync = () => tslib_1.__awaiter(void 0, void 0, void 0, function* () {
16
- if (!isMounted)
17
- return;
18
- setIsLoading(true);
19
- try {
20
- const allowed = yield checkPermissions(kind, verb);
21
- if (isMounted) {
22
- setIsAllowed(allowed);
23
- }
24
- }
25
- catch (err) {
26
- if (isMounted) {
27
- setError((0, error_1.getErrorMessage)(err));
28
- setIsAllowed(false);
29
- }
30
- }
31
- finally {
32
- if (isMounted) {
33
- setIsLoading(false);
34
- }
35
- }
36
- });
37
- doItAsync();
38
- // Cleanup function to prevent state updates after unmount
39
- return () => {
40
- isMounted = false;
41
- };
42
- }, [kind, verb, checkPermissions]);
43
- return [isAllowed, isLoading, error];
44
- };
45
- exports.useAccessReview = useAccessReview;
46
- //# sourceMappingURL=useAccessReview.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"useAccessReview.js","sourceRoot":"","sources":["../../../src/hooks/useAccessReview.ts"],"names":[],"mappings":";;;;AAAA,qDAA+B;AAC/B,mDAAgD;AAChD,0CAAiD;AAK1C,MAAM,eAAe,GAAG,CAAC,IAAc,EAAE,IAAU,EAAsB,EAAE;IAChF,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IACvD,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,KAAK,CAAC,QAAQ,EAAU,CAAC;IACnD,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAExD,MAAM,EACJ,KAAK,EAAE,EAAE,gBAAgB,EAAE,GAC5B,GAAG,IAAA,6BAAa,GAAE,CAAC;IACpB,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE;QACnB,IAAI,SAAS,GAAG,IAAI,CAAC;QAErB,MAAM,SAAS,GAAG,GAAS,EAAE;YAC3B,IAAI,CAAC,SAAS;gBAAE,OAAO;YAEvB,YAAY,CAAC,IAAI,CAAC,CAAC;YACnB,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,MAAM,gBAAgB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;gBACnD,IAAI,SAAS,EAAE,CAAC;oBACd,YAAY,CAAC,OAAO,CAAC,CAAC;gBACxB,CAAC;YACH,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,IAAI,SAAS,EAAE,CAAC;oBACd,QAAQ,CAAC,IAAA,uBAAe,EAAC,GAAG,CAAC,CAAC,CAAC;oBAC/B,YAAY,CAAC,KAAK,CAAC,CAAC;gBACtB,CAAC;YACH,CAAC;oBAAS,CAAC;gBACT,IAAI,SAAS,EAAE,CAAC;oBACd,YAAY,CAAC,KAAK,CAAC,CAAC;gBACtB,CAAC;YACH,CAAC;QACH,CAAC,CAAA,CAAC;QAEF,SAAS,EAAE,CAAC;QAEZ,0DAA0D;QAC1D,OAAO,GAAG,EAAE;YACV,SAAS,GAAG,KAAK,CAAC;QACpB,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,gBAAgB,CAAC,CAAC,CAAC;IAEnC,OAAO,CAAC,SAAS,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;AACvC,CAAC,CAAC;AAzCW,QAAA,eAAe,mBAyC1B"}
@@ -1,3 +0,0 @@
1
- import { AccessReviewResult } from './useAccessReview';
2
- export declare const useFleetImportAccessReview: () => AccessReviewResult;
3
- //# sourceMappingURL=useFleetImportAccessReview.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"useFleetImportAccessReview.d.ts","sourceRoot":"","sources":["../../../src/hooks/useFleetImportAccessReview.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAmB,MAAM,mBAAmB,CAAC;AAGxE,eAAO,MAAM,0BAA0B,0BAItC,CAAC"}
@@ -1,12 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.useFleetImportAccessReview = void 0;
4
- const useAccessReview_1 = require("./useAccessReview");
5
- const rbac_1 = require("../types/rbac");
6
- const useFleetImportAccessReview = () => {
7
- const canCreateRs = (0, useAccessReview_1.useAccessReview)(rbac_1.RESOURCE.RESOURCE_SYNC, rbac_1.VERB.CREATE);
8
- const canReadRepo = (0, useAccessReview_1.useAccessReview)(rbac_1.RESOURCE.REPOSITORY, rbac_1.VERB.LIST);
9
- return [canCreateRs[0] && canReadRepo[0], canCreateRs[1] || canReadRepo[1], canCreateRs[2] || canReadRepo[2]];
10
- };
11
- exports.useFleetImportAccessReview = useFleetImportAccessReview;
12
- //# sourceMappingURL=useFleetImportAccessReview.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"useFleetImportAccessReview.js","sourceRoot":"","sources":["../../../src/hooks/useFleetImportAccessReview.ts"],"names":[],"mappings":";;;AAAA,uDAAwE;AACxE,wCAA+C;AAExC,MAAM,0BAA0B,GAAG,GAAuB,EAAE;IACjE,MAAM,WAAW,GAAG,IAAA,iCAAe,EAAC,eAAQ,CAAC,aAAa,EAAE,WAAI,CAAC,MAAM,CAAC,CAAC;IACzE,MAAM,WAAW,GAAG,IAAA,iCAAe,EAAC,eAAQ,CAAC,UAAU,EAAE,WAAI,CAAC,IAAI,CAAC,CAAC;IACpE,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,IAAI,WAAW,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,IAAI,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;AAChH,CAAC,CAAC;AAJW,QAAA,0BAA0B,8BAIrC"}
@@ -1,7 +0,0 @@
1
- .fctl-applications-table__row .pf-v5-c-button {
2
- visibility: hidden;
3
- }
4
-
5
- .fctl-applications-table__row:hover .pf-v5-c-button {
6
- visibility: visible;
7
- }
@@ -1,14 +0,0 @@
1
- import * as React from 'react';
2
- import { Button, ButtonProps } from '@patternfly/react-core';
3
- import { AccessReviewResult } from '../../hooks/useAccessReview';
4
-
5
- const ButtonWithPermissions = ({
6
- permissions,
7
- children,
8
- ...rest
9
- }: ButtonProps & { permissions: AccessReviewResult }) => {
10
- const [allowed] = permissions;
11
- return allowed && <Button {...rest}>{children}</Button>;
12
- };
13
-
14
- export default ButtonWithPermissions;
@@ -1,45 +0,0 @@
1
- import * as React from 'react';
2
- import { Label, Popover, Stack, StackItem } from '@patternfly/react-core';
3
- import { InfoCircleIcon } from '@patternfly/react-icons/dist/js/icons';
4
-
5
- import { useTranslation } from '../../hooks/useTranslation';
6
- import LearnMoreLink from './LearnMoreLink';
7
-
8
- // Links to general Red Hat docs
9
- const TECH_PREVIEW_LEVEL_LINK = 'https://access.redhat.com/support/offerings/techpreview';
10
-
11
- const TechPreviewPopoverContent = () => {
12
- const { t } = useTranslation();
13
-
14
- return (
15
- <Stack>
16
- <StackItem>
17
- {t(
18
- 'Technology preview features provide early access to upcoming product innovations, enabling you to test functionality and provide feedback during the development process.',
19
- )}
20
- </StackItem>
21
- <StackItem>
22
- <LearnMoreLink link={TECH_PREVIEW_LEVEL_LINK} />
23
- </StackItem>
24
- </Stack>
25
- );
26
- };
27
-
28
- const TechPreviewBadge = () => {
29
- const { t } = useTranslation();
30
-
31
- return (
32
- <Popover
33
- aria-label={t('Technology preview description')}
34
- bodyContent={<TechPreviewPopoverContent />}
35
- withFocusTrap
36
- triggerAction="click"
37
- >
38
- <Label color="orange" icon={<InfoCircleIcon />}>
39
- {t('Technology preview')}
40
- </Label>
41
- </Popover>
42
- );
43
- };
44
-
45
- export default TechPreviewBadge;