n8n-editor-ui 1.81.3 → 1.82.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 (110) hide show
  1. package/biome.jsonc +2 -2
  2. package/dist/assets/{AnnotationTagsDropdown.ee.vue_vue_type_script_setup_true_lang-BW998oiU.js → AnnotationTagsDropdown.ee.vue_vue_type_script_setup_true_lang-CVAPh1f-.js} +1 -1
  3. package/dist/assets/{AuthView-D06Y8WaW.js → AuthView-f4oecjPB.js} +2 -2
  4. package/dist/assets/{CanvasChat-oFfeuF_m.css → CanvasChat-CSLR5tKe.css} +67 -67
  5. package/dist/assets/{CanvasChat-B1XqDPdJ.js → CanvasChat-DRLqKEil.js} +7 -7
  6. package/dist/assets/{ChangePasswordView-DlhvSj3v.js → ChangePasswordView-qEIbFcTO.js} +3 -3
  7. package/dist/assets/CollectionParameter-l-cUQi-f.js +4 -0
  8. package/dist/assets/{ConcurrentExecutionsHeader-DpmCHvh5.js → ConcurrentExecutionsHeader-Ddh95eQk.js} +2 -2
  9. package/dist/assets/{CredentialsView-gqJJjZnH.js → CredentialsView-BsOy9bMK.js} +6 -6
  10. package/dist/assets/{ErrorView-CWdS6JZF.js → ErrorView--froAN-1.js} +1 -1
  11. package/dist/assets/{ExecutionsView-D5yJwk_n.js → ExecutionsView-odqi6gmC.js} +6 -6
  12. package/dist/assets/{FileSaver.min-JqqCDClh.js → FileSaver.min-pwLVwMq4.js} +1 -1
  13. package/dist/assets/{FixedCollectionParameter-BReT5syB.css → FixedCollectionParameter-BATXrzXI.css} +18 -18
  14. package/dist/assets/{FixedCollectionParameter-B3QletY6.js → FixedCollectionParameter-DWdgl2BK.js} +2 -2
  15. package/dist/assets/{ForgotMyPasswordView-Ch9OesTT.js → ForgotMyPasswordView-DM8k7659.js} +3 -3
  16. package/dist/assets/{Logo-DNtRgn1M.js → Logo-86l8l_Uc.js} +1 -1
  17. package/dist/assets/{MainHeader-ByRLGpW_.css → MainHeader-CX-ZfeKE.css} +34 -40
  18. package/dist/assets/{MainHeader-W9wyL7aF.js → MainHeader-Ddeqm9X3.js} +112 -97
  19. package/dist/assets/{MainSidebar-iL8E6f86.js → MainSidebar-CBjO7dQF.js} +3 -3
  20. package/dist/assets/{MainSidebar-BQVC8zBU.css → MainSidebar-DULRx8tG.css} +2 -2
  21. package/dist/assets/{NodeCreation-LU_Jd7ZN.js → NodeCreation-D4zlvQth.js} +4 -4
  22. package/dist/assets/{NodeCreator-CbVtwR4D.js → NodeCreator-CRV2RNCc.js} +4 -4
  23. package/dist/assets/{NodeDetailsView-C5qgc2nE.js → NodeDetailsView-CGPkwklD.js} +43 -26
  24. package/dist/assets/{NodeDetailsView-C2CtoATD.css → NodeDetailsView-mr-1IzdH.css} +22 -22
  25. package/dist/assets/{NodeView-cgb1K0sK.js → NodeView-BO6hcUEI.js} +28 -18
  26. package/dist/assets/{ProjectCardBadge-DY9PI-lv.js → ProjectCardBadge-CukEqaMt.js} +1 -1
  27. package/dist/assets/{ProjectCreateResource-icMXxLmn.js → ProjectCreateResource-CtheSWks.js} +1 -1
  28. package/dist/assets/{ProjectHeader-B1QbGLAy.js → ProjectHeader-DyqSSbiB.js} +31 -12
  29. package/dist/assets/{ProjectSettings-Sjv7MdiW.js → ProjectSettings-A-Jx5EuH.js} +3 -3
  30. package/dist/assets/{PushConnectionTracker.vue_vue_type_script_setup_true_lang-BkeJK_o6.js → PushConnectionTracker.vue_vue_type_script_setup_true_lang-DCOYMajh.js} +2 -2
  31. package/dist/assets/{ResourcesListLayout-DgwDLCvq.js → ResourcesListLayout--Bt5VWxW.js} +31 -27
  32. package/dist/assets/{ResourcesListLayout-GXGxZsS7.css → ResourcesListLayout-CrglsyJJ.css} +28 -25
  33. package/dist/assets/{RunDataAi-CVZUcHKh.js → RunDataAi-3mvlRRpH.js} +95 -81
  34. package/dist/assets/{RunDataJson-v1xs8mOh.js → RunDataJson-zJPQ05WS.js} +12 -12
  35. package/dist/assets/{RunDataJsonActions-BF_w46-j.js → RunDataJsonActions-B7Oc2vSo.js} +2 -2
  36. package/dist/assets/{RunDataSearch-C9vTRbpZ.js → RunDataSearch-unoOqlxw.js} +1 -1
  37. package/dist/assets/{RunDataTable-Cyt-R5Ne.js → RunDataTable-D4ImpIT0.js} +2 -2
  38. package/dist/assets/{SamlOnboarding-B0GtxhUj.js → SamlOnboarding-79GZgVmm.js} +3 -3
  39. package/dist/assets/{SettingsApiView-BB3Lm3bi.css → SettingsApiView-BF29ifnH.css} +17 -7
  40. package/dist/assets/{SettingsApiView-BquBHARi.js → SettingsApiView-Bfu9Eq70.js} +96 -12
  41. package/dist/assets/{SettingsCommunityNodesView-MlgZs1pJ.js → SettingsCommunityNodesView-D0ljXB1M.js} +5 -5
  42. package/dist/assets/{SettingsExternalSecrets-B1tujBx-.js → SettingsExternalSecrets-B26gYiBu.js} +1 -1
  43. package/dist/assets/{SettingsLdapView-Bu2QmZFA.js → SettingsLdapView-vYxwcftp.js} +1 -1
  44. package/dist/assets/{SettingsLogStreamingView-4o7kKzWx.js → SettingsLogStreamingView-BdbopaRu.js} +1 -1
  45. package/dist/assets/{SettingsPersonalView-BT1ea9Z0.js → SettingsPersonalView-b-MqOeug.js} +1 -1
  46. package/dist/assets/{SettingsSourceControl-BgyzWk3N.js → SettingsSourceControl-uQItePJJ.js} +1 -1
  47. package/dist/assets/{SettingsSso-Bj2HtCgL.js → SettingsSso-Dax1Fk3N.js} +1 -1
  48. package/dist/assets/{SettingsUsageAndPlan-B5DEUrT3.css → SettingsUsageAndPlan-Cul4YcIk.css} +3 -3
  49. package/dist/assets/{SettingsUsageAndPlan-DjPctQ_D.js → SettingsUsageAndPlan-DmRaRr9Y.js} +2 -2
  50. package/dist/assets/{SettingsUsersView-CJO9WyW-.js → SettingsUsersView-Dq_Xawhz.js} +1 -1
  51. package/dist/assets/{SettingsView-D_eMci-B.js → SettingsView-CwE_fjon.js} +1 -1
  52. package/dist/assets/{SetupView-wadckBuD.js → SetupView-CBN-MPm-.js} +3 -3
  53. package/dist/assets/{SetupWorkflowCredentialsButton-BtI5-vnz.js → SetupWorkflowCredentialsButton-DMEKgnto.js} +1 -1
  54. package/dist/assets/{SetupWorkflowFromTemplateView-BXi0z9da.js → SetupWorkflowFromTemplateView-C-xX73HU.js} +3 -3
  55. package/dist/assets/{SigninView-CF48sXfq.js → SigninView-Y47sX3sc.js} +3 -3
  56. package/dist/assets/{SignoutView-Ce-O1UMs.js → SignoutView-L91VLZRK.js} +1 -1
  57. package/dist/assets/{SignupView-H4rvet3k.js → SignupView-BSHwg6_v.js} +3 -3
  58. package/dist/assets/{TemplateDetails-Bord-EUO.js → TemplateDetails-C6QQKqXn.js} +1 -1
  59. package/dist/assets/{TemplateList-D2yeNaWY.js → TemplateList-BzVBnzbc.js} +1 -1
  60. package/dist/assets/{TemplatesCollectionView-Cis6Moe6.js → TemplatesCollectionView-DKaMozRB.js} +5 -5
  61. package/dist/assets/{TemplatesSearchView-cQp7aQ8O.js → TemplatesSearchView-Avn4D7q4.js} +3 -3
  62. package/dist/assets/{TemplatesView-Bzt-Y5nc.js → TemplatesView-DktpANMP.js} +1 -1
  63. package/dist/assets/{TemplatesWorkflowView-g_-2p5ff.js → TemplatesWorkflowView-B-XJLYyE.js} +5 -5
  64. package/dist/assets/{TestDefinitionEditView-BLTcYPQo.js → TestDefinitionEditView-BA1sXEbp.js} +316 -446
  65. package/dist/assets/{TestDefinitionEditView-B-ShDvcb.css → TestDefinitionEditView-JONL00pA.css} +54 -239
  66. package/dist/assets/{TestDefinitionListView-DUy0g6ec.js → TestDefinitionListView-CFrLcIk_.js} +29 -35
  67. package/dist/assets/{TestDefinitionListView-DQQJ8Oqf.css → TestDefinitionListView-Di-Edppe.css} +5 -5
  68. package/dist/assets/{TestDefinitionNewView-B4zhJ4fN.js → TestDefinitionNewView-B0ez8o4U.js} +2 -2
  69. package/dist/assets/{TestDefinitionRootView-Bxlk4Tgo.js → TestDefinitionRootView-BIq9LbNz.js} +1 -1
  70. package/dist/assets/{VariablesView-BbD_NAsg.js → VariablesView-CJO6im3Q.js} +6 -6
  71. package/dist/assets/{VariablesView-0Eu4NnUq.css → VariablesView-CbTLdNwU.css} +10 -10
  72. package/dist/assets/{WorkerView-Bv8QDUJT.js → WorkerView-BZFdCgX1.js} +7 -7
  73. package/dist/assets/{WorkflowActivator-Zsg0lNt1.js → WorkflowActivator-Dio1FWuT.js} +2 -2
  74. package/dist/assets/{WorkflowExecutionsInfoAccordion-CSN7f5M7.js → WorkflowExecutionsInfoAccordion-DNiIxxXO.js} +1 -1
  75. package/dist/assets/{WorkflowExecutionsLandingPage-B50N9dpW.js → WorkflowExecutionsLandingPage-UiQavDut.js} +2 -2
  76. package/dist/assets/{WorkflowExecutionsPreview-DMeq-RS5.js → WorkflowExecutionsPreview-wbxiFm6F.js} +6 -6
  77. package/dist/assets/{WorkflowExecutionsView-FR2n2eBe.js → WorkflowExecutionsView-BXjP0BOn.js} +7 -7
  78. package/dist/assets/{WorkflowHistory-CEqY5Y6b.js → WorkflowHistory-lacb8AOz.js} +3 -3
  79. package/dist/assets/{WorkflowOnboardingView-Bi5Hxeov.js → WorkflowOnboardingView-BdS71XgS.js} +1 -1
  80. package/dist/assets/{WorkflowPreview-DKlt4Yv2.js → WorkflowPreview-DDD47V5y.js} +1 -1
  81. package/dist/assets/{WorkflowsView-B8AX9T7c.js → WorkflowsView-A_2DIum0.js} +633 -272
  82. package/dist/assets/{WorkflowsView-Dc4DNgGT.css → WorkflowsView-JN0Hvhvt.css} +323 -26
  83. package/dist/assets/{easyAiWorkflowUtils-BeiAbGC2.js → easyAiWorkflowUtils-qtdB9CeQ.js} +1 -1
  84. package/dist/assets/{global-link-actions-DeB7eHyR.js → global-link-actions-D2_SnpTc.js} +1 -1
  85. package/dist/assets/{import-curl-C7cTqHyb.js → import-curl-Bm8BI4Ms.js} +1 -1
  86. package/dist/assets/{index-CkwX7P7C.js → index-CnJ6KvXD.js} +1 -1
  87. package/dist/assets/{index-DSYFXmvJ.js → index-DkwrpQEB.js} +3391 -3352
  88. package/dist/assets/{index-CKK_xS1q.css → index-DvUG3hgI.css} +355 -148
  89. package/dist/assets/{pickBy-BHWEuElj.js → pickBy-4c9jgxg1.js} +1 -1
  90. package/dist/assets/{pushConnection.store-BZc1Uu8B.js → pushConnection.store-DAf-xv0B.js} +1 -1
  91. package/dist/assets/{templateActions-CzrfZkNs.js → templateActions-DhuUlB_y.js} +1 -1
  92. package/dist/assets/{useBeforeUnload-7dWWMCaC.js → useBeforeUnload-B-rNKRVu.js} +1 -1
  93. package/dist/assets/{useCanvasMapping-CM-3KDoy.js → useCanvasMapping-BE9PMjep.js} +4252 -279
  94. package/dist/assets/{useCanvasMapping-Bb0rYy8s.css → useCanvasMapping-CkNBF2SE.css} +184 -45
  95. package/dist/assets/{useCanvasOperations-C8HcBhlE.js → useCanvasOperations-BYt9MoCZ.js} +219 -21
  96. package/dist/assets/{useExecutionDebugging-CO_W_RS3.js → useExecutionDebugging-eHQMFoAz.js} +1 -1
  97. package/dist/assets/{useExecutionHelpers-DKm2JOsm.js → useExecutionHelpers-DTlfzIbO.js} +1 -1
  98. package/dist/assets/{useImportCurlCommand-CA75qM-Y.js → useImportCurlCommand-CWfidUYH.js} +2 -2
  99. package/dist/assets/{usePinnedData-CX8CCdD1.js → usePinnedData-cAEPUGIg.js} +1 -1
  100. package/dist/assets/{usePushConnection-CArtQ7pf.js → usePushConnection-De7r5t9d.js} +4 -4
  101. package/dist/assets/{useRunWorkflow-BsB1hrcR.js → useRunWorkflow-Cr62-QBr.js} +193 -18
  102. package/dist/assets/{useTestDefinitionForm-DgumxLYU.js → useTestDefinitionForm-wWVotwCR.js} +1 -1
  103. package/dist/assets/{useWorkflowActivate-C_9fNHFS.js → useWorkflowActivate-COcGS4jx.js} +1 -1
  104. package/dist/index.html +2 -2
  105. package/package.json +1 -1
  106. package/tsconfig.json +8 -12
  107. package/vite.config.mts +17 -16
  108. package/dist/assets/CollectionParameter-C8EYd2H8.js +0 -4
  109. /package/dist/{public/tree-sitter-bash.wasm → tree-sitter-bash.wasm} +0 -0
  110. /package/dist/{public/tree-sitter.wasm → tree-sitter.wasm} +0 -0
@@ -1,11 +1,11 @@
1
- import { d as defineComponent, W as useRoute, b as useRouter, q as computed, g4 as ProjectTypes, V as VIEWS, m as resolveComponent, c as openBlock, h as createElementBlock, i as createVNode, w as withCtx, n as normalizeClass, k as createTextVNode, t as toDisplayString, j as createBaseVNode, l as unref, J as withModifiers, aS as createSlots, e as createBlock, f as createCommentVNode, g as useI18n, cz as _sfc_main$3, g5 as __unplugin_components_0$1, _ as _export_sfc, a as useToast, p as useSettingsStore, L as useUIStore, u as useUsersStore, U as useWorkflowsStore, a2 as useProjectsStore, am as getResourcePermissions, dJ as dateFormat, g6 as ResourceType, ax as withDirectives, ay as vShow, ac as WORKFLOW_SHARE_MODAL_KEY, aj as DUPLICATE_MODAL_KEY, af as MODAL_CONFIRM, g7 as PROJECT_MOVE_RESOURCE_MODAL, al as useMessage, ak as useTelemetry, a1 as useSourceControlStore, au as usePostHog, E as useTagsStore, a4 as useDocumentTitle, K as useDebounce, r as ref, g8 as DEFAULT_WORKFLOW_PAGE_SIZE, a9 as EnterpriseEditionFeature, g9 as EASY_AI_WORKFLOW_EXPERIMENT, I as watch, o as onMounted, y as onBeforeUnmount, A as debounce, fV as N8nIcon, fU as N8nText, cE as N8nHeading, ga as N8nCard, cT as N8nInputLabel, a8 as _sfc_main$4, gb as N8nSelect, F as Fragment, B as renderList, gc as _sfc_main$5, D as createEventBus, bH as AI_CREDITS_EXPERIMENT } from "./index-DSYFXmvJ.js";
2
- import { R as ResourcesListLayout } from "./ResourcesListLayout-DgwDLCvq.js";
3
- import { W as WorkflowActivator } from "./WorkflowActivator-Zsg0lNt1.js";
4
- import { P as ProjectCardBadge } from "./ProjectCardBadge-DY9PI-lv.js";
5
- import { P as ProjectHeader } from "./ProjectHeader-B1QbGLAy.js";
6
- import { g as getEasyAiWorkflowJson } from "./easyAiWorkflowUtils-BeiAbGC2.js";
7
- import "./useWorkflowActivate-C_9fNHFS.js";
8
- import "./ProjectCreateResource-icMXxLmn.js";
1
+ import { d as defineComponent, W as useRoute, b as useRouter, q as computed, g9 as ProjectTypes, V as VIEWS, m as resolveComponent, c as openBlock, h as createElementBlock, i as createVNode, w as withCtx, n as normalizeClass, k as createTextVNode, t as toDisplayString, j as createBaseVNode, l as unref, J as withModifiers, aT as createSlots, e as createBlock, f as createCommentVNode, g as useI18n, cB as _sfc_main$4, ga as __unplugin_components_0$1, _ as _export_sfc, a2 as useProjectsStore, a as useToast, p as useSettingsStore, L as useUIStore, u as useUsersStore, U as useWorkflowsStore, am as getResourcePermissions, dS as dateFormat, gb as ResourceType, ax as withDirectives, ay as vShow, ac as WORKFLOW_SHARE_MODAL_KEY, aj as DUPLICATE_MODAL_KEY, af as MODAL_CONFIRM, gc as PROJECT_MOVE_RESOURCE_MODAL, al as useMessage, ak as useTelemetry, S as defineStore, T as STORES, $ as useRootStore, r as ref, gd as createFolder, ge as getFolderPath, gf as getWorkflowsAndFolders, a1 as useSourceControlStore, au as usePostHog, E as useTagsStore, a4 as useDocumentTitle, K as useDebounce, gg as DEFAULT_WORKFLOW_PAGE_SIZE, a9 as EnterpriseEditionFeature, gh as EASY_AI_WORKFLOW_EXPERIMENT, I as watch, o as onMounted, y as onBeforeUnmount, A as debounce, fZ as N8nIcon, cG as N8nHeading, fY as N8nText, gi as N8nCard, cV as N8nInputLabel, a8 as _sfc_main$5, gj as N8nSelect, F as Fragment, B as renderList, gk as _sfc_main$6, D as createEventBus, bI as AI_CREDITS_EXPERIMENT } from "./index-DkwrpQEB.js";
2
+ import { R as ResourcesListLayout } from "./ResourcesListLayout--Bt5VWxW.js";
3
+ import { W as WorkflowActivator } from "./WorkflowActivator-Dio1FWuT.js";
4
+ import { P as ProjectCardBadge } from "./ProjectCardBadge-CukEqaMt.js";
5
+ import { P as ProjectHeader } from "./ProjectHeader-DyqSSbiB.js";
6
+ import { g as getEasyAiWorkflowJson } from "./easyAiWorkflowUtils-qtdB9CeQ.js";
7
+ import "./useWorkflowActivate-COcGS4jx.js";
8
+ import "./ProjectCreateResource-CtheSWks.js";
9
9
  const FOLDER_LIST_ITEM_ACTIONS = {
10
10
  OPEN: "open",
11
11
  CREATE: "create",
@@ -16,11 +16,12 @@ const FOLDER_LIST_ITEM_ACTIONS = {
16
16
  TAGS: "manage_tags",
17
17
  DELETE: "delete"
18
18
  };
19
- const _sfc_main$2 = /* @__PURE__ */ defineComponent({
19
+ const _sfc_main$3 = /* @__PURE__ */ defineComponent({
20
20
  __name: "FolderCard",
21
21
  props: {
22
22
  data: {},
23
- actions: { default: () => [] }
23
+ actions: { default: () => [] },
24
+ breadcrumbs: {}
24
25
  },
25
26
  emits: ["action", "folderOpened"],
26
27
  setup(__props, { emit: __emit }) {
@@ -29,17 +30,6 @@ const _sfc_main$2 = /* @__PURE__ */ defineComponent({
29
30
  const route = useRoute();
30
31
  const router = useRouter();
31
32
  const emit = __emit;
32
- const breadCrumbsItems = computed(() => {
33
- if (props.data.parentFolder) {
34
- return [
35
- {
36
- id: props.data.parentFolder.id,
37
- label: props.data.parentFolder.name
38
- }
39
- ];
40
- }
41
- return [];
42
- });
43
33
  const projectIcon = computed(() => {
44
34
  const defaultIcon = { type: "icon", value: "layer-group" };
45
35
  if (props.data.homeProject?.type === ProjectTypes.Personal) {
@@ -85,7 +75,7 @@ const _sfc_main$2 = /* @__PURE__ */ defineComponent({
85
75
  const _component_n8n_icon = resolveComponent("n8n-icon");
86
76
  const _component_n8n_heading = resolveComponent("n8n-heading");
87
77
  const _component_n8n_text = resolveComponent("n8n-text");
88
- const _component_TimeAgo = _sfc_main$3;
78
+ const _component_TimeAgo = _sfc_main$4;
89
79
  const _component_ProjectIcon = __unplugin_components_0$1;
90
80
  const _component_n8n_link = resolveComponent("n8n-link");
91
81
  const _component_n8n_breadcrumbs = resolveComponent("n8n-breadcrumbs");
@@ -129,7 +119,7 @@ const _sfc_main$2 = /* @__PURE__ */ defineComponent({
129
119
  createVNode(_component_n8n_text, {
130
120
  size: "small",
131
121
  color: "text-light",
132
- class: normalizeClass(_ctx.$style["info-cell"]),
122
+ class: normalizeClass([_ctx.$style["info-cell"], _ctx.$style["info-cell--workflow-count"]]),
133
123
  "data-test-id": "folder-card-workflow-count"
134
124
  }, {
135
125
  default: withCtx(() => [
@@ -140,7 +130,7 @@ const _sfc_main$2 = /* @__PURE__ */ defineComponent({
140
130
  createVNode(_component_n8n_text, {
141
131
  size: "small",
142
132
  color: "text-light",
143
- class: normalizeClass(_ctx.$style["info-cell"]),
133
+ class: normalizeClass([_ctx.$style["info-cell"], _ctx.$style["info-cell--updated"]]),
144
134
  "data-test-id": "folder-card-last-updated"
145
135
  }, {
146
136
  default: withCtx(() => [
@@ -154,7 +144,7 @@ const _sfc_main$2 = /* @__PURE__ */ defineComponent({
154
144
  createVNode(_component_n8n_text, {
155
145
  size: "small",
156
146
  color: "text-light",
157
- class: normalizeClass(_ctx.$style["info-cell"]),
147
+ class: normalizeClass([_ctx.$style["info-cell"], _ctx.$style["info-cell--created"]]),
158
148
  "data-test-id": "folder-card-created"
159
149
  }, {
160
150
  default: withCtx(() => [
@@ -173,49 +163,54 @@ const _sfc_main$2 = /* @__PURE__ */ defineComponent({
173
163
  onClick: _cache[0] || (_cache[0] = withModifiers(() => {
174
164
  }, ["prevent"]))
175
165
  }, [
176
- createVNode(_component_n8n_breadcrumbs, {
177
- items: breadCrumbsItems.value,
178
- "path-truncated": true,
179
- "show-border": true,
180
- "highlight-last-item": false,
181
- theme: "small",
182
- "data-test-id": "folder-card-breadcrumbs",
183
- onItemSelected: onBreadcrumbsItemClick
184
- }, createSlots({ _: 2 }, [
185
- _ctx.data.homeProject ? {
186
- name: "prepend",
187
- fn: withCtx(() => [
188
- createBaseVNode("div", {
189
- class: normalizeClass(_ctx.$style["home-project"])
190
- }, [
191
- createVNode(_component_n8n_link, {
192
- to: `/projects/${_ctx.data.homeProject.id}`
193
- }, {
194
- default: withCtx(() => [
195
- createVNode(_component_ProjectIcon, {
196
- icon: projectIcon.value,
197
- "border-less": true,
198
- size: "mini"
199
- }, null, 8, ["icon"]),
200
- createVNode(_component_n8n_text, {
201
- size: "small",
202
- compact: true,
203
- bold: true,
204
- color: "text-base"
205
- }, {
206
- default: withCtx(() => [
207
- createTextVNode(toDisplayString(projectName.value), 1)
208
- ]),
209
- _: 1
210
- })
211
- ]),
212
- _: 1
213
- }, 8, ["to"])
214
- ], 2)
215
- ]),
216
- key: "0"
217
- } : void 0
218
- ]), 1032, ["items"]),
166
+ createBaseVNode("div", {
167
+ class: normalizeClass(_ctx.$style.breadcrumbs)
168
+ }, [
169
+ createVNode(_component_n8n_breadcrumbs, {
170
+ items: _ctx.breadcrumbs.visibleItems,
171
+ "hidden-items": _ctx.breadcrumbs.hiddenItems,
172
+ "path-truncated": _ctx.breadcrumbs.visibleItems[0]?.parentFolder,
173
+ "show-border": true,
174
+ "highlight-last-item": false,
175
+ theme: "small",
176
+ "data-test-id": "folder-card-breadcrumbs",
177
+ onItemSelected: onBreadcrumbsItemClick
178
+ }, createSlots({ _: 2 }, [
179
+ _ctx.data.homeProject ? {
180
+ name: "prepend",
181
+ fn: withCtx(() => [
182
+ createBaseVNode("div", {
183
+ class: normalizeClass(_ctx.$style["home-project"])
184
+ }, [
185
+ createVNode(_component_n8n_link, {
186
+ to: `/projects/${_ctx.data.homeProject.id}`
187
+ }, {
188
+ default: withCtx(() => [
189
+ createVNode(_component_ProjectIcon, {
190
+ icon: projectIcon.value,
191
+ "border-less": true,
192
+ size: "mini"
193
+ }, null, 8, ["icon"]),
194
+ createVNode(_component_n8n_text, {
195
+ size: "small",
196
+ compact: true,
197
+ bold: true,
198
+ color: "text-base"
199
+ }, {
200
+ default: withCtx(() => [
201
+ createTextVNode(toDisplayString(projectName.value), 1)
202
+ ]),
203
+ _: 1
204
+ })
205
+ ]),
206
+ _: 1
207
+ }, 8, ["to"])
208
+ ], 2)
209
+ ]),
210
+ key: "0"
211
+ } : void 0
212
+ ]), 1032, ["items", "hidden-items", "path-truncated"])
213
+ ], 2),
219
214
  _ctx.actions.length ? (openBlock(), createBlock(_component_n8n_action_toggle, {
220
215
  key: 0,
221
216
  actions: _ctx.actions,
@@ -234,14 +229,103 @@ const _sfc_main$2 = /* @__PURE__ */ defineComponent({
234
229
  };
235
230
  }
236
231
  });
237
- const card = "_card_af2zr_123";
238
- const style0$2 = {
232
+ const card = "_card_v01dx_123";
233
+ const style0$3 = {
239
234
  card,
240
- "folder-icon": "_folder-icon_af2zr_131",
241
- "card-footer": "_card-footer_af2zr_142",
242
- "info-cell": "_info-cell_af2zr_146",
243
- "card-actions": "_card-actions_af2zr_151",
244
- "home-project": "_home-project_af2zr_156"
235
+ "folder-icon": "_folder-icon_v01dx_131",
236
+ "card-footer": "_card-footer_v01dx_142",
237
+ "info-cell": "_info-cell_v01dx_146",
238
+ "card-actions": "_card-actions_v01dx_151",
239
+ "home-project": "_home-project_v01dx_156",
240
+ "info-cell--created": "_info-cell--created_v01dx_176"
241
+ };
242
+ const cssModules$3 = {
243
+ "$style": style0$3
244
+ };
245
+ const __unplugin_components_1 = /* @__PURE__ */ _export_sfc(_sfc_main$3, [["__cssModules", cssModules$3]]);
246
+ const _sfc_main$2 = /* @__PURE__ */ defineComponent({
247
+ __name: "FolderBreadcrumbs",
248
+ props: {
249
+ actions: {},
250
+ breadcrumbs: {}
251
+ },
252
+ emits: ["itemSelected", "action"],
253
+ setup(__props, { emit: __emit }) {
254
+ const emit = __emit;
255
+ const i18n = useI18n();
256
+ const projectsStore = useProjectsStore();
257
+ const currentProject = computed(() => projectsStore.currentProject);
258
+ const projectName = computed(() => {
259
+ if (currentProject.value?.type === ProjectTypes.Personal) {
260
+ return i18n.baseText("projects.menu.personal");
261
+ }
262
+ return currentProject.value?.name;
263
+ });
264
+ const onItemSelect = (item) => {
265
+ emit("itemSelected", item);
266
+ };
267
+ const onAction = (action) => {
268
+ emit("action", action);
269
+ };
270
+ return (_ctx, _cache) => {
271
+ const _component_N8nText = resolveComponent("N8nText");
272
+ const _component_n8n_link = resolveComponent("n8n-link");
273
+ const _component_n8n_breadcrumbs = resolveComponent("n8n-breadcrumbs");
274
+ const _component_n8n_action_toggle = resolveComponent("n8n-action-toggle");
275
+ return openBlock(), createElementBlock("div", {
276
+ class: normalizeClass(_ctx.$style.container)
277
+ }, [
278
+ _ctx.breadcrumbs.visibleItems ? (openBlock(), createBlock(_component_n8n_breadcrumbs, {
279
+ key: 0,
280
+ items: _ctx.breadcrumbs.visibleItems,
281
+ "highlight-last-item": false,
282
+ "path-truncated": _ctx.breadcrumbs.visibleItems[0].parentFolder,
283
+ "hidden-items": _ctx.breadcrumbs.hiddenItems,
284
+ "data-test-id": "folder-card-breadcrumbs",
285
+ onItemSelected: onItemSelect
286
+ }, createSlots({ _: 2 }, [
287
+ currentProject.value ? {
288
+ name: "prepend",
289
+ fn: withCtx(() => [
290
+ createBaseVNode("div", {
291
+ class: normalizeClass(_ctx.$style["home-project"])
292
+ }, [
293
+ createVNode(_component_n8n_link, {
294
+ to: `/projects/${currentProject.value.id}`
295
+ }, {
296
+ default: withCtx(() => [
297
+ createVNode(_component_N8nText, {
298
+ size: "large",
299
+ color: "text-base"
300
+ }, {
301
+ default: withCtx(() => [
302
+ createTextVNode(toDisplayString(projectName.value), 1)
303
+ ]),
304
+ _: 1
305
+ })
306
+ ]),
307
+ _: 1
308
+ }, 8, ["to"])
309
+ ], 2)
310
+ ]),
311
+ key: "0"
312
+ } : void 0
313
+ ]), 1032, ["items", "path-truncated", "hidden-items"])) : createCommentVNode("", true),
314
+ _ctx.breadcrumbs.visibleItems ? (openBlock(), createBlock(_component_n8n_action_toggle, {
315
+ key: 1,
316
+ actions: _ctx.actions,
317
+ theme: "dark",
318
+ "data-test-id": "folder-breadcrumbs-actions",
319
+ onAction
320
+ }, null, 8, ["actions"])) : createCommentVNode("", true)
321
+ ], 2);
322
+ };
323
+ }
324
+ });
325
+ const container = "_container_1e41k_123";
326
+ const style0$2 = {
327
+ container,
328
+ "home-project": "_home-project_1e41k_128"
245
329
  };
246
330
  const cssModules$2 = {
247
331
  "$style": style0$2
@@ -252,6 +336,7 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
252
336
  __name: "WorkflowCard",
253
337
  props: {
254
338
  data: {},
339
+ breadcrumbs: {},
255
340
  readOnly: { type: Boolean, default: false },
256
341
  workflowListEventBus: { default: void 0 }
257
342
  },
@@ -318,17 +403,6 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
318
403
  `d mmmm${String(props.data.createdAt).startsWith(currentYear) ? "" : ", yyyy"}`
319
404
  );
320
405
  });
321
- const breadCrumbsItems = computed(() => {
322
- if (props.data.parentFolder) {
323
- return [
324
- {
325
- id: props.data.parentFolder.id,
326
- label: props.data.parentFolder.name
327
- }
328
- ];
329
- }
330
- return [];
331
- });
332
406
  const projectIcon = computed(() => {
333
407
  const defaultIcon = { type: "icon", value: "layer-group" };
334
408
  if (props.data.homeProject?.type === ProjectTypes.Personal) {
@@ -499,49 +573,54 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
499
573
  "resource-type": unref(ResourceType).Workflow,
500
574
  "resource-type-label": resourceTypeLabel.value,
501
575
  "personal-project": unref(projectsStore).personalProject
502
- }, null, 8, ["class", "resource", "resource-type", "resource-type-label", "personal-project"])) : (openBlock(), createBlock(_component_n8n_breadcrumbs, {
576
+ }, null, 8, ["class", "resource", "resource-type", "resource-type-label", "personal-project"])) : (openBlock(), createElementBlock("div", {
503
577
  key: 1,
504
- items: breadCrumbsItems.value,
505
- "path-truncated": true,
506
- "show-border": true,
507
- "highlight-last-item": false,
508
- theme: "small",
509
- "data-test-id": "folder-card-breadcrumbs"
510
- }, createSlots({ _: 2 }, [
511
- _ctx.data.homeProject ? {
512
- name: "prepend",
513
- fn: withCtx(() => [
514
- createBaseVNode("div", {
515
- class: normalizeClass(_ctx.$style["home-project"])
516
- }, [
517
- createVNode(_component_n8n_link, {
518
- to: `/projects/${_ctx.data.homeProject.id}`
519
- }, {
520
- default: withCtx(() => [
521
- createVNode(_component_ProjectIcon, {
522
- icon: projectIcon.value,
523
- "border-less": true,
524
- size: "mini"
525
- }, null, 8, ["icon"]),
526
- createVNode(_component_n8n_text, {
527
- size: "small",
528
- compact: true,
529
- bold: true,
530
- color: "text-base"
531
- }, {
532
- default: withCtx(() => [
533
- createTextVNode(toDisplayString(projectName.value), 1)
534
- ]),
535
- _: 1
536
- })
537
- ]),
538
- _: 1
539
- }, 8, ["to"])
540
- ], 2)
541
- ]),
542
- key: "0"
543
- } : void 0
544
- ]), 1032, ["items"])),
578
+ class: normalizeClass(_ctx.$style.breadcrumbs)
579
+ }, [
580
+ createVNode(_component_n8n_breadcrumbs, {
581
+ items: _ctx.breadcrumbs.visibleItems,
582
+ "hidden-items": _ctx.breadcrumbs.hiddenItems,
583
+ "path-truncated": _ctx.breadcrumbs.visibleItems[0]?.parentFolder,
584
+ "show-border": true,
585
+ "highlight-last-item": false,
586
+ theme: "small",
587
+ "data-test-id": "folder-card-breadcrumbs"
588
+ }, createSlots({ _: 2 }, [
589
+ _ctx.data.homeProject ? {
590
+ name: "prepend",
591
+ fn: withCtx(() => [
592
+ createBaseVNode("div", {
593
+ class: normalizeClass(_ctx.$style["home-project"])
594
+ }, [
595
+ createVNode(_component_n8n_link, {
596
+ to: `/projects/${_ctx.data.homeProject.id}`
597
+ }, {
598
+ default: withCtx(() => [
599
+ createVNode(_component_ProjectIcon, {
600
+ icon: projectIcon.value,
601
+ "border-less": true,
602
+ size: "mini"
603
+ }, null, 8, ["icon"]),
604
+ createVNode(_component_n8n_text, {
605
+ size: "small",
606
+ compact: true,
607
+ bold: true,
608
+ color: "text-base"
609
+ }, {
610
+ default: withCtx(() => [
611
+ createTextVNode(toDisplayString(projectName.value), 1)
612
+ ]),
613
+ _: 1
614
+ })
615
+ ]),
616
+ _: 1
617
+ }, 8, ["to"])
618
+ ], 2)
619
+ ]),
620
+ key: "0"
621
+ } : void 0
622
+ ]), 1032, ["items", "hidden-items", "path-truncated"])
623
+ ], 2)),
545
624
  createVNode(WorkflowActivator, {
546
625
  class: "mr-s",
547
626
  "workflow-active": _ctx.data.active,
@@ -569,7 +648,7 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
569
648
  default: withCtx(() => [
570
649
  withDirectives(createBaseVNode("span", null, [
571
650
  createTextVNode(toDisplayString(unref(locale).baseText("workflows.item.updated")) + " ", 1),
572
- createVNode(_sfc_main$3, {
651
+ createVNode(_sfc_main$4, {
573
652
  date: String(_ctx.data.updatedAt)
574
653
  }, null, 8, ["date"]),
575
654
  _cache[1] || (_cache[1] = createTextVNode(" | "))
@@ -601,23 +680,92 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
601
680
  };
602
681
  }
603
682
  });
604
- const cardLink = "_cardLink_1y37x_123";
605
- const cardHeading = "_cardHeading_1y37x_133";
606
- const cardDescription = "_cardDescription_1y37x_142";
607
- const cardActions = "_cardActions_1y37x_149";
608
- const cardBadge = "_cardBadge_1y37x_176";
683
+ const cardLink = "_cardLink_dsqjo_123";
684
+ const cardHeading = "_cardHeading_dsqjo_133";
685
+ const cardDescription = "_cardDescription_dsqjo_142";
686
+ const cardActions = "_cardActions_dsqjo_149";
687
+ const cardBadge = "_cardBadge_dsqjo_176";
688
+ const breadcrumbs = "_breadcrumbs_dsqjo_177";
609
689
  const style0$1 = {
610
690
  cardLink,
611
691
  cardHeading,
612
692
  cardDescription,
613
693
  cardActions,
614
- "home-project": "_home-project_1y37x_159",
615
- cardBadge
694
+ "home-project": "_home-project_dsqjo_159",
695
+ cardBadge,
696
+ breadcrumbs
616
697
  };
617
698
  const cssModules$1 = {
618
699
  "$style": style0$1
619
700
  };
620
701
  const WorkflowCard = /* @__PURE__ */ _export_sfc(_sfc_main$1, [["__cssModules", cssModules$1]]);
702
+ const useFoldersStore = defineStore(STORES.FOLDERS, () => {
703
+ const rootStore = useRootStore();
704
+ const totalWorkflowCount = ref(0);
705
+ const breadcrumbsCache = ref({});
706
+ const cacheFolders = (folders) => {
707
+ folders.forEach((folder) => {
708
+ if (!breadcrumbsCache.value[folder.id]) {
709
+ breadcrumbsCache.value[folder.id] = {
710
+ id: folder.id,
711
+ name: folder.name,
712
+ parentFolder: folder.parentFolder
713
+ };
714
+ }
715
+ });
716
+ };
717
+ const getCachedFolder = (folderId) => {
718
+ return breadcrumbsCache.value[folderId];
719
+ };
720
+ async function createFolder$1(name, projectId, parentFolderId) {
721
+ return await createFolder(
722
+ rootStore.restApiContext,
723
+ projectId,
724
+ name,
725
+ parentFolderId
726
+ );
727
+ }
728
+ async function getFolderPath$1(projectId, folderId) {
729
+ const tree = await getFolderPath(rootStore.restApiContext, projectId, folderId);
730
+ const forCache = extractFoldersForCache(tree);
731
+ cacheFolders(forCache);
732
+ return tree;
733
+ }
734
+ function extractFoldersForCache(items, parentFolderId) {
735
+ let result = [];
736
+ items.forEach((item) => {
737
+ result.push({
738
+ id: item.id,
739
+ name: item.name,
740
+ parentFolder: parentFolderId
741
+ });
742
+ if (item.children && item.children.length > 0) {
743
+ const childFolders = extractFoldersForCache(item.children, item.id);
744
+ result = [...result, ...childFolders];
745
+ }
746
+ });
747
+ return result;
748
+ }
749
+ async function fetchTotalWorkflowsAndFoldersCount(projectId) {
750
+ const { count } = await getWorkflowsAndFolders(
751
+ rootStore.restApiContext,
752
+ { projectId },
753
+ { skip: 0, take: 1 },
754
+ true
755
+ );
756
+ totalWorkflowCount.value = count;
757
+ return count;
758
+ }
759
+ return {
760
+ fetchTotalWorkflowsAndFoldersCount,
761
+ breadcrumbsCache,
762
+ cacheFolders,
763
+ getCachedFolder,
764
+ createFolder: createFolder$1,
765
+ getFolderPath: getFolderPath$1,
766
+ totalWorkflowCount
767
+ };
768
+ });
621
769
  const _hoisted_1 = { class: "text-center mt-s" };
622
770
  const _hoisted_2 = {
623
771
  key: 0,
@@ -628,8 +776,8 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
628
776
  __name: "WorkflowsView",
629
777
  setup(__props) {
630
778
  const StatusFilter = {
631
- ACTIVE: true,
632
- DEACTIVATED: false,
779
+ ACTIVE: "active",
780
+ DEACTIVATED: "deactivated",
633
781
  ALL: ""
634
782
  };
635
783
  const WORKFLOWS_SORT_MAP = {
@@ -641,6 +789,8 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
641
789
  const i18n = useI18n();
642
790
  const route = useRoute();
643
791
  const router = useRouter();
792
+ const message = useMessage();
793
+ const toast = useToast();
644
794
  const sourceControlStore = useSourceControlStore();
645
795
  const usersStore = useUsersStore();
646
796
  const workflowsStore = useWorkflowsStore();
@@ -650,9 +800,11 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
650
800
  const telemetry = useTelemetry();
651
801
  const uiStore = useUIStore();
652
802
  const tagsStore = useTagsStore();
803
+ const foldersStore = useFoldersStore();
653
804
  const documentTitle = useDocumentTitle();
654
805
  const { callDebounced } = useDebounce();
655
806
  const loading = ref(false);
807
+ const breadcrumbsLoading = ref(false);
656
808
  const filters = ref({
657
809
  search: "",
658
810
  homeProject: "",
@@ -662,25 +814,26 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
662
814
  const workflowListEventBus = createEventBus();
663
815
  const workflowsAndFolders = ref([]);
664
816
  const easyAICalloutVisible = ref(true);
665
- const currentFolder = ref(void 0);
666
817
  const currentPage = ref(1);
667
818
  const pageSize = ref(DEFAULT_WORKFLOW_PAGE_SIZE);
668
819
  const currentSort = ref("updatedAt:desc");
669
- const folderCardActions = ref([
820
+ const currentFolderId = ref(null);
821
+ const folderActions = ref([
670
822
  {
671
823
  label: "Open",
672
824
  value: FOLDER_LIST_ITEM_ACTIONS.OPEN,
673
- disabled: false
825
+ disabled: false,
826
+ onlyAvailableOn: "card"
674
827
  },
675
828
  {
676
829
  label: "Create Folder",
677
830
  value: FOLDER_LIST_ITEM_ACTIONS.CREATE,
678
- disabled: true
831
+ disabled: false
679
832
  },
680
833
  {
681
834
  label: "Create Workflow",
682
835
  value: FOLDER_LIST_ITEM_ACTIONS.CREATE_WORKFLOW,
683
- disabled: true
836
+ disabled: false
684
837
  },
685
838
  {
686
839
  label: "Rename",
@@ -708,6 +861,16 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
708
861
  disabled: true
709
862
  }
710
863
  ]);
864
+ const folderCardActions = computed(
865
+ () => folderActions.value.filter(
866
+ (action) => !action.onlyAvailableOn || action.onlyAvailableOn === "card"
867
+ )
868
+ );
869
+ const mainBreadcrumbsActions = computed(
870
+ () => folderActions.value.filter(
871
+ (action) => !action.onlyAvailableOn || action.onlyAvailableOn === "mainBreadcrumbs"
872
+ )
873
+ );
711
874
  const readOnlyEnv = computed(() => sourceControlStore.preferences.branchReadOnly);
712
875
  const foldersEnabled = computed(() => settingsStore.settings.folders.enabled);
713
876
  const isOverviewPage = computed(() => route.name === VIEWS.WORKFLOWS);
@@ -716,14 +879,8 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
716
879
  () => settingsStore.isEnterpriseFeatureEnabled[EnterpriseEditionFeature.Sharing]
717
880
  );
718
881
  const showFolders = computed(() => foldersEnabled.value && !isOverviewPage.value);
719
- const mainBreadcrumbsItems = computed(() => {
720
- if (!showFolders.value || !currentFolder.value) return;
721
- const items = [];
722
- items.push({
723
- id: currentFolder.value.id,
724
- label: currentFolder.value.name
725
- });
726
- return items;
882
+ const currentFolder = computed(() => {
883
+ return currentFolderId.value ? foldersStore.breadcrumbsCache[currentFolderId.value] : null;
727
884
  });
728
885
  const currentProject = computed(() => projectsStore.currentProject);
729
886
  const projectName = computed(() => {
@@ -732,6 +889,12 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
732
889
  }
733
890
  return currentProject.value?.name;
734
891
  });
892
+ const currentParentName = computed(() => {
893
+ if (currentFolder.value) {
894
+ return currentFolder.value.name;
895
+ }
896
+ return projectName.value;
897
+ });
735
898
  const workflowListResources = computed(() => {
736
899
  const resources = (workflowsAndFolders.value || []).map((resource) => {
737
900
  if (resource.resource === "folder") {
@@ -807,12 +970,14 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
807
970
  watch(
808
971
  () => route.params?.folderId,
809
972
  async (newVal) => {
810
- if (!newVal) {
811
- currentFolder.value = void 0;
812
- }
973
+ currentFolderId.value = newVal;
813
974
  await fetchWorkflows();
814
975
  }
815
976
  );
977
+ sourceControlStore.$onAction(({ name, after }) => {
978
+ if (name !== "pullWorkfolder") return;
979
+ after(async () => await initialize());
980
+ });
816
981
  onMounted(async () => {
817
982
  documentTitle.set(i18n.baseText("workflows.heading"));
818
983
  void usersStore.showPersonalizationSurvey();
@@ -823,63 +988,28 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
823
988
  workflowListEventBus.off("resource-moved", fetchWorkflows);
824
989
  workflowListEventBus.off("workflow-duplicated", fetchWorkflows);
825
990
  });
826
- const onFiltersUpdated = async () => {
827
- currentPage.value = 1;
828
- saveFiltersOnQueryString();
829
- await fetchWorkflows();
830
- };
831
- const onSearchUpdated = async (search) => {
832
- currentPage.value = 1;
833
- saveFiltersOnQueryString();
834
- if (search) {
835
- await callDebounced(fetchWorkflows, { debounceTime: 500, trailing: true });
836
- } else {
837
- await fetchWorkflows();
838
- }
839
- };
840
- const addWorkflow = () => {
841
- uiStore.nodeViewInitialized = false;
842
- void router.push({
843
- name: VIEWS.NEW_WORKFLOW,
844
- query: { projectId: route.params?.projectId }
845
- });
846
- telemetry.track("User clicked add workflow button", {
847
- source: "Workflows list"
848
- });
849
- trackEmptyCardClick("blank");
850
- };
851
- const trackEmptyCardClick = (option) => {
852
- telemetry.track("User clicked empty page option", {
853
- option
854
- });
855
- };
856
991
  const initialize = async () => {
857
992
  loading.value = true;
858
- currentFolder.value = void 0;
859
993
  await setFiltersFromQueryString();
994
+ if (!route.params.folderId) {
995
+ currentFolderId.value = null;
996
+ }
860
997
  const [, resourcesPage] = await Promise.all([
861
998
  usersStore.fetchUsers(),
862
999
  fetchWorkflows(),
863
1000
  workflowsStore.fetchActiveWorkflows()
864
1001
  ]);
1002
+ breadcrumbsLoading.value = false;
865
1003
  workflowsAndFolders.value = resourcesPage;
866
1004
  loading.value = false;
867
1005
  };
868
- const setCurrentPage = async (page) => {
869
- currentPage.value = page;
870
- await fetchWorkflows();
871
- };
872
- const setPageSize = async (size) => {
873
- pageSize.value = size;
874
- await fetchWorkflows();
875
- };
876
1006
  const fetchWorkflows = async () => {
877
1007
  const delayedLoading = debounce(() => {
878
1008
  loading.value = true;
879
1009
  }, 300);
880
1010
  const routeProjectId = route.params?.projectId;
881
1011
  const homeProjectFilter = filters.value.homeProject || void 0;
882
- const parentFolder = route.params?.folderId || "0";
1012
+ const parentFolder = route.params?.folderId || void 0;
883
1013
  const fetchedResources = await workflowsStore.fetchWorkflowsPage(
884
1014
  routeProjectId ?? homeProjectFilter,
885
1015
  currentPage.value,
@@ -887,18 +1017,61 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
887
1017
  currentSort.value,
888
1018
  {
889
1019
  name: filters.value.search || void 0,
890
- active: filters.value.status ? Boolean(filters.value.status) : void 0,
1020
+ active: filters.value.status === StatusFilter.ALL ? void 0 : filters.value.status === StatusFilter.ACTIVE,
891
1021
  tags: filters.value.tags.map((tagId) => tagsStore.tagsById[tagId]?.name),
892
- parentFolderId: parentFolder
1022
+ parentFolderId: parentFolder ?? "0"
1023
+ // 0 is the root folder in the API
893
1024
  },
894
1025
  showFolders.value
895
1026
  );
896
- currentFolder.value = fetchedResources[0]?.parentFolder;
1027
+ foldersStore.cacheFolders(
1028
+ fetchedResources.filter((resource) => resource.resource === "folder").map((r) => ({ id: r.id, name: r.name, parentFolder: r.parentFolder?.id }))
1029
+ );
1030
+ const isCurrentFolderCached = foldersStore.breadcrumbsCache[parentFolder ?? ""] !== void 0;
1031
+ const needToFetchFolderPath = parentFolder && !isCurrentFolderCached && routeProjectId;
1032
+ if (needToFetchFolderPath) {
1033
+ breadcrumbsLoading.value = true;
1034
+ await foldersStore.getFolderPath(routeProjectId, parentFolder);
1035
+ currentFolderId.value = parentFolder;
1036
+ breadcrumbsLoading.value = false;
1037
+ }
1038
+ await foldersStore.fetchTotalWorkflowsAndFoldersCount(routeProjectId);
897
1039
  delayedLoading.cancel();
898
1040
  workflowsAndFolders.value = fetchedResources;
899
1041
  loading.value = false;
900
1042
  return fetchedResources;
901
1043
  };
1044
+ const onSortUpdated = async (sort) => {
1045
+ currentSort.value = WORKFLOWS_SORT_MAP[sort] ?? "updatedAt:desc";
1046
+ if (currentSort.value !== "updatedAt:desc") {
1047
+ void router.replace({ query: { ...route.query, sort } });
1048
+ } else {
1049
+ void router.replace({ query: { ...route.query, sort: void 0 } });
1050
+ }
1051
+ await fetchWorkflows();
1052
+ };
1053
+ const onFiltersUpdated = async () => {
1054
+ currentPage.value = 1;
1055
+ saveFiltersOnQueryString();
1056
+ await fetchWorkflows();
1057
+ };
1058
+ const onSearchUpdated = async (search) => {
1059
+ currentPage.value = 1;
1060
+ saveFiltersOnQueryString();
1061
+ if (search) {
1062
+ await callDebounced(fetchWorkflows, { debounceTime: 500, trailing: true });
1063
+ } else {
1064
+ await fetchWorkflows();
1065
+ }
1066
+ };
1067
+ const setCurrentPage = async (page) => {
1068
+ currentPage.value = page;
1069
+ await fetchWorkflows();
1070
+ };
1071
+ const setPageSize = async (size) => {
1072
+ pageSize.value = size;
1073
+ await fetchWorkflows();
1074
+ };
902
1075
  const onClickTag = async (tagId) => {
903
1076
  if (!filters.value.tags.includes(tagId)) {
904
1077
  filters.value.tags.push(tagId);
@@ -914,8 +1087,8 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
914
1087
  } else {
915
1088
  delete currentQuery.search;
916
1089
  }
917
- if (typeof filters.value.status !== "string") {
918
- currentQuery.status = filters.value.status.toString();
1090
+ if (filters.value.status !== StatusFilter.ALL) {
1091
+ currentQuery.status = (filters.value.status === StatusFilter.ACTIVE).toString();
919
1092
  } else {
920
1093
  delete currentQuery.status;
921
1094
  }
@@ -933,9 +1106,6 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
933
1106
  query: Object.keys(currentQuery).length ? currentQuery : void 0
934
1107
  });
935
1108
  };
936
- function isValidProjectId(projectId) {
937
- return projectsStore.availableProjects.some((project) => project.id === projectId);
938
- }
939
1109
  const setFiltersFromQueryString = async () => {
940
1110
  const newQuery = { ...route.query };
941
1111
  const { tags, status, search, homeProject, sort } = route.query ?? {};
@@ -969,10 +1139,10 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
969
1139
  } else {
970
1140
  delete newQuery.tags;
971
1141
  }
972
- const validStatusValues = [StatusFilter.ACTIVE.toString(), StatusFilter.DEACTIVATED.toString()];
1142
+ const validStatusValues = ["true", "false"];
973
1143
  if (isValidString(status) && validStatusValues.includes(status)) {
974
1144
  newQuery.status = status;
975
- filters.value.status = status === "true";
1145
+ filters.value.status = status === "true" ? StatusFilter.ACTIVE : StatusFilter.DEACTIVATED;
976
1146
  } else {
977
1147
  delete newQuery.status;
978
1148
  }
@@ -985,10 +1155,25 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
985
1155
  }
986
1156
  void router.replace({ query: newQuery });
987
1157
  };
988
- sourceControlStore.$onAction(({ name, after }) => {
989
- if (name !== "pullWorkfolder") return;
990
- after(async () => await initialize());
991
- });
1158
+ const addWorkflow = () => {
1159
+ uiStore.nodeViewInitialized = false;
1160
+ void router.push({
1161
+ name: VIEWS.NEW_WORKFLOW,
1162
+ query: { projectId: route.params?.projectId, parentFolderId: route.params?.folderId }
1163
+ });
1164
+ telemetry.track("User clicked add workflow button", {
1165
+ source: "Workflows list"
1166
+ });
1167
+ trackEmptyCardClick("blank");
1168
+ };
1169
+ const trackEmptyCardClick = (option) => {
1170
+ telemetry.track("User clicked empty page option", {
1171
+ option
1172
+ });
1173
+ };
1174
+ function isValidProjectId(projectId) {
1175
+ return projectsStore.availableProjects.some((project) => project.id === projectId);
1176
+ }
992
1177
  const openAIWorkflow = async (source) => {
993
1178
  dismissEasyAICallout();
994
1179
  telemetry.track(
@@ -1006,21 +1191,12 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
1006
1191
  await router.push({
1007
1192
  name: VIEWS.TEMPLATE_IMPORT,
1008
1193
  params: { id: easyAiWorkflowJson.meta.templateId },
1009
- query: { fromJson: "true" }
1194
+ query: { fromJson: "true", parentFolderId: route.params.folderId }
1010
1195
  });
1011
1196
  };
1012
1197
  const dismissEasyAICallout = () => {
1013
1198
  easyAICalloutVisible.value = false;
1014
1199
  };
1015
- const onSortUpdated = async (sort) => {
1016
- currentSort.value = WORKFLOWS_SORT_MAP[sort] ?? "updatedAt:desc";
1017
- if (currentSort.value !== "updatedAt:desc") {
1018
- void router.replace({ query: { ...route.query, sort } });
1019
- } else {
1020
- void router.replace({ query: { ...route.query, sort: void 0 } });
1021
- }
1022
- await fetchWorkflows();
1023
- };
1024
1200
  const onWorkflowActiveToggle = (data) => {
1025
1201
  const workflow = workflowsAndFolders.value.find(
1026
1202
  (w) => w.id === data.id
@@ -1028,15 +1204,185 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
1028
1204
  if (!workflow) return;
1029
1205
  workflow.active = data.active;
1030
1206
  };
1031
- const onFolderOpened = (data) => {
1032
- currentFolder.value = data.folder;
1207
+ const visibleBreadcrumbsItems = computed(() => {
1208
+ if (!currentFolder.value) return [];
1209
+ const items = [];
1210
+ const parent = foldersStore.getCachedFolder(currentFolder.value.parentFolder ?? "");
1211
+ if (parent) {
1212
+ items.push({
1213
+ id: parent.id,
1214
+ label: parent.name,
1215
+ href: `/projects/${route.params.projectId}/folders/${parent.id}/workflows`,
1216
+ parentFolder: parent.parentFolder
1217
+ });
1218
+ }
1219
+ items.push({
1220
+ id: currentFolder.value.id,
1221
+ label: currentFolder.value.name,
1222
+ parentFolder: parent?.parentFolder
1223
+ });
1224
+ return items;
1225
+ });
1226
+ const hiddenBreadcrumbsItems = computed(() => {
1227
+ const lastVisibleParent = visibleBreadcrumbsItems.value[visibleBreadcrumbsItems.value.length - 1];
1228
+ if (!lastVisibleParent) return [];
1229
+ const items = [];
1230
+ let parentFolder = lastVisibleParent.parentFolder;
1231
+ while (parentFolder) {
1232
+ const parent = foldersStore.getCachedFolder(parentFolder);
1233
+ if (!parent) break;
1234
+ items.unshift({
1235
+ id: parent.id,
1236
+ label: parent.name,
1237
+ href: `/projects/${route.params.projectId}/folders/${parent.id}/workflows`,
1238
+ parentFolder: parent.parentFolder
1239
+ });
1240
+ parentFolder = parent.parentFolder;
1241
+ }
1242
+ return items;
1243
+ });
1244
+ const mainBreadcrumbs = computed(() => {
1245
+ return {
1246
+ visibleItems: visibleBreadcrumbsItems.value,
1247
+ hiddenItems: hiddenBreadcrumbsItems.value
1248
+ };
1249
+ });
1250
+ const cardBreadcrumbs = computed(() => {
1251
+ const visibleItems = visibleBreadcrumbsItems.value;
1252
+ const hiddenItems = hiddenBreadcrumbsItems.value;
1253
+ if (visibleItems.length > 1) {
1254
+ return {
1255
+ visibleItems: [visibleItems[visibleItems.length - 1]],
1256
+ hiddenItems: [...hiddenItems, ...visibleItems.slice(0, visibleItems.length - 1)]
1257
+ };
1258
+ }
1259
+ return {
1260
+ visibleItems,
1261
+ hiddenItems
1262
+ };
1263
+ });
1264
+ const onBreadcrumbItemClick = (item) => {
1265
+ if (item.href) {
1266
+ loading.value = true;
1267
+ void router.push(item.href).then(() => {
1268
+ currentFolderId.value = item.id;
1269
+ loading.value = false;
1270
+ }).catch((error) => {
1271
+ toast.showError(error, "Error navigating to folder");
1272
+ });
1273
+ }
1274
+ };
1275
+ const onBreadCrumbsAction = async (action) => {
1276
+ switch (action) {
1277
+ case FOLDER_LIST_ITEM_ACTIONS.CREATE:
1278
+ if (!route.params.projectId) return;
1279
+ const currentParent = currentFolder.value?.name || projectName.value;
1280
+ if (!currentParent) return;
1281
+ await createFolder2({
1282
+ id: route.params.folderId ?? "-1",
1283
+ name: currentParent,
1284
+ type: currentFolder.value ? "folder" : "project"
1285
+ });
1286
+ break;
1287
+ case FOLDER_LIST_ITEM_ACTIONS.CREATE_WORKFLOW:
1288
+ addWorkflow();
1289
+ break;
1290
+ }
1291
+ };
1292
+ const onFolderCardAction = async (payload) => {
1293
+ const clickedFolder = foldersStore.getCachedFolder(payload.folderId);
1294
+ if (!clickedFolder) return;
1295
+ switch (payload.action) {
1296
+ case FOLDER_LIST_ITEM_ACTIONS.CREATE:
1297
+ await createFolder2({
1298
+ id: clickedFolder.id,
1299
+ name: clickedFolder.name,
1300
+ type: "folder"
1301
+ });
1302
+ break;
1303
+ case FOLDER_LIST_ITEM_ACTIONS.CREATE_WORKFLOW:
1304
+ currentFolderId.value = clickedFolder.id;
1305
+ void router.push({
1306
+ name: VIEWS.NEW_WORKFLOW,
1307
+ query: { projectId: route.params?.projectId, parentFolderId: clickedFolder.id }
1308
+ });
1309
+ break;
1310
+ }
1311
+ };
1312
+ const createFolder2 = async (parent) => {
1313
+ const promptResponsePromise = message.prompt(
1314
+ i18n.baseText("folders.add.to.parent.message", { interpolate: { parent: parent.name } }),
1315
+ {
1316
+ confirmButtonText: i18n.baseText("generic.create"),
1317
+ cancelButtonText: i18n.baseText("generic.cancel"),
1318
+ inputErrorMessage: i18n.baseText("folders.add.invalidName.message"),
1319
+ inputValue: "",
1320
+ inputPattern: /^[a-zA-Z0-9-_ ]{1,100}$/,
1321
+ customClass: "add-folder-modal"
1322
+ }
1323
+ );
1324
+ const promptResponse = await promptResponsePromise;
1325
+ if (promptResponse.action === MODAL_CONFIRM) {
1326
+ const folderName = promptResponse.value;
1327
+ try {
1328
+ const newFolder = await foldersStore.createFolder(
1329
+ folderName,
1330
+ route.params.projectId,
1331
+ parent.type === "folder" ? parent.id : void 0
1332
+ );
1333
+ let newFolderURL = `/projects/${route.params.projectId}`;
1334
+ if (newFolder.parentFolder) {
1335
+ newFolderURL = `/projects/${route.params.projectId}/folders/${newFolder.id}/workflows`;
1336
+ }
1337
+ toast.showMessage({
1338
+ title: i18n.baseText("folders.add.success.title"),
1339
+ message: i18n.baseText("folders.add.success.message", {
1340
+ interpolate: {
1341
+ link: newFolderURL,
1342
+ name: newFolder.name
1343
+ }
1344
+ }),
1345
+ type: "success"
1346
+ });
1347
+ if (!workflowsAndFolders.value.length) {
1348
+ workflowsAndFolders.value = [
1349
+ {
1350
+ id: newFolder.id,
1351
+ name: newFolder.name,
1352
+ resource: "folder",
1353
+ createdAt: newFolder.createdAt,
1354
+ updatedAt: newFolder.updatedAt,
1355
+ homeProject: projectsStore.currentProject,
1356
+ sharedWithProjects: [],
1357
+ workflowCount: 0
1358
+ }
1359
+ ];
1360
+ } else {
1361
+ await fetchWorkflows();
1362
+ }
1363
+ } catch (error) {
1364
+ toast.showError(error, "Error creating folder");
1365
+ }
1366
+ }
1367
+ };
1368
+ const createFolderInCurrent = async () => {
1369
+ if (!route.params.projectId) return;
1370
+ const currentParent = currentFolder.value?.name || projectName.value;
1371
+ if (!currentParent) return;
1372
+ await createFolder2({
1373
+ id: route.params.folderId ?? "-1",
1374
+ name: currentParent,
1375
+ type: currentFolder.value ? "folder" : "project"
1376
+ });
1033
1377
  };
1034
1378
  return (_ctx, _cache) => {
1379
+ const _component_N8nButton = resolveComponent("N8nButton");
1380
+ const _component_N8nTooltip = resolveComponent("N8nTooltip");
1035
1381
  const _component_n8n_button = resolveComponent("n8n-button");
1036
1382
  const _component_N8nCallout = resolveComponent("N8nCallout");
1037
- const _component_n8n_link = resolveComponent("n8n-link");
1038
- const _component_n8n_breadcrumbs = resolveComponent("n8n-breadcrumbs");
1039
- const _component_FolderCard = __unplugin_components_0;
1383
+ const _component_n8n_loading = resolveComponent("n8n-loading");
1384
+ const _component_FolderBreadcrumbs = __unplugin_components_0;
1385
+ const _component_FolderCard = __unplugin_components_1;
1040
1386
  return openBlock(), createBlock(ResourcesListLayout, {
1041
1387
  filters: filters.value,
1042
1388
  "onUpdate:filters": [
@@ -1052,7 +1398,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
1052
1398
  disabled: readOnlyEnv.value || !projectPermissions.value.workflow.create,
1053
1399
  loading: false,
1054
1400
  "resources-refreshing": loading.value,
1055
- "custom-page-size": 10,
1401
+ "custom-page-size": unref(DEFAULT_WORKFLOW_PAGE_SIZE),
1056
1402
  "total-items": unref(workflowsStore).totalWorkflowCount,
1057
1403
  "dont-perform-sorting-and-filtering": true,
1058
1404
  "onClick:add": addWorkflow,
@@ -1060,9 +1406,9 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
1060
1406
  "onUpdate:currentPage": setCurrentPage,
1061
1407
  "onUpdate:pageSize": setPageSize,
1062
1408
  onSort: onSortUpdated
1063
- }, {
1409
+ }, createSlots({
1064
1410
  header: withCtx(() => [
1065
- createVNode(ProjectHeader)
1411
+ createVNode(ProjectHeader, { onCreateFolder: createFolderInCurrent })
1066
1412
  ]),
1067
1413
  callout: withCtx(() => [
1068
1414
  showEasyAIWorkflowCallout.value && easyAICalloutVisible.value ? (openBlock(), createBlock(_component_N8nCallout, {
@@ -1102,53 +1448,41 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
1102
1448
  }, 8, ["class"])) : createCommentVNode("", true)
1103
1449
  ]),
1104
1450
  breadcrumbs: withCtx(() => [
1105
- mainBreadcrumbsItems.value ? (openBlock(), createBlock(_component_n8n_breadcrumbs, {
1451
+ breadcrumbsLoading.value ? (openBlock(), createElementBlock("div", {
1106
1452
  key: 0,
1107
- items: mainBreadcrumbsItems.value,
1108
- "highlight-last-item": false,
1109
- "path-truncated": currentFolder.value !== void 0,
1110
- "data-test-id": "folder-card-breadcrumbs"
1111
- }, createSlots({ _: 2 }, [
1112
- currentProject.value ? {
1113
- name: "prepend",
1114
- fn: withCtx(() => [
1115
- createBaseVNode("div", {
1116
- class: normalizeClass(_ctx.$style["home-project"])
1117
- }, [
1118
- createVNode(_component_n8n_link, {
1119
- to: `/projects/${currentProject.value.id}`
1120
- }, {
1121
- default: withCtx(() => [
1122
- createVNode(unref(N8nText), {
1123
- size: "large",
1124
- color: "text-base"
1125
- }, {
1126
- default: withCtx(() => [
1127
- createTextVNode(toDisplayString(projectName.value), 1)
1128
- ]),
1129
- _: 1
1130
- })
1131
- ]),
1132
- _: 1
1133
- }, 8, ["to"])
1134
- ], 2)
1135
- ]),
1136
- key: "0"
1137
- } : void 0
1138
- ]), 1032, ["items", "path-truncated"])) : createCommentVNode("", true)
1453
+ class: normalizeClass(_ctx.$style["breadcrumbs-loading"])
1454
+ }, [
1455
+ createVNode(_component_n8n_loading, {
1456
+ loading: breadcrumbsLoading.value,
1457
+ rows: 1,
1458
+ variant: "p"
1459
+ }, null, 8, ["loading"])
1460
+ ], 2)) : showFolders.value && currentFolder.value ? (openBlock(), createElementBlock("div", {
1461
+ key: 1,
1462
+ class: normalizeClass(_ctx.$style["breadcrumbs-container"])
1463
+ }, [
1464
+ createVNode(_component_FolderBreadcrumbs, {
1465
+ breadcrumbs: mainBreadcrumbs.value,
1466
+ actions: mainBreadcrumbsActions.value,
1467
+ onItemSelected: onBreadcrumbItemClick,
1468
+ onAction: onBreadCrumbsAction
1469
+ }, null, 8, ["breadcrumbs", "actions"])
1470
+ ], 2)) : createCommentVNode("", true)
1139
1471
  ]),
1140
1472
  item: withCtx(({ item: data }) => [
1141
1473
  data.resourceType === "folder" ? (openBlock(), createBlock(_component_FolderCard, {
1142
1474
  key: 0,
1143
1475
  data,
1144
1476
  actions: folderCardActions.value,
1477
+ breadcrumbs: cardBreadcrumbs.value,
1145
1478
  class: "mb-2xs",
1146
- onFolderOpened
1147
- }, null, 8, ["data", "actions"])) : (openBlock(), createBlock(WorkflowCard, {
1479
+ onAction: onFolderCardAction
1480
+ }, null, 8, ["data", "actions", "breadcrumbs"])) : (openBlock(), createBlock(WorkflowCard, {
1148
1481
  key: 1,
1149
1482
  "data-test-id": "resources-list-item",
1150
1483
  class: "mb-2xs",
1151
1484
  data,
1485
+ breadcrumbs: cardBreadcrumbs.value,
1152
1486
  "workflow-list-event-bus": unref(workflowListEventBus),
1153
1487
  "read-only": readOnlyEnv.value,
1154
1488
  "onClick:tag": onClickTag,
@@ -1156,7 +1490,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
1156
1490
  "onWorkflow:moved": fetchWorkflows,
1157
1491
  "onWorkflow:duplicated": fetchWorkflows,
1158
1492
  "onWorkflow:activeToggle": onWorkflowActiveToggle
1159
- }, null, 8, ["data", "workflow-list-event-bus", "read-only"]))
1493
+ }, null, 8, ["data", "breadcrumbs", "workflow-list-event-bus", "read-only"]))
1160
1494
  ]),
1161
1495
  empty: withCtx(() => [
1162
1496
  createBaseVNode("div", _hoisted_1, [
@@ -1246,7 +1580,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
1246
1580
  color: "text-base",
1247
1581
  class: "mb-3xs"
1248
1582
  }, null, 8, ["label"]),
1249
- createVNode(_sfc_main$4, {
1583
+ createVNode(_sfc_main$5, {
1250
1584
  placeholder: unref(i18n).baseText("workflowOpen.filterWorkflows"),
1251
1585
  "model-value": filters.value.tags,
1252
1586
  "create-enabled": false,
@@ -1268,7 +1602,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
1268
1602
  }, {
1269
1603
  default: withCtx(() => [
1270
1604
  (openBlock(true), createElementBlock(Fragment, null, renderList(statusFilterOptions.value, (option) => {
1271
- return openBlock(), createBlock(unref(_sfc_main$5), {
1605
+ return openBlock(), createBlock(unref(_sfc_main$6), {
1272
1606
  key: option.label,
1273
1607
  label: option.label,
1274
1608
  value: option.value,
@@ -1280,21 +1614,48 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
1280
1614
  }, 1032, ["model-value", "onUpdate:modelValue"])
1281
1615
  ])
1282
1616
  ]),
1283
- _: 1
1284
- }, 8, ["filters", "resources", "shareable", "disabled", "resources-refreshing", "total-items"]);
1617
+ _: 2
1618
+ }, [
1619
+ showFolders.value ? {
1620
+ name: "add-button",
1621
+ fn: withCtx(() => [
1622
+ createVNode(_component_N8nTooltip, { placement: "top" }, {
1623
+ content: withCtx(() => [
1624
+ createTextVNode(toDisplayString(currentParentName.value ? unref(i18n).baseText("folders.add.to.parent.message", {
1625
+ interpolate: { parent: currentParentName.value }
1626
+ }) : unref(i18n).baseText("folders.add.here.message")), 1)
1627
+ ]),
1628
+ default: withCtx(() => [
1629
+ createVNode(_component_N8nButton, {
1630
+ size: "large",
1631
+ icon: "folder-plus",
1632
+ type: "tertiary",
1633
+ "data-test-id": "add-folder-button",
1634
+ class: normalizeClass(_ctx.$style["add-folder-button"]),
1635
+ onClick: createFolderInCurrent
1636
+ }, null, 8, ["class"])
1637
+ ]),
1638
+ _: 1
1639
+ })
1640
+ ]),
1641
+ key: "0"
1642
+ } : void 0
1643
+ ]), 1032, ["filters", "resources", "shareable", "disabled", "resources-refreshing", "custom-page-size", "total-items"]);
1285
1644
  };
1286
1645
  }
1287
1646
  });
1288
- const actionsContainer = "_actionsContainer_11h7l_123";
1289
- const emptyStateCard = "_emptyStateCard_11h7l_139";
1290
- const emptyStateCardIcon = "_emptyStateCardIcon_11h7l_152";
1647
+ const actionsContainer = "_actionsContainer_j58pl_123";
1648
+ const emptyStateCard = "_emptyStateCard_j58pl_139";
1649
+ const emptyStateCardIcon = "_emptyStateCardIcon_j58pl_152";
1291
1650
  const style0 = {
1292
1651
  actionsContainer,
1293
- "easy-ai-workflow-callout": "_easy-ai-workflow-callout_11h7l_128",
1294
- "callout-trailing-content": "_callout-trailing-content_11h7l_133",
1652
+ "easy-ai-workflow-callout": "_easy-ai-workflow-callout_j58pl_128",
1653
+ "callout-trailing-content": "_callout-trailing-content_j58pl_133",
1295
1654
  emptyStateCard,
1296
1655
  emptyStateCardIcon,
1297
- "home-project": "_home-project_11h7l_161"
1656
+ "add-folder-button": "_add-folder-button_j58pl_161",
1657
+ "breadcrumbs-container": "_breadcrumbs-container_j58pl_165",
1658
+ "breadcrumbs-loading": "_breadcrumbs-loading_j58pl_170"
1298
1659
  };
1299
1660
  const cssModules = {
1300
1661
  "$style": style0