n8n-editor-ui 1.78.0 → 1.80.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 (99) hide show
  1. package/dist/assets/{AnnotationTagsDropdown.ee.vue_vue_type_script_setup_true_lang-eVUE5od5.js → AnnotationTagsDropdown.ee.vue_vue_type_script_setup_true_lang-HxDJGUtE.js} +1 -1
  2. package/dist/assets/{AuthView-D1tEXMXA.js → AuthView-1Ttsioyp.js} +2 -2
  3. package/dist/assets/{CanvasChat-BLb-TUbz.js → CanvasChat-Dr5nHlH3.js} +5 -4
  4. package/dist/assets/{CanvasControls-BN3S3-fQ.js → CanvasControls-B_BXMBED.js} +1 -1
  5. package/dist/assets/{ChangePasswordView-V1JTrEew.js → ChangePasswordView-D4RXBXA7.js} +3 -3
  6. package/dist/assets/CollectionParameter-MoTW3Wf1.js +4 -0
  7. package/dist/assets/{ConcurrentExecutionsHeader-BNA8q-8c.js → ConcurrentExecutionsHeader-BfwpFWPS.js} +2 -2
  8. package/dist/assets/{CredentialsView-AQksN2m1.js → CredentialsView-Dy_wyl7y.js} +23 -14
  9. package/dist/assets/{ErrorView-CLT4S_BD.js → ErrorView-Di2BOFlv.js} +1 -1
  10. package/dist/assets/{ExecutionsView-qI0J-9KP.js → ExecutionsView-C3oFIgdV.js} +5 -5
  11. package/dist/assets/{FileSaver.min-B-zoCBIE.js → FileSaver.min-BRpBjOSK.js} +1 -1
  12. package/dist/assets/{FixedCollectionParameter-DQeeV-mE.js → FixedCollectionParameter-CGAtcElH.js} +1 -1
  13. package/dist/assets/{ForgotMyPasswordView-BYvqdrhp.js → ForgotMyPasswordView-y2S4L_Qv.js} +3 -3
  14. package/dist/assets/{Logo-CmkNIoey.js → Logo-Bkouvy_1.js} +1 -1
  15. package/dist/assets/{MainHeader-rUYFpqrO.js → MainHeader-DAJVzGfz.js} +10 -9
  16. package/dist/assets/{MainSidebar-B9_KVa79.js → MainSidebar-BMvCTHpo.js} +10 -10
  17. package/dist/assets/{MainSidebar-Djaxwdmm.css → MainSidebar-BQVC8zBU.css} +13 -13
  18. package/dist/assets/{NodeCreation-CWLKVrNb.js → NodeCreation-RijXMQEI.js} +4 -4
  19. package/dist/assets/{NodeCreator-CzIIkTTW.js → NodeCreator-DPcMScWo.js} +5 -4
  20. package/dist/assets/{NodeViewSwitcher-Det3o0gl.css → NodeViewSwitcher-9WCdidKb.css} +23 -23
  21. package/dist/assets/{NodeViewSwitcher-BUNM0KZ6.js → NodeViewSwitcher-OANBinrW.js} +80 -71
  22. package/dist/assets/{ProjectCardBadge-BbA_Exq8.js → ProjectCardBadge-J4JiadWD.js} +1 -1
  23. package/dist/assets/{ProjectHeader-DlgpDOwX.js → ProjectHeader-1XMrORbM.js} +1 -1
  24. package/dist/assets/{ProjectSettings-DqEtmmAS.js → ProjectSettings-DAi3BTpr.js} +2 -2
  25. package/dist/assets/{PushConnectionTracker.vue_vue_type_script_setup_true_lang-DL91BcV8.js → PushConnectionTracker.vue_vue_type_script_setup_true_lang-BFoY0mfR.js} +7 -4
  26. package/dist/assets/{ResourcesListLayout-D2ZxA1Uw.js → ResourcesListLayout-D9faOv_l.js} +219 -99
  27. package/dist/assets/{ResourcesListLayout-CvrwoZYS.css → ResourcesListLayout-uz7NOpr0.css} +40 -16
  28. package/dist/assets/{useRunWorkflow-B-O5w0ED.js → RunDataAi-C3Gkhfg0.js} +4 -320
  29. package/dist/assets/{RunDataJson-UkDmIQKn.js → RunDataJson-tRUXhQ8S.js} +16 -14
  30. package/dist/assets/{RunDataJsonActions-BqDvrghZ.js → RunDataJsonActions-CA6Z-ZGx.js} +4 -5
  31. package/dist/assets/{RunDataSearch-UNQ4_4vM.js → RunDataSearch-3I6ueGp8.js} +1 -1
  32. package/dist/assets/{RunDataTable-BdbNPKnU.js → RunDataTable-DXtM72HW.js} +2 -2
  33. package/dist/assets/{SamlOnboarding-Rzkh3AGB.js → SamlOnboarding-XQAt1qyf.js} +3 -3
  34. package/dist/assets/{SettingsApiView-C27ofqQf.js → SettingsApiView-BUCwQ023.js} +1 -1
  35. package/dist/assets/{SettingsCommunityNodesView-CWp_YPSH.js → SettingsCommunityNodesView-CO8Bnp-a.js} +5 -4
  36. package/dist/assets/{SettingsExternalSecrets-BytZbZef.js → SettingsExternalSecrets-Cqj1VwAC.js} +1 -1
  37. package/dist/assets/{SettingsLdapView-DvNozRM0.js → SettingsLdapView-C5-rNRHJ.js} +1 -1
  38. package/dist/assets/{SettingsLogStreamingView-C4Y3N6rF.js → SettingsLogStreamingView-CfzEG7ya.js} +1 -1
  39. package/dist/assets/{SettingsPersonalView--Z9y3dtC.js → SettingsPersonalView-BZB75NCV.js} +1 -1
  40. package/dist/assets/{SettingsSourceControl-BElByx3w.js → SettingsSourceControl-BCNGnerk.js} +1 -1
  41. package/dist/assets/{SettingsSso-DUOhZeok.js → SettingsSso-BIDfLpvX.js} +1 -1
  42. package/dist/assets/{SettingsUsageAndPlan-DTw2vCOM.js → SettingsUsageAndPlan-B3AoC5ui.js} +1 -1
  43. package/dist/assets/{SettingsUsersView-B2lC671-.js → SettingsUsersView-Bd8u_dWP.js} +1 -1
  44. package/dist/assets/{SettingsView-tGXgBeZb.js → SettingsView-BgUUmcYQ.js} +1 -1
  45. package/dist/assets/{SetupView-BB-PMekL.js → SetupView-DkcAeKcx.js} +3 -3
  46. package/dist/assets/{SetupWorkflowCredentialsButton-B7i_jYti.js → SetupWorkflowCredentialsButton-CgICpCKX.js} +1 -1
  47. package/dist/assets/{SetupWorkflowFromTemplateView-Co52TGFE.js → SetupWorkflowFromTemplateView-9kgsp5eR.js} +3 -3
  48. package/dist/assets/{SigninView-B8lcx39e.js → SigninView-p0p2Wsjx.js} +3 -3
  49. package/dist/assets/{SignoutView-CamkX68g.js → SignoutView-6qFcyBHO.js} +1 -1
  50. package/dist/assets/{SignupView-D9e7FiEj.js → SignupView-B9icrcu8.js} +3 -3
  51. package/dist/assets/{TemplateDetails-C0RPBtYu.js → TemplateDetails-BOHIrTqk.js} +1 -1
  52. package/dist/assets/{TemplateList-B6jscn2o.js → TemplateList-73LLdbNJ.js} +1 -1
  53. package/dist/assets/{TemplatesCollectionView-9fi4vQ1-.js → TemplatesCollectionView-BqyOlCUu.js} +5 -5
  54. package/dist/assets/{TemplatesSearchView-VlRyjuTl.js → TemplatesSearchView-nL4pBM1O.js} +3 -3
  55. package/dist/assets/{TemplatesView-CgQelQ-w.js → TemplatesView-C3n69lEL.js} +1 -1
  56. package/dist/assets/{TemplatesWorkflowView-BhhfuZZ9.js → TemplatesWorkflowView-DJhhG1uU.js} +5 -5
  57. package/dist/assets/{TestDefinitionEditView-Cv4ImQQb.js → TestDefinitionEditView-B7Yku4Yg.js} +11 -17
  58. package/dist/assets/{TestDefinitionListView-CywmtGBZ.js → TestDefinitionListView-xSYrBXDt.js} +1 -1
  59. package/dist/assets/{TestDefinitionRootView-BhZESeJD.js → TestDefinitionRootView-C_2OO4vg.js} +1 -1
  60. package/dist/assets/{VariablesView-CIfrpJdg.css → VariablesView-BFkUG61Z.css} +5 -5
  61. package/dist/assets/{VariablesView-B_Ju8Kay.js → VariablesView-DzO7okYK.js} +21 -12
  62. package/dist/assets/{WorkerView-Lif0hJie.js → WorkerView-B-GM2PnB.js} +6 -5
  63. package/dist/assets/{WorkflowActivator-Bv0WPJm3.js → WorkflowActivator-Bd_Lvcdj.js} +11 -5
  64. package/dist/assets/{WorkflowActivator-brtYjIty.css → WorkflowActivator-CE8UyVw2.css} +2 -2
  65. package/dist/assets/{WorkflowExecutionsInfoAccordion-DitIU6bv.js → WorkflowExecutionsInfoAccordion-CYpfdTlZ.js} +1 -1
  66. package/dist/assets/{WorkflowExecutionsLandingPage-vuyCAPrk.js → WorkflowExecutionsLandingPage-Ce03KsyM.js} +2 -2
  67. package/dist/assets/{WorkflowExecutionsPreview-DN_WSVD_.js → WorkflowExecutionsPreview-S9QjNkrU.js} +5 -5
  68. package/dist/assets/{WorkflowExecutionsView-BhFMyj3l.js → WorkflowExecutionsView-IgYJKRy2.js} +5 -5
  69. package/dist/assets/{WorkflowHistory-XSHcXPVZ.js → WorkflowHistory-Clbhytld.js} +3 -3
  70. package/dist/assets/{WorkflowOnboardingView-DdujIOw8.js → WorkflowOnboardingView-BfwDAozz.js} +1 -1
  71. package/dist/assets/{WorkflowPreview-YDi-9g3Y.js → WorkflowPreview-CR_8gGVk.js} +1 -1
  72. package/dist/assets/{WorkflowsView-BLTTQnV3.js → WorkflowsView-DhJmVrpz.js} +206 -75
  73. package/dist/assets/_commonjs-dynamic-modules-TGKdzP3c.js +6 -0
  74. package/dist/assets/{easyAiWorkflowUtils-WSNP3eeS.js → easyAiWorkflowUtils-DR9xMMTB.js} +2 -2
  75. package/dist/assets/global-link-actions-BnYGl3Vl.js +5 -0
  76. package/dist/assets/import-curl-Bkz3KGtP.js +5 -0
  77. package/dist/assets/{index-BwoviwZU.js → index-RIkMj045.js} +1898 -1752
  78. package/dist/assets/{index-DFFkAkMx.css → index-xKO0gQfI.css} +23 -19
  79. package/dist/assets/pickBy-L31B05hi.js +16 -0
  80. package/dist/assets/pushConnection.store-IZqFPTug.js +238 -0
  81. package/dist/assets/{templateActions-CDiqnge9.js → templateActions-Dxsd5OiK.js} +1 -1
  82. package/dist/assets/{useBeforeUnload-BQCxN-bM.js → useBeforeUnload-Bz5jh_QU.js} +1 -1
  83. package/dist/assets/{useCanvasOperations-CKa4_bqL.css → useCanvasMapping-DeC609A4.css} +213 -160
  84. package/dist/assets/{useCanvasOperations-DQSiUE8i.js → useCanvasMapping-eE1iPx8T.js} +3377 -3174
  85. package/dist/assets/{useExecutionDebugging-BlSzHQ7f.js → useExecutionDebugging-0CcRxVaH.js} +1 -1
  86. package/dist/assets/{useExecutionHelpers-DpNwTiuj.js → useExecutionHelpers-DeMd4c8O.js} +1 -1
  87. package/dist/assets/useImportCurlCommand-CvS5FUhb.js +9055 -0
  88. package/dist/assets/{usePushConnection-ioPocbvz.js → usePushConnection-PppTtKCd.js} +4 -3
  89. package/dist/assets/useRunWorkflow-Bjok868-.js +616 -0
  90. package/dist/assets/{useWorkflowActivate-CbVB4JlR.js → useWorkflowActivate-DJ8wir2K.js} +6 -5
  91. package/dist/index.html +2 -2
  92. package/dist/tree-sitter-bash.wasm +0 -0
  93. package/dist/tree-sitter.wasm +0 -0
  94. package/package.json +1 -1
  95. package/vite.config.mts +14 -1
  96. package/dist/assets/CollectionParameter-C28x26Fy.js +0 -4
  97. package/dist/assets/pushConnection.store-BlMyXexG.js +0 -117
  98. package/dist/assets/usePinnedData-E0jv55-6.js +0 -274
  99. /package/dist/assets/{useRunWorkflow-DWoFsQdi.css → RunDataAi-DWoFsQdi.css} +0 -0
@@ -1,10 +1,10 @@
1
- import { R as ResourcesListLayout, p as pickBy } from "./ResourcesListLayout-D2ZxA1Uw.js";
2
- import { d as defineComponent, a as useToast, b as useRouter, p as useSettingsStore, K as useUIStore, u as useUsersStore, T as useWorkflowsStore, a1 as useProjectsStore, q as computed, al as getResourcePermissions, gr as dateformat, m as resolveComponent, c as openBlock, e as createBlock, w as withCtx, i as createVNode, n as normalizeClass, k as createTextVNode, t as toDisplayString, l as unref, f as createCommentVNode, j as createBaseVNode, I as withModifiers, i4 as ResourceType, ax as withDirectives, fD as _sfc_main$2, ay as vShow, h as createElementBlock, g as useI18n, V as VIEWS, ab as WORKFLOW_SHARE_MODAL_KEY, ai as DUPLICATE_MODAL_KEY, ae as MODAL_CONFIRM, i5 as PROJECT_MOVE_RESOURCE_MODAL, ak as useMessage, aj as useTelemetry, _ as _export_sfc, U as useRoute, a0 as useSourceControlStore, au as usePostHog, D as useTagsStore, a3 as useDocumentTitle, r as ref, a8 as EnterpriseEditionFeature, i6 as EASY_AI_WORKFLOW_EXPERIMENT, H as watch, o as onMounted, i7 as N8nIcon, fH as N8nHeading, ci as N8nText, i8 as N8nCard, fV as N8nInputLabel, a7 as _sfc_main$3, cw as N8nSelect, F as Fragment, A as renderList, cC as _sfc_main$4, bT as AI_CREDITS_EXPERIMENT } from "./index-BwoviwZU.js";
3
- import { W as WorkflowActivator } from "./WorkflowActivator-Bv0WPJm3.js";
4
- import { P as ProjectCardBadge } from "./ProjectCardBadge-BbA_Exq8.js";
5
- import { P as ProjectHeader } from "./ProjectHeader-DlgpDOwX.js";
6
- import { g as getEasyAiWorkflowJson } from "./easyAiWorkflowUtils-WSNP3eeS.js";
7
- import "./useWorkflowActivate-CbVB4JlR.js";
1
+ import { R as ResourcesListLayout } from "./ResourcesListLayout-D9faOv_l.js";
2
+ import { d as defineComponent, a as useToast, b as useRouter, p as useSettingsStore, K as useUIStore, u as useUsersStore, T as useWorkflowsStore, a1 as useProjectsStore, q as computed, al as getResourcePermissions, gs as dateformat, m as resolveComponent, c as openBlock, e as createBlock, w as withCtx, i as createVNode, n as normalizeClass, k as createTextVNode, t as toDisplayString, l as unref, f as createCommentVNode, j as createBaseVNode, I as withModifiers, i6 as ResourceType, ax as withDirectives, fB as _sfc_main$2, ay as vShow, h as createElementBlock, g as useI18n, V as VIEWS, ab as WORKFLOW_SHARE_MODAL_KEY, ai as DUPLICATE_MODAL_KEY, ae as MODAL_CONFIRM, i7 as PROJECT_MOVE_RESOURCE_MODAL, ak as useMessage, aj as useTelemetry, _ as _export_sfc, U as useRoute, a0 as useSourceControlStore, au as usePostHog, D as useTagsStore, a3 as useDocumentTitle, J as useDebounce, r as ref, i8 as DEFAULT_WORKFLOW_PAGE_SIZE, a8 as EnterpriseEditionFeature, i9 as EASY_AI_WORKFLOW_EXPERIMENT, H as watch, o as onMounted, x as onBeforeUnmount, ia as N8nIcon, fF as N8nHeading, ci as N8nText, ib as N8nCard, fT as N8nInputLabel, a7 as _sfc_main$3, cw as N8nSelect, F as Fragment, A as renderList, cC as _sfc_main$4, C as createEventBus, bU as AI_CREDITS_EXPERIMENT } from "./index-RIkMj045.js";
3
+ import { W as WorkflowActivator } from "./WorkflowActivator-Bd_Lvcdj.js";
4
+ import { P as ProjectCardBadge } from "./ProjectCardBadge-J4JiadWD.js";
5
+ import { P as ProjectHeader } from "./ProjectHeader-1XMrORbM.js";
6
+ import { g as getEasyAiWorkflowJson } from "./easyAiWorkflowUtils-DR9xMMTB.js";
7
+ import "./useWorkflowActivate-DJ8wir2K.js";
8
8
  const _hoisted_1$1 = { key: 0 };
9
9
  const _sfc_main$1 = /* @__PURE__ */ defineComponent({
10
10
  __name: "WorkflowCard",
@@ -21,9 +21,10 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
21
21
  homeProject: {},
22
22
  versionId: ""
23
23
  }) },
24
- readOnly: { type: Boolean, default: false }
24
+ readOnly: { type: Boolean, default: false },
25
+ workflowListEventBus: { default: void 0 }
25
26
  },
26
- emits: ["expand:tags", "click:tag"],
27
+ emits: ["expand:tags", "click:tag", "workflow:deleted", "workflow:active-toggle"],
27
28
  setup(__props, { emit: __emit }) {
28
29
  const WORKFLOW_LIST_ITEM_ACTIONS = {
29
30
  OPEN: "open",
@@ -119,7 +120,8 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
119
120
  name: props.data.name,
120
121
  tags: (props.data.tags ?? []).map(
121
122
  (tag) => typeof tag !== "string" && "id" in tag ? tag.id : tag
122
- )
123
+ ),
124
+ externalEventBus: props.workflowListEventBus
123
125
  }
124
126
  });
125
127
  break;
@@ -171,6 +173,7 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
171
173
  title: locale.baseText("mainSidebar.showMessage.handleSelect1.title"),
172
174
  type: "success"
173
175
  });
176
+ emit("workflow:deleted");
174
177
  }
175
178
  function moveResource() {
176
179
  uiStore.openModalWithData({
@@ -178,10 +181,14 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
178
181
  data: {
179
182
  resource: props.data,
180
183
  resourceType: ResourceType.Workflow,
181
- resourceTypeLabel: resourceTypeLabel.value
184
+ resourceTypeLabel: resourceTypeLabel.value,
185
+ eventBus: props.workflowListEventBus
182
186
  }
183
187
  });
184
188
  }
189
+ const emitWorkflowActiveToggle = (value) => {
190
+ emit("workflow:active-toggle", value);
191
+ };
185
192
  return (_ctx, _cache) => {
186
193
  const _component_N8nBadge = resolveComponent("N8nBadge");
187
194
  const _component_n8n_heading = resolveComponent("n8n-heading");
@@ -235,7 +242,8 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
235
242
  "workflow-active": _ctx.data.active,
236
243
  "workflow-id": _ctx.data.id,
237
244
  "workflow-permissions": workflowPermissions.value,
238
- "data-test-id": "workflow-card-activator"
245
+ "data-test-id": "workflow-card-activator",
246
+ "onUpdate:workflowActive": emitWorkflowActiveToggle
239
247
  }, null, 8, ["workflow-active", "workflow-id", "workflow-permissions"]),
240
248
  createVNode(_component_n8n_action_toggle, {
241
249
  actions: actions.value,
@@ -313,6 +321,17 @@ const _hoisted_3 = { class: "mb-s" };
313
321
  const _sfc_main = /* @__PURE__ */ defineComponent({
314
322
  __name: "WorkflowsView",
315
323
  setup(__props) {
324
+ const StatusFilter = {
325
+ ACTIVE: true,
326
+ DEACTIVATED: false,
327
+ ALL: ""
328
+ };
329
+ const WORKFLOWS_SORT_MAP = {
330
+ lastUpdated: "updatedAt:desc",
331
+ lastCreated: "createdAt:desc",
332
+ nameAsc: "name:asc",
333
+ nameDesc: "name:desc"
334
+ };
316
335
  const i18n = useI18n();
317
336
  const route = useRoute();
318
337
  const router = useRouter();
@@ -326,11 +345,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
326
345
  const uiStore = useUIStore();
327
346
  const tagsStore = useTagsStore();
328
347
  const documentTitle = useDocumentTitle();
329
- const StatusFilter = {
330
- ACTIVE: true,
331
- DEACTIVATED: false,
332
- ALL: ""
333
- };
348
+ const { callDebounced } = useDebounce();
334
349
  const loading = ref(false);
335
350
  const filters = ref({
336
351
  search: "",
@@ -338,13 +353,33 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
338
353
  status: StatusFilter.ALL,
339
354
  tags: []
340
355
  });
356
+ const workflowListEventBus = createEventBus();
357
+ const workflows = ref([]);
341
358
  const easyAICalloutVisible = ref(true);
359
+ const currentPage = ref(1);
360
+ const pageSize = ref(DEFAULT_WORKFLOW_PAGE_SIZE);
361
+ const currentSort = ref("updatedAt:desc");
342
362
  const readOnlyEnv = computed(() => sourceControlStore.preferences.branchReadOnly);
343
363
  const currentUser = computed(() => usersStore.currentUser ?? {});
344
- const allWorkflows = computed(() => workflowsStore.allWorkflows);
345
364
  const isShareable = computed(
346
365
  () => settingsStore.isEnterpriseFeatureEnabled[EnterpriseEditionFeature.Sharing]
347
366
  );
367
+ const workflowResources = computed(
368
+ () => workflows.value.map((workflow) => ({
369
+ id: workflow.id,
370
+ name: workflow.name,
371
+ value: "",
372
+ active: workflow.active,
373
+ updatedAt: workflow.updatedAt.toString(),
374
+ createdAt: workflow.createdAt.toString(),
375
+ homeProject: workflow.homeProject,
376
+ scopes: workflow.scopes,
377
+ type: "workflow",
378
+ sharedWithProjects: workflow.sharedWithProjects,
379
+ readOnly: !getResourcePermissions(workflow.scopes).workflow.update,
380
+ tags: workflow.tags
381
+ }))
382
+ );
348
383
  const statusFilterOptions = computed(() => [
349
384
  {
350
385
  label: i18n.baseText("workflows.filters.status.all"),
@@ -378,22 +413,35 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
378
413
  return i18n.baseText("workflows.empty.description");
379
414
  }
380
415
  });
381
- const onFilter = (resource, newFilters, matches) => {
382
- const iFilters = newFilters;
383
- if (settingsStore.areTagsEnabled && iFilters.tags.length > 0) {
384
- matches = matches && iFilters.tags.every(
385
- (tag) => resource.tags?.find(
386
- (resourceTag) => typeof resourceTag === "object" ? `${resourceTag.id}` === `${tag}` : `${resourceTag}` === `${tag}`
387
- )
388
- );
389
- }
390
- if (newFilters.status !== "") {
391
- matches = matches && resource.active === newFilters.status;
416
+ watch(
417
+ () => route.params?.projectId,
418
+ async () => {
419
+ await initialize();
392
420
  }
393
- return matches;
421
+ );
422
+ onMounted(async () => {
423
+ documentTitle.set(i18n.baseText("workflows.heading"));
424
+ void usersStore.showPersonalizationSurvey();
425
+ workflowListEventBus.on("resource-moved", fetchWorkflows);
426
+ workflowListEventBus.on("workflow-duplicated", fetchWorkflows);
427
+ });
428
+ onBeforeUnmount(() => {
429
+ workflowListEventBus.off("resource-moved", fetchWorkflows);
430
+ workflowListEventBus.off("workflow-duplicated", fetchWorkflows);
431
+ });
432
+ const onFiltersUpdated = async () => {
433
+ currentPage.value = 1;
434
+ saveFiltersOnQueryString();
435
+ await fetchWorkflows();
394
436
  };
395
- const onFiltersUpdated = (newFilters) => {
396
- Object.assign(filters.value, newFilters);
437
+ const onSearchUpdated = async (search) => {
438
+ currentPage.value = 1;
439
+ saveFiltersOnQueryString();
440
+ if (search) {
441
+ await callDebounced(fetchWorkflows, { debounceTime: 500, trailing: true });
442
+ } else {
443
+ await fetchWorkflows();
444
+ }
397
445
  };
398
446
  const addWorkflow = () => {
399
447
  uiStore.nodeViewInitialized = false;
@@ -413,78 +461,132 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
413
461
  };
414
462
  const initialize = async () => {
415
463
  loading.value = true;
416
- await Promise.all([
464
+ await setFiltersFromQueryString();
465
+ const [, workflowsPage] = await Promise.all([
417
466
  usersStore.fetchUsers(),
418
- workflowsStore.fetchAllWorkflows(route.params?.projectId),
467
+ fetchWorkflows(),
419
468
  workflowsStore.fetchActiveWorkflows()
420
469
  ]);
470
+ workflows.value = workflowsPage;
471
+ loading.value = false;
472
+ };
473
+ const setCurrentPage = async (page) => {
474
+ currentPage.value = page;
475
+ await fetchWorkflows();
476
+ };
477
+ const setPageSize = async (size) => {
478
+ pageSize.value = size;
479
+ await fetchWorkflows();
480
+ };
481
+ const fetchWorkflows = async () => {
482
+ loading.value = true;
483
+ const routeProjectId = route.params?.projectId;
484
+ const homeProjectFilter = filters.value.homeProject || void 0;
485
+ const fetchedWorkflows = await workflowsStore.fetchWorkflowsPage(
486
+ routeProjectId ?? homeProjectFilter,
487
+ currentPage.value,
488
+ pageSize.value,
489
+ currentSort.value,
490
+ {
491
+ name: filters.value.search || void 0,
492
+ active: filters.value.status ? Boolean(filters.value.status) : void 0,
493
+ tags: filters.value.tags.map((tagId) => tagsStore.tagsById[tagId]?.name)
494
+ }
495
+ );
496
+ workflows.value = fetchedWorkflows;
421
497
  loading.value = false;
498
+ return fetchedWorkflows;
422
499
  };
423
- const onClickTag = (tagId) => {
500
+ const onClickTag = async (tagId) => {
424
501
  if (!filters.value.tags.includes(tagId)) {
425
502
  filters.value.tags.push(tagId);
503
+ currentPage.value = 1;
504
+ saveFiltersOnQueryString();
505
+ await fetchWorkflows();
426
506
  }
427
507
  };
428
508
  const saveFiltersOnQueryString = () => {
429
- const query = {};
509
+ const currentQuery = { ...route.query };
430
510
  if (filters.value.search) {
431
- query.search = filters.value.search;
511
+ currentQuery.search = filters.value.search;
512
+ } else {
513
+ delete currentQuery.search;
432
514
  }
433
515
  if (typeof filters.value.status !== "string") {
434
- query.status = filters.value.status.toString();
516
+ currentQuery.status = filters.value.status.toString();
517
+ } else {
518
+ delete currentQuery.status;
435
519
  }
436
520
  if (filters.value.tags.length) {
437
- query.tags = filters.value.tags.join(",");
521
+ currentQuery.tags = filters.value.tags.join(",");
522
+ } else {
523
+ delete currentQuery.tags;
438
524
  }
439
525
  if (filters.value.homeProject) {
440
- query.homeProject = filters.value.homeProject;
526
+ currentQuery.homeProject = filters.value.homeProject;
527
+ } else {
528
+ delete currentQuery.homeProject;
441
529
  }
442
530
  void router.replace({
443
- query: Object.keys(query).length ? query : void 0
531
+ query: Object.keys(currentQuery).length ? currentQuery : void 0
444
532
  });
445
533
  };
446
534
  function isValidProjectId(projectId) {
447
535
  return projectsStore.availableProjects.some((project) => project.id === projectId);
448
536
  }
449
537
  const setFiltersFromQueryString = async () => {
450
- const { tags, status, search, homeProject } = route.query ?? {};
451
- const filtersToApply = {};
452
- if (homeProject && typeof homeProject === "string") {
538
+ const newQuery = { ...route.query };
539
+ const { tags, status, search, homeProject, sort } = route.query ?? {};
540
+ const isValidString = (value) => typeof value === "string" && value.trim().length > 0;
541
+ if (isValidString(homeProject)) {
453
542
  await projectsStore.getAvailableProjects();
454
543
  if (isValidProjectId(homeProject)) {
455
- filtersToApply.homeProject = homeProject;
544
+ newQuery.homeProject = homeProject;
545
+ filters.value.homeProject = homeProject;
546
+ } else {
547
+ delete newQuery.homeProject;
456
548
  }
549
+ } else {
550
+ delete newQuery.homeProject;
457
551
  }
458
- if (search && typeof search === "string") {
459
- filtersToApply.search = search;
552
+ if (isValidString(search)) {
553
+ newQuery.search = search;
554
+ filters.value.search = search;
555
+ } else {
556
+ delete newQuery.search;
460
557
  }
461
- if (tags && typeof tags === "string") {
558
+ if (isValidString(tags)) {
462
559
  await tagsStore.fetchAll();
463
- const currentTags = tagsStore.allTags.map((tag) => tag.id);
464
- filtersToApply.tags = tags.split(",").filter((tag) => currentTags.includes(tag));
560
+ const validTags = tags.split(",").filter((tag) => tagsStore.allTags.map((t) => t.id).includes(tag));
561
+ if (validTags.length) {
562
+ newQuery.tags = validTags.join(",");
563
+ filters.value.tags = validTags;
564
+ } else {
565
+ delete newQuery.tags;
566
+ }
567
+ } else {
568
+ delete newQuery.tags;
465
569
  }
466
- if (status && typeof status === "string" && [StatusFilter.ACTIVE.toString(), StatusFilter.DEACTIVATED.toString()].includes(status)) {
467
- filtersToApply.status = status === "true";
570
+ const validStatusValues = [StatusFilter.ACTIVE.toString(), StatusFilter.DEACTIVATED.toString()];
571
+ if (isValidString(status) && validStatusValues.includes(status)) {
572
+ newQuery.status = status;
573
+ filters.value.status = status === "true";
574
+ } else {
575
+ delete newQuery.status;
468
576
  }
469
- if (Object.keys(filtersToApply).length) {
470
- Object.assign(filters.value, filtersToApply);
577
+ if (isValidString(sort)) {
578
+ const newSort = WORKFLOWS_SORT_MAP[sort] ?? "updatedAt:desc";
579
+ newQuery.sort = sort;
580
+ currentSort.value = newSort;
581
+ } else {
582
+ delete newQuery.sort;
471
583
  }
472
- void router.replace({ query: pickBy(route.query) });
584
+ void router.replace({ query: newQuery });
473
585
  };
474
586
  sourceControlStore.$onAction(({ name, after }) => {
475
587
  if (name !== "pullWorkfolder") return;
476
588
  after(async () => await initialize());
477
589
  });
478
- watch(filters, () => saveFiltersOnQueryString(), { deep: true });
479
- watch(
480
- () => route.params?.projectId,
481
- async () => await initialize()
482
- );
483
- onMounted(async () => {
484
- documentTitle.set(i18n.baseText("workflows.heading"));
485
- await setFiltersFromQueryString();
486
- void usersStore.showPersonalizationSurvey();
487
- });
488
590
  const openAIWorkflow = async (source) => {
489
591
  dismissEasyAICallout();
490
592
  telemetry.track(
@@ -508,21 +610,46 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
508
610
  const dismissEasyAICallout = () => {
509
611
  easyAICalloutVisible.value = false;
510
612
  };
613
+ const onSortUpdated = async (sort) => {
614
+ currentSort.value = WORKFLOWS_SORT_MAP[sort] ?? "updatedAt:desc";
615
+ if (currentSort.value !== "updatedAt:desc") {
616
+ void router.replace({ query: { ...route.query, sort } });
617
+ } else {
618
+ void router.replace({ query: { ...route.query, sort: void 0 } });
619
+ }
620
+ await fetchWorkflows();
621
+ };
622
+ const onWorkflowActiveToggle = (data) => {
623
+ const workflow = workflows.value.find((w) => w.id === data.id);
624
+ if (!workflow) return;
625
+ workflow.active = data.active;
626
+ };
511
627
  return (_ctx, _cache) => {
512
628
  const _component_n8n_button = resolveComponent("n8n-button");
513
629
  const _component_N8nCallout = resolveComponent("N8nCallout");
514
630
  return openBlock(), createBlock(ResourcesListLayout, {
515
- "resource-key": "workflows",
516
- resources: allWorkflows.value,
517
631
  filters: filters.value,
518
- "additional-filters-handler": onFilter,
632
+ "onUpdate:filters": [
633
+ _cache[2] || (_cache[2] = ($event) => filters.value = $event),
634
+ onFiltersUpdated
635
+ ],
636
+ "resource-key": "workflows",
637
+ type: "list-paginated",
638
+ resources: workflowResources.value,
519
639
  "type-props": { itemSize: 80 },
520
640
  shareable: isShareable.value,
521
641
  initialize,
522
642
  disabled: readOnlyEnv.value || !projectPermissions.value.workflow.create,
523
- loading: loading.value,
643
+ loading: false,
644
+ "resources-refreshing": loading.value,
645
+ "custom-page-size": 10,
646
+ "total-items": unref(workflowsStore).totalWorkflowCount,
647
+ "dont-perform-sorting-and-filtering": true,
524
648
  "onClick:add": addWorkflow,
525
- "onUpdate:filters": onFiltersUpdated
649
+ "onUpdate:search": onSearchUpdated,
650
+ "onUpdate:currentPage": setCurrentPage,
651
+ "onUpdate:pageSize": setPageSize,
652
+ onSort: onSortUpdated
526
653
  }, {
527
654
  header: withCtx(() => [
528
655
  createVNode(ProjectHeader)
@@ -564,15 +691,19 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
564
691
  _: 1
565
692
  }, 8, ["class"])) : createCommentVNode("", true)
566
693
  ]),
567
- default: withCtx(({ data, updateItemSize }) => [
694
+ item: withCtx(({ item: data }) => [
568
695
  createVNode(WorkflowCard, {
569
696
  "data-test-id": "resources-list-item",
570
697
  class: "mb-2xs",
571
698
  data,
699
+ "workflow-list-event-bus": unref(workflowListEventBus),
572
700
  "read-only": readOnlyEnv.value,
573
- "onExpand:tags": ($event) => updateItemSize(data),
574
- "onClick:tag": onClickTag
575
- }, null, 8, ["data", "read-only", "onExpand:tags"])
701
+ "onClick:tag": onClickTag,
702
+ "onWorkflow:deleted": fetchWorkflows,
703
+ "onWorkflow:moved": fetchWorkflows,
704
+ "onWorkflow:duplicated": fetchWorkflows,
705
+ "onWorkflow:activeToggle": onWorkflowActiveToggle
706
+ }, null, 8, ["data", "workflow-list-event-bus", "read-only"])
576
707
  ]),
577
708
  empty: withCtx(() => [
578
709
  createBaseVNode("div", _hoisted_1, [
@@ -697,7 +828,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
697
828
  ])
698
829
  ]),
699
830
  _: 1
700
- }, 8, ["resources", "filters", "shareable", "disabled", "loading"]);
831
+ }, 8, ["filters", "resources", "shareable", "disabled", "resources-refreshing", "total-items"]);
701
832
  };
702
833
  }
703
834
  });
@@ -0,0 +1,6 @@
1
+ function commonjsRequire(path) {
2
+ throw new Error('Could not dynamically require "' + path + '". Please configure the dynamicRequireTargets or/and ignoreDynamicRequires option of @rollup/plugin-commonjs appropriately for this require call to work.');
3
+ }
4
+ export {
5
+ commonjsRequire as c
6
+ };
@@ -1,4 +1,4 @@
1
- import { bh as NodeConnectionType } from "./index-BwoviwZU.js";
1
+ import { bh as NodeConnectionType } from "./index-RIkMj045.js";
2
2
  const getEasyAiWorkflowJson = ({
3
3
  isInstanceInAiFreeCreditsExperiment,
4
4
  withOpenAiFreeCredits
@@ -53,7 +53,7 @@ const getEasyAiWorkflowJson = ({
53
53
  position: [560, 20],
54
54
  parameters: {
55
55
  options: {
56
- systemMessage: "=You're a helpful assistant that the user to answer questions about their calendar.\n\nToday is {{ $now.format('cccc') }} the {{ $now.format('yyyy-MM-dd HH:mm') }}."
56
+ systemMessage: "=You're a helpful assistant that helps the user answer questions about their calendar.\n\nToday is {{ $now.format('cccc') }} the {{ $now.format('yyyy-MM-dd HH:mm') }}."
57
57
  }
58
58
  }
59
59
  },
@@ -0,0 +1,5 @@
1
+ import { C as createEventBus } from "./index-RIkMj045.js";
2
+ const globalLinkActionsEventBus = createEventBus();
3
+ export {
4
+ globalLinkActionsEventBus as g
5
+ };
@@ -0,0 +1,5 @@
1
+ import { C as createEventBus } from "./index-RIkMj045.js";
2
+ const importCurlEventBus = createEventBus();
3
+ export {
4
+ importCurlEventBus as i
5
+ };