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,16 +1,4 @@
1
- import { hR as arrayMap, hS as getAllKeysIn, hT as baseIteratee, hU as basePickBy, _ as _export_sfc, c as openBlock, h as createElementBlock, s as renderSlot, j as createBaseVNode, n as normalizeClass, d as defineComponent, f as createCommentVNode, r as ref, a1 as useProjectsStore, q as computed, H as watch, aw as onBeforeMount, e as createBlock, w as withCtx, i as createVNode, ax as withDirectives, ay as vShow, k as createTextVNode, t as toDisplayString, l as unref, a8 as EnterpriseEditionFeature, hV as ProjectSharing, g as useI18n, m as resolveComponent, U as useRoute, J as useDebounce, u as useUsersStore, o as onMounted, y as nextTick, aZ as normalizeProps, a_ as guardReactiveProps, F as Fragment, A as renderList, aj as useTelemetry } from "./index-BwoviwZU.js";
2
- function pickBy(object, predicate) {
3
- if (object == null) {
4
- return {};
5
- }
6
- var props = arrayMap(getAllKeysIn(object), function(prop) {
7
- return [prop];
8
- });
9
- predicate = baseIteratee(predicate);
10
- return basePickBy(object, props, function(value, path) {
11
- return predicate(value, path[0]);
12
- });
13
- }
1
+ import { _ as _export_sfc, c as openBlock, h as createElementBlock, s as renderSlot, j as createBaseVNode, n as normalizeClass, d as defineComponent, f as createCommentVNode, a1 as useProjectsStore, q as computed, H as watch, aw as onBeforeMount, e as createBlock, w as withCtx, i as createVNode, ax as withDirectives, ay as vShow, k as createTextVNode, t as toDisplayString, l as unref, a8 as EnterpriseEditionFeature, hT as ProjectSharing, g as useI18n, m as resolveComponent, U as useRoute, b as useRouter, J as useDebounce, u as useUsersStore, r as ref, o as onMounted, y as nextTick, aZ as normalizeProps, a_ as guardReactiveProps, F as Fragment, A as renderList, aj as useTelemetry } from "./index-RIkMj045.js";
14
2
  const wrapper$1 = "_wrapper_1x8n3_123";
15
3
  const content = "_content_1x8n3_139";
16
4
  const style0$3 = {
@@ -90,9 +78,16 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
90
78
  setup(__props, { emit: __emit }) {
91
79
  const props = __props;
92
80
  const emit = __emit;
93
- const selectedProject = ref(null);
94
81
  const projectsStore = useProjectsStore();
95
82
  const i18n = useI18n();
83
+ const selectedProject = computed({
84
+ get: () => {
85
+ return projectsStore.availableProjects.find(
86
+ (project) => project.id === props.modelValue.homeProject
87
+ ) ?? null;
88
+ },
89
+ set: (value) => setKeyValue("homeProject", value?.id ?? "")
90
+ });
96
91
  const filtersLength = computed(() => {
97
92
  let length = 0;
98
93
  props.keys.forEach((key) => {
@@ -137,9 +132,6 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
137
132
  });
138
133
  onBeforeMount(async () => {
139
134
  await projectsStore.getAvailableProjects();
140
- selectedProject.value = projectsStore.availableProjects.find(
141
- (project) => project.id === props.modelValue.homeProject
142
- ) ?? null;
143
135
  });
144
136
  return (_ctx, _cache) => {
145
137
  const _component_n8n_badge = resolveComponent("n8n-badge");
@@ -164,6 +156,7 @@ const _sfc_main$1 = /* @__PURE__ */ defineComponent({
164
156
  default: withCtx(() => [
165
157
  withDirectives(createVNode(_component_n8n_badge, {
166
158
  class: normalizeClass(_ctx.$style["filter-button-count"]),
159
+ "data-test-id": "resources-list-filters-count",
167
160
  theme: "primary"
168
161
  }, {
169
162
  default: withCtx(() => [
@@ -252,6 +245,10 @@ const _hoisted_3 = {
252
245
  key: 0,
253
246
  class: "mt-xs"
254
247
  };
248
+ const _hoisted_4 = {
249
+ key: 0,
250
+ class: "resource-list-loading"
251
+ };
255
252
  const _sfc_main = /* @__PURE__ */ defineComponent({
256
253
  __name: "ResourcesListLayout",
257
254
  props: {
@@ -267,30 +264,46 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
267
264
  showFiltersDropdown: { type: Boolean, default: true },
268
265
  sortFns: { default: () => ({}) },
269
266
  sortOptions: { default: () => ["lastUpdated", "lastCreated", "nameAsc", "nameDesc"] },
270
- type: { default: "list" },
267
+ type: { default: "list-full" },
271
268
  typeProps: { default: () => ({ itemSize: 80 }) },
272
- loading: { type: Boolean, default: true }
269
+ loading: { type: Boolean, default: true },
270
+ customPageSize: { default: 25 },
271
+ availablePageSizeOptions: { default: () => [10, 25, 50, 100] },
272
+ totalItems: { default: 0 },
273
+ resourcesRefreshing: { type: Boolean, default: false },
274
+ dontPerformSortingAndFiltering: { type: Boolean, default: false }
273
275
  },
274
- emits: ["update:filters", "click:add", "sort"],
276
+ emits: ["update:filters", "click:add", "update:current-page", "update:page-size", "sort", "update:search"],
275
277
  setup(__props, { expose: __expose, emit: __emit }) {
276
- const props = __props;
277
- const emit = __emit;
278
278
  const route = useRoute();
279
+ const router = useRouter();
279
280
  const i18n = useI18n();
280
281
  const { callDebounced } = useDebounce();
281
282
  const usersStore = useUsersStore();
282
283
  const telemetry = useTelemetry();
284
+ const props = __props;
283
285
  const sortBy = ref(props.sortOptions[0]);
284
286
  const hasFilters = ref(false);
285
- const filtersModel = ref(props.filters);
286
287
  const currentPage = ref(1);
287
- const rowsPerPage = ref(25);
288
+ const rowsPerPage = ref(props.customPageSize);
288
289
  const resettingFilters = ref(false);
289
290
  const search2 = ref(null);
291
+ const emit = __emit;
292
+ const filtersModel = computed({
293
+ get: () => props.filters,
294
+ set: (newValue) => emit("update:filters", newValue)
295
+ });
296
+ const showEmptyState = computed(() => {
297
+ return props.resources.length === 0 && // Don't show empty state if resources are refreshing or if filters are being set
298
+ !hasFilters.value && !filtersModel.value.search && !props.resourcesRefreshing;
299
+ });
290
300
  const filterKeys = computed(() => {
291
301
  return Object.keys(filtersModel.value);
292
302
  });
293
303
  const filteredAndSortedResources = computed(() => {
304
+ if (props.dontPerformSortingAndFiltering) {
305
+ return props.resources;
306
+ }
294
307
  const filtered = props.resources.filter((resource) => {
295
308
  let matches = true;
296
309
  if (filtersModel.value.homeProject) {
@@ -320,6 +333,78 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
320
333
  }
321
334
  });
322
335
  });
336
+ watch(
337
+ () => props.filters,
338
+ (value) => {
339
+ filtersModel.value = value;
340
+ if (hasAppliedFilters()) {
341
+ hasFilters.value = true;
342
+ }
343
+ }
344
+ );
345
+ watch(
346
+ () => filtersModel.value.homeProject,
347
+ () => {
348
+ sendFiltersTelemetry("homeProject");
349
+ }
350
+ );
351
+ watch(
352
+ () => filtersModel.value.tags,
353
+ () => {
354
+ sendFiltersTelemetry("tags");
355
+ }
356
+ );
357
+ watch(
358
+ () => filtersModel.value.type,
359
+ () => {
360
+ sendFiltersTelemetry("type");
361
+ }
362
+ );
363
+ watch(
364
+ () => filtersModel.value.search,
365
+ () => callDebounced(sendFiltersTelemetry, { debounceTime: 1e3, trailing: true }, "search")
366
+ );
367
+ watch(
368
+ () => filtersModel.value.setupNeeded,
369
+ () => {
370
+ sendFiltersTelemetry("setupNeeded");
371
+ }
372
+ );
373
+ watch(
374
+ () => filtersModel.value.incomplete,
375
+ () => {
376
+ sendFiltersTelemetry("incomplete");
377
+ }
378
+ );
379
+ watch(
380
+ () => sortBy.value,
381
+ (newValue) => {
382
+ emit("sort", newValue);
383
+ sendSortingTelemetry();
384
+ }
385
+ );
386
+ watch(
387
+ () => route?.params?.projectId,
388
+ async () => {
389
+ await resetFilters();
390
+ }
391
+ );
392
+ watch(
393
+ () => props.resources,
394
+ async () => {
395
+ await nextTick();
396
+ focusSearchInput();
397
+ }
398
+ );
399
+ onMounted(async () => {
400
+ await loadPaginationFromQueryString();
401
+ await props.initialize();
402
+ await nextTick();
403
+ focusSearchInput();
404
+ if (hasAppliedFilters()) {
405
+ hasFilters.value = true;
406
+ }
407
+ });
323
408
  const focusSearchInput = () => {
324
409
  if (search2.value) {
325
410
  search2.value.focus();
@@ -337,11 +422,15 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
337
422
  return props.filters[key] !== "";
338
423
  });
339
424
  };
340
- const setRowsPerPage = (numberOfRowsPerPage) => {
425
+ const setRowsPerPage = async (numberOfRowsPerPage) => {
341
426
  rowsPerPage.value = numberOfRowsPerPage;
427
+ await savePaginationToQueryString();
428
+ emit("update:page-size", numberOfRowsPerPage);
342
429
  };
343
- const setCurrentPage = (page) => {
430
+ const setCurrentPage = async (page) => {
344
431
  currentPage.value = page;
432
+ await savePaginationToQueryString();
433
+ emit("update:current-page", page);
345
434
  };
346
435
  __expose({
347
436
  currentPage,
@@ -376,11 +465,13 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
376
465
  const onUpdateFilters = (e) => {
377
466
  emit("update:filters", e);
378
467
  };
379
- const resetFilters = () => {
468
+ const resetFilters = async () => {
380
469
  Object.keys(filtersModel.value).forEach((key) => {
381
470
  filtersModel.value[key] = Array.isArray(filtersModel.value[key]) ? [] : "";
382
471
  });
472
+ await setCurrentPage(1);
383
473
  resettingFilters.value = true;
474
+ hasFilters.value = false;
384
475
  sendFiltersTelemetry("reset");
385
476
  emit("update:filters", filtersModel.value);
386
477
  };
@@ -406,69 +497,48 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
406
497
  };
407
498
  const onSearch = (s) => {
408
499
  filtersModel.value.search = s;
409
- emit("update:filters", filtersModel.value);
500
+ emit("update:search", s);
410
501
  };
411
- watch(
412
- () => props.filters,
413
- (value) => {
414
- filtersModel.value = value;
415
- }
416
- );
417
- watch(
418
- () => filtersModel.value.homeProject,
419
- () => {
420
- sendFiltersTelemetry("homeProject");
421
- }
422
- );
423
- watch(
424
- () => filtersModel.value.tags,
425
- () => {
426
- sendFiltersTelemetry("tags");
502
+ const findNearestPageSize = (size) => {
503
+ return props.availablePageSizeOptions.reduce(
504
+ (prev, curr) => Math.abs(curr - size) < Math.abs(prev - size) ? curr : prev
505
+ );
506
+ };
507
+ const savePaginationToQueryString = async () => {
508
+ if (props.type !== "list-paginated") {
509
+ return;
427
510
  }
428
- );
429
- watch(
430
- () => filtersModel.value.type,
431
- () => {
432
- sendFiltersTelemetry("type");
511
+ const currentQuery = { ...route.query };
512
+ if (currentPage.value !== 1) {
513
+ currentQuery.page = currentPage.value.toString();
514
+ } else {
515
+ delete currentQuery.page;
433
516
  }
434
- );
435
- watch(
436
- () => filtersModel.value.search,
437
- () => callDebounced(sendFiltersTelemetry, { debounceTime: 1e3, trailing: true }, "search")
438
- );
439
- watch(
440
- () => filtersModel.value.setupNeeded,
441
- () => {
442
- sendFiltersTelemetry("setupNeeded");
517
+ if (rowsPerPage.value !== props.customPageSize) {
518
+ currentQuery.pageSize = rowsPerPage.value.toString();
519
+ } else {
520
+ delete currentQuery.pageSize;
443
521
  }
444
- );
445
- watch(
446
- () => filtersModel.value.incomplete,
447
- () => {
448
- sendFiltersTelemetry("incomplete");
522
+ await router.replace({
523
+ query: Object.keys(currentQuery).length ? currentQuery : void 0
524
+ });
525
+ };
526
+ const loadPaginationFromQueryString = async () => {
527
+ if (props.type !== "list-paginated") {
528
+ return;
449
529
  }
450
- );
451
- watch(
452
- () => sortBy.value,
453
- (newValue) => {
454
- emit("sort", newValue);
455
- sendSortingTelemetry();
530
+ const query = router.currentRoute.value.query;
531
+ if (query.page) {
532
+ await setCurrentPage(parseInt(query.page, 10));
456
533
  }
457
- );
458
- watch(
459
- () => route?.params?.projectId,
460
- () => {
461
- resetFilters();
534
+ if (query.pageSize) {
535
+ const parsedSize = parseInt(query.pageSize, 10);
536
+ await setRowsPerPage(findNearestPageSize(parsedSize));
462
537
  }
463
- );
464
- onMounted(async () => {
465
- await props.initialize();
466
- await nextTick();
467
- focusSearchInput();
468
- if (hasAppliedFilters()) {
469
- hasFilters.value = true;
538
+ if (query.sort) {
539
+ sortBy.value = query.sort;
470
540
  }
471
- });
541
+ };
472
542
  return (_ctx, _cache) => {
473
543
  const _component_n8n_loading = resolveComponent("n8n-loading");
474
544
  const _component_n8n_action_box = resolveComponent("n8n-action-box");
@@ -479,6 +549,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
479
549
  const _component_n8n_link = resolveComponent("n8n-link");
480
550
  const _component_n8n_info_tip = resolveComponent("n8n-info-tip");
481
551
  const _component_n8n_recycle_scroller = resolveComponent("n8n-recycle-scroller");
552
+ const _component_el_pagination = resolveComponent("el-pagination");
482
553
  const _component_n8n_datatable = resolveComponent("n8n-datatable");
483
554
  const _component_n8n_text = resolveComponent("n8n-text");
484
555
  return openBlock(), createBlock(PageViewLayout, null, {
@@ -492,7 +563,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
492
563
  "shrink-last": false
493
564
  })
494
565
  ])) : (openBlock(), createElementBlock(Fragment, { key: 1 }, [
495
- _ctx.resources.length === 0 ? (openBlock(), createElementBlock("div", _hoisted_2, [
566
+ showEmptyState.value ? (openBlock(), createElementBlock("div", _hoisted_2, [
496
567
  renderSlot(_ctx.$slots, "empty", {}, () => [
497
568
  createVNode(_component_n8n_action_box, {
498
569
  "data-test-id": "empty-resources-list",
@@ -597,16 +668,22 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
597
668
  ], 512)), [
598
669
  [vShow, hasFilters.value]
599
670
  ]) : createCommentVNode("", true),
600
- _cache[1] || (_cache[1] = createBaseVNode("div", { class: "pb-xs" }, null, -1))
671
+ _cache[3] || (_cache[3] = createBaseVNode("div", { class: "pb-xs" }, null, -1))
601
672
  ]),
602
673
  default: withCtx(() => [
603
674
  renderSlot(_ctx.$slots, "preamble", {}, void 0, true),
604
- filteredAndSortedResources.value.length > 0 ? (openBlock(), createElementBlock("div", {
605
- key: 0,
675
+ _ctx.resourcesRefreshing ? (openBlock(), createElementBlock("div", _hoisted_4, [
676
+ createVNode(_component_n8n_loading, {
677
+ rows: rowsPerPage.value,
678
+ "shrink-last": false
679
+ }, null, 8, ["rows"])
680
+ ])) : filteredAndSortedResources.value.length > 0 ? (openBlock(), createElementBlock("div", {
681
+ key: 1,
606
682
  ref: "listWrapperRef",
683
+ "data-test-id": "resources-list-wrapper",
607
684
  class: normalizeClass(_ctx.$style.listWrapper)
608
685
  }, [
609
- _ctx.type === "list" ? (openBlock(), createBlock(_component_n8n_recycle_scroller, {
686
+ _ctx.type === "list-full" ? (openBlock(), createBlock(_component_n8n_recycle_scroller, {
610
687
  key: 0,
611
688
  "data-test-id": "resources-list",
612
689
  items: filteredAndSortedResources.value,
@@ -620,9 +697,49 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
620
697
  }, void 0, true)
621
698
  ]),
622
699
  _: 3
623
- }, 8, ["items", "item-size"])) : createCommentVNode("", true),
624
- _ctx.type === "datatable" ? (openBlock(), createBlock(_component_n8n_datatable, {
700
+ }, 8, ["items", "item-size"])) : _ctx.type === "list-paginated" ? (openBlock(), createElementBlock("div", {
625
701
  key: 1,
702
+ class: normalizeClass(_ctx.$style.paginatedListWrapper)
703
+ }, [
704
+ createBaseVNode("div", {
705
+ class: normalizeClass(_ctx.$style.listItems)
706
+ }, [
707
+ (openBlock(true), createElementBlock(Fragment, null, renderList(_ctx.resources, (item, index) => {
708
+ return openBlock(), createElementBlock("div", {
709
+ key: index,
710
+ class: normalizeClass(_ctx.$style.listItem)
711
+ }, [
712
+ renderSlot(_ctx.$slots, "item", {
713
+ item,
714
+ index
715
+ }, () => [
716
+ createTextVNode(toDisplayString(item), 1)
717
+ ], true)
718
+ ], 2);
719
+ }), 128))
720
+ ], 2),
721
+ createBaseVNode("div", {
722
+ class: normalizeClass(_ctx.$style.listPagination)
723
+ }, [
724
+ createVNode(_component_el_pagination, {
725
+ "current-page": currentPage.value,
726
+ "onUpdate:currentPage": [
727
+ _cache[1] || (_cache[1] = ($event) => currentPage.value = $event),
728
+ setCurrentPage
729
+ ],
730
+ "page-size": rowsPerPage.value,
731
+ "onUpdate:pageSize": _cache[2] || (_cache[2] = ($event) => rowsPerPage.value = $event),
732
+ background: "",
733
+ total: _ctx.totalItems,
734
+ "page-sizes": _ctx.availablePageSizeOptions,
735
+ layout: "total, prev, pager, next, sizes",
736
+ "data-test-id": "resources-list-pagination",
737
+ onSizeChange: setRowsPerPage
738
+ }, null, 8, ["current-page", "page-size", "total", "page-sizes"])
739
+ ], 2)
740
+ ], 2)) : createCommentVNode("", true),
741
+ _ctx.type === "datatable" ? (openBlock(), createBlock(_component_n8n_datatable, {
742
+ key: 2,
626
743
  "data-test-id": "resources-table",
627
744
  class: normalizeClass(_ctx.$style.datatable),
628
745
  columns: getColumns(),
@@ -641,7 +758,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
641
758
  _: 3
642
759
  }, 8, ["class", "columns", "rows", "current-page", "rows-per-page"])) : createCommentVNode("", true)
643
760
  ], 2)) : (openBlock(), createBlock(_component_n8n_text, {
644
- key: 1,
761
+ key: 2,
645
762
  color: "text-base",
646
763
  size: "medium",
647
764
  "data-test-id": "resources-list-empty"
@@ -662,23 +779,26 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
662
779
  };
663
780
  }
664
781
  });
665
- const filters = "_filters_12sb3_123";
666
- const search = "_search_12sb3_149";
667
- const listWrapper = "_listWrapper_12sb3_158";
668
- const datatable = "_datatable_12sb3_173";
782
+ const filters = "_filters_1mm9j_123";
783
+ const search = "_search_1mm9j_149";
784
+ const listWrapper = "_listWrapper_1mm9j_158";
785
+ const paginatedListWrapper = "_paginatedListWrapper_1mm9j_164";
786
+ const listPagination = "_listPagination_1mm9j_172";
787
+ const datatable = "_datatable_1mm9j_199";
669
788
  const style0 = {
670
- "filters-row": "_filters-row_12sb3_123",
789
+ "filters-row": "_filters-row_1mm9j_123",
671
790
  filters,
672
791
  search,
673
792
  listWrapper,
674
- "sort-and-filter": "_sort-and-filter_12sb3_164",
793
+ paginatedListWrapper,
794
+ listPagination,
795
+ "sort-and-filter": "_sort-and-filter_1mm9j_190",
675
796
  datatable
676
797
  };
677
798
  const cssModules = {
678
799
  "$style": style0
679
800
  };
680
- const ResourcesListLayout = /* @__PURE__ */ _export_sfc(_sfc_main, [["__cssModules", cssModules], ["__scopeId", "data-v-a1cfe06a"]]);
801
+ const ResourcesListLayout = /* @__PURE__ */ _export_sfc(_sfc_main, [["__cssModules", cssModules], ["__scopeId", "data-v-62487419"]]);
681
802
  export {
682
- ResourcesListLayout as R,
683
- pickBy as p
803
+ ResourcesListLayout as R
684
804
  };
@@ -546,14 +546,14 @@
546
546
  -------------------------- */
547
547
  /* BEM
548
548
  -------------------------- */
549
- ._filters-row_12sb3_123 {
549
+ ._filters-row_1mm9j_123 {
550
550
  display: flex;
551
551
  flex-direction: row;
552
552
  align-items: center;
553
553
  justify-content: space-between;
554
554
  width: 100%;
555
555
  }
556
- ._filters_12sb3_123 {
556
+ ._filters_1mm9j_123 {
557
557
  display: grid;
558
558
  grid-auto-flow: column;
559
559
  grid-auto-columns: max-content;
@@ -562,36 +562,60 @@
562
562
  width: 100%;
563
563
  }
564
564
  @media screen and (max-width: 767px) {
565
- ._filters_12sb3_123 {
565
+ ._filters_1mm9j_123 {
566
566
  grid-template-columns: 1fr auto;
567
567
  grid-auto-flow: row;
568
568
  }
569
- ._filters_12sb3_123 > *:last-child {
569
+ ._filters_1mm9j_123 > *:last-child {
570
570
  grid-column: auto;
571
571
  }
572
572
  }
573
- ._search_12sb3_149 {
573
+ ._search_1mm9j_149 {
574
574
  max-width: 240px;
575
575
  }
576
576
  @media screen and (max-width: 991px) {
577
- ._search_12sb3_149 {
577
+ ._search_1mm9j_149 {
578
578
  max-width: 100%;
579
579
  }
580
580
  }
581
- ._listWrapper_12sb3_158 {
581
+ ._listWrapper_1mm9j_158 {
582
582
  position: absolute;
583
583
  height: 100%;
584
584
  width: 100%;
585
585
  }
586
- ._sort-and-filter_12sb3_164 {
586
+ ._paginatedListWrapper_1mm9j_164 {
587
+ display: flex;
588
+ flex-direction: column;
589
+ height: 100%;
590
+ overflow: auto;
591
+ gap: var(--spacing-m);
592
+ }
593
+ ._listPagination_1mm9j_172 {
594
+ display: flex;
595
+ justify-content: flex-end;
596
+ margin-bottom: var(--spacing-l);
597
+ }
598
+ ._listPagination_1mm9j_172 .el-pagination__sizes {
599
+ height: 100%;
600
+ position: relative;
601
+ top: -1px;
602
+ }
603
+ ._listPagination_1mm9j_172 .el-pagination__sizes input {
604
+ height: 100%;
605
+ min-height: 28px;
606
+ }
607
+ ._listPagination_1mm9j_172 .el-pagination__sizes .el-input__suffix {
608
+ width: var(--spacing-m);
609
+ }
610
+ ._sort-and-filter_1mm9j_190 {
587
611
  white-space: nowrap;
588
612
  }
589
613
  @media screen and (max-width: 991px) {
590
- ._sort-and-filter_12sb3_164 {
614
+ ._sort-and-filter_1mm9j_190 {
591
615
  width: 100%;
592
616
  }
593
617
  }
594
- ._datatable_12sb3_173 {
618
+ ._datatable_1mm9j_199 {
595
619
  padding-bottom: var(--spacing-s);
596
620
  }/* BEM support Func
597
621
  -------------------------- */
@@ -715,7 +739,7 @@
715
739
  -------------------------- */
716
740
  /* BEM
717
741
  -------------------------- */
718
- .resource-list-loading[data-v-a1cfe06a] {
742
+ .resource-list-loading[data-v-62487419] {
719
743
  position: relative;
720
744
  height: 0;
721
745
  width: 100%;
@@ -723,22 +747,22 @@
723
747
  /*
724
748
  Show the loading skeleton only if the loading takes longer than 300ms
725
749
  */
726
- animation: 0.01s linear 0.3s forwards changeVisibility-a1cfe06a;
750
+ animation: 0.01s linear 0.3s forwards changeVisibility-62487419;
727
751
  }
728
- .resource-list-loading[data-v-a1cfe06a] .el-skeleton {
752
+ .resource-list-loading[data-v-62487419] .el-skeleton {
729
753
  position: absolute;
730
754
  height: 100%;
731
755
  width: 100%;
732
756
  overflow: hidden;
733
757
  }
734
- .resource-list-loading[data-v-a1cfe06a] .el-skeleton > div > div:first-child .el-skeleton__item {
758
+ .resource-list-loading[data-v-62487419] .el-skeleton > div > div:first-child .el-skeleton__item {
735
759
  height: 42px;
736
760
  margin: 0;
737
761
  }
738
- .resource-list-loading[data-v-a1cfe06a] .el-skeleton .el-skeleton__item {
762
+ .resource-list-loading[data-v-62487419] .el-skeleton .el-skeleton__item {
739
763
  height: 69px;
740
764
  }
741
- @keyframes changeVisibility-a1cfe06a {
765
+ @keyframes changeVisibility-62487419 {
742
766
  from {
743
767
  height: 0;
744
768
  }