@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,966 @@
1
+ import { C as computed, Cn as toDisplayString, D as createElementBlock, E as createCommentVNode, G as nextTick, Gt as unref, I as guardReactiveProps, It as ref, M as createVNode, P as defineComponent, T as createBlock, U as mergeModels, Z as onMounted, _t as watch, bt as withCtx, et as openBlock, ft as useModel, h as withModifiers, j as createTextVNode, q as onBeforeMount, vn as normalizeClass, w as createBaseVNode, yn as normalizeProps } from "./vue.runtime.esm-bundler-tP5dCd7J.js";
2
+ import { W as useDebounceFn, it as I18nT, rt as useI18n } from "./core-CRbPymLT.js";
3
+ import { $ as N8nInputLabel_default, Cn as N8nIcon_default, W as N8nFormInput_default, bn as N8nText_default, f as N8nIconPicker_default, g as N8nUserInfo_default, it as N8nActionToggle_default, m as N8nUserSelect_default, ot as N8nActionDropdown_default, u as N8nDataTableServer_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 { Er as useUsersStore, Nr as isProjectRole, Xn as useDocumentTitle, Zn as useProjectsStore, k as useTelemetry, m as useCloudPlanStore, y as useToast } from "./builder.store-Czk2ipDE.js";
9
+ import "./empty-BuGRxzl4.js";
10
+ import { t as ElRadio } from "./radio-CSce3UT0.js";
11
+ import { t as ElDialog } from "./dialog-lMho1TD8.js";
12
+ import { v as useRouter } from "./get-BcEmeOxn.js";
13
+ import "./sanitize-html-CbW56HUN.js";
14
+ import "./CalendarDate-DgQUMbNo.js";
15
+ import { t as Alert_default } from "./Alert-Dy86dyOr.js";
16
+ import "./path-browserify-RUt2u7iT.js";
17
+ import "./_MapCache-CcdIl4Ae.js";
18
+ import { Ro as VIEWS, wa as deepCopy } from "./constants-C8OH4tTq.js";
19
+ import "./merge-DhuTk1HM.js";
20
+ import "./_baseOrderBy-N8Be_6z6.js";
21
+ import "./dateformat-hG8NERse.js";
22
+ import "./useDebounce-Br5_1ug-.js";
23
+ import "./folders.store-yAFj-5Vl.js";
24
+ import "./versions.store-B1z2OrLE.js";
25
+ import { t as usePageRedirectionHelper } from "./usePageRedirectionHelper-DjkznpX6.js";
26
+ import { n as isIconOrEmoji } from "./ProjectIcon-DY8gGuHX.js";
27
+ import "./orderBy-Cu9F9DU_.js";
28
+ import { t as ProjectSharing_default } from "./ProjectSharing-CVUgNWAY.js";
29
+ import { t as useRolesStore } from "./roles.store-CRf_zJTb.js";
30
+ import "./readyToRun.store-YEMvPUqo.js";
31
+ import { t as ProjectHeader_default } from "./ProjectHeader-Dq5Ihb26.js";
32
+ import { t as useUserRoleProvisioningStore } from "./userRoleProvisioning.store-kkSIdeTo.js";
33
+ var _hoisted_1$4 = { key: 1 };
34
+ var _hoisted_2$1 = { class: "pt-l" };
35
+ var ProjectDeleteDialog_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
36
+ __name: "ProjectDeleteDialog",
37
+ props: /* @__PURE__ */ mergeModels({
38
+ currentProject: {},
39
+ projects: {},
40
+ resourceCounts: {}
41
+ }, {
42
+ "modelValue": { type: Boolean },
43
+ "modelModifiers": {}
44
+ }),
45
+ emits: /* @__PURE__ */ mergeModels(["confirmDelete"], ["update:modelValue"]),
46
+ setup(__props, { emit: __emit }) {
47
+ const props = __props;
48
+ const visible = useModel(__props, "modelValue");
49
+ const emit = __emit;
50
+ const locale = useI18n();
51
+ const selectedProject = ref(null);
52
+ const operation$1 = ref(null);
53
+ const wipeConfirmText = ref("");
54
+ const hasMovableResources = computed(() => props.resourceCounts.credentials + props.resourceCounts.workflows + props.resourceCounts.dataTables > 0);
55
+ const isValid = computed(() => {
56
+ const expectedWipeConfirmation = locale.baseText("projects.settings.delete.question.wipe.placeholder");
57
+ return !hasMovableResources.value || operation$1.value === "transfer" && !!selectedProject.value || operation$1.value === "wipe" && wipeConfirmText.value === expectedWipeConfirmation;
58
+ });
59
+ const onDelete = () => {
60
+ if (!isValid.value) return;
61
+ if (operation$1.value === "wipe") selectedProject.value = null;
62
+ emit("confirmDelete", selectedProject.value?.id);
63
+ };
64
+ return (_ctx, _cache) => {
65
+ return openBlock(), createBlock(unref(ElDialog), {
66
+ modelValue: visible.value,
67
+ "onUpdate:modelValue": _cache[4] || (_cache[4] = ($event) => visible.value = $event),
68
+ title: unref(locale).baseText("projects.settings.delete.title", { interpolate: { projectName: props.currentProject?.name ?? "" } }),
69
+ width: "650"
70
+ }, {
71
+ footer: withCtx(() => [createVNode(unref(N8nButton_default), {
72
+ type: "danger",
73
+ "native-type": "button",
74
+ disabled: !isValid.value,
75
+ "data-test-id": "project-settings-delete-confirm-button",
76
+ onClick: withModifiers(onDelete, ["stop", "prevent"])
77
+ }, {
78
+ default: withCtx(() => [createTextVNode(toDisplayString(unref(locale).baseText("projects.settings.danger.deleteProject")), 1)]),
79
+ _: 1
80
+ }, 8, ["disabled"])]),
81
+ default: withCtx(() => [!hasMovableResources.value ? (openBlock(), createBlock(unref(N8nText_default), {
82
+ key: 0,
83
+ color: "text-base"
84
+ }, {
85
+ default: withCtx(() => [createTextVNode(toDisplayString(unref(locale).baseText("projects.settings.delete.message.empty")), 1)]),
86
+ _: 1
87
+ })) : hasMovableResources.value ? (openBlock(), createElementBlock("div", _hoisted_1$4, [createVNode(unref(N8nText_default), { color: "text-base" }, {
88
+ default: withCtx(() => [createTextVNode(toDisplayString(unref(locale).baseText("projects.settings.delete.message")), 1)]),
89
+ _: 1
90
+ }), createBaseVNode("div", _hoisted_2$1, [
91
+ createVNode(unref(ElRadio), {
92
+ "model-value": operation$1.value ?? "",
93
+ label: "transfer",
94
+ class: "mb-s",
95
+ "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => operation$1.value = "transfer")
96
+ }, {
97
+ default: withCtx(() => [createVNode(unref(N8nText_default), { color: "text-dark" }, {
98
+ default: withCtx(() => [createTextVNode(toDisplayString(unref(locale).baseText("projects.settings.delete.question.transfer.label")), 1)]),
99
+ _: 1
100
+ })]),
101
+ _: 1
102
+ }, 8, ["model-value"]),
103
+ operation$1.value === "transfer" ? (openBlock(), createElementBlock("div", {
104
+ key: 0,
105
+ class: normalizeClass(_ctx.$style.operation)
106
+ }, [createVNode(unref(N8nText_default), { color: "text-dark" }, {
107
+ default: withCtx(() => [createTextVNode(toDisplayString(unref(locale).baseText("projects.settings.delete.question.transfer.title")), 1)]),
108
+ _: 1
109
+ }), createVNode(ProjectSharing_default, {
110
+ modelValue: selectedProject.value,
111
+ "onUpdate:modelValue": _cache[1] || (_cache[1] = ($event) => selectedProject.value = $event),
112
+ class: "pt-2xs",
113
+ projects: props.projects,
114
+ "empty-options-text": unref(locale).baseText("projects.sharing.noMatchingProjects")
115
+ }, null, 8, [
116
+ "modelValue",
117
+ "projects",
118
+ "empty-options-text"
119
+ ])], 2)) : createCommentVNode("", true),
120
+ createVNode(unref(ElRadio), {
121
+ "model-value": operation$1.value ?? "",
122
+ label: "wipe",
123
+ class: "mb-s",
124
+ "onUpdate:modelValue": _cache[2] || (_cache[2] = ($event) => operation$1.value = "wipe")
125
+ }, {
126
+ default: withCtx(() => [createVNode(unref(N8nText_default), { color: "text-dark" }, {
127
+ default: withCtx(() => [createTextVNode(toDisplayString(unref(locale).baseText("projects.settings.delete.question.wipe.label")), 1)]),
128
+ _: 1
129
+ })]),
130
+ _: 1
131
+ }, 8, ["model-value"]),
132
+ operation$1.value === "wipe" ? (openBlock(), createElementBlock("div", {
133
+ key: 1,
134
+ class: normalizeClass(_ctx.$style.operation)
135
+ }, [createVNode(unref(N8nInputLabel_default), { label: unref(locale).baseText("projects.settings.delete.question.wipe.title") }, {
136
+ default: withCtx(() => [createVNode(unref(N8nInput_default), {
137
+ modelValue: wipeConfirmText.value,
138
+ "onUpdate:modelValue": _cache[3] || (_cache[3] = ($event) => wipeConfirmText.value = $event),
139
+ "data-test-id": "project-delete-confirm-input",
140
+ placeholder: unref(locale).baseText("projects.settings.delete.question.wipe.placeholder")
141
+ }, null, 8, ["modelValue", "placeholder"])]),
142
+ _: 1
143
+ }, 8, ["label"])], 2)) : createCommentVNode("", true)
144
+ ])])) : createCommentVNode("", true)]),
145
+ _: 1
146
+ }, 8, ["modelValue", "title"]);
147
+ };
148
+ }
149
+ });
150
+ var ProjectDeleteDialog_vue_vue_type_style_index_0_lang_module_default = { operation: "_operation_12mti_123" };
151
+ var ProjectDeleteDialog_default = /* @__PURE__ */ __plugin_vue_export_helper_default(ProjectDeleteDialog_vue_vue_type_script_setup_true_lang_default, [["__cssModules", { "$style": ProjectDeleteDialog_vue_vue_type_style_index_0_lang_module_default }]]);
152
+ var _hoisted_1$3 = { class: "pt-l" };
153
+ var ProjectRoleUpgradeDialog_default = /* @__PURE__ */ defineComponent({
154
+ __name: "ProjectRoleUpgradeDialog",
155
+ props: /* @__PURE__ */ mergeModels({
156
+ limit: {},
157
+ planName: {}
158
+ }, {
159
+ "modelValue": { type: Boolean },
160
+ "modelModifiers": {}
161
+ }),
162
+ emits: ["update:modelValue"],
163
+ setup(__props) {
164
+ const props = __props;
165
+ const visible = useModel(__props, "modelValue");
166
+ const pageRedirectionHelper = usePageRedirectionHelper();
167
+ const locale = useI18n();
168
+ const goToUpgrade = async () => {
169
+ await pageRedirectionHelper.goToUpgrade("rbac", "upgrade-rbac");
170
+ visible.value = false;
171
+ };
172
+ return (_ctx, _cache) => {
173
+ return openBlock(), createBlock(unref(ElDialog), {
174
+ modelValue: visible.value,
175
+ "onUpdate:modelValue": _cache[1] || (_cache[1] = ($event) => visible.value = $event),
176
+ title: unref(locale).baseText("projects.settings.role.upgrade.title"),
177
+ width: "500"
178
+ }, {
179
+ footer: withCtx(() => [createVNode(unref(N8nButton_default), {
180
+ type: "secondary",
181
+ "native-type": "button",
182
+ onClick: _cache[0] || (_cache[0] = ($event) => visible.value = false)
183
+ }, {
184
+ default: withCtx(() => [createTextVNode(toDisplayString(unref(locale).baseText("generic.cancel")), 1)]),
185
+ _: 1
186
+ }), createVNode(unref(N8nButton_default), {
187
+ type: "primary",
188
+ "native-type": "button",
189
+ onClick: goToUpgrade
190
+ }, {
191
+ default: withCtx(() => [createTextVNode(toDisplayString(unref(locale).baseText("projects.create.limitReached.link")), 1)]),
192
+ _: 1
193
+ })]),
194
+ default: withCtx(() => [createBaseVNode("div", _hoisted_1$3, [createVNode(unref(I18nT), {
195
+ keypath: "projects.settings.role.upgrade.message",
196
+ scope: "global"
197
+ }, {
198
+ planName: withCtx(() => [createTextVNode(toDisplayString(props.planName), 1)]),
199
+ limit: withCtx(() => [createTextVNode(toDisplayString(unref(locale).baseText("projects.create.limit", {
200
+ adjustToNumber: props.limit,
201
+ interpolate: { count: String(props.limit) }
202
+ })), 1)]),
203
+ _: 1
204
+ })])]),
205
+ _: 1
206
+ }, 8, ["modelValue", "title"]);
207
+ };
208
+ }
209
+ });
210
+ var ProjectMembersActionsCell_default = /* @__PURE__ */ defineComponent({
211
+ __name: "ProjectMembersActionsCell",
212
+ props: {
213
+ data: {},
214
+ actions: {}
215
+ },
216
+ emits: ["action"],
217
+ setup(__props, { emit: __emit }) {
218
+ const props = __props;
219
+ const emit = __emit;
220
+ const onAction = (action) => {
221
+ emit("action", {
222
+ action,
223
+ userId: props.data.id
224
+ });
225
+ };
226
+ return (_ctx, _cache) => {
227
+ return props.actions.length > 0 ? (openBlock(), createBlock(unref(N8nActionToggle_default), {
228
+ key: 0,
229
+ placement: "bottom",
230
+ actions: props.actions,
231
+ theme: "dark",
232
+ onAction
233
+ }, null, 8, ["actions"])) : createCommentVNode("", true);
234
+ };
235
+ }
236
+ });
237
+ var _hoisted_1$2 = { key: 1 };
238
+ var ProjectMembersRoleCell_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
239
+ __name: "ProjectMembersRoleCell",
240
+ props: {
241
+ data: {},
242
+ roles: {},
243
+ actions: {}
244
+ },
245
+ emits: ["update:role", "badge-click"],
246
+ setup(__props, { emit: __emit }) {
247
+ const props = __props;
248
+ const emit = __emit;
249
+ const selectedRole = computed(() => props.roles.find((role) => role.slug === props.data.role));
250
+ const isEditable = computed(() => props.data.role !== "project:personalOwner");
251
+ const onActionSelect = (role) => {
252
+ emit("update:role", {
253
+ role,
254
+ userId: props.data.id
255
+ });
256
+ };
257
+ return (_ctx, _cache) => {
258
+ return isEditable.value ? (openBlock(), createBlock(unref(N8nActionDropdown_default), {
259
+ key: 0,
260
+ placement: "bottom-start",
261
+ items: props.actions,
262
+ "max-height": 380,
263
+ "data-test-id": "project-member-role-dropdown",
264
+ onSelect: onActionSelect,
265
+ onBadgeClick: _cache[0] || (_cache[0] = ($event) => emit("badge-click", $event))
266
+ }, {
267
+ activator: withCtx(() => [createBaseVNode("button", {
268
+ class: normalizeClass(_ctx.$style.roleLabel),
269
+ type: "button"
270
+ }, [createVNode(unref(N8nText_default), { color: "text-dark" }, {
271
+ default: withCtx(() => [createTextVNode(toDisplayString(selectedRole.value?.displayName), 1)]),
272
+ _: 1
273
+ }), createVNode(unref(N8nIcon_default), {
274
+ color: "text-dark",
275
+ icon: "chevron-down",
276
+ size: "large"
277
+ })], 2)]),
278
+ menuItem: withCtx((item) => [createVNode(unref(ElRadio), {
279
+ "model-value": selectedRole.value?.slug,
280
+ label: item.id,
281
+ disabled: item.disabled
282
+ }, {
283
+ default: withCtx(() => [createBaseVNode("span", { class: normalizeClass(_ctx.$style.radioLabel) }, [createVNode(unref(N8nText_default), {
284
+ color: "text-dark",
285
+ class: "pb-3xs"
286
+ }, {
287
+ default: withCtx(() => [createTextVNode(toDisplayString(item.label), 1)]),
288
+ _: 2
289
+ }, 1024), createVNode(unref(N8nText_default), {
290
+ color: "text-dark",
291
+ size: "small"
292
+ }, {
293
+ default: withCtx(() => [createTextVNode(toDisplayString(item.description), 1)]),
294
+ _: 2
295
+ }, 1024)], 2)]),
296
+ _: 2
297
+ }, 1032, [
298
+ "model-value",
299
+ "label",
300
+ "disabled"
301
+ ])]),
302
+ _: 1
303
+ }, 8, ["items"])) : (openBlock(), createElementBlock("span", _hoisted_1$2, toDisplayString(selectedRole.value?.displayName), 1));
304
+ };
305
+ }
306
+ });
307
+ var ProjectMembersRoleCell_vue_vue_type_style_index_0_lang_module_default = {
308
+ roleLabel: "_roleLabel_3ta9s_123",
309
+ radioLabel: "_radioLabel_3ta9s_133"
310
+ };
311
+ var ProjectMembersRoleCell_default = /* @__PURE__ */ __plugin_vue_export_helper_default(ProjectMembersRoleCell_vue_vue_type_script_setup_true_lang_default, [["__cssModules", { "$style": ProjectMembersRoleCell_vue_vue_type_style_index_0_lang_module_default }]]);
312
+ var _hoisted_1$1 = { class: "pt-xs pb-xs" };
313
+ var ProjectMembersTable_default = /* @__PURE__ */ defineComponent({
314
+ __name: "ProjectMembersTable",
315
+ props: /* @__PURE__ */ mergeModels({
316
+ data: {},
317
+ loading: { type: Boolean },
318
+ currentUserId: {},
319
+ projectRoles: {},
320
+ actions: {},
321
+ canEditRole: { type: Boolean }
322
+ }, {
323
+ "tableOptions": { default: () => ({
324
+ page: 0,
325
+ itemsPerPage: 10,
326
+ sortBy: []
327
+ }) },
328
+ "tableOptionsModifiers": {}
329
+ }),
330
+ emits: /* @__PURE__ */ mergeModels([
331
+ "update:options",
332
+ "update:role",
333
+ "action",
334
+ "show-upgrade-dialog"
335
+ ], ["update:tableOptions"]),
336
+ setup(__props, { emit: __emit }) {
337
+ const i18n = useI18n();
338
+ const props = __props;
339
+ const emit = __emit;
340
+ const tableOptions = useModel(__props, "tableOptions");
341
+ const rows = computed(() => props.data.items);
342
+ const headers = ref([
343
+ {
344
+ title: i18n.baseText("projects.settings.table.header.user"),
345
+ key: "name",
346
+ width: 400,
347
+ disableSort: true,
348
+ value: (row) => row
349
+ },
350
+ {
351
+ title: i18n.baseText("projects.settings.table.header.role"),
352
+ key: "role",
353
+ width: 200,
354
+ disableSort: true
355
+ },
356
+ {
357
+ title: "",
358
+ key: "actions",
359
+ align: "end",
360
+ width: 46,
361
+ disableSort: true,
362
+ value() {}
363
+ }
364
+ ]);
365
+ const roleActions = computed(() => props.projectRoles.map((role) => ({
366
+ id: role.slug,
367
+ label: role.displayName,
368
+ disabled: !role.licensed,
369
+ description: role.description ?? void 0,
370
+ badge: !role.licensed ? i18n.baseText("generic.upgrade") : void 0,
371
+ badgeProps: !role.licensed ? {
372
+ theme: "warning",
373
+ bold: true
374
+ } : void 0
375
+ })));
376
+ const canUpdateRole = (member) => member.id !== props.currentUserId && props.canEditRole;
377
+ const onRoleChange = ({ role, userId }) => {
378
+ emit("update:role", {
379
+ role,
380
+ userId
381
+ });
382
+ };
383
+ const filterActions = (member) => {
384
+ if (member.id === props.currentUserId || member.role === "project:personalOwner") return [];
385
+ return (props.actions ?? []).filter((action) => action.guard?.(member) ?? true);
386
+ };
387
+ return (_ctx, _cache) => {
388
+ return openBlock(), createElementBlock("div", null, [createVNode(unref(N8nDataTableServer_default), {
389
+ "sort-by": tableOptions.value.sortBy,
390
+ "onUpdate:sortBy": _cache[2] || (_cache[2] = ($event) => tableOptions.value.sortBy = $event),
391
+ page: tableOptions.value.page,
392
+ "onUpdate:page": _cache[3] || (_cache[3] = ($event) => tableOptions.value.page = $event),
393
+ "items-per-page": _ctx.data.count,
394
+ headers: headers.value,
395
+ items: rows.value,
396
+ "items-length": _ctx.data.count,
397
+ loading: _ctx.loading,
398
+ "page-sizes": [_ctx.data.count + 1],
399
+ "onUpdate:options": _cache[4] || (_cache[4] = ($event) => emit("update:options", $event))
400
+ }, {
401
+ [`item.name`]: withCtx(({ value }) => [createBaseVNode("div", _hoisted_1$1, [createVNode(unref(N8nUserInfo_default), normalizeProps(guardReactiveProps(value)), null, 16)])]),
402
+ [`item.role`]: withCtx(({ item }) => [canUpdateRole(item) ? (openBlock(), createBlock(ProjectMembersRoleCell_default, {
403
+ key: 0,
404
+ data: item,
405
+ roles: props.projectRoles,
406
+ actions: roleActions.value,
407
+ "onUpdate:role": onRoleChange,
408
+ onBadgeClick: _cache[0] || (_cache[0] = ($event) => emit("show-upgrade-dialog"))
409
+ }, null, 8, [
410
+ "data",
411
+ "roles",
412
+ "actions"
413
+ ])) : (openBlock(), createBlock(unref(N8nText_default), {
414
+ key: 1,
415
+ color: "text-dark"
416
+ }, {
417
+ default: withCtx(() => [createTextVNode(toDisplayString(props.projectRoles.find((role) => role.slug === item.role)?.displayName ?? item.role), 1)]),
418
+ _: 2
419
+ }, 1024))]),
420
+ [`item.actions`]: withCtx(({ item }) => [createVNode(ProjectMembersActionsCell_default, {
421
+ data: item,
422
+ actions: filterActions(item),
423
+ onAction: _cache[1] || (_cache[1] = ($event) => _ctx.$emit("action", $event))
424
+ }, null, 8, ["data", "actions"])]),
425
+ _: 2
426
+ }, 1032, [
427
+ "sort-by",
428
+ "page",
429
+ "items-per-page",
430
+ "headers",
431
+ "items",
432
+ "items-length",
433
+ "loading",
434
+ "page-sizes"
435
+ ])]);
436
+ };
437
+ }
438
+ });
439
+ var _hoisted_1 = { for: "projectName" };
440
+ var _hoisted_2 = { for: "projectDescription" };
441
+ var _hoisted_3 = { for: "projectMembers" };
442
+ var _hoisted_4 = {
443
+ key: 0,
444
+ class: "mb-m"
445
+ };
446
+ var _hoisted_5 = { class: "mb-m" };
447
+ var SEARCH_THRESHOLD = 10;
448
+ var ProjectSettings_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineComponent({
449
+ __name: "ProjectSettings",
450
+ setup(__props) {
451
+ const usersStore = useUsersStore();
452
+ const i18n = useI18n();
453
+ const projectsStore = useProjectsStore();
454
+ const rolesStore = useRolesStore();
455
+ const cloudPlanStore = useCloudPlanStore();
456
+ const userRoleProvisioningStore = useUserRoleProvisioningStore();
457
+ const toast = useToast();
458
+ const router = useRouter();
459
+ const telemetry = useTelemetry();
460
+ const documentTitle = useDocumentTitle();
461
+ const showSaveError = (error) => {
462
+ toast.showError(error, i18n.baseText("projects.settings.save.error.title"));
463
+ };
464
+ const dialogVisible = ref(false);
465
+ const upgradeDialogVisible = ref(false);
466
+ const isDirty = ref(false);
467
+ const isValid = ref(false);
468
+ const resourceCounts = ref({
469
+ credentials: -1,
470
+ dataTables: -1,
471
+ workflows: -1
472
+ });
473
+ const formData = ref({
474
+ name: "",
475
+ description: "",
476
+ relations: []
477
+ });
478
+ const suppressNextSync = ref(false);
479
+ const nameInput = ref(null);
480
+ const projectIcon = ref({
481
+ type: "icon",
482
+ value: "layers"
483
+ });
484
+ const search$1 = ref("");
485
+ const membersTableState = ref({
486
+ page: 0,
487
+ itemsPerPage: 10,
488
+ sortBy: [
489
+ {
490
+ id: "firstName",
491
+ desc: false
492
+ },
493
+ {
494
+ id: "lastName",
495
+ desc: false
496
+ },
497
+ {
498
+ id: "email",
499
+ desc: false
500
+ }
501
+ ]
502
+ });
503
+ const usersList = computed(() => usersStore.allUsers.filter((user) => {
504
+ return !(formData.value.relations || []).find((r) => r.id === user.id);
505
+ }));
506
+ const projects = computed(() => projectsStore.availableProjects.filter((project) => project.id !== projectsStore.currentProjectId));
507
+ const firstLicensedRole = computed(() => rolesStore.processedProjectRoles.find((role) => role.licensed)?.slug);
508
+ const projectMembersActions = computed(() => [{
509
+ label: i18n.baseText("projects.settings.table.row.removeUser"),
510
+ value: "remove",
511
+ guard: (member) => member.id !== usersStore.currentUser?.id && member.role !== "project:personalOwner"
512
+ }]);
513
+ const onAddMember = async (userId) => {
514
+ if (!projectsStore.currentProject) return;
515
+ if (!usersStore.usersById[userId]) return;
516
+ const role = firstLicensedRole.value;
517
+ if (!role) return;
518
+ if (!formData.value.relations.find((r) => r.id === userId)) formData.value.relations.push({
519
+ id: userId,
520
+ role
521
+ });
522
+ try {
523
+ suppressNextSync.value = true;
524
+ await projectsStore.addMember(projectsStore.currentProject.id, {
525
+ userId,
526
+ role
527
+ });
528
+ toast.showMessage({
529
+ type: "success",
530
+ title: i18n.baseText("projects.settings.member.added.title")
531
+ });
532
+ telemetry.track("User added member to project", {
533
+ project_id: projectsStore.currentProject.id,
534
+ target_user_id: userId,
535
+ role
536
+ });
537
+ } catch (error) {
538
+ formData.value.relations = formData.value.relations.filter((r) => r.id !== userId);
539
+ showSaveError(error);
540
+ }
541
+ };
542
+ const onUpdateMemberRole = async ({ userId, role }) => {
543
+ if (!projectsStore.currentProject) return;
544
+ const memberIndex = formData.value.relations.findIndex((r) => r.id === userId);
545
+ if (memberIndex === -1) return;
546
+ const originalRole = formData.value.relations[memberIndex].role;
547
+ formData.value.relations[memberIndex].role = role;
548
+ try {
549
+ suppressNextSync.value = true;
550
+ await projectsStore.updateMemberRole(projectsStore.currentProject.id, userId, role);
551
+ rolesStore.fetchRoles();
552
+ toast.showMessage({
553
+ type: "success",
554
+ title: i18n.baseText("projects.settings.memberRole.updated.title")
555
+ });
556
+ telemetry.track("User changed member role on project", {
557
+ project_id: projectsStore.currentProject.id,
558
+ target_user_id: userId,
559
+ role
560
+ });
561
+ } catch (error) {
562
+ formData.value.relations[memberIndex].role = originalRole;
563
+ toast.showError(error, i18n.baseText("projects.settings.memberRole.update.error.title"));
564
+ }
565
+ };
566
+ const onTextInput = () => {
567
+ isDirty.value = true;
568
+ };
569
+ async function onRemoveMember(userId) {
570
+ const current = projectsStore.currentProject;
571
+ if (!current) return;
572
+ const idx = formData.value.relations.findIndex((r) => r.id === userId);
573
+ if (idx === -1) return;
574
+ const removed = formData.value.relations.splice(idx, 1)[0];
575
+ if (!current.relations.some((r) => r.id === userId)) return;
576
+ try {
577
+ suppressNextSync.value = true;
578
+ await projectsStore.removeMember(current.id, userId);
579
+ toast.showMessage({
580
+ type: "success",
581
+ title: i18n.baseText("projects.settings.member.removed.title")
582
+ });
583
+ telemetry.track("User removed member from project", {
584
+ project_id: current.id,
585
+ target_user_id: userId
586
+ });
587
+ } catch (error) {
588
+ formData.value.relations.splice(idx, 0, removed);
589
+ showSaveError(error);
590
+ }
591
+ }
592
+ const onMembersListAction = async ({ action, userId }) => {
593
+ switch (action) {
594
+ case "remove":
595
+ await onRemoveMember(userId);
596
+ break;
597
+ default: break;
598
+ }
599
+ };
600
+ const resetFormData = () => {
601
+ formData.value.relations = projectsStore.currentProject?.relations ? deepCopy(projectsStore.currentProject.relations) : [];
602
+ formData.value.name = projectsStore.currentProject?.name ?? "";
603
+ formData.value.description = projectsStore.currentProject?.description ?? "";
604
+ };
605
+ const onCancel = () => {
606
+ resetFormData();
607
+ isDirty.value = false;
608
+ };
609
+ const makeFormDataDiff = () => {
610
+ const diff = {};
611
+ if (!projectsStore.currentProject) return diff;
612
+ if (formData.value.name !== projectsStore.currentProject.name) diff.name = formData.value.name ?? "";
613
+ if (formData.value.description !== projectsStore.currentProject.description) diff.description = formData.value.description ?? "";
614
+ if (formData.value.relations.length !== projectsStore.currentProject.relations.length) {
615
+ diff.memberAdded = formData.value.relations.filter((r) => !projectsStore.currentProject?.relations.find((cr) => cr.id === r.id));
616
+ diff.memberRemoved = projectsStore.currentProject.relations.filter((cr) => !formData.value.relations.find((r) => r.id === cr.id));
617
+ }
618
+ diff.role = formData.value.relations.filter((r) => {
619
+ return (projectsStore.currentProject?.relations.find((cr) => cr.id === r.id))?.role !== r.role && !diff.memberAdded?.find((ar) => ar.id === r.id);
620
+ });
621
+ return diff;
622
+ };
623
+ const sendTelemetry = (diff) => {
624
+ const projectId = projectsStore.currentProject?.id;
625
+ if (diff.name) telemetry.track("User changed project name", {
626
+ project_id: projectId,
627
+ name: diff.name
628
+ });
629
+ diff.memberAdded?.forEach((r) => {
630
+ telemetry.track("User added member to project", {
631
+ project_id: projectId,
632
+ target_user_id: r.id,
633
+ role: r.role
634
+ });
635
+ });
636
+ diff.memberRemoved?.forEach((r) => {
637
+ telemetry.track("User removed member from project", {
638
+ project_id: projectId,
639
+ target_user_id: r.id
640
+ });
641
+ });
642
+ diff.role?.forEach((r) => {
643
+ telemetry.track("User changed member role on project", {
644
+ project_id: projectId,
645
+ target_user_id: r.id,
646
+ role: r.role
647
+ });
648
+ });
649
+ };
650
+ const updateProject = async () => {
651
+ if (!projectsStore.currentProject) return;
652
+ try {
653
+ await projectsStore.updateProject(projectsStore.currentProject.id, {
654
+ name: formData.value.name ?? "",
655
+ description: formData.value.description ?? ""
656
+ });
657
+ isDirty.value = false;
658
+ } catch (error) {
659
+ showSaveError(error);
660
+ throw error;
661
+ }
662
+ };
663
+ const onSubmit = async () => {
664
+ if (!isDirty.value) return;
665
+ try {
666
+ await updateProject();
667
+ sendTelemetry(makeFormDataDiff());
668
+ toast.showMessage({
669
+ title: i18n.baseText("projects.settings.save.successful.title", { interpolate: { projectName: formData.value.name ?? "" } }),
670
+ type: "success"
671
+ });
672
+ } catch (error) {}
673
+ };
674
+ const onDelete = async () => {
675
+ await projectsStore.getAvailableProjects();
676
+ if (projectsStore.currentProjectId) resourceCounts.value = await projectsStore.getResourceCounts(projectsStore.currentProjectId);
677
+ dialogVisible.value = true;
678
+ };
679
+ const onConfirmDelete = async (transferId) => {
680
+ try {
681
+ if (projectsStore.currentProject) {
682
+ const projectName$1 = projectsStore.currentProject?.name ?? "";
683
+ await projectsStore.deleteProject(projectsStore.currentProject.id, transferId);
684
+ await router.push({ name: VIEWS.HOMEPAGE });
685
+ toast.showMessage({
686
+ title: i18n.baseText("projects.settings.delete.successful.title", { interpolate: { projectName: projectName$1 } }),
687
+ type: "success"
688
+ });
689
+ dialogVisible.value = true;
690
+ }
691
+ } catch (error) {
692
+ toast.showError(error, i18n.baseText("projects.settings.delete.error.title"));
693
+ }
694
+ };
695
+ const selectProjectNameIfMatchesDefault = () => {
696
+ if (formData.value.name === i18n.baseText("projects.settings.newProjectName")) {
697
+ nameInput.value?.inputRef?.focus();
698
+ nameInput.value?.inputRef?.select();
699
+ }
700
+ };
701
+ const onIconUpdated = async () => {
702
+ if (!projectsStore.currentProject) return;
703
+ try {
704
+ await projectsStore.updateProject(projectsStore.currentProject.id, { icon: projectIcon.value });
705
+ toast.showMessage({
706
+ title: i18n.baseText("projects.settings.icon.update.successful.title"),
707
+ type: "success"
708
+ });
709
+ } catch (error) {
710
+ showSaveError(error);
711
+ }
712
+ };
713
+ watch(() => projectsStore.currentProject, async () => {
714
+ if (suppressNextSync.value) {
715
+ suppressNextSync.value = false;
716
+ return;
717
+ }
718
+ resetFormData();
719
+ await nextTick();
720
+ selectProjectNameIfMatchesDefault();
721
+ if (projectsStore.currentProject?.icon && isIconOrEmoji(projectsStore.currentProject.icon)) projectIcon.value = projectsStore.currentProject.icon;
722
+ }, { immediate: true });
723
+ const relationUsers = computed(() => formData.value.relations.map((relation) => {
724
+ const user = usersStore.usersById[relation.id];
725
+ const safeRole = isProjectRole(relation.role) ? relation.role : "project:viewer";
726
+ return {
727
+ ...user,
728
+ ...relation,
729
+ role: safeRole,
730
+ firstName: user?.firstName ?? null,
731
+ lastName: user?.lastName ?? null,
732
+ email: user?.email ?? null
733
+ };
734
+ }));
735
+ const membersTableData = computed(() => ({
736
+ items: relationUsers.value,
737
+ count: relationUsers.value.length
738
+ }));
739
+ const filteredMembersData = computed(() => {
740
+ if (!search$1.value.trim()) return membersTableData.value;
741
+ const searchTerm = search$1.value.toLowerCase();
742
+ const filtered = relationUsers.value.filter((member) => {
743
+ const fullName = `${member.firstName ?? ""} ${member.lastName ?? ""}`.toLowerCase();
744
+ const email = (member.email ?? "").toLowerCase();
745
+ return fullName.includes(searchTerm) || email.includes(searchTerm);
746
+ });
747
+ return {
748
+ items: filtered,
749
+ count: filtered.length
750
+ };
751
+ });
752
+ const shouldShowSearch = computed(() => relationUsers.value.length >= SEARCH_THRESHOLD);
753
+ watch(shouldShowSearch, (show) => {
754
+ if (!show && search$1.value) search$1.value = "";
755
+ });
756
+ const debouncedSearch = useDebounceFn(() => {
757
+ membersTableState.value.page = 0;
758
+ }, 300);
759
+ const onSearch = (value) => {
760
+ search$1.value = value;
761
+ debouncedSearch();
762
+ };
763
+ const onUpdateMembersTableOptions = (options) => {
764
+ membersTableState.value = options;
765
+ };
766
+ onBeforeMount(async () => {
767
+ await usersStore.fetchUsers();
768
+ });
769
+ const isProjectRoleProvisioningEnabled = computed(() => userRoleProvisioningStore.provisioningConfig?.scopesProvisionProjectRoles || false);
770
+ onMounted(async () => {
771
+ documentTitle.set(i18n.baseText("projects.settings"));
772
+ selectProjectNameIfMatchesDefault();
773
+ await userRoleProvisioningStore.getProvisioningConfig();
774
+ });
775
+ return (_ctx, _cache) => {
776
+ return openBlock(), createElementBlock("div", {
777
+ class: normalizeClass(_ctx.$style.projectSettings),
778
+ "data-test-id": "project-settings-container"
779
+ }, [
780
+ createBaseVNode("div", { class: normalizeClass(_ctx.$style.header) }, [createVNode(ProjectHeader_default), createBaseVNode("div", { class: normalizeClass(_ctx.$style.headerRow) }, [createVNode(unref(N8nText_default), {
781
+ tag: "h1",
782
+ size: "xlarge",
783
+ class: "pt-xs pb-m"
784
+ }, {
785
+ default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n).baseText("projects.settings.info")), 1)]),
786
+ _: 1
787
+ }), createBaseVNode("div", { class: normalizeClass(_ctx.$style.headerButtons) }, [createVNode(unref(N8nButton_default), {
788
+ type: "secondary",
789
+ "native-type": "button",
790
+ disabled: !isDirty.value,
791
+ class: "mr-2xs",
792
+ "data-test-id": "project-settings-cancel-button",
793
+ onClick: withModifiers(onCancel, ["stop", "prevent"])
794
+ }, {
795
+ default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n).baseText("projects.settings.button.cancel")), 1)]),
796
+ _: 1
797
+ }, 8, ["disabled"]), createVNode(unref(N8nButton_default), {
798
+ disabled: !isValid.value || !isDirty.value,
799
+ type: "primary",
800
+ "data-test-id": "project-settings-save-button",
801
+ onClick: withModifiers(onSubmit, ["stop", "prevent"])
802
+ }, {
803
+ default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n).baseText("projects.settings.button.save")), 1)]),
804
+ _: 1
805
+ }, 8, ["disabled"])], 2)], 2)], 2),
806
+ createBaseVNode("form", { onSubmit: withModifiers(onSubmit, ["prevent"]) }, [
807
+ createBaseVNode("fieldset", null, [createBaseVNode("label", _hoisted_1, toDisplayString(unref(i18n).baseText("projects.settings.name")), 1), createBaseVNode("div", { class: normalizeClass(_ctx.$style.projectName) }, [createVNode(unref(N8nIconPicker_default), {
808
+ modelValue: projectIcon.value,
809
+ "onUpdate:modelValue": [_cache[0] || (_cache[0] = ($event) => projectIcon.value = $event), onIconUpdated],
810
+ "button-tooltip": unref(i18n).baseText("projects.settings.iconPicker.button.tooltip")
811
+ }, null, 8, ["modelValue", "button-tooltip"]), createVNode(unref(N8nFormInput_default), {
812
+ id: "projectName",
813
+ ref_key: "nameInput",
814
+ ref: nameInput,
815
+ modelValue: formData.value.name,
816
+ "onUpdate:modelValue": _cache[1] || (_cache[1] = ($event) => formData.value.name = $event),
817
+ label: "",
818
+ type: "text",
819
+ name: "name",
820
+ required: "",
821
+ "data-test-id": "project-settings-name-input",
822
+ class: normalizeClass(_ctx.$style.projectNameInput),
823
+ onEnter: onSubmit,
824
+ onInput: onTextInput,
825
+ onValidate: _cache[2] || (_cache[2] = ($event) => isValid.value = $event)
826
+ }, null, 8, ["modelValue", "class"])], 2)]),
827
+ createBaseVNode("fieldset", null, [createBaseVNode("label", _hoisted_2, toDisplayString(unref(i18n).baseText("projects.settings.description")), 1), createVNode(unref(N8nFormInput_default), {
828
+ id: "projectDescription",
829
+ modelValue: formData.value.description,
830
+ "onUpdate:modelValue": _cache[3] || (_cache[3] = ($event) => formData.value.description = $event),
831
+ label: "",
832
+ name: "description",
833
+ type: "textarea",
834
+ maxlength: 512,
835
+ autosize: true,
836
+ "data-test-id": "project-settings-description-input",
837
+ class: normalizeClass(_ctx.$style.projectDescriptionInput),
838
+ onEnter: onSubmit,
839
+ onInput: onTextInput,
840
+ onValidate: _cache[4] || (_cache[4] = ($event) => isValid.value = $event)
841
+ }, null, 8, ["modelValue", "class"])]),
842
+ createBaseVNode("fieldset", null, [
843
+ createBaseVNode("h3", null, [createBaseVNode("label", _hoisted_3, toDisplayString(unref(i18n).baseText("projects.settings.projectMembers")), 1)]),
844
+ createBaseVNode("div", { class: normalizeClass([_ctx.$style.membersInputRow, "mb-s"]) }, [createVNode(unref(N8nUserSelect_default), {
845
+ id: "projectMembers",
846
+ class: normalizeClass(_ctx.$style.userSelect),
847
+ size: "large",
848
+ users: usersList.value,
849
+ "current-user-id": unref(usersStore).currentUser?.id,
850
+ placeholder: unref(i18n).baseText("workflows.shareModal.select.placeholder"),
851
+ "data-test-id": "project-members-select",
852
+ "onUpdate:modelValue": onAddMember,
853
+ disabled: isProjectRoleProvisioningEnabled.value
854
+ }, {
855
+ prefix: withCtx(() => [createVNode(unref(N8nIcon_default), { icon: "search" })]),
856
+ _: 1
857
+ }, 8, [
858
+ "class",
859
+ "users",
860
+ "current-user-id",
861
+ "placeholder",
862
+ "disabled"
863
+ ]), shouldShowSearch.value ? (openBlock(), createBlock(unref(N8nInput_default), {
864
+ key: 0,
865
+ class: normalizeClass(_ctx.$style.search),
866
+ "model-value": search$1.value,
867
+ placeholder: unref(i18n).baseText("projects.settings.members.search.placeholder"),
868
+ clearable: "",
869
+ "data-test-id": "project-members-search",
870
+ "onUpdate:modelValue": onSearch
871
+ }, {
872
+ prefix: withCtx(() => [createVNode(unref(N8nIcon_default), { icon: "search" })]),
873
+ _: 1
874
+ }, 8, [
875
+ "class",
876
+ "model-value",
877
+ "placeholder"
878
+ ])) : createCommentVNode("", true)], 2),
879
+ isProjectRoleProvisioningEnabled.value ? (openBlock(), createElementBlock("div", _hoisted_4, [createVNode(unref(Alert_default), {
880
+ type: "info",
881
+ title: unref(i18n).baseText("settings.provisioningProjectRolesHandledBySsoProvider.description")
882
+ }, null, 8, ["title"])])) : createCommentVNode("", true),
883
+ relationUsers.value.length > 0 ? (openBlock(), createElementBlock("div", {
884
+ key: 1,
885
+ class: normalizeClass(_ctx.$style.membersTableContainer)
886
+ }, [createVNode(ProjectMembersTable_default, {
887
+ "table-options": membersTableState.value,
888
+ "onUpdate:tableOptions": _cache[5] || (_cache[5] = ($event) => membersTableState.value = $event),
889
+ "data-test-id": "project-members-table",
890
+ data: filteredMembersData.value,
891
+ "current-user-id": unref(usersStore).currentUser?.id,
892
+ "project-roles": unref(rolesStore).processedProjectRoles,
893
+ actions: projectMembersActions.value,
894
+ "can-edit-role": !isProjectRoleProvisioningEnabled.value,
895
+ "onUpdate:options": onUpdateMembersTableOptions,
896
+ "onUpdate:role": onUpdateMemberRole,
897
+ onAction: onMembersListAction,
898
+ onShowUpgradeDialog: _cache[6] || (_cache[6] = ($event) => upgradeDialogVisible.value = true)
899
+ }, null, 8, [
900
+ "table-options",
901
+ "data",
902
+ "current-user-id",
903
+ "project-roles",
904
+ "actions",
905
+ "can-edit-role"
906
+ ])], 2)) : createCommentVNode("", true)
907
+ ]),
908
+ createBaseVNode("fieldset", null, [
909
+ createBaseVNode("h3", _hoisted_5, toDisplayString(unref(i18n).baseText("projects.settings.danger.title")), 1),
910
+ createBaseVNode("small", { class: normalizeClass(_ctx.$style.danger) }, toDisplayString(unref(i18n).baseText("projects.settings.danger.message")), 3),
911
+ createVNode(unref(N8nButton_default), {
912
+ type: "tertiary",
913
+ size: "large",
914
+ "native-type": "button",
915
+ "data-test-id": "project-settings-delete-button",
916
+ onClick: withModifiers(onDelete, ["stop", "prevent"])
917
+ }, {
918
+ default: withCtx(() => [createTextVNode(toDisplayString(unref(i18n).baseText("projects.settings.danger.deleteProject")), 1)]),
919
+ _: 1
920
+ })
921
+ ])
922
+ ], 32),
923
+ createVNode(ProjectDeleteDialog_default, {
924
+ modelValue: dialogVisible.value,
925
+ "onUpdate:modelValue": _cache[7] || (_cache[7] = ($event) => dialogVisible.value = $event),
926
+ "current-project": unref(projectsStore).currentProject,
927
+ "resource-counts": resourceCounts.value,
928
+ projects: projects.value,
929
+ onConfirmDelete
930
+ }, null, 8, [
931
+ "modelValue",
932
+ "current-project",
933
+ "resource-counts",
934
+ "projects"
935
+ ]),
936
+ createVNode(ProjectRoleUpgradeDialog_default, {
937
+ modelValue: upgradeDialogVisible.value,
938
+ "onUpdate:modelValue": _cache[8] || (_cache[8] = ($event) => upgradeDialogVisible.value = $event),
939
+ limit: unref(projectsStore).teamProjectsLimit,
940
+ "plan-name": unref(cloudPlanStore).currentPlanData?.displayName
941
+ }, null, 8, [
942
+ "modelValue",
943
+ "limit",
944
+ "plan-name"
945
+ ])
946
+ ], 2);
947
+ };
948
+ }
949
+ });
950
+ var ProjectSettings_vue_vue_type_style_index_0_lang_module_default = {
951
+ projectSettings: "_projectSettings_142pd_123",
952
+ header: "_header_142pd_147",
953
+ headerRow: "_headerRow_142pd_153",
954
+ headerButtons: "_headerButtons_142pd_160",
955
+ upgrade: "_upgrade_142pd_166",
956
+ membersInputRow: "_membersInputRow_142pd_170",
957
+ membersTableContainer: "_membersTableContainer_142pd_178",
958
+ search: "_search_142pd_182",
959
+ projectName: "_projectName_142pd_187",
960
+ projectNameInput: "_projectNameInput_142pd_192",
961
+ projectDescriptionInput: "_projectDescriptionInput_142pd_196",
962
+ userSelect: "_userSelect_142pd_197",
963
+ danger: "_danger_142pd_207"
964
+ };
965
+ var ProjectSettings_default = /* @__PURE__ */ __plugin_vue_export_helper_default(ProjectSettings_vue_vue_type_script_setup_true_lang_default, [["__cssModules", { "$style": ProjectSettings_vue_vue_type_style_index_0_lang_module_default }]]);
966
+ export { ProjectSettings_default as default };