@atom8n/n8n-editor-ui 2.2.0

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 (310) hide show
  1. package/.stylelintcache +1 -0
  2. package/README.md +59 -0
  3. package/biome.jsonc +8 -0
  4. package/build.log +55 -0
  5. package/data/node-popularity.json +3998 -0
  6. package/dist/assets/AddDataTableModal-UINkk54_.js +1555 -0
  7. package/dist/assets/AgentEditorModal-CVww87TJ.js +358 -0
  8. package/dist/assets/Alert-Dy86dyOr.js +102 -0
  9. package/dist/assets/AnimatedSpinner-DmPN4poP.js +15 -0
  10. package/dist/assets/AnnotationTagsDropdown.ee-BJ7N9lek.js +71 -0
  11. package/dist/assets/AuthView-D2LWHrMp.js +106 -0
  12. package/dist/assets/BottomMenu-CIQiK_dJ.js +532 -0
  13. package/dist/assets/CalendarDate-DgQUMbNo.js +875 -0
  14. package/dist/assets/ChangePasswordView-Z6tUkw0u.js +133 -0
  15. package/dist/assets/ChatAgentAvatar-50YBnv3N.js +67 -0
  16. package/dist/assets/ChatFile-xZxmc2nV.js +146 -0
  17. package/dist/assets/ChatLayout-CTE_5SiM.js +96 -0
  18. package/dist/assets/ChatPersonalAgentsView-BGpHk03K.js +149 -0
  19. package/dist/assets/ChatSidebar-BkVwIypC.js +528 -0
  20. package/dist/assets/ChatView-BbbdeU9x.js +1559 -0
  21. package/dist/assets/ChatWorkflowAgentsView-BtunOxlC.js +116 -0
  22. package/dist/assets/CollectionParameter-BdcPG1lu.js +52 -0
  23. package/dist/assets/CommitMonoVariable-ytizKI8U.woff2 +0 -0
  24. package/dist/assets/CommunityNodeUpdateInfo-C37kca4W.js +273 -0
  25. package/dist/assets/CopyInput-DDZVu2iU.js +74 -0
  26. package/dist/assets/CredentialIcon-8YdTTFZ1.js +80 -0
  27. package/dist/assets/CredentialPicker-DWtj314o.js +293 -0
  28. package/dist/assets/CredentialSelectorModal-DTW2fKh0.js +138 -0
  29. package/dist/assets/CredentialsView-BjUchcCu.js +480 -0
  30. package/dist/assets/DataTableActions-DpAkoxg_.js +95 -0
  31. package/dist/assets/DataTableDetailsView-Coq7zdW5.js +41922 -0
  32. package/dist/assets/DataTableView-Cs-BIkzw.js +293 -0
  33. package/dist/assets/DemoFooter-Cga3jvi-.js +65 -0
  34. package/dist/assets/Draggable-vfvXl9Sp.js +105 -0
  35. package/dist/assets/EmptySharedSectionActionBox-DOXZtTCv.js +36 -0
  36. package/dist/assets/EnterpriseEdition.ee-D_rCFexM.js +15 -0
  37. package/dist/assets/EntityNotFound-3dhTRWsE.js +85 -0
  38. package/dist/assets/EntityUnAuthorised-ChJYZakE.js +66 -0
  39. package/dist/assets/ErrorView-zT9cX76a.js +61 -0
  40. package/dist/assets/EvaluationsRootView-C-OVWYnY.js +523 -0
  41. package/dist/assets/EvaluationsView-CJwJTruc.js +469 -0
  42. package/dist/assets/ExecutionsTime-DEQiyozR.js +573 -0
  43. package/dist/assets/ExecutionsView-Bd5Oh8TH.js +791 -0
  44. package/dist/assets/ExternalSecretsProviderConnectionSwitch.ee-C7Ih-uRo.js +191 -0
  45. package/dist/assets/FixedCollectionParameter-CYuTDW9t.js +496 -0
  46. package/dist/assets/ForgotMyPasswordView-Bs_L9P27.js +102 -0
  47. package/dist/assets/InsightsChartAverageRuntime-Bp3VA8_7.js +62 -0
  48. package/dist/assets/InsightsChartFailed-KPaNWoEr.js +52 -0
  49. package/dist/assets/InsightsChartFailureRate-DE6kE3FM.js +54 -0
  50. package/dist/assets/InsightsChartTimeSaved-auABNZlc.js +68 -0
  51. package/dist/assets/InsightsChartTotal-BKzYRKE7.js +56 -0
  52. package/dist/assets/InsightsDashboard-JWx4W6Db.js +473 -0
  53. package/dist/assets/InsightsPaywall-C8zLLKe8.js +63 -0
  54. package/dist/assets/InsightsSummary-cmN1lHDm.js +210 -0
  55. package/dist/assets/InsightsTableWorkflows-CqcC3IbQ.js +203 -0
  56. package/dist/assets/InterVariable-DiVDrmQJ.woff2 +0 -0
  57. package/dist/assets/InterVariable-Italic-FCBEiFp6.woff2 +0 -0
  58. package/dist/assets/ItemsRenderer-DC8WVyMv.js +922 -0
  59. package/dist/assets/KeyboardShortcutTooltip-D8PAK5JP.js +31 -0
  60. package/dist/assets/LogsPanel-BR06u9RK.js +52 -0
  61. package/dist/assets/LogsPanel-C-_acMHp.js +2325 -0
  62. package/dist/assets/MCPConnectWorkflowsModal-3g8_iUa4.js +303 -0
  63. package/dist/assets/MainHeader-DiQc1edn.js +2153 -0
  64. package/dist/assets/MainSidebar-CoPGG5Ea.js +804 -0
  65. package/dist/assets/MigrationRuleDetail-BAxk1Pvl.js +295 -0
  66. package/dist/assets/MigrationRules-IW9lZMpE.js +285 -0
  67. package/dist/assets/Modal-CIzXlZdZ.js +204 -0
  68. package/dist/assets/ModelByIdSelectorModal-DLvBjzJO.js +115 -0
  69. package/dist/assets/NDVEmptyState-33UoX00I.js +19743 -0
  70. package/dist/assets/NodeCreation-BNzbSWSB.js +240 -0
  71. package/dist/assets/NodeCreator-BftgCKx7.js +1288 -0
  72. package/dist/assets/NodeDetailsView-CsoQCpcF.js +1075 -0
  73. package/dist/assets/NodeDetailsViewV2-C_wNQR_3.js +981 -0
  74. package/dist/assets/NodeIcon-B9VW6tX6.js +87 -0
  75. package/dist/assets/NodeSettings-ZwVip6VR.js +1872 -0
  76. package/dist/assets/NodeView-D4WUEvLB.js +2452 -0
  77. package/dist/assets/OAuthConsentView-DlrUqZbT.js +230 -0
  78. package/dist/assets/PageViewLayout-NT1KPFgy.js +12 -0
  79. package/dist/assets/ParameterInputList-sG2nz-Jo.js +38091 -0
  80. package/dist/assets/PrebuiltAgentTemplatesView-Csi5U8dc.js +154 -0
  81. package/dist/assets/ProjectBreadcrumb-C_XiY7sc.js +98 -0
  82. package/dist/assets/ProjectCardBadge-t_hs7vzx.js +209 -0
  83. package/dist/assets/ProjectHeader-Dq5Ihb26.js +549 -0
  84. package/dist/assets/ProjectIcon-DY8gGuHX.js +64 -0
  85. package/dist/assets/ProjectRoleView-Du-KTrAC.js +435 -0
  86. package/dist/assets/ProjectRolesView-DjxM_y4u.js +239 -0
  87. package/dist/assets/ProjectSettings-C6kWuV21.js +966 -0
  88. package/dist/assets/ProjectSharing-CVUgNWAY.js +262 -0
  89. package/dist/assets/ProjectVariables-CJlAo3dv.js +467 -0
  90. package/dist/assets/ProviderSettingsModal-BUFC2ZLv.js +307 -0
  91. package/dist/assets/PushConnectionTracker-DPBnGV0v.js +27 -0
  92. package/dist/assets/ResolversView-3BdkvvYA.js +209 -0
  93. package/dist/assets/ResourceFiltersDropdown-dgyXpcEX.js +159 -0
  94. package/dist/assets/ResourcesListLayout-qBLtomK6.js +631 -0
  95. package/dist/assets/RunDataHtml-BrW0OQra.js +7 -0
  96. package/dist/assets/RunDataHtml-Cleia4Cj.js +40 -0
  97. package/dist/assets/RunDataJson-uxkrhYRK.js +227 -0
  98. package/dist/assets/RunDataJsonActions-DkPk7E8d.js +5007 -0
  99. package/dist/assets/RunDataParsedAiContent-CtPRjig-.js +26 -0
  100. package/dist/assets/RunDataParsedAiContent-WAuqLQ5M.js +192 -0
  101. package/dist/assets/RunDataSearch-YBWUr93C.js +141 -0
  102. package/dist/assets/RunDataTable-DcXaBynW.js +631 -0
  103. package/dist/assets/SamlOnboarding-BTdQ_hr3.js +78 -0
  104. package/dist/assets/SaveButton-D5sQSxIk.js +89 -0
  105. package/dist/assets/SelectedItemsInfo-BHZ-NvF5.js +58 -0
  106. package/dist/assets/SettingsApiView-IfZTMXx1.js +313 -0
  107. package/dist/assets/SettingsChatHubView-gWh2X6vX.js +285 -0
  108. package/dist/assets/SettingsCommunityNodesView-D8VQtpGY.js +349 -0
  109. package/dist/assets/SettingsExternalSecrets-CpMc7mkW.js +233 -0
  110. package/dist/assets/SettingsLdapView-CU5a2MAy.js +2553 -0
  111. package/dist/assets/SettingsLogStreamingView-uojTe-oX.js +375 -0
  112. package/dist/assets/SettingsMCPView-B5Swp1C_.js +1214 -0
  113. package/dist/assets/SettingsPersonalView-Cr3aGood.js +402 -0
  114. package/dist/assets/SettingsSourceControl-DXOvFDEY.js +547 -0
  115. package/dist/assets/SettingsSso-27MfU1HV.js +1032 -0
  116. package/dist/assets/SettingsUsageAndPlan-DqIO-G46.js +419 -0
  117. package/dist/assets/SettingsUsersView-DfHB4_Kh.js +833 -0
  118. package/dist/assets/SettingsView-C4sA7Uny.js +90 -0
  119. package/dist/assets/SetupTemplateFormStep-BmiSzZin.js +258 -0
  120. package/dist/assets/SetupView-VORZ-L_u.js +112 -0
  121. package/dist/assets/SetupWorkflowCredentialsButton-DTmkOAW5.js +73 -0
  122. package/dist/assets/SetupWorkflowFromTemplateView-B9NupdJE.js +286 -0
  123. package/dist/assets/SeverityTag-CX1qTTNA.js +45 -0
  124. package/dist/assets/SigninView-D9_Pm16j.js +358 -0
  125. package/dist/assets/SignoutView-BFsjEAGz.js +19 -0
  126. package/dist/assets/SignupView-Am4ot0QZ.js +137 -0
  127. package/dist/assets/SkeletonAgentCard-C5TL-h8F.js +191 -0
  128. package/dist/assets/TagsDropdown-Bvx_Hd6Q.js +230 -0
  129. package/dist/assets/TemplateCard-CyQ1GuVz.js +105 -0
  130. package/dist/assets/TemplateDetails-CZRusTxE.js +124 -0
  131. package/dist/assets/TemplateList-DKvbwuiY.js +333 -0
  132. package/dist/assets/TemplatesCollectionView-D8dxU8By.js +184 -0
  133. package/dist/assets/TemplatesSearchView-CebC_GLs.js +1230 -0
  134. package/dist/assets/TemplatesView-025CcmIY.js +57 -0
  135. package/dist/assets/TemplatesWorkflowView-C2JfwJAn.js +170 -0
  136. package/dist/assets/TestRunDetailView-Ck78TTWO.js +395 -0
  137. package/dist/assets/TextWithHighlights-BxumwGnv.js +57 -0
  138. package/dist/assets/TimeAgo-C6EN4lCs.js +123 -0
  139. package/dist/assets/ToolsSelectorModal-8QJoUvRL.js +368 -0
  140. package/dist/assets/TriggerPanel-B6pacLkk.js +1225 -0
  141. package/dist/assets/VirtualSchema-B3zGe_8b.js +2402 -0
  142. package/dist/assets/VirtualSchema-Dkh0Cu5z.js +37 -0
  143. package/dist/assets/VueMarkdown-CQqJL9vK.js +28 -0
  144. package/dist/assets/WorkerView-Caznsljo.js +563 -0
  145. package/dist/assets/WorkflowActivationErrorMessage-CGrfPi9O.js +17 -0
  146. package/dist/assets/WorkflowActivator-BINnz0f7.js +362 -0
  147. package/dist/assets/WorkflowExecutionsInfoAccordion-Dg37yEfT.js +166 -0
  148. package/dist/assets/WorkflowExecutionsLandingPage-V2wdubhK.js +93 -0
  149. package/dist/assets/WorkflowExecutionsPreview-DdJaqYV6.js +616 -0
  150. package/dist/assets/WorkflowExecutionsView-DV8ySTfn.js +808 -0
  151. package/dist/assets/WorkflowHistory-GtaBMzIM.js +973 -0
  152. package/dist/assets/WorkflowLocation-CQ9Sq-2y.js +164 -0
  153. package/dist/assets/WorkflowOnboardingView-C49gt0Jr.js +61 -0
  154. package/dist/assets/WorkflowPreview-CXdvv4Nq.js +186 -0
  155. package/dist/assets/WorkflowTagsDropdown-QwbICWjN.js +71 -0
  156. package/dist/assets/WorkflowsView-B-MWIECO.js +3253 -0
  157. package/dist/assets/_MapCache-CcdIl4Ae.js +363 -0
  158. package/dist/assets/_baseOrderBy-N8Be_6z6.js +2989 -0
  159. package/dist/assets/_initCloneObject-viQQyT6o.js +80 -0
  160. package/dist/assets/_plugin-vue_export-helper-BwBpWJRZ.js +6 -0
  161. package/dist/assets/aiTemplatesStarterCollection.store-nL9nePkK.js +656 -0
  162. package/dist/assets/apiKeys.store-BhOFmP2j.js +51 -0
  163. package/dist/assets/assistant.store-CNywgN4S.js +518 -0
  164. package/dist/assets/auth.eventBus-CWXS0Qp7.js +5 -0
  165. package/dist/assets/banners.store-CGEcBTDn.js +195 -0
  166. package/dist/assets/builder.store-Czk2ipDE.js +31417 -0
  167. package/dist/assets/buttons.esm-yintpW2E.js +364 -0
  168. package/dist/assets/chart-CNvyywtJ.js +10958 -0
  169. package/dist/assets/chartjs.utils-BAE52Cv9.js +155 -0
  170. package/dist/assets/chat.store-290YeyrQ.js +865 -0
  171. package/dist/assets/chatPanel.store-NDaawEZL.js +118 -0
  172. package/dist/assets/chunk-6z4oVpB-.js +36 -0
  173. package/dist/assets/col-Cmt4cmuS.js +158 -0
  174. package/dist/assets/constants-C8OH4tTq.js +106256 -0
  175. package/dist/assets/constants-DMrsrpD7.js +32 -0
  176. package/dist/assets/core-B9gt_4yk.js +4 -0
  177. package/dist/assets/core-CP5FY4aX.js +1202 -0
  178. package/dist/assets/core-CRbPymLT.js +9741 -0
  179. package/dist/assets/dataTable.store-DmipQsol.js +207 -0
  180. package/dist/assets/date-picker-2IDsBs2n.js +4115 -0
  181. package/dist/assets/dateFormatter-ik4-9_9r.js +33 -0
  182. package/dist/assets/dateformat-hG8NERse.js +181 -0
  183. package/dist/assets/dialog-lMho1TD8.js +425 -0
  184. package/dist/assets/dist-Cw46Is-h.js +151 -0
  185. package/dist/assets/doppler-B__k0MeW.webp +0 -0
  186. package/dist/assets/element-icons-B-tDfklg.woff +0 -0
  187. package/dist/assets/element-icons-_lZGOqcG.ttf +0 -0
  188. package/dist/assets/empty-BuGRxzl4.js +2210 -0
  189. package/dist/assets/en-CF30SCh2.js +95 -0
  190. package/dist/assets/en-DyO2pPiC.js +2 -0
  191. package/dist/assets/es-BkUFJVtD.js +43338 -0
  192. package/dist/assets/evaluation.constants-GYAwmJnh.js +284 -0
  193. package/dist/assets/executions.store-B9uRYwgv.js +205 -0
  194. package/dist/assets/exports-Crx_gvt_.js +1799 -0
  195. package/dist/assets/externalSecrets.ee.store-BJh4a_6G.js +118 -0
  196. package/dist/assets/fileUtils-CRWqOQje.js +20 -0
  197. package/dist/assets/folders.store-yAFj-5Vl.js +235 -0
  198. package/dist/assets/get-BcEmeOxn.js +2781 -0
  199. package/dist/assets/index-SL8542zQ.js +28372 -0
  200. package/dist/assets/insights.constants-BkJCYJTL.js +55 -0
  201. package/dist/assets/insights.store-BFc3kDUo.js +61 -0
  202. package/dist/assets/insights.utils-CcLXdrrz.js +77 -0
  203. package/dist/assets/isEmpty-C3XXoHqJ.js +35216 -0
  204. package/dist/assets/languageModules-9LyndCqU.js +13862 -0
  205. package/dist/assets/logStreaming.store-IZhWe_VK.js +190 -0
  206. package/dist/assets/mcp.constants-_Jcn7fPq.js +10 -0
  207. package/dist/assets/mcp.store-B9yfcAN9.js +116 -0
  208. package/dist/assets/merge-DhuTk1HM.js +564 -0
  209. package/dist/assets/nodeCreator.store-Bpnrwp2l.js +5444 -0
  210. package/dist/assets/nodeIcon-D6X-ENYt.js +102 -0
  211. package/dist/assets/nodeTransforms-RzcOM0v2.js +42 -0
  212. package/dist/assets/orderBy-Cu9F9DU_.js +15 -0
  213. package/dist/assets/path-browserify-RUt2u7iT.js +328 -0
  214. package/dist/assets/personalizedTemplatesV3.store-BGYp0YBN.js +334 -0
  215. package/dist/assets/pickBy-UI0Jt4wC.js +18 -0
  216. package/dist/assets/preload-helper-dyVz7ck7.js +59 -0
  217. package/dist/assets/radio-CSce3UT0.js +262 -0
  218. package/dist/assets/readyToRun.store-YEMvPUqo.js +626 -0
  219. package/dist/assets/readyToRunWorkflows.store-G3srgIze.js +1319 -0
  220. package/dist/assets/retry-BgHaYzbB.js +23 -0
  221. package/dist/assets/roles.store-CRf_zJTb.js +51 -0
  222. package/dist/assets/router-DNpzz3GH.js +2631 -0
  223. package/dist/assets/sanitize-html-CbW56HUN.js +10758 -0
  224. package/dist/assets/schemaPreview.store-DUgN1yVE.js +113 -0
  225. package/dist/assets/semver-Bk6DGseV.js +1306 -0
  226. package/dist/assets/smartDecimal-DAZl4HKA.js +6 -0
  227. package/dist/assets/sortByProperty-Cn7iGKYu.js +8 -0
  228. package/dist/assets/sourceControl.eventBus-D47xXSc_.js +3 -0
  229. package/dist/assets/sqlite3-DBpDb1lf.wasm +0 -0
  230. package/dist/assets/sqlite3-opfs-async-proxy-vVtmDGHX.js +461 -0
  231. package/dist/assets/sqlite3-worker1-bundler-friendly-DLarOZDL.js +9405 -0
  232. package/dist/assets/src-jviYSG25.js +55454 -0
  233. package/dist/assets/sso.store-DyApJwhx.js +139 -0
  234. package/dist/assets/style-E3CrYFV8.css +111829 -0
  235. package/dist/assets/table-we1DjFMV.js +3944 -0
  236. package/dist/assets/templateActions-bEDSARw2.js +65 -0
  237. package/dist/assets/templateTransforms-BHWiRbtR.js +43 -0
  238. package/dist/assets/truncate-C0KYt7i3.js +4176 -0
  239. package/dist/assets/typescript.worker-CYqLvLHh.js +152048 -0
  240. package/dist/assets/uniqBy-xDyuCRP0.js +10 -0
  241. package/dist/assets/usage.store-CU5J_nGm.js +100 -0
  242. package/dist/assets/useActions-B1JckIRj.js +255 -0
  243. package/dist/assets/useBeforeUnload-DiDkvI8p.js +40 -0
  244. package/dist/assets/useCanvasMapping-BXT7rGhC.js +12570 -0
  245. package/dist/assets/useCanvasOperations-8ULLtMkY.js +1765 -0
  246. package/dist/assets/useClipboard-DvjhVHqJ.js +39 -0
  247. package/dist/assets/useCommandBar-C4tLJbKt.js +2425 -0
  248. package/dist/assets/useCredentialResolvers-BKeFGJnY.js +78 -0
  249. package/dist/assets/useCustomAgent-DpILEt5e.js +471 -0
  250. package/dist/assets/useDebounce-Br5_1ug-.js +147 -0
  251. package/dist/assets/useExecutionData-M5iKsX6z.js +23 -0
  252. package/dist/assets/useExecutionDebugging-8azMzbnd.js +191 -0
  253. package/dist/assets/useExecutionHelpers-BgRRhpBM.js +91 -0
  254. package/dist/assets/useImportCurlCommand-CKiEmX5P.js +8891 -0
  255. package/dist/assets/useIntersectionObserver-BWMwOueh.js +33 -0
  256. package/dist/assets/useKeybindings-B2jfN6rd.js +62 -0
  257. package/dist/assets/useLogsTreeExpand-sZViUfdM.js +843 -0
  258. package/dist/assets/useMcp-DoMOIfqT.js +27 -0
  259. package/dist/assets/usePageRedirectionHelper-DjkznpX6.js +51 -0
  260. package/dist/assets/usePinnedData-BhZkqttf.js +203 -0
  261. package/dist/assets/usePushConnection-DMS-F_IW.js +513 -0
  262. package/dist/assets/useRecentResources-BVORr7eM.js +118 -0
  263. package/dist/assets/useRunWorkflow-LO7ffLp9.js +950 -0
  264. package/dist/assets/useSettingsItems-BhZXwMZn.js +144 -0
  265. package/dist/assets/useTelemetryContext-V6bv4YRq.js +34 -0
  266. package/dist/assets/useWorkflowActivate-DeSmDXjI.js +152 -0
  267. package/dist/assets/useWorkflowsCache-DtcEEAIR.js +179 -0
  268. package/dist/assets/userRoleProvisioning.store-kkSIdeTo.js +33 -0
  269. package/dist/assets/utils-DI7dLldp.js +54 -0
  270. package/dist/assets/versions.store-B1z2OrLE.js +191 -0
  271. package/dist/assets/vue-CydWIhxN.js +4378 -0
  272. package/dist/assets/vue-json-pretty-CsGX66mG.js +1130 -0
  273. package/dist/assets/vue.runtime.esm-bundler-tP5dCd7J.js +7325 -0
  274. package/dist/assets/xml-B_oj6Mle.js +2060 -0
  275. package/dist/favicon.ico +0 -0
  276. package/dist/index.html +157 -0
  277. package/dist/static/base-path.js +1 -0
  278. package/dist/static/community_package_tooltip_img.png +0 -0
  279. package/dist/static/data-mapping-gif.gif +0 -0
  280. package/dist/static/form-grey.svg +1 -0
  281. package/dist/static/google-auth/disabled.dark.png +0 -0
  282. package/dist/static/google-auth/disabled.png +0 -0
  283. package/dist/static/google-auth/focus.dark.png +0 -0
  284. package/dist/static/google-auth/focus.png +0 -0
  285. package/dist/static/google-auth/normal.dark.png +0 -0
  286. package/dist/static/google-auth/normal.png +0 -0
  287. package/dist/static/google-auth/pressed.dark.png +0 -0
  288. package/dist/static/google-auth/pressed.png +0 -0
  289. package/dist/static/n8n-logo.png +0 -0
  290. package/dist/static/og_image.png +0 -0
  291. package/dist/static/open-ai.svg +1 -0
  292. package/dist/static/openChat.png +0 -0
  293. package/dist/static/posthog.init.js +41 -0
  294. package/dist/static/prefers-color-scheme.css +5 -0
  295. package/dist/static/webhook-icon.svg +1 -0
  296. package/dist/tree-sitter-bash.wasm +0 -0
  297. package/dist/tree-sitter.wasm +0 -0
  298. package/eslint.config.mjs +59 -0
  299. package/index.html +45 -0
  300. package/index.js +0 -0
  301. package/package.json +147 -0
  302. package/postcss.config.cjs +6 -0
  303. package/scripts/fetch-node-popularity.mjs +102 -0
  304. package/stylelint.config.mjs +9 -0
  305. package/tailwind.config.js +8 -0
  306. package/tsconfig.json +36 -0
  307. package/vite/i18n-locales-hmr-helpers.ts +19 -0
  308. package/vite/source-map-js-shim.ts +1 -0
  309. package/vite/vite-plugin-node-popularity.mts +32 -0
  310. package/vite.config.mts +304 -0
@@ -0,0 +1,1032 @@
1
+ import { C as computed, Cn as toDisplayString, D as createElementBlock, E as createCommentVNode, Gt as unref, It as ref, M as createVNode, P as defineComponent, T as createBlock, U as mergeModels, Z as onMounted, _ as Fragment, _t as watch, bt as withCtx, et as openBlock, ft as useModel, h as withModifiers, it as renderList, j as createTextVNode, jt as isRef, st as resolveDirective, vn as normalizeClass, w as createBaseVNode, xt as withDirectives } from "./vue.runtime.esm-bundler-tP5dCd7J.js";
2
+ import { rt as useI18n } from "./core-CRbPymLT.js";
3
+ import { Cn as N8nIcon_default, Ct as N8nActionBox_default, J as N8nSelect_default, Lt as ElCheckbox, Q as N8nCheckbox_default, R as N8nInfoTip_default, T as N8nRadioButtons_default, Y as N8nOption_default, bn as N8nText_default, et as N8nCard_default, vn as N8nHeading_default, xn as N8nButton_default, yt as N8nInput_default } from "./src-jviYSG25.js";
4
+ import "./en-CF30SCh2.js";
5
+ import "./preload-helper-dyVz7ck7.js";
6
+ import { t as __plugin_vue_export_helper_default } from "./_plugin-vue_export-helper-BwBpWJRZ.js";
7
+ import "./truncate-C0KYt7i3.js";
8
+ import { Xn as useDocumentTitle, _s as getUsers, h as useMessage, k as useTelemetry, wr as useRBACStore, y as useToast } from "./builder.store-Czk2ipDE.js";
9
+ import "./empty-BuGRxzl4.js";
10
+ import { t as ElDialog } from "./dialog-lMho1TD8.js";
11
+ import "./get-BcEmeOxn.js";
12
+ import "./sanitize-html-CbW56HUN.js";
13
+ import "./CalendarDate-DgQUMbNo.js";
14
+ import "./path-browserify-RUt2u7iT.js";
15
+ import "./_MapCache-CcdIl4Ae.js";
16
+ import { rs as MODAL_CONFIRM } from "./constants-C8OH4tTq.js";
17
+ import "./merge-DhuTk1HM.js";
18
+ import { r as useRootStore } from "./_baseOrderBy-N8Be_6z6.js";
19
+ import "./dateformat-hG8NERse.js";
20
+ import "./useDebounce-Br5_1ug-.js";
21
+ import "./useClipboard-DvjhVHqJ.js";
22
+ import "./versions.store-B1z2OrLE.js";
23
+ import { t as usePageRedirectionHelper } from "./usePageRedirectionHelper-DjkznpX6.js";
24
+ import { t as CopyInput_default } from "./CopyInput-DDZVu2iU.js";
25
+ import { r as captureMessage } from "./exports-Crx_gvt_.js";
26
+ import { n as useSSOStore, t as SupportedProtocols } from "./sso.store-DyApJwhx.js";
27
+ import { t as useUserRoleProvisioningStore } from "./userRoleProvisioning.store-kkSIdeTo.js";
28
+ var _hoisted_1$3 = ["href"];
29
+ var UserRoleProvisioningDropdown_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
30
+ __name: "UserRoleProvisioningDropdown",
31
+ props: /* @__PURE__ */ mergeModels({ authProtocol: {} }, {
32
+ "modelValue": { default: "disabled" },
33
+ "modelModifiers": {}
34
+ }),
35
+ emits: ["update:modelValue"],
36
+ setup(__props) {
37
+ const value = useModel(__props, "modelValue");
38
+ const i18n = useI18n();
39
+ const canManageUserProvisioning = useRBACStore().hasScope("provisioning:manage");
40
+ const handleUserRoleProvisioningChange = (newValue) => {
41
+ value.value = newValue;
42
+ };
43
+ const userRoleProvisioningDescriptions = [
44
+ {
45
+ label: i18n.baseText("settings.sso.settings.userRoleProvisioning.option.disabled.label"),
46
+ value: "disabled"
47
+ },
48
+ {
49
+ label: i18n.baseText("settings.sso.settings.userRoleProvisioning.option.instanceRole.label"),
50
+ value: "instance_role"
51
+ },
52
+ {
53
+ label: i18n.baseText("settings.sso.settings.userRoleProvisioning.option.instanceAndProjectRoles.label"),
54
+ value: "instance_and_project_roles"
55
+ }
56
+ ];
57
+ return (_ctx, _cache) => {
58
+ return openBlock(), createElementBlock("div", { class: normalizeClass(_ctx.$style.group) }, [
59
+ createBaseVNode("label", null, toDisplayString(unref(i18n).baseText("settings.sso.settings.userRoleProvisioning.label")), 1),
60
+ createVNode(unref(N8nSelect_default), {
61
+ "model-value": value.value,
62
+ disabled: !unref(canManageUserProvisioning),
63
+ "data-test-id": "oidc-user-role-provisioning",
64
+ class: normalizeClass(_ctx.$style.userRoleProvisioningSelect),
65
+ "onUpdate:modelValue": handleUserRoleProvisioningChange
66
+ }, {
67
+ default: withCtx(() => [(openBlock(), createElementBlock(Fragment, null, renderList(userRoleProvisioningDescriptions, (option) => {
68
+ return createVNode(unref(N8nOption_default), {
69
+ key: option.value,
70
+ label: option.label,
71
+ "data-test-id": "oidc-user-role-provisioning-option",
72
+ value: option.value
73
+ }, null, 8, ["label", "value"]);
74
+ }), 64))]),
75
+ _: 1
76
+ }, 8, [
77
+ "model-value",
78
+ "disabled",
79
+ "class"
80
+ ]),
81
+ createBaseVNode("small", null, [createTextVNode(toDisplayString(unref(i18n).baseText("settings.sso.settings.userRoleProvisioning.help")) + " ", 1), createBaseVNode("a", {
82
+ href: `https://docs.n8n.io/user-management/${_ctx.authProtocol}/setup/`,
83
+ target: "_blank"
84
+ }, toDisplayString(unref(i18n).baseText("settings.sso.settings.userRoleProvisioning.help.linkText")), 9, _hoisted_1$3)])
85
+ ], 2);
86
+ };
87
+ }
88
+ });
89
+ var UserRoleProvisioningDropdown_vue_vue_type_style_index_0_lang_module_default = {
90
+ group: "_group_885kr_123",
91
+ userRoleProvisioningSelect: "_userRoleProvisioningSelect_885kr_139"
92
+ };
93
+ var UserRoleProvisioningDropdown_default = /* @__PURE__ */ __plugin_vue_export_helper_default(UserRoleProvisioningDropdown_vue_vue_type_script_setup_true_lang_default, [["__cssModules", { "$style": UserRoleProvisioningDropdown_vue_vue_type_style_index_0_lang_module_default }]]);
94
+ function useUserRoleProvisioningForm(protocol) {
95
+ const provisioningStore = useUserRoleProvisioningStore();
96
+ const telemetry = useTelemetry();
97
+ const formValue = ref("disabled");
98
+ const getUserRoleProvisioningValueFromConfig = (config) => {
99
+ if (!config) return "disabled";
100
+ if (config.scopesProvisionInstanceRole && config.scopesProvisionProjectRoles) return "instance_and_project_roles";
101
+ else if (config.scopesProvisionInstanceRole) return "instance_role";
102
+ else return "disabled";
103
+ };
104
+ const getProvisioningConfigFromFormValue = (formValue$1) => {
105
+ if (formValue$1 === "instance_role") return {
106
+ scopesProvisionInstanceRole: true,
107
+ scopesProvisionProjectRoles: false
108
+ };
109
+ else if (formValue$1 === "instance_and_project_roles") return {
110
+ scopesProvisionInstanceRole: true,
111
+ scopesProvisionProjectRoles: true
112
+ };
113
+ else return {
114
+ scopesProvisionInstanceRole: false,
115
+ scopesProvisionProjectRoles: false
116
+ };
117
+ };
118
+ const isUserRoleProvisioningChanged = computed(() => {
119
+ return getUserRoleProvisioningValueFromConfig(provisioningStore.provisioningConfig) !== formValue.value;
120
+ });
121
+ const sendTrackingEventForUserProvisioning = (updatedSetting) => {
122
+ telemetry.track("User updated provisioning settings", {
123
+ instance_id: useRootStore().instanceId,
124
+ authentication_method: protocol,
125
+ updated_setting: updatedSetting
126
+ });
127
+ };
128
+ const saveProvisioningConfig = async (isDisablingSso) => {
129
+ const newSetting = isDisablingSso ? "disabled" : formValue.value;
130
+ if (newSetting === getUserRoleProvisioningValueFromConfig(provisioningStore.provisioningConfig)) return;
131
+ await provisioningStore.saveProvisioningConfig(getProvisioningConfigFromFormValue(newSetting));
132
+ formValue.value = newSetting;
133
+ sendTrackingEventForUserProvisioning(newSetting);
134
+ };
135
+ const shouldPromptUserToConfirmUserRoleProvisioningChange = ({ currentLoginEnabled, loginEnabledFormValue }) => {
136
+ const isLoginEnabledChanged = currentLoginEnabled !== loginEnabledFormValue;
137
+ const isEnablingSsoLogin = isLoginEnabledChanged && !currentLoginEnabled;
138
+ const isDisablingSsoLogin = isLoginEnabledChanged && currentLoginEnabled;
139
+ const isEnablingSsoAlongSideProvisioning = isEnablingSsoLogin && formValue.value !== "disabled";
140
+ const isChangingProvisioningSettingWhileLoginWasAlreadyEnabled = isUserRoleProvisioningChanged.value && currentLoginEnabled && !isDisablingSsoLogin;
141
+ return isEnablingSsoAlongSideProvisioning || isChangingProvisioningSettingWhileLoginWasAlreadyEnabled;
142
+ };
143
+ const initFormValue = () => {
144
+ provisioningStore.getProvisioningConfig().then(() => {
145
+ formValue.value = getUserRoleProvisioningValueFromConfig(provisioningStore.provisioningConfig);
146
+ });
147
+ };
148
+ initFormValue();
149
+ return {
150
+ formValue,
151
+ isUserRoleProvisioningChanged,
152
+ saveProvisioningConfig,
153
+ shouldPromptUserToConfirmUserRoleProvisioningChange
154
+ };
155
+ }
156
+ async function fetchUsers(context) {
157
+ const allUsers = [];
158
+ const fieldsNeededForAccessSettingExport = {
159
+ select: ["email", "role"],
160
+ expand: ["projectRelations"]
161
+ };
162
+ const PAGE_SIZE = 50;
163
+ let currentPage = 0;
164
+ let totalCount = 0;
165
+ let hasMorePages = true;
166
+ while (hasMorePages) {
167
+ const response = await getUsers(context, {
168
+ ...fieldsNeededForAccessSettingExport,
169
+ sortBy: ["email:desc"],
170
+ take: PAGE_SIZE,
171
+ skip: currentPage * PAGE_SIZE
172
+ });
173
+ if (currentPage === 0) totalCount = response.count;
174
+ allUsers.push(...response.items);
175
+ hasMorePages = response.items.length === PAGE_SIZE && allUsers.length < totalCount;
176
+ currentPage++;
177
+ }
178
+ return {
179
+ count: totalCount,
180
+ items: allUsers
181
+ };
182
+ }
183
+ function useAccessSettingsCsvExport() {
184
+ const cachedUserData = ref();
185
+ const pendingUserDataRequest = ref();
186
+ const rootStore = useRootStore();
187
+ const formatDateForFilename = () => {
188
+ const now = /* @__PURE__ */ new Date();
189
+ return `${now.getDate()}_${now.getMonth() + 1}_${now.getFullYear()}_${now.getHours()}_${now.getMinutes()}`;
190
+ };
191
+ const escapeCsvValue = (value) => {
192
+ if (value.includes(",") || value.includes("\"")) return `"${value.replace(/"/g, "\"\"")}"`;
193
+ return value;
194
+ };
195
+ const downloadCsv = (csvContent, filename) => {
196
+ const blob = new Blob([csvContent], { type: "text/csv;charset=utf-8;" });
197
+ const url = URL.createObjectURL(blob);
198
+ const tempElement = document.createElement("a");
199
+ tempElement.setAttribute("href", url);
200
+ tempElement.setAttribute("download", filename);
201
+ tempElement.style.display = "none";
202
+ document.body.appendChild(tempElement);
203
+ tempElement.click();
204
+ document.body.removeChild(tempElement);
205
+ URL.revokeObjectURL(url);
206
+ };
207
+ const getUserData = async () => {
208
+ if (cachedUserData.value) return cachedUserData.value;
209
+ if (pendingUserDataRequest.value) return await pendingUserDataRequest.value;
210
+ const userDataRequest = fetchUsers(rootStore.restApiContext).then((userData) => {
211
+ cachedUserData.value = userData;
212
+ pendingUserDataRequest.value = void 0;
213
+ return userData;
214
+ }).catch((error) => {
215
+ pendingUserDataRequest.value = void 0;
216
+ throw error;
217
+ });
218
+ pendingUserDataRequest.value = userDataRequest;
219
+ return await userDataRequest;
220
+ };
221
+ const hasDownloadedProjectRoleCsv = ref(false);
222
+ const downloadProjectRolesCsv = async () => {
223
+ const userData = await getUserData();
224
+ const csvRows = ["email,project_displayname,project_id,project_role"];
225
+ for (const user of userData.items) {
226
+ const email = escapeCsvValue(user.email ?? "");
227
+ if (user.projectRelations && user.projectRelations.length > 0) for (const project of user.projectRelations) {
228
+ const projectName = escapeCsvValue(project.name ?? "");
229
+ const projectId = escapeCsvValue(project.id ?? "");
230
+ const projectRole = escapeCsvValue(project.role.split(":")[1] ?? project.role);
231
+ csvRows.push(`${email},${projectName},${projectId},${projectRole}`);
232
+ }
233
+ }
234
+ downloadCsv(csvRows.join("\n"), `n8n_project_role_export_${formatDateForFilename()}.csv`);
235
+ hasDownloadedProjectRoleCsv.value = true;
236
+ };
237
+ const hasDownloadedInstanceRoleCsv = ref(false);
238
+ const downloadInstanceRolesCsv = async () => {
239
+ const userData = await getUserData();
240
+ const csvRows = ["email,instance_role"];
241
+ for (const user of userData.items) {
242
+ const email = escapeCsvValue(user.email ?? "");
243
+ const instanceRole = escapeCsvValue(user.role ?? "");
244
+ csvRows.push(`${email},${instanceRole}`);
245
+ }
246
+ downloadCsv(csvRows.join("\n"), `n8n_instance_role_export_${formatDateForFilename()}.csv`);
247
+ hasDownloadedInstanceRoleCsv.value = true;
248
+ };
249
+ const accessSettingsCsvExportOnModalClose = () => {
250
+ hasDownloadedInstanceRoleCsv.value = false;
251
+ hasDownloadedProjectRoleCsv.value = false;
252
+ cachedUserData.value = void 0;
253
+ pendingUserDataRequest.value = void 0;
254
+ };
255
+ return {
256
+ downloadProjectRolesCsv,
257
+ downloadInstanceRolesCsv,
258
+ hasDownloadedInstanceRoleCsv,
259
+ hasDownloadedProjectRoleCsv,
260
+ accessSettingsCsvExportOnModalClose
261
+ };
262
+ }
263
+ var _hoisted_1$2 = { class: "mb-s" };
264
+ var _hoisted_2$2 = { class: "mb-s" };
265
+ var _hoisted_3$2 = ["href"];
266
+ var _hoisted_4$1 = { class: "mb-s" };
267
+ var _hoisted_5 = { key: 0 };
268
+ var _hoisted_6 = { class: "mb-s" };
269
+ var _hoisted_7 = { class: "mb-s" };
270
+ var _hoisted_8 = ["href"];
271
+ var _hoisted_9 = { class: "mb-s" };
272
+ var ConfirmProvisioningDialog_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
273
+ __name: "ConfirmProvisioningDialog",
274
+ props: /* @__PURE__ */ mergeModels({
275
+ newProvisioningSetting: {},
276
+ authProtocol: {}
277
+ }, {
278
+ "modelValue": { type: Boolean },
279
+ "modelModifiers": {}
280
+ }),
281
+ emits: /* @__PURE__ */ mergeModels(["confirmProvisioning", "cancel"], ["update:modelValue"]),
282
+ setup(__props, { emit: __emit }) {
283
+ const visible = useModel(__props, "modelValue");
284
+ const props = __props;
285
+ const emit = __emit;
286
+ const locale = useI18n();
287
+ const downloadingInstanceRolesCsv = ref(false);
288
+ const downloadingProjectRolesCsv = ref(false);
289
+ const loading = ref(false);
290
+ const confirmationChecked = ref(false);
291
+ const { hasDownloadedInstanceRoleCsv, hasDownloadedProjectRoleCsv, downloadProjectRolesCsv, downloadInstanceRolesCsv, accessSettingsCsvExportOnModalClose } = useAccessSettingsCsvExport();
292
+ const isDisablingProvisioning = computed(() => props.newProvisioningSetting === "disabled");
293
+ const messagingKey = computed(() => isDisablingProvisioning.value ? "disable" : "enable");
294
+ const shouldShowProjectRolesCsv = computed(() => props.newProvisioningSetting === "instance_and_project_roles");
295
+ watch(visible, () => {
296
+ loading.value = false;
297
+ confirmationChecked.value = false;
298
+ accessSettingsCsvExportOnModalClose();
299
+ });
300
+ const onDownloadInstanceRolesCsv = async () => {
301
+ downloadingInstanceRolesCsv.value = true;
302
+ try {
303
+ await downloadInstanceRolesCsv();
304
+ } finally {
305
+ downloadingInstanceRolesCsv.value = false;
306
+ }
307
+ };
308
+ const onDownloadProjectRolesCsv = async () => {
309
+ downloadingProjectRolesCsv.value = true;
310
+ try {
311
+ await downloadProjectRolesCsv();
312
+ } finally {
313
+ downloadingProjectRolesCsv.value = false;
314
+ }
315
+ };
316
+ const onConfirmProvisioningSetting = () => {
317
+ loading.value = true;
318
+ emit("confirmProvisioning");
319
+ };
320
+ return (_ctx, _cache) => {
321
+ const _directive_n8n_html = resolveDirective("n8n-html");
322
+ return openBlock(), createBlock(unref(ElDialog), {
323
+ modelValue: visible.value,
324
+ "onUpdate:modelValue": _cache[2] || (_cache[2] = ($event) => visible.value = $event),
325
+ title: unref(locale).baseText(`settings.provisioningConfirmDialog.${messagingKey.value}.title`),
326
+ width: "650"
327
+ }, {
328
+ footer: withCtx(() => [createVNode(unref(N8nButton_default), {
329
+ type: "tertiary",
330
+ "native-type": "button",
331
+ "data-test-id": "provisioning-cancel-button",
332
+ onClick: _cache[1] || (_cache[1] = ($event) => emit("cancel"))
333
+ }, {
334
+ default: withCtx(() => [createTextVNode(toDisplayString(unref(locale).baseText("settings.provisioningConfirmDialog.button.cancel")), 1)]),
335
+ _: 1
336
+ }), createVNode(unref(N8nButton_default), {
337
+ type: "primary",
338
+ "native-type": "button",
339
+ disabled: loading.value || !confirmationChecked.value || !isDisablingProvisioning.value && !unref(hasDownloadedInstanceRoleCsv) || shouldShowProjectRolesCsv.value && !unref(hasDownloadedProjectRoleCsv),
340
+ "data-test-id": "provisioning-confirm-button",
341
+ onClick: onConfirmProvisioningSetting
342
+ }, {
343
+ default: withCtx(() => [createTextVNode(toDisplayString(unref(locale).baseText(`settings.provisioningConfirmDialog.button.${messagingKey.value}.confirm`)), 1)]),
344
+ _: 1
345
+ }, 8, ["disabled"])]),
346
+ default: withCtx(() => [!isDisablingProvisioning.value ? (openBlock(), createElementBlock(Fragment, { key: 0 }, [
347
+ createBaseVNode("div", _hoisted_1$2, [createVNode(unref(N8nText_default), { color: "text-base" }, {
348
+ default: withCtx(() => [createTextVNode(toDisplayString(unref(locale).baseText(_ctx.newProvisioningSetting === "instance_and_project_roles" ? "settings.provisioningConfirmDialog.breakingChangeDescription.firstSentence.partOne.withProjectRoles" : "settings.provisioningConfirmDialog.breakingChangeDescription.firstSentence.partOne")), 1)]),
349
+ _: 1
350
+ }), createVNode(unref(N8nText_default), {
351
+ class: normalizeClass(_ctx.$style.descriptionTextPartTwo),
352
+ color: "text-base"
353
+ }, {
354
+ default: withCtx(() => [createTextVNode(toDisplayString(unref(locale).baseText("settings.provisioningConfirmDialog.breakingChangeDescription.firstSentence.partTwo")), 1)]),
355
+ _: 1
356
+ }, 8, ["class"])]),
357
+ createBaseVNode("div", _hoisted_2$2, [createVNode(unref(N8nText_default), { color: "text-base" }, {
358
+ default: withCtx(() => [createBaseVNode("a", {
359
+ href: `https://docs.n8n.io/user-management/${_ctx.authProtocol}/setup/`,
360
+ target: "_blank"
361
+ }, toDisplayString(unref(locale).baseText("settings.provisioningConfirmDialog.link.docs")), 9, _hoisted_3$2)]),
362
+ _: 1
363
+ })]),
364
+ createBaseVNode("div", _hoisted_4$1, [withDirectives(createVNode(unref(N8nText_default), { color: "text-base" }, null, 512), [[_directive_n8n_html, unref(locale).baseText("settings.provisioningConfirmDialog.breakingChangeDescription.secondLine")]])]),
365
+ createBaseVNode("ul", { class: normalizeClass([_ctx.$style.list, "mb-s"]) }, [createBaseVNode("li", null, [createVNode(unref(N8nText_default), { color: "text-base" }, {
366
+ default: withCtx(() => [createTextVNode(toDisplayString(unref(locale).baseText("settings.provisioningConfirmDialog.button.downloadInstanceRolesCsv")), 1)]),
367
+ _: 1
368
+ }), !unref(hasDownloadedInstanceRoleCsv) ? (openBlock(), createBlock(unref(N8nButton_default), {
369
+ key: 0,
370
+ type: "highlight",
371
+ "native-type": "button",
372
+ icon: "file-download",
373
+ "data-test-id": "provisioning-download-instance-roles-csv-button",
374
+ disabled: downloadingInstanceRolesCsv.value,
375
+ loading: downloadingInstanceRolesCsv.value,
376
+ class: normalizeClass(_ctx.$style.button),
377
+ onClick: onDownloadInstanceRolesCsv
378
+ }, null, 8, [
379
+ "disabled",
380
+ "loading",
381
+ "class"
382
+ ])) : (openBlock(), createBlock(unref(N8nIcon_default), {
383
+ key: 1,
384
+ icon: "check",
385
+ color: "success",
386
+ class: normalizeClass(_ctx.$style.icon)
387
+ }, null, 8, ["class"]))]), shouldShowProjectRolesCsv.value ? (openBlock(), createElementBlock("li", _hoisted_5, [createVNode(unref(N8nText_default), { color: "text-base" }, {
388
+ default: withCtx(() => [createTextVNode(toDisplayString(unref(locale).baseText("settings.provisioningConfirmDialog.button.downloadProjectRolesCsv")), 1)]),
389
+ _: 1
390
+ }), !unref(hasDownloadedProjectRoleCsv) ? (openBlock(), createBlock(unref(N8nButton_default), {
391
+ key: 0,
392
+ type: "highlight",
393
+ "native-type": "button",
394
+ icon: "file-download",
395
+ "data-test-id": "provisioning-download-project-roles-csv-button",
396
+ disabled: downloadingProjectRolesCsv.value,
397
+ loading: downloadingProjectRolesCsv.value,
398
+ class: normalizeClass(_ctx.$style.button),
399
+ onClick: onDownloadProjectRolesCsv
400
+ }, null, 8, [
401
+ "disabled",
402
+ "loading",
403
+ "class"
404
+ ])) : (openBlock(), createBlock(unref(N8nIcon_default), {
405
+ key: 1,
406
+ icon: "check",
407
+ color: "success",
408
+ class: normalizeClass(_ctx.$style.icon)
409
+ }, null, 8, ["class"]))])) : createCommentVNode("", true)], 2)
410
+ ], 64)) : (openBlock(), createElementBlock(Fragment, { key: 1 }, [createBaseVNode("div", _hoisted_6, [createVNode(unref(N8nText_default), { color: "text-base" }, {
411
+ default: withCtx(() => [createTextVNode(toDisplayString(unref(locale).baseText("settings.provisioningConfirmDialog.disable.description")), 1)]),
412
+ _: 1
413
+ })]), createBaseVNode("div", _hoisted_7, [createVNode(unref(N8nText_default), { color: "text-base" }, {
414
+ default: withCtx(() => [createBaseVNode("a", {
415
+ href: `https://docs.n8n.io/user-management/${_ctx.authProtocol}/setup/`,
416
+ target: "_blank"
417
+ }, toDisplayString(unref(locale).baseText("settings.provisioningConfirmDialog.link.docs")), 9, _hoisted_8)]),
418
+ _: 1
419
+ })])], 64)), createBaseVNode("div", _hoisted_9, [createVNode(unref(N8nCard_default), { class: normalizeClass(_ctx.$style.card) }, {
420
+ default: withCtx(() => [createVNode(unref(N8nCheckbox_default), {
421
+ modelValue: confirmationChecked.value,
422
+ "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => confirmationChecked.value = $event),
423
+ disabled: !isDisablingProvisioning.value && (!unref(hasDownloadedInstanceRoleCsv) || shouldShowProjectRolesCsv.value && !unref(hasDownloadedProjectRoleCsv)),
424
+ "data-test-id": "provisioning-confirmation-checkbox"
425
+ }, {
426
+ default: withCtx(() => [createVNode(unref(N8nText_default), { color: "text-base" }, {
427
+ default: withCtx(() => [createTextVNode(toDisplayString(unref(locale).baseText(`settings.provisioningConfirmDialog.${messagingKey.value}.checkbox`)), 1)]),
428
+ _: 1
429
+ })]),
430
+ _: 1
431
+ }, 8, ["modelValue", "disabled"])]),
432
+ _: 1
433
+ }, 8, ["class"])])]),
434
+ _: 1
435
+ }, 8, ["modelValue", "title"]);
436
+ };
437
+ }
438
+ });
439
+ var ConfirmProvisioningDialog_vue_vue_type_style_index_0_lang_module_default = {
440
+ button: "_button_1l25a_124",
441
+ card: "_card_1l25a_128",
442
+ descriptionTextPartTwo: "_descriptionTextPartTwo_1l25a_132",
443
+ icon: "_icon_1l25a_136",
444
+ list: "_list_1l25a_141"
445
+ };
446
+ var ConfirmProvisioningDialog_default = /* @__PURE__ */ __plugin_vue_export_helper_default(ConfirmProvisioningDialog_vue_vue_type_script_setup_true_lang_default, [["__cssModules", { "$style": ConfirmProvisioningDialog_vue_vue_type_style_index_0_lang_module_default }]]);
447
+ var _hoisted_1$1 = { class: "mt-2xs mb-s" };
448
+ var _hoisted_2$1 = { key: 0 };
449
+ var _hoisted_3$1 = { key: 1 };
450
+ var SamlSettingsForm_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
451
+ __name: "SamlSettingsForm",
452
+ setup(__props) {
453
+ const i18n = useI18n();
454
+ const ssoStore = useSSOStore();
455
+ const telemetry = useTelemetry();
456
+ const toast = useToast();
457
+ const message = useMessage();
458
+ const savingForm = ref(false);
459
+ const redirectUrl = ref();
460
+ const samlLoginEnabled = ref(false);
461
+ const IdentityProviderSettingsType = {
462
+ URL: "url",
463
+ XML: "xml"
464
+ };
465
+ const ipsOptions = ref([{
466
+ label: i18n.baseText("settings.sso.settings.ips.options.url"),
467
+ value: IdentityProviderSettingsType.URL
468
+ }, {
469
+ label: i18n.baseText("settings.sso.settings.ips.options.xml"),
470
+ value: IdentityProviderSettingsType.XML
471
+ }]);
472
+ const ipsType = ref(IdentityProviderSettingsType.URL);
473
+ const metadataUrl = ref();
474
+ const metadata = ref();
475
+ const entityId = ref();
476
+ const showUserRoleProvisioningDialog = ref(false);
477
+ const { formValue: userRoleProvisioning, isUserRoleProvisioningChanged, saveProvisioningConfig, shouldPromptUserToConfirmUserRoleProvisioningChange } = useUserRoleProvisioningForm(SupportedProtocols.SAML);
478
+ async function loadSamlConfig() {
479
+ if (!ssoStore.isEnterpriseSamlEnabled) return;
480
+ try {
481
+ await getSamlConfig();
482
+ } catch (error) {
483
+ toast.showError(error, "error");
484
+ }
485
+ }
486
+ const getSamlConfig = async () => {
487
+ const config = await ssoStore.getSamlConfig();
488
+ entityId.value = config?.entityID;
489
+ redirectUrl.value = config?.returnUrl;
490
+ if (config?.metadataUrl) ipsType.value = IdentityProviderSettingsType.URL;
491
+ else if (config?.metadata) ipsType.value = IdentityProviderSettingsType.XML;
492
+ metadata.value = config?.metadata;
493
+ metadataUrl.value = config?.metadataUrl;
494
+ samlLoginEnabled.value = config.loginEnabled ?? false;
495
+ };
496
+ const isSaveEnabled = computed(() => {
497
+ if (savingForm.value) return false;
498
+ const isIdentityProviderChanged = () => {
499
+ if (ipsType.value === IdentityProviderSettingsType.URL) return !!metadataUrl.value && metadataUrl.value !== ssoStore.samlConfig?.metadataUrl;
500
+ else if (ipsType.value === IdentityProviderSettingsType.XML) return !!metadata.value && metadata.value !== ssoStore.samlConfig?.metadata;
501
+ return false;
502
+ };
503
+ const isSamlLoginEnabledChanged = ssoStore.isSamlLoginEnabled !== samlLoginEnabled.value;
504
+ return isUserRoleProvisioningChanged.value || isIdentityProviderChanged() || isSamlLoginEnabledChanged;
505
+ });
506
+ const isTestEnabled = computed(() => {
507
+ if (ipsType.value === IdentityProviderSettingsType.URL) return !!metadataUrl.value;
508
+ else if (ipsType.value === IdentityProviderSettingsType.XML) return !!metadata.value;
509
+ return false;
510
+ });
511
+ const sendTrackingEvent = (config) => {
512
+ if (!config) {
513
+ captureMessage("Single Sign-On SAML: telemtetry data undefined on submit", { level: "error" });
514
+ return;
515
+ }
516
+ const trackingMetadata = {
517
+ instance_id: useRootStore().instanceId,
518
+ authentication_method: SupportedProtocols.SAML,
519
+ identity_provider: config.metadataUrl ? "metadata" : "xml",
520
+ is_active: config.loginEnabled ?? false
521
+ };
522
+ telemetry.track("User updated single sign on settings", trackingMetadata);
523
+ };
524
+ const promptConfirmDisablingSamlLogin = async () => {
525
+ return await message.confirm(i18n.baseText("settings.sso.confirmMessage.beforeSaveForm.message", { interpolate: { protocol: "SAML" } }), i18n.baseText("settings.sso.confirmMessage.beforeSaveForm.headline", { interpolate: { protocol: "SAML" } }), {
526
+ cancelButtonText: i18n.baseText("settings.ldap.confirmMessage.beforeSaveForm.cancelButtonText"),
527
+ confirmButtonText: i18n.baseText("settings.ldap.confirmMessage.beforeSaveForm.confirmButtonText")
528
+ });
529
+ };
530
+ const prompTestSamlConnectionBeforeActivating = async () => {
531
+ const promptOpeningTestConnectionPage = await message.confirm(i18n.baseText("settings.sso.settings.save.testConnection.message"), i18n.baseText("settings.sso.settings.save.testConnection.title"), {
532
+ confirmButtonText: i18n.baseText("settings.sso.settings.save.testConnection.test"),
533
+ cancelButtonText: i18n.baseText("settings.sso.settings.save.activate.cancel")
534
+ });
535
+ if (promptOpeningTestConnectionPage === "confirm") {
536
+ await onTest();
537
+ return await message.confirm(i18n.baseText("settings.sso.settings.save.confirmTestConnection.message"), i18n.baseText("settings.sso.settings.save.confirmTestConnection.title"), {
538
+ confirmButtonText: i18n.baseText("settings.sso.settings.save.confirmTestConnection.confirm"),
539
+ cancelButtonText: i18n.baseText("settings.sso.settings.save.activate.cancel")
540
+ });
541
+ }
542
+ return promptOpeningTestConnectionPage;
543
+ };
544
+ const onSave = async (provisioningChangesConfirmed = false) => {
545
+ try {
546
+ savingForm.value = true;
547
+ validateSamlInput();
548
+ const isDisablingSamlLogin = samlLoginEnabled.value !== ssoStore.isSamlLoginEnabled && ssoStore.isSamlLoginEnabled === true;
549
+ if (isDisablingSamlLogin) {
550
+ if (await promptConfirmDisablingSamlLogin() !== "confirm") return;
551
+ }
552
+ if (!provisioningChangesConfirmed && shouldPromptUserToConfirmUserRoleProvisioningChange({
553
+ currentLoginEnabled: !!ssoStore.isSamlLoginEnabled,
554
+ loginEnabledFormValue: samlLoginEnabled.value
555
+ })) {
556
+ showUserRoleProvisioningDialog.value = true;
557
+ return;
558
+ }
559
+ showUserRoleProvisioningDialog.value = false;
560
+ const metaDataConfig = ipsType.value === IdentityProviderSettingsType.URL ? { metadataUrl: metadataUrl.value } : { metadata: metadata.value };
561
+ if (!ssoStore.isSamlLoginEnabled && samlLoginEnabled.value) {
562
+ await ssoStore.saveSamlConfig(metaDataConfig);
563
+ if (await prompTestSamlConnectionBeforeActivating() !== "confirm") return;
564
+ }
565
+ const configResponse = await ssoStore.saveSamlConfig({
566
+ ...metaDataConfig,
567
+ loginEnabled: samlLoginEnabled.value
568
+ });
569
+ await saveProvisioningConfig(isDisablingSamlLogin);
570
+ ssoStore.selectedAuthProtocol = SupportedProtocols.SAML;
571
+ await getSamlConfig();
572
+ sendTrackingEvent(configResponse);
573
+ } catch (error) {
574
+ toast.showError(error, i18n.baseText("settings.sso.settings.save.error"));
575
+ return;
576
+ } finally {
577
+ savingForm.value = false;
578
+ }
579
+ };
580
+ const onTest = async () => {
581
+ try {
582
+ const url = await ssoStore.testSamlConfig();
583
+ if (typeof window !== "undefined") window.open(url, "_blank");
584
+ } catch (error) {
585
+ toast.showError(error, "error");
586
+ }
587
+ };
588
+ const validateSamlInput = () => {
589
+ if (ipsType.value === IdentityProviderSettingsType.URL) try {
590
+ const parsedUrl = new URL(metadataUrl.value);
591
+ if (parsedUrl.protocol !== "https:" && parsedUrl.protocol !== "http:") throw new Error("The provided protocol is not supported");
592
+ } catch (error) {
593
+ throw new Error(i18n.baseText("settings.sso.settings.ips.url.invalid"));
594
+ }
595
+ };
596
+ onMounted(async () => {
597
+ await loadSamlConfig();
598
+ });
599
+ return (_ctx, _cache) => {
600
+ return openBlock(), createElementBlock("div", null, [
601
+ createBaseVNode("div", { class: normalizeClass(_ctx.$style.group) }, [
602
+ createBaseVNode("label", null, toDisplayString(unref(i18n).baseText("settings.sso.settings.redirectUrl.label")), 1),
603
+ createVNode(CopyInput_default, {
604
+ value: redirectUrl.value,
605
+ "copy-button-text": unref(i18n).baseText("generic.clickToCopy"),
606
+ "toast-title": unref(i18n).baseText("settings.sso.settings.redirectUrl.copied")
607
+ }, null, 8, [
608
+ "value",
609
+ "copy-button-text",
610
+ "toast-title"
611
+ ]),
612
+ createBaseVNode("small", null, toDisplayString(unref(i18n).baseText("settings.sso.settings.redirectUrl.help")), 1)
613
+ ], 2),
614
+ createBaseVNode("div", { class: normalizeClass(_ctx.$style.group) }, [
615
+ createBaseVNode("label", null, toDisplayString(unref(i18n).baseText("settings.sso.settings.entityId.label")), 1),
616
+ createVNode(CopyInput_default, {
617
+ value: entityId.value,
618
+ "copy-button-text": unref(i18n).baseText("generic.clickToCopy"),
619
+ "toast-title": unref(i18n).baseText("settings.sso.settings.entityId.copied")
620
+ }, null, 8, [
621
+ "value",
622
+ "copy-button-text",
623
+ "toast-title"
624
+ ]),
625
+ createBaseVNode("small", null, toDisplayString(unref(i18n).baseText("settings.sso.settings.entityId.help")), 1)
626
+ ], 2),
627
+ createBaseVNode("div", { class: normalizeClass(_ctx.$style.group) }, [
628
+ createBaseVNode("label", null, toDisplayString(unref(i18n).baseText("settings.sso.settings.ips.label")), 1),
629
+ createBaseVNode("div", _hoisted_1$1, [createVNode(unref(N8nRadioButtons_default), {
630
+ modelValue: ipsType.value,
631
+ "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => ipsType.value = $event),
632
+ options: ipsOptions.value
633
+ }, null, 8, ["modelValue", "options"])]),
634
+ ipsType.value === IdentityProviderSettingsType.URL ? (openBlock(), createElementBlock("div", _hoisted_2$1, [createVNode(unref(N8nInput_default), {
635
+ modelValue: metadataUrl.value,
636
+ "onUpdate:modelValue": _cache[1] || (_cache[1] = ($event) => metadataUrl.value = $event),
637
+ type: "text",
638
+ name: "metadataUrl",
639
+ size: "large",
640
+ placeholder: unref(i18n).baseText("settings.sso.settings.ips.url.placeholder"),
641
+ "data-test-id": "sso-provider-url"
642
+ }, null, 8, ["modelValue", "placeholder"]), createBaseVNode("small", null, toDisplayString(unref(i18n).baseText("settings.sso.settings.ips.url.help")), 1)])) : createCommentVNode("", true),
643
+ ipsType.value === IdentityProviderSettingsType.XML ? (openBlock(), createElementBlock("div", _hoisted_3$1, [createVNode(unref(N8nInput_default), {
644
+ modelValue: metadata.value,
645
+ "onUpdate:modelValue": _cache[2] || (_cache[2] = ($event) => metadata.value = $event),
646
+ type: "textarea",
647
+ name: "metadata",
648
+ rows: 4,
649
+ "data-test-id": "sso-provider-xml"
650
+ }, null, 8, ["modelValue"]), createBaseVNode("small", null, toDisplayString(unref(i18n).baseText("settings.sso.settings.ips.xml.help")), 1)])) : createCommentVNode("", true),
651
+ createVNode(UserRoleProvisioningDropdown_default, {
652
+ modelValue: unref(userRoleProvisioning),
653
+ "onUpdate:modelValue": _cache[3] || (_cache[3] = ($event) => isRef(userRoleProvisioning) ? userRoleProvisioning.value = $event : null),
654
+ "auth-protocol": "saml"
655
+ }, null, 8, ["modelValue"]),
656
+ createVNode(ConfirmProvisioningDialog_default, {
657
+ modelValue: showUserRoleProvisioningDialog.value,
658
+ "onUpdate:modelValue": _cache[4] || (_cache[4] = ($event) => showUserRoleProvisioningDialog.value = $event),
659
+ "new-provisioning-setting": unref(userRoleProvisioning),
660
+ "auth-protocol": "saml",
661
+ onConfirmProvisioning: _cache[5] || (_cache[5] = ($event) => onSave(true)),
662
+ onCancel: _cache[6] || (_cache[6] = ($event) => showUserRoleProvisioningDialog.value = false)
663
+ }, null, 8, ["modelValue", "new-provisioning-setting"]),
664
+ createBaseVNode("div", { class: normalizeClass([_ctx.$style.group, _ctx.$style.checkboxGroup]) }, [createVNode(unref(ElCheckbox), {
665
+ modelValue: samlLoginEnabled.value,
666
+ "onUpdate:modelValue": _cache[7] || (_cache[7] = ($event) => samlLoginEnabled.value = $event),
667
+ "data-test-id": "sso-toggle"
668
+ }, {
669
+ default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n).baseText("settings.sso.activated")), 1)]),
670
+ _: 1
671
+ }, 8, ["modelValue"])], 2)
672
+ ], 2),
673
+ createBaseVNode("div", { class: normalizeClass(_ctx.$style.buttons) }, [createVNode(unref(N8nButton_default), {
674
+ disabled: !isSaveEnabled.value,
675
+ loading: savingForm.value,
676
+ size: "large",
677
+ "data-test-id": "sso-save",
678
+ onClick: _cache[8] || (_cache[8] = ($event) => onSave(false))
679
+ }, {
680
+ default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n).baseText("settings.sso.settings.save")), 1)]),
681
+ _: 1
682
+ }, 8, ["disabled", "loading"]), createVNode(unref(N8nButton_default), {
683
+ disabled: !isTestEnabled.value,
684
+ size: "large",
685
+ type: "tertiary",
686
+ "data-test-id": "sso-test",
687
+ onClick: onTest
688
+ }, {
689
+ default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n).baseText("settings.sso.settings.test")), 1)]),
690
+ _: 1
691
+ }, 8, ["disabled"])], 2)
692
+ ]);
693
+ };
694
+ }
695
+ });
696
+ const buttons = "_buttons_1g1no_132";
697
+ const group = "_group_1g1no_141";
698
+ const checkboxGroup = "_checkboxGroup_1g1no_157";
699
+ const actionBox$1 = "_actionBox_1g1no_161";
700
+ const footer = "_footer_1g1no_165";
701
+ var sso_form_module_scss_vue_type_style_index_0_src_true_lang_module_default = {
702
+ "switch": "_switch_1g1no_126",
703
+ buttons,
704
+ group,
705
+ checkboxGroup,
706
+ actionBox: actionBox$1,
707
+ footer
708
+ };
709
+ var SamlSettingsForm_default = /* @__PURE__ */ __plugin_vue_export_helper_default(SamlSettingsForm_vue_vue_type_script_setup_true_lang_default, [["__cssModules", { "$style": sso_form_module_scss_vue_type_style_index_0_src_true_lang_module_default }]]);
710
+ var OidcSettingsForm_default = /* @__PURE__ */ __plugin_vue_export_helper_default(/* @__PURE__ */ defineComponent({
711
+ __name: "OidcSettingsForm",
712
+ setup(__props) {
713
+ const i18n = useI18n();
714
+ const ssoStore = useSSOStore();
715
+ const telemetry = useTelemetry();
716
+ const toast = useToast();
717
+ const message = useMessage();
718
+ const savingForm = ref(false);
719
+ const discoveryEndpoint = ref("");
720
+ const clientId = ref("");
721
+ const clientSecret = ref("");
722
+ const showUserRoleProvisioningDialog = ref(false);
723
+ const { formValue: userRoleProvisioning, isUserRoleProvisioningChanged, saveProvisioningConfig, shouldPromptUserToConfirmUserRoleProvisioningChange } = useUserRoleProvisioningForm(SupportedProtocols.OIDC);
724
+ const prompt = ref("select_account");
725
+ const handlePromptChange = (value) => {
726
+ prompt.value = value;
727
+ };
728
+ const promptDescriptions = [
729
+ {
730
+ label: i18n.baseText("settings.sso.settings.oidc.prompt.login"),
731
+ value: "login"
732
+ },
733
+ {
734
+ label: i18n.baseText("settings.sso.settings.oidc.prompt.none"),
735
+ value: "none"
736
+ },
737
+ {
738
+ label: i18n.baseText("settings.sso.settings.oidc.prompt.consent"),
739
+ value: "consent"
740
+ },
741
+ {
742
+ label: i18n.baseText("settings.sso.settings.oidc.prompt.select_account"),
743
+ value: "select_account"
744
+ },
745
+ {
746
+ label: i18n.baseText("settings.sso.settings.oidc.prompt.create"),
747
+ value: "create"
748
+ }
749
+ ];
750
+ const authenticationContextClassReference = ref("");
751
+ const getOidcConfig = async () => {
752
+ const config = await ssoStore.getOidcConfig();
753
+ clientId.value = config.clientId;
754
+ clientSecret.value = config.clientSecret;
755
+ discoveryEndpoint.value = config.discoveryEndpoint;
756
+ prompt.value = config.prompt ?? "select_account";
757
+ authenticationContextClassReference.value = config.authenticationContextClassReference?.join(",") || "";
758
+ };
759
+ const loadOidcConfig = async () => {
760
+ if (!ssoStore.isEnterpriseOidcEnabled) return;
761
+ try {
762
+ await getOidcConfig();
763
+ } catch (error) {
764
+ toast.showError(error, "error");
765
+ }
766
+ };
767
+ const cannotSaveOidcSettings = computed(() => {
768
+ const currentAcrString = authenticationContextClassReference.value.split(",").map((s) => s.trim()).filter(Boolean).join(",");
769
+ const storedAcrString = ssoStore.oidcConfig?.authenticationContextClassReference?.join(",") || "";
770
+ return ssoStore.oidcConfig?.clientId === clientId.value && ssoStore.oidcConfig?.clientSecret === clientSecret.value && ssoStore.oidcConfig?.discoveryEndpoint === discoveryEndpoint.value && ssoStore.oidcConfig?.loginEnabled === ssoStore.isOidcLoginEnabled && ssoStore.oidcConfig?.prompt === prompt.value && !isUserRoleProvisioningChanged.value && storedAcrString === authenticationContextClassReference.value && currentAcrString === storedAcrString;
771
+ });
772
+ async function onOidcSettingsSave(provisioningChangesConfirmed = false) {
773
+ if (!provisioningChangesConfirmed && shouldPromptUserToConfirmUserRoleProvisioningChange({
774
+ currentLoginEnabled: !!ssoStore.oidcConfig?.loginEnabled,
775
+ loginEnabledFormValue: ssoStore.isOidcLoginEnabled
776
+ })) {
777
+ showUserRoleProvisioningDialog.value = true;
778
+ return;
779
+ }
780
+ const isDisablingOidcLogin = ssoStore.oidcConfig?.loginEnabled !== ssoStore.isOidcLoginEnabled && ssoStore.oidcConfig?.loginEnabled === true;
781
+ if (isDisablingOidcLogin) {
782
+ if (await message.confirm(i18n.baseText("settings.sso.confirmMessage.beforeSaveForm.message", { interpolate: { protocol: "OIDC" } }), i18n.baseText("settings.sso.confirmMessage.beforeSaveForm.headline", { interpolate: { protocol: "OIDC" } }), {
783
+ cancelButtonText: i18n.baseText("settings.ldap.confirmMessage.beforeSaveForm.cancelButtonText"),
784
+ confirmButtonText: i18n.baseText("settings.ldap.confirmMessage.beforeSaveForm.confirmButtonText")
785
+ }) !== "confirm") return;
786
+ }
787
+ const acrArray = authenticationContextClassReference.value.split(",").map((s) => s.trim()).filter(Boolean);
788
+ try {
789
+ savingForm.value = true;
790
+ const newConfig = await ssoStore.saveOidcConfig({
791
+ clientId: clientId.value,
792
+ clientSecret: clientSecret.value,
793
+ discoveryEndpoint: discoveryEndpoint.value,
794
+ prompt: prompt.value,
795
+ loginEnabled: ssoStore.isOidcLoginEnabled,
796
+ authenticationContextClassReference: acrArray
797
+ });
798
+ await saveProvisioningConfig(isDisablingOidcLogin);
799
+ showUserRoleProvisioningDialog.value = false;
800
+ ssoStore.selectedAuthProtocol = SupportedProtocols.OIDC;
801
+ clientSecret.value = newConfig.clientSecret;
802
+ sendTrackingEvent(newConfig);
803
+ } catch (error) {
804
+ toast.showError(error, i18n.baseText("settings.sso.settings.save.error_oidc"));
805
+ return;
806
+ } finally {
807
+ savingForm.value = false;
808
+ await getOidcConfig();
809
+ }
810
+ }
811
+ function sendTrackingEvent(config) {
812
+ const trackingMetadata = {
813
+ instance_id: useRootStore().instanceId,
814
+ authentication_method: SupportedProtocols.OIDC,
815
+ discovery_endpoint: config.discoveryEndpoint,
816
+ is_active: config.loginEnabled
817
+ };
818
+ telemetry.track("User updated single sign on settings", trackingMetadata);
819
+ }
820
+ onMounted(async () => {
821
+ await loadOidcConfig();
822
+ });
823
+ return (_ctx, _cache) => {
824
+ return openBlock(), createElementBlock("div", null, [
825
+ createBaseVNode("div", { class: normalizeClass(_ctx.$style.group) }, [
826
+ _cache[10] || (_cache[10] = createBaseVNode("label", null, "Redirect URL", -1)),
827
+ createVNode(CopyInput_default, {
828
+ value: unref(ssoStore).oidc.callbackUrl,
829
+ "copy-button-text": unref(i18n).baseText("generic.clickToCopy"),
830
+ "toast-title": "Redirect URL copied to clipboard"
831
+ }, null, 8, ["value", "copy-button-text"]),
832
+ _cache[11] || (_cache[11] = createBaseVNode("small", null, "Copy the Redirect URL to configure your OIDC provider ", -1))
833
+ ], 2),
834
+ createBaseVNode("div", { class: normalizeClass(_ctx.$style.group) }, [
835
+ _cache[12] || (_cache[12] = createBaseVNode("label", null, "Discovery Endpoint", -1)),
836
+ createVNode(unref(N8nInput_default), {
837
+ "model-value": discoveryEndpoint.value,
838
+ type: "text",
839
+ "data-test-id": "oidc-discovery-endpoint",
840
+ placeholder: "https://accounts.google.com/.well-known/openid-configuration",
841
+ "onUpdate:modelValue": _cache[0] || (_cache[0] = (v) => discoveryEndpoint.value = v)
842
+ }, null, 8, ["model-value"]),
843
+ _cache[13] || (_cache[13] = createBaseVNode("small", null, "Paste here your discovery endpoint", -1))
844
+ ], 2),
845
+ createBaseVNode("div", { class: normalizeClass(_ctx.$style.group) }, [
846
+ _cache[14] || (_cache[14] = createBaseVNode("label", null, "Client ID", -1)),
847
+ createVNode(unref(N8nInput_default), {
848
+ "model-value": clientId.value,
849
+ type: "text",
850
+ "data-test-id": "oidc-client-id",
851
+ "onUpdate:modelValue": _cache[1] || (_cache[1] = (v) => clientId.value = v)
852
+ }, null, 8, ["model-value"]),
853
+ _cache[15] || (_cache[15] = createBaseVNode("small", null, "The client ID you received when registering your application with your provider", -1))
854
+ ], 2),
855
+ createBaseVNode("div", { class: normalizeClass(_ctx.$style.group) }, [
856
+ _cache[16] || (_cache[16] = createBaseVNode("label", null, "Client Secret", -1)),
857
+ createVNode(unref(N8nInput_default), {
858
+ "model-value": clientSecret.value,
859
+ type: "password",
860
+ "data-test-id": "oidc-client-secret",
861
+ "onUpdate:modelValue": _cache[2] || (_cache[2] = (v) => clientSecret.value = v)
862
+ }, null, 8, ["model-value"]),
863
+ _cache[17] || (_cache[17] = createBaseVNode("small", null, "The client Secret you received when registering your application with your provider", -1))
864
+ ], 2),
865
+ createBaseVNode("div", { class: normalizeClass(_ctx.$style.group) }, [
866
+ _cache[18] || (_cache[18] = createBaseVNode("label", null, "Prompt", -1)),
867
+ createVNode(unref(N8nSelect_default), {
868
+ "model-value": prompt.value,
869
+ "data-test-id": "oidc-prompt",
870
+ "onUpdate:modelValue": handlePromptChange
871
+ }, {
872
+ default: withCtx(() => [(openBlock(), createElementBlock(Fragment, null, renderList(promptDescriptions, (option) => {
873
+ return createVNode(unref(N8nOption_default), {
874
+ key: option.value,
875
+ label: option.label,
876
+ "data-test-id": "oidc-prompt-filter-option",
877
+ value: option.value
878
+ }, null, 8, ["label", "value"]);
879
+ }), 64))]),
880
+ _: 1
881
+ }, 8, ["model-value"]),
882
+ _cache[19] || (_cache[19] = createBaseVNode("small", null, "The prompt parameter to use when authenticating with the OIDC provider", -1))
883
+ ], 2),
884
+ createVNode(UserRoleProvisioningDropdown_default, {
885
+ modelValue: unref(userRoleProvisioning),
886
+ "onUpdate:modelValue": _cache[3] || (_cache[3] = ($event) => isRef(userRoleProvisioning) ? userRoleProvisioning.value = $event : null),
887
+ "auth-protocol": "oidc"
888
+ }, null, 8, ["modelValue"]),
889
+ createVNode(ConfirmProvisioningDialog_default, {
890
+ modelValue: showUserRoleProvisioningDialog.value,
891
+ "onUpdate:modelValue": _cache[4] || (_cache[4] = ($event) => showUserRoleProvisioningDialog.value = $event),
892
+ "new-provisioning-setting": unref(userRoleProvisioning),
893
+ "auth-protocol": "oidc",
894
+ onConfirmProvisioning: _cache[5] || (_cache[5] = ($event) => onOidcSettingsSave(true)),
895
+ onCancel: _cache[6] || (_cache[6] = ($event) => showUserRoleProvisioningDialog.value = false)
896
+ }, null, 8, ["modelValue", "new-provisioning-setting"]),
897
+ createBaseVNode("div", { class: normalizeClass(_ctx.$style.group) }, [
898
+ _cache[20] || (_cache[20] = createBaseVNode("label", null, "Authentication Context Class Reference", -1)),
899
+ createVNode(unref(N8nInput_default), {
900
+ "model-value": authenticationContextClassReference.value,
901
+ type: "textarea",
902
+ "data-test-id": "oidc-authentication-context-class-reference",
903
+ placeholder: "mfa, phrh, pwd",
904
+ "onUpdate:modelValue": _cache[7] || (_cache[7] = (v) => authenticationContextClassReference.value = v)
905
+ }, null, 8, ["model-value"]),
906
+ _cache[21] || (_cache[21] = createBaseVNode("small", null, "ACR values to include in the authorization request (acr_values parameter), separated by commas in order of preference.", -1))
907
+ ], 2),
908
+ createBaseVNode("div", { class: normalizeClass([_ctx.$style.group, _ctx.$style.checkboxGroup]) }, [createVNode(unref(ElCheckbox), {
909
+ modelValue: unref(ssoStore).isOidcLoginEnabled,
910
+ "onUpdate:modelValue": _cache[8] || (_cache[8] = ($event) => unref(ssoStore).isOidcLoginEnabled = $event),
911
+ "data-test-id": "sso-oidc-toggle"
912
+ }, {
913
+ default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n).baseText("settings.sso.activated")), 1)]),
914
+ _: 1
915
+ }, 8, ["modelValue"])], 2),
916
+ createBaseVNode("div", { class: normalizeClass(_ctx.$style.buttons) }, [createVNode(unref(N8nButton_default), {
917
+ "data-test-id": "sso-oidc-save",
918
+ size: "large",
919
+ loading: savingForm.value,
920
+ disabled: savingForm.value || cannotSaveOidcSettings.value,
921
+ onClick: _cache[9] || (_cache[9] = ($event) => onOidcSettingsSave(false))
922
+ }, {
923
+ default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n).baseText("settings.sso.settings.save")), 1)]),
924
+ _: 1
925
+ }, 8, ["loading", "disabled"])], 2)
926
+ ]);
927
+ };
928
+ }
929
+ }), [["__cssModules", { "$style": sso_form_module_scss_vue_type_style_index_0_src_true_lang_module_default }]]);
930
+ var _hoisted_1 = { class: "pb-2xl" };
931
+ var _hoisted_2 = {
932
+ href: "https://docs.n8n.io/user-management/saml/",
933
+ target: "_blank"
934
+ };
935
+ var _hoisted_3 = {
936
+ key: 1,
937
+ "data-test-id": "sso-content-licensed"
938
+ };
939
+ var _hoisted_4 = {
940
+ key: 2,
941
+ "data-test-id": "sso-content-licensed"
942
+ };
943
+ var SettingsSso_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
944
+ __name: "SettingsSso",
945
+ setup(__props) {
946
+ const i18n = useI18n();
947
+ const ssoStore = useSSOStore();
948
+ const documentTitle = useDocumentTitle();
949
+ const pageRedirectionHelper = usePageRedirectionHelper();
950
+ const options = computed(() => {
951
+ return [{
952
+ label: SupportedProtocols.SAML.toUpperCase(),
953
+ value: SupportedProtocols.SAML
954
+ }, {
955
+ label: ssoStore.isEnterpriseOidcEnabled ? SupportedProtocols.OIDC.toUpperCase() : `${SupportedProtocols.OIDC.toUpperCase()} (${i18n.baseText("generic.upgradeToEnterprise")})`,
956
+ value: SupportedProtocols.OIDC
957
+ }];
958
+ });
959
+ const hasAnySsoEnabled = computed(() => ssoStore.isEnterpriseSamlEnabled || ssoStore.isEnterpriseOidcEnabled);
960
+ const authProtocol = ref(SupportedProtocols.SAML);
961
+ function onAuthProtocolUpdated(value) {
962
+ authProtocol.value = value;
963
+ }
964
+ const goToUpgrade = () => {
965
+ pageRedirectionHelper.goToUpgrade("sso", "upgrade-sso");
966
+ };
967
+ onMounted(() => {
968
+ documentTitle.set(i18n.baseText("settings.sso.title"));
969
+ ssoStore.initializeSelectedProtocol();
970
+ authProtocol.value = ssoStore.selectedAuthProtocol || SupportedProtocols.SAML;
971
+ });
972
+ return (_ctx, _cache) => {
973
+ return openBlock(), createElementBlock("div", _hoisted_1, [
974
+ createBaseVNode("div", { class: normalizeClass(_ctx.$style.heading) }, [createVNode(unref(N8nHeading_default), { size: "2xlarge" }, {
975
+ default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n).baseText("settings.sso.title")), 1)]),
976
+ _: 1
977
+ })], 2),
978
+ createVNode(unref(N8nInfoTip_default), null, {
979
+ default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n).baseText("settings.sso.info")) + " ", 1), createBaseVNode("a", _hoisted_2, toDisplayString(unref(i18n).baseText("settings.sso.info.link")), 1)]),
980
+ _: 1
981
+ }),
982
+ hasAnySsoEnabled.value ? (openBlock(), createElementBlock("div", {
983
+ key: 0,
984
+ "data-test-id": "sso-auth-protocol-select",
985
+ class: normalizeClass(_ctx.shared.group)
986
+ }, [_cache[1] || (_cache[1] = createBaseVNode("label", null, "Select Authentication Protocol", -1)), createBaseVNode("div", null, [createVNode(unref(N8nSelect_default), {
987
+ filterable: "",
988
+ "model-value": authProtocol.value,
989
+ placeholder: unref(i18n).baseText("parameterInput.select"),
990
+ "onUpdate:modelValue": onAuthProtocolUpdated,
991
+ onKeydown: _cache[0] || (_cache[0] = withModifiers(() => {}, ["stop"]))
992
+ }, {
993
+ default: withCtx(() => [(openBlock(true), createElementBlock(Fragment, null, renderList(options.value, ({ label, value }) => {
994
+ return openBlock(), createBlock(unref(N8nOption_default), {
995
+ key: value,
996
+ value,
997
+ label,
998
+ "data-test-id": "credential-select-option"
999
+ }, null, 8, ["value", "label"]);
1000
+ }), 128))]),
1001
+ _: 1
1002
+ }, 8, ["model-value", "placeholder"])])], 2)) : createCommentVNode("", true),
1003
+ unref(ssoStore).isEnterpriseSamlEnabled && authProtocol.value === unref(SupportedProtocols).SAML ? (openBlock(), createElementBlock("div", _hoisted_3, [createVNode(SamlSettingsForm_default)])) : createCommentVNode("", true),
1004
+ unref(ssoStore).isEnterpriseOidcEnabled && authProtocol.value === unref(SupportedProtocols).OIDC ? (openBlock(), createElementBlock("div", _hoisted_4, [createVNode(OidcSettingsForm_default)])) : createCommentVNode("", true),
1005
+ !hasAnySsoEnabled.value ? (openBlock(), createBlock(unref(N8nActionBox_default), {
1006
+ key: 3,
1007
+ "data-test-id": "sso-content-unlicensed",
1008
+ class: normalizeClass(_ctx.$style.actionBox),
1009
+ description: unref(i18n).baseText("settings.sso.actionBox.description"),
1010
+ "button-text": unref(i18n).baseText("settings.sso.actionBox.buttonText"),
1011
+ "onClick:button": goToUpgrade
1012
+ }, {
1013
+ heading: withCtx(() => [createBaseVNode("span", null, toDisplayString(unref(i18n).baseText("settings.sso.actionBox.title")), 1)]),
1014
+ _: 1
1015
+ }, 8, [
1016
+ "class",
1017
+ "description",
1018
+ "button-text"
1019
+ ])) : createCommentVNode("", true)
1020
+ ]);
1021
+ };
1022
+ }
1023
+ });
1024
+ var SettingsSso_vue_vue_type_style_index_1_lang_module_default = {
1025
+ heading: "_heading_86duv_123",
1026
+ actionBox: "_actionBox_86duv_127"
1027
+ };
1028
+ var SettingsSso_default = /* @__PURE__ */ __plugin_vue_export_helper_default(SettingsSso_vue_vue_type_script_setup_true_lang_default, [["__cssModules", {
1029
+ "shared": sso_form_module_scss_vue_type_style_index_0_src_true_lang_module_default,
1030
+ "$style": SettingsSso_vue_vue_type_style_index_1_lang_module_default
1031
+ }]]);
1032
+ export { SettingsSso_default as default };