@vendure/dashboard 3.7.2 → 3.7.3-master-202608040306
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bundle/chunks/{2SSKDMRQ-CMBxVbIh.js → 2SSKDMRQ-B4u6jNxM.js} +2 -2
- package/dist/bundle/chunks/{AP7HFJJL-PAkY4fBC.js → AP7HFJJL-DjAB5so4.js} +1 -1
- package/dist/bundle/chunks/{WDYDFRGG-xJgIWAuv.js → WDYDFRGG-BDxsfu0L.js} +2 -2
- package/dist/bundle/chunks/ar-Dw37OWAC.js +4 -0
- package/dist/bundle/chunks/bg-WWILwg5a.js +4 -0
- package/dist/bundle/chunks/cs-Boj56h8-.js +4 -0
- package/dist/bundle/chunks/de-B3cVWr99.js +4 -0
- package/dist/bundle/chunks/en-XH2YNaUJ.js +4 -0
- package/dist/bundle/chunks/es-DsLfSYXz.js +4 -0
- package/dist/bundle/chunks/fa-BGD8jY53.js +4 -0
- package/dist/bundle/chunks/fr-DBqCdnUr.js +4 -0
- package/dist/bundle/chunks/he-DQQEZP0n.js +4 -0
- package/dist/bundle/chunks/hr-STFHgcsd.js +4 -0
- package/dist/bundle/chunks/hu-BExyeFOp.js +4 -0
- package/dist/bundle/chunks/it-DUpm-Qux.js +4 -0
- package/dist/bundle/chunks/ja-BGNeg6jp.js +4 -0
- package/dist/bundle/chunks/ko-z-VdWVYg.js +4 -0
- package/dist/bundle/chunks/{locale-BSCAi77j.js → locale-C2tFsz32.js} +1 -1
- package/dist/bundle/chunks/{main-D8aGWlid.js → main-CYlJtY7f.js} +3 -3
- package/dist/bundle/chunks/nb-BlQEQZ3Y.js +4 -0
- package/dist/bundle/chunks/ne-BdVp1TVY.js +4 -0
- package/dist/bundle/chunks/nl-DCunYzVO.js +4 -0
- package/dist/bundle/chunks/pl-DKq5n67K.js +4 -0
- package/dist/bundle/chunks/pt_BR-Ciui3dTE.js +4 -0
- package/dist/bundle/chunks/pt_PT-OWgPo2LR.js +4 -0
- package/dist/bundle/chunks/ro-HZ7RB1yo.js +4 -0
- package/dist/bundle/chunks/ru-KzFvjVea.js +4 -0
- package/dist/bundle/chunks/sv-rrqFVsRd.js +4 -0
- package/dist/bundle/chunks/tr-BDTaDRoI.js +4 -0
- package/dist/bundle/chunks/uk-ug3_1nGA.js +4 -0
- package/dist/bundle/chunks/{use-job-queue-polling-D8i6-8rR.js → use-job-queue-polling-LumEexzR.js} +95 -31
- package/dist/bundle/chunks/uz-vOctUQ-c.js +4 -0
- package/dist/bundle/chunks/zh_Hans-4iLG9Dlx.js +4 -0
- package/dist/bundle/chunks/zh_Hant-CKXgDt95.js +4 -0
- package/dist/bundle/lib.js +2 -2
- package/dist/bundle/main.js +2 -2
- package/package.json +3 -3
- package/src/i18n/locales/ar.po +27 -7
- package/src/i18n/locales/bg.po +27 -7
- package/src/i18n/locales/cs.po +27 -7
- package/src/i18n/locales/de.po +27 -7
- package/src/i18n/locales/en.po +27 -7
- package/src/i18n/locales/es.po +27 -7
- package/src/i18n/locales/fa.po +27 -7
- package/src/i18n/locales/fr.po +27 -7
- package/src/i18n/locales/he.po +27 -7
- package/src/i18n/locales/hr.po +27 -7
- package/src/i18n/locales/hu.po +27 -7
- package/src/i18n/locales/it.po +27 -7
- package/src/i18n/locales/ja.po +27 -7
- package/src/i18n/locales/ko.po +27 -7
- package/src/i18n/locales/nb.po +27 -7
- package/src/i18n/locales/ne.po +27 -7
- package/src/i18n/locales/nl.po +27 -7
- package/src/i18n/locales/pl.po +27 -7
- package/src/i18n/locales/pt_BR.po +27 -7
- package/src/i18n/locales/pt_PT.po +27 -7
- package/src/i18n/locales/ro.po +27 -7
- package/src/i18n/locales/ru.po +27 -7
- package/src/i18n/locales/sv.po +27 -7
- package/src/i18n/locales/tr.po +27 -7
- package/src/i18n/locales/uk.po +27 -7
- package/src/i18n/locales/uz.po +27 -7
- package/src/i18n/locales/zh_Hans.po +27 -7
- package/src/i18n/locales/zh_Hant.po +27 -7
- package/src/lib/components/shared/assign-to-channel-dialog.tsx +56 -31
- package/src/lib/components/shared/assign-to-channels.spec.ts +45 -0
- package/src/lib/components/shared/assign-to-channels.ts +31 -0
- package/dist/bundle/chunks/ar-DATX7H2x.js +0 -4
- package/dist/bundle/chunks/bg-DHS8PDKd.js +0 -4
- package/dist/bundle/chunks/cs-CGhaHD2Z.js +0 -4
- package/dist/bundle/chunks/de-BMtF5EY3.js +0 -4
- package/dist/bundle/chunks/en-DucAVNrv.js +0 -4
- package/dist/bundle/chunks/es-FBktM7AP.js +0 -4
- package/dist/bundle/chunks/fa-Dl5QN-Zp.js +0 -4
- package/dist/bundle/chunks/fr-TPBsPGD2.js +0 -4
- package/dist/bundle/chunks/he-CvNLNPHS.js +0 -4
- package/dist/bundle/chunks/hr-7QRa6pq0.js +0 -4
- package/dist/bundle/chunks/hu-BUCwangz.js +0 -4
- package/dist/bundle/chunks/it-DcVNes47.js +0 -4
- package/dist/bundle/chunks/ja-C-C3Z-2D.js +0 -4
- package/dist/bundle/chunks/ko-B41VP-2G.js +0 -4
- package/dist/bundle/chunks/nb-q5my_SIJ.js +0 -4
- package/dist/bundle/chunks/ne-DksEv0gd.js +0 -4
- package/dist/bundle/chunks/nl-BEWvhJPb.js +0 -4
- package/dist/bundle/chunks/pl-DRf5xQAy.js +0 -4
- package/dist/bundle/chunks/pt_BR-DEOQ9Vgg.js +0 -4
- package/dist/bundle/chunks/pt_PT-DvDBycjC.js +0 -4
- package/dist/bundle/chunks/ro-CNbK5V7l.js +0 -4
- package/dist/bundle/chunks/ru-BJ395nXO.js +0 -4
- package/dist/bundle/chunks/sv-Bxi6B55d.js +0 -4
- package/dist/bundle/chunks/tr-D2FNyrS9.js +0 -4
- package/dist/bundle/chunks/uk-C3iewRAE.js +0 -4
- package/dist/bundle/chunks/uz-DDVd9bpR.js +0 -4
- package/dist/bundle/chunks/zh_Hans-DFK1UiKv.js +0 -4
- package/dist/bundle/chunks/zh_Hant-BWs2-32i.js +0 -4
package/src/i18n/locales/tr.po
CHANGED
|
@@ -541,6 +541,14 @@ msgstr "Bağlantıyı kaldır"
|
|
|
541
541
|
msgid "This field is readonly"
|
|
542
542
|
msgstr "Bu alan salt okunurdur"
|
|
543
543
|
|
|
544
|
+
#. placeholder {0}: succeeded.length
|
|
545
|
+
#. placeholder {1}: succeeded.length
|
|
546
|
+
#. placeholder {2}: succeeded.length
|
|
547
|
+
#: src/lib/components/shared/assign-to-channel-dialog.tsx
|
|
548
|
+
#: src/lib/components/shared/assign-to-channel-dialog.tsx
|
|
549
|
+
msgid "{0, plural, one {Assigned {entityIdsLength} {entityType} to {1} channel} other {Assigned {entityIdsLength} {entityType} to {2} channels}}"
|
|
550
|
+
msgstr ""
|
|
551
|
+
|
|
544
552
|
#: src/lib/framework/dashboard-widget/metrics-widget/index.tsx
|
|
545
553
|
#: src/lib/framework/dashboard-widget/metrics-widget/index.tsx
|
|
546
554
|
msgid "Order Count"
|
|
@@ -2658,6 +2666,10 @@ msgstr "Verileri görüntüle"
|
|
|
2658
2666
|
msgid "Delete View"
|
|
2659
2667
|
msgstr "Görünümü Sil"
|
|
2660
2668
|
|
|
2669
|
+
#: src/lib/components/shared/assign-to-channel-dialog.tsx
|
|
2670
|
+
msgid "Failed to assign {entityIdsLength} {entityType} to the selected channels"
|
|
2671
|
+
msgstr ""
|
|
2672
|
+
|
|
2661
2673
|
#: src/app/routes/_authenticated/_customers/customers_.$id.tsx
|
|
2662
2674
|
msgid "Add a new address to the customer."
|
|
2663
2675
|
msgstr "Müşteriye yeni bir adres ekleyin."
|
|
@@ -3068,10 +3080,9 @@ msgstr "Değişiklikleri Kaydet"
|
|
|
3068
3080
|
msgid "Address updated"
|
|
3069
3081
|
msgstr "Adres güncellendi"
|
|
3070
3082
|
|
|
3071
|
-
#. placeholder {0}: selectedChannelIds.length
|
|
3072
3083
|
#: src/lib/components/shared/assign-to-channel-dialog.tsx
|
|
3073
|
-
msgid "Successfully assigned {entityIdsLength} {entityType} to {0} channels"
|
|
3074
|
-
msgstr ""
|
|
3084
|
+
#~ msgid "Successfully assigned {entityIdsLength} {entityType} to {0} channels"
|
|
3085
|
+
#~ msgstr ""
|
|
3075
3086
|
|
|
3076
3087
|
#: src/app/routes/_authenticated/_orders/hooks/use-refund-order.ts
|
|
3077
3088
|
msgid "Refund processed successfully"
|
|
@@ -3324,11 +3335,9 @@ msgstr "Ata"
|
|
|
3324
3335
|
msgid "Successfully created seller"
|
|
3325
3336
|
msgstr "Satıcı başarıyla oluşturuldu"
|
|
3326
3337
|
|
|
3327
|
-
#. placeholder {0}: failedChannelIds.length
|
|
3328
|
-
#. placeholder {1}: selectedChannelIds.length
|
|
3329
3338
|
#: src/lib/components/shared/assign-to-channel-dialog.tsx
|
|
3330
|
-
msgid "Failed to assign {entityIdsLength} {entityType} to {0} of {1} channels"
|
|
3331
|
-
msgstr ""
|
|
3339
|
+
#~ msgid "Failed to assign {entityIdsLength} {entityType} to {0} of {1} channels"
|
|
3340
|
+
#~ msgstr ""
|
|
3332
3341
|
|
|
3333
3342
|
#: src/app/routes/_authenticated/_shipping-methods/shipping-methods_.$id.tsx
|
|
3334
3343
|
msgid "Successfully updated shipping method"
|
|
@@ -3555,6 +3564,10 @@ msgstr "Öğe seç"
|
|
|
3555
3564
|
msgid "New product"
|
|
3556
3565
|
msgstr "Yeni ürün"
|
|
3557
3566
|
|
|
3567
|
+
#: src/lib/components/shared/assign-to-channel-dialog.tsx
|
|
3568
|
+
msgid "Failed for: {failedCodes}"
|
|
3569
|
+
msgstr ""
|
|
3570
|
+
|
|
3558
3571
|
#: src/app/routes/_authenticated/_assets/components/manage-tags-dialog.tsx
|
|
3559
3572
|
msgid "Manage Tags"
|
|
3560
3573
|
msgstr "Etiketleri Yönet"
|
|
@@ -3715,6 +3728,13 @@ msgstr "{0} varyant"
|
|
|
3715
3728
|
msgid "Failed to settle payment"
|
|
3716
3729
|
msgstr "Ödeme tamamlanamadı"
|
|
3717
3730
|
|
|
3731
|
+
#. placeholder {0}: failed.length
|
|
3732
|
+
#. placeholder {1}: failed.length
|
|
3733
|
+
#. placeholder {2}: failed.length
|
|
3734
|
+
#: src/lib/components/shared/assign-to-channel-dialog.tsx
|
|
3735
|
+
msgid "{0, plural, one {Failed to assign {entityIdsLength} {entityType} to {1} channel} other {Failed to assign {entityIdsLength} {entityType} to {2} channels}}"
|
|
3736
|
+
msgstr ""
|
|
3737
|
+
|
|
3718
3738
|
#: src/app/routes/_authenticated/_orders/orders_.$id_.modify.tsx
|
|
3719
3739
|
msgid "No billing address"
|
|
3720
3740
|
msgstr "Fatura adresi yok"
|
package/src/i18n/locales/uk.po
CHANGED
|
@@ -541,6 +541,14 @@ msgstr "Видалити посилання"
|
|
|
541
541
|
msgid "This field is readonly"
|
|
542
542
|
msgstr "Це поле доступне лише для читання"
|
|
543
543
|
|
|
544
|
+
#. placeholder {0}: succeeded.length
|
|
545
|
+
#. placeholder {1}: succeeded.length
|
|
546
|
+
#. placeholder {2}: succeeded.length
|
|
547
|
+
#: src/lib/components/shared/assign-to-channel-dialog.tsx
|
|
548
|
+
#: src/lib/components/shared/assign-to-channel-dialog.tsx
|
|
549
|
+
msgid "{0, plural, one {Assigned {entityIdsLength} {entityType} to {1} channel} other {Assigned {entityIdsLength} {entityType} to {2} channels}}"
|
|
550
|
+
msgstr ""
|
|
551
|
+
|
|
544
552
|
#: src/lib/framework/dashboard-widget/metrics-widget/index.tsx
|
|
545
553
|
#: src/lib/framework/dashboard-widget/metrics-widget/index.tsx
|
|
546
554
|
msgid "Order Count"
|
|
@@ -2658,6 +2666,10 @@ msgstr "Переглянути дані"
|
|
|
2658
2666
|
msgid "Delete View"
|
|
2659
2667
|
msgstr "Видалити подання"
|
|
2660
2668
|
|
|
2669
|
+
#: src/lib/components/shared/assign-to-channel-dialog.tsx
|
|
2670
|
+
msgid "Failed to assign {entityIdsLength} {entityType} to the selected channels"
|
|
2671
|
+
msgstr ""
|
|
2672
|
+
|
|
2661
2673
|
#: src/app/routes/_authenticated/_customers/customers_.$id.tsx
|
|
2662
2674
|
msgid "Add a new address to the customer."
|
|
2663
2675
|
msgstr "Додати нову адресу клієнту."
|
|
@@ -3068,10 +3080,9 @@ msgstr "Зберегти зміни"
|
|
|
3068
3080
|
msgid "Address updated"
|
|
3069
3081
|
msgstr "Адресу оновлено"
|
|
3070
3082
|
|
|
3071
|
-
#. placeholder {0}: selectedChannelIds.length
|
|
3072
3083
|
#: src/lib/components/shared/assign-to-channel-dialog.tsx
|
|
3073
|
-
msgid "Successfully assigned {entityIdsLength} {entityType} to {0} channels"
|
|
3074
|
-
msgstr ""
|
|
3084
|
+
#~ msgid "Successfully assigned {entityIdsLength} {entityType} to {0} channels"
|
|
3085
|
+
#~ msgstr ""
|
|
3075
3086
|
|
|
3076
3087
|
#: src/app/routes/_authenticated/_orders/hooks/use-refund-order.ts
|
|
3077
3088
|
msgid "Refund processed successfully"
|
|
@@ -3324,11 +3335,9 @@ msgstr "Призначити"
|
|
|
3324
3335
|
msgid "Successfully created seller"
|
|
3325
3336
|
msgstr "Продавця успішно створено"
|
|
3326
3337
|
|
|
3327
|
-
#. placeholder {0}: failedChannelIds.length
|
|
3328
|
-
#. placeholder {1}: selectedChannelIds.length
|
|
3329
3338
|
#: src/lib/components/shared/assign-to-channel-dialog.tsx
|
|
3330
|
-
msgid "Failed to assign {entityIdsLength} {entityType} to {0} of {1} channels"
|
|
3331
|
-
msgstr ""
|
|
3339
|
+
#~ msgid "Failed to assign {entityIdsLength} {entityType} to {0} of {1} channels"
|
|
3340
|
+
#~ msgstr ""
|
|
3332
3341
|
|
|
3333
3342
|
#: src/app/routes/_authenticated/_shipping-methods/shipping-methods_.$id.tsx
|
|
3334
3343
|
msgid "Successfully updated shipping method"
|
|
@@ -3555,6 +3564,10 @@ msgstr "Вибрати елемент"
|
|
|
3555
3564
|
msgid "New product"
|
|
3556
3565
|
msgstr "Новий товар"
|
|
3557
3566
|
|
|
3567
|
+
#: src/lib/components/shared/assign-to-channel-dialog.tsx
|
|
3568
|
+
msgid "Failed for: {failedCodes}"
|
|
3569
|
+
msgstr ""
|
|
3570
|
+
|
|
3558
3571
|
#: src/app/routes/_authenticated/_assets/components/manage-tags-dialog.tsx
|
|
3559
3572
|
msgid "Manage Tags"
|
|
3560
3573
|
msgstr "Керування тегами"
|
|
@@ -3715,6 +3728,13 @@ msgstr "{0} варіантів"
|
|
|
3715
3728
|
msgid "Failed to settle payment"
|
|
3716
3729
|
msgstr "Не вдалося провести платіж"
|
|
3717
3730
|
|
|
3731
|
+
#. placeholder {0}: failed.length
|
|
3732
|
+
#. placeholder {1}: failed.length
|
|
3733
|
+
#. placeholder {2}: failed.length
|
|
3734
|
+
#: src/lib/components/shared/assign-to-channel-dialog.tsx
|
|
3735
|
+
msgid "{0, plural, one {Failed to assign {entityIdsLength} {entityType} to {1} channel} other {Failed to assign {entityIdsLength} {entityType} to {2} channels}}"
|
|
3736
|
+
msgstr ""
|
|
3737
|
+
|
|
3718
3738
|
#: src/app/routes/_authenticated/_orders/orders_.$id_.modify.tsx
|
|
3719
3739
|
msgid "No billing address"
|
|
3720
3740
|
msgstr "Немає адреси виставлення рахунку"
|
package/src/i18n/locales/uz.po
CHANGED
|
@@ -513,6 +513,14 @@ msgstr "Havolani olib tashlash"
|
|
|
513
513
|
msgid "This field is readonly"
|
|
514
514
|
msgstr "Bu maydon faqat o'qish uchun"
|
|
515
515
|
|
|
516
|
+
#. placeholder {0}: succeeded.length
|
|
517
|
+
#. placeholder {1}: succeeded.length
|
|
518
|
+
#. placeholder {2}: succeeded.length
|
|
519
|
+
#: src/lib/components/shared/assign-to-channel-dialog.tsx
|
|
520
|
+
#: src/lib/components/shared/assign-to-channel-dialog.tsx
|
|
521
|
+
msgid "{0, plural, one {Assigned {entityIdsLength} {entityType} to {1} channel} other {Assigned {entityIdsLength} {entityType} to {2} channels}}"
|
|
522
|
+
msgstr ""
|
|
523
|
+
|
|
516
524
|
#: src/lib/framework/dashboard-widget/metrics-widget/index.tsx
|
|
517
525
|
#: src/lib/framework/dashboard-widget/metrics-widget/index.tsx
|
|
518
526
|
msgid "Order Count"
|
|
@@ -2583,6 +2591,10 @@ msgstr "Maʼlumotlarni koʻrish"
|
|
|
2583
2591
|
msgid "Delete View"
|
|
2584
2592
|
msgstr "Koʻrinishni oʻchirish"
|
|
2585
2593
|
|
|
2594
|
+
#: src/lib/components/shared/assign-to-channel-dialog.tsx
|
|
2595
|
+
msgid "Failed to assign {entityIdsLength} {entityType} to the selected channels"
|
|
2596
|
+
msgstr ""
|
|
2597
|
+
|
|
2586
2598
|
#: src/app/routes/_authenticated/_customers/customers_.$id.tsx
|
|
2587
2599
|
msgid "Add a new address to the customer."
|
|
2588
2600
|
msgstr "Mijozga yangi manzil qoʻshish."
|
|
@@ -2976,10 +2988,9 @@ msgstr "Oʻzgarishlarni saqlash"
|
|
|
2976
2988
|
msgid "Address updated"
|
|
2977
2989
|
msgstr "Manzil yangilandi"
|
|
2978
2990
|
|
|
2979
|
-
#. placeholder {0}: selectedChannelIds.length
|
|
2980
2991
|
#: src/lib/components/shared/assign-to-channel-dialog.tsx
|
|
2981
|
-
msgid "Successfully assigned {entityIdsLength} {entityType} to {0} channels"
|
|
2982
|
-
msgstr ""
|
|
2992
|
+
#~ msgid "Successfully assigned {entityIdsLength} {entityType} to {0} channels"
|
|
2993
|
+
#~ msgstr ""
|
|
2983
2994
|
|
|
2984
2995
|
#: src/app/routes/_authenticated/_orders/hooks/use-refund-order.ts
|
|
2985
2996
|
msgid "Refund processed successfully"
|
|
@@ -3232,11 +3243,9 @@ msgstr "Tayinlash"
|
|
|
3232
3243
|
msgid "Successfully created seller"
|
|
3233
3244
|
msgstr "Sotuvchi yaratildi"
|
|
3234
3245
|
|
|
3235
|
-
#. placeholder {0}: failedChannelIds.length
|
|
3236
|
-
#. placeholder {1}: selectedChannelIds.length
|
|
3237
3246
|
#: src/lib/components/shared/assign-to-channel-dialog.tsx
|
|
3238
|
-
msgid "Failed to assign {entityIdsLength} {entityType} to {0} of {1} channels"
|
|
3239
|
-
msgstr ""
|
|
3247
|
+
#~ msgid "Failed to assign {entityIdsLength} {entityType} to {0} of {1} channels"
|
|
3248
|
+
#~ msgstr ""
|
|
3240
3249
|
|
|
3241
3250
|
#: src/app/routes/_authenticated/_shipping-methods/shipping-methods_.$id.tsx
|
|
3242
3251
|
msgid "Successfully updated shipping method"
|
|
@@ -3455,6 +3464,10 @@ msgstr "Elementni tanlash"
|
|
|
3455
3464
|
msgid "New product"
|
|
3456
3465
|
msgstr "Yangi mahsulot"
|
|
3457
3466
|
|
|
3467
|
+
#: src/lib/components/shared/assign-to-channel-dialog.tsx
|
|
3468
|
+
msgid "Failed for: {failedCodes}"
|
|
3469
|
+
msgstr ""
|
|
3470
|
+
|
|
3458
3471
|
#: src/app/routes/_authenticated/_assets/components/manage-tags-dialog.tsx
|
|
3459
3472
|
msgid "Manage Tags"
|
|
3460
3473
|
msgstr "Teglarni boshqarish"
|
|
@@ -3604,6 +3617,13 @@ msgstr "{0} ta variant"
|
|
|
3604
3617
|
msgid "Failed to settle payment"
|
|
3605
3618
|
msgstr "To'lovni yakunlab bo'lmadi"
|
|
3606
3619
|
|
|
3620
|
+
#. placeholder {0}: failed.length
|
|
3621
|
+
#. placeholder {1}: failed.length
|
|
3622
|
+
#. placeholder {2}: failed.length
|
|
3623
|
+
#: src/lib/components/shared/assign-to-channel-dialog.tsx
|
|
3624
|
+
msgid "{0, plural, one {Failed to assign {entityIdsLength} {entityType} to {1} channel} other {Failed to assign {entityIdsLength} {entityType} to {2} channels}}"
|
|
3625
|
+
msgstr ""
|
|
3626
|
+
|
|
3607
3627
|
#: src/app/routes/_authenticated/_orders/orders_.$id_.modify.tsx
|
|
3608
3628
|
msgid "No billing address"
|
|
3609
3629
|
msgstr "Hisob-kitob manzili yo'q"
|
|
@@ -541,6 +541,14 @@ msgstr "删除链接"
|
|
|
541
541
|
msgid "This field is readonly"
|
|
542
542
|
msgstr "此字段为只读"
|
|
543
543
|
|
|
544
|
+
#. placeholder {0}: succeeded.length
|
|
545
|
+
#. placeholder {1}: succeeded.length
|
|
546
|
+
#. placeholder {2}: succeeded.length
|
|
547
|
+
#: src/lib/components/shared/assign-to-channel-dialog.tsx
|
|
548
|
+
#: src/lib/components/shared/assign-to-channel-dialog.tsx
|
|
549
|
+
msgid "{0, plural, one {Assigned {entityIdsLength} {entityType} to {1} channel} other {Assigned {entityIdsLength} {entityType} to {2} channels}}"
|
|
550
|
+
msgstr ""
|
|
551
|
+
|
|
544
552
|
#: src/lib/framework/dashboard-widget/metrics-widget/index.tsx
|
|
545
553
|
#: src/lib/framework/dashboard-widget/metrics-widget/index.tsx
|
|
546
554
|
msgid "Order Count"
|
|
@@ -2658,6 +2666,10 @@ msgstr "查看数据"
|
|
|
2658
2666
|
msgid "Delete View"
|
|
2659
2667
|
msgstr "删除视图"
|
|
2660
2668
|
|
|
2669
|
+
#: src/lib/components/shared/assign-to-channel-dialog.tsx
|
|
2670
|
+
msgid "Failed to assign {entityIdsLength} {entityType} to the selected channels"
|
|
2671
|
+
msgstr ""
|
|
2672
|
+
|
|
2661
2673
|
#: src/app/routes/_authenticated/_customers/customers_.$id.tsx
|
|
2662
2674
|
msgid "Add a new address to the customer."
|
|
2663
2675
|
msgstr "为客户添加新地址。"
|
|
@@ -3068,10 +3080,9 @@ msgstr "保存更改"
|
|
|
3068
3080
|
msgid "Address updated"
|
|
3069
3081
|
msgstr "地址已更新"
|
|
3070
3082
|
|
|
3071
|
-
#. placeholder {0}: selectedChannelIds.length
|
|
3072
3083
|
#: src/lib/components/shared/assign-to-channel-dialog.tsx
|
|
3073
|
-
msgid "Successfully assigned {entityIdsLength} {entityType} to {0} channels"
|
|
3074
|
-
msgstr ""
|
|
3084
|
+
#~ msgid "Successfully assigned {entityIdsLength} {entityType} to {0} channels"
|
|
3085
|
+
#~ msgstr ""
|
|
3075
3086
|
|
|
3076
3087
|
#: src/app/routes/_authenticated/_orders/hooks/use-refund-order.ts
|
|
3077
3088
|
msgid "Refund processed successfully"
|
|
@@ -3324,11 +3335,9 @@ msgstr "分配"
|
|
|
3324
3335
|
msgid "Successfully created seller"
|
|
3325
3336
|
msgstr "已成功创建卖家"
|
|
3326
3337
|
|
|
3327
|
-
#. placeholder {0}: failedChannelIds.length
|
|
3328
|
-
#. placeholder {1}: selectedChannelIds.length
|
|
3329
3338
|
#: src/lib/components/shared/assign-to-channel-dialog.tsx
|
|
3330
|
-
msgid "Failed to assign {entityIdsLength} {entityType} to {0} of {1} channels"
|
|
3331
|
-
msgstr ""
|
|
3339
|
+
#~ msgid "Failed to assign {entityIdsLength} {entityType} to {0} of {1} channels"
|
|
3340
|
+
#~ msgstr ""
|
|
3332
3341
|
|
|
3333
3342
|
#: src/app/routes/_authenticated/_shipping-methods/shipping-methods_.$id.tsx
|
|
3334
3343
|
msgid "Successfully updated shipping method"
|
|
@@ -3555,6 +3564,10 @@ msgstr "选择项目"
|
|
|
3555
3564
|
msgid "New product"
|
|
3556
3565
|
msgstr "新商品"
|
|
3557
3566
|
|
|
3567
|
+
#: src/lib/components/shared/assign-to-channel-dialog.tsx
|
|
3568
|
+
msgid "Failed for: {failedCodes}"
|
|
3569
|
+
msgstr ""
|
|
3570
|
+
|
|
3558
3571
|
#: src/app/routes/_authenticated/_assets/components/manage-tags-dialog.tsx
|
|
3559
3572
|
msgid "Manage Tags"
|
|
3560
3573
|
msgstr "管理标签"
|
|
@@ -3715,6 +3728,13 @@ msgstr "{0} 个变体"
|
|
|
3715
3728
|
msgid "Failed to settle payment"
|
|
3716
3729
|
msgstr "完成支付失败"
|
|
3717
3730
|
|
|
3731
|
+
#. placeholder {0}: failed.length
|
|
3732
|
+
#. placeholder {1}: failed.length
|
|
3733
|
+
#. placeholder {2}: failed.length
|
|
3734
|
+
#: src/lib/components/shared/assign-to-channel-dialog.tsx
|
|
3735
|
+
msgid "{0, plural, one {Failed to assign {entityIdsLength} {entityType} to {1} channel} other {Failed to assign {entityIdsLength} {entityType} to {2} channels}}"
|
|
3736
|
+
msgstr ""
|
|
3737
|
+
|
|
3718
3738
|
#: src/app/routes/_authenticated/_orders/orders_.$id_.modify.tsx
|
|
3719
3739
|
msgid "No billing address"
|
|
3720
3740
|
msgstr "无账单地址"
|
|
@@ -541,6 +541,14 @@ msgstr "移除連結"
|
|
|
541
541
|
msgid "This field is readonly"
|
|
542
542
|
msgstr "此欄位為唯讀"
|
|
543
543
|
|
|
544
|
+
#. placeholder {0}: succeeded.length
|
|
545
|
+
#. placeholder {1}: succeeded.length
|
|
546
|
+
#. placeholder {2}: succeeded.length
|
|
547
|
+
#: src/lib/components/shared/assign-to-channel-dialog.tsx
|
|
548
|
+
#: src/lib/components/shared/assign-to-channel-dialog.tsx
|
|
549
|
+
msgid "{0, plural, one {Assigned {entityIdsLength} {entityType} to {1} channel} other {Assigned {entityIdsLength} {entityType} to {2} channels}}"
|
|
550
|
+
msgstr ""
|
|
551
|
+
|
|
544
552
|
#: src/lib/framework/dashboard-widget/metrics-widget/index.tsx
|
|
545
553
|
#: src/lib/framework/dashboard-widget/metrics-widget/index.tsx
|
|
546
554
|
msgid "Order Count"
|
|
@@ -2658,6 +2666,10 @@ msgstr "檢視資料"
|
|
|
2658
2666
|
msgid "Delete View"
|
|
2659
2667
|
msgstr "刪除檢視"
|
|
2660
2668
|
|
|
2669
|
+
#: src/lib/components/shared/assign-to-channel-dialog.tsx
|
|
2670
|
+
msgid "Failed to assign {entityIdsLength} {entityType} to the selected channels"
|
|
2671
|
+
msgstr ""
|
|
2672
|
+
|
|
2661
2673
|
#: src/app/routes/_authenticated/_customers/customers_.$id.tsx
|
|
2662
2674
|
msgid "Add a new address to the customer."
|
|
2663
2675
|
msgstr "為客戶新增地址。"
|
|
@@ -3068,10 +3080,9 @@ msgstr "儲存變更"
|
|
|
3068
3080
|
msgid "Address updated"
|
|
3069
3081
|
msgstr "地址已更新"
|
|
3070
3082
|
|
|
3071
|
-
#. placeholder {0}: selectedChannelIds.length
|
|
3072
3083
|
#: src/lib/components/shared/assign-to-channel-dialog.tsx
|
|
3073
|
-
msgid "Successfully assigned {entityIdsLength} {entityType} to {0} channels"
|
|
3074
|
-
msgstr ""
|
|
3084
|
+
#~ msgid "Successfully assigned {entityIdsLength} {entityType} to {0} channels"
|
|
3085
|
+
#~ msgstr ""
|
|
3075
3086
|
|
|
3076
3087
|
#: src/app/routes/_authenticated/_orders/hooks/use-refund-order.ts
|
|
3077
3088
|
msgid "Refund processed successfully"
|
|
@@ -3324,11 +3335,9 @@ msgstr "指派"
|
|
|
3324
3335
|
msgid "Successfully created seller"
|
|
3325
3336
|
msgstr "已成功建立賣家"
|
|
3326
3337
|
|
|
3327
|
-
#. placeholder {0}: failedChannelIds.length
|
|
3328
|
-
#. placeholder {1}: selectedChannelIds.length
|
|
3329
3338
|
#: src/lib/components/shared/assign-to-channel-dialog.tsx
|
|
3330
|
-
msgid "Failed to assign {entityIdsLength} {entityType} to {0} of {1} channels"
|
|
3331
|
-
msgstr ""
|
|
3339
|
+
#~ msgid "Failed to assign {entityIdsLength} {entityType} to {0} of {1} channels"
|
|
3340
|
+
#~ msgstr ""
|
|
3332
3341
|
|
|
3333
3342
|
#: src/app/routes/_authenticated/_shipping-methods/shipping-methods_.$id.tsx
|
|
3334
3343
|
msgid "Successfully updated shipping method"
|
|
@@ -3555,6 +3564,10 @@ msgstr "選取項目"
|
|
|
3555
3564
|
msgid "New product"
|
|
3556
3565
|
msgstr "新增商品"
|
|
3557
3566
|
|
|
3567
|
+
#: src/lib/components/shared/assign-to-channel-dialog.tsx
|
|
3568
|
+
msgid "Failed for: {failedCodes}"
|
|
3569
|
+
msgstr ""
|
|
3570
|
+
|
|
3558
3571
|
#: src/app/routes/_authenticated/_assets/components/manage-tags-dialog.tsx
|
|
3559
3572
|
msgid "Manage Tags"
|
|
3560
3573
|
msgstr "管理標籤"
|
|
@@ -3715,6 +3728,13 @@ msgstr "{0} 個變體"
|
|
|
3715
3728
|
msgid "Failed to settle payment"
|
|
3716
3729
|
msgstr "完成付款失敗"
|
|
3717
3730
|
|
|
3731
|
+
#. placeholder {0}: failed.length
|
|
3732
|
+
#. placeholder {1}: failed.length
|
|
3733
|
+
#. placeholder {2}: failed.length
|
|
3734
|
+
#: src/lib/components/shared/assign-to-channel-dialog.tsx
|
|
3735
|
+
msgid "{0, plural, one {Failed to assign {entityIdsLength} {entityType} to {1} channel} other {Failed to assign {entityIdsLength} {entityType} to {2} channels}}"
|
|
3736
|
+
msgstr ""
|
|
3737
|
+
|
|
3718
3738
|
#: src/app/routes/_authenticated/_orders/orders_.$id_.modify.tsx
|
|
3719
3739
|
msgid "No billing address"
|
|
3720
3740
|
msgstr "無帳單地址"
|
|
@@ -1,8 +1,10 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { useMutation } from '@tanstack/react-query';
|
|
2
2
|
import { ReactNode, useEffect, useState } from 'react';
|
|
3
|
+
import { toast } from '@/vdb/components/ui/sonner.js';
|
|
3
4
|
|
|
4
5
|
import { ChannelCodeLabel } from '@/vdb/components/shared/channel-code-label.js';
|
|
5
6
|
import { MultiSelect } from '@/vdb/components/shared/multi-select.js';
|
|
7
|
+
import { assignToChannels } from '@/vdb/components/shared/assign-to-channels.js';
|
|
6
8
|
import { Button } from '@/vdb/components/ui/button.js';
|
|
7
9
|
import {
|
|
8
10
|
Dialog,
|
|
@@ -14,6 +16,7 @@ import {
|
|
|
14
16
|
} from '@/vdb/components/ui/dialog.js';
|
|
15
17
|
import { Input } from '@/vdb/components/ui/input.js';
|
|
16
18
|
import { ResultOf } from '@/vdb/graphql/graphql.js';
|
|
19
|
+
import { plural } from '@lingui/core/macro';
|
|
17
20
|
import { Trans, useLingui } from '@lingui/react/macro';
|
|
18
21
|
|
|
19
22
|
import { useChannel } from '@/vdb/hooks/use-channel.js';
|
|
@@ -55,7 +58,6 @@ export function AssignToChannelDialog({
|
|
|
55
58
|
}: Readonly<AssignToChannelDialogProps>) {
|
|
56
59
|
const { t } = useLingui();
|
|
57
60
|
const [selectedChannelIds, setSelectedChannelIds] = useState<string[]>([]);
|
|
58
|
-
const [isAssigning, setIsAssigning] = useState(false);
|
|
59
61
|
const { channels, activeChannel } = useChannel();
|
|
60
62
|
const entityIdsLength = entityIds.length;
|
|
61
63
|
|
|
@@ -63,7 +65,7 @@ export function AssignToChannelDialog({
|
|
|
63
65
|
if (!open) setSelectedChannelIds([]);
|
|
64
66
|
}, [open]);
|
|
65
67
|
|
|
66
|
-
// Filter out the currently
|
|
68
|
+
// Filter out the currently active channel from available options
|
|
67
69
|
const availableChannels = channels.filter(channel => channel.id !== activeChannel?.id);
|
|
68
70
|
|
|
69
71
|
const selectItems = availableChannels.map(ch => ({
|
|
@@ -72,42 +74,64 @@ export function AssignToChannelDialog({
|
|
|
72
74
|
display: <ChannelCodeLabel code={ch.code} />,
|
|
73
75
|
}));
|
|
74
76
|
|
|
75
|
-
const
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
r.status === 'rejected' ? [selectedChannelIds[i]] : [],
|
|
86
|
-
);
|
|
87
|
-
const succeededCount = results.length - failedChannelIds.length;
|
|
88
|
-
|
|
89
|
-
if (succeededCount > 0) {
|
|
90
|
-
onSuccess?.();
|
|
77
|
+
const { mutate, isPending } = useMutation({
|
|
78
|
+
mutationFn: () =>
|
|
79
|
+
assignToChannels(
|
|
80
|
+
selectedChannelIds,
|
|
81
|
+
channelId => buildInput(channelId, additionalData),
|
|
82
|
+
mutationFn,
|
|
83
|
+
),
|
|
84
|
+
onSuccess: ({ succeeded, failed }) => {
|
|
85
|
+
if (failed.length) {
|
|
86
|
+
console.error('Failed to assign to channels', failed);
|
|
91
87
|
}
|
|
92
88
|
|
|
93
|
-
|
|
89
|
+
const failedCodes = failed
|
|
90
|
+
.map(f => channels.find(c => c.id === f.channelId)?.code ?? f.channelId)
|
|
91
|
+
.join(', ');
|
|
92
|
+
|
|
93
|
+
if (failed.length === 0) {
|
|
94
94
|
toast.success(
|
|
95
|
-
|
|
95
|
+
plural(succeeded.length, {
|
|
96
|
+
one: `Assigned ${entityIdsLength} ${entityType} to ${succeeded.length} channel`,
|
|
97
|
+
other: `Assigned ${entityIdsLength} ${entityType} to ${succeeded.length} channels`,
|
|
98
|
+
}),
|
|
96
99
|
);
|
|
100
|
+
setSelectedChannelIds([]);
|
|
101
|
+
onSuccess?.();
|
|
97
102
|
onOpenChange(false);
|
|
98
|
-
} else {
|
|
99
|
-
const firstRejected = results.find(r => r.status === 'rejected');
|
|
100
|
-
const firstReason = firstRejected?.status === 'rejected' ? firstRejected.reason : undefined;
|
|
101
|
-
const description = firstReason instanceof Error ? firstReason.message : undefined;
|
|
102
|
-
setSelectedChannelIds(failedChannelIds);
|
|
103
|
+
} else if (succeeded.length === 0) {
|
|
103
104
|
toast.error(
|
|
104
|
-
|
|
105
|
-
|
|
105
|
+
plural(failed.length, {
|
|
106
|
+
one: `Failed to assign ${entityIdsLength} ${entityType} to ${failed.length} channel`,
|
|
107
|
+
other: `Failed to assign ${entityIdsLength} ${entityType} to ${failed.length} channels`,
|
|
108
|
+
}),
|
|
109
|
+
{ description: failedCodes },
|
|
110
|
+
);
|
|
111
|
+
} else {
|
|
112
|
+
toast.warning(
|
|
113
|
+
plural(succeeded.length, {
|
|
114
|
+
one: `Assigned ${entityIdsLength} ${entityType} to ${succeeded.length} channel`,
|
|
115
|
+
other: `Assigned ${entityIdsLength} ${entityType} to ${succeeded.length} channels`,
|
|
116
|
+
}),
|
|
117
|
+
{ description: t`Failed for: ${failedCodes}` },
|
|
106
118
|
);
|
|
119
|
+
// Keep the dialog open and narrow the selection to the failures, so retrying
|
|
120
|
+
// is one click and doesn't re-assign the channels that already succeeded.
|
|
121
|
+
setSelectedChannelIds(failed.map(f => f.channelId));
|
|
122
|
+
onSuccess?.();
|
|
107
123
|
}
|
|
108
|
-
}
|
|
109
|
-
|
|
124
|
+
},
|
|
125
|
+
onError: () => {
|
|
126
|
+
toast.error(t`Failed to assign ${entityIdsLength} ${entityType} to the selected channels`);
|
|
127
|
+
},
|
|
128
|
+
});
|
|
129
|
+
|
|
130
|
+
const handleAssign = () => {
|
|
131
|
+
if (selectedChannelIds.length === 0) {
|
|
132
|
+
return;
|
|
110
133
|
}
|
|
134
|
+
mutate();
|
|
111
135
|
};
|
|
112
136
|
|
|
113
137
|
return (
|
|
@@ -135,6 +159,7 @@ export function AssignToChannelDialog({
|
|
|
135
159
|
onChange={setSelectedChannelIds}
|
|
136
160
|
placeholder={t`Select one or more channels`}
|
|
137
161
|
searchPlaceholder={t`Search channels...`}
|
|
162
|
+
showSearch
|
|
138
163
|
className="w-full"
|
|
139
164
|
/>
|
|
140
165
|
</div>
|
|
@@ -144,7 +169,7 @@ export function AssignToChannelDialog({
|
|
|
144
169
|
<Button variant="outline" onClick={() => onOpenChange(false)}>
|
|
145
170
|
<Trans>Cancel</Trans>
|
|
146
171
|
</Button>
|
|
147
|
-
<Button onClick={handleAssign} disabled={selectedChannelIds.length === 0 ||
|
|
172
|
+
<Button onClick={handleAssign} disabled={selectedChannelIds.length === 0 || isPending}>
|
|
148
173
|
<Trans>Assign</Trans>
|
|
149
174
|
</Button>
|
|
150
175
|
</DialogFooter>
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { describe, expect, it, vi } from 'vitest';
|
|
2
|
+
|
|
3
|
+
import { assignToChannels } from './assign-to-channels.js';
|
|
4
|
+
|
|
5
|
+
const buildInput = (channelId: string) => ({ channelId });
|
|
6
|
+
|
|
7
|
+
describe('assignToChannels', () => {
|
|
8
|
+
it('reports all successes', async () => {
|
|
9
|
+
const result = await assignToChannels(['a', 'b'], buildInput, vi.fn().mockResolvedValue({}));
|
|
10
|
+
expect(result).toEqual({ succeeded: ['a', 'b'], failed: [] });
|
|
11
|
+
});
|
|
12
|
+
|
|
13
|
+
it('reports all failures with their reasons', async () => {
|
|
14
|
+
const error = new Error('nope');
|
|
15
|
+
const result = await assignToChannels(['a'], buildInput, vi.fn().mockRejectedValue(error));
|
|
16
|
+
expect(result.succeeded).toEqual([]);
|
|
17
|
+
expect(result.failed).toEqual([{ channelId: 'a', reason: error }]);
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
it('records which channels failed on partial failure', async () => {
|
|
21
|
+
const mutationFn = vi.fn(({ input }) =>
|
|
22
|
+
input.channelId === 'b' ? Promise.reject(new Error('boom')) : Promise.resolve({}),
|
|
23
|
+
);
|
|
24
|
+
const result = await assignToChannels(['a', 'b', 'c'], buildInput, mutationFn);
|
|
25
|
+
expect(result.succeeded).toEqual(['a', 'c']);
|
|
26
|
+
expect(result.failed.map(f => f.channelId)).toEqual(['b']);
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
it('continues with remaining channels after a failure', async () => {
|
|
30
|
+
const mutationFn = vi.fn().mockRejectedValue(new Error('x'));
|
|
31
|
+
await assignToChannels(['a', 'b', 'c'], buildInput, mutationFn);
|
|
32
|
+
expect(mutationFn).toHaveBeenCalledTimes(3);
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
it('captures synchronous buildInput errors as failures', async () => {
|
|
36
|
+
const throwing = () => {
|
|
37
|
+
throw new Error('bad input');
|
|
38
|
+
};
|
|
39
|
+
const result = await assignToChannels(['a'], throwing, vi.fn());
|
|
40
|
+
expect(result.succeeded).toEqual([]);
|
|
41
|
+
expect(result.failed.length).toBe(1);
|
|
42
|
+
expect(result.failed[0].channelId).toBe('a');
|
|
43
|
+
expect(result.failed[0].reason).toBeInstanceOf(Error);
|
|
44
|
+
});
|
|
45
|
+
});
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
export interface AssignToChannelsResult {
|
|
2
|
+
succeeded: string[];
|
|
3
|
+
failed: Array<{ channelId: string; reason: unknown }>;
|
|
4
|
+
}
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Sequentially assigns entities to multiple channels via the provided mutation function.
|
|
8
|
+
*
|
|
9
|
+
* Sequential execution is intentional: each mutation writes channel relations for the same
|
|
10
|
+
* entity rows, so a parallel fan-out only buys lock contention and N overlapping reindex jobs.
|
|
11
|
+
*
|
|
12
|
+
* @param channelIds - Channel IDs to assign to
|
|
13
|
+
* @param buildInput - Builds the mutation input for a given channel ID
|
|
14
|
+
* @param mutationFn - The GraphQL mutation function to call per channel
|
|
15
|
+
*/
|
|
16
|
+
export async function assignToChannels(
|
|
17
|
+
channelIds: string[],
|
|
18
|
+
buildInput: (channelId: string) => Record<string, any>,
|
|
19
|
+
mutationFn: (variables: any) => Promise<unknown>,
|
|
20
|
+
): Promise<AssignToChannelsResult> {
|
|
21
|
+
const result: AssignToChannelsResult = { succeeded: [], failed: [] };
|
|
22
|
+
for (const channelId of channelIds) {
|
|
23
|
+
try {
|
|
24
|
+
await mutationFn({ input: buildInput(channelId) });
|
|
25
|
+
result.succeeded.push(channelId);
|
|
26
|
+
} catch (reason) {
|
|
27
|
+
result.failed.push({ channelId, reason });
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
return result;
|
|
31
|
+
}
|