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.
- 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
- package/dist/assets/{AuthView-C7UxnH6d.js → AuthView-Bwnmj61F.js} +2 -2
- package/dist/assets/{CanvasChat-CSLR5tKe.css → CanvasChatSwitch-BcSDHC-c.css} +546 -33
- package/dist/assets/{CanvasChat-CmjR9yPV.js → CanvasChatSwitch-Dgc1t6ax.js} +1047 -550
- package/dist/assets/{ChangePasswordView-ah8H7l7b.js → ChangePasswordView-Ojbow8CX.js} +3 -3
- package/dist/assets/CollectionParameter-2r_LuiyO.js +4 -0
- package/dist/assets/CommitMonoVariable-ytizKI8U.woff2 +0 -0
- package/dist/assets/{CredentialsView-DqcTSsjv.js → CredentialsView-DhEvPiu_.js} +19 -9
- package/dist/assets/{ErrorView-DG7aEbhz.js → ErrorView-RGryGbpa.js} +1 -1
- package/dist/assets/{ConcurrentExecutionsHeader-CEBmSYNK.css → ExecutionsTime-BOPJEomw.css} +63 -63
- package/dist/assets/{ConcurrentExecutionsHeader-tdwilNra.js → ExecutionsTime.vue_vue_type_script_setup_true_lang-Iwq0aeRX.js} +114 -114
- package/dist/assets/ExecutionsView-CL7Ei3Em.js +943 -0
- package/dist/assets/{ExecutionsView-CB1tvZfo.css → ExecutionsView-JCKikuIS.css} +60 -188
- package/dist/assets/{FileSaver.min-D9u6MONp.js → FileSaver.min-C4OYrSWg.js} +1 -1
- package/dist/assets/{FixedCollectionParameter-CLjLHGyL.js → FixedCollectionParameter-CJ4s-1jy.js} +1 -1
- package/dist/assets/{ForgotMyPasswordView-DDtUSUcw.js → ForgotMyPasswordView-7tFMaf89.js} +3 -3
- package/dist/assets/InterVariable-DiVDrmQJ.woff2 +0 -0
- package/dist/assets/InterVariable-Italic-FCBEiFp6.woff2 +0 -0
- package/dist/assets/{Logo-CBvZEey7.js → Logo-BW8jOa0h.js} +8 -19
- package/dist/assets/{ProjectHeader-BZ6b6lat.css → Logo-DLBj1gMw.css} +23 -17
- package/dist/assets/{MainHeader-PgJurmwZ.js → MainHeader-BUWCKbvC.js} +47 -22
- package/dist/assets/{MainHeader-CX-ZfeKE.css → MainHeader-CWA2JfVJ.css} +22 -22
- package/dist/assets/{MainSidebar-DsyUXL2c.js → MainSidebar-BeZfQeco.js} +75 -42
- package/dist/assets/{MainSidebar-BRAjTL7J.css → MainSidebar-CKMiDGvH.css} +13 -12
- package/dist/assets/{NodeCreation-CiSTfSrv.js → NodeCreation-DIg39Pbx.js} +5 -5
- package/dist/assets/{NodeCreator-16svYK-i.js → NodeCreator-BwYjrEUk.js} +10 -11
- package/dist/assets/{NodeCreator-DDiuO5S0.css → NodeCreator-D9fmPdS2.css} +12 -12
- package/dist/assets/{NodeDetailsView-CVVfk-zW.css → NodeDetailsView-C1z3N5z_.css} +46 -46
- package/dist/assets/{NodeDetailsView-D5ZKTnOO.js → NodeDetailsView-WuroVzlr.js} +93 -85
- package/dist/assets/{NodeView-CVxHVGxF.js → NodeView-CmjajouX.js} +63 -28
- package/dist/assets/{ProjectCardBadge-DKJ8uRN7.js → ProjectCardBadge-cIqYJxKe.js} +1 -1
- package/dist/assets/ProjectHeader-B-a6_GH6.css +285 -0
- package/dist/assets/{ProjectHeader-BY3TAX3C.js → ProjectHeader-BGrFY-5v.js} +66 -27
- package/dist/assets/{ProjectSettings-B3FxW1ze.js → ProjectSettings-D10vay6-.js} +2 -3
- 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
- package/dist/assets/{ResourcesListLayout-DbPhtDij.js → ResourcesListLayout-C6v8Zm5q.js} +25 -21
- package/dist/assets/{ResourcesListLayout-Brs7VKUf.css → ResourcesListLayout-CWgWhtKq.css} +43 -33
- package/dist/assets/{RunDataAi-DJ-PSs_k.css → RunDataAi-CN9FrT9c.css} +2 -2
- package/dist/assets/{RunDataAi-Cq_XIdUj.js → RunDataAi-dhPBStdr.js} +25 -20
- package/dist/assets/{RunDataJson-BYaB0x1O.js → RunDataJson-kGRhUGn3.js} +12 -12
- package/dist/assets/{RunDataJsonActions-CU0K3JKo.js → RunDataJsonActions-BTljOq8V.js} +2 -2
- package/dist/assets/{RunDataSearch-Cx3Q6SS-.js → RunDataSearch-mVQhE8PH.js} +1 -1
- package/dist/assets/{RunDataTable-thC_K8V5.js → RunDataTable-CFoDiExh.js} +2 -2
- package/dist/assets/{SamlOnboarding-kqju2Vdw.js → SamlOnboarding-dDZHHNp4.js} +3 -3
- package/dist/assets/{SettingsApiView-DZWY9nyk.js → SettingsApiView-C9hbuZ42.js} +2 -3
- package/dist/assets/{SettingsCommunityNodesView-BLPF2nGe.js → SettingsCommunityNodesView-0wzih2lc.js} +5 -5
- package/dist/assets/{SettingsExternalSecrets-giVhhOpK.js → SettingsExternalSecrets-BCDoBPTc.js} +1 -1
- package/dist/assets/{SettingsLdapView-CcLGbweG.js → SettingsLdapView-CBCprymb.js} +1 -1
- package/dist/assets/{SettingsLogStreamingView-T4v-UDVv.js → SettingsLogStreamingView-CMQQQdcB.js} +2 -2
- package/dist/assets/{SettingsPersonalView-C1vojEEm.js → SettingsPersonalView-DtAM5Qmb.js} +1 -1
- package/dist/assets/{SettingsSourceControl-mTHmVIMw.js → SettingsSourceControl-CysMFVZs.js} +1 -1
- package/dist/assets/{SettingsSso-BBoPSBvR.js → SettingsSso-B0PZUvVx.js} +7 -7
- package/dist/assets/{SettingsSso-BjoJZ2DU.css → SettingsSso-DyrGnPdA.css} +10 -10
- package/dist/assets/{SettingsUsageAndPlan-CT1Jb0GH.js → SettingsUsageAndPlan-2QUTEbXv.js} +8 -3
- package/dist/assets/{SettingsUsageAndPlan-Cul4YcIk.css → SettingsUsageAndPlan-b3WY2Ea_.css} +3 -3
- package/dist/assets/{SettingsUsersView-Cak1x7Pc.js → SettingsUsersView-C16e4GB4.js} +1 -1
- package/dist/assets/{SettingsView-DCkltMay.js → SettingsView-B-BQ6FGS.js} +1 -1
- package/dist/assets/{SetupView-DJmIQyS0.js → SetupView-Kx3RATQz.js} +3 -3
- package/dist/assets/{SetupWorkflowCredentialsButton-DCfwCYAd.js → SetupWorkflowCredentialsButton-BQ2_-L-1.js} +1 -1
- package/dist/assets/{SetupWorkflowFromTemplateView-k_iBV2jh.js → SetupWorkflowFromTemplateView-D_E17TKc.js} +3 -3
- package/dist/assets/{SigninView-BnsteSQ9.js → SigninView-d0aJ1Mkg.js} +3 -3
- package/dist/assets/{SignoutView-CyCh9bOx.js → SignoutView-CvyFrh7y.js} +1 -1
- package/dist/assets/{SignupView-BsFwHPbF.js → SignupView-CnlD_UrJ.js} +3 -3
- package/dist/assets/{TemplateDetails-D_qS2oXP.js → TemplateDetails-DRuh9UqO.js} +3 -3
- package/dist/assets/{TemplateList-Bsr77oun.js → TemplateList-gpWBWX3r.js} +1 -1
- package/dist/assets/{TemplatesCollectionView-DOx2xwGE.js → TemplatesCollectionView-Y6-pxrOD.js} +5 -5
- package/dist/assets/{TemplatesSearchView-C6YmB2wy.js → TemplatesSearchView-DP8XRZ62.js} +3 -3
- package/dist/assets/{TemplatesView-DQBwrteM.js → TemplatesView-B3vanV3h.js} +1 -1
- package/dist/assets/{TemplatesWorkflowView-C2iuRHel.js → TemplatesWorkflowView-CIB9qsVC.js} +5 -5
- package/dist/assets/{TestDefinitionEditView-JONL00pA.css → TestDefinitionEditView-BXhOuJrU.css} +128 -116
- package/dist/assets/{TestDefinitionEditView-BhFe0nl4.js → TestDefinitionEditView-BkhmS3l4.js} +243 -252
- package/dist/assets/{TestDefinitionListView-xb_7O8DU.js → TestDefinitionListView-tvjwd9Ts.js} +1 -1
- package/dist/assets/{TestDefinitionNewView-DfTA2Tx8.js → TestDefinitionNewView-DOGHwct6.js} +13 -4
- package/dist/assets/{TestDefinitionRootView-CaoWSLan.js → TestDefinitionRootView-B-QvwldV.js} +1 -1
- package/dist/assets/{VariablesView-CbTLdNwU.css → VariablesView-ATWfdJsE.css} +7 -11
- package/dist/assets/{VariablesView-B2ttHbBo.js → VariablesView-CoBnz2nF.js} +6 -6
- package/dist/assets/{WorkerView-CzDTwlX2.js → WorkerView-CsTZzlRj.js} +7 -7
- package/dist/assets/{WorkflowActivator-mNogYc60.js → WorkflowActivator-DeLhupjy.js} +2 -2
- package/dist/assets/{WorkflowExecutionsInfoAccordion-CNoXKDkU.js → WorkflowExecutionsInfoAccordion-WRdvo2wq.js} +1 -1
- package/dist/assets/{WorkflowExecutionsLandingPage-XS-H1Pwn.js → WorkflowExecutionsLandingPage-DP8mgG6I.js} +2 -2
- package/dist/assets/{WorkflowExecutionsPreview-BMqpqyNP.js → WorkflowExecutionsPreview-BmG1Fptg.js} +270 -136
- package/dist/assets/{WorkflowExecutionsPreview-BDVLuC1z.css → WorkflowExecutionsPreview-CHu6M3Dh.css} +70 -38
- package/dist/assets/{WorkflowExecutionsView-BLj64NZs.js → WorkflowExecutionsView-DmN-exp3.js} +6 -7
- package/dist/assets/{WorkflowHistory-CFqqM71F.js → WorkflowHistory-CdEr7dbB.js} +3 -3
- package/dist/assets/{WorkflowOnboardingView-8o-XsXJA.js → WorkflowOnboardingView-D45YjFmk.js} +1 -1
- package/dist/assets/{WorkflowPreview-B05e6atY.js → WorkflowPreview-x0_AdULu.js} +1 -1
- package/dist/assets/{WorkflowsView-D6AZEJR8.js → WorkflowsView-BhcJ-MjE.js} +726 -341
- package/dist/assets/{WorkflowsView-JN0Hvhvt.css → WorkflowsView-r9qJOUEb.css} +64 -43
- package/dist/assets/{easyAiWorkflowUtils-DCq6uUmq.js → easyAiWorkflowUtils-NXaV8dgZ.js} +5 -5
- package/dist/assets/{global-link-actions-DhVbzPXz.js → global-link-actions-DgZH3fz2.js} +1 -1
- package/dist/assets/{import-curl-CpQ9LTub.js → import-curl-DUv4B2nO.js} +1 -1
- package/dist/assets/{index-ntAcmC2q.js → index-CDluwnbb.js} +4962 -3420
- package/dist/assets/{index-D534l065.css → index-CgXKy7t-.css} +2783 -2112
- package/dist/assets/{index-wbgX3Vnk.js → index-DAyhXitv.js} +1 -1
- package/dist/assets/{pickBy-DAl85H93.js → pickBy-D-hOoXP_.js} +1 -1
- package/dist/assets/{polyfills-C7eMRNFe.js → polyfills-CLZ4X0Ad.js} +2342 -1944
- package/dist/assets/{pushConnection.store-Cs7MLBaJ.js → pushConnection.store-Dl_VgTY2.js} +1 -1
- package/dist/assets/{templateActions-C6kwBsE2.js → templateActions-B4AFVixD.js} +1 -1
- package/dist/assets/{typescript.worker-DP34mIHW.js → typescript.worker-Bt3bByTc.js} +1158 -695
- package/dist/assets/{useBeforeUnload-Cr9E4FVX.js → useBeforeUnload-DS-CCd-3.js} +1 -1
- package/dist/assets/{useCanvasMapping-CkNBF2SE.css → useCanvasMapping-CJcAsQmx.css} +585 -585
- package/dist/assets/{useCanvasMapping-DwbUSpab.js → useCanvasMapping-DnPGwCm3.js} +10390 -10379
- package/dist/assets/{useCanvasOperations-Ch4-PXXM.js → useCanvasOperations-CY1OrN2X.js} +472 -185
- package/dist/assets/useClearExecutionButtonVisible-CjX9PqMR.js +23 -0
- package/dist/assets/{useExecutionDebugging-WtMBcJA-.js → useExecutionDebugging-BN-lQ24h.js} +1 -1
- package/dist/assets/{useExecutionHelpers-DYVB2XNC.js → useExecutionHelpers-wN0DRQB-.js} +1 -1
- package/dist/assets/{useImportCurlCommand-B6a2t4kf.js → useImportCurlCommand-DgTeVIgh.js} +13 -20
- package/dist/assets/useOverview-BBgWJdVL.js +161 -0
- package/dist/assets/{Logo-DJLTXpXC.css → useOverview-DcRuPjLJ.css} +97 -30
- package/dist/assets/{usePushConnection-BvuDmDSY.js → usePushConnection-F1s4Muc0.js} +5 -4
- package/dist/assets/{useRunWorkflow-BjW-TsKk.js → useRunWorkflow-RBDuKZVj.js} +13 -13
- package/dist/assets/{useTestDefinitionForm-uexL_DkW.js → useTestDefinitionForm-DX1gvhBC.js} +1 -1
- package/dist/assets/{useWorkflowActivate-BAjo-kUC.js → useWorkflowActivate-DsRC3mvG.js} +1 -1
- package/dist/index.html +3 -3
- package/package.json +1 -1
- package/dist/assets/CollectionParameter-Dk76idMw.js +0 -4
- package/dist/assets/ExecutionsView-zqdNLgx1.js +0 -983
- package/dist/assets/ProjectCreateResource-5lC9x1Ht.js +0 -56
- package/dist/assets/ProjectCreateResource-eYdTamXR.css +0 -139
- package/dist/assets/open-sans-latin-400-normal-kLvSbl7y.woff +0 -0
- package/dist/assets/open-sans-latin-400-normal-sjvN8RAh.woff2 +0 -0
- package/dist/assets/open-sans-latin-600-normal-BYc6TgXR.woff2 +0 -0
- package/dist/assets/open-sans-latin-600-normal-CJ2UE_uF.woff +0 -0
- package/dist/assets/open-sans-latin-700-normal-DMXgkrz3.woff +0 -0
- package/dist/assets/open-sans-latin-700-normal-DXyImmHa.woff2 +0 -0
- package/dist/assets/usePinnedData-CvnROquX.js +0 -274
|
@@ -1,27 +1,26 @@
|
|
|
1
|
-
import { d as defineComponent,
|
|
2
|
-
import { R as ResourcesListLayout } from "./ResourcesListLayout-
|
|
3
|
-
import { W as WorkflowActivator } from "./WorkflowActivator-
|
|
4
|
-
import { P as ProjectCardBadge } from "./ProjectCardBadge-
|
|
5
|
-
import { P as ProjectHeader } from "./ProjectHeader-
|
|
6
|
-
import { g as getEasyAiWorkflowJson } from "./easyAiWorkflowUtils-
|
|
7
|
-
import "./
|
|
8
|
-
import "./
|
|
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
|
-
|
|
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",
|
|
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: "
|
|
93
|
+
size: "xlarge"
|
|
100
94
|
}, null, 8, ["class"])
|
|
101
95
|
]),
|
|
102
96
|
header: withCtx(() => [
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
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
|
-
|
|
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(
|
|
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
|
-
|
|
167
|
-
|
|
188
|
+
_ctx.data.homeProject ? (openBlock(), createElementBlock("div", {
|
|
189
|
+
key: 0,
|
|
190
|
+
class: normalizeClass(_ctx.$style["project-pill"])
|
|
168
191
|
}, [
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
"
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
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
|
-
|
|
211
|
-
}
|
|
212
|
-
]
|
|
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:
|
|
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 = "
|
|
239
|
+
const card = "_card_1ughy_124";
|
|
233
240
|
const style0$3 = {
|
|
234
241
|
card,
|
|
235
|
-
"folder-icon": "_folder-
|
|
236
|
-
"card-
|
|
237
|
-
"
|
|
238
|
-
"
|
|
239
|
-
"
|
|
240
|
-
"
|
|
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-
|
|
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: "
|
|
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 = "
|
|
336
|
+
const container = "_container_4mxjz_123";
|
|
326
337
|
const style0$2 = {
|
|
327
338
|
container,
|
|
328
|
-
"
|
|
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.
|
|
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
|
|
467
|
+
const route2 = router.resolve({
|
|
424
468
|
name: VIEWS.WORKFLOW,
|
|
425
469
|
params: { name: props.data.id }
|
|
426
470
|
});
|
|
427
|
-
window.open(
|
|
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(
|
|
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
|
-
|
|
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:
|
|
582
|
-
"hidden-items":
|
|
583
|
-
"path-truncated":
|
|
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": "
|
|
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"
|
|
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 = "
|
|
684
|
-
const cardHeading = "
|
|
685
|
-
const cardDescription = "
|
|
686
|
-
const cardActions = "
|
|
687
|
-
const cardBadge = "
|
|
688
|
-
const breadcrumbs = "
|
|
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-
|
|
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
|
-
|
|
703
|
-
const
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
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
|
-
|
|
743
|
-
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
748
|
-
|
|
749
|
-
|
|
750
|
-
|
|
751
|
-
|
|
752
|
-
|
|
753
|
-
|
|
754
|
-
|
|
755
|
-
|
|
756
|
-
|
|
757
|
-
|
|
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
|
-
|
|
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 = {
|
|
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
|
|
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 =
|
|
867
|
+
const folderActions = computed(() => [
|
|
822
868
|
{
|
|
823
|
-
label: "
|
|
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: "
|
|
875
|
+
label: i18n.baseText("folders.actions.create"),
|
|
830
876
|
value: FOLDER_LIST_ITEM_ACTIONS.CREATE,
|
|
831
|
-
disabled:
|
|
877
|
+
disabled: readOnlyEnv.value || !hasPermissionToCreateFolders.value
|
|
832
878
|
},
|
|
833
879
|
{
|
|
834
|
-
label: "
|
|
880
|
+
label: i18n.baseText("folders.actions.create.workflow"),
|
|
835
881
|
value: FOLDER_LIST_ITEM_ACTIONS.CREATE_WORKFLOW,
|
|
836
|
-
disabled:
|
|
882
|
+
disabled: readOnlyEnv.value || !hasPermissionToCreateWorkflows.value
|
|
837
883
|
},
|
|
838
884
|
{
|
|
839
|
-
label: "
|
|
885
|
+
label: i18n.baseText("generic.rename"),
|
|
840
886
|
value: FOLDER_LIST_ITEM_ACTIONS.RENAME,
|
|
841
|
-
disabled:
|
|
887
|
+
disabled: readOnlyEnv.value || !hasPermissionToUpdateFolders.value
|
|
842
888
|
},
|
|
843
889
|
{
|
|
844
|
-
label: "
|
|
890
|
+
label: i18n.baseText("folders.actions.moveToFolder"),
|
|
845
891
|
value: FOLDER_LIST_ITEM_ACTIONS.MOVE,
|
|
846
|
-
disabled:
|
|
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: "
|
|
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:
|
|
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
|
|
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
|
-
|
|
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
|
|
1014
|
-
|
|
1015
|
-
|
|
1016
|
-
|
|
1017
|
-
|
|
1018
|
-
|
|
1019
|
-
|
|
1020
|
-
|
|
1021
|
-
|
|
1022
|
-
|
|
1023
|
-
|
|
1024
|
-
|
|
1025
|
-
|
|
1026
|
-
|
|
1027
|
-
|
|
1028
|
-
|
|
1029
|
-
|
|
1030
|
-
|
|
1031
|
-
|
|
1032
|
-
|
|
1033
|
-
|
|
1034
|
-
|
|
1035
|
-
|
|
1036
|
-
|
|
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:
|
|
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, "
|
|
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
|
|
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
|
|
1298
|
-
|
|
1299
|
-
|
|
1300
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
1334
|
-
|
|
1335
|
-
|
|
1336
|
-
}
|
|
1337
|
-
toast.
|
|
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
|
-
|
|
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
|
-
|
|
1348
|
-
|
|
1349
|
-
|
|
1350
|
-
|
|
1351
|
-
|
|
1352
|
-
|
|
1353
|
-
|
|
1354
|
-
|
|
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
|
-
|
|
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, "
|
|
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
|
|
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
|
-
|
|
1832
|
+
"read-only": readOnlyEnv.value || !hasPermissionToDeleteFolders.value && !hasPermissionToCreateFolders.value,
|
|
1478
1833
|
class: "mb-2xs",
|
|
1479
1834
|
onAction: onFolderCardAction
|
|
1480
|
-
}, null, 8, ["data", "actions", "
|
|
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":
|
|
1843
|
+
"onWorkflow:deleted": onWorkflowDeleted,
|
|
1490
1844
|
"onWorkflow:moved": fetchWorkflows,
|
|
1491
1845
|
"onWorkflow:duplicated": fetchWorkflows,
|
|
1492
|
-
"onWorkflow:activeToggle": onWorkflowActiveToggle
|
|
1493
|
-
|
|
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",
|
|
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",
|
|
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",
|
|
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
|
-
|
|
1997
|
+
foldersEnabled.value ? {
|
|
1620
1998
|
name: "add-button",
|
|
1621
1999
|
fn: withCtx(() => [
|
|
1622
|
-
createVNode(_component_N8nTooltip, {
|
|
2000
|
+
createVNode(_component_N8nTooltip, {
|
|
2001
|
+
placement: "top",
|
|
2002
|
+
disabled: !(isOverviewPage.value || !readOnlyEnv.value && hasPermissionToCreateFolders.value)
|
|
2003
|
+
}, {
|
|
1623
2004
|
content: withCtx(() => [
|
|
1624
|
-
|
|
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: "
|
|
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 = "
|
|
1648
|
-
const emptyStateCard = "
|
|
1649
|
-
const emptyStateCardIcon = "
|
|
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-
|
|
1653
|
-
"callout-trailing-content": "_callout-trailing-
|
|
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-
|
|
1657
|
-
"breadcrumbs-container": "_breadcrumbs-
|
|
1658
|
-
"breadcrumbs-loading": "_breadcrumbs-
|
|
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
|