@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.
Files changed (96) hide show
  1. package/dist/bundle/chunks/{2SSKDMRQ-CMBxVbIh.js → 2SSKDMRQ-B4u6jNxM.js} +2 -2
  2. package/dist/bundle/chunks/{AP7HFJJL-PAkY4fBC.js → AP7HFJJL-DjAB5so4.js} +1 -1
  3. package/dist/bundle/chunks/{WDYDFRGG-xJgIWAuv.js → WDYDFRGG-BDxsfu0L.js} +2 -2
  4. package/dist/bundle/chunks/ar-Dw37OWAC.js +4 -0
  5. package/dist/bundle/chunks/bg-WWILwg5a.js +4 -0
  6. package/dist/bundle/chunks/cs-Boj56h8-.js +4 -0
  7. package/dist/bundle/chunks/de-B3cVWr99.js +4 -0
  8. package/dist/bundle/chunks/en-XH2YNaUJ.js +4 -0
  9. package/dist/bundle/chunks/es-DsLfSYXz.js +4 -0
  10. package/dist/bundle/chunks/fa-BGD8jY53.js +4 -0
  11. package/dist/bundle/chunks/fr-DBqCdnUr.js +4 -0
  12. package/dist/bundle/chunks/he-DQQEZP0n.js +4 -0
  13. package/dist/bundle/chunks/hr-STFHgcsd.js +4 -0
  14. package/dist/bundle/chunks/hu-BExyeFOp.js +4 -0
  15. package/dist/bundle/chunks/it-DUpm-Qux.js +4 -0
  16. package/dist/bundle/chunks/ja-BGNeg6jp.js +4 -0
  17. package/dist/bundle/chunks/ko-z-VdWVYg.js +4 -0
  18. package/dist/bundle/chunks/{locale-BSCAi77j.js → locale-C2tFsz32.js} +1 -1
  19. package/dist/bundle/chunks/{main-D8aGWlid.js → main-CYlJtY7f.js} +3 -3
  20. package/dist/bundle/chunks/nb-BlQEQZ3Y.js +4 -0
  21. package/dist/bundle/chunks/ne-BdVp1TVY.js +4 -0
  22. package/dist/bundle/chunks/nl-DCunYzVO.js +4 -0
  23. package/dist/bundle/chunks/pl-DKq5n67K.js +4 -0
  24. package/dist/bundle/chunks/pt_BR-Ciui3dTE.js +4 -0
  25. package/dist/bundle/chunks/pt_PT-OWgPo2LR.js +4 -0
  26. package/dist/bundle/chunks/ro-HZ7RB1yo.js +4 -0
  27. package/dist/bundle/chunks/ru-KzFvjVea.js +4 -0
  28. package/dist/bundle/chunks/sv-rrqFVsRd.js +4 -0
  29. package/dist/bundle/chunks/tr-BDTaDRoI.js +4 -0
  30. package/dist/bundle/chunks/uk-ug3_1nGA.js +4 -0
  31. package/dist/bundle/chunks/{use-job-queue-polling-D8i6-8rR.js → use-job-queue-polling-LumEexzR.js} +95 -31
  32. package/dist/bundle/chunks/uz-vOctUQ-c.js +4 -0
  33. package/dist/bundle/chunks/zh_Hans-4iLG9Dlx.js +4 -0
  34. package/dist/bundle/chunks/zh_Hant-CKXgDt95.js +4 -0
  35. package/dist/bundle/lib.js +2 -2
  36. package/dist/bundle/main.js +2 -2
  37. package/package.json +3 -3
  38. package/src/i18n/locales/ar.po +27 -7
  39. package/src/i18n/locales/bg.po +27 -7
  40. package/src/i18n/locales/cs.po +27 -7
  41. package/src/i18n/locales/de.po +27 -7
  42. package/src/i18n/locales/en.po +27 -7
  43. package/src/i18n/locales/es.po +27 -7
  44. package/src/i18n/locales/fa.po +27 -7
  45. package/src/i18n/locales/fr.po +27 -7
  46. package/src/i18n/locales/he.po +27 -7
  47. package/src/i18n/locales/hr.po +27 -7
  48. package/src/i18n/locales/hu.po +27 -7
  49. package/src/i18n/locales/it.po +27 -7
  50. package/src/i18n/locales/ja.po +27 -7
  51. package/src/i18n/locales/ko.po +27 -7
  52. package/src/i18n/locales/nb.po +27 -7
  53. package/src/i18n/locales/ne.po +27 -7
  54. package/src/i18n/locales/nl.po +27 -7
  55. package/src/i18n/locales/pl.po +27 -7
  56. package/src/i18n/locales/pt_BR.po +27 -7
  57. package/src/i18n/locales/pt_PT.po +27 -7
  58. package/src/i18n/locales/ro.po +27 -7
  59. package/src/i18n/locales/ru.po +27 -7
  60. package/src/i18n/locales/sv.po +27 -7
  61. package/src/i18n/locales/tr.po +27 -7
  62. package/src/i18n/locales/uk.po +27 -7
  63. package/src/i18n/locales/uz.po +27 -7
  64. package/src/i18n/locales/zh_Hans.po +27 -7
  65. package/src/i18n/locales/zh_Hant.po +27 -7
  66. package/src/lib/components/shared/assign-to-channel-dialog.tsx +56 -31
  67. package/src/lib/components/shared/assign-to-channels.spec.ts +45 -0
  68. package/src/lib/components/shared/assign-to-channels.ts +31 -0
  69. package/dist/bundle/chunks/ar-DATX7H2x.js +0 -4
  70. package/dist/bundle/chunks/bg-DHS8PDKd.js +0 -4
  71. package/dist/bundle/chunks/cs-CGhaHD2Z.js +0 -4
  72. package/dist/bundle/chunks/de-BMtF5EY3.js +0 -4
  73. package/dist/bundle/chunks/en-DucAVNrv.js +0 -4
  74. package/dist/bundle/chunks/es-FBktM7AP.js +0 -4
  75. package/dist/bundle/chunks/fa-Dl5QN-Zp.js +0 -4
  76. package/dist/bundle/chunks/fr-TPBsPGD2.js +0 -4
  77. package/dist/bundle/chunks/he-CvNLNPHS.js +0 -4
  78. package/dist/bundle/chunks/hr-7QRa6pq0.js +0 -4
  79. package/dist/bundle/chunks/hu-BUCwangz.js +0 -4
  80. package/dist/bundle/chunks/it-DcVNes47.js +0 -4
  81. package/dist/bundle/chunks/ja-C-C3Z-2D.js +0 -4
  82. package/dist/bundle/chunks/ko-B41VP-2G.js +0 -4
  83. package/dist/bundle/chunks/nb-q5my_SIJ.js +0 -4
  84. package/dist/bundle/chunks/ne-DksEv0gd.js +0 -4
  85. package/dist/bundle/chunks/nl-BEWvhJPb.js +0 -4
  86. package/dist/bundle/chunks/pl-DRf5xQAy.js +0 -4
  87. package/dist/bundle/chunks/pt_BR-DEOQ9Vgg.js +0 -4
  88. package/dist/bundle/chunks/pt_PT-DvDBycjC.js +0 -4
  89. package/dist/bundle/chunks/ro-CNbK5V7l.js +0 -4
  90. package/dist/bundle/chunks/ru-BJ395nXO.js +0 -4
  91. package/dist/bundle/chunks/sv-Bxi6B55d.js +0 -4
  92. package/dist/bundle/chunks/tr-D2FNyrS9.js +0 -4
  93. package/dist/bundle/chunks/uk-C3iewRAE.js +0 -4
  94. package/dist/bundle/chunks/uz-DDVd9bpR.js +0 -4
  95. package/dist/bundle/chunks/zh_Hans-DFK1UiKv.js +0 -4
  96. package/dist/bundle/chunks/zh_Hant-BWs2-32i.js +0 -4
@@ -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"
@@ -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 "Немає адреси виставлення рахунку"
@@ -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 { toast } from '@/vdb/components/ui/sonner.js';
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 selected channel from available options
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 handleAssign = async () => {
76
- setIsAssigning(true);
77
- try {
78
- const results = await Promise.allSettled(
79
- selectedChannelIds.map(channelId =>
80
- mutationFn({ input: buildInput(channelId, additionalData) }),
81
- ),
82
- );
83
-
84
- const failedChannelIds = results.flatMap((r, i) =>
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
- if (failedChannelIds.length === 0) {
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
- t`Successfully assigned ${entityIdsLength} ${entityType} to ${selectedChannelIds.length} channels`,
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
- t`Failed to assign ${entityIdsLength} ${entityType} to ${failedChannelIds.length} of ${selectedChannelIds.length} channels`,
105
- { description },
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
- } finally {
109
- setIsAssigning(false);
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 || isAssigning}>
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
+ }