n8n-editor-ui 1.83.2 → 1.85.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (126) hide show
  1. package/dist/assets/{AnnotationTagsDropdown.ee.vue_vue_type_script_setup_true_lang-COOCXFFe.js → AnnotationTagsDropdown.ee.vue_vue_type_script_setup_true_lang-BefsLZo6.js} +1 -1
  2. package/dist/assets/{AuthView-C7UxnH6d.js → AuthView-Bwnmj61F.js} +2 -2
  3. package/dist/assets/{CanvasChat-CSLR5tKe.css → CanvasChatSwitch-BcSDHC-c.css} +546 -33
  4. package/dist/assets/{CanvasChat-CmjR9yPV.js → CanvasChatSwitch-Dgc1t6ax.js} +1047 -550
  5. package/dist/assets/{ChangePasswordView-ah8H7l7b.js → ChangePasswordView-Ojbow8CX.js} +3 -3
  6. package/dist/assets/CollectionParameter-2r_LuiyO.js +4 -0
  7. package/dist/assets/CommitMonoVariable-ytizKI8U.woff2 +0 -0
  8. package/dist/assets/{CredentialsView-DqcTSsjv.js → CredentialsView-DhEvPiu_.js} +19 -9
  9. package/dist/assets/{ErrorView-DG7aEbhz.js → ErrorView-RGryGbpa.js} +1 -1
  10. package/dist/assets/{ConcurrentExecutionsHeader-CEBmSYNK.css → ExecutionsTime-BOPJEomw.css} +63 -63
  11. package/dist/assets/{ConcurrentExecutionsHeader-tdwilNra.js → ExecutionsTime.vue_vue_type_script_setup_true_lang-Iwq0aeRX.js} +114 -114
  12. package/dist/assets/ExecutionsView-CL7Ei3Em.js +943 -0
  13. package/dist/assets/{ExecutionsView-CB1tvZfo.css → ExecutionsView-JCKikuIS.css} +60 -188
  14. package/dist/assets/{FileSaver.min-D9u6MONp.js → FileSaver.min-C4OYrSWg.js} +1 -1
  15. package/dist/assets/{FixedCollectionParameter-CLjLHGyL.js → FixedCollectionParameter-CJ4s-1jy.js} +1 -1
  16. package/dist/assets/{ForgotMyPasswordView-DDtUSUcw.js → ForgotMyPasswordView-7tFMaf89.js} +3 -3
  17. package/dist/assets/InterVariable-DiVDrmQJ.woff2 +0 -0
  18. package/dist/assets/InterVariable-Italic-FCBEiFp6.woff2 +0 -0
  19. package/dist/assets/{Logo-CBvZEey7.js → Logo-BW8jOa0h.js} +8 -19
  20. package/dist/assets/{ProjectHeader-BZ6b6lat.css → Logo-DLBj1gMw.css} +23 -17
  21. package/dist/assets/{MainHeader-PgJurmwZ.js → MainHeader-BUWCKbvC.js} +47 -22
  22. package/dist/assets/{MainHeader-CX-ZfeKE.css → MainHeader-CWA2JfVJ.css} +22 -22
  23. package/dist/assets/{MainSidebar-DsyUXL2c.js → MainSidebar-BeZfQeco.js} +75 -42
  24. package/dist/assets/{MainSidebar-BRAjTL7J.css → MainSidebar-CKMiDGvH.css} +13 -12
  25. package/dist/assets/{NodeCreation-CiSTfSrv.js → NodeCreation-DIg39Pbx.js} +5 -5
  26. package/dist/assets/{NodeCreator-16svYK-i.js → NodeCreator-BwYjrEUk.js} +10 -11
  27. package/dist/assets/{NodeCreator-DDiuO5S0.css → NodeCreator-D9fmPdS2.css} +12 -12
  28. package/dist/assets/{NodeDetailsView-CVVfk-zW.css → NodeDetailsView-C1z3N5z_.css} +46 -46
  29. package/dist/assets/{NodeDetailsView-D5ZKTnOO.js → NodeDetailsView-WuroVzlr.js} +93 -85
  30. package/dist/assets/{NodeView-CVxHVGxF.js → NodeView-CmjajouX.js} +63 -28
  31. package/dist/assets/{ProjectCardBadge-DKJ8uRN7.js → ProjectCardBadge-cIqYJxKe.js} +1 -1
  32. package/dist/assets/ProjectHeader-B-a6_GH6.css +285 -0
  33. package/dist/assets/{ProjectHeader-BY3TAX3C.js → ProjectHeader-BGrFY-5v.js} +66 -27
  34. package/dist/assets/{ProjectSettings-B3FxW1ze.js → ProjectSettings-D10vay6-.js} +2 -3
  35. package/dist/assets/{PushConnectionTracker.vue_vue_type_script_setup_true_lang-CzwYeMCe.js → PushConnectionTracker.vue_vue_type_script_setup_true_lang-DJAYslHT.js} +2 -2
  36. package/dist/assets/{ResourcesListLayout-DbPhtDij.js → ResourcesListLayout-C6v8Zm5q.js} +25 -21
  37. package/dist/assets/{ResourcesListLayout-Brs7VKUf.css → ResourcesListLayout-CWgWhtKq.css} +43 -33
  38. package/dist/assets/{RunDataAi-DJ-PSs_k.css → RunDataAi-CN9FrT9c.css} +2 -2
  39. package/dist/assets/{RunDataAi-Cq_XIdUj.js → RunDataAi-dhPBStdr.js} +25 -20
  40. package/dist/assets/{RunDataJson-BYaB0x1O.js → RunDataJson-kGRhUGn3.js} +12 -12
  41. package/dist/assets/{RunDataJsonActions-CU0K3JKo.js → RunDataJsonActions-BTljOq8V.js} +2 -2
  42. package/dist/assets/{RunDataSearch-Cx3Q6SS-.js → RunDataSearch-mVQhE8PH.js} +1 -1
  43. package/dist/assets/{RunDataTable-thC_K8V5.js → RunDataTable-CFoDiExh.js} +2 -2
  44. package/dist/assets/{SamlOnboarding-kqju2Vdw.js → SamlOnboarding-dDZHHNp4.js} +3 -3
  45. package/dist/assets/{SettingsApiView-DZWY9nyk.js → SettingsApiView-C9hbuZ42.js} +2 -3
  46. package/dist/assets/{SettingsCommunityNodesView-BLPF2nGe.js → SettingsCommunityNodesView-0wzih2lc.js} +5 -5
  47. package/dist/assets/{SettingsExternalSecrets-giVhhOpK.js → SettingsExternalSecrets-BCDoBPTc.js} +1 -1
  48. package/dist/assets/{SettingsLdapView-CcLGbweG.js → SettingsLdapView-CBCprymb.js} +1 -1
  49. package/dist/assets/{SettingsLogStreamingView-T4v-UDVv.js → SettingsLogStreamingView-CMQQQdcB.js} +2 -2
  50. package/dist/assets/{SettingsPersonalView-C1vojEEm.js → SettingsPersonalView-DtAM5Qmb.js} +1 -1
  51. package/dist/assets/{SettingsSourceControl-mTHmVIMw.js → SettingsSourceControl-CysMFVZs.js} +1 -1
  52. package/dist/assets/{SettingsSso-BBoPSBvR.js → SettingsSso-B0PZUvVx.js} +7 -7
  53. package/dist/assets/{SettingsSso-BjoJZ2DU.css → SettingsSso-DyrGnPdA.css} +10 -10
  54. package/dist/assets/{SettingsUsageAndPlan-CT1Jb0GH.js → SettingsUsageAndPlan-2QUTEbXv.js} +8 -3
  55. package/dist/assets/{SettingsUsageAndPlan-Cul4YcIk.css → SettingsUsageAndPlan-b3WY2Ea_.css} +3 -3
  56. package/dist/assets/{SettingsUsersView-Cak1x7Pc.js → SettingsUsersView-C16e4GB4.js} +1 -1
  57. package/dist/assets/{SettingsView-DCkltMay.js → SettingsView-B-BQ6FGS.js} +1 -1
  58. package/dist/assets/{SetupView-DJmIQyS0.js → SetupView-Kx3RATQz.js} +3 -3
  59. package/dist/assets/{SetupWorkflowCredentialsButton-DCfwCYAd.js → SetupWorkflowCredentialsButton-BQ2_-L-1.js} +1 -1
  60. package/dist/assets/{SetupWorkflowFromTemplateView-k_iBV2jh.js → SetupWorkflowFromTemplateView-D_E17TKc.js} +3 -3
  61. package/dist/assets/{SigninView-BnsteSQ9.js → SigninView-d0aJ1Mkg.js} +3 -3
  62. package/dist/assets/{SignoutView-CyCh9bOx.js → SignoutView-CvyFrh7y.js} +1 -1
  63. package/dist/assets/{SignupView-BsFwHPbF.js → SignupView-CnlD_UrJ.js} +3 -3
  64. package/dist/assets/{TemplateDetails-D_qS2oXP.js → TemplateDetails-DRuh9UqO.js} +3 -3
  65. package/dist/assets/{TemplateList-Bsr77oun.js → TemplateList-gpWBWX3r.js} +1 -1
  66. package/dist/assets/{TemplatesCollectionView-DOx2xwGE.js → TemplatesCollectionView-Y6-pxrOD.js} +5 -5
  67. package/dist/assets/{TemplatesSearchView-C6YmB2wy.js → TemplatesSearchView-DP8XRZ62.js} +3 -3
  68. package/dist/assets/{TemplatesView-DQBwrteM.js → TemplatesView-B3vanV3h.js} +1 -1
  69. package/dist/assets/{TemplatesWorkflowView-C2iuRHel.js → TemplatesWorkflowView-CIB9qsVC.js} +5 -5
  70. package/dist/assets/{TestDefinitionEditView-JONL00pA.css → TestDefinitionEditView-BXhOuJrU.css} +128 -116
  71. package/dist/assets/{TestDefinitionEditView-BhFe0nl4.js → TestDefinitionEditView-BkhmS3l4.js} +243 -252
  72. package/dist/assets/{TestDefinitionListView-xb_7O8DU.js → TestDefinitionListView-tvjwd9Ts.js} +1 -1
  73. package/dist/assets/{TestDefinitionNewView-DfTA2Tx8.js → TestDefinitionNewView-DOGHwct6.js} +13 -4
  74. package/dist/assets/{TestDefinitionRootView-CaoWSLan.js → TestDefinitionRootView-B-QvwldV.js} +1 -1
  75. package/dist/assets/{VariablesView-CbTLdNwU.css → VariablesView-ATWfdJsE.css} +7 -11
  76. package/dist/assets/{VariablesView-B2ttHbBo.js → VariablesView-CoBnz2nF.js} +6 -6
  77. package/dist/assets/{WorkerView-CzDTwlX2.js → WorkerView-CsTZzlRj.js} +7 -7
  78. package/dist/assets/{WorkflowActivator-mNogYc60.js → WorkflowActivator-DeLhupjy.js} +2 -2
  79. package/dist/assets/{WorkflowExecutionsInfoAccordion-CNoXKDkU.js → WorkflowExecutionsInfoAccordion-WRdvo2wq.js} +1 -1
  80. package/dist/assets/{WorkflowExecutionsLandingPage-XS-H1Pwn.js → WorkflowExecutionsLandingPage-DP8mgG6I.js} +2 -2
  81. package/dist/assets/{WorkflowExecutionsPreview-BMqpqyNP.js → WorkflowExecutionsPreview-BmG1Fptg.js} +270 -136
  82. package/dist/assets/{WorkflowExecutionsPreview-BDVLuC1z.css → WorkflowExecutionsPreview-CHu6M3Dh.css} +70 -38
  83. package/dist/assets/{WorkflowExecutionsView-BLj64NZs.js → WorkflowExecutionsView-DmN-exp3.js} +6 -7
  84. package/dist/assets/{WorkflowHistory-CFqqM71F.js → WorkflowHistory-CdEr7dbB.js} +3 -3
  85. package/dist/assets/{WorkflowOnboardingView-8o-XsXJA.js → WorkflowOnboardingView-D45YjFmk.js} +1 -1
  86. package/dist/assets/{WorkflowPreview-B05e6atY.js → WorkflowPreview-x0_AdULu.js} +1 -1
  87. package/dist/assets/{WorkflowsView-D6AZEJR8.js → WorkflowsView-BhcJ-MjE.js} +726 -341
  88. package/dist/assets/{WorkflowsView-JN0Hvhvt.css → WorkflowsView-r9qJOUEb.css} +64 -43
  89. package/dist/assets/{easyAiWorkflowUtils-DCq6uUmq.js → easyAiWorkflowUtils-NXaV8dgZ.js} +5 -5
  90. package/dist/assets/{global-link-actions-DhVbzPXz.js → global-link-actions-DgZH3fz2.js} +1 -1
  91. package/dist/assets/{import-curl-CpQ9LTub.js → import-curl-DUv4B2nO.js} +1 -1
  92. package/dist/assets/{index-ntAcmC2q.js → index-CDluwnbb.js} +4962 -3420
  93. package/dist/assets/{index-D534l065.css → index-CgXKy7t-.css} +2783 -2112
  94. package/dist/assets/{index-wbgX3Vnk.js → index-DAyhXitv.js} +1 -1
  95. package/dist/assets/{pickBy-DAl85H93.js → pickBy-D-hOoXP_.js} +1 -1
  96. package/dist/assets/{polyfills-C7eMRNFe.js → polyfills-CLZ4X0Ad.js} +2342 -1944
  97. package/dist/assets/{pushConnection.store-Cs7MLBaJ.js → pushConnection.store-Dl_VgTY2.js} +1 -1
  98. package/dist/assets/{templateActions-C6kwBsE2.js → templateActions-B4AFVixD.js} +1 -1
  99. package/dist/assets/{typescript.worker-DP34mIHW.js → typescript.worker-Bt3bByTc.js} +1158 -695
  100. package/dist/assets/{useBeforeUnload-Cr9E4FVX.js → useBeforeUnload-DS-CCd-3.js} +1 -1
  101. package/dist/assets/{useCanvasMapping-CkNBF2SE.css → useCanvasMapping-CJcAsQmx.css} +585 -585
  102. package/dist/assets/{useCanvasMapping-DwbUSpab.js → useCanvasMapping-DnPGwCm3.js} +10390 -10379
  103. package/dist/assets/{useCanvasOperations-Ch4-PXXM.js → useCanvasOperations-CY1OrN2X.js} +472 -185
  104. package/dist/assets/useClearExecutionButtonVisible-CjX9PqMR.js +23 -0
  105. package/dist/assets/{useExecutionDebugging-WtMBcJA-.js → useExecutionDebugging-BN-lQ24h.js} +1 -1
  106. package/dist/assets/{useExecutionHelpers-DYVB2XNC.js → useExecutionHelpers-wN0DRQB-.js} +1 -1
  107. package/dist/assets/{useImportCurlCommand-B6a2t4kf.js → useImportCurlCommand-DgTeVIgh.js} +13 -20
  108. package/dist/assets/useOverview-BBgWJdVL.js +161 -0
  109. package/dist/assets/{Logo-DJLTXpXC.css → useOverview-DcRuPjLJ.css} +97 -30
  110. package/dist/assets/{usePushConnection-BvuDmDSY.js → usePushConnection-F1s4Muc0.js} +5 -4
  111. package/dist/assets/{useRunWorkflow-BjW-TsKk.js → useRunWorkflow-RBDuKZVj.js} +13 -13
  112. package/dist/assets/{useTestDefinitionForm-uexL_DkW.js → useTestDefinitionForm-DX1gvhBC.js} +1 -1
  113. package/dist/assets/{useWorkflowActivate-BAjo-kUC.js → useWorkflowActivate-DsRC3mvG.js} +1 -1
  114. package/dist/index.html +3 -3
  115. package/package.json +1 -1
  116. package/dist/assets/CollectionParameter-Dk76idMw.js +0 -4
  117. package/dist/assets/ExecutionsView-zqdNLgx1.js +0 -983
  118. package/dist/assets/ProjectCreateResource-5lC9x1Ht.js +0 -56
  119. package/dist/assets/ProjectCreateResource-eYdTamXR.css +0 -139
  120. package/dist/assets/open-sans-latin-400-normal-kLvSbl7y.woff +0 -0
  121. package/dist/assets/open-sans-latin-400-normal-sjvN8RAh.woff2 +0 -0
  122. package/dist/assets/open-sans-latin-600-normal-BYc6TgXR.woff2 +0 -0
  123. package/dist/assets/open-sans-latin-600-normal-CJ2UE_uF.woff +0 -0
  124. package/dist/assets/open-sans-latin-700-normal-DMXgkrz3.woff +0 -0
  125. package/dist/assets/open-sans-latin-700-normal-DXyImmHa.woff2 +0 -0
  126. package/dist/assets/usePinnedData-CvnROquX.js +0 -274
@@ -1,27 +1,26 @@
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-ntAcmC2q.js";
2
- import { R as ResourcesListLayout } from "./ResourcesListLayout-DbPhtDij.js";
3
- import { W as WorkflowActivator } from "./WorkflowActivator-mNogYc60.js";
4
- import { P as ProjectCardBadge } from "./ProjectCardBadge-DKJ8uRN7.js";
5
- import { P as ProjectHeader } from "./ProjectHeader-BY3TAX3C.js";
6
- import { g as getEasyAiWorkflowJson } from "./easyAiWorkflowUtils-DCq6uUmq.js";
7
- import "./useWorkflowActivate-BAjo-kUC.js";
8
- import "./ProjectCreateResource-5lC9x1Ht.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-CDluwnbb.js";
2
+ import { R as ResourcesListLayout } from "./ResourcesListLayout-C6v8Zm5q.js";
3
+ import { W as WorkflowActivator } from "./WorkflowActivator-DeLhupjy.js";
4
+ import { P as ProjectCardBadge } from "./ProjectCardBadge-cIqYJxKe.js";
5
+ import { P as ProjectHeader } from "./ProjectHeader-BGrFY-5v.js";
6
+ import { g as getEasyAiWorkflowJson } from "./easyAiWorkflowUtils-NXaV8dgZ.js";
7
+ import { u as useOverview, I as InsightsSummary } from "./useOverview-BBgWJdVL.js";
8
+ import "./useWorkflowActivate-DsRC3mvG.js";
9
9
  const FOLDER_LIST_ITEM_ACTIONS = {
10
10
  OPEN: "open",
11
11
  CREATE: "create",
12
12
  CREATE_WORKFLOW: "create_workflow",
13
13
  RENAME: "rename",
14
14
  MOVE: "move",
15
- CHOWN: "change_owner",
16
- TAGS: "manage_tags",
17
15
  DELETE: "delete"
18
16
  };
17
+ const _hoisted_1$2 = { "data-test-id": "folder-card" };
19
18
  const _sfc_main$3 = /* @__PURE__ */ defineComponent({
20
19
  __name: "FolderCard",
21
20
  props: {
22
21
  data: {},
23
22
  actions: { default: () => [] },
24
- breadcrumbs: {}
23
+ readOnly: { type: Boolean, default: true }
25
24
  },
26
25
  emits: ["action", "folderOpened"],
27
26
  setup(__props, { emit: __emit }) {
@@ -66,23 +65,18 @@ const _sfc_main$3 = /* @__PURE__ */ defineComponent({
66
65
  }
67
66
  emit("action", { action, folderId: props.data.id });
68
67
  };
69
- const onBreadcrumbsItemClick = async (item) => {
70
- if (item.href) {
71
- await router.push(item.href);
72
- }
73
- };
74
68
  return (_ctx, _cache) => {
75
69
  const _component_n8n_icon = resolveComponent("n8n-icon");
76
70
  const _component_n8n_heading = resolveComponent("n8n-heading");
71
+ const _component_N8nBadge = resolveComponent("N8nBadge");
77
72
  const _component_n8n_text = resolveComponent("n8n-text");
78
73
  const _component_TimeAgo = _sfc_main$4;
79
74
  const _component_ProjectIcon = __unplugin_components_0$1;
80
75
  const _component_n8n_link = resolveComponent("n8n-link");
81
- const _component_n8n_breadcrumbs = resolveComponent("n8n-breadcrumbs");
82
76
  const _component_n8n_action_toggle = resolveComponent("n8n-action-toggle");
83
77
  const _component_n8n_card = resolveComponent("n8n-card");
84
78
  const _component_router_link = resolveComponent("router-link");
85
- return openBlock(), createElementBlock("div", null, [
79
+ return openBlock(), createElementBlock("div", _hoisted_1$2, [
86
80
  createVNode(_component_router_link, {
87
81
  to: cardUrl.value,
88
82
  onClick: _cache[1] || (_cache[1] = () => emit("folderOpened", { folder: props.data }))
@@ -96,37 +90,65 @@ const _sfc_main$3 = /* @__PURE__ */ defineComponent({
96
90
  "data-test-id": "folder-card-icon",
97
91
  class: normalizeClass(_ctx.$style["folder-icon"]),
98
92
  icon: "folder",
99
- size: "large"
93
+ size: "xlarge"
100
94
  }, null, 8, ["class"])
101
95
  ]),
102
96
  header: withCtx(() => [
103
- createVNode(_component_n8n_heading, {
104
- tag: "h2",
105
- bold: "",
106
- size: "small",
107
- "data-test-id": "folder-card-name"
108
- }, {
109
- default: withCtx(() => [
110
- createTextVNode(toDisplayString(_ctx.data.name), 1)
111
- ]),
112
- _: 1
113
- })
97
+ createBaseVNode("div", {
98
+ class: normalizeClass(_ctx.$style["card-header"])
99
+ }, [
100
+ createVNode(_component_n8n_heading, {
101
+ tag: "h2",
102
+ bold: "",
103
+ size: "small",
104
+ "data-test-id": "folder-card-name"
105
+ }, {
106
+ default: withCtx(() => [
107
+ createTextVNode(toDisplayString(_ctx.data.name), 1)
108
+ ]),
109
+ _: 1
110
+ }),
111
+ _ctx.readOnly ? (openBlock(), createBlock(_component_N8nBadge, {
112
+ key: 0,
113
+ class: "ml-3xs",
114
+ theme: "tertiary",
115
+ bold: ""
116
+ }, {
117
+ default: withCtx(() => [
118
+ createTextVNode(toDisplayString(unref(i18n).baseText("workflows.item.readonly")), 1)
119
+ ]),
120
+ _: 1
121
+ })) : createCommentVNode("", true)
122
+ ], 2)
114
123
  ]),
115
124
  footer: withCtx(() => [
116
125
  createBaseVNode("div", {
117
126
  class: normalizeClass(_ctx.$style["card-footer"])
118
127
  }, [
119
- createVNode(_component_n8n_text, {
128
+ _ctx.data.workflowCount > 0 ? (openBlock(), createBlock(_component_n8n_text, {
129
+ key: 0,
130
+ size: "small",
131
+ color: "text-light",
132
+ class: normalizeClass([_ctx.$style["info-cell"], _ctx.$style["info-cell--workflow-count"]]),
133
+ "data-test-id": "folder-card-folder-count"
134
+ }, {
135
+ default: withCtx(() => [
136
+ createTextVNode(toDisplayString(unref(i18n).baseText("generic.workflow", { interpolate: { count: _ctx.data.workflowCount } })), 1)
137
+ ]),
138
+ _: 1
139
+ }, 8, ["class"])) : createCommentVNode("", true),
140
+ _ctx.data.subFolderCount > 0 ? (openBlock(), createBlock(_component_n8n_text, {
141
+ key: 1,
120
142
  size: "small",
121
143
  color: "text-light",
122
144
  class: normalizeClass([_ctx.$style["info-cell"], _ctx.$style["info-cell--workflow-count"]]),
123
145
  "data-test-id": "folder-card-workflow-count"
124
146
  }, {
125
147
  default: withCtx(() => [
126
- createTextVNode(toDisplayString(_ctx.data.workflowCount) + " " + toDisplayString(unref(i18n).baseText("generic.workflows")), 1)
148
+ createTextVNode(toDisplayString(unref(i18n).baseText("generic.folder", { interpolate: { count: _ctx.data.subFolderCount } })), 1)
127
149
  ]),
128
150
  _: 1
129
- }, 8, ["class"]),
151
+ }, 8, ["class"])) : createCommentVNode("", true),
130
152
  createVNode(_component_n8n_text, {
131
153
  size: "small",
132
154
  color: "text-light",
@@ -163,56 +185,41 @@ const _sfc_main$3 = /* @__PURE__ */ defineComponent({
163
185
  onClick: _cache[0] || (_cache[0] = withModifiers(() => {
164
186
  }, ["prevent"]))
165
187
  }, [
166
- createBaseVNode("div", {
167
- class: normalizeClass(_ctx.$style.breadcrumbs)
188
+ _ctx.data.homeProject ? (openBlock(), createElementBlock("div", {
189
+ key: 0,
190
+ class: normalizeClass(_ctx.$style["project-pill"])
168
191
  }, [
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)
192
+ createBaseVNode("div", {
193
+ class: normalizeClass(_ctx.$style["home-project"]),
194
+ "data-test-id": "folder-card-home-project"
195
+ }, [
196
+ createVNode(_component_n8n_link, {
197
+ to: `/projects/${_ctx.data.homeProject.id}`
198
+ }, {
199
+ default: withCtx(() => [
200
+ createVNode(_component_ProjectIcon, {
201
+ icon: projectIcon.value,
202
+ "border-less": true,
203
+ size: "mini"
204
+ }, null, 8, ["icon"]),
205
+ createVNode(_component_n8n_text, {
206
+ size: "small",
207
+ compact: true,
208
+ bold: true,
209
+ color: "text-base"
210
+ }, {
211
+ default: withCtx(() => [
212
+ createTextVNode(toDisplayString(projectName.value), 1)
213
+ ]),
214
+ _: 1
215
+ })
209
216
  ]),
210
- key: "0"
211
- } : void 0
212
- ]), 1032, ["items", "hidden-items", "path-truncated"])
213
- ], 2),
217
+ _: 1
218
+ }, 8, ["to"])
219
+ ], 2)
220
+ ], 2)) : createCommentVNode("", true),
214
221
  _ctx.actions.length ? (openBlock(), createBlock(_component_n8n_action_toggle, {
215
- key: 0,
222
+ key: 1,
216
223
  actions: _ctx.actions,
217
224
  theme: "dark",
218
225
  "data-test-id": "folder-card-actions",
@@ -229,15 +236,17 @@ const _sfc_main$3 = /* @__PURE__ */ defineComponent({
229
236
  };
230
237
  }
231
238
  });
232
- const card = "_card_v01dx_123";
239
+ const card = "_card_1ughy_124";
233
240
  const style0$3 = {
234
241
  card,
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"
242
+ "folder-icon": "_folder-icon_1ughy_132",
243
+ "card-header": "_card-header_1ughy_141",
244
+ "card-footer": "_card-footer_1ughy_149",
245
+ "info-cell": "_info-cell_1ughy_153",
246
+ "card-actions": "_card-actions_1ughy_158",
247
+ "project-pill": "_project-pill_1ughy_163",
248
+ "home-project": "_home-project_1ughy_171",
249
+ "info-cell--created": "_info-cell--created_1ughy_191"
241
250
  };
242
251
  const cssModules$3 = {
243
252
  "$style": style0$3
@@ -281,21 +290,22 @@ const _sfc_main$2 = /* @__PURE__ */ defineComponent({
281
290
  "highlight-last-item": false,
282
291
  "path-truncated": _ctx.breadcrumbs.visibleItems[0].parentFolder,
283
292
  "hidden-items": _ctx.breadcrumbs.hiddenItems,
284
- "data-test-id": "folder-card-breadcrumbs",
293
+ "data-test-id": "folder-list-breadcrumbs",
285
294
  onItemSelected: onItemSelect
286
295
  }, createSlots({ _: 2 }, [
287
296
  currentProject.value ? {
288
297
  name: "prepend",
289
298
  fn: withCtx(() => [
290
299
  createBaseVNode("div", {
291
- class: normalizeClass(_ctx.$style["home-project"])
300
+ class: normalizeClass(_ctx.$style["home-project"]),
301
+ "data-test-id": "home-project"
292
302
  }, [
293
303
  createVNode(_component_n8n_link, {
294
304
  to: `/projects/${currentProject.value.id}`
295
305
  }, {
296
306
  default: withCtx(() => [
297
307
  createVNode(_component_N8nText, {
298
- size: "large",
308
+ size: "medium",
299
309
  color: "text-base"
300
310
  }, {
301
311
  default: withCtx(() => [
@@ -314,18 +324,20 @@ const _sfc_main$2 = /* @__PURE__ */ defineComponent({
314
324
  _ctx.breadcrumbs.visibleItems ? (openBlock(), createBlock(_component_n8n_action_toggle, {
315
325
  key: 1,
316
326
  actions: _ctx.actions,
327
+ class: normalizeClass(_ctx.$style["action-toggle"]),
317
328
  theme: "dark",
318
329
  "data-test-id": "folder-breadcrumbs-actions",
319
330
  onAction
320
- }, null, 8, ["actions"])) : createCommentVNode("", true)
331
+ }, null, 8, ["actions", "class"])) : createCommentVNode("", true)
321
332
  ], 2);
322
333
  };
323
334
  }
324
335
  });
325
- const container = "_container_1e41k_123";
336
+ const container = "_container_4mxjz_123";
326
337
  const style0$2 = {
327
338
  container,
328
- "home-project": "_home-project_1e41k_128"
339
+ "action-toggle": "_action-toggle_4mxjz_128",
340
+ "home-project": "_home-project_4mxjz_132"
329
341
  };
330
342
  const cssModules$2 = {
331
343
  "$style": style0$2
@@ -336,18 +348,18 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
336
348
  __name: "WorkflowCard",
337
349
  props: {
338
350
  data: {},
339
- breadcrumbs: {},
340
351
  readOnly: { type: Boolean, default: false },
341
352
  workflowListEventBus: { default: void 0 }
342
353
  },
343
- emits: ["expand:tags", "click:tag", "workflow:deleted", "workflow:active-toggle"],
354
+ emits: ["expand:tags", "click:tag", "workflow:deleted", "workflow:active-toggle", "action:move-to-folder"],
344
355
  setup(__props, { emit: __emit }) {
345
356
  const WORKFLOW_LIST_ITEM_ACTIONS = {
346
357
  OPEN: "open",
347
358
  SHARE: "share",
348
359
  DUPLICATE: "duplicate",
349
360
  DELETE: "delete",
350
- MOVE: "move"
361
+ MOVE: "move",
362
+ MOVE_TO_FOLDER: "moveToFolder"
351
363
  };
352
364
  const props = __props;
353
365
  const emit = __emit;
@@ -355,16 +367,57 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
355
367
  const message = useMessage();
356
368
  const locale = useI18n();
357
369
  const router = useRouter();
370
+ const route = useRoute();
358
371
  const telemetry = useTelemetry();
359
- const i18n = useI18n();
360
372
  const settingsStore = useSettingsStore();
361
373
  const uiStore = useUIStore();
362
374
  const usersStore = useUsersStore();
363
375
  const workflowsStore = useWorkflowsStore();
364
376
  const projectsStore = useProjectsStore();
377
+ const foldersStore = useFoldersStore();
378
+ const hiddenBreadcrumbsItemsAsync = ref(new Promise(() => {
379
+ }));
365
380
  const resourceTypeLabel = computed(() => locale.baseText("generic.workflow").toLowerCase());
366
381
  const currentUser = computed(() => usersStore.currentUser ?? {});
367
382
  const workflowPermissions = computed(() => getResourcePermissions(props.data.scopes).workflow);
383
+ const isOverviewPage = computed(() => route.name === VIEWS.WORKFLOWS);
384
+ const showFolders = computed(() => {
385
+ return settingsStore.isFoldersFeatureEnabled && route.name !== VIEWS.WORKFLOWS;
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
+ });
368
421
  const actions = computed(() => {
369
422
  const items = [
370
423
  {
@@ -382,9 +435,15 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
382
435
  value: WORKFLOW_LIST_ITEM_ACTIONS.DUPLICATE
383
436
  });
384
437
  }
438
+ if (workflowPermissions.value.update && !props.readOnly && showFolders.value) {
439
+ items.push({
440
+ label: locale.baseText("folders.actions.moveToFolder"),
441
+ value: WORKFLOW_LIST_ITEM_ACTIONS.MOVE_TO_FOLDER
442
+ });
443
+ }
385
444
  if (workflowPermissions.value.move && projectsStore.isTeamProjectFeatureEnabled) {
386
445
  items.push({
387
- label: locale.baseText("workflows.item.move"),
446
+ label: locale.baseText("workflows.item.changeOwner"),
388
447
  value: WORKFLOW_LIST_ITEM_ACTIONS.MOVE
389
448
  });
390
449
  }
@@ -403,28 +462,13 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
403
462
  `d mmmm${String(props.data.createdAt).startsWith(currentYear) ? "" : ", yyyy"}`
404
463
  );
405
464
  });
406
- const projectIcon = computed(() => {
407
- const defaultIcon = { type: "icon", value: "layer-group" };
408
- if (props.data.homeProject?.type === ProjectTypes.Personal) {
409
- return { type: "icon", value: "user" };
410
- } else if (props.data.homeProject?.type === ProjectTypes.Team) {
411
- return props.data.homeProject.icon ?? defaultIcon;
412
- }
413
- return defaultIcon;
414
- });
415
- const projectName = computed(() => {
416
- if (props.data.homeProject?.type === ProjectTypes.Personal) {
417
- return i18n.baseText("projects.menu.personal");
418
- }
419
- return props.data.homeProject?.name;
420
- });
421
465
  async function onClick(event) {
422
466
  if (event?.ctrlKey || event?.metaKey) {
423
- const route = router.resolve({
467
+ const route2 = router.resolve({
424
468
  name: VIEWS.WORKFLOW,
425
469
  params: { name: props.data.id }
426
470
  });
427
- window.open(route.href, "_blank");
471
+ window.open(route2.href, "_blank");
428
472
  return;
429
473
  }
430
474
  await router.push({
@@ -474,6 +518,13 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
474
518
  case WORKFLOW_LIST_ITEM_ACTIONS.MOVE:
475
519
  moveResource();
476
520
  break;
521
+ case WORKFLOW_LIST_ITEM_ACTIONS.MOVE_TO_FOLDER:
522
+ emit("action:move-to-folder", {
523
+ id: props.data.id,
524
+ name: props.data.name,
525
+ parentFolderId: props.data.parentFolder?.id
526
+ });
527
+ break;
477
528
  }
478
529
  }
479
530
  async function deleteWorkflow() {
@@ -507,6 +558,16 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
507
558
  });
508
559
  emit("workflow:deleted");
509
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
+ };
510
571
  function moveResource() {
511
572
  uiStore.openModalWithData({
512
573
  name: PROJECT_MOVE_RESOURCE_MODAL,
@@ -521,11 +582,15 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
521
582
  const emitWorkflowActiveToggle = (value) => {
522
583
  emit("workflow:active-toggle", value);
523
584
  };
585
+ const onBreadcrumbItemClick = async (item) => {
586
+ if (item.href) {
587
+ await router.push(item.href);
588
+ }
589
+ };
524
590
  return (_ctx, _cache) => {
525
591
  const _component_N8nBadge = resolveComponent("N8nBadge");
526
- const _component_n8n_heading = resolveComponent("n8n-heading");
527
- const _component_n8n_tags = resolveComponent("n8n-tags");
528
592
  const _component_n8n_text = resolveComponent("n8n-text");
593
+ const _component_n8n_tags = resolveComponent("n8n-tags");
529
594
  const _component_ProjectIcon = __unplugin_components_0$1;
530
595
  const _component_n8n_link = resolveComponent("n8n-link");
531
596
  const _component_n8n_breadcrumbs = resolveComponent("n8n-breadcrumbs");
@@ -537,7 +602,7 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
537
602
  onClick
538
603
  }, {
539
604
  header: withCtx(() => [
540
- createVNode(_component_n8n_heading, {
605
+ createVNode(_component_n8n_text, {
541
606
  tag: "h2",
542
607
  bold: "",
543
608
  class: normalizeClass(_ctx.$style.cardHeading),
@@ -566,25 +631,21 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
566
631
  onClick: _cache[0] || (_cache[0] = withModifiers(() => {
567
632
  }, ["stop"]))
568
633
  }, [
569
- !_ctx.data.parentFolder ? (openBlock(), createBlock(ProjectCardBadge, {
634
+ isOverviewPage.value ? (openBlock(), createElementBlock("div", {
570
635
  key: 0,
571
- class: normalizeClass(_ctx.$style.cardBadge),
572
- resource: _ctx.data,
573
- "resource-type": unref(ResourceType).Workflow,
574
- "resource-type-label": resourceTypeLabel.value,
575
- "personal-project": unref(projectsStore).personalProject
576
- }, null, 8, ["class", "resource", "resource-type", "resource-type-label", "personal-project"])) : (openBlock(), createElementBlock("div", {
577
- key: 1,
578
636
  class: normalizeClass(_ctx.$style.breadcrumbs)
579
637
  }, [
580
638
  createVNode(_component_n8n_breadcrumbs, {
581
- items: _ctx.breadcrumbs.visibleItems,
582
- "hidden-items": _ctx.breadcrumbs.hiddenItems,
583
- "path-truncated": _ctx.breadcrumbs.visibleItems[0]?.parentFolder,
639
+ items: cardBreadcrumbs.value,
640
+ "hidden-items": hiddenBreadcrumbsItemsAsync.value,
641
+ "path-truncated": true,
584
642
  "show-border": true,
585
643
  "highlight-last-item": false,
644
+ "hidden-items-trigger": "hover",
586
645
  theme: "small",
587
- "data-test-id": "folder-card-breadcrumbs"
646
+ "data-test-id": "workflow-card-breadcrumbs",
647
+ onTooltipOpened: fetchHiddenBreadCrumbsItems,
648
+ onItemSelected: onBreadcrumbItemClick
588
649
  }, createSlots({ _: 2 }, [
589
650
  _ctx.data.homeProject ? {
590
651
  name: "prepend",
@@ -619,8 +680,15 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
619
680
  ]),
620
681
  key: "0"
621
682
  } : void 0
622
- ]), 1032, ["items", "hidden-items", "path-truncated"])
623
- ], 2)),
683
+ ]), 1032, ["items", "hidden-items"])
684
+ ], 2)) : (openBlock(), createBlock(ProjectCardBadge, {
685
+ key: 1,
686
+ class: normalizeClass(_ctx.$style.cardBadge),
687
+ resource: _ctx.data,
688
+ "resource-type": unref(ResourceType).Workflow,
689
+ "resource-type-label": resourceTypeLabel.value,
690
+ "personal-project": unref(projectsStore).personalProject
691
+ }, null, 8, ["class", "resource", "resource-type", "resource-type-label", "personal-project"])),
624
692
  createVNode(WorkflowActivator, {
625
693
  class: "mr-s",
626
694
  "workflow-active": _ctx.data.active,
@@ -680,18 +748,18 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
680
748
  };
681
749
  }
682
750
  });
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";
751
+ const cardLink = "_cardLink_1mosm_123";
752
+ const cardHeading = "_cardHeading_1mosm_133";
753
+ const cardDescription = "_cardDescription_1mosm_142";
754
+ const cardActions = "_cardActions_1mosm_149";
755
+ const cardBadge = "_cardBadge_1mosm_176";
756
+ const breadcrumbs = "_breadcrumbs_1mosm_177";
689
757
  const style0$1 = {
690
758
  cardLink,
691
759
  cardHeading,
692
760
  cardDescription,
693
761
  cardActions,
694
- "home-project": "_home-project_dsqjo_159",
762
+ "home-project": "_home-project_1mosm_159",
695
763
  cardBadge,
696
764
  breadcrumbs
697
765
  };
@@ -699,79 +767,53 @@ const cssModules$1 = {
699
767
  "$style": style0$1
700
768
  };
701
769
  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
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
+ }
741
778
  });
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;
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;
758
797
  }
759
798
  return {
760
- fetchTotalWorkflowsAndFoldersCount,
761
- breadcrumbsCache,
762
- cacheFolders,
763
- getCachedFolder,
764
- createFolder: createFolder$1,
765
- getFolderPath: getFolderPath$1,
766
- totalWorkflowCount
799
+ validateFolderName
767
800
  };
768
- });
769
- const _hoisted_1 = { class: "text-center mt-s" };
770
- const _hoisted_2 = {
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 = {
771
811
  key: 0,
772
812
  class: "mb-s"
773
813
  };
774
- 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;
775
817
  const _sfc_main = /* @__PURE__ */ defineComponent({
776
818
  __name: "WorkflowsView",
777
819
  setup(__props) {
@@ -791,6 +833,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
791
833
  const router = useRouter();
792
834
  const message = useMessage();
793
835
  const toast = useToast();
836
+ const folderHelpers = useFolders();
794
837
  const sourceControlStore = useSourceControlStore();
795
838
  const usersStore = useUsersStore();
796
839
  const workflowsStore = useWorkflowsStore();
@@ -801,8 +844,11 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
801
844
  const uiStore = useUIStore();
802
845
  const tagsStore = useTagsStore();
803
846
  const foldersStore = useFoldersStore();
847
+ const usageStore = useUsageStore();
848
+ const insightsStore = useInsightsStore();
804
849
  const documentTitle = useDocumentTitle();
805
850
  const { callDebounced } = useDebounce();
851
+ const overview = useOverview();
806
852
  const loading = ref(false);
807
853
  const breadcrumbsLoading = ref(false);
808
854
  const filters = ref({
@@ -818,47 +864,37 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
818
864
  const pageSize = ref(DEFAULT_WORKFLOW_PAGE_SIZE);
819
865
  const currentSort = ref("updatedAt:desc");
820
866
  const currentFolderId = ref(null);
821
- const folderActions = ref([
867
+ const folderActions = computed(() => [
822
868
  {
823
- label: "Open",
869
+ label: i18n.baseText("generic.open"),
824
870
  value: FOLDER_LIST_ITEM_ACTIONS.OPEN,
825
871
  disabled: false,
826
872
  onlyAvailableOn: "card"
827
873
  },
828
874
  {
829
- label: "Create Folder",
875
+ label: i18n.baseText("folders.actions.create"),
830
876
  value: FOLDER_LIST_ITEM_ACTIONS.CREATE,
831
- disabled: false
877
+ disabled: readOnlyEnv.value || !hasPermissionToCreateFolders.value
832
878
  },
833
879
  {
834
- label: "Create Workflow",
880
+ label: i18n.baseText("folders.actions.create.workflow"),
835
881
  value: FOLDER_LIST_ITEM_ACTIONS.CREATE_WORKFLOW,
836
- disabled: false
882
+ disabled: readOnlyEnv.value || !hasPermissionToCreateWorkflows.value
837
883
  },
838
884
  {
839
- label: "Rename",
885
+ label: i18n.baseText("generic.rename"),
840
886
  value: FOLDER_LIST_ITEM_ACTIONS.RENAME,
841
- disabled: true
887
+ disabled: readOnlyEnv.value || !hasPermissionToUpdateFolders.value
842
888
  },
843
889
  {
844
- label: "Move to Folder",
890
+ label: i18n.baseText("folders.actions.moveToFolder"),
845
891
  value: FOLDER_LIST_ITEM_ACTIONS.MOVE,
846
- disabled: true
847
- },
848
- {
849
- label: "Change Owner",
850
- value: FOLDER_LIST_ITEM_ACTIONS.CHOWN,
851
- disabled: true
892
+ disabled: readOnlyEnv.value || !hasPermissionToUpdateFolders.value
852
893
  },
853
894
  {
854
- label: "Manage Tags",
855
- value: FOLDER_LIST_ITEM_ACTIONS.TAGS,
856
- disabled: true
857
- },
858
- {
859
- label: "Delete",
895
+ label: i18n.baseText("generic.delete"),
860
896
  value: FOLDER_LIST_ITEM_ACTIONS.DELETE,
861
- disabled: true
897
+ disabled: readOnlyEnv.value || !hasPermissionToDeleteFolders.value
862
898
  }
863
899
  ]);
864
900
  const folderCardActions = computed(
@@ -872,16 +908,39 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
872
908
  )
873
909
  );
874
910
  const readOnlyEnv = computed(() => sourceControlStore.preferences.branchReadOnly);
875
- const foldersEnabled = computed(() => settingsStore.settings.folders.enabled);
876
911
  const isOverviewPage = computed(() => route.name === VIEWS.WORKFLOWS);
877
912
  const currentUser = computed(() => usersStore.currentUser ?? {});
878
913
  const isShareable = computed(
879
914
  () => settingsStore.isEnterpriseFeatureEnabled[EnterpriseEditionFeature.Sharing]
880
915
  );
881
- const showFolders = computed(() => foldersEnabled.value && !isOverviewPage.value);
916
+ const foldersEnabled = computed(() => {
917
+ return settingsStore.isFoldersFeatureEnabled;
918
+ });
919
+ const teamProjectsEnabled = computed(() => {
920
+ return projectsStore.isTeamProjectFeatureEnabled;
921
+ });
922
+ const showFolders = computed(() => {
923
+ return foldersEnabled.value && !isOverviewPage.value;
924
+ });
882
925
  const currentFolder = computed(() => {
883
926
  return currentFolderId.value ? foldersStore.breadcrumbsCache[currentFolderId.value] : null;
884
927
  });
928
+ const hasPermissionToCreateFolders = computed(() => {
929
+ if (!currentProject.value) return false;
930
+ return getResourcePermissions(currentProject.value.scopes).folder.create === true;
931
+ });
932
+ const hasPermissionToUpdateFolders = computed(() => {
933
+ if (!currentProject.value) return false;
934
+ return getResourcePermissions(currentProject.value.scopes).folder.update === true;
935
+ });
936
+ const hasPermissionToDeleteFolders = computed(() => {
937
+ if (!currentProject.value) return false;
938
+ return getResourcePermissions(currentProject.value.scopes).folder.delete === true;
939
+ });
940
+ const hasPermissionToCreateWorkflows = computed(() => {
941
+ if (!currentProject.value) return false;
942
+ return getResourcePermissions(currentProject.value.scopes).workflow.create === true;
943
+ });
885
944
  const currentProject = computed(() => projectsStore.currentProject);
886
945
  const projectName = computed(() => {
887
946
  if (currentProject.value?.type === ProjectTypes.Personal) {
@@ -907,6 +966,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
907
966
  homeProject: resource.homeProject,
908
967
  sharedWithProjects: resource.sharedWithProjects,
909
968
  workflowCount: resource.workflowCount,
969
+ subFolderCount: resource.subFolderCount,
910
970
  parentFolder: resource.parentFolder
911
971
  };
912
972
  } else {
@@ -961,6 +1021,13 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
961
1021
  return i18n.baseText("workflows.empty.description");
962
1022
  }
963
1023
  });
1024
+ const hasFilters = computed(() => {
1025
+ return !!(filters.value.search || filters.value.status !== StatusFilter.ALL || filters.value.tags.length);
1026
+ });
1027
+ const isCommunity = computed(() => usageStore.planName.toLowerCase() === "community");
1028
+ const canUserRegisterCommunityPlus = computed(
1029
+ () => getResourcePermissions(usersStore.currentUser?.globalScopes).community.register
1030
+ );
964
1031
  watch(
965
1032
  () => route.params?.projectId,
966
1033
  async () => {
@@ -978,26 +1045,58 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
978
1045
  if (name !== "pullWorkfolder") return;
979
1046
  after(async () => await initialize());
980
1047
  });
1048
+ const onWorkflowDeleted = async () => {
1049
+ await Promise.all([
1050
+ fetchWorkflows(),
1051
+ foldersStore.fetchTotalWorkflowsAndFoldersCount(route.params.projectId)
1052
+ ]);
1053
+ };
1054
+ const onFolderDeleted = async (payload) => {
1055
+ const folderInfo = foldersStore.getCachedFolder(payload.folderId);
1056
+ foldersStore.deleteFoldersFromCache([payload.folderId, folderInfo?.parentFolder ?? ""]);
1057
+ await foldersStore.fetchTotalWorkflowsAndFoldersCount(
1058
+ route.params.projectId
1059
+ );
1060
+ if (currentFolderId.value === payload.folderId) {
1061
+ void router.push({
1062
+ name: VIEWS.PROJECTS_FOLDERS,
1063
+ params: { projectId: route.params.projectId, folderId: folderInfo?.parentFolder ?? "" }
1064
+ });
1065
+ } else {
1066
+ await fetchWorkflows();
1067
+ }
1068
+ telemetry.track("User deleted folder", {
1069
+ folder_id: payload.folderId,
1070
+ deleted_sub_folders: payload.folderCount,
1071
+ deleted_sub_workflows: payload.workflowCount
1072
+ });
1073
+ };
981
1074
  onMounted(async () => {
982
1075
  documentTitle.set(i18n.baseText("workflows.heading"));
983
1076
  void usersStore.showPersonalizationSurvey();
984
1077
  workflowListEventBus.on("resource-moved", fetchWorkflows);
985
1078
  workflowListEventBus.on("workflow-duplicated", fetchWorkflows);
1079
+ workflowListEventBus.on("folder-deleted", onFolderDeleted);
1080
+ workflowListEventBus.on("folder-moved", moveFolder);
1081
+ workflowListEventBus.on("workflow-moved", onWorkflowMoved);
986
1082
  });
987
1083
  onBeforeUnmount(() => {
988
1084
  workflowListEventBus.off("resource-moved", fetchWorkflows);
989
1085
  workflowListEventBus.off("workflow-duplicated", fetchWorkflows);
1086
+ workflowListEventBus.off("folder-deleted", onFolderDeleted);
1087
+ workflowListEventBus.off("folder-moved", moveFolder);
1088
+ workflowListEventBus.off("workflow-moved", onWorkflowMoved);
990
1089
  });
991
1090
  const initialize = async () => {
992
1091
  loading.value = true;
993
1092
  await setFiltersFromQueryString();
994
- if (!route.params.folderId) {
995
- currentFolderId.value = null;
996
- }
1093
+ currentFolderId.value = route.params.folderId;
997
1094
  const [, resourcesPage] = await Promise.all([
998
1095
  usersStore.fetchUsers(),
999
1096
  fetchWorkflows(),
1000
- workflowsStore.fetchActiveWorkflows()
1097
+ workflowsStore.fetchActiveWorkflows(),
1098
+ usageStore.getLicenseInfo(),
1099
+ foldersStore.fetchTotalWorkflowsAndFoldersCount(route.params.projectId)
1001
1100
  ]);
1002
1101
  breadcrumbsLoading.value = false;
1003
1102
  workflowsAndFolders.value = resourcesPage;
@@ -1010,36 +1109,47 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
1010
1109
  const routeProjectId = route.params?.projectId;
1011
1110
  const homeProjectFilter = filters.value.homeProject || void 0;
1012
1111
  const parentFolder = route.params?.folderId || void 0;
1013
- const fetchedResources = await workflowsStore.fetchWorkflowsPage(
1014
- routeProjectId ?? homeProjectFilter,
1015
- currentPage.value,
1016
- pageSize.value,
1017
- currentSort.value,
1018
- {
1019
- name: filters.value.search || void 0,
1020
- active: filters.value.status === StatusFilter.ALL ? void 0 : filters.value.status === StatusFilter.ACTIVE,
1021
- tags: filters.value.tags.map((tagId) => tagsStore.tagsById[tagId]?.name),
1022
- parentFolderId: parentFolder ?? "0"
1023
- // 0 is the root folder in the API
1024
- },
1025
- showFolders.value
1026
- );
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;
1112
+ const tags = filters.value.tags.length ? filters.value.tags.map((tagId) => tagsStore.tagsById[tagId]?.name) : [];
1113
+ const activeFilter = filters.value.status === StatusFilter.ALL ? void 0 : filters.value.status === StatusFilter.ACTIVE;
1114
+ const fetchFolders = showFolders.value && !tags.length && activeFilter === void 0;
1115
+ try {
1116
+ const fetchedResources = await workflowsStore.fetchWorkflowsPage(
1117
+ routeProjectId ?? homeProjectFilter,
1118
+ currentPage.value,
1119
+ pageSize.value,
1120
+ currentSort.value,
1121
+ {
1122
+ name: filters.value.search || void 0,
1123
+ active: activeFilter,
1124
+ tags: tags.length ? tags : void 0,
1125
+ parentFolderId: parentFolder ?? (isOverviewPage.value ? void 0 : "0")
1126
+ // Sending 0 will only show one level of folders
1127
+ },
1128
+ fetchFolders
1129
+ );
1130
+ foldersStore.cacheFolders(
1131
+ fetchedResources.filter((resource) => resource.resource === "folder").map((r) => ({ id: r.id, name: r.name, parentFolder: r.parentFolder?.id }))
1132
+ );
1133
+ const isCurrentFolderCached = foldersStore.breadcrumbsCache[parentFolder ?? ""] !== void 0;
1134
+ const needToFetchFolderPath = parentFolder && !isCurrentFolderCached && routeProjectId;
1135
+ if (needToFetchFolderPath) {
1136
+ breadcrumbsLoading.value = true;
1137
+ await foldersStore.getFolderPath(routeProjectId, parentFolder);
1138
+ breadcrumbsLoading.value = false;
1139
+ }
1140
+ workflowsAndFolders.value = fetchedResources;
1141
+ return fetchedResources;
1142
+ } catch (error) {
1143
+ toast.showError(error, i18n.baseText("workflows.list.error.fetching"));
1144
+ void router.push({ name: VIEWS.PROJECTS_FOLDERS, params: { projectId: routeProjectId } });
1145
+ return [];
1146
+ } finally {
1147
+ delayedLoading.cancel();
1148
+ loading.value = false;
1149
+ if (breadcrumbsLoading.value) {
1150
+ breadcrumbsLoading.value = false;
1151
+ }
1037
1152
  }
1038
- await foldersStore.fetchTotalWorkflowsAndFoldersCount(routeProjectId);
1039
- delayedLoading.cancel();
1040
- workflowsAndFolders.value = fetchedResources;
1041
- loading.value = false;
1042
- return fetchedResources;
1043
1153
  };
1044
1154
  const onSortUpdated = async (sort) => {
1045
1155
  currentSort.value = WORKFLOWS_SORT_MAP[sort] ?? "updatedAt:desc";
@@ -1053,24 +1163,24 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
1053
1163
  const onFiltersUpdated = async () => {
1054
1164
  currentPage.value = 1;
1055
1165
  saveFiltersOnQueryString();
1056
- await fetchWorkflows();
1166
+ await callDebounced(fetchWorkflows, { debounceTime: FILTERS_DEBOUNCE_TIME, trailing: true });
1057
1167
  };
1058
1168
  const onSearchUpdated = async (search) => {
1059
1169
  currentPage.value = 1;
1060
1170
  saveFiltersOnQueryString();
1061
1171
  if (search) {
1062
- await callDebounced(fetchWorkflows, { debounceTime: 500, trailing: true });
1172
+ await callDebounced(fetchWorkflows, { debounceTime: SEARCH_DEBOUNCE_TIME, trailing: true });
1063
1173
  } else {
1064
1174
  await fetchWorkflows();
1065
1175
  }
1066
1176
  };
1067
1177
  const setCurrentPage = async (page) => {
1068
1178
  currentPage.value = page;
1069
- await fetchWorkflows();
1179
+ await callDebounced(fetchWorkflows, { debounceTime: FILTERS_DEBOUNCE_TIME, trailing: true });
1070
1180
  };
1071
1181
  const setPageSize = async (size) => {
1072
1182
  pageSize.value = size;
1073
- await fetchWorkflows();
1183
+ await callDebounced(fetchWorkflows, { debounceTime: FILTERS_DEBOUNCE_TIME, trailing: true });
1074
1184
  };
1075
1185
  const onClickTag = async (tagId) => {
1076
1186
  if (!filters.value.tags.includes(tagId)) {
@@ -1204,6 +1314,31 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
1204
1314
  if (!workflow) return;
1205
1315
  workflow.active = data.active;
1206
1316
  };
1317
+ const getFolderListItem = (folderId) => {
1318
+ return workflowsAndFolders.value.find(
1319
+ (resource) => resource.resource === "folder" && resource.id === folderId
1320
+ );
1321
+ };
1322
+ const getFolderContent = async (folderId) => {
1323
+ const folderListItem = getFolderListItem(folderId);
1324
+ if (folderListItem) {
1325
+ return {
1326
+ workflowCount: folderListItem.workflowCount,
1327
+ subFolderCount: folderListItem.subFolderCount
1328
+ };
1329
+ }
1330
+ try {
1331
+ const content = await foldersStore.fetchFolderContent(currentProject.value?.id ?? "", folderId);
1332
+ return { workflowCount: content.totalWorkflows, subFolderCount: content.totalSubFolders };
1333
+ } catch (error) {
1334
+ toast.showMessage({
1335
+ title: i18n.baseText("folders.delete.error.message"),
1336
+ message: i18n.baseText("folders.not.found.message"),
1337
+ type: "error"
1338
+ });
1339
+ return { workflowCount: 0, subFolderCount: 0 };
1340
+ }
1341
+ };
1207
1342
  const visibleBreadcrumbsItems = computed(() => {
1208
1343
  if (!currentFolder.value) return [];
1209
1344
  const items = [];
@@ -1247,20 +1382,6 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
1247
1382
  hiddenItems: hiddenBreadcrumbsItems.value
1248
1383
  };
1249
1384
  });
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
1385
  const onBreadcrumbItemClick = (item) => {
1265
1386
  if (item.href) {
1266
1387
  loading.value = true;
@@ -1268,7 +1389,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
1268
1389
  currentFolderId.value = item.id;
1269
1390
  loading.value = false;
1270
1391
  }).catch((error) => {
1271
- toast.showError(error, "Error navigating to folder");
1392
+ toast.showError(error, i18n.baseText("folders.open.error.title"));
1272
1393
  });
1273
1394
  }
1274
1395
  };
@@ -1278,7 +1399,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
1278
1399
  if (!route.params.projectId) return;
1279
1400
  const currentParent = currentFolder.value?.name || projectName.value;
1280
1401
  if (!currentParent) return;
1281
- await createFolder2({
1402
+ await createFolder({
1282
1403
  id: route.params.folderId ?? "-1",
1283
1404
  name: currentParent,
1284
1405
  type: currentFolder.value ? "folder" : "project"
@@ -1287,6 +1408,31 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
1287
1408
  case FOLDER_LIST_ITEM_ACTIONS.CREATE_WORKFLOW:
1288
1409
  addWorkflow();
1289
1410
  break;
1411
+ case FOLDER_LIST_ITEM_ACTIONS.DELETE:
1412
+ if (!route.params.folderId) return;
1413
+ const content = await getFolderContent(route.params.folderId);
1414
+ await deleteFolder(
1415
+ route.params.folderId,
1416
+ content.workflowCount,
1417
+ content.subFolderCount
1418
+ );
1419
+ break;
1420
+ case FOLDER_LIST_ITEM_ACTIONS.RENAME:
1421
+ if (!route.params.folderId) return;
1422
+ await renameFolder(route.params.folderId);
1423
+ break;
1424
+ case FOLDER_LIST_ITEM_ACTIONS.MOVE:
1425
+ if (!currentFolder.value) return;
1426
+ uiStore.openMoveToFolderModal(
1427
+ "folder",
1428
+ {
1429
+ id: currentFolder.value?.id,
1430
+ name: currentFolder.value?.name,
1431
+ parentFolderId: currentFolder.value?.parentFolder
1432
+ },
1433
+ workflowListEventBus
1434
+ );
1435
+ break;
1290
1436
  }
1291
1437
  };
1292
1438
  const onFolderCardAction = async (payload) => {
@@ -1294,11 +1440,14 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
1294
1440
  if (!clickedFolder) return;
1295
1441
  switch (payload.action) {
1296
1442
  case FOLDER_LIST_ITEM_ACTIONS.CREATE:
1297
- await createFolder2({
1298
- id: clickedFolder.id,
1299
- name: clickedFolder.name,
1300
- type: "folder"
1301
- });
1443
+ await createFolder(
1444
+ {
1445
+ id: clickedFolder.id,
1446
+ name: clickedFolder.name,
1447
+ type: "folder"
1448
+ },
1449
+ { openAfterCreate: true }
1450
+ );
1302
1451
  break;
1303
1452
  case FOLDER_LIST_ITEM_ACTIONS.CREATE_WORKFLOW:
1304
1453
  currentFolderId.value = clickedFolder.id;
@@ -1307,17 +1456,34 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
1307
1456
  query: { projectId: route.params?.projectId, parentFolderId: clickedFolder.id }
1308
1457
  });
1309
1458
  break;
1459
+ case FOLDER_LIST_ITEM_ACTIONS.DELETE: {
1460
+ const content = await getFolderContent(clickedFolder.id);
1461
+ await deleteFolder(clickedFolder.id, content.workflowCount, content.subFolderCount);
1462
+ break;
1463
+ }
1464
+ case FOLDER_LIST_ITEM_ACTIONS.RENAME:
1465
+ await renameFolder(clickedFolder.id);
1466
+ break;
1467
+ case FOLDER_LIST_ITEM_ACTIONS.MOVE:
1468
+ uiStore.openMoveToFolderModal(
1469
+ "folder",
1470
+ {
1471
+ id: clickedFolder.id,
1472
+ name: clickedFolder.name,
1473
+ parentFolderId: clickedFolder.parentFolder
1474
+ },
1475
+ workflowListEventBus
1476
+ );
1477
+ break;
1310
1478
  }
1311
1479
  };
1312
- const createFolder2 = async (parent) => {
1480
+ const createFolder = async (parent, options = { openAfterCreate: false }) => {
1313
1481
  const promptResponsePromise = message.prompt(
1314
1482
  i18n.baseText("folders.add.to.parent.message", { interpolate: { parent: parent.name } }),
1315
1483
  {
1316
1484
  confirmButtonText: i18n.baseText("generic.create"),
1317
1485
  cancelButtonText: i18n.baseText("generic.cancel"),
1318
- inputErrorMessage: i18n.baseText("folders.add.invalidName.message"),
1319
- inputValue: "",
1320
- inputPattern: /^[a-zA-Z0-9-_ ]{1,100}$/,
1486
+ inputValidator: folderHelpers.validateFolderName,
1321
1487
  customClass: "add-folder-modal"
1322
1488
  }
1323
1489
  );
@@ -1330,51 +1496,228 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
1330
1496
  route.params.projectId,
1331
1497
  parent.type === "folder" ? parent.id : void 0
1332
1498
  );
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({
1499
+ const newFolderURL = router.resolve({
1500
+ name: VIEWS.PROJECTS_FOLDERS,
1501
+ params: { projectId: route.params.projectId, folderId: newFolder.id }
1502
+ }).href;
1503
+ toast.showToast({
1338
1504
  title: i18n.baseText("folders.add.success.title"),
1339
1505
  message: i18n.baseText("folders.add.success.message", {
1340
1506
  interpolate: {
1341
1507
  link: newFolderURL,
1342
- name: newFolder.name
1508
+ folderName: newFolder.name
1343
1509
  }
1344
1510
  }),
1511
+ onClick: (event) => {
1512
+ if (event?.target instanceof HTMLAnchorElement) {
1513
+ event.preventDefault();
1514
+ void router.push(newFolderURL);
1515
+ }
1516
+ },
1345
1517
  type: "success"
1346
1518
  });
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
- ];
1519
+ telemetry.track("User created folder", {
1520
+ folder_id: newFolder.id
1521
+ });
1522
+ if (options.openAfterCreate) {
1523
+ await router.push({
1524
+ name: VIEWS.PROJECTS_FOLDERS,
1525
+ params: { projectId: route.params.projectId, folderId: parent.id }
1526
+ });
1360
1527
  } else {
1361
- await fetchWorkflows();
1528
+ if (!workflowsAndFolders.value.length) {
1529
+ workflowsAndFolders.value = [
1530
+ {
1531
+ id: newFolder.id,
1532
+ name: newFolder.name,
1533
+ resource: "folder",
1534
+ createdAt: newFolder.createdAt,
1535
+ updatedAt: newFolder.updatedAt,
1536
+ homeProject: projectsStore.currentProject,
1537
+ sharedWithProjects: [],
1538
+ workflowCount: 0,
1539
+ subFolderCount: 0
1540
+ }
1541
+ ];
1542
+ foldersStore.cacheFolders([
1543
+ { id: newFolder.id, name: newFolder.name, parentFolder: currentFolder.value?.id }
1544
+ ]);
1545
+ } else {
1546
+ await fetchWorkflows();
1547
+ }
1362
1548
  }
1363
1549
  } catch (error) {
1364
- toast.showError(error, "Error creating folder");
1550
+ toast.showError(error, i18n.baseText("folders.create.error.title"));
1551
+ }
1552
+ }
1553
+ };
1554
+ const renameFolder = async (folderId) => {
1555
+ const folder = foldersStore.getCachedFolder(folderId);
1556
+ if (!folder || !currentProject.value) return;
1557
+ const promptResponsePromise = message.prompt(
1558
+ i18n.baseText("folders.rename.message", { interpolate: { folderName: folder.name } }),
1559
+ {
1560
+ confirmButtonText: i18n.baseText("generic.rename"),
1561
+ cancelButtonText: i18n.baseText("generic.cancel"),
1562
+ inputValue: folder.name,
1563
+ customClass: "rename-folder-modal",
1564
+ inputValidator: folderHelpers.validateFolderName
1565
+ }
1566
+ );
1567
+ const promptResponse = await promptResponsePromise;
1568
+ if (promptResponse.action === MODAL_CONFIRM) {
1569
+ const newFolderName = promptResponse.value;
1570
+ try {
1571
+ await foldersStore.renameFolder(currentProject.value?.id, folderId, newFolderName);
1572
+ foldersStore.breadcrumbsCache[folderId].name = newFolderName;
1573
+ toast.showMessage({
1574
+ title: i18n.baseText("folders.rename.success.message", {
1575
+ interpolate: { folderName: newFolderName }
1576
+ }),
1577
+ type: "success"
1578
+ });
1579
+ await fetchWorkflows();
1580
+ telemetry.track("User renamed folder", {
1581
+ folder_id: folderId
1582
+ });
1583
+ } catch (error) {
1584
+ toast.showError(error, i18n.baseText("folders.rename.error.title"));
1365
1585
  }
1366
1586
  }
1367
1587
  };
1368
1588
  const createFolderInCurrent = async () => {
1589
+ if (isCommunity.value && canUserRegisterCommunityPlus.value) {
1590
+ uiStore.openModalWithData({
1591
+ name: COMMUNITY_PLUS_ENROLLMENT_MODAL,
1592
+ data: { customHeading: i18n.baseText("folders.registeredCommunity.cta.heading") }
1593
+ });
1594
+ return;
1595
+ }
1369
1596
  if (!route.params.projectId) return;
1370
1597
  const currentParent = currentFolder.value?.name || projectName.value;
1371
1598
  if (!currentParent) return;
1372
- await createFolder2({
1599
+ await createFolder({
1373
1600
  id: route.params.folderId ?? "-1",
1374
1601
  name: currentParent,
1375
1602
  type: currentFolder.value ? "folder" : "project"
1376
1603
  });
1377
1604
  };
1605
+ const deleteFolder = async (folderId, workflowCount, subFolderCount) => {
1606
+ if (subFolderCount || workflowCount) {
1607
+ uiStore.openDeleteFolderModal(folderId, workflowListEventBus, {
1608
+ workflowCount,
1609
+ subFolderCount
1610
+ });
1611
+ } else {
1612
+ await foldersStore.deleteFolder(route.params.projectId, folderId);
1613
+ toast.showMessage({
1614
+ title: i18n.baseText("folders.delete.success.message"),
1615
+ type: "success"
1616
+ });
1617
+ await onFolderDeleted({ folderId, workflowCount, folderCount: subFolderCount });
1618
+ }
1619
+ };
1620
+ const moveFolder = async (payload) => {
1621
+ if (!route.params.projectId) return;
1622
+ try {
1623
+ await foldersStore.moveFolder(
1624
+ route.params.projectId,
1625
+ payload.folder.id,
1626
+ payload.newParent.type === "project" ? "0" : payload.newParent.id
1627
+ );
1628
+ const isCurrentFolder = currentFolderId.value === payload.folder.id;
1629
+ const newFolderURL = router.resolve({
1630
+ name: VIEWS.PROJECTS_FOLDERS,
1631
+ params: {
1632
+ projectId: route.params.projectId,
1633
+ folderId: payload.newParent.type === "project" ? void 0 : payload.newParent.id
1634
+ }
1635
+ }).href;
1636
+ if (isCurrentFolder) {
1637
+ void router.push(newFolderURL);
1638
+ } else {
1639
+ toast.showToast({
1640
+ title: i18n.baseText("folders.move.success.title"),
1641
+ message: i18n.baseText("folders.move.success.message", {
1642
+ interpolate: { folderName: payload.folder.name, newFolderName: payload.newParent.name }
1643
+ }),
1644
+ onClick: (event) => {
1645
+ if (event?.target instanceof HTMLAnchorElement) {
1646
+ event.preventDefault();
1647
+ void router.push(newFolderURL);
1648
+ }
1649
+ },
1650
+ type: "success"
1651
+ });
1652
+ await fetchWorkflows();
1653
+ }
1654
+ } catch (error) {
1655
+ toast.showError(error, i18n.baseText("folders.move.error.title"));
1656
+ }
1657
+ };
1658
+ const moveWorkflowToFolder = async (payload) => {
1659
+ if (isCommunity.value && canUserRegisterCommunityPlus.value) {
1660
+ uiStore.openModalWithData({
1661
+ name: COMMUNITY_PLUS_ENROLLMENT_MODAL,
1662
+ data: { customHeading: i18n.baseText("folders.registeredCommunity.cta.heading") }
1663
+ });
1664
+ return;
1665
+ }
1666
+ uiStore.openMoveToFolderModal(
1667
+ "workflow",
1668
+ { id: payload.id, name: payload.name, parentFolderId: payload.parentFolderId },
1669
+ workflowListEventBus
1670
+ );
1671
+ };
1672
+ const onWorkflowMoved = async (payload) => {
1673
+ if (!route.params.projectId) return;
1674
+ try {
1675
+ const newFolderURL = router.resolve({
1676
+ name: VIEWS.PROJECTS_FOLDERS,
1677
+ params: {
1678
+ projectId: route.params.projectId,
1679
+ folderId: payload.newParent.type === "project" ? void 0 : payload.newParent.id
1680
+ }
1681
+ }).href;
1682
+ const workflowResource = workflowsAndFolders.value.find(
1683
+ (resource) => resource.id === payload.workflow.id
1684
+ );
1685
+ await workflowsStore.updateWorkflow(payload.workflow.id, {
1686
+ parentFolderId: payload.newParent.type === "project" ? "0" : payload.newParent.id,
1687
+ versionId: workflowResource?.versionId
1688
+ });
1689
+ await fetchWorkflows();
1690
+ toast.showToast({
1691
+ title: i18n.baseText("folders.move.workflow.success.title"),
1692
+ message: i18n.baseText("folders.move.workflow.success.message", {
1693
+ interpolate: { workflowName: payload.workflow.name, newFolderName: payload.newParent.name }
1694
+ }),
1695
+ onClick: (event) => {
1696
+ if (event?.target instanceof HTMLAnchorElement) {
1697
+ event.preventDefault();
1698
+ void router.push(newFolderURL);
1699
+ }
1700
+ },
1701
+ type: "success"
1702
+ });
1703
+ telemetry.track("User moved content", {
1704
+ workflow_id: payload.workflow.id,
1705
+ source_folder_id: payload.workflow.oldParentId,
1706
+ destination_folder_id: payload.newParent.id
1707
+ });
1708
+ } catch (error) {
1709
+ toast.showError(error, i18n.baseText("folders.move.workflow.error.title"));
1710
+ }
1711
+ };
1712
+ const onCreateWorkflowClick = () => {
1713
+ void router.push({
1714
+ name: VIEWS.NEW_WORKFLOW,
1715
+ query: {
1716
+ projectId: currentProject.value?.id,
1717
+ parentFolderId: route.params.folderId
1718
+ }
1719
+ });
1720
+ };
1378
1721
  return (_ctx, _cache) => {
1379
1722
  const _component_N8nButton = resolveComponent("N8nButton");
1380
1723
  const _component_N8nTooltip = resolveComponent("N8nTooltip");
@@ -1383,6 +1726,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
1383
1726
  const _component_n8n_loading = resolveComponent("n8n-loading");
1384
1727
  const _component_FolderBreadcrumbs = __unplugin_components_0;
1385
1728
  const _component_FolderCard = __unplugin_components_1;
1729
+ const _component_n8n_action_box = resolveComponent("n8n-action-box");
1386
1730
  return openBlock(), createBlock(ResourcesListLayout, {
1387
1731
  filters: filters.value,
1388
1732
  "onUpdate:filters": [
@@ -1401,6 +1745,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
1401
1745
  "custom-page-size": unref(DEFAULT_WORKFLOW_PAGE_SIZE),
1402
1746
  "total-items": unref(workflowsStore).totalWorkflowCount,
1403
1747
  "dont-perform-sorting-and-filtering": true,
1748
+ "has-empty-state": unref(foldersStore).totalWorkflowCount === 0 && !currentFolderId.value,
1404
1749
  "onClick:add": addWorkflow,
1405
1750
  "onUpdate:search": onSearchUpdated,
1406
1751
  "onUpdate:currentPage": setCurrentPage,
@@ -1408,7 +1753,16 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
1408
1753
  onSort: onSortUpdated
1409
1754
  }, createSlots({
1410
1755
  header: withCtx(() => [
1411
- createVNode(ProjectHeader, { onCreateFolder: createFolderInCurrent })
1756
+ createVNode(ProjectHeader, { onCreateFolder: createFolderInCurrent }, {
1757
+ default: withCtx(() => [
1758
+ unref(overview).isOverviewSubPage ? (openBlock(), createBlock(InsightsSummary, {
1759
+ key: 0,
1760
+ loading: unref(insightsStore).summary.isLoading,
1761
+ summary: unref(insightsStore).summary.state
1762
+ }, null, 8, ["loading", "summary"])) : createCommentVNode("", true)
1763
+ ]),
1764
+ _: 1
1765
+ })
1412
1766
  ]),
1413
1767
  callout: withCtx(() => [
1414
1768
  showEasyAIWorkflowCallout.value && easyAICalloutVisible.value ? (openBlock(), createBlock(_component_N8nCallout, {
@@ -1459,7 +1813,8 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
1459
1813
  }, null, 8, ["loading"])
1460
1814
  ], 2)) : showFolders.value && currentFolder.value ? (openBlock(), createElementBlock("div", {
1461
1815
  key: 1,
1462
- class: normalizeClass(_ctx.$style["breadcrumbs-container"])
1816
+ class: normalizeClass(_ctx.$style["breadcrumbs-container"]),
1817
+ "data-test-id": "main-breadcrumbs"
1463
1818
  }, [
1464
1819
  createVNode(_component_FolderBreadcrumbs, {
1465
1820
  breadcrumbs: mainBreadcrumbs.value,
@@ -1474,26 +1829,26 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
1474
1829
  key: 0,
1475
1830
  data,
1476
1831
  actions: folderCardActions.value,
1477
- breadcrumbs: cardBreadcrumbs.value,
1832
+ "read-only": readOnlyEnv.value || !hasPermissionToDeleteFolders.value && !hasPermissionToCreateFolders.value,
1478
1833
  class: "mb-2xs",
1479
1834
  onAction: onFolderCardAction
1480
- }, null, 8, ["data", "actions", "breadcrumbs"])) : (openBlock(), createBlock(WorkflowCard, {
1835
+ }, null, 8, ["data", "actions", "read-only"])) : (openBlock(), createBlock(WorkflowCard, {
1481
1836
  key: 1,
1482
- "data-test-id": "resources-list-item",
1837
+ "data-test-id": "resources-list-item-workflow",
1483
1838
  class: "mb-2xs",
1484
1839
  data,
1485
- breadcrumbs: cardBreadcrumbs.value,
1486
1840
  "workflow-list-event-bus": unref(workflowListEventBus),
1487
1841
  "read-only": readOnlyEnv.value,
1488
1842
  "onClick:tag": onClickTag,
1489
- "onWorkflow:deleted": fetchWorkflows,
1843
+ "onWorkflow:deleted": onWorkflowDeleted,
1490
1844
  "onWorkflow:moved": fetchWorkflows,
1491
1845
  "onWorkflow:duplicated": fetchWorkflows,
1492
- "onWorkflow:activeToggle": onWorkflowActiveToggle
1493
- }, null, 8, ["data", "breadcrumbs", "workflow-list-event-bus", "read-only"]))
1846
+ "onWorkflow:activeToggle": onWorkflowActiveToggle,
1847
+ "onAction:moveToFolder": moveWorkflowToFolder
1848
+ }, null, 8, ["data", "workflow-list-event-bus", "read-only"]))
1494
1849
  ]),
1495
1850
  empty: withCtx(() => [
1496
- createBaseVNode("div", _hoisted_1, [
1851
+ createBaseVNode("div", _hoisted_5, [
1497
1852
  createVNode(unref(N8nHeading), {
1498
1853
  tag: "h2",
1499
1854
  size: "xlarge",
@@ -1572,7 +1927,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
1572
1927
  ], 2)) : createCommentVNode("", true)
1573
1928
  ]),
1574
1929
  filters: withCtx(({ setKeyValue }) => [
1575
- unref(settingsStore).areTagsEnabled ? (openBlock(), createElementBlock("div", _hoisted_2, [
1930
+ unref(settingsStore).areTagsEnabled ? (openBlock(), createElementBlock("div", _hoisted_6, [
1576
1931
  createVNode(unref(N8nInputLabel), {
1577
1932
  label: unref(i18n).baseText("workflows.filters.tags"),
1578
1933
  bold: false,
@@ -1587,7 +1942,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
1587
1942
  "onUpdate:modelValue": ($event) => setKeyValue("tags", $event)
1588
1943
  }, null, 8, ["placeholder", "model-value", "onUpdate:modelValue"])
1589
1944
  ])) : createCommentVNode("", true),
1590
- createBaseVNode("div", _hoisted_3, [
1945
+ createBaseVNode("div", _hoisted_7, [
1591
1946
  createVNode(unref(N8nInputLabel), {
1592
1947
  label: unref(i18n).baseText("workflows.filters.status"),
1593
1948
  bold: false,
@@ -1614,48 +1969,78 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
1614
1969
  }, 1032, ["model-value", "onUpdate:modelValue"])
1615
1970
  ])
1616
1971
  ]),
1972
+ postamble: withCtx(() => [
1973
+ workflowsAndFolders.value.length === 0 && currentFolder.value && !hasFilters.value ? (openBlock(), createElementBlock("div", {
1974
+ key: 0,
1975
+ class: normalizeClass(_ctx.$style["empty-folder-container"]),
1976
+ "data-test-id": "empty-folder-container"
1977
+ }, [
1978
+ createVNode(_component_n8n_action_box, {
1979
+ "data-test-id": "empty-folder-action-box",
1980
+ heading: unref(i18n).baseText("folders.empty.actionbox.title", {
1981
+ interpolate: { folderName: currentFolder.value.name }
1982
+ }),
1983
+ "button-text": unref(i18n).baseText("generic.create.workflow"),
1984
+ "button-type": "secondary",
1985
+ "button-disabled": readOnlyEnv.value || !projectPermissions.value.workflow.create,
1986
+ "onClick:button": onCreateWorkflowClick
1987
+ }, {
1988
+ disabledButtonTooltip: withCtx(() => [
1989
+ createTextVNode(toDisplayString(readOnlyEnv.value ? unref(i18n).baseText("readOnlyEnv.cantAdd.workflow") : unref(i18n).baseText("generic.missing.permissions")), 1)
1990
+ ]),
1991
+ _: 1
1992
+ }, 8, ["heading", "button-text", "button-disabled"])
1993
+ ], 2)) : createCommentVNode("", true)
1994
+ ]),
1617
1995
  _: 2
1618
1996
  }, [
1619
- showFolders.value ? {
1997
+ foldersEnabled.value ? {
1620
1998
  name: "add-button",
1621
1999
  fn: withCtx(() => [
1622
- createVNode(_component_N8nTooltip, { placement: "top" }, {
2000
+ createVNode(_component_N8nTooltip, {
2001
+ placement: "top",
2002
+ disabled: !(isOverviewPage.value || !readOnlyEnv.value && hasPermissionToCreateFolders.value)
2003
+ }, {
1623
2004
  content: withCtx(() => [
1624
- createTextVNode(toDisplayString(currentParentName.value ? unref(i18n).baseText("folders.add.to.parent.message", {
2005
+ isOverviewPage.value ? (openBlock(), createElementBlock("span", _hoisted_1, [
2006
+ 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))
2007
+ ])) : !readOnlyEnv.value && hasPermissionToCreateFolders.value ? (openBlock(), createElementBlock("span", _hoisted_4, toDisplayString(currentParentName.value ? unref(i18n).baseText("folders.add.to.parent.message", {
1625
2008
  interpolate: { parent: currentParentName.value }
1626
- }) : unref(i18n).baseText("folders.add.here.message")), 1)
2009
+ }) : unref(i18n).baseText("folders.add.here.message")), 1)) : createCommentVNode("", true)
1627
2010
  ]),
1628
2011
  default: withCtx(() => [
1629
2012
  createVNode(_component_N8nButton, {
1630
- size: "large",
2013
+ size: "small",
1631
2014
  icon: "folder-plus",
1632
2015
  type: "tertiary",
1633
2016
  "data-test-id": "add-folder-button",
1634
2017
  class: normalizeClass(_ctx.$style["add-folder-button"]),
2018
+ disabled: readOnlyEnv.value || !hasPermissionToCreateFolders.value,
1635
2019
  onClick: createFolderInCurrent
1636
- }, null, 8, ["class"])
2020
+ }, null, 8, ["class", "disabled"])
1637
2021
  ]),
1638
2022
  _: 1
1639
- })
2023
+ }, 8, ["disabled"])
1640
2024
  ]),
1641
2025
  key: "0"
1642
2026
  } : void 0
1643
- ]), 1032, ["filters", "resources", "shareable", "disabled", "resources-refreshing", "custom-page-size", "total-items"]);
2027
+ ]), 1032, ["filters", "resources", "shareable", "disabled", "resources-refreshing", "custom-page-size", "total-items", "has-empty-state"]);
1644
2028
  };
1645
2029
  }
1646
2030
  });
1647
- const actionsContainer = "_actionsContainer_j58pl_123";
1648
- const emptyStateCard = "_emptyStateCard_j58pl_139";
1649
- const emptyStateCardIcon = "_emptyStateCardIcon_j58pl_152";
2031
+ const actionsContainer = "_actionsContainer_f2oet_123";
2032
+ const emptyStateCard = "_emptyStateCard_f2oet_139";
2033
+ const emptyStateCardIcon = "_emptyStateCardIcon_f2oet_152";
1650
2034
  const style0 = {
1651
2035
  actionsContainer,
1652
- "easy-ai-workflow-callout": "_easy-ai-workflow-callout_j58pl_128",
1653
- "callout-trailing-content": "_callout-trailing-content_j58pl_133",
2036
+ "easy-ai-workflow-callout": "_easy-ai-workflow-callout_f2oet_128",
2037
+ "callout-trailing-content": "_callout-trailing-content_f2oet_133",
1654
2038
  emptyStateCard,
1655
2039
  emptyStateCardIcon,
1656
- "add-folder-button": "_add-folder-button_j58pl_161",
1657
- "breadcrumbs-container": "_breadcrumbs-container_j58pl_165",
1658
- "breadcrumbs-loading": "_breadcrumbs-loading_j58pl_170"
2040
+ "add-folder-button": "_add-folder-button_f2oet_161",
2041
+ "breadcrumbs-container": "_breadcrumbs-container_f2oet_166",
2042
+ "breadcrumbs-loading": "_breadcrumbs-loading_f2oet_172",
2043
+ "empty-folder-container": "_empty-folder-container_f2oet_178"
1659
2044
  };
1660
2045
  const cssModules = {
1661
2046
  "$style": style0