@flightctl/ui-components 0.10.0-rc7 → 1.0.0-rc1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (423) 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 +3 -2
  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 +230 -54
  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 +169 -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 +95 -37
  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 +99 -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 +41 -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/common/CodeEditor/YamlEditor.d.ts +7 -5
  214. package/dist/src/components/common/CodeEditor/YamlEditor.d.ts.map +1 -1
  215. package/dist/src/components/common/CodeEditor/YamlEditor.js +142 -10
  216. package/dist/src/components/common/CodeEditor/YamlEditor.js.map +1 -1
  217. package/dist/src/components/common/CodeEditor/YamlEditorBase.d.ts +7 -1
  218. package/dist/src/components/common/CodeEditor/YamlEditorBase.d.ts.map +1 -1
  219. package/dist/src/components/common/CodeEditor/YamlEditorBase.js +16 -8
  220. package/dist/src/components/common/CodeEditor/YamlEditorBase.js.map +1 -1
  221. package/dist/src/components/common/OrganizationGuard.d.ts.map +1 -1
  222. package/dist/src/components/common/OrganizationGuard.js +11 -19
  223. package/dist/src/components/common/OrganizationGuard.js.map +1 -1
  224. package/dist/src/components/common/PageNavigation.css +9 -0
  225. package/dist/src/components/common/PageNavigation.d.ts +4 -1
  226. package/dist/src/components/common/PageNavigation.d.ts.map +1 -1
  227. package/dist/src/components/common/PageNavigation.js +25 -10
  228. package/dist/src/components/common/PageNavigation.js.map +1 -1
  229. package/dist/src/components/common/PermissionsContext.d.ts +14 -0
  230. package/dist/src/components/common/PermissionsContext.d.ts.map +1 -0
  231. package/dist/src/components/common/PermissionsContext.js +84 -0
  232. package/dist/src/components/common/PermissionsContext.js.map +1 -0
  233. package/dist/src/components/form/FilterSelect.d.ts.map +1 -1
  234. package/dist/src/components/form/FilterSelect.js +1 -1
  235. package/dist/src/components/form/FilterSelect.js.map +1 -1
  236. package/dist/src/components/form/FormSelect.d.ts.map +1 -1
  237. package/dist/src/components/form/FormSelect.js +1 -1
  238. package/dist/src/components/form/FormSelect.js.map +1 -1
  239. package/dist/src/components/form/FormSelectTypeahead.d.ts.map +1 -1
  240. package/dist/src/components/form/FormSelectTypeahead.js +84 -4
  241. package/dist/src/components/form/FormSelectTypeahead.js.map +1 -1
  242. package/dist/src/components/form/ListItemField.d.ts +12 -0
  243. package/dist/src/components/form/ListItemField.d.ts.map +1 -0
  244. package/dist/src/components/form/ListItemField.js +67 -0
  245. package/dist/src/components/form/ListItemField.js.map +1 -0
  246. package/dist/src/components/form/NameField.d.ts +1 -1
  247. package/dist/src/components/form/NameField.d.ts.map +1 -1
  248. package/dist/src/components/form/NameField.js +4 -2
  249. package/dist/src/components/form/NameField.js.map +1 -1
  250. package/dist/src/components/form/SwitchField.d.ts +2 -1
  251. package/dist/src/components/form/SwitchField.d.ts.map +1 -1
  252. package/dist/src/components/form/SwitchField.js +2 -2
  253. package/dist/src/components/form/SwitchField.js.map +1 -1
  254. package/dist/src/components/form/validations.d.ts +50 -4
  255. package/dist/src/components/form/validations.d.ts.map +1 -1
  256. package/dist/src/components/form/validations.js +332 -41
  257. package/dist/src/components/form/validations.js.map +1 -1
  258. package/dist/src/constants.d.ts +1 -1
  259. package/dist/src/constants.d.ts.map +1 -1
  260. package/dist/src/constants.js +1 -1
  261. package/dist/src/constants.js.map +1 -1
  262. package/dist/src/hooks/useAlertsEnabled.d.ts.map +1 -1
  263. package/dist/src/hooks/useAlertsEnabled.js +10 -4
  264. package/dist/src/hooks/useAlertsEnabled.js.map +1 -1
  265. package/dist/src/hooks/useAppContext.d.ts +4 -2
  266. package/dist/src/hooks/useAppContext.d.ts.map +1 -1
  267. package/dist/src/hooks/useAppContext.js +4 -1
  268. package/dist/src/hooks/useAppContext.js.map +1 -1
  269. package/dist/src/hooks/useFetch.d.ts +0 -1
  270. package/dist/src/hooks/useFetch.d.ts.map +1 -1
  271. package/dist/src/hooks/useNavigate.d.ts +6 -2
  272. package/dist/src/hooks/useNavigate.d.ts.map +1 -1
  273. package/dist/src/hooks/useNavigate.js +4 -0
  274. package/dist/src/hooks/useNavigate.js.map +1 -1
  275. package/dist/src/hooks/usePendingEnrollmentRequestsCount.d.ts.map +1 -1
  276. package/dist/src/hooks/usePendingEnrollmentRequestsCount.js +9 -1
  277. package/dist/src/hooks/usePendingEnrollmentRequestsCount.js.map +1 -1
  278. package/dist/src/hooks/useSystemRestoreContext.d.ts.map +1 -1
  279. package/dist/src/hooks/useSystemRestoreContext.js +3 -2
  280. package/dist/src/hooks/useSystemRestoreContext.js.map +1 -1
  281. package/dist/src/types/deviceSpec.d.ts +56 -15
  282. package/dist/src/types/deviceSpec.d.ts.map +1 -1
  283. package/dist/src/types/deviceSpec.js +23 -8
  284. package/dist/src/types/deviceSpec.js.map +1 -1
  285. package/dist/src/types/extraTypes.d.ts +14 -2
  286. package/dist/src/types/extraTypes.d.ts.map +1 -1
  287. package/dist/src/types/extraTypes.js +11 -1
  288. package/dist/src/types/extraTypes.js.map +1 -1
  289. package/dist/src/types/rbac.d.ts +2 -1
  290. package/dist/src/types/rbac.d.ts.map +1 -1
  291. package/dist/src/types/rbac.js +1 -0
  292. package/dist/src/types/rbac.js.map +1 -1
  293. package/dist/src/utils/authProvider.d.ts +4 -0
  294. package/dist/src/utils/authProvider.d.ts.map +1 -0
  295. package/dist/src/utils/authProvider.js +22 -0
  296. package/dist/src/utils/authProvider.js.map +1 -0
  297. package/dist/src/utils/error.d.ts +1 -0
  298. package/dist/src/utils/error.d.ts.map +1 -1
  299. package/dist/src/utils/error.js +6 -1
  300. package/dist/src/utils/error.js.map +1 -1
  301. package/dist/src/utils/k8sProvider.d.ts +3 -0
  302. package/dist/src/utils/k8sProvider.d.ts.map +1 -0
  303. package/dist/src/utils/k8sProvider.js +18 -0
  304. package/dist/src/utils/k8sProvider.js.map +1 -0
  305. package/dist/src/utils/patch.d.ts.map +1 -1
  306. package/dist/src/utils/patch.js +3 -1
  307. package/dist/src/utils/patch.js.map +1 -1
  308. package/dist/src/utils/status/applications.d.ts.map +1 -1
  309. package/dist/src/utils/status/applications.js +7 -0
  310. package/dist/src/utils/status/applications.js.map +1 -1
  311. package/package.json +1 -1
  312. package/src/components/AuthProvider/AuthProviderDetails/AuthProviderDetails.tsx +111 -0
  313. package/src/components/AuthProvider/AuthProviderDetails/AuthProviderDetailsTab.tsx +239 -0
  314. package/src/components/AuthProvider/AuthProviderDetails/DeleteAuthProviderModal.tsx +95 -0
  315. package/src/components/AuthProvider/AuthProviderDetails/RoleAssigmentDetails.tsx +53 -0
  316. package/src/components/AuthProvider/AuthProviderRow.tsx +84 -0
  317. package/src/components/AuthProvider/AuthProvidersPage.tsx +168 -0
  318. package/src/components/AuthProvider/CreateAuthProvider/AuthOrganizationAssignment.tsx +102 -0
  319. package/src/components/AuthProvider/CreateAuthProvider/AuthProviderHelperText.tsx +78 -0
  320. package/src/components/AuthProvider/CreateAuthProvider/CreateAuthProvider.tsx +145 -0
  321. package/src/components/AuthProvider/CreateAuthProvider/CreateAuthProviderForm.tsx +284 -0
  322. package/src/components/AuthProvider/CreateAuthProvider/Oauth2ProviderFields.tsx +24 -0
  323. package/src/components/AuthProvider/CreateAuthProvider/RoleAssignmentSection.tsx +165 -0
  324. package/src/components/AuthProvider/CreateAuthProvider/types.ts +96 -0
  325. package/src/components/AuthProvider/CreateAuthProvider/utils.ts +557 -0
  326. package/src/components/AuthProvider/TestConnectionModal/TestConnectionModal.tsx +136 -0
  327. package/src/components/AuthProvider/useAuthProviders.ts +18 -0
  328. package/src/components/DetailsPage/DetailsPage.tsx +1 -1
  329. package/src/components/DetailsPage/DetailsPageActions.tsx +2 -0
  330. package/src/components/DetailsPage/Tables/ApplicationsTable.tsx +29 -132
  331. package/src/components/DetailsPage/Tables/SystemdUnitsTable.tsx +98 -0
  332. package/src/components/Device/DeviceDetails/DeviceApplications.tsx +3 -73
  333. package/src/components/Device/DeviceDetails/DeviceDetailsPage.tsx +19 -9
  334. package/src/components/Device/DeviceDetails/DeviceDetailsTab.tsx +6 -2
  335. package/src/components/Device/DeviceDetails/DeviceSystemdUnits.tsx +30 -0
  336. package/src/components/Device/DeviceDetails/TerminalTab.tsx +3 -2
  337. package/src/components/Device/DevicesPage/DecommissionedDevicesTable.tsx +8 -3
  338. package/src/components/Device/DevicesPage/DevicesEmptyStates.tsx +3 -2
  339. package/src/components/Device/DevicesPage/DevicesPage.tsx +9 -15
  340. package/src/components/Device/DevicesPage/EnrolledDevicesTable.tsx +9 -4
  341. package/src/components/Device/EditDeviceWizard/EditDeviceWizard.tsx +10 -4
  342. package/src/components/Device/EditDeviceWizard/deviceSpecUtils.ts +291 -59
  343. package/src/components/Device/EditDeviceWizard/steps/ApplicationContainerForm.css +5 -0
  344. package/src/components/Device/EditDeviceWizard/steps/ApplicationContainerForm.tsx +319 -0
  345. package/src/components/Device/EditDeviceWizard/steps/ApplicationImageForm.tsx +2 -2
  346. package/src/components/Device/EditDeviceWizard/steps/ApplicationInlineForm.tsx +3 -3
  347. package/src/components/Device/EditDeviceWizard/steps/ApplicationTemplates.tsx +186 -80
  348. package/src/components/Device/EditDeviceWizard/steps/ApplicationVolumeForm.tsx +202 -0
  349. package/src/components/Device/EditDeviceWizard/steps/ConfigurationTemplates.tsx +6 -4
  350. package/src/components/Device/EditDeviceWizard/steps/DeviceTemplateStep.tsx +1 -1
  351. package/src/components/Device/EditDeviceWizard/steps/ReviewApplications.tsx +26 -10
  352. package/src/components/Device/EditDeviceWizard/utils.ts +15 -1
  353. package/src/components/EnrollmentRequest/EnrollmentRequestDetails/EnrollmentRequestDetails.tsx +10 -4
  354. package/src/components/EnrollmentRequest/EnrollmentRequestList.tsx +9 -13
  355. package/src/components/Fleet/CreateFleet/CreateFleetWizard.tsx +11 -8
  356. package/src/components/Fleet/CreateFleet/utils.ts +2 -4
  357. package/src/components/Fleet/FleetDetails/FleetDetailsPage.tsx +11 -6
  358. package/src/components/Fleet/FleetDetails/FleetYaml.tsx +13 -0
  359. package/src/components/Fleet/FleetResourceSyncs.tsx +3 -2
  360. package/src/components/Fleet/FleetsPage.tsx +34 -27
  361. package/src/components/Fleet/ImportFleetWizard/ImportFleetWizard.tsx +10 -2
  362. package/src/components/Fleet/ImportFleetWizard/steps/RepositoryStep.tsx +3 -2
  363. package/src/components/ListPage/ListPage.tsx +1 -8
  364. package/src/components/Login/ProviderSelector.tsx +114 -0
  365. package/src/components/Login/TokenLoginForm.tsx +202 -0
  366. package/src/components/Masthead/CommandLineToolsPage.tsx +1 -11
  367. package/src/components/OverviewPage/Cards/Alerts/AlertsCard.tsx +2 -0
  368. package/src/components/OverviewPage/Overview.tsx +9 -4
  369. package/src/components/OverviewPage/OverviewPage.tsx +6 -13
  370. package/src/components/Repository/CreateRepository/CreateRepository.tsx +3 -2
  371. package/src/components/Repository/CreateRepository/CreateRepositoryForm.tsx +3 -2
  372. package/src/components/Repository/RepositoryDetails/RepositoryDetails.tsx +11 -9
  373. package/src/components/Repository/RepositoryList.tsx +11 -5
  374. package/src/components/ResourceSync/RepositoryResourceSyncList.tsx +8 -3
  375. package/src/components/common/CodeEditor/YamlEditor.tsx +195 -15
  376. package/src/components/common/CodeEditor/YamlEditorBase.tsx +42 -8
  377. package/src/components/common/OrganizationGuard.tsx +13 -22
  378. package/src/components/common/PageNavigation.css +9 -0
  379. package/src/components/common/PageNavigation.tsx +42 -14
  380. package/src/components/common/PermissionsContext.tsx +108 -0
  381. package/src/components/form/FilterSelect.tsx +2 -0
  382. package/src/components/form/FormSelect.tsx +2 -0
  383. package/src/components/form/FormSelectTypeahead.tsx +97 -4
  384. package/src/components/form/ListItemField.tsx +123 -0
  385. package/src/components/form/NameField.tsx +3 -1
  386. package/src/components/form/SwitchField.tsx +3 -2
  387. package/src/components/form/validations.ts +413 -64
  388. package/src/constants.ts +1 -1
  389. package/src/hooks/useAlertsEnabled.ts +10 -5
  390. package/src/hooks/useAppContext.tsx +4 -3
  391. package/src/hooks/useNavigate.tsx +7 -1
  392. package/src/hooks/usePendingEnrollmentRequestsCount.ts +13 -1
  393. package/src/hooks/useSystemRestoreContext.tsx +3 -2
  394. package/src/types/deviceSpec.ts +78 -21
  395. package/src/types/extraTypes.ts +19 -1
  396. package/src/types/rbac.ts +1 -0
  397. package/src/utils/authProvider.ts +20 -0
  398. package/src/utils/error.ts +5 -0
  399. package/src/utils/k8sProvider.ts +11 -0
  400. package/src/utils/patch.ts +3 -1
  401. package/src/utils/status/applications.ts +7 -0
  402. package/dist/src/components/DetailsPage/Tables/ApplicationsTable.css +0 -7
  403. package/dist/src/components/common/ButtonWithPermissions.d.ts +0 -8
  404. package/dist/src/components/common/ButtonWithPermissions.d.ts.map +0 -1
  405. package/dist/src/components/common/ButtonWithPermissions.js +0 -12
  406. package/dist/src/components/common/ButtonWithPermissions.js.map +0 -1
  407. package/dist/src/components/common/TechPreviewBadge.d.ts +0 -4
  408. package/dist/src/components/common/TechPreviewBadge.d.ts.map +0 -1
  409. package/dist/src/components/common/TechPreviewBadge.js +0 -24
  410. package/dist/src/components/common/TechPreviewBadge.js.map +0 -1
  411. package/dist/src/hooks/useAccessReview.d.ts +0 -4
  412. package/dist/src/hooks/useAccessReview.d.ts.map +0 -1
  413. package/dist/src/hooks/useAccessReview.js +0 -46
  414. package/dist/src/hooks/useAccessReview.js.map +0 -1
  415. package/dist/src/hooks/useFleetImportAccessReview.d.ts +0 -3
  416. package/dist/src/hooks/useFleetImportAccessReview.d.ts.map +0 -1
  417. package/dist/src/hooks/useFleetImportAccessReview.js +0 -12
  418. package/dist/src/hooks/useFleetImportAccessReview.js.map +0 -1
  419. package/src/components/DetailsPage/Tables/ApplicationsTable.css +0 -7
  420. package/src/components/common/ButtonWithPermissions.tsx +0 -14
  421. package/src/components/common/TechPreviewBadge.tsx +0 -45
  422. package/src/hooks/useAccessReview.ts +0 -49
  423. package/src/hooks/useFleetImportAccessReview.ts +0 -8
@@ -0,0 +1,284 @@
1
+ import * as React from 'react';
2
+ import { Alert, Button, FormGroup, FormSection, Grid, Popover, Split, SplitItem } from '@patternfly/react-core';
3
+ import { OutlinedQuestionCircleIcon } from '@patternfly/react-icons/dist/js/icons/outlined-question-circle-icon';
4
+ import { Formik, useFormikContext } from 'formik';
5
+ import * as Yup from 'yup';
6
+
7
+ import { AuthProvider } from '@flightctl/types';
8
+ import { useTranslation } from '../../../hooks/useTranslation';
9
+ import { useFetch } from '../../../hooks/useFetch';
10
+ import NameField from '../../form/NameField';
11
+ import TextField from '../../form/TextField';
12
+ import RadioField from '../../form/RadioField';
13
+ import SwitchField from '../../form/SwitchField';
14
+ import ListItemField from '../../form/ListItemField';
15
+ import FlightCtlForm from '../../form/FlightCtlForm';
16
+ import FlightCtlActionGroup from '../../form/FlightCtlActionGroup';
17
+ import { getDnsSubdomainValidations } from '../../form/validations';
18
+ import { AuthProviderFormValues, FieldValidationResult } from './types';
19
+ import { ProviderType } from '../../../types/extraTypes';
20
+
21
+ import { authProviderSchema, getAuthProvider, getAuthProviderPatches, getInitValues } from './utils';
22
+ import { getErrorMessage } from '../../../utils/error';
23
+ import LeaveFormConfirmation from '../../common/LeaveFormConfirmation';
24
+ import { FormGroupWithHelperText } from '../../common/WithHelperText';
25
+
26
+ import Oauth2ProviderFields from './Oauth2ProviderFields';
27
+ import OrganizationAssignmentSection from './AuthOrganizationAssignment';
28
+ import RoleAssignmentSection from './RoleAssignmentSection';
29
+ import TestConnectionModal from '../TestConnectionModal/TestConnectionModal';
30
+ import { ScopesHelperText, UsernameClaimHelperText } from './AuthProviderHelperText';
31
+
32
+ const ProviderTypeSection = () => {
33
+ const { t } = useTranslation();
34
+
35
+ return (
36
+ <Split hasGutter>
37
+ <SplitItem>
38
+ <RadioField id="oidc-provider-radio" name="providerType" label={t('OIDC')} checkedValue={ProviderType.OIDC} />
39
+ </SplitItem>
40
+ <SplitItem>
41
+ <RadioField
42
+ id="oauth2-provider-radio"
43
+ name="providerType"
44
+ label={t('OAuth2')}
45
+ checkedValue={ProviderType.OAuth2}
46
+ />
47
+ </SplitItem>
48
+ </Split>
49
+ );
50
+ };
51
+
52
+ const EnabledHelpText = () => {
53
+ const { t } = useTranslation();
54
+ return (
55
+ <Popover
56
+ bodyContent={
57
+ <div>
58
+ <p>{t('Turn this on to let users sign in with this provider.')}</p>
59
+ <p>{t('You can turn it off anytime without losing your settings.')}</p>
60
+ </div>
61
+ }
62
+ withFocusTrap
63
+ triggerAction="click"
64
+ >
65
+ <Button
66
+ component="a"
67
+ className="fctl-helper-text__icon"
68
+ isInline
69
+ variant="plain"
70
+ onClick={(ev) => {
71
+ ev.preventDefault();
72
+ ev.stopPropagation();
73
+ }}
74
+ aria-label="Enabled help text"
75
+ >
76
+ <OutlinedQuestionCircleIcon />
77
+ </Button>
78
+ </Popover>
79
+ );
80
+ };
81
+
82
+ export const AuthProviderForm = ({ isEdit }: { isEdit?: boolean }) => {
83
+ const { t } = useTranslation();
84
+ const { values } = useFormikContext<AuthProviderFormValues>();
85
+
86
+ const isOidcProvider = values.providerType === ProviderType.OIDC;
87
+
88
+ return (
89
+ <>
90
+ <SwitchField
91
+ name="enabled"
92
+ label={t('Enabled')}
93
+ aria-label={t('Enabled provider')}
94
+ labelIcon={<EnabledHelpText />}
95
+ />
96
+
97
+ <NameField
98
+ name="name"
99
+ aria-label={t('Provider name')}
100
+ isRequired
101
+ isDisabled={isEdit}
102
+ resourceType="authproviders"
103
+ validations={getDnsSubdomainValidations(t)}
104
+ helperText={t("You can't change the provider name after it's created")}
105
+ />
106
+
107
+ <FormGroup label={t('Display name')}>
108
+ <TextField name="displayName" aria-label={t('Display name')} helperText={t('Display name for this provider')} />
109
+ </FormGroup>
110
+
111
+ <ProviderTypeSection />
112
+
113
+ {values.providerType === ProviderType.OAuth2 && <Oauth2ProviderFields />}
114
+
115
+ <FormGroup label={t('Issuer URL')} isRequired={isOidcProvider}>
116
+ <TextField name="issuer" aria-label={t('Issuer URL')} />
117
+ </FormGroup>
118
+
119
+ <FormGroup label={t('Client ID')} isRequired>
120
+ <TextField name="clientId" aria-label={t('Client ID')} />
121
+ </FormGroup>
122
+
123
+ <FormGroup label={t('Client secret')} isRequired>
124
+ <TextField name="clientSecret" aria-label={t('Client secret')} type="password" />
125
+ </FormGroup>
126
+
127
+ <FormSection title={t('User identity & authorization')}>
128
+ <FormGroupWithHelperText label={t('Scopes')} content={<ScopesHelperText />}>
129
+ <ListItemField
130
+ name="scopes"
131
+ helperText={t('Add scopes required to access username and role claims from your authentication provider.')}
132
+ addButtonText={t('Add scope')}
133
+ />
134
+ </FormGroupWithHelperText>
135
+
136
+ <FormGroupWithHelperText label={t('Username claim path')} content={<UsernameClaimHelperText />}>
137
+ <ListItemField
138
+ name="usernameClaim"
139
+ helperText={t('Enter the path segments to the username claim')}
140
+ addButtonText={t('Add path segment')}
141
+ resolvedValue={(items) => items.join('.')}
142
+ resolvedLabel={t('Resulting username claim')}
143
+ />
144
+ </FormGroupWithHelperText>
145
+ </FormSection>
146
+
147
+ <RoleAssignmentSection />
148
+
149
+ <OrganizationAssignmentSection />
150
+ </>
151
+ );
152
+ };
153
+
154
+ const CreateAuthProviderFormContent = ({
155
+ isEdit,
156
+ onClose,
157
+ children,
158
+ }: React.PropsWithChildren<{
159
+ onClose: VoidFunction;
160
+ isEdit: boolean;
161
+ }>) => {
162
+ const { t } = useTranslation();
163
+ const { isValid, dirty, submitForm, isSubmitting, values } = useFormikContext<AuthProviderFormValues>();
164
+ const { proxyFetch } = useFetch();
165
+
166
+ const [isTesting, setIsTesting] = React.useState(false);
167
+ const [testResults, setTestResults] = React.useState<FieldValidationResult[] | null>(null);
168
+ const [testError, setTestError] = React.useState<string>();
169
+ const isSubmitDisabled = isSubmitting || !isValid || !dirty;
170
+ const isTestingDisabled = isSubmitting || !isValid || isTesting || (!isEdit && !dirty);
171
+
172
+ const handleTestConnection = async () => {
173
+ setIsTesting(true);
174
+ setTestError(undefined);
175
+
176
+ try {
177
+ const requestBody = {
178
+ providerType: values.providerType,
179
+ issuer: values.issuer,
180
+ authorizationUrl: values.authorizationUrl,
181
+ tokenUrl: values.tokenUrl,
182
+ userinfoUrl: values.userinfoUrl,
183
+ clientId: values.clientId,
184
+ };
185
+
186
+ const response = await proxyFetch('test-auth-provider-connection', {
187
+ method: 'POST',
188
+ headers: {
189
+ 'Content-Type': 'application/json',
190
+ },
191
+ body: JSON.stringify(requestBody),
192
+ });
193
+
194
+ if (!response.ok) {
195
+ const errorText = await response.text();
196
+ throw new Error(errorText || `HTTP ${response.status}`);
197
+ }
198
+
199
+ const data = (await response.json()) as { results: FieldValidationResult[] };
200
+ setTestResults(data.results);
201
+ } catch (err) {
202
+ setTestError(getErrorMessage(err));
203
+ } finally {
204
+ setIsTesting(false);
205
+ }
206
+ };
207
+
208
+ return (
209
+ <FlightCtlForm>
210
+ <Grid hasGutter span={8}>
211
+ <AuthProviderForm isEdit={isEdit} />
212
+ </Grid>
213
+ {children}
214
+ {testError && (
215
+ <Alert isInline variant="danger" title={t('Test connection failed')}>
216
+ {testError}
217
+ </Alert>
218
+ )}
219
+ <FlightCtlActionGroup>
220
+ <Button variant="primary" onClick={submitForm} isLoading={isSubmitting} isDisabled={isSubmitDisabled}>
221
+ {isEdit ? t('Save') : t('Create authentication provider')}
222
+ </Button>
223
+ <Button variant="secondary" onClick={handleTestConnection} isLoading={isTesting} isDisabled={isTestingDisabled}>
224
+ {t('Test connection')}
225
+ </Button>
226
+ <Button variant="link" isDisabled={isSubmitting} onClick={onClose}>
227
+ {t('Cancel')}
228
+ </Button>
229
+ </FlightCtlActionGroup>
230
+ {testResults && <TestConnectionModal onClose={() => setTestResults(null)} results={testResults} />}
231
+ </FlightCtlForm>
232
+ );
233
+ };
234
+
235
+ export type CreateAuthProviderFormProps = {
236
+ onClose: VoidFunction;
237
+ onSuccess: (authProvider: AuthProvider) => void;
238
+ authProvider?: AuthProvider;
239
+ };
240
+
241
+ const CreateAuthProviderForm = ({ authProvider, onClose, onSuccess }: CreateAuthProviderFormProps) => {
242
+ const { t } = useTranslation();
243
+ const { patch, post } = useFetch();
244
+ const [error, setError] = React.useState<string>();
245
+
246
+ return (
247
+ <Formik<AuthProviderFormValues>
248
+ initialValues={getInitValues(authProvider)}
249
+ validationSchema={Yup.lazy(authProviderSchema(t))}
250
+ onSubmit={async (values) => {
251
+ setError(undefined);
252
+ if (authProvider) {
253
+ const patches = getAuthProviderPatches(values, authProvider);
254
+ try {
255
+ if (patches.length) {
256
+ await patch<AuthProvider>(`authproviders/${authProvider.metadata.name}`, patches);
257
+ onSuccess(authProvider);
258
+ }
259
+ } catch (e) {
260
+ setError(getErrorMessage(e));
261
+ }
262
+ } else {
263
+ try {
264
+ const provider = await post<AuthProvider>('authproviders', getAuthProvider(values));
265
+ onSuccess(provider);
266
+ } catch (e) {
267
+ setError(getErrorMessage(e));
268
+ }
269
+ }
270
+ }}
271
+ >
272
+ <CreateAuthProviderFormContent isEdit={!!authProvider} onClose={onClose}>
273
+ {error && (
274
+ <Alert isInline variant="danger" title={t('An error occurred')}>
275
+ {error}
276
+ </Alert>
277
+ )}
278
+ <LeaveFormConfirmation />
279
+ </CreateAuthProviderFormContent>
280
+ </Formik>
281
+ );
282
+ };
283
+
284
+ export default CreateAuthProviderForm;
@@ -0,0 +1,24 @@
1
+ import * as React from 'react';
2
+ import { FormGroup } from '@patternfly/react-core';
3
+
4
+ import { useTranslation } from '../../../hooks/useTranslation';
5
+ import TextField from '../../form/TextField';
6
+
7
+ const OAuth2ProviderFields = () => {
8
+ const { t } = useTranslation();
9
+ return (
10
+ <>
11
+ <FormGroup label={t('Authorization URL')} isRequired>
12
+ <TextField name="authorizationUrl" aria-label={t('Authorization URL')} />
13
+ </FormGroup>
14
+ <FormGroup label={t('Token URL')} isRequired>
15
+ <TextField name="tokenUrl" aria-label={t('Token URL')} />
16
+ </FormGroup>
17
+ <FormGroup label={t('Userinfo URL')} isRequired>
18
+ <TextField name="userinfoUrl" aria-label={t('Userinfo URL')} />
19
+ </FormGroup>
20
+ </>
21
+ );
22
+ };
23
+
24
+ export default OAuth2ProviderFields;
@@ -0,0 +1,165 @@
1
+ import * as React from 'react';
2
+ import { TFunction } from 'react-i18next';
3
+ import {
4
+ FormGroup,
5
+ FormSection,
6
+ Label,
7
+ LabelGroup,
8
+ MenuToggle,
9
+ Select,
10
+ SelectList,
11
+ SelectOption,
12
+ Split,
13
+ SplitItem,
14
+ } from '@patternfly/react-core';
15
+ import { useField, useFormikContext } from 'formik';
16
+
17
+ import { useTranslation } from '../../../hooks/useTranslation';
18
+ import RadioField from '../../form/RadioField';
19
+ import ListItemField from '../../form/ListItemField';
20
+ import TextField from '../../form/TextField';
21
+ import ErrorHelperText, { DefaultHelperText } from '../../form/FieldHelperText';
22
+ import { AuthProviderFormValues, RoleAssignmentType } from './types';
23
+ import { FormGroupWithHelperText } from '../../common/WithHelperText';
24
+ import { RoleClaimHelperText, RoleSeparatorHelperText } from './AuthProviderHelperText';
25
+
26
+ const getAvailableRoles = (t: TFunction): Record<string, string> => ({
27
+ admin: t('System administrator'),
28
+ 'org-admin': t('Organization administrator'),
29
+ operator: t('Operator'),
30
+ installer: t('Installer'),
31
+ viewer: t('Viewer'),
32
+ });
33
+
34
+ const RoleSelector = () => {
35
+ const { t } = useTranslation();
36
+ const [{ value: roles }, meta, { setValue }] = useField<string[]>('staticRoles');
37
+ const [isOpen, setIsOpen] = React.useState(false);
38
+
39
+ const allRoles = React.useMemo(() => {
40
+ return getAvailableRoles(t);
41
+ }, [t]);
42
+
43
+ const availableRoles = React.useMemo(() => {
44
+ return Object.entries(allRoles)
45
+ .filter(([roleCode]) => !roles.includes(roleCode))
46
+ .map(([roleCode, roleLabel]) => ({
47
+ value: roleCode,
48
+ label: roleLabel,
49
+ }));
50
+ }, [roles, allRoles]);
51
+
52
+ const onAddRole = (role: string) => {
53
+ if (!roles.includes(role)) {
54
+ setValue([...roles, role], true);
55
+ }
56
+ setIsOpen(false);
57
+ };
58
+
59
+ const onDelete = (role: string) => {
60
+ setValue(
61
+ roles.filter((r) => r !== role),
62
+ true,
63
+ );
64
+ };
65
+
66
+ const hasAvailableRoles = availableRoles.length > 0;
67
+
68
+ return (
69
+ <>
70
+ <DefaultHelperText helperText={t('List of roles to assign to all users from this provider')} />
71
+ <LabelGroup
72
+ numLabels={5}
73
+ isEditable
74
+ addLabelControl={
75
+ <Select
76
+ isOpen={isOpen}
77
+ onOpenChange={setIsOpen}
78
+ onSelect={(_, value) => onAddRole(value as string)}
79
+ toggle={(toggleRef) => (
80
+ <MenuToggle
81
+ ref={toggleRef}
82
+ isDisabled={!hasAvailableRoles}
83
+ onClick={() => setIsOpen(!isOpen)}
84
+ isExpanded={isOpen}
85
+ className="pf-v5-u-ml-xs"
86
+ >
87
+ {t('Add role')}
88
+ </MenuToggle>
89
+ )}
90
+ shouldFocusToggleOnSelect
91
+ >
92
+ <SelectList>
93
+ {availableRoles.map((role) => (
94
+ <SelectOption key={role.value} value={role.value}>
95
+ {role.label}
96
+ </SelectOption>
97
+ ))}
98
+ </SelectList>
99
+ </Select>
100
+ }
101
+ >
102
+ {roles.map((roleCode) => (
103
+ <Label key={roleCode} onClose={() => onDelete(roleCode)} textMaxWidth="18ch" isEditable>
104
+ {allRoles[roleCode]}
105
+ </Label>
106
+ ))}
107
+ </LabelGroup>
108
+ <ErrorHelperText meta={meta} touchRequired={false} />
109
+ </>
110
+ );
111
+ };
112
+
113
+ const RoleAssignmentSection = () => {
114
+ const { t } = useTranslation();
115
+ const { values } = useFormikContext<AuthProviderFormValues>();
116
+
117
+ return (
118
+ <FormSection title={t('Role assignment')} className="pf-v5-u-mt-md">
119
+ <Split hasGutter>
120
+ <SplitItem>
121
+ <RadioField
122
+ id="roleAssignmentStatic"
123
+ name="roleAssignmentType"
124
+ label={t('Static')}
125
+ checkedValue={RoleAssignmentType.Static}
126
+ />
127
+ </SplitItem>
128
+ <SplitItem>
129
+ <RadioField
130
+ id="roleAssignmentDynamic"
131
+ name="roleAssignmentType"
132
+ label={t('Dynamic')}
133
+ checkedValue={RoleAssignmentType.Dynamic}
134
+ />
135
+ </SplitItem>
136
+ </Split>
137
+
138
+ {values.roleAssignmentType === RoleAssignmentType.Static && (
139
+ <FormGroup label={t('Roles')} isRequired>
140
+ <RoleSelector />
141
+ </FormGroup>
142
+ )}
143
+
144
+ {values.roleAssignmentType === RoleAssignmentType.Dynamic && (
145
+ <>
146
+ <FormGroupWithHelperText label={t('Role claim path')} content={<RoleClaimHelperText />}>
147
+ <ListItemField
148
+ name="roleClaimPath"
149
+ helperText={t(
150
+ 'Path segments to the role/group claim (e.g., ["groups"], ["roles"], ["realm_access", "roles"])',
151
+ )}
152
+ addButtonText={t('Add path segment')}
153
+ />
154
+ </FormGroupWithHelperText>
155
+
156
+ <FormGroupWithHelperText label={t('Separator')} content={<RoleSeparatorHelperText />}>
157
+ <TextField name="roleSeparator" id="roleSeparator" aria-label={t('Separator')} placeholder=":" />
158
+ </FormGroupWithHelperText>
159
+ </>
160
+ )}
161
+ </FormSection>
162
+ );
163
+ };
164
+
165
+ export default RoleAssignmentSection;
@@ -0,0 +1,96 @@
1
+ import {
2
+ AuthDynamicOrganizationAssignment,
3
+ AuthDynamicRoleAssignment,
4
+ AuthOrganizationAssignment,
5
+ AuthPerUserOrganizationAssignment,
6
+ AuthProviderSpec,
7
+ AuthRoleAssignment,
8
+ AuthStaticOrganizationAssignment,
9
+ AuthStaticRoleAssignment,
10
+ OAuth2ProviderSpec,
11
+ OIDCProviderSpec,
12
+ } from '@flightctl/types';
13
+ import { ProviderType } from '../../../types/extraTypes';
14
+
15
+ export enum OrgAssignmentType {
16
+ Static = 'static',
17
+ Dynamic = 'dynamic',
18
+ PerUser = 'perUser',
19
+ }
20
+
21
+ export const DEFAULT_USERNAME_CLAIM = 'preferred_username';
22
+ export const DEFAULT_ROLE_CLAIM = 'groups';
23
+ export const DEFAULT_ROLE_SEPARATOR = ':';
24
+
25
+ export const isOidcProvider = (providerSpec: AuthProviderSpec): providerSpec is OIDCProviderSpec =>
26
+ providerSpec.providerType === ProviderType.OIDC;
27
+
28
+ export const isOAuth2Provider = (providerSpec: AuthProviderSpec): providerSpec is OAuth2ProviderSpec =>
29
+ providerSpec.providerType === ProviderType.OAuth2;
30
+
31
+ export const isOrgAssignmentStatic = (
32
+ orgAssignment: AuthOrganizationAssignment,
33
+ ): orgAssignment is AuthStaticOrganizationAssignment => orgAssignment.type === OrgAssignmentType.Static;
34
+
35
+ export const isOrgAssignmentDynamic = (
36
+ orgAssignment: AuthOrganizationAssignment,
37
+ ): orgAssignment is AuthDynamicOrganizationAssignment => orgAssignment.type === OrgAssignmentType.Dynamic;
38
+
39
+ export const isOrgAssignmentPerUser = (
40
+ orgAssignment: AuthOrganizationAssignment,
41
+ ): orgAssignment is AuthPerUserOrganizationAssignment => orgAssignment.type === OrgAssignmentType.PerUser;
42
+
43
+ export enum RoleAssignmentType {
44
+ Static = 'static',
45
+ Dynamic = 'dynamic',
46
+ }
47
+
48
+ export const isRoleAssignmentStatic = (
49
+ roleAssignment: AuthRoleAssignment,
50
+ ): roleAssignment is AuthStaticRoleAssignment => roleAssignment.type === RoleAssignmentType.Static;
51
+
52
+ export const isRoleAssignmentDynamic = (
53
+ roleAssignment: AuthRoleAssignment,
54
+ ): roleAssignment is AuthDynamicRoleAssignment => roleAssignment.type === RoleAssignmentType.Dynamic;
55
+
56
+ export type AuthProviderFormValues = {
57
+ exists: boolean;
58
+ name: string;
59
+ displayName?: string;
60
+ providerType: ProviderType;
61
+ issuer: string;
62
+ clientId: string;
63
+ clientSecret: string;
64
+ enabled: boolean;
65
+ scopes: string[];
66
+ usernameClaim?: string[]; // Array of path segments (e.g., ["preferred_username"] or ["custom", "user_id"])
67
+ roleAssignmentType?: RoleAssignmentType;
68
+ roleClaimPath?: string[]; // For dynamic role assignment
69
+ roleSeparator?: string; // For dynamic role assignment - separator for org:role format
70
+ staticRoles?: string[]; // For static role assignment
71
+
72
+ // OAuth2 specific fields
73
+ authorizationUrl?: string;
74
+ tokenUrl?: string;
75
+ userinfoUrl?: string;
76
+
77
+ orgAssignmentType: OrgAssignmentType;
78
+ orgName?: string; // OrgAssignment: Static only
79
+ claimPath?: string[]; // OrgAssignment: Dynamic only - array of path segments
80
+ orgNamePrefix?: string; // OrgAssignment: Dynamic and perUser
81
+ orgNameSuffix?: string; // OrgAssignment: Dynamic and perUser
82
+ };
83
+
84
+ // Test connection types
85
+ export type FieldValidation = {
86
+ valid: boolean;
87
+ value?: string;
88
+ notes?: string[];
89
+ };
90
+
91
+ export type FieldValidationResult = {
92
+ field: string;
93
+ valid: boolean;
94
+ value?: string;
95
+ notes?: string[];
96
+ };