n8n-editor-ui 1.84.0 → 1.85.1

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 (117) hide show
  1. package/dist/assets/{AnnotationTagsDropdown.ee.vue_vue_type_script_setup_true_lang-78eP7HIe.js → AnnotationTagsDropdown.ee.vue_vue_type_script_setup_true_lang-DrqkIVnu.js} +1 -1
  2. package/dist/assets/{AuthView-Bn_LB3Kw.js → AuthView-Dr5rONBJ.js} +2 -2
  3. package/dist/assets/{CanvasChat-CGGQcCRA.css → CanvasChatSwitch-BcSDHC-c.css} +522 -24
  4. package/dist/assets/{CanvasChat-tuKMnT6J.js → CanvasChatSwitch-KHakeUZr.js} +919 -509
  5. package/dist/assets/{ChangePasswordView-aXYIR8zr.js → ChangePasswordView-nboaqw83.js} +3 -3
  6. package/dist/assets/CollectionParameter-EiFxXbJy.js +4 -0
  7. package/dist/assets/CommitMonoVariable-ytizKI8U.woff2 +0 -0
  8. package/dist/assets/{CredentialsView-k8CeiyMJ.js → CredentialsView-Dz4nfk1f.js} +19 -8
  9. package/dist/assets/{ErrorView-e-cpk6J7.js → ErrorView-NNkncv05.js} +1 -1
  10. package/dist/assets/{ExecutionsTime.vue_vue_type_script_setup_true_lang-BYacEmlc.js → ExecutionsTime.vue_vue_type_script_setup_true_lang-CRWcQqp0.js} +2 -2
  11. package/dist/assets/{ExecutionsView-CQi8A4ps.js → ExecutionsView-DBrozEb_.js} +25 -8
  12. package/dist/assets/{ExecutionsView-CRTcP3sx.css → ExecutionsView-JCKikuIS.css} +2 -2
  13. package/dist/assets/{FileSaver.min-DmMmlWYQ.js → FileSaver.min-CH9W7aQx.js} +1 -1
  14. package/dist/assets/{FixedCollectionParameter-BfUPtP5M.js → FixedCollectionParameter-C4mulUvT.js} +1 -1
  15. package/dist/assets/{ForgotMyPasswordView-Dzao5PZ9.js → ForgotMyPasswordView-Di4MSlMs.js} +3 -3
  16. package/dist/assets/InterVariable-DiVDrmQJ.woff2 +0 -0
  17. package/dist/assets/InterVariable-Italic-FCBEiFp6.woff2 +0 -0
  18. package/dist/assets/{Logo-DVRZ2qRx.js → Logo-B7J8RW26.js} +1 -1
  19. package/dist/assets/{MainHeader-CX-ZfeKE.css → MainHeader-CWA2JfVJ.css} +22 -22
  20. package/dist/assets/{MainHeader-BUw_JG4S.js → MainHeader-CtvSBfpo.js} +47 -22
  21. package/dist/assets/{MainSidebar-C6aXqICd.js → MainSidebar-DsEI7EAh.js} +2 -2
  22. package/dist/assets/{NodeCreation-B9-99kNr.js → NodeCreation-BxJhTqFb.js} +5 -5
  23. package/dist/assets/{NodeCreator-DDiuO5S0.css → NodeCreator-D9fmPdS2.css} +12 -12
  24. package/dist/assets/{NodeCreator-DH90304h.js → NodeCreator-IiXwtAjo.js} +10 -11
  25. package/dist/assets/{NodeDetailsView-0RXvy-0D.css → NodeDetailsView-C1z3N5z_.css} +46 -46
  26. package/dist/assets/{NodeDetailsView-Ci-9Cz_w.js → NodeDetailsView-DUaaykvi.js} +38 -38
  27. package/dist/assets/{NodeView-CFUO-Q9X.js → NodeView-SJePfWTh.js} +20 -23
  28. package/dist/assets/{ProjectCardBadge-CGqr1_BG.js → ProjectCardBadge-BiNKaCmD.js} +1 -1
  29. package/dist/assets/{ProjectHeader-CQjB5wC7.css → ProjectHeader-B-a6_GH6.css} +7 -7
  30. package/dist/assets/{ProjectHeader-C8hRwBFC.js → ProjectHeader-CyLw5s53.js} +8 -22
  31. package/dist/assets/{ProjectSettings-motYfWGR.js → ProjectSettings-DWDPCOgu.js} +2 -2
  32. package/dist/assets/{PushConnectionTracker.vue_vue_type_script_setup_true_lang-DzkWenq4.js → PushConnectionTracker.vue_vue_type_script_setup_true_lang-Cc6mPRv6.js} +2 -2
  33. package/dist/assets/{ResourcesListLayout-BqQI0lCG.css → ResourcesListLayout-CWgWhtKq.css} +39 -36
  34. package/dist/assets/{ResourcesListLayout-BYVhS2j5.js → ResourcesListLayout-D3QxB6Mt.js} +21 -18
  35. package/dist/assets/{RunDataAi-pfKF0Nfm.js → RunDataAi-BtLQbSfL.js} +25 -20
  36. package/dist/assets/{RunDataAi-DJ-PSs_k.css → RunDataAi-CN9FrT9c.css} +2 -2
  37. package/dist/assets/{RunDataJson-CNT_rM-i.js → RunDataJson-Dq5WcTmp.js} +12 -12
  38. package/dist/assets/{RunDataJsonActions-BTLAUv9R.js → RunDataJsonActions-CTPgZ_Ap.js} +2 -2
  39. package/dist/assets/{RunDataSearch-BpcbBojC.js → RunDataSearch-Dhj2W7Uo.js} +1 -1
  40. package/dist/assets/{RunDataTable-ZnG9QEzJ.js → RunDataTable-7bn1EkU7.js} +2 -2
  41. package/dist/assets/{SamlOnboarding-DjhCWFIr.js → SamlOnboarding-D1PM8HAM.js} +3 -3
  42. package/dist/assets/{SettingsApiView-C1ClqjeG.js → SettingsApiView-5hGK32Zv.js} +2 -3
  43. package/dist/assets/{SettingsCommunityNodesView-D5eLIpQC.js → SettingsCommunityNodesView-cgiOdmlI.js} +5 -5
  44. package/dist/assets/{SettingsExternalSecrets-ubf6jijA.js → SettingsExternalSecrets-BzRxl3F3.js} +1 -1
  45. package/dist/assets/{SettingsLdapView-BezV6JLr.js → SettingsLdapView-EKueQ2CB.js} +1 -1
  46. package/dist/assets/{SettingsLogStreamingView-ETOxA5Tw.js → SettingsLogStreamingView-BtKQsZkR.js} +2 -2
  47. package/dist/assets/{SettingsPersonalView-DGxUC8Q4.js → SettingsPersonalView-tM84kaF9.js} +1 -1
  48. package/dist/assets/{SettingsSourceControl-1vHHG6W9.js → SettingsSourceControl-CzoIPnXf.js} +1 -1
  49. package/dist/assets/{SettingsSso-CdI26YPF.js → SettingsSso-Bp6l5AlD.js} +7 -7
  50. package/dist/assets/{SettingsSso-BjoJZ2DU.css → SettingsSso-DyrGnPdA.css} +10 -10
  51. package/dist/assets/{SettingsUsageAndPlan-Cul4YcIk.css → SettingsUsageAndPlan-b3WY2Ea_.css} +3 -3
  52. package/dist/assets/{SettingsUsageAndPlan-BmI8cSiq.js → SettingsUsageAndPlan-fPYKlrNm.js} +8 -3
  53. package/dist/assets/{SettingsUsersView-90JmT1qM.js → SettingsUsersView-Dcmef7Ov.js} +1 -1
  54. package/dist/assets/{SettingsView-i7rE7s3I.js → SettingsView-CE7pqxNy.js} +1 -1
  55. package/dist/assets/{SetupView-Lp4ullGE.js → SetupView-oDFJN3je.js} +3 -3
  56. package/dist/assets/{SetupWorkflowCredentialsButton-CoXXUd3B.js → SetupWorkflowCredentialsButton-C8VmrRKt.js} +1 -1
  57. package/dist/assets/{SetupWorkflowFromTemplateView-TVU0-Zq4.js → SetupWorkflowFromTemplateView-B01aWC7Z.js} +3 -3
  58. package/dist/assets/{SigninView-BqF8j6-h.js → SigninView-BOEnSofB.js} +3 -3
  59. package/dist/assets/{SignoutView-DrYJ9Qe3.js → SignoutView-DR8Sm3bw.js} +1 -1
  60. package/dist/assets/{SignupView-_EKPhYKN.js → SignupView-BvtcynJk.js} +3 -3
  61. package/dist/assets/{TemplateDetails-DAalg9G2.js → TemplateDetails-y8AXGWbs.js} +1 -1
  62. package/dist/assets/{TemplateList-BEYMeJMu.js → TemplateList-D-1dO4Eq.js} +1 -1
  63. package/dist/assets/{TemplatesCollectionView-fMELXCRX.js → TemplatesCollectionView-ClzAzyXF.js} +5 -5
  64. package/dist/assets/{TemplatesSearchView-BO-e3IH7.js → TemplatesSearchView-CmiSgpTu.js} +3 -3
  65. package/dist/assets/{TemplatesView-p57nARMp.js → TemplatesView-CyBLc8qH.js} +1 -1
  66. package/dist/assets/{TemplatesWorkflowView-DAbL5S1-.js → TemplatesWorkflowView-3W3FI7bJ.js} +5 -5
  67. package/dist/assets/{TestDefinitionEditView-BTo9LlAU.js → TestDefinitionEditView-BnNPA8Y7.js} +7 -8
  68. package/dist/assets/{TestDefinitionListView-D_-DyZDv.js → TestDefinitionListView-CKxRJzbr.js} +1 -1
  69. package/dist/assets/{TestDefinitionNewView-Crk5OePO.js → TestDefinitionNewView-BwxuCFrb.js} +2 -2
  70. package/dist/assets/{TestDefinitionRootView-BtiqAWW1.js → TestDefinitionRootView-XxqAJ8by.js} +1 -1
  71. package/dist/assets/{VariablesView-BvDpOTm3.css → VariablesView-ATWfdJsE.css} +5 -5
  72. package/dist/assets/{VariablesView-Bg3GI1iE.js → VariablesView-Jmww_g5c.js} +5 -5
  73. package/dist/assets/{WorkerView-CaTyr1ci.js → WorkerView-B6RZF_3e.js} +7 -7
  74. package/dist/assets/{WorkflowActivator-BvmRhIkt.js → WorkflowActivator-1S83wg3m.js} +2 -2
  75. package/dist/assets/{WorkflowExecutionsInfoAccordion-BuIbG1kZ.js → WorkflowExecutionsInfoAccordion-DyYf5xnM.js} +1 -1
  76. package/dist/assets/{WorkflowExecutionsLandingPage-BirtsKx4.js → WorkflowExecutionsLandingPage-BJJkMmAN.js} +2 -2
  77. package/dist/assets/{WorkflowExecutionsPreview-CPGOOAq2.css → WorkflowExecutionsPreview-CHu6M3Dh.css} +22 -22
  78. package/dist/assets/{WorkflowExecutionsPreview-DFyHWF9H.js → WorkflowExecutionsPreview-DOgsT3qO.js} +22 -22
  79. package/dist/assets/{WorkflowExecutionsView-IUjVjxU9.js → WorkflowExecutionsView-C5pQ01YU.js} +6 -7
  80. package/dist/assets/{WorkflowHistory-BqKSxr_5.js → WorkflowHistory-JYpRDL5b.js} +3 -3
  81. package/dist/assets/{WorkflowOnboardingView-Bs0Rmm6I.js → WorkflowOnboardingView-CI-nHjPv.js} +1 -1
  82. package/dist/assets/{WorkflowPreview-1jsK9hpV.js → WorkflowPreview-DeccEeOD.js} +1 -1
  83. package/dist/assets/{WorkflowsView-MzPw02jI.js → WorkflowsView-DpE8yGfm.js} +333 -80
  84. package/dist/assets/{WorkflowsView-Sg6GR5kC.css → WorkflowsView-r9qJOUEb.css} +22 -15
  85. package/dist/assets/{easyAiWorkflowUtils-DlyLBhIZ.js → easyAiWorkflowUtils-CZVa9QJH.js} +5 -5
  86. package/dist/assets/{global-link-actions-DvwtxSrW.js → global-link-actions-fxxB6c1M.js} +1 -1
  87. package/dist/assets/{import-curl-CbxpR02g.js → import-curl-BMQD81WG.js} +1 -1
  88. package/dist/assets/{index-tzkIB4Tg.js → index-CFXicF1K.js} +1 -1
  89. package/dist/assets/{index-74EeM2i2.css → index-CgXKy7t-.css} +1208 -1185
  90. package/dist/assets/{index-CyVlLoqB.js → index-TONfBAHg.js} +2656 -2132
  91. package/dist/assets/{pickBy-DI3cF803.js → pickBy-DMdfAEN5.js} +1 -1
  92. package/dist/assets/{pushConnection.store-BhUCpqAg.js → pushConnection.store-CXF122Ff.js} +1 -1
  93. package/dist/assets/{templateActions-BnGO7zdc.js → templateActions-BMN7PUps.js} +1 -1
  94. package/dist/assets/{useBeforeUnload-DtKxjKeS.js → useBeforeUnload-DaIbVPhm.js} +1 -1
  95. package/dist/assets/{useCanvasMapping-BCP7UO9p.js → useCanvasMapping-BkYlSNdK.js} +53 -54
  96. package/dist/assets/{useCanvasMapping-CI4ehFWu.css → useCanvasMapping-CJcAsQmx.css} +47 -47
  97. package/dist/assets/{useCanvasOperations-Ctquo5LL.js → useCanvasOperations-B2wChId3.js} +453 -183
  98. package/dist/assets/useClearExecutionButtonVisible-DXrP_YDx.js +23 -0
  99. package/dist/assets/{useExecutionDebugging-C0TAc9fj.js → useExecutionDebugging-B26z6tvj.js} +1 -1
  100. package/dist/assets/{useExecutionHelpers-BQHL3OpL.js → useExecutionHelpers-tpdv0KUa.js} +1 -1
  101. package/dist/assets/{useImportCurlCommand-IE8oJ9bp.js → useImportCurlCommand-DPFdzFcL.js} +2 -2
  102. package/dist/assets/useOverview-C8mSc1uX.js +161 -0
  103. package/dist/assets/useOverview-DcRuPjLJ.css +232 -0
  104. package/dist/assets/{usePushConnection-DXozzPWi.js → usePushConnection-C8yfU7M_.js} +4 -4
  105. package/dist/assets/{useRunWorkflow-D9JIEr1s.js → useRunWorkflow-B3mpLXeb.js} +12 -12
  106. package/dist/assets/{useTestDefinitionForm-8dJH3v29.js → useTestDefinitionForm-DsiSBIWm.js} +1 -1
  107. package/dist/assets/{useWorkflowActivate-CI3X35ZJ.js → useWorkflowActivate-wAFdzwEx.js} +1 -1
  108. package/dist/index.html +2 -2
  109. package/package.json +1 -1
  110. package/dist/assets/CollectionParameter-DR9e0MGf.js +0 -4
  111. package/dist/assets/open-sans-latin-400-normal-kLvSbl7y.woff +0 -0
  112. package/dist/assets/open-sans-latin-400-normal-sjvN8RAh.woff2 +0 -0
  113. package/dist/assets/open-sans-latin-600-normal-BYc6TgXR.woff2 +0 -0
  114. package/dist/assets/open-sans-latin-600-normal-CJ2UE_uF.woff +0 -0
  115. package/dist/assets/open-sans-latin-700-normal-DMXgkrz3.woff +0 -0
  116. package/dist/assets/open-sans-latin-700-normal-DXyImmHa.woff2 +0 -0
  117. package/dist/assets/usePinnedData-CtRDhd6k.js +0 -274
@@ -1,10 +1,11 @@
1
- import { d as defineComponent, U as useRoute, b as useRouter, q as computed, gh as ProjectTypes, c as useI18n, V as VIEWS, h as resolveComponent, i as createElementBlock, g as openBlock, j as createVNode, w as withCtx, n as normalizeClass, k as createBaseVNode, f as createCommentVNode, e as createBlock, gi as __unplugin_components_0$1, l as createTextVNode, t as toDisplayString, J as withModifiers, m as unref, cM as _sfc_main$4, _ as _export_sfc, a3 as useProjectsStore, aU as createSlots, a as useToast, p as useSettingsStore, L as useUIStore, u as useUsersStore, T as useWorkflowsStore, a8 as getResourcePermissions, d$ as dateFormat, aA as withDirectives, aB as vShow, gj as ResourceType, af as WORKFLOW_SHARE_MODAL_KEY, ag as useTelemetry, an as DUPLICATE_MODAL_KEY, ai as useMessage, aj as MODAL_CONFIRM, gk as PROJECT_MOVE_RESOURCE_MODAL, a2 as useSourceControlStore, au as usePostHog, E as useTagsStore, gl as useFoldersStore, a5 as useDocumentTitle, K as useDebounce, r as ref, ab as EnterpriseEditionFeature, gm as EASY_AI_WORKFLOW_EXPERIMENT, I as watch, o as onMounted, C as createEventBus, y as onBeforeUnmount, A as debounce, d2 as N8nInputLabel, ad as _sfc_main$5, gn as N8nSelect, F as Fragment, D as renderList, go as _sfc_main$6, cS as N8nHeading, c0 as N8nText, gp as N8nCard, c4 as N8nIcon, gq as DEFAULT_WORKFLOW_PAGE_SIZE, bO as AI_CREDITS_EXPERIMENT, gr as VALID_FOLDER_NAME_REGEX } from "./index-CyVlLoqB.js";
2
- import { R as ResourcesListLayout } from "./ResourcesListLayout-BYVhS2j5.js";
3
- import { W as WorkflowActivator } from "./WorkflowActivator-BvmRhIkt.js";
4
- import { P as ProjectCardBadge } from "./ProjectCardBadge-CGqr1_BG.js";
5
- import { P as ProjectHeader } from "./ProjectHeader-C8hRwBFC.js";
6
- import { g as getEasyAiWorkflowJson } from "./easyAiWorkflowUtils-DlyLBhIZ.js";
7
- import "./useWorkflowActivate-CI3X35ZJ.js";
1
+ import { d as defineComponent, U as useRoute, b as useRouter, q as computed, ac as ProjectTypes, c as useI18n, V as VIEWS, h as resolveComponent, i as createElementBlock, g as openBlock, j as createVNode, w as withCtx, n as normalizeClass, k as createBaseVNode, f as createCommentVNode, e as createBlock, gj as __unplugin_components_0$1, l as createTextVNode, t as toDisplayString, J as withModifiers, m as unref, cO as _sfc_main$4, _ as _export_sfc, a3 as useProjectsStore, aV as createSlots, a as useToast, p as useSettingsStore, L as useUIStore, u as useUsersStore, T as useWorkflowsStore, gk as useFoldersStore, r as ref, a8 as getResourcePermissions, fi as dateFormat, aB as withDirectives, aC as vShow, gl as ResourceType, ag as WORKFLOW_SHARE_MODAL_KEY, ah as useTelemetry, ao as DUPLICATE_MODAL_KEY, aj as useMessage, ak as MODAL_CONFIRM, gm as PROJECT_MOVE_RESOURCE_MODAL, gn as FOLDER_NAME_ILLEGAL_CHARACTERS_REGEX, go as ILLEGAL_FOLDER_CHARACTERS, gp as FOLDER_NAME_ONLY_DOTS_REGEX, gq as FOLDER_NAME_MAX_LENGTH, a2 as useSourceControlStore, av as usePostHog, E as useTagsStore, d7 as useUsageStore, gr as useInsightsStore, a5 as useDocumentTitle, K as useDebounce, ab as EnterpriseEditionFeature, gs as EASY_AI_WORKFLOW_EXPERIMENT, I as watch, o as onMounted, C as createEventBus, y as onBeforeUnmount, A as debounce, d4 as N8nInputLabel, ae as _sfc_main$5, gt as N8nSelect, F as Fragment, D as renderList, gu as _sfc_main$6, cU as N8nHeading, by as N8nText, gv as N8nCard, c6 as N8nIcon, gw as DEFAULT_WORKFLOW_PAGE_SIZE, bS as AI_CREDITS_EXPERIMENT, da as COMMUNITY_PLUS_ENROLLMENT_MODAL } from "./index-TONfBAHg.js";
2
+ import { R as ResourcesListLayout } from "./ResourcesListLayout-D3QxB6Mt.js";
3
+ import { W as WorkflowActivator } from "./WorkflowActivator-1S83wg3m.js";
4
+ import { P as ProjectCardBadge } from "./ProjectCardBadge-BiNKaCmD.js";
5
+ import { P as ProjectHeader } from "./ProjectHeader-CyLw5s53.js";
6
+ import { g as getEasyAiWorkflowJson } from "./easyAiWorkflowUtils-CZVa9QJH.js";
7
+ import { u as useOverview, I as InsightsSummary } from "./useOverview-C8mSc1uX.js";
8
+ import "./useWorkflowActivate-wAFdzwEx.js";
8
9
  const FOLDER_LIST_ITEM_ACTIONS = {
9
10
  OPEN: "open",
10
11
  CREATE: "create",
@@ -323,18 +324,20 @@ const _sfc_main$2 = /* @__PURE__ */ defineComponent({
323
324
  _ctx.breadcrumbs.visibleItems ? (openBlock(), createBlock(_component_n8n_action_toggle, {
324
325
  key: 1,
325
326
  actions: _ctx.actions,
327
+ class: normalizeClass(_ctx.$style["action-toggle"]),
326
328
  theme: "dark",
327
329
  "data-test-id": "folder-breadcrumbs-actions",
328
330
  onAction
329
- }, null, 8, ["actions"])) : createCommentVNode("", true)
331
+ }, null, 8, ["actions", "class"])) : createCommentVNode("", true)
330
332
  ], 2);
331
333
  };
332
334
  }
333
335
  });
334
- const container = "_container_1e41k_123";
336
+ const container = "_container_4mxjz_123";
335
337
  const style0$2 = {
336
338
  container,
337
- "home-project": "_home-project_1e41k_128"
339
+ "action-toggle": "_action-toggle_4mxjz_128",
340
+ "home-project": "_home-project_4mxjz_132"
338
341
  };
339
342
  const cssModules$2 = {
340
343
  "$style": style0$2
@@ -371,12 +374,50 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
371
374
  const usersStore = useUsersStore();
372
375
  const workflowsStore = useWorkflowsStore();
373
376
  const projectsStore = useProjectsStore();
377
+ const foldersStore = useFoldersStore();
378
+ const hiddenBreadcrumbsItemsAsync = ref(new Promise(() => {
379
+ }));
374
380
  const resourceTypeLabel = computed(() => locale.baseText("generic.workflow").toLowerCase());
375
381
  const currentUser = computed(() => usersStore.currentUser ?? {});
376
382
  const workflowPermissions = computed(() => getResourcePermissions(props.data.scopes).workflow);
383
+ const isOverviewPage = computed(() => route.name === VIEWS.WORKFLOWS);
377
384
  const showFolders = computed(() => {
378
385
  return settingsStore.isFoldersFeatureEnabled && route.name !== VIEWS.WORKFLOWS;
379
386
  });
387
+ const projectIcon = computed(() => {
388
+ const defaultIcon = { type: "icon", value: "layer-group" };
389
+ if (props.data.homeProject?.type === ProjectTypes.Personal) {
390
+ return { type: "icon", value: "user" };
391
+ } else if (props.data.homeProject?.type === ProjectTypes.Team) {
392
+ return props.data.homeProject.icon ?? defaultIcon;
393
+ }
394
+ return defaultIcon;
395
+ });
396
+ const projectName = computed(() => {
397
+ if (props.data.homeProject?.type === ProjectTypes.Personal) {
398
+ return locale.baseText("projects.menu.personal");
399
+ }
400
+ return props.data.homeProject?.name;
401
+ });
402
+ const cardBreadcrumbs = computed(() => {
403
+ if (props.data.parentFolder) {
404
+ return [
405
+ {
406
+ id: props.data.parentFolder.id,
407
+ name: props.data.parentFolder.name,
408
+ label: props.data.parentFolder.name,
409
+ href: router.resolve({
410
+ name: VIEWS.PROJECTS_FOLDERS,
411
+ params: {
412
+ projectId: props.data.homeProject?.id,
413
+ folderId: props.data.parentFolder.id
414
+ }
415
+ }).href
416
+ }
417
+ ];
418
+ }
419
+ return [];
420
+ });
380
421
  const actions = computed(() => {
381
422
  const items = [
382
423
  {
@@ -517,6 +558,16 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
517
558
  });
518
559
  emit("workflow:deleted");
519
560
  }
561
+ const fetchHiddenBreadCrumbsItems = async () => {
562
+ if (!props.data.homeProject?.id || !projectName.value || !props.data.parentFolder) {
563
+ hiddenBreadcrumbsItemsAsync.value = Promise.resolve([]);
564
+ } else {
565
+ hiddenBreadcrumbsItemsAsync.value = foldersStore.getHiddenBreadcrumbsItems(
566
+ { id: props.data.homeProject.id, name: projectName.value },
567
+ props.data.parentFolder.id
568
+ );
569
+ }
570
+ };
520
571
  function moveResource() {
521
572
  uiStore.openModalWithData({
522
573
  name: PROJECT_MOVE_RESOURCE_MODAL,
@@ -531,11 +582,18 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
531
582
  const emitWorkflowActiveToggle = (value) => {
532
583
  emit("workflow:active-toggle", value);
533
584
  };
585
+ const onBreadcrumbItemClick = async (item) => {
586
+ if (item.href) {
587
+ await router.push(item.href);
588
+ }
589
+ };
534
590
  return (_ctx, _cache) => {
535
591
  const _component_N8nBadge = resolveComponent("N8nBadge");
536
- const _component_n8n_heading = resolveComponent("n8n-heading");
537
- const _component_n8n_tags = resolveComponent("n8n-tags");
538
592
  const _component_n8n_text = resolveComponent("n8n-text");
593
+ const _component_n8n_tags = resolveComponent("n8n-tags");
594
+ const _component_ProjectIcon = __unplugin_components_0$1;
595
+ const _component_n8n_link = resolveComponent("n8n-link");
596
+ const _component_n8n_breadcrumbs = resolveComponent("n8n-breadcrumbs");
539
597
  const _component_n8n_action_toggle = resolveComponent("n8n-action-toggle");
540
598
  const _component_n8n_card = resolveComponent("n8n-card");
541
599
  return openBlock(), createBlock(_component_n8n_card, {
@@ -544,7 +602,7 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
544
602
  onClick
545
603
  }, {
546
604
  header: withCtx(() => [
547
- createVNode(_component_n8n_heading, {
605
+ createVNode(_component_n8n_text, {
548
606
  tag: "h2",
549
607
  bold: "",
550
608
  class: normalizeClass(_ctx.$style.cardHeading),
@@ -573,13 +631,64 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
573
631
  onClick: _cache[0] || (_cache[0] = withModifiers(() => {
574
632
  }, ["stop"]))
575
633
  }, [
576
- createVNode(ProjectCardBadge, {
634
+ isOverviewPage.value ? (openBlock(), createElementBlock("div", {
635
+ key: 0,
636
+ class: normalizeClass(_ctx.$style.breadcrumbs)
637
+ }, [
638
+ createVNode(_component_n8n_breadcrumbs, {
639
+ items: cardBreadcrumbs.value,
640
+ "hidden-items": hiddenBreadcrumbsItemsAsync.value,
641
+ "path-truncated": true,
642
+ "show-border": true,
643
+ "highlight-last-item": false,
644
+ "hidden-items-trigger": "hover",
645
+ theme: "small",
646
+ "data-test-id": "workflow-card-breadcrumbs",
647
+ onTooltipOpened: fetchHiddenBreadCrumbsItems,
648
+ onItemSelected: onBreadcrumbItemClick
649
+ }, createSlots({ _: 2 }, [
650
+ _ctx.data.homeProject ? {
651
+ name: "prepend",
652
+ fn: withCtx(() => [
653
+ createBaseVNode("div", {
654
+ class: normalizeClass(_ctx.$style["home-project"])
655
+ }, [
656
+ createVNode(_component_n8n_link, {
657
+ to: `/projects/${_ctx.data.homeProject.id}`
658
+ }, {
659
+ default: withCtx(() => [
660
+ createVNode(_component_ProjectIcon, {
661
+ icon: projectIcon.value,
662
+ "border-less": true,
663
+ size: "mini"
664
+ }, null, 8, ["icon"]),
665
+ createVNode(_component_n8n_text, {
666
+ size: "small",
667
+ compact: true,
668
+ bold: true,
669
+ color: "text-base"
670
+ }, {
671
+ default: withCtx(() => [
672
+ createTextVNode(toDisplayString(projectName.value), 1)
673
+ ]),
674
+ _: 1
675
+ })
676
+ ]),
677
+ _: 1
678
+ }, 8, ["to"])
679
+ ], 2)
680
+ ]),
681
+ key: "0"
682
+ } : void 0
683
+ ]), 1032, ["items", "hidden-items"])
684
+ ], 2)) : (openBlock(), createBlock(ProjectCardBadge, {
685
+ key: 1,
577
686
  class: normalizeClass(_ctx.$style.cardBadge),
578
687
  resource: _ctx.data,
579
688
  "resource-type": unref(ResourceType).Workflow,
580
689
  "resource-type-label": resourceTypeLabel.value,
581
690
  "personal-project": unref(projectsStore).personalProject
582
- }, null, 8, ["class", "resource", "resource-type", "resource-type-label", "personal-project"]),
691
+ }, null, 8, ["class", "resource", "resource-type", "resource-type-label", "personal-project"])),
583
692
  createVNode(WorkflowActivator, {
584
693
  class: "mr-s",
585
694
  "workflow-active": _ctx.data.active,
@@ -658,12 +767,53 @@ const cssModules$1 = {
658
767
  "$style": style0$1
659
768
  };
660
769
  const WorkflowCard = /* @__PURE__ */ _export_sfc(_sfc_main$1, [["__cssModules", cssModules$1]]);
661
- const _hoisted_1 = { class: "text-center mt-s" };
662
- const _hoisted_2 = {
770
+ function useFolders() {
771
+ const i18n = useI18n();
772
+ function validateFolderName(folderName) {
773
+ if (FOLDER_NAME_ILLEGAL_CHARACTERS_REGEX.test(folderName)) {
774
+ return i18n.baseText("folders.invalidName.invalidCharacters.message", {
775
+ interpolate: {
776
+ illegalChars: ILLEGAL_FOLDER_CHARACTERS.join(" ")
777
+ }
778
+ });
779
+ }
780
+ if (FOLDER_NAME_ONLY_DOTS_REGEX.test(folderName)) {
781
+ return i18n.baseText("folders.invalidName.only.dots.message");
782
+ }
783
+ if (folderName.startsWith(".")) {
784
+ return i18n.baseText("folders.invalidName.starts.with.dot..message");
785
+ }
786
+ if (folderName.trim() === "") {
787
+ return i18n.baseText("folders.invalidName.empty.message");
788
+ }
789
+ if (folderName.length > FOLDER_NAME_MAX_LENGTH) {
790
+ return i18n.baseText("folders.invalidName.tooLong.message", {
791
+ interpolate: {
792
+ maxLength: FOLDER_NAME_MAX_LENGTH
793
+ }
794
+ });
795
+ }
796
+ return true;
797
+ }
798
+ return {
799
+ validateFolderName
800
+ };
801
+ }
802
+ const _hoisted_1 = { key: 0 };
803
+ const _hoisted_2 = { key: 0 };
804
+ const _hoisted_3 = { key: 1 };
805
+ const _hoisted_4 = { key: 1 };
806
+ const _hoisted_5 = {
807
+ class: "text-center mt-s",
808
+ "data-test-id": "list-empty-state"
809
+ };
810
+ const _hoisted_6 = {
663
811
  key: 0,
664
812
  class: "mb-s"
665
813
  };
666
- const _hoisted_3 = { class: "mb-s" };
814
+ const _hoisted_7 = { class: "mb-s" };
815
+ const SEARCH_DEBOUNCE_TIME = 300;
816
+ const FILTERS_DEBOUNCE_TIME = 100;
667
817
  const _sfc_main = /* @__PURE__ */ defineComponent({
668
818
  __name: "WorkflowsView",
669
819
  setup(__props) {
@@ -683,6 +833,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
683
833
  const router = useRouter();
684
834
  const message = useMessage();
685
835
  const toast = useToast();
836
+ const folderHelpers = useFolders();
686
837
  const sourceControlStore = useSourceControlStore();
687
838
  const usersStore = useUsersStore();
688
839
  const workflowsStore = useWorkflowsStore();
@@ -693,8 +844,11 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
693
844
  const uiStore = useUIStore();
694
845
  const tagsStore = useTagsStore();
695
846
  const foldersStore = useFoldersStore();
847
+ const usageStore = useUsageStore();
848
+ const insightsStore = useInsightsStore();
696
849
  const documentTitle = useDocumentTitle();
697
850
  const { callDebounced } = useDebounce();
851
+ const overview = useOverview();
698
852
  const loading = ref(false);
699
853
  const breadcrumbsLoading = ref(false);
700
854
  const filters = ref({
@@ -759,8 +913,14 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
759
913
  const isShareable = computed(
760
914
  () => settingsStore.isEnterpriseFeatureEnabled[EnterpriseEditionFeature.Sharing]
761
915
  );
916
+ const foldersEnabled = computed(() => {
917
+ return settingsStore.isFoldersFeatureEnabled;
918
+ });
919
+ const teamProjectsEnabled = computed(() => {
920
+ return projectsStore.isTeamProjectFeatureEnabled;
921
+ });
762
922
  const showFolders = computed(() => {
763
- return settingsStore.isFoldersFeatureEnabled && !isOverviewPage.value;
923
+ return foldersEnabled.value && !isOverviewPage.value;
764
924
  });
765
925
  const currentFolder = computed(() => {
766
926
  return currentFolderId.value ? foldersStore.breadcrumbsCache[currentFolderId.value] : null;
@@ -861,6 +1021,16 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
861
1021
  return i18n.baseText("workflows.empty.description");
862
1022
  }
863
1023
  });
1024
+ const hasFilters = computed(() => {
1025
+ return !!(filters.value.search || filters.value.status !== StatusFilter.ALL || filters.value.tags.length);
1026
+ });
1027
+ const isSelfHostedDeployment = computed(() => settingsStore.deploymentType === "default");
1028
+ const canUserRegisterCommunityPlus = computed(
1029
+ () => getResourcePermissions(usersStore.currentUser?.globalScopes).community.register
1030
+ );
1031
+ const showRegisteredCommunityCTA = computed(
1032
+ () => isSelfHostedDeployment.value && !foldersEnabled.value && canUserRegisterCommunityPlus.value
1033
+ );
864
1034
  watch(
865
1035
  () => route.params?.projectId,
866
1036
  async () => {
@@ -878,9 +1048,18 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
878
1048
  if (name !== "pullWorkfolder") return;
879
1049
  after(async () => await initialize());
880
1050
  });
1051
+ const onWorkflowDeleted = async () => {
1052
+ await Promise.all([
1053
+ fetchWorkflows(),
1054
+ foldersStore.fetchTotalWorkflowsAndFoldersCount(route.params.projectId)
1055
+ ]);
1056
+ };
881
1057
  const onFolderDeleted = async (payload) => {
882
1058
  const folderInfo = foldersStore.getCachedFolder(payload.folderId);
883
1059
  foldersStore.deleteFoldersFromCache([payload.folderId, folderInfo?.parentFolder ?? ""]);
1060
+ await foldersStore.fetchTotalWorkflowsAndFoldersCount(
1061
+ route.params.projectId
1062
+ );
884
1063
  if (currentFolderId.value === payload.folderId) {
885
1064
  void router.push({
886
1065
  name: VIEWS.PROJECTS_FOLDERS,
@@ -918,7 +1097,9 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
918
1097
  const [, resourcesPage] = await Promise.all([
919
1098
  usersStore.fetchUsers(),
920
1099
  fetchWorkflows(),
921
- workflowsStore.fetchActiveWorkflows()
1100
+ workflowsStore.fetchActiveWorkflows(),
1101
+ usageStore.getLicenseInfo(),
1102
+ foldersStore.fetchTotalWorkflowsAndFoldersCount(route.params.projectId)
922
1103
  ]);
923
1104
  breadcrumbsLoading.value = false;
924
1105
  workflowsAndFolders.value = resourcesPage;
@@ -959,7 +1140,6 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
959
1140
  await foldersStore.getFolderPath(routeProjectId, parentFolder);
960
1141
  breadcrumbsLoading.value = false;
961
1142
  }
962
- await foldersStore.fetchTotalWorkflowsAndFoldersCount(routeProjectId);
963
1143
  workflowsAndFolders.value = fetchedResources;
964
1144
  return fetchedResources;
965
1145
  } catch (error) {
@@ -986,24 +1166,24 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
986
1166
  const onFiltersUpdated = async () => {
987
1167
  currentPage.value = 1;
988
1168
  saveFiltersOnQueryString();
989
- await callDebounced(fetchWorkflows, { debounceTime: 100, trailing: true });
1169
+ await callDebounced(fetchWorkflows, { debounceTime: FILTERS_DEBOUNCE_TIME, trailing: true });
990
1170
  };
991
1171
  const onSearchUpdated = async (search) => {
992
1172
  currentPage.value = 1;
993
1173
  saveFiltersOnQueryString();
994
1174
  if (search) {
995
- await callDebounced(fetchWorkflows, { debounceTime: 100, trailing: true });
1175
+ await callDebounced(fetchWorkflows, { debounceTime: SEARCH_DEBOUNCE_TIME, trailing: true });
996
1176
  } else {
997
1177
  await fetchWorkflows();
998
1178
  }
999
1179
  };
1000
1180
  const setCurrentPage = async (page) => {
1001
1181
  currentPage.value = page;
1002
- await callDebounced(fetchWorkflows, { debounceTime: 100, trailing: true });
1182
+ await callDebounced(fetchWorkflows, { debounceTime: FILTERS_DEBOUNCE_TIME, trailing: true });
1003
1183
  };
1004
1184
  const setPageSize = async (size) => {
1005
1185
  pageSize.value = size;
1006
- await callDebounced(fetchWorkflows, { debounceTime: 100, trailing: true });
1186
+ await callDebounced(fetchWorkflows, { debounceTime: FILTERS_DEBOUNCE_TIME, trailing: true });
1007
1187
  };
1008
1188
  const onClickTag = async (tagId) => {
1009
1189
  if (!filters.value.tags.includes(tagId)) {
@@ -1263,11 +1443,14 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
1263
1443
  if (!clickedFolder) return;
1264
1444
  switch (payload.action) {
1265
1445
  case FOLDER_LIST_ITEM_ACTIONS.CREATE:
1266
- await createFolder({
1267
- id: clickedFolder.id,
1268
- name: clickedFolder.name,
1269
- type: "folder"
1270
- });
1446
+ await createFolder(
1447
+ {
1448
+ id: clickedFolder.id,
1449
+ name: clickedFolder.name,
1450
+ type: "folder"
1451
+ },
1452
+ { openAfterCreate: true }
1453
+ );
1271
1454
  break;
1272
1455
  case FOLDER_LIST_ITEM_ACTIONS.CREATE_WORKFLOW:
1273
1456
  currentFolderId.value = clickedFolder.id;
@@ -1297,14 +1480,13 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
1297
1480
  break;
1298
1481
  }
1299
1482
  };
1300
- const createFolder = async (parent) => {
1483
+ const createFolder = async (parent, options = { openAfterCreate: false }) => {
1301
1484
  const promptResponsePromise = message.prompt(
1302
1485
  i18n.baseText("folders.add.to.parent.message", { interpolate: { parent: parent.name } }),
1303
1486
  {
1304
1487
  confirmButtonText: i18n.baseText("generic.create"),
1305
1488
  cancelButtonText: i18n.baseText("generic.cancel"),
1306
- inputErrorMessage: i18n.baseText("folders.invalidName.message"),
1307
- inputPattern: VALID_FOLDER_NAME_REGEX,
1489
+ inputValidator: folderHelpers.validateFolderName,
1308
1490
  customClass: "add-folder-modal"
1309
1491
  }
1310
1492
  );
@@ -1337,29 +1519,36 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
1337
1519
  },
1338
1520
  type: "success"
1339
1521
  });
1340
- if (!workflowsAndFolders.value.length) {
1341
- workflowsAndFolders.value = [
1342
- {
1343
- id: newFolder.id,
1344
- name: newFolder.name,
1345
- resource: "folder",
1346
- createdAt: newFolder.createdAt,
1347
- updatedAt: newFolder.updatedAt,
1348
- homeProject: projectsStore.currentProject,
1349
- sharedWithProjects: [],
1350
- workflowCount: 0,
1351
- subFolderCount: 0
1352
- }
1353
- ];
1354
- foldersStore.cacheFolders([
1355
- { id: newFolder.id, name: newFolder.name, parentFolder: currentFolder.value?.id }
1356
- ]);
1357
- } else {
1358
- await fetchWorkflows();
1359
- }
1360
1522
  telemetry.track("User created folder", {
1361
1523
  folder_id: newFolder.id
1362
1524
  });
1525
+ if (options.openAfterCreate) {
1526
+ await router.push({
1527
+ name: VIEWS.PROJECTS_FOLDERS,
1528
+ params: { projectId: route.params.projectId, folderId: parent.id }
1529
+ });
1530
+ } else {
1531
+ if (!workflowsAndFolders.value.length) {
1532
+ workflowsAndFolders.value = [
1533
+ {
1534
+ id: newFolder.id,
1535
+ name: newFolder.name,
1536
+ resource: "folder",
1537
+ createdAt: newFolder.createdAt,
1538
+ updatedAt: newFolder.updatedAt,
1539
+ homeProject: projectsStore.currentProject,
1540
+ sharedWithProjects: [],
1541
+ workflowCount: 0,
1542
+ subFolderCount: 0
1543
+ }
1544
+ ];
1545
+ foldersStore.cacheFolders([
1546
+ { id: newFolder.id, name: newFolder.name, parentFolder: currentFolder.value?.id }
1547
+ ]);
1548
+ } else {
1549
+ await fetchWorkflows();
1550
+ }
1551
+ }
1363
1552
  } catch (error) {
1364
1553
  toast.showError(error, i18n.baseText("folders.create.error.title"));
1365
1554
  }
@@ -1373,10 +1562,9 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
1373
1562
  {
1374
1563
  confirmButtonText: i18n.baseText("generic.rename"),
1375
1564
  cancelButtonText: i18n.baseText("generic.cancel"),
1376
- inputErrorMessage: i18n.baseText("folders.invalidName.message"),
1377
1565
  inputValue: folder.name,
1378
- inputPattern: VALID_FOLDER_NAME_REGEX,
1379
- customClass: "rename-folder-modal"
1566
+ customClass: "rename-folder-modal",
1567
+ inputValidator: folderHelpers.validateFolderName
1380
1568
  }
1381
1569
  );
1382
1570
  const promptResponse = await promptResponsePromise;
@@ -1401,6 +1589,13 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
1401
1589
  }
1402
1590
  };
1403
1591
  const createFolderInCurrent = async () => {
1592
+ if (showRegisteredCommunityCTA.value) {
1593
+ uiStore.openModalWithData({
1594
+ name: COMMUNITY_PLUS_ENROLLMENT_MODAL,
1595
+ data: { customHeading: i18n.baseText("folders.registeredCommunity.cta.heading") }
1596
+ });
1597
+ return;
1598
+ }
1404
1599
  if (!route.params.projectId) return;
1405
1600
  const currentParent = currentFolder.value?.name || projectName.value;
1406
1601
  if (!currentParent) return;
@@ -1431,12 +1626,15 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
1431
1626
  await foldersStore.moveFolder(
1432
1627
  route.params.projectId,
1433
1628
  payload.folder.id,
1434
- payload.newParent.id
1629
+ payload.newParent.type === "project" ? "0" : payload.newParent.id
1435
1630
  );
1436
1631
  const isCurrentFolder = currentFolderId.value === payload.folder.id;
1437
1632
  const newFolderURL = router.resolve({
1438
1633
  name: VIEWS.PROJECTS_FOLDERS,
1439
- params: { projectId: route.params.projectId, folderId: payload.newParent.id }
1634
+ params: {
1635
+ projectId: route.params.projectId,
1636
+ folderId: payload.newParent.type === "project" ? void 0 : payload.newParent.id
1637
+ }
1440
1638
  }).href;
1441
1639
  if (isCurrentFolder) {
1442
1640
  void router.push(newFolderURL);
@@ -1461,6 +1659,13 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
1461
1659
  }
1462
1660
  };
1463
1661
  const moveWorkflowToFolder = async (payload) => {
1662
+ if (showRegisteredCommunityCTA.value) {
1663
+ uiStore.openModalWithData({
1664
+ name: COMMUNITY_PLUS_ENROLLMENT_MODAL,
1665
+ data: { customHeading: i18n.baseText("folders.registeredCommunity.cta.heading") }
1666
+ });
1667
+ return;
1668
+ }
1464
1669
  uiStore.openMoveToFolderModal(
1465
1670
  "workflow",
1466
1671
  { id: payload.id, name: payload.name, parentFolderId: payload.parentFolderId },
@@ -1472,13 +1677,16 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
1472
1677
  try {
1473
1678
  const newFolderURL = router.resolve({
1474
1679
  name: VIEWS.PROJECTS_FOLDERS,
1475
- params: { projectId: route.params.projectId, folderId: payload.newParent.id }
1680
+ params: {
1681
+ projectId: route.params.projectId,
1682
+ folderId: payload.newParent.type === "project" ? void 0 : payload.newParent.id
1683
+ }
1476
1684
  }).href;
1477
1685
  const workflowResource = workflowsAndFolders.value.find(
1478
1686
  (resource) => resource.id === payload.workflow.id
1479
1687
  );
1480
1688
  await workflowsStore.updateWorkflow(payload.workflow.id, {
1481
- parentFolderId: payload.newParent.id,
1689
+ parentFolderId: payload.newParent.type === "project" ? "0" : payload.newParent.id,
1482
1690
  versionId: workflowResource?.versionId
1483
1691
  });
1484
1692
  await fetchWorkflows();
@@ -1504,6 +1712,15 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
1504
1712
  toast.showError(error, i18n.baseText("folders.move.workflow.error.title"));
1505
1713
  }
1506
1714
  };
1715
+ const onCreateWorkflowClick = () => {
1716
+ void router.push({
1717
+ name: VIEWS.NEW_WORKFLOW,
1718
+ query: {
1719
+ projectId: currentProject.value?.id,
1720
+ parentFolderId: route.params.folderId
1721
+ }
1722
+ });
1723
+ };
1507
1724
  return (_ctx, _cache) => {
1508
1725
  const _component_N8nButton = resolveComponent("N8nButton");
1509
1726
  const _component_N8nTooltip = resolveComponent("N8nTooltip");
@@ -1512,6 +1729,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
1512
1729
  const _component_n8n_loading = resolveComponent("n8n-loading");
1513
1730
  const _component_FolderBreadcrumbs = __unplugin_components_0;
1514
1731
  const _component_FolderCard = __unplugin_components_1;
1732
+ const _component_n8n_action_box = resolveComponent("n8n-action-box");
1515
1733
  return openBlock(), createBlock(ResourcesListLayout, {
1516
1734
  filters: filters.value,
1517
1735
  "onUpdate:filters": [
@@ -1538,7 +1756,16 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
1538
1756
  onSort: onSortUpdated
1539
1757
  }, createSlots({
1540
1758
  header: withCtx(() => [
1541
- createVNode(ProjectHeader, { onCreateFolder: createFolderInCurrent })
1759
+ createVNode(ProjectHeader, { onCreateFolder: createFolderInCurrent }, {
1760
+ default: withCtx(() => [
1761
+ unref(overview).isOverviewSubPage ? (openBlock(), createBlock(InsightsSummary, {
1762
+ key: 0,
1763
+ loading: unref(insightsStore).summary.isLoading,
1764
+ summary: unref(insightsStore).summary.state
1765
+ }, null, 8, ["loading", "summary"])) : createCommentVNode("", true)
1766
+ ]),
1767
+ _: 1
1768
+ })
1542
1769
  ]),
1543
1770
  callout: withCtx(() => [
1544
1771
  showEasyAIWorkflowCallout.value && easyAICalloutVisible.value ? (openBlock(), createBlock(_component_N8nCallout, {
@@ -1610,13 +1837,13 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
1610
1837
  onAction: onFolderCardAction
1611
1838
  }, null, 8, ["data", "actions", "read-only"])) : (openBlock(), createBlock(WorkflowCard, {
1612
1839
  key: 1,
1613
- "data-test-id": "resources-list-item",
1840
+ "data-test-id": "resources-list-item-workflow",
1614
1841
  class: "mb-2xs",
1615
1842
  data,
1616
1843
  "workflow-list-event-bus": unref(workflowListEventBus),
1617
1844
  "read-only": readOnlyEnv.value,
1618
1845
  "onClick:tag": onClickTag,
1619
- "onWorkflow:deleted": fetchWorkflows,
1846
+ "onWorkflow:deleted": onWorkflowDeleted,
1620
1847
  "onWorkflow:moved": fetchWorkflows,
1621
1848
  "onWorkflow:duplicated": fetchWorkflows,
1622
1849
  "onWorkflow:activeToggle": onWorkflowActiveToggle,
@@ -1624,7 +1851,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
1624
1851
  }, null, 8, ["data", "workflow-list-event-bus", "read-only"]))
1625
1852
  ]),
1626
1853
  empty: withCtx(() => [
1627
- createBaseVNode("div", _hoisted_1, [
1854
+ createBaseVNode("div", _hoisted_5, [
1628
1855
  createVNode(unref(N8nHeading), {
1629
1856
  tag: "h2",
1630
1857
  size: "xlarge",
@@ -1703,7 +1930,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
1703
1930
  ], 2)) : createCommentVNode("", true)
1704
1931
  ]),
1705
1932
  filters: withCtx(({ setKeyValue }) => [
1706
- unref(settingsStore).areTagsEnabled ? (openBlock(), createElementBlock("div", _hoisted_2, [
1933
+ unref(settingsStore).areTagsEnabled ? (openBlock(), createElementBlock("div", _hoisted_6, [
1707
1934
  createVNode(unref(N8nInputLabel), {
1708
1935
  label: unref(i18n).baseText("workflows.filters.tags"),
1709
1936
  bold: false,
@@ -1718,7 +1945,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
1718
1945
  "onUpdate:modelValue": ($event) => setKeyValue("tags", $event)
1719
1946
  }, null, 8, ["placeholder", "model-value", "onUpdate:modelValue"])
1720
1947
  ])) : createCommentVNode("", true),
1721
- createBaseVNode("div", _hoisted_3, [
1948
+ createBaseVNode("div", _hoisted_7, [
1722
1949
  createVNode(unref(N8nInputLabel), {
1723
1950
  label: unref(i18n).baseText("workflows.filters.status"),
1724
1951
  bold: false,
@@ -1745,28 +1972,53 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
1745
1972
  }, 1032, ["model-value", "onUpdate:modelValue"])
1746
1973
  ])
1747
1974
  ]),
1975
+ postamble: withCtx(() => [
1976
+ workflowsAndFolders.value.length === 0 && currentFolder.value && !hasFilters.value ? (openBlock(), createElementBlock("div", {
1977
+ key: 0,
1978
+ class: normalizeClass(_ctx.$style["empty-folder-container"]),
1979
+ "data-test-id": "empty-folder-container"
1980
+ }, [
1981
+ createVNode(_component_n8n_action_box, {
1982
+ "data-test-id": "empty-folder-action-box",
1983
+ heading: unref(i18n).baseText("folders.empty.actionbox.title", {
1984
+ interpolate: { folderName: currentFolder.value.name }
1985
+ }),
1986
+ "button-text": unref(i18n).baseText("generic.create.workflow"),
1987
+ "button-type": "secondary",
1988
+ "button-disabled": readOnlyEnv.value || !projectPermissions.value.workflow.create,
1989
+ "onClick:button": onCreateWorkflowClick
1990
+ }, {
1991
+ disabledButtonTooltip: withCtx(() => [
1992
+ createTextVNode(toDisplayString(readOnlyEnv.value ? unref(i18n).baseText("readOnlyEnv.cantAdd.workflow") : unref(i18n).baseText("generic.missing.permissions")), 1)
1993
+ ]),
1994
+ _: 1
1995
+ }, 8, ["heading", "button-text", "button-disabled"])
1996
+ ], 2)) : createCommentVNode("", true)
1997
+ ]),
1748
1998
  _: 2
1749
1999
  }, [
1750
- showFolders.value ? {
2000
+ foldersEnabled.value || showRegisteredCommunityCTA.value ? {
1751
2001
  name: "add-button",
1752
2002
  fn: withCtx(() => [
1753
2003
  createVNode(_component_N8nTooltip, {
1754
2004
  placement: "top",
1755
- disabled: readOnlyEnv.value || !hasPermissionToCreateFolders.value
2005
+ disabled: !(isOverviewPage.value || !readOnlyEnv.value && hasPermissionToCreateFolders.value)
1756
2006
  }, {
1757
2007
  content: withCtx(() => [
1758
- createTextVNode(toDisplayString(currentParentName.value ? unref(i18n).baseText("folders.add.to.parent.message", {
2008
+ isOverviewPage.value && !showRegisteredCommunityCTA.value ? (openBlock(), createElementBlock("span", _hoisted_1, [
2009
+ teamProjectsEnabled.value ? (openBlock(), createElementBlock("span", _hoisted_2, toDisplayString(unref(i18n).baseText("folders.add.overview.withProjects.message")), 1)) : (openBlock(), createElementBlock("span", _hoisted_3, toDisplayString(unref(i18n).baseText("folders.add.overview.community.message")), 1))
2010
+ ])) : (openBlock(), createElementBlock("span", _hoisted_4, toDisplayString(currentParentName.value ? unref(i18n).baseText("folders.add.to.parent.message", {
1759
2011
  interpolate: { parent: currentParentName.value }
1760
- }) : unref(i18n).baseText("folders.add.here.message")), 1)
2012
+ }) : unref(i18n).baseText("folders.add.here.message")), 1))
1761
2013
  ]),
1762
2014
  default: withCtx(() => [
1763
2015
  createVNode(_component_N8nButton, {
1764
- size: "large",
2016
+ size: "small",
1765
2017
  icon: "folder-plus",
1766
2018
  type: "tertiary",
1767
2019
  "data-test-id": "add-folder-button",
1768
2020
  class: normalizeClass(_ctx.$style["add-folder-button"]),
1769
- disabled: readOnlyEnv.value || !hasPermissionToCreateFolders.value,
2021
+ disabled: !showRegisteredCommunityCTA.value && (readOnlyEnv.value || !hasPermissionToCreateFolders.value),
1770
2022
  onClick: createFolderInCurrent
1771
2023
  }, null, 8, ["class", "disabled"])
1772
2024
  ]),
@@ -1779,18 +2031,19 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
1779
2031
  };
1780
2032
  }
1781
2033
  });
1782
- const actionsContainer = "_actionsContainer_12bsx_123";
1783
- const emptyStateCard = "_emptyStateCard_12bsx_139";
1784
- const emptyStateCardIcon = "_emptyStateCardIcon_12bsx_152";
2034
+ const actionsContainer = "_actionsContainer_f2oet_123";
2035
+ const emptyStateCard = "_emptyStateCard_f2oet_139";
2036
+ const emptyStateCardIcon = "_emptyStateCardIcon_f2oet_152";
1785
2037
  const style0 = {
1786
2038
  actionsContainer,
1787
- "easy-ai-workflow-callout": "_easy-ai-workflow-callout_12bsx_128",
1788
- "callout-trailing-content": "_callout-trailing-content_12bsx_133",
2039
+ "easy-ai-workflow-callout": "_easy-ai-workflow-callout_f2oet_128",
2040
+ "callout-trailing-content": "_callout-trailing-content_f2oet_133",
1789
2041
  emptyStateCard,
1790
2042
  emptyStateCardIcon,
1791
- "add-folder-button": "_add-folder-button_12bsx_161",
1792
- "breadcrumbs-container": "_breadcrumbs-container_12bsx_165",
1793
- "breadcrumbs-loading": "_breadcrumbs-loading_12bsx_171"
2043
+ "add-folder-button": "_add-folder-button_f2oet_161",
2044
+ "breadcrumbs-container": "_breadcrumbs-container_f2oet_166",
2045
+ "breadcrumbs-loading": "_breadcrumbs-loading_f2oet_172",
2046
+ "empty-folder-container": "_empty-folder-container_f2oet_178"
1794
2047
  };
1795
2048
  const cssModules = {
1796
2049
  "$style": style0