@vendure/dashboard 3.5.6-master-202603280305 → 3.5.6

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/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@vendure/dashboard",
3
3
  "private": false,
4
- "version": "3.5.6-master-202603280305",
4
+ "version": "3.5.6",
5
5
  "type": "module",
6
6
  "repository": {
7
7
  "type": "git",
@@ -162,8 +162,8 @@
162
162
  "@storybook/addon-vitest": "^10.0.0-beta.9",
163
163
  "@storybook/react-vite": "^10.0.0-beta.9",
164
164
  "@types/node": "^22.13.4",
165
- "@vendure/common": "^3.5.6-master-202603280305",
166
- "@vendure/core": "^3.5.6-master-202603280305",
165
+ "@vendure/common": "3.5.6",
166
+ "@vendure/core": "3.5.6",
167
167
  "@vitest/browser": "^3.2.4",
168
168
  "@vitest/coverage-v8": "^3.2.4",
169
169
  "eslint": "^9.19.0",
@@ -6,12 +6,12 @@ import { ListPage } from '@/vdb/framework/page/list-page.js';
6
6
  import { api } from '@/vdb/graphql/api.js';
7
7
  import { Trans, useLingui } from '@lingui/react/macro';
8
8
  import { FetchQueryOptions, useQueries, useQueryClient } from '@tanstack/react-query';
9
- import { createFileRoute, Link } from '@tanstack/react-router';
9
+ import { createFileRoute, Link, useNavigate } from '@tanstack/react-router';
10
10
  import { ExpandedState, getExpandedRowModel } from '@tanstack/react-table';
11
11
  import { TableOptions } from '@tanstack/table-core';
12
12
  import { ResultOf } from 'gql.tada';
13
13
  import { Folder, FolderOpen, PlusIcon } from 'lucide-react';
14
- import { useState } from 'react';
14
+ import { useCallback, useEffect, useState } from 'react';
15
15
  import { toast } from 'sonner';
16
16
 
17
17
  import { RichTextDescriptionCell } from '@/vdb/components/shared/table-cell/order-table-cell-components.js';
@@ -33,9 +33,29 @@ import {
33
33
  import { CollectionContentsSheet } from './components/collection-contents-sheet.js';
34
34
 
35
35
 
36
+ function parseExpandedParam(expanded?: string): ExpandedState {
37
+ if (!expanded) return {};
38
+ const ids = expanded.split(',').filter(Boolean);
39
+ return Object.fromEntries(ids.map(id => [id, true]));
40
+ }
41
+
42
+ function serializeExpandedState(expanded: ExpandedState): string | undefined {
43
+ if (expanded === true) return undefined;
44
+ const ids = Object.entries(expanded)
45
+ .filter(([_, v]) => v)
46
+ .map(([id]) => id);
47
+ return ids.length > 0 ? ids.join(',') : undefined;
48
+ }
49
+
36
50
  export const Route = createFileRoute('/_authenticated/_collections/collections')({
37
51
  component: CollectionListPage,
38
52
  loader: () => ({ breadcrumb: () => <Trans>Collections</Trans> }),
53
+ validateSearch: (search: Record<string, unknown>) => {
54
+ return {
55
+ ...search,
56
+ expanded: (search.expanded as string) || undefined,
57
+ };
58
+ },
39
59
  });
40
60
 
41
61
 
@@ -61,14 +81,36 @@ function isLoadMoreRow(row: CollectionOrLoadMore): row is LoadMoreRow {
61
81
  function CollectionListPage() {
62
82
  const { t } = useLingui();
63
83
  const queryClient = useQueryClient();
64
- const [expanded, setExpanded] = useState<ExpandedState>({});
84
+ const routeSearch = Route.useSearch();
85
+ const navigate = useNavigate({ from: Route.fullPath });
86
+ const [expanded, setExpandedState] = useState<ExpandedState>(() => parseExpandedParam(routeSearch.expanded));
65
87
  const [searchTerm, setSearchTerm] = useState<string>('');
66
88
  const [accumulatedChildren, setAccumulatedChildren] = useState<
67
89
  Record<string, { items: Collection[]; totalItems: number }>
68
90
  >({});
69
91
  const [nextPageToFetch, setNextPageToFetch] = useState<Record<string, number>>({});
70
92
 
71
- useQueries({
93
+ const setExpanded = useCallback((updater: ExpandedState | ((prev: ExpandedState) => ExpandedState)) => {
94
+ setExpandedState(prev => {
95
+ const next = typeof updater === 'function' ? updater(prev) : updater;
96
+ navigate({
97
+ search: (old: Record<string, unknown>) => ({
98
+ ...old,
99
+ expanded: serializeExpandedState(next),
100
+ }),
101
+ replace: true,
102
+ });
103
+ return next;
104
+ });
105
+ }, [navigate]);
106
+
107
+ // NOTE: queryFn must be pure (no setState side effects) because TanStack Query
108
+ // skips queryFn entirely when data is served from cache (staleTime: 5min). If we
109
+ // called setAccumulatedChildren inside queryFn, a re-mounted component would get
110
+ // cache hits but accumulatedChildren would never be populated, so children wouldn't
111
+ // render. Instead we sync via useEffect below, which fires for both cache hits and
112
+ // fresh fetches.
113
+ const firstPageChildQueries = useQueries({
72
114
  queries: expanded === true ? [] : Object.entries(expanded)
73
115
  .filter(([collectionId]) => !accumulatedChildren[collectionId])
74
116
  .map(([collectionId]) => {
@@ -84,21 +126,35 @@ function CollectionListPage() {
84
126
  skip: 0,
85
127
  },
86
128
  });
87
- setAccumulatedChildren(prev => ({
88
- ...prev,
89
- [collectionId]: {
90
- items: result.collections.items,
91
- totalItems: result.collections.totalItems,
92
- },
93
- }));
94
- return result;
129
+ return {
130
+ collectionId,
131
+ items: result.collections.items,
132
+ totalItems: result.collections.totalItems,
133
+ };
95
134
  },
96
135
  staleTime: 1000 * 60 * 5,
97
136
  } satisfies FetchQueryOptions;
98
137
  }),
99
138
  });
100
139
 
101
- useQueries({
140
+ useEffect(() => {
141
+ const newChildren: Record<string, { items: Collection[]; totalItems: number }> = {};
142
+ let hasNew = false;
143
+ for (const query of firstPageChildQueries) {
144
+ if (query.data && !accumulatedChildren[query.data.collectionId]) {
145
+ newChildren[query.data.collectionId] = {
146
+ items: query.data.items as Collection[],
147
+ totalItems: query.data.totalItems,
148
+ };
149
+ hasNew = true;
150
+ }
151
+ }
152
+ if (hasNew) {
153
+ setAccumulatedChildren(prev => ({ ...prev, ...newChildren }));
154
+ }
155
+ }, [firstPageChildQueries]);
156
+
157
+ const pagedChildQueries = useQueries({
102
158
  queries: Object.entries(nextPageToFetch)
103
159
  .filter(([_, page]) => page > 0)
104
160
  .map(([collectionId, page]) => {
@@ -114,28 +170,49 @@ function CollectionListPage() {
114
170
  skip: page * CHILDREN_PAGE_SIZE,
115
171
  },
116
172
  });
117
- setAccumulatedChildren(prev => {
118
- const existing = prev[collectionId];
119
- if (!existing) return prev;
120
- return {
121
- ...prev,
122
- [collectionId]: {
123
- items: [...existing.items, ...result.collections.items],
124
- totalItems: result.collections.totalItems,
125
- },
126
- };
127
- });
128
- setNextPageToFetch(prev => {
129
- const { [collectionId]: _, ...rest } = prev;
130
- return rest;
131
- });
132
- return result;
173
+ return {
174
+ collectionId,
175
+ items: result.collections.items,
176
+ totalItems: result.collections.totalItems,
177
+ };
133
178
  },
134
179
  staleTime: 1000 * 60 * 5,
135
180
  } satisfies FetchQueryOptions;
136
181
  }),
137
182
  });
138
183
 
184
+ useEffect(() => {
185
+ let hasUpdates = false;
186
+ const childUpdates: Record<string, { items: Collection[]; totalItems: number }> = {};
187
+ const fetchedPages: string[] = [];
188
+ for (const query of pagedChildQueries) {
189
+ if (!query.data) continue;
190
+ const { collectionId, items, totalItems } = query.data as {
191
+ collectionId: string;
192
+ items: Collection[];
193
+ totalItems: number;
194
+ };
195
+ if (accumulatedChildren[collectionId]) {
196
+ childUpdates[collectionId] = {
197
+ items: [...accumulatedChildren[collectionId].items, ...items],
198
+ totalItems,
199
+ };
200
+ fetchedPages.push(collectionId);
201
+ hasUpdates = true;
202
+ }
203
+ }
204
+ if (hasUpdates) {
205
+ setAccumulatedChildren(prev => ({ ...prev, ...childUpdates }));
206
+ setNextPageToFetch(prev => {
207
+ const next = { ...prev };
208
+ for (const id of fetchedPages) {
209
+ delete next[id];
210
+ }
211
+ return next;
212
+ });
213
+ }
214
+ }, [pagedChildQueries]);
215
+
139
216
  const addSubCollections = (data: Collection[]): CollectionOrLoadMore[] => {
140
217
  const allRows: CollectionOrLoadMore[] = [];
141
218
  const addSubRows = (row: Collection) => {
@@ -226,6 +303,13 @@ function CollectionListPage() {
226
303
  },
227
304
  });
228
305
 
306
+ // Remove query cache entries BEFORE clearing accumulated children
307
+ // to prevent stale cached data from being synced back by the useEffect.
308
+ queryClient.removeQueries({ queryKey: ['childCollections', sourceParentId] });
309
+ if (targetParentId !== sourceParentId) {
310
+ queryClient.removeQueries({ queryKey: ['childCollections', targetParentId] });
311
+ }
312
+
229
313
  setAccumulatedChildren(prev => {
230
314
  const newState = { ...prev };
231
315
  delete newState[sourceParentId];
@@ -235,19 +319,11 @@ function CollectionListPage() {
235
319
  return newState;
236
320
  });
237
321
 
238
- const queriesToInvalidate = [
239
- queryClient.invalidateQueries({ queryKey: ['childCollections', sourceParentId] }),
240
- queryClient.invalidateQueries({ queryKey: ['PaginatedListDataTable'] }),
241
- ];
322
+ await queryClient.invalidateQueries({ queryKey: ['PaginatedListDataTable'] });
242
323
 
243
324
  if (targetParentId === sourceParentId) {
244
- await Promise.all(queriesToInvalidate);
245
325
  toast.success(t`Collection position updated`);
246
326
  } else {
247
- queriesToInvalidate.push(
248
- queryClient.invalidateQueries({ queryKey: ['childCollections', targetParentId] })
249
- );
250
- await Promise.all(queriesToInvalidate);
251
327
  toast.success(t`Collection moved to new parent`);
252
328
  }
253
329
  } catch (error) {
@@ -378,6 +454,11 @@ function CollectionListPage() {
378
454
  options.meta = {
379
455
  ...options.meta,
380
456
  resetExpanded: () => setExpanded({}),
457
+ refreshChildCaches: () => {
458
+ queryClient.removeQueries({ queryKey: ['childCollections'] });
459
+ queryClient.removeQueries({ queryKey: ['PaginatedListDataTable'] });
460
+ setAccumulatedChildren({});
461
+ },
381
462
  isUtilityRow: (row: { original: CollectionOrLoadMore }) => isLoadMoreRow(row.original),
382
463
  renderUtilityRow: (row: { original: CollectionOrLoadMore }) => {
383
464
  const original = row.original as LoadMoreRow;
@@ -94,19 +94,17 @@ export const DeleteCollectionsBulkAction: BulkActionComponent<any> = ({ selectio
94
94
 
95
95
  export const MoveCollectionsBulkAction: BulkActionComponent<any> = ({ selection, table }) => {
96
96
  const [dialogOpen, setDialogOpen] = useState(false);
97
- const queryClient = useQueryClient();
98
97
  const { refetchPaginatedList } = usePaginatedList();
99
98
 
100
99
  const handleSuccess = () => {
101
- queryClient.invalidateQueries({ queryKey: ['childCollections'] });
102
100
  refetchPaginatedList();
103
101
  table.resetRowSelection();
104
102
  };
105
103
 
106
104
  const handleResetExpanded = () => {
107
- const resetExpanded = (table.options.meta as { resetExpanded: () => void })?.resetExpanded;
108
- if (resetExpanded) {
109
- resetExpanded();
105
+ const refreshChildCaches = (table.options.meta as { refreshChildCaches: () => void })?.refreshChildCaches;
106
+ if (refreshChildCaches) {
107
+ refreshChildCaches();
110
108
  }
111
109
  };
112
110
 
@@ -284,7 +284,8 @@ export function MoveCollectionsDialog({
284
284
  toast.success(t`Collections moved successfully`);
285
285
  queryClient.invalidateQueries({ queryKey: collectionForMoveKey });
286
286
  queryClient.invalidateQueries({ queryKey: childCollectionsForMoveKey() });
287
- queryClient.invalidateQueries({ queryKey: ['PaginatedListDataTable'] });
287
+ // Remove child caches BEFORE invalidating the main list to prevent
288
+ // stale cached children from being synced back (same race as drag-reorder).
288
289
  onResetExpanded?.();
289
290
  onSuccess?.();
290
291
  onOpenChange(false);
@@ -812,7 +812,7 @@ msgid "{0} selected"
812
812
  msgstr "{0} محدد"
813
813
 
814
814
  #. placeholder {0}: row.original.productVariantCount
815
- #: src/app/routes/_authenticated/_collections/collections.tsx:332
815
+ #: src/app/routes/_authenticated/_collections/collections.tsx:408
816
816
  msgid "{0} variants"
817
817
  msgstr "{0} متغير"
818
818
 
@@ -853,7 +853,7 @@ msgstr "تم استرداد {totalQuantity} عنصر(عناصر)"
853
853
  msgid "+ {0} more"
854
854
  msgstr "+ {0} المزيد"
855
855
 
856
- #: src/app/routes/_authenticated/_collections/collections.tsx:350
856
+ #: src/app/routes/_authenticated/_collections/collections.tsx:426
857
857
  msgid "+ {leftOver} more"
858
858
  msgstr "+ {leftOver} المزيد"
859
859
 
@@ -1346,7 +1346,7 @@ msgstr "الحاسبة"
1346
1346
 
1347
1347
  #: src/app/common/duplicate-entity-dialog.tsx:108
1348
1348
  #: src/app/routes/_authenticated/_assets/components/manage-tags-dialog.tsx:203
1349
- #: src/app/routes/_authenticated/_collections/components/move-collections-dialog.tsx:417
1349
+ #: src/app/routes/_authenticated/_collections/components/move-collections-dialog.tsx:418
1350
1350
  #: src/app/routes/_authenticated/_customers/components/customer-address-form.tsx:337
1351
1351
  #: src/app/routes/_authenticated/_orders/components/add-manual-payment-dialog.tsx:168
1352
1352
  #: src/app/routes/_authenticated/_orders/components/fulfill-order-dialog.tsx:307
@@ -1383,7 +1383,7 @@ msgstr "إلغاء التعديل"
1383
1383
  msgid "Cancel payment"
1384
1384
  msgstr "إلغاء الدفع"
1385
1385
 
1386
- #: src/app/routes/_authenticated/_collections/collections.tsx:213
1386
+ #: src/app/routes/_authenticated/_collections/collections.tsx:290
1387
1387
  msgid "Cannot move a collection into its own descendant"
1388
1388
  msgstr "لا يمكن نقل مجموعة إلى فرع تابع لها"
1389
1389
 
@@ -1462,17 +1462,17 @@ msgstr "الرمز"
1462
1462
  msgid "Collection contents for {collectionName}"
1463
1463
  msgstr "محتويات المجموعة {collectionName}"
1464
1464
 
1465
- #: src/app/routes/_authenticated/_collections/collections.tsx:251
1465
+ #: src/app/routes/_authenticated/_collections/collections.tsx:327
1466
1466
  msgid "Collection moved to new parent"
1467
1467
  msgstr "تم نقل المجموعة إلى مجموعة أصل جديدة"
1468
1468
 
1469
- #: src/app/routes/_authenticated/_collections/collections.tsx:245
1469
+ #: src/app/routes/_authenticated/_collections/collections.tsx:325
1470
1470
  msgid "Collection position updated"
1471
1471
  msgstr "تم تحديث موضع المجموعة"
1472
1472
 
1473
1473
  #: src/app/routes/_authenticated/_collections/collections_.$id.tsx:48
1474
- #: src/app/routes/_authenticated/_collections/collections.tsx:38
1475
- #: src/app/routes/_authenticated/_collections/collections.tsx:265
1474
+ #: src/app/routes/_authenticated/_collections/collections.tsx:52
1475
+ #: src/app/routes/_authenticated/_collections/collections.tsx:341
1476
1476
  msgid "Collections"
1477
1477
  msgstr "المجموعات"
1478
1478
 
@@ -1529,7 +1529,7 @@ msgid "Content:"
1529
1529
  msgstr "المحتوى:"
1530
1530
 
1531
1531
  #: src/app/routes/_authenticated/_collections/collections_.$id.tsx:253
1532
- #: src/app/routes/_authenticated/_collections/collections.tsx:325
1532
+ #: src/app/routes/_authenticated/_collections/collections.tsx:401
1533
1533
  msgid "Contents"
1534
1534
  msgstr "المحتويات"
1535
1535
 
@@ -2317,7 +2317,7 @@ msgstr "فشل تحميل الإعدادات العامة"
2317
2317
  msgid "Failed to modify order"
2318
2318
  msgstr "فشل تعديل الطلب"
2319
2319
 
2320
- #: src/app/routes/_authenticated/_collections/components/move-collections-dialog.tsx:293
2320
+ #: src/app/routes/_authenticated/_collections/components/move-collections-dialog.tsx:294
2321
2321
  msgid "Failed to move collections"
2322
2322
  msgstr "فشل نقل المجموعات"
2323
2323
 
@@ -2389,7 +2389,7 @@ msgstr "فشل تحديث القناة"
2389
2389
  msgid "Failed to update collection"
2390
2390
  msgstr "فشل تحديث المجموعة"
2391
2391
 
2392
- #: src/app/routes/_authenticated/_collections/collections.tsx:256
2392
+ #: src/app/routes/_authenticated/_collections/collections.tsx:332
2393
2393
  msgid "Failed to update collection position"
2394
2394
  msgstr "فشل في تحديث موضع المجموعة"
2395
2395
 
@@ -2499,7 +2499,7 @@ msgstr "خطأ"
2499
2499
  msgid "Filter by {columnId}"
2500
2500
  msgstr "تصفية حسب {columnId}"
2501
2501
 
2502
- #: src/app/routes/_authenticated/_collections/components/move-collections-dialog.tsx:369
2502
+ #: src/app/routes/_authenticated/_collections/components/move-collections-dialog.tsx:370
2503
2503
  msgid "Filter by collection name"
2504
2504
  msgstr "تصفية حسب اسم المجموعة"
2505
2505
 
@@ -2896,7 +2896,7 @@ msgid "Link title"
2896
2896
  msgstr "عنوان الرابط"
2897
2897
 
2898
2898
  #. placeholder {0}: Math.min(remaining, CHILDREN_PAGE_SIZE)
2899
- #: src/app/routes/_authenticated/_collections/collections.tsx:395
2899
+ #: src/app/routes/_authenticated/_collections/collections.tsx:476
2900
2900
  msgid "Load {0} more ({remaining} remaining)"
2901
2901
  msgstr "تحميل {0} إضافية ({remaining} متبقية)"
2902
2902
 
@@ -2909,7 +2909,7 @@ msgstr "تحميل المزيد"
2909
2909
  msgid "Loading addresses..."
2910
2910
  msgstr "جارٍ تحميل العناوين..."
2911
2911
 
2912
- #: src/app/routes/_authenticated/_collections/components/move-collections-dialog.tsx:378
2912
+ #: src/app/routes/_authenticated/_collections/components/move-collections-dialog.tsx:379
2913
2913
  msgid "Loading collections..."
2914
2914
  msgstr "جارٍ تحميل المجموعات..."
2915
2915
 
@@ -3028,12 +3028,12 @@ msgstr "من بداية الشهر حتى اليوم"
3028
3028
  msgid "More views"
3029
3029
  msgstr "المزيد من العروض"
3030
3030
 
3031
- #: src/app/routes/_authenticated/_collections/components/collection-bulk-actions.tsx:118
3031
+ #: src/app/routes/_authenticated/_collections/components/collection-bulk-actions.tsx:116
3032
3032
  msgid "Move"
3033
3033
  msgstr "نقل"
3034
3034
 
3035
- #: src/app/routes/_authenticated/_collections/components/move-collections-dialog.tsx:339
3036
- #: src/app/routes/_authenticated/_collections/components/move-collections-dialog.tsx:426
3035
+ #: src/app/routes/_authenticated/_collections/components/move-collections-dialog.tsx:340
3036
+ #: src/app/routes/_authenticated/_collections/components/move-collections-dialog.tsx:427
3037
3037
  msgid "Move Collections"
3038
3038
  msgstr "نقل المجموعات"
3039
3039
 
@@ -3048,7 +3048,7 @@ msgstr "النقل إلى المستوى الأعلى"
3048
3048
  msgid "Moving {0} collection{1} into {2}"
3049
3049
  msgstr "نقل {0} مجموعة إلى {2}"
3050
3050
 
3051
- #: src/app/routes/_authenticated/_collections/components/move-collections-dialog.tsx:424
3051
+ #: src/app/routes/_authenticated/_collections/components/move-collections-dialog.tsx:425
3052
3052
  msgid "Moving..."
3053
3053
  msgstr "جارٍ النقل..."
3054
3054
 
@@ -3110,7 +3110,7 @@ msgstr "قناة جديدة"
3110
3110
  msgid "New collection"
3111
3111
  msgstr "مجموعة جديدة"
3112
3112
 
3113
- #: src/app/routes/_authenticated/_collections/collections.tsx:450
3113
+ #: src/app/routes/_authenticated/_collections/collections.tsx:531
3114
3114
  msgid "New Collection"
3115
3115
  msgstr "مجموعة جديدة"
3116
3116
 
@@ -3742,7 +3742,7 @@ msgstr "تاريخ الطلب"
3742
3742
  msgid "Please add products and complete the shipping address to run the test."
3743
3743
  msgstr "يرجى إضافة منتجات وإكمال عنوان الشحن لتشغيل الاختبار."
3744
3744
 
3745
- #: src/app/routes/_authenticated/_collections/components/move-collections-dialog.tsx:311
3745
+ #: src/app/routes/_authenticated/_collections/components/move-collections-dialog.tsx:312
3746
3746
  msgid "Please select a target collection"
3747
3747
  msgstr "يرجى تحديد مجموعة مستهدفة"
3748
3748
 
@@ -4247,7 +4247,7 @@ msgid "Select a role"
4247
4247
  msgstr "حدد دورًا"
4248
4248
 
4249
4249
  #. placeholder {0}: collectionsToMove.length === 1 ? 'this collection' : `${collectionsToMove.length} collections`
4250
- #: src/app/routes/_authenticated/_collections/components/move-collections-dialog.tsx:342
4250
+ #: src/app/routes/_authenticated/_collections/components/move-collections-dialog.tsx:343
4251
4251
  msgid "Select a target collection to move {0} to."
4252
4252
  msgstr "حدد مجموعة مستهدفة لنقل {0} إليها."
4253
4253
 
@@ -812,7 +812,7 @@ msgid "{0} selected"
812
812
  msgstr "{0} избрани"
813
813
 
814
814
  #. placeholder {0}: row.original.productVariantCount
815
- #: src/app/routes/_authenticated/_collections/collections.tsx:332
815
+ #: src/app/routes/_authenticated/_collections/collections.tsx:408
816
816
  msgid "{0} variants"
817
817
  msgstr "{0} варианта"
818
818
 
@@ -853,7 +853,7 @@ msgstr "{totalQuantity} артикул(и) възстановен(и)"
853
853
  msgid "+ {0} more"
854
854
  msgstr "+ още {0}"
855
855
 
856
- #: src/app/routes/_authenticated/_collections/collections.tsx:350
856
+ #: src/app/routes/_authenticated/_collections/collections.tsx:426
857
857
  msgid "+ {leftOver} more"
858
858
  msgstr "+ още {leftOver}"
859
859
 
@@ -1348,7 +1348,7 @@ msgstr "Калкулатор"
1348
1348
 
1349
1349
  #: src/app/common/duplicate-entity-dialog.tsx:108
1350
1350
  #: src/app/routes/_authenticated/_assets/components/manage-tags-dialog.tsx:203
1351
- #: src/app/routes/_authenticated/_collections/components/move-collections-dialog.tsx:417
1351
+ #: src/app/routes/_authenticated/_collections/components/move-collections-dialog.tsx:418
1352
1352
  #: src/app/routes/_authenticated/_customers/components/customer-address-form.tsx:337
1353
1353
  #: src/app/routes/_authenticated/_orders/components/add-manual-payment-dialog.tsx:168
1354
1354
  #: src/app/routes/_authenticated/_orders/components/fulfill-order-dialog.tsx:307
@@ -1385,7 +1385,7 @@ msgstr "Отмяна на модификацията"
1385
1385
  msgid "Cancel payment"
1386
1386
  msgstr "Отказ от плащането"
1387
1387
 
1388
- #: src/app/routes/_authenticated/_collections/collections.tsx:213
1388
+ #: src/app/routes/_authenticated/_collections/collections.tsx:290
1389
1389
  msgid "Cannot move a collection into its own descendant"
1390
1390
  msgstr "Не може да се премести колекция в собствен наследник"
1391
1391
 
@@ -1464,17 +1464,17 @@ msgstr "Код"
1464
1464
  msgid "Collection contents for {collectionName}"
1465
1465
  msgstr "Съдържание на колекция за {collectionName}"
1466
1466
 
1467
- #: src/app/routes/_authenticated/_collections/collections.tsx:251
1467
+ #: src/app/routes/_authenticated/_collections/collections.tsx:327
1468
1468
  msgid "Collection moved to new parent"
1469
1469
  msgstr "Колекцията е преместена в нов родител"
1470
1470
 
1471
- #: src/app/routes/_authenticated/_collections/collections.tsx:245
1471
+ #: src/app/routes/_authenticated/_collections/collections.tsx:325
1472
1472
  msgid "Collection position updated"
1473
1473
  msgstr "Позицията на колекцията е актуализирана"
1474
1474
 
1475
1475
  #: src/app/routes/_authenticated/_collections/collections_.$id.tsx:48
1476
- #: src/app/routes/_authenticated/_collections/collections.tsx:38
1477
- #: src/app/routes/_authenticated/_collections/collections.tsx:265
1476
+ #: src/app/routes/_authenticated/_collections/collections.tsx:52
1477
+ #: src/app/routes/_authenticated/_collections/collections.tsx:341
1478
1478
  msgid "Collections"
1479
1479
  msgstr "Колекции"
1480
1480
 
@@ -1531,7 +1531,7 @@ msgid "Content:"
1531
1531
  msgstr "Съдържание:"
1532
1532
 
1533
1533
  #: src/app/routes/_authenticated/_collections/collections_.$id.tsx:253
1534
- #: src/app/routes/_authenticated/_collections/collections.tsx:325
1534
+ #: src/app/routes/_authenticated/_collections/collections.tsx:401
1535
1535
  msgid "Contents"
1536
1536
  msgstr "Съдържание"
1537
1537
 
@@ -2325,7 +2325,7 @@ msgstr "Неуспешно зареждане на глобалните наст
2325
2325
  msgid "Failed to modify order"
2326
2326
  msgstr "Неуспешна промяна на поръчката"
2327
2327
 
2328
- #: src/app/routes/_authenticated/_collections/components/move-collections-dialog.tsx:293
2328
+ #: src/app/routes/_authenticated/_collections/components/move-collections-dialog.tsx:294
2329
2329
  msgid "Failed to move collections"
2330
2330
  msgstr "Неуспешно преместване на колекции"
2331
2331
 
@@ -2397,7 +2397,7 @@ msgstr "Неуспешно актуализиране на канала"
2397
2397
  msgid "Failed to update collection"
2398
2398
  msgstr "Неуспешно актуализиране на колекцията"
2399
2399
 
2400
- #: src/app/routes/_authenticated/_collections/collections.tsx:256
2400
+ #: src/app/routes/_authenticated/_collections/collections.tsx:332
2401
2401
  msgid "Failed to update collection position"
2402
2402
  msgstr "Неуспешно актуализиране на позицията на колекцията"
2403
2403
 
@@ -2507,7 +2507,7 @@ msgstr "Грешно"
2507
2507
  msgid "Filter by {columnId}"
2508
2508
  msgstr "Филтриране по {columnId}"
2509
2509
 
2510
- #: src/app/routes/_authenticated/_collections/components/move-collections-dialog.tsx:369
2510
+ #: src/app/routes/_authenticated/_collections/components/move-collections-dialog.tsx:370
2511
2511
  msgid "Filter by collection name"
2512
2512
  msgstr "Филтриране по име на колекция"
2513
2513
 
@@ -2916,7 +2916,7 @@ msgid "Link title"
2916
2916
  msgstr "Заглавие на връзката"
2917
2917
 
2918
2918
  #. placeholder {0}: Math.min(remaining, CHILDREN_PAGE_SIZE)
2919
- #: src/app/routes/_authenticated/_collections/collections.tsx:395
2919
+ #: src/app/routes/_authenticated/_collections/collections.tsx:476
2920
2920
  msgid "Load {0} more ({remaining} remaining)"
2921
2921
  msgstr "Зареди още {0} ({remaining} оставащи)"
2922
2922
 
@@ -2929,7 +2929,7 @@ msgstr "Зареди още"
2929
2929
  msgid "Loading addresses..."
2930
2930
  msgstr "Адресите се зареждат..."
2931
2931
 
2932
- #: src/app/routes/_authenticated/_collections/components/move-collections-dialog.tsx:378
2932
+ #: src/app/routes/_authenticated/_collections/components/move-collections-dialog.tsx:379
2933
2933
  msgid "Loading collections..."
2934
2934
  msgstr "Колекциите се зареждат..."
2935
2935
 
@@ -3051,12 +3051,12 @@ msgstr "От началото на месеца"
3051
3051
  msgid "More views"
3052
3052
  msgstr "Още гледания"
3053
3053
 
3054
- #: src/app/routes/_authenticated/_collections/components/collection-bulk-actions.tsx:118
3054
+ #: src/app/routes/_authenticated/_collections/components/collection-bulk-actions.tsx:116
3055
3055
  msgid "Move"
3056
3056
  msgstr "Премести"
3057
3057
 
3058
- #: src/app/routes/_authenticated/_collections/components/move-collections-dialog.tsx:339
3059
- #: src/app/routes/_authenticated/_collections/components/move-collections-dialog.tsx:426
3058
+ #: src/app/routes/_authenticated/_collections/components/move-collections-dialog.tsx:340
3059
+ #: src/app/routes/_authenticated/_collections/components/move-collections-dialog.tsx:427
3060
3060
  msgid "Move Collections"
3061
3061
  msgstr "Преместване на колекции"
3062
3062
 
@@ -3071,7 +3071,7 @@ msgstr "Преминете към най-горното ниво"
3071
3071
  msgid "Moving {0} collection{1} into {2}"
3072
3072
  msgstr "Преместване на {0} колекция{1} в {2}"
3073
3073
 
3074
- #: src/app/routes/_authenticated/_collections/components/move-collections-dialog.tsx:424
3074
+ #: src/app/routes/_authenticated/_collections/components/move-collections-dialog.tsx:425
3075
3075
  msgid "Moving..."
3076
3076
  msgstr "Преместване..."
3077
3077
 
@@ -3133,7 +3133,7 @@ msgstr "Нов канал"
3133
3133
  msgid "New collection"
3134
3134
  msgstr "Нова колекция"
3135
3135
 
3136
- #: src/app/routes/_authenticated/_collections/collections.tsx:450
3136
+ #: src/app/routes/_authenticated/_collections/collections.tsx:531
3137
3137
  msgid "New Collection"
3138
3138
  msgstr "Нова колекция"
3139
3139
 
@@ -3765,7 +3765,7 @@ msgstr "Поставен при"
3765
3765
  msgid "Please add products and complete the shipping address to run the test."
3766
3766
  msgstr "Моля, добавете продукти и попълнете адреса за доставка, за да стартирате теста."
3767
3767
 
3768
- #: src/app/routes/_authenticated/_collections/components/move-collections-dialog.tsx:311
3768
+ #: src/app/routes/_authenticated/_collections/components/move-collections-dialog.tsx:312
3769
3769
  msgid "Please select a target collection"
3770
3770
  msgstr "Моля, изберете целева колекция"
3771
3771
 
@@ -4269,7 +4269,7 @@ msgid "Select a role"
4269
4269
  msgstr "Изберете роля"
4270
4270
 
4271
4271
  #. placeholder {0}: collectionsToMove.length === 1 ? 'this collection' : `${collectionsToMove.length} collections`
4272
- #: src/app/routes/_authenticated/_collections/components/move-collections-dialog.tsx:342
4272
+ #: src/app/routes/_authenticated/_collections/components/move-collections-dialog.tsx:343
4273
4273
  msgid "Select a target collection to move {0} to."
4274
4274
  msgstr "Изберете целева колекция, към която да преместите {0}."
4275
4275