@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 +3 -3
- package/src/app/routes/_authenticated/_collections/collections.tsx +119 -38
- package/src/app/routes/_authenticated/_collections/components/collection-bulk-actions.tsx +3 -5
- package/src/app/routes/_authenticated/_collections/components/move-collections-dialog.tsx +2 -1
- package/src/i18n/locales/ar.po +21 -21
- package/src/i18n/locales/bg.po +21 -21
- package/src/i18n/locales/cs.po +21 -21
- package/src/i18n/locales/de.po +21 -21
- package/src/i18n/locales/en.po +21 -21
- package/src/i18n/locales/es.po +21 -21
- package/src/i18n/locales/fa.po +21 -21
- package/src/i18n/locales/fr.po +21 -21
- package/src/i18n/locales/he.po +21 -21
- package/src/i18n/locales/hr.po +21 -21
- package/src/i18n/locales/hu.po +21 -21
- package/src/i18n/locales/it.po +21 -21
- package/src/i18n/locales/ja.po +21 -21
- package/src/i18n/locales/nb.po +21 -21
- package/src/i18n/locales/ne.po +21 -21
- package/src/i18n/locales/nl.po +21 -21
- package/src/i18n/locales/pl.po +21 -21
- package/src/i18n/locales/pt_BR.po +21 -21
- package/src/i18n/locales/pt_PT.po +21 -21
- package/src/i18n/locales/ru.po +21 -21
- package/src/i18n/locales/sv.po +21 -21
- package/src/i18n/locales/tr.po +21 -21
- package/src/i18n/locales/uk.po +21 -21
- package/src/i18n/locales/zh_Hans.po +21 -21
- package/src/i18n/locales/zh_Hant.po +21 -21
- package/src/lib/components/data-input/money-input.tsx +16 -4
- package/src/lib/components/data-table/data-table-utils.ts +23 -25
- package/src/lib/framework/page/list-page.tsx +2 -1
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vendure/dashboard",
|
|
3
3
|
"private": false,
|
|
4
|
-
"version": "3.5.6
|
|
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": "
|
|
166
|
-
"@vendure/core": "
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
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
|
-
|
|
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
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
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
|
-
|
|
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
|
|
108
|
-
if (
|
|
109
|
-
|
|
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
|
-
|
|
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);
|
package/src/i18n/locales/ar.po
CHANGED
|
@@ -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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
1475
|
-
#: src/app/routes/_authenticated/_collections/collections.tsx:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
3036
|
-
#: src/app/routes/_authenticated/_collections/components/move-collections-dialog.tsx:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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
|
|
package/src/i18n/locales/bg.po
CHANGED
|
@@ -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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
1477
|
-
#: src/app/routes/_authenticated/_collections/collections.tsx:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
3059
|
-
#: src/app/routes/_authenticated/_collections/components/move-collections-dialog.tsx:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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
|
|