@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
@@ -0,0 +1,557 @@
1
+ import * as Yup from 'yup';
2
+ import { TFunction } from 'i18next';
3
+ import {
4
+ AuthDynamicRoleAssignment,
5
+ AuthOrganizationAssignment,
6
+ AuthProvider,
7
+ AuthProviderSpec,
8
+ AuthRoleAssignment,
9
+ AuthStaticRoleAssignment,
10
+ OAuth2ProviderSpec,
11
+ PatchRequest,
12
+ } from '@flightctl/types';
13
+ import { appendJSONPatch } from '../../../utils/patch';
14
+ import {
15
+ AuthProviderFormValues,
16
+ DEFAULT_ROLE_SEPARATOR,
17
+ OrgAssignmentType,
18
+ RoleAssignmentType,
19
+ isOAuth2Provider,
20
+ isOrgAssignmentDynamic,
21
+ isOrgAssignmentPerUser,
22
+ isOrgAssignmentStatic,
23
+ isRoleAssignmentDynamic,
24
+ isRoleAssignmentStatic,
25
+ } from './types';
26
+ import { validKubernetesDnsSubdomain } from '../../form/validations';
27
+ import { DynamicAuthProviderSpec, ProviderType } from '../../../types/extraTypes';
28
+ import { API_VERSION } from '../../../constants';
29
+
30
+ export const getAssignmentTypeLabel = (
31
+ type: AuthOrganizationAssignment['type'] | AuthRoleAssignment['type'] | undefined,
32
+ t: TFunction,
33
+ ) => {
34
+ switch (type) {
35
+ case OrgAssignmentType.Static: {
36
+ return t('Static');
37
+ }
38
+ case OrgAssignmentType.Dynamic: {
39
+ return t('Dynamic');
40
+ }
41
+ case OrgAssignmentType.PerUser: {
42
+ return t('Per user');
43
+ }
44
+ default: {
45
+ return 'N/A';
46
+ }
47
+ }
48
+ };
49
+
50
+ export const getProviderTypeLabel = (type: AuthProviderSpec['providerType'], t: TFunction) => {
51
+ switch (type) {
52
+ case ProviderType.OIDC: {
53
+ return t('OIDC');
54
+ }
55
+ case ProviderType.OAuth2: {
56
+ return t('OAuth2');
57
+ }
58
+ default: {
59
+ return 'N/A';
60
+ }
61
+ }
62
+ };
63
+
64
+ export const getInitValues = (authProvider?: AuthProvider): AuthProviderFormValues => {
65
+ if (!authProvider) {
66
+ return {
67
+ exists: false,
68
+ enabled: true,
69
+ name: '',
70
+ displayName: '',
71
+ providerType: ProviderType.OIDC,
72
+ issuer: '',
73
+ clientId: '',
74
+ clientSecret: '',
75
+ scopes: [],
76
+ usernameClaim: [],
77
+ roleAssignmentType: RoleAssignmentType.Static,
78
+ roleClaimPath: [],
79
+ roleSeparator: DEFAULT_ROLE_SEPARATOR,
80
+ staticRoles: [],
81
+ orgAssignmentType: OrgAssignmentType.Static,
82
+ orgName: '',
83
+ claimPath: [],
84
+ orgNamePrefix: '',
85
+ orgNameSuffix: '',
86
+ };
87
+ }
88
+
89
+ let orgAssignmentType: OrgAssignmentType;
90
+ let orgName = '';
91
+ let claimPath: string[] = [];
92
+ let orgNamePrefix = '';
93
+ let orgNameSuffix = '';
94
+
95
+ const spec = authProvider.spec as DynamicAuthProviderSpec;
96
+
97
+ const orgAssignment = spec.organizationAssignment;
98
+ if (isOrgAssignmentDynamic(orgAssignment)) {
99
+ orgAssignmentType = OrgAssignmentType.Dynamic;
100
+ claimPath = orgAssignment.claimPath || [];
101
+ orgNamePrefix = orgAssignment.organizationNamePrefix || '';
102
+ orgNameSuffix = orgAssignment.organizationNameSuffix || '';
103
+ } else if (isOrgAssignmentPerUser(orgAssignment)) {
104
+ orgAssignmentType = OrgAssignmentType.PerUser;
105
+ orgNamePrefix = orgAssignment.organizationNamePrefix || '';
106
+ orgNameSuffix = orgAssignment.organizationNameSuffix || '';
107
+ } else {
108
+ orgAssignmentType = OrgAssignmentType.Static;
109
+ orgName = orgAssignment.organizationName;
110
+ }
111
+
112
+ let roleAssignmentType: RoleAssignmentType = RoleAssignmentType.Dynamic;
113
+ let roleClaimPath: string[] = [];
114
+ let roleSeparator: string = DEFAULT_ROLE_SEPARATOR;
115
+ let staticRoles: string[] = [];
116
+
117
+ const roleAssignment = spec.roleAssignment;
118
+ if (isRoleAssignmentStatic(roleAssignment)) {
119
+ roleAssignmentType = RoleAssignmentType.Static;
120
+ staticRoles = roleAssignment.roles || [];
121
+ } else if (isRoleAssignmentDynamic(roleAssignment)) {
122
+ roleAssignmentType = RoleAssignmentType.Dynamic;
123
+ roleClaimPath = roleAssignment.claimPath || [];
124
+ roleSeparator = roleAssignment.separator || DEFAULT_ROLE_SEPARATOR;
125
+ }
126
+
127
+ const isOAuth2 = isOAuth2Provider(spec);
128
+ return {
129
+ exists: true,
130
+ name: authProvider.metadata.name as string,
131
+ displayName: spec.displayName,
132
+ providerType: spec.providerType as ProviderType,
133
+ issuer: spec.issuer || '',
134
+ clientId: spec.clientId,
135
+ clientSecret: spec.clientSecret,
136
+ enabled: spec.enabled ?? true,
137
+ authorizationUrl: isOAuth2 ? spec.authorizationUrl : undefined,
138
+ tokenUrl: isOAuth2 ? spec.tokenUrl : undefined,
139
+ userinfoUrl: isOAuth2 ? spec.userinfoUrl : undefined,
140
+ scopes: spec.scopes || [],
141
+ usernameClaim: spec.usernameClaim || [],
142
+ roleAssignmentType,
143
+ roleClaimPath,
144
+ roleSeparator,
145
+ staticRoles,
146
+ orgAssignmentType,
147
+ orgName,
148
+ claimPath,
149
+ orgNamePrefix,
150
+ orgNameSuffix,
151
+ };
152
+ };
153
+
154
+ const getOrgAssignment = (values: AuthProviderFormValues): AuthOrganizationAssignment => {
155
+ if (values.orgAssignmentType === OrgAssignmentType.Static) {
156
+ return {
157
+ type: OrgAssignmentType.Static,
158
+ organizationName: values.orgName || '',
159
+ };
160
+ }
161
+
162
+ let orgAssignment: AuthOrganizationAssignment;
163
+ if (values.orgAssignmentType === OrgAssignmentType.PerUser) {
164
+ orgAssignment = {
165
+ type: OrgAssignmentType.PerUser,
166
+ organizationNamePrefix: values.orgNamePrefix,
167
+ organizationNameSuffix: values.orgNameSuffix,
168
+ };
169
+ } else {
170
+ orgAssignment = {
171
+ type: OrgAssignmentType.Dynamic,
172
+ claimPath: values.claimPath || [],
173
+ organizationNamePrefix: values.orgNamePrefix,
174
+ organizationNameSuffix: values.orgNameSuffix,
175
+ };
176
+ }
177
+
178
+ return orgAssignment;
179
+ };
180
+
181
+ /**
182
+ * Deep equality check for AuthOrganizationAssignment objects.
183
+ * Compares objects by their type and relevant fields, handling arrays properly.
184
+ */
185
+ const isOrgAssignmentEqual = (a: AuthOrganizationAssignment, b: AuthOrganizationAssignment): boolean => {
186
+ if (a.type !== b.type) {
187
+ return false;
188
+ }
189
+
190
+ switch (a.type) {
191
+ case OrgAssignmentType.Static: {
192
+ if (!isOrgAssignmentStatic(b)) {
193
+ return false;
194
+ }
195
+ return (a.organizationName || '') === (b.organizationName || '');
196
+ }
197
+ case OrgAssignmentType.Dynamic: {
198
+ if (!isOrgAssignmentDynamic(b)) {
199
+ return false;
200
+ }
201
+ const aClaimPath = a.claimPath || [];
202
+ const bClaimPath = b.claimPath || [];
203
+ if (aClaimPath.length !== bClaimPath.length) {
204
+ return false;
205
+ }
206
+ if (!aClaimPath.every((val, idx) => val === bClaimPath[idx])) {
207
+ return false;
208
+ }
209
+ return (
210
+ (a.organizationNamePrefix || '') === (b.organizationNamePrefix || '') &&
211
+ (a.organizationNameSuffix || '') === (b.organizationNameSuffix || '')
212
+ );
213
+ }
214
+ case OrgAssignmentType.PerUser: {
215
+ if (!isOrgAssignmentPerUser(b)) {
216
+ return false;
217
+ }
218
+ return (
219
+ (a.organizationNamePrefix || '') === (b.organizationNamePrefix || '') &&
220
+ (a.organizationNameSuffix || '') === (b.organizationNameSuffix || '')
221
+ );
222
+ }
223
+ default: {
224
+ return false;
225
+ }
226
+ }
227
+ };
228
+
229
+ /**
230
+ * Deep equality check for AuthRoleAssignment objects.
231
+ * Compares objects by their type and relevant fields, handling arrays properly.
232
+ */
233
+ const isRoleAssignmentEqual = (a: AuthRoleAssignment, b: AuthRoleAssignment): boolean => {
234
+ if (a.type !== b.type) {
235
+ return false;
236
+ }
237
+
238
+ switch (a.type) {
239
+ case RoleAssignmentType.Static: {
240
+ if (!isRoleAssignmentStatic(b)) {
241
+ return false;
242
+ }
243
+ const aRoles = a.roles || [];
244
+ const bRoles = b.roles || [];
245
+ if (aRoles.length !== bRoles.length) {
246
+ return false;
247
+ }
248
+ // Compare roles arrays (order matters for roles)
249
+ return aRoles.every((val, idx) => val === bRoles[idx]);
250
+ }
251
+ case RoleAssignmentType.Dynamic: {
252
+ if (!isRoleAssignmentDynamic(b)) {
253
+ return false;
254
+ }
255
+ const aClaimPath = a.claimPath || [];
256
+ const bClaimPath = b.claimPath || [];
257
+ if (aClaimPath.length !== bClaimPath.length) {
258
+ return false;
259
+ }
260
+ // Compare claim path arrays (order matters)
261
+ if (!aClaimPath.every((val, idx) => val === bClaimPath[idx])) {
262
+ return false;
263
+ }
264
+ return (a.separator || DEFAULT_ROLE_SEPARATOR) === (b.separator || DEFAULT_ROLE_SEPARATOR);
265
+ }
266
+ default: {
267
+ return false;
268
+ }
269
+ }
270
+ };
271
+
272
+ const getRoleAssignment = (values: AuthProviderFormValues): AuthRoleAssignment => {
273
+ if (values.roleAssignmentType === RoleAssignmentType.Static) {
274
+ const staticAssignment: AuthStaticRoleAssignment = {
275
+ type: RoleAssignmentType.Static,
276
+ roles: values.staticRoles || [],
277
+ };
278
+ return staticAssignment as AuthRoleAssignment;
279
+ } else {
280
+ const dynamicAssignment: AuthDynamicRoleAssignment = {
281
+ type: RoleAssignmentType.Dynamic,
282
+ claimPath: values.roleClaimPath || [],
283
+ separator: values.roleSeparator || DEFAULT_ROLE_SEPARATOR,
284
+ };
285
+ return dynamicAssignment as AuthRoleAssignment;
286
+ }
287
+ };
288
+
289
+ export const getAuthProvider = (values: AuthProviderFormValues): AuthProvider => {
290
+ const baseSpec = {
291
+ providerType: values.providerType,
292
+ displayName: values.displayName,
293
+ clientId: values.clientId,
294
+ clientSecret: values.clientSecret,
295
+ enabled: values.enabled,
296
+ issuer: values.issuer,
297
+ scopes: values.scopes,
298
+ usernameClaim: values.usernameClaim || [],
299
+ roleAssignment: getRoleAssignment(values),
300
+ organizationAssignment: getOrgAssignment(values),
301
+ };
302
+
303
+ let spec: AuthProviderSpec;
304
+ if (values.providerType === ProviderType.OAuth2) {
305
+ spec = {
306
+ ...baseSpec,
307
+ providerType: ProviderType.OAuth2,
308
+ authorizationUrl: values.authorizationUrl || '',
309
+ tokenUrl: values.tokenUrl || '',
310
+ userinfoUrl: values.userinfoUrl || '',
311
+ };
312
+ } else {
313
+ spec = {
314
+ ...baseSpec,
315
+ providerType: ProviderType.OIDC,
316
+ };
317
+ }
318
+
319
+ return {
320
+ apiVersion: API_VERSION,
321
+ kind: 'AuthProvider',
322
+ metadata: {
323
+ name: values.name,
324
+ },
325
+ spec,
326
+ };
327
+ };
328
+
329
+ const patchAuthProviderFields = (
330
+ patches: PatchRequest,
331
+ spec: DynamicAuthProviderSpec,
332
+ newSpec: DynamicAuthProviderSpec,
333
+ options: { skipSecrets?: boolean } = {},
334
+ ) => {
335
+ const { skipSecrets = false } = options;
336
+
337
+ appendJSONPatch({
338
+ patches,
339
+ originalValue: spec.issuer,
340
+ newValue: newSpec.issuer,
341
+ path: '/spec/issuer',
342
+ });
343
+
344
+ appendJSONPatch({
345
+ patches,
346
+ originalValue: spec.clientId,
347
+ newValue: newSpec.clientId,
348
+ path: '/spec/clientId',
349
+ });
350
+
351
+ if (!skipSecrets) {
352
+ appendJSONPatch({
353
+ patches,
354
+ originalValue: spec.clientSecret,
355
+ newValue: newSpec.clientSecret,
356
+ path: '/spec/clientSecret',
357
+ });
358
+ }
359
+
360
+ appendJSONPatch({
361
+ patches,
362
+ originalValue: spec.enabled ?? true,
363
+ newValue: newSpec.enabled ?? true,
364
+ path: '/spec/enabled',
365
+ });
366
+
367
+ if (JSON.stringify(spec.scopes) !== JSON.stringify(newSpec.scopes)) {
368
+ appendJSONPatch({
369
+ patches,
370
+ originalValue: spec.scopes,
371
+ newValue: newSpec.scopes,
372
+ path: '/spec/scopes',
373
+ });
374
+ }
375
+
376
+ const orgAssignmentChanged = !isOrgAssignmentEqual(spec.organizationAssignment, newSpec.organizationAssignment);
377
+ if (orgAssignmentChanged) {
378
+ appendJSONPatch({
379
+ patches,
380
+ originalValue: spec.organizationAssignment,
381
+ newValue: newSpec.organizationAssignment,
382
+ path: '/spec/organizationAssignment',
383
+ });
384
+ }
385
+
386
+ appendJSONPatch({
387
+ patches,
388
+ originalValue: spec.displayName,
389
+ newValue: newSpec.displayName,
390
+ path: '/spec/displayName',
391
+ });
392
+
393
+ appendJSONPatch({
394
+ patches,
395
+ originalValue: spec.usernameClaim,
396
+ newValue: newSpec.usernameClaim,
397
+ path: '/spec/usernameClaim',
398
+ });
399
+
400
+ const roleAssignmentChanged = !isRoleAssignmentEqual(spec.roleAssignment, newSpec.roleAssignment);
401
+ if (roleAssignmentChanged) {
402
+ appendJSONPatch({
403
+ patches,
404
+ originalValue: spec.roleAssignment,
405
+ newValue: newSpec.roleAssignment,
406
+ path: '/spec/roleAssignment',
407
+ });
408
+ }
409
+ };
410
+
411
+ const patchProviderTypeSpecificFields = (patches: PatchRequest, spec: AuthProviderSpec, newSpec: AuthProviderSpec) => {
412
+ const oauth2Fields: Array<keyof OAuth2ProviderSpec> = ['authorizationUrl', 'tokenUrl', 'userinfoUrl'];
413
+
414
+ const wasOAuth2Before = isOAuth2Provider(spec);
415
+ const isNowOAuth2 = isOAuth2Provider(newSpec);
416
+
417
+ if (isNowOAuth2) {
418
+ oauth2Fields.forEach((field) => {
419
+ appendJSONPatch({
420
+ patches,
421
+ originalValue: wasOAuth2Before ? spec[field] : undefined,
422
+ newValue: newSpec[field],
423
+ path: `/spec/${field}`,
424
+ });
425
+ });
426
+ } else if (wasOAuth2Before) {
427
+ // Changing from Oauth2 to OIDC, we need to remove the Oauth2 specific fields
428
+ oauth2Fields.forEach((field) => {
429
+ patches.push({ op: 'remove', path: `/spec/${field}` });
430
+ });
431
+ }
432
+ };
433
+
434
+ export const getAuthProviderPatches = (values: AuthProviderFormValues, authProvider: AuthProvider): PatchRequest => {
435
+ const patches: PatchRequest = [];
436
+ const prevSpec = authProvider.spec as DynamicAuthProviderSpec;
437
+
438
+ const newAuthProvider = getAuthProvider(values);
439
+ const newSpec = newAuthProvider.spec as DynamicAuthProviderSpec;
440
+
441
+ const providerTypeChanged = prevSpec.providerType !== newSpec.providerType;
442
+ const secretWasChanged = prevSpec.clientSecret !== newSpec.clientSecret;
443
+
444
+ // If provider type changed AND user provided a new secret, we can do a full replace
445
+ if (providerTypeChanged && secretWasChanged) {
446
+ patches.push({
447
+ op: 'replace',
448
+ path: '/spec',
449
+ value: newSpec,
450
+ });
451
+ return patches;
452
+ }
453
+
454
+ // In every other case, we need to patch the fields individually
455
+ if (providerTypeChanged) {
456
+ patches.push({
457
+ op: 'replace',
458
+ path: '/spec/providerType',
459
+ value: newSpec.providerType,
460
+ });
461
+ }
462
+
463
+ // Patch all common fields
464
+ patchAuthProviderFields(patches, prevSpec, newSpec, { skipSecrets: !secretWasChanged });
465
+
466
+ // Handle provider-specific fields (OAuth2 vs OIDC)
467
+ patchProviderTypeSpecificFields(patches, prevSpec, newSpec);
468
+
469
+ return patches;
470
+ };
471
+
472
+ export const authProviderSchema = (t: TFunction) => (values: AuthProviderFormValues) => {
473
+ const baseSchema = {
474
+ name: validKubernetesDnsSubdomain(t, { isRequired: true }),
475
+ providerType: Yup.string().oneOf(Object.values(ProviderType)).required(t('Provider type is required')),
476
+ clientId: Yup.string().required(t('Client ID is required')),
477
+ clientSecret: Yup.string().required(t('Client secret is required')),
478
+ enabled: Yup.boolean(),
479
+ scopes: Yup.array()
480
+ .of(Yup.string())
481
+ .test('unique-scopes', t('Please remove duplicate scopes'), (scopes) => {
482
+ const uniqueScopes = new Set(scopes || []);
483
+ return uniqueScopes.size === scopes?.length;
484
+ }),
485
+ usernameClaim: Yup.array().of(Yup.string()),
486
+ roleAssignmentType: Yup.string().oneOf(Object.values(RoleAssignmentType)),
487
+ roleClaimPath: Yup.array()
488
+ .of(Yup.string())
489
+ .when('roleAssignmentType', (roleAssignmentType, schema) => {
490
+ const roleType = (
491
+ Array.isArray(roleAssignmentType) ? roleAssignmentType[0] : roleAssignmentType
492
+ ) as RoleAssignmentType;
493
+ return roleType === RoleAssignmentType.Dynamic
494
+ ? schema.min(1, t('At least one claim path segment is required for dynamic role assignment'))
495
+ : schema;
496
+ }),
497
+ roleSeparator: Yup.string().optional().nullable(),
498
+ staticRoles: Yup.array()
499
+ .of(Yup.string())
500
+ .when('roleAssignmentType', (roleAssignmentType, schema) => {
501
+ const roleType = (
502
+ Array.isArray(roleAssignmentType) ? roleAssignmentType[0] : roleAssignmentType
503
+ ) as RoleAssignmentType;
504
+ return roleType === RoleAssignmentType.Static
505
+ ? schema.min(1, t('At least one role is required for static role assignment'))
506
+ : schema;
507
+ }),
508
+ orgAssignmentType: Yup.string()
509
+ .oneOf(Object.values(OrgAssignmentType))
510
+ .required(t('Organization assignment type is required')),
511
+ };
512
+
513
+ let schema: Record<string, Yup.Schema> = { ...baseSchema };
514
+
515
+ // Issuer validation is provider-type specific
516
+ if (values.providerType === ProviderType.OIDC) {
517
+ // OIDC: issuer is required
518
+ schema = {
519
+ ...schema,
520
+ issuer: Yup.string().required(t('Issuer is required')).url(t('Must be a valid URL')),
521
+ };
522
+ } else if (values.providerType === ProviderType.OAuth2) {
523
+ // OAuth2: issuer is optional but must be a valid URL if provided
524
+ schema = {
525
+ ...schema,
526
+ issuer: Yup.string().url(t('Must be a valid URL')),
527
+ authorizationUrl: Yup.string().required(t('Authorization URL is required')).url(t('Must be a valid URL')),
528
+ tokenUrl: Yup.string().required(t('Token URL is required')).url(t('Must be a valid URL')),
529
+ userinfoUrl: Yup.string().required(t('Userinfo URL is required')).url(t('Must be a valid URL')),
530
+ };
531
+ }
532
+
533
+ if (values.orgAssignmentType === OrgAssignmentType.Static) {
534
+ schema = {
535
+ ...schema,
536
+ orgName: Yup.string().required(t('Static organization assignment requires an organization name')),
537
+ };
538
+ } else if (values.orgAssignmentType === OrgAssignmentType.Dynamic) {
539
+ schema = {
540
+ ...schema,
541
+ claimPath: Yup.array()
542
+ .of(Yup.string())
543
+ .min(1, t('At least one claim path segment is required'))
544
+ .required(t('Claim path is required')),
545
+ orgNamePrefix: Yup.string(),
546
+ orgNameSuffix: Yup.string(),
547
+ };
548
+ } else if (values.orgAssignmentType === OrgAssignmentType.PerUser) {
549
+ schema = {
550
+ ...schema,
551
+ orgNamePrefix: Yup.string(),
552
+ orgNameSuffix: Yup.string(),
553
+ };
554
+ }
555
+
556
+ return Yup.object().shape(schema);
557
+ };
@@ -0,0 +1,136 @@
1
+ import * as React from 'react';
2
+ import {
3
+ Alert,
4
+ Button,
5
+ Icon,
6
+ List,
7
+ ListItem,
8
+ Stack,
9
+ StackItem,
10
+ Text,
11
+ TextContent,
12
+ TextVariants,
13
+ } from '@patternfly/react-core';
14
+ import { Modal, ModalBody, ModalFooter, ModalHeader } from '@patternfly/react-core/next';
15
+ import { Table, Tbody, Td, Th, Thead, Tr } from '@patternfly/react-table';
16
+ import { CheckCircleIcon } from '@patternfly/react-icons/dist/js/icons/check-circle-icon';
17
+ import { ExclamationTriangleIcon } from '@patternfly/react-icons/dist/js/icons/exclamation-triangle-icon';
18
+
19
+ import { useTranslation } from '../../../hooks/useTranslation';
20
+ import { FieldValidationResult } from '../CreateAuthProvider/types';
21
+
22
+ type TestConnectionModalProps = {
23
+ onClose: VoidFunction;
24
+ results: FieldValidationResult[];
25
+ };
26
+
27
+ const getStatusIcon = (valid: boolean) => {
28
+ if (valid) {
29
+ return (
30
+ <Icon status="success">
31
+ <CheckCircleIcon />
32
+ </Icon>
33
+ );
34
+ }
35
+ return (
36
+ <Icon status="warning">
37
+ <ExclamationTriangleIcon />
38
+ </Icon>
39
+ );
40
+ };
41
+
42
+ const getFieldDisplayName = (fieldName: string, t: (key: string) => string): string => {
43
+ const fieldMap: Record<string, string> = {
44
+ issuer: t('Issuer URL'),
45
+ authorizationUrl: t('Authorization URL'),
46
+ tokenUrl: t('Token URL'),
47
+ userinfoUrl: t('Userinfo URL'),
48
+ };
49
+ return fieldMap[fieldName] || fieldName;
50
+ };
51
+
52
+ const NotesCell = ({ notes }: { notes?: string[] }) => {
53
+ if (!notes || notes.length === 0) {
54
+ return <>-</>;
55
+ }
56
+
57
+ return (
58
+ <List isPlain>
59
+ {notes.map((note, idx) => (
60
+ <ListItem key={idx}>{note}</ListItem>
61
+ ))}
62
+ </List>
63
+ );
64
+ };
65
+
66
+ const TestConnectionModal = ({ onClose, results }: TestConnectionModalProps) => {
67
+ const { t } = useTranslation();
68
+
69
+ const allValid = results.every((validation) => validation.valid);
70
+ const hasValid = results.some((validation) => validation.valid);
71
+
72
+ return (
73
+ <Modal isOpen onClose={onClose} variant="medium">
74
+ <ModalHeader title={t('Test connection results')} />
75
+ <ModalBody>
76
+ <Stack hasGutter>
77
+ {allValid ? (
78
+ <>
79
+ <StackItem>
80
+ <Alert variant="success" title={t('Connection test successful')} />
81
+ </StackItem>
82
+ <StackItem>
83
+ <TextContent>
84
+ <Text component={TextVariants.small}>
85
+ {t("Great! We successfully connected to your provider. Here's what we found:")}
86
+ </Text>
87
+ </TextContent>
88
+ </StackItem>
89
+ </>
90
+ ) : (
91
+ <StackItem>
92
+ <Alert
93
+ isInline
94
+ variant={hasValid ? 'warning' : 'danger'}
95
+ title={hasValid ? t('Connection partially successful') : t('Connection test unsuccessful')}
96
+ >
97
+ {t("We found some issues with your configuration. Here's what needs your attention:")}
98
+ </Alert>
99
+ </StackItem>
100
+ )}
101
+ <StackItem>
102
+ <Table variant="compact">
103
+ <Thead>
104
+ <Tr>
105
+ <Th>{t('Field')}</Th>
106
+ <Th>{t('Value')}</Th>
107
+ <Th>{t('Status')}</Th>
108
+ <Th>{t('Details')}</Th>
109
+ </Tr>
110
+ </Thead>
111
+ <Tbody>
112
+ {results.map((result) => (
113
+ <Tr key={result.field}>
114
+ <Td>{getFieldDisplayName(result.field, t)}</Td>
115
+ <Td style={{ wordBreak: 'break-all' }}>{result.value || '-'}</Td>
116
+ <Td>{getStatusIcon(result.valid)}</Td>
117
+ <Td>
118
+ <NotesCell notes={result.notes} />
119
+ </Td>
120
+ </Tr>
121
+ ))}
122
+ </Tbody>
123
+ </Table>
124
+ </StackItem>
125
+ </Stack>
126
+ </ModalBody>
127
+ <ModalFooter>
128
+ <Button variant="primary" onClick={onClose}>
129
+ {t('Close')}
130
+ </Button>
131
+ </ModalFooter>
132
+ </Modal>
133
+ );
134
+ };
135
+
136
+ export default TestConnectionModal;
@@ -0,0 +1,18 @@
1
+ import { useFetchPeriodically } from '../../hooks/useFetchPeriodically';
2
+ import { AuthProviderList } from '@flightctl/types';
3
+
4
+ export const useAuthProviders = () => {
5
+ const [data, isLoading, error, refetch, isUpdating] = useFetchPeriodically<AuthProviderList>({
6
+ endpoint: 'authproviders',
7
+ });
8
+
9
+ const providers = data?.items || [];
10
+
11
+ return {
12
+ providers,
13
+ isLoading,
14
+ error,
15
+ refetch,
16
+ isUpdating,
17
+ };
18
+ };