소스 검색

feat(admin-ui): Enable adding OptionGroups to existing products

Closes #711
Michael Bromley 4 년 전
부모
커밋
bd5e7c04c0
18개의 변경된 파일171개의 추가작업 그리고 93개의 파일을 삭제
  1. 29 29
      packages/admin-ui/i18n-coverage.json
  2. 2 0
      packages/admin-ui/src/lib/catalog/src/catalog.module.ts
  3. 13 0
      packages/admin-ui/src/lib/catalog/src/components/confirm-variant-deletion-dialog/confirm-variant-deletion-dialog.component.html
  4. 0 0
      packages/admin-ui/src/lib/catalog/src/components/confirm-variant-deletion-dialog/confirm-variant-deletion-dialog.component.scss
  5. 21 0
      packages/admin-ui/src/lib/catalog/src/components/confirm-variant-deletion-dialog/confirm-variant-deletion-dialog.component.ts
  6. 0 1
      packages/admin-ui/src/lib/catalog/src/components/product-variants-editor/product-variants-editor.component.html
  7. 61 29
      packages/admin-ui/src/lib/catalog/src/components/product-variants-editor/product-variants-editor.component.ts
  8. 4 3
      packages/admin-ui/src/lib/static/i18n-messages/cs.json
  9. 4 3
      packages/admin-ui/src/lib/static/i18n-messages/de.json
  10. 5 4
      packages/admin-ui/src/lib/static/i18n-messages/en.json
  11. 4 3
      packages/admin-ui/src/lib/static/i18n-messages/es.json
  12. 4 3
      packages/admin-ui/src/lib/static/i18n-messages/fr.json
  13. 4 3
      packages/admin-ui/src/lib/static/i18n-messages/pl.json
  14. 4 3
      packages/admin-ui/src/lib/static/i18n-messages/pt_BR.json
  15. 4 3
      packages/admin-ui/src/lib/static/i18n-messages/ru.json
  16. 4 3
      packages/admin-ui/src/lib/static/i18n-messages/uk.json
  17. 4 3
      packages/admin-ui/src/lib/static/i18n-messages/zh_Hans.json
  18. 4 3
      packages/admin-ui/src/lib/static/i18n-messages/zh_Hant.json

+ 29 - 29
packages/admin-ui/i18n-coverage.json

@@ -1,60 +1,60 @@
 {
-  "generatedOn": "2021-06-07T08:09:29.383Z",
-  "lastCommit": "b0bb2a5f9bdb41b93c6b8142d2da0565f712f171",
+  "generatedOn": "2021-06-29T10:27:05.737Z",
+  "lastCommit": "e4f276791c3c46a90c9c37c03d7f28b48a7bec86",
   "translationStatus": {
     "cs": {
-      "tokenCount": 777,
-      "translatedCount": 751,
-      "percentage": 97
+      "tokenCount": 778,
+      "translatedCount": 748,
+      "percentage": 96
     },
     "de": {
-      "tokenCount": 777,
-      "translatedCount": 729,
-      "percentage": 94
+      "tokenCount": 778,
+      "translatedCount": 726,
+      "percentage": 93
     },
     "en": {
-      "tokenCount": 777,
-      "translatedCount": 777,
-      "percentage": 100
+      "tokenCount": 778,
+      "translatedCount": 774,
+      "percentage": 99
     },
     "es": {
-      "tokenCount": 777,
-      "translatedCount": 454,
+      "tokenCount": 778,
+      "translatedCount": 451,
       "percentage": 58
     },
     "fr": {
-      "tokenCount": 777,
-      "translatedCount": 773,
+      "tokenCount": 778,
+      "translatedCount": 770,
       "percentage": 99
     },
     "pl": {
-      "tokenCount": 777,
-      "translatedCount": 547,
+      "tokenCount": 778,
+      "translatedCount": 544,
       "percentage": 70
     },
     "pt_BR": {
-      "tokenCount": 777,
-      "translatedCount": 747,
+      "tokenCount": 778,
+      "translatedCount": 744,
       "percentage": 96
     },
     "ru": {
-      "tokenCount": 777,
-      "translatedCount": 777,
-      "percentage": 100
+      "tokenCount": 778,
+      "translatedCount": 774,
+      "percentage": 99
     },
     "uk": {
-      "tokenCount": 777,
-      "translatedCount": 777,
-      "percentage": 100
+      "tokenCount": 778,
+      "translatedCount": 774,
+      "percentage": 99
     },
     "zh_Hans": {
-      "tokenCount": 777,
-      "translatedCount": 702,
+      "tokenCount": 778,
+      "translatedCount": 699,
       "percentage": 90
     },
     "zh_Hant": {
-      "tokenCount": 777,
-      "translatedCount": 529,
+      "tokenCount": 778,
+      "translatedCount": 526,
       "percentage": 68
     }
   }

+ 2 - 0
packages/admin-ui/src/lib/catalog/src/catalog.module.ts

@@ -12,6 +12,7 @@ import { CollectionDetailComponent } from './components/collection-detail/collec
 import { CollectionListComponent } from './components/collection-list/collection-list.component';
 import { CollectionTreeNodeComponent } from './components/collection-tree/collection-tree-node.component';
 import { CollectionTreeComponent } from './components/collection-tree/collection-tree.component';
+import { ConfirmVariantDeletionDialogComponent } from './components/confirm-variant-deletion-dialog/confirm-variant-deletion-dialog.component';
 import { FacetDetailComponent } from './components/facet-detail/facet-detail.component';
 import { FacetListComponent } from './components/facet-list/facet-list.component';
 import { GenerateProductVariantsComponent } from './components/generate-product-variants/generate-product-variants.component';
@@ -52,6 +53,7 @@ import { VariantPriceDetailComponent } from './components/variant-price-detail/v
         ProductVariantsEditorComponent,
         AssignProductsToChannelDialogComponent,
         AssetDetailComponent,
+        ConfirmVariantDeletionDialogComponent,
     ],
 })
 export class CatalogModule {}

+ 13 - 0
packages/admin-ui/src/lib/catalog/src/components/confirm-variant-deletion-dialog/confirm-variant-deletion-dialog.component.html

@@ -0,0 +1,13 @@
+<ng-template vdrDialogTitle>
+    {{ 'catalog.confirm-deletion-of-unused-variants-title' | translate }}
+</ng-template>
+{{ 'catalog.confirm-deletion-of-unused-variants-body' | translate }}
+<ul>
+    <li *ngFor="let variant of variants">{{ variant.name }} ({{ variant.sku }})</li>
+</ul>
+<ng-template vdrDialogButtons>
+    <button type="button" class="btn" (click)="cancel()">{{ 'common.cancel' | translate }}</button>
+    <button type="submit" (click)="confirm()" class="btn btn-primary">
+        {{ 'common.confirm' | translate }}
+    </button>
+</ng-template>

+ 0 - 0
packages/admin-ui/src/lib/catalog/src/components/confirm-variant-deletion-dialog/confirm-variant-deletion-dialog.component.scss


+ 21 - 0
packages/admin-ui/src/lib/catalog/src/components/confirm-variant-deletion-dialog/confirm-variant-deletion-dialog.component.ts

@@ -0,0 +1,21 @@
+import { ChangeDetectionStrategy, Component } from '@angular/core';
+import { Dialog, GetProductVariantOptions } from '@vendure/admin-ui/core';
+
+@Component({
+    selector: 'vdr-confirm-variant-deletion-dialog',
+    templateUrl: './confirm-variant-deletion-dialog.component.html',
+    styleUrls: ['./confirm-variant-deletion-dialog.component.scss'],
+    changeDetection: ChangeDetectionStrategy.OnPush,
+})
+export class ConfirmVariantDeletionDialogComponent implements Dialog<boolean> {
+    resolveWith: (result?: boolean) => void;
+    variants: GetProductVariantOptions.Variants[] = [];
+
+    confirm() {
+        this.resolveWith(true);
+    }
+
+    cancel() {
+        this.resolveWith();
+    }
+}

+ 0 - 1
packages/admin-ui/src/lib/catalog/src/components/product-variants-editor/product-variants-editor.component.html

@@ -29,7 +29,6 @@
 <button
     class="btn btn-primary-outline btn-sm"
     (click)="addOption()"
-    *ngIf="product?.variants.length === 1 && product?.optionGroups.length === 0"
 >
     <clr-icon shape="plus"></clr-icon>
     {{ 'catalog.add-option' | translate }}

+ 61 - 29
packages/admin-ui/src/lib/catalog/src/components/product-variants-editor/product-variants-editor.component.ts

@@ -17,10 +17,12 @@ import {
 import { normalizeString } from '@vendure/common/lib/normalize-string';
 import { pick } from '@vendure/common/lib/pick';
 import { generateAllCombinations, notNullOrUndefined } from '@vendure/common/lib/shared-utils';
+import { unique } from '@vendure/common/lib/unique';
 import { EMPTY, forkJoin, Observable, of } from 'rxjs';
 import { filter, map, mergeMap, switchMap } from 'rxjs/operators';
 
 import { ProductDetailService } from '../../providers/product-detail/product-detail.service';
+import { ConfirmVariantDeletionDialogComponent } from '../confirm-variant-deletion-dialog/confirm-variant-deletion-dialog.component';
 
 export class GeneratedVariant {
     isDefault: boolean;
@@ -113,17 +115,18 @@ export class ProductVariantsEditorComponent implements OnInit, DeactivateAware {
             isDefault: boolean,
             options: GeneratedVariant['options'],
             existingVariant?: GetProductVariantOptions.Variants,
+            prototypeVariant?: GetProductVariantOptions.Variants,
         ): GeneratedVariant => {
             const prototype = this.getVariantPrototype(options, previousVariants);
             return new GeneratedVariant({
-                enabled: false,
+                enabled: true,
                 existing: !!existingVariant,
                 productVariantId: existingVariant?.id,
                 isDefault,
                 options,
-                price: existingVariant?.price ?? prototype.price,
-                sku: existingVariant?.sku ?? prototype.sku,
-                stock: existingVariant?.stockOnHand ?? prototype.stock,
+                price: existingVariant?.price ?? prototypeVariant?.price ?? prototype.price,
+                sku: existingVariant?.sku ?? prototypeVariant?.sku ?? prototype.sku,
+                stock: existingVariant?.stockOnHand ?? prototypeVariant?.stockOnHand ?? prototype.stock,
             });
         };
         this.generatedVariants = groups.length
@@ -131,7 +134,10 @@ export class ProductVariantsEditorComponent implements OnInit, DeactivateAware {
                   const existingVariant = this.product.variants.find(v =>
                       this.optionsAreEqual(v.options, options),
                   );
-                  return generatedVariantFactory(false, options, existingVariant);
+                  const prototypeVariant = this.product.variants.find(v =>
+                      this.optionsAreSubset(v.options, options),
+                  );
+                  return generatedVariantFactory(false, options, existingVariant, prototypeVariant);
               })
             : [generatedVariantFactory(true, [], this.product.variants[0])];
     }
@@ -195,8 +201,9 @@ export class ProductVariantsEditorComponent implements OnInit, DeactivateAware {
                 values: [],
             }));
 
-        this.confirmDeletionOfDefault()
+        this.checkUniqueSkus()
             .pipe(
+                mergeMap(() => this.confirmDeletionOfObsoleteVariants()),
                 mergeMap(() =>
                     this.productDetailService.createProductOptionGroups(newOptionGroups, this.languageCode),
                 ),
@@ -204,7 +211,7 @@ export class ProductVariantsEditorComponent implements OnInit, DeactivateAware {
                 mergeMap(createdOptionGroups => this.addNewOptionsToGroups(createdOptionGroups)),
                 mergeMap(groupsIds => this.fetchOptionGroups(groupsIds)),
                 mergeMap(groups => this.createNewProductVariants(groups)),
-                mergeMap(res => this.deleteDefaultVariant(res.createProductVariants)),
+                mergeMap(res => this.deleteObsoleteVariants(res.createProductVariants)),
                 mergeMap(variants => this.reFetchProduct(variants)),
             )
             .subscribe({
@@ -218,16 +225,31 @@ export class ProductVariantsEditorComponent implements OnInit, DeactivateAware {
             });
     }
 
-    private confirmDeletionOfDefault(): Observable<boolean> {
-        if (this.hasOnlyDefaultVariant(this.product)) {
+    private checkUniqueSkus() {
+        const withDuplicateSkus = this.generatedVariants.filter((variant, index) => {
+            return this.generatedVariants.find(gv => gv.sku.trim() === variant.sku.trim() && gv !== variant);
+        });
+        if (withDuplicateSkus.length) {
             return this.modalService
                 .dialog({
-                    title: _('catalog.confirm-adding-options-delete-default-title'),
-                    body: _('catalog.confirm-adding-options-delete-default-body'),
-                    buttons: [
-                        { type: 'secondary', label: _('common.cancel') },
-                        { type: 'danger', label: _('catalog.delete-default-variant'), returnValue: true },
-                    ],
+                    title: _('catalog.duplicate-sku-warning'),
+                    body: unique(withDuplicateSkus.map(v => `${v.sku}`)).join(', '),
+                    buttons: [{ label: _('common.close'), returnValue: false, type: 'primary' }],
+                })
+                .pipe(mergeMap(res => EMPTY));
+        } else {
+            return of(true);
+        }
+    }
+
+    private confirmDeletionOfObsoleteVariants(): Observable<boolean> {
+        const obsoleteVariants = this.getObsoleteVariants();
+        if (obsoleteVariants.length) {
+            return this.modalService
+                .fromComponent(ConfirmVariantDeletionDialogComponent, {
+                    locals: {
+                        variants: obsoleteVariants,
+                    },
                 })
                 .pipe(
                     mergeMap(res => {
@@ -239,6 +261,12 @@ export class ProductVariantsEditorComponent implements OnInit, DeactivateAware {
         }
     }
 
+    private getObsoleteVariants() {
+        return this.product.variants.filter(
+            variant => !this.generatedVariants.find(gv => gv.productVariantId === variant.id),
+        );
+    }
+
     private hasOnlyDefaultVariant(product: GetProductVariantOptions.Product): boolean {
         return product.variants.length === 1 && product.optionGroups.length === 0;
     }
@@ -329,13 +357,13 @@ export class ProductVariantsEditorComponent implements OnInit, DeactivateAware {
         );
     }
 
-    private deleteDefaultVariant<T>(input: T): Observable<T> {
-        if (this.hasOnlyDefaultVariant(this.product)) {
-            // If the default single product variant has been replaced by multiple variants,
-            // delete the original default variant.
-            return this.dataService.product
-                .deleteProductVariant(this.product.variants[0].id)
-                .pipe(map(() => input));
+    private deleteObsoleteVariants<T>(input: T): Observable<T> {
+        const obsoleteVariants = this.getObsoleteVariants();
+        if (obsoleteVariants.length) {
+            const deleteOperations = obsoleteVariants.map(v =>
+                this.dataService.product.deleteProductVariant(v.id).pipe(map(() => input)),
+            );
+            return forkJoin(...deleteOperations);
         } else {
             return of(input);
         }
@@ -376,13 +404,17 @@ export class ProductVariantsEditorComponent implements OnInit, DeactivateAware {
     }
 
     private optionsAreEqual(a: Array<{ name: string }>, b: Array<{ name: string }>): boolean {
-        function toOptionString(o: Array<{ name: string }>) {
-            return o
-                .map(x => x.name)
-                .sort()
-                .join('|');
-        }
+        return this.toOptionString(a) === this.toOptionString(b);
+    }
+
+    private optionsAreSubset(a: Array<{ name: string }>, b: Array<{ name: string }>): boolean {
+        return this.toOptionString(b).includes(this.toOptionString(a));
+    }
 
-        return toOptionString(a) === toOptionString(b);
+    private toOptionString(o: Array<{ name: string }>): string {
+        return o
+            .map(x => x.name)
+            .sort()
+            .join('|');
     }
 }

+ 4 - 3
packages/admin-ui/src/lib/static/i18n-messages/cs.json

@@ -64,8 +64,6 @@
     "auto-update-product-variant-name": "Automaticky aktualizovat jména variant",
     "channel-price-preview": "Náhled ceny v kanálu",
     "collection-contents": "Obsah kolekce",
-    "confirm-adding-options-delete-default-body": "Přidáním vlastností k tomuto produktu způsobí vymazání nýnější výchozí varianty. Chcete pokračovat?",
-    "confirm-adding-options-delete-default-title": "Smazat výchozí variantu?",
     "confirm-delete-administrator": "Smazat administrátora?",
     "confirm-delete-assets": "Smazat {count} {count, plural, one {médium} few {média} other {médií}}?",
     "confirm-delete-channel": "Smazat kanál?",
@@ -80,15 +78,17 @@
     "confirm-delete-promotion": "Smazat propagaci?",
     "confirm-delete-shipping-method": "Smazat dopravní metodu?",
     "confirm-delete-zone": "Smazat zónu?",
+    "confirm-deletion-of-unused-variants-body": "",
+    "confirm-deletion-of-unused-variants-title": "",
     "create-new-collection": "Vytvořit kolekci",
     "create-new-facet": "Vytvořit nový atribut",
     "create-new-product": "Nový produkt",
     "created-new-variants-success": "Successfully created {count} new {count, plural, one {variant} other {variants}}",
     "default-variant": "Výchozí varianta",
-    "delete-default-variant": "Smazat výchozí variantu",
     "display-variant-cards": "Zobrazit jako karty",
     "display-variant-table": "Zobrazit jako tabulku",
     "drop-files-to-upload": "Přetáhněte soubory k nahrávání",
+    "duplicate-sku-warning": "",
     "expand-all-collections": "Rozevřít všechny kolekce",
     "facet-values": "Hodnoty atributů",
     "filter-by-name": "Filtrovat dle jména",
@@ -169,6 +169,7 @@
     "change-selection": "",
     "channel": "Kanál",
     "channels": "Kanály",
+    "close": "",
     "code": "Kód",
     "collapse-entries": "Schovat vstupy",
     "confirm": "Potvrdit",

+ 4 - 3
packages/admin-ui/src/lib/static/i18n-messages/de.json

@@ -64,8 +64,6 @@
     "auto-update-product-variant-name": "Automatisch Namen der Produktvariante aktualisieren",
     "channel-price-preview": "Kanal-Preisvorschau",
     "collection-contents": "Inhalt der Sammlung",
-    "confirm-adding-options-delete-default-body": "Das Hinzufügen von Optionen zu diesem Produkt führt dazu, dass die vorhandene Standardvariante gelöscht wird. Möchten Sie fortfahren?",
-    "confirm-adding-options-delete-default-title": "Standardvariante löschen?",
     "confirm-delete-administrator": "Administrator löschen?",
     "confirm-delete-assets": "{count} {count, plural, one {Asset} other {Assets}} löschen?",
     "confirm-delete-channel": "Kanal löschen?",
@@ -80,15 +78,17 @@
     "confirm-delete-promotion": "Werbeaktion löschen?",
     "confirm-delete-shipping-method": "Versandart löschen?",
     "confirm-delete-zone": "Zone löschen?",
+    "confirm-deletion-of-unused-variants-body": "",
+    "confirm-deletion-of-unused-variants-title": "",
     "create-new-collection": "Neue Kollektion anlegen",
     "create-new-facet": "Neue Facette erstellen",
     "create-new-product": "Neues Produkt",
     "created-new-variants-success": "{count, plural, one {1 neue Variante} other {{count} neue Varianten}} erfolgreich erstellt",
     "default-variant": "Standardvariante",
-    "delete-default-variant": "Standardvariante löschen",
     "display-variant-cards": "Details anzeigen",
     "display-variant-table": "Tabellenansicht",
     "drop-files-to-upload": "Dateien zum Hochladen ablegen",
+    "duplicate-sku-warning": "",
     "expand-all-collections": "Alle Sammlungen erweitern",
     "facet-values": "Facettenwerte",
     "filter-by-name": "Nach Name filtern",
@@ -169,6 +169,7 @@
     "change-selection": "Auswahl ändern",
     "channel": "Kanal",
     "channels": "Kanäle",
+    "close": "",
     "code": "Code",
     "collapse-entries": "Einträge einklappen",
     "confirm": "Bestätigen",

+ 5 - 4
packages/admin-ui/src/lib/static/i18n-messages/en.json

@@ -64,8 +64,6 @@
     "auto-update-product-variant-name": "Automatically update the names of ProductVariants",
     "channel-price-preview": "Channel price preview",
     "collection-contents": "Collection contents",
-    "confirm-adding-options-delete-default-body": "Adding options to this product will cause the existing default variant to be deleted. Do you wish to proceed?",
-    "confirm-adding-options-delete-default-title": "Delete default variant?",
     "confirm-delete-administrator": "Delete administrator?",
     "confirm-delete-assets": "Delete {count} {count, plural, one {asset} other {assets}}?",
     "confirm-delete-channel": "Delete channel?",
@@ -80,15 +78,17 @@
     "confirm-delete-promotion": "Delete promotion?",
     "confirm-delete-shipping-method": "Delete shipping method?",
     "confirm-delete-zone": "Delete zone?",
+    "confirm-deletion-of-unused-variants-body": "The following product variants have been made obsolete due to the addition of new options. They will be deleted during the creation of the new product variants.",
+    "confirm-deletion-of-unused-variants-title": "Delete obsolete product variants?",
     "create-new-collection": "Create new collection",
     "create-new-facet": "Create new facet",
     "create-new-product": "New product",
     "created-new-variants-success": "Successfully created {count} new {count, plural, one {variant} other {variants}}",
     "default-variant": "Default variant",
-    "delete-default-variant": "Delete default variant",
     "display-variant-cards": "View details",
     "display-variant-table": "View as table",
     "drop-files-to-upload": "Drop files to upload",
+    "duplicate-sku-warning": "Please ensure all SKUs are unique",
     "expand-all-collections": "Expand all collections",
     "facet-values": "Facet values",
     "filter-by-name": "Filter by name",
@@ -169,6 +169,7 @@
     "change-selection": "Change selection",
     "channel": "Channel",
     "channels": "Channels",
+    "close": "Close",
     "code": "Code",
     "collapse-entries": "Collapse entries",
     "confirm": "Confirm",
@@ -810,4 +811,4 @@
     "job-result": "Job result",
     "job-state": "Job state"
   }
-}
+}

+ 4 - 3
packages/admin-ui/src/lib/static/i18n-messages/es.json

@@ -64,8 +64,6 @@
     "auto-update-product-variant-name": "",
     "channel-price-preview": "Vista previa de precio para el canal de ventas",
     "collection-contents": "Contenidos de la colección",
-    "confirm-adding-options-delete-default-body": "Añadir optiones a este producto eliminará la variante por defecto. ¿Desea continuar?",
-    "confirm-adding-options-delete-default-title": "¿Eliminar la variante por defecto?",
     "confirm-delete-administrator": "",
     "confirm-delete-assets": "¿Eliminar archivo?",
     "confirm-delete-channel": "¿Eliminar canal de ventas?",
@@ -80,15 +78,17 @@
     "confirm-delete-promotion": "¿Eliminar promoción?",
     "confirm-delete-shipping-method": "¿Eliminar método de envío?",
     "confirm-delete-zone": "¿Eliminar zona?",
+    "confirm-deletion-of-unused-variants-body": "",
+    "confirm-deletion-of-unused-variants-title": "",
     "create-new-collection": "Crear nueva colección",
     "create-new-facet": "Crear nueva faceta",
     "create-new-product": "Crear nuevo producto",
     "created-new-variants-success": "",
     "default-variant": "Variante por defecto",
-    "delete-default-variant": "Elimnar variante por defecto",
     "display-variant-cards": "Ver detalles",
     "display-variant-table": "Ver como tabla",
     "drop-files-to-upload": "Arrastra archivos para subirlos",
+    "duplicate-sku-warning": "",
     "expand-all-collections": "Expandir todas las colecciones",
     "facet-values": "Valores de faceta",
     "filter-by-name": "Filtrar por nombre",
@@ -169,6 +169,7 @@
     "change-selection": "",
     "channel": "Canal de ventas",
     "channels": "Canales de ventas",
+    "close": "",
     "code": "Código",
     "collapse-entries": "",
     "confirm": "Confirmar",

+ 4 - 3
packages/admin-ui/src/lib/static/i18n-messages/fr.json

@@ -64,8 +64,6 @@
     "auto-update-product-variant-name": "Mettre à jour automatiquement les noms de variations du produit ",
     "channel-price-preview": "Prévisualisation du prix du canal",
     "collection-contents": "Contenu de la Collection",
-    "confirm-adding-options-delete-default-body": "L'ajout d'options à ce produit supprimera les variations existantes par défaut. Voulez-vous continuer ?",
-    "confirm-adding-options-delete-default-title": "Supprimer variation par défaut ?",
     "confirm-delete-administrator": "Supprimer administrateur?",
     "confirm-delete-assets": "Supprimer {count} {count, plural, one {fichier} other {fichiers}} ?",
     "confirm-delete-channel": "Supprimer canal ?",
@@ -80,15 +78,17 @@
     "confirm-delete-promotion": "Supprimer promotion ?",
     "confirm-delete-shipping-method": "Supprimer mode d'expédition ?",
     "confirm-delete-zone": "Supprimer zone ?",
+    "confirm-deletion-of-unused-variants-body": "",
+    "confirm-deletion-of-unused-variants-title": "",
     "create-new-collection": "Créer nouvelle collection",
     "create-new-facet": "Créer nouveau composant",
     "create-new-product": "Nouveau produit",
     "created-new-variants-success": "Création {count, plural, one {d'une nouvelle variation} other {de nouvelles variations}}",
     "default-variant": "Variation par défault",
-    "delete-default-variant": "Supprimer variation par défaut",
     "display-variant-cards": "Voir détails",
     "display-variant-table": "Voir en tant que tableau",
     "drop-files-to-upload": "Déposer des fichiers pour téléverser",
+    "duplicate-sku-warning": "",
     "expand-all-collections": "Etendre toutes les collections",
     "facet-values": "Valeurs de composant",
     "filter-by-name": "Filtrer par nom",
@@ -169,6 +169,7 @@
     "change-selection": "Modifier la sélection",
     "channel": "Canal",
     "channels": "Canaux",
+    "close": "",
     "code": "Code",
     "collapse-entries": "Réduire les éléments",
     "confirm": "Confirmer",

+ 4 - 3
packages/admin-ui/src/lib/static/i18n-messages/pl.json

@@ -64,8 +64,6 @@
     "auto-update-product-variant-name": "",
     "channel-price-preview": "Podgląd cen kanału",
     "collection-contents": "Zawartość kolekcji",
-    "confirm-adding-options-delete-default-body": "Dodawanie opcji spowoduje, że obecna domyślna opcja zostanie usunięta. Czy chcesz kontynuować?",
-    "confirm-adding-options-delete-default-title": "Usunąć domyślny tytuł?",
     "confirm-delete-administrator": "",
     "confirm-delete-assets": "",
     "confirm-delete-channel": "Usunąć kanał?",
@@ -80,15 +78,17 @@
     "confirm-delete-promotion": "Usunąć promocje?",
     "confirm-delete-shipping-method": "Usunąć metode wysyłki?",
     "confirm-delete-zone": "",
+    "confirm-deletion-of-unused-variants-body": "",
+    "confirm-deletion-of-unused-variants-title": "",
     "create-new-collection": "Utwórz nową kolekcje",
     "create-new-facet": "Utwórz faset",
     "create-new-product": "Nowy produkt",
     "created-new-variants-success": "Pomyślnie utworzono {count} nowy {count, plural, one {wariant} other {wariantów}}",
     "default-variant": "Domyślny wariant",
-    "delete-default-variant": "Usuń domyślny wariant",
     "display-variant-cards": "Wyświetl szczegóły",
     "display-variant-table": "Wyświetl jako tabele",
     "drop-files-to-upload": "Upuść pliki do uploadu",
+    "duplicate-sku-warning": "",
     "expand-all-collections": "Rozwiń wszystkie kolekcje",
     "facet-values": "Wartości faseta",
     "filter-by-name": "Filtruj po nazwie",
@@ -169,6 +169,7 @@
     "change-selection": "",
     "channel": "Kanał",
     "channels": "Kanały",
+    "close": "",
     "code": "Kod",
     "collapse-entries": "",
     "confirm": "",

+ 4 - 3
packages/admin-ui/src/lib/static/i18n-messages/pt_BR.json

@@ -64,8 +64,6 @@
     "auto-update-product-variant-name": "Atualizar automaticamente os nomes das variações do produto",
     "channel-price-preview": "Visualizar preço do canal",
     "collection-contents": "Conteúdo da categoria",
-    "confirm-adding-options-delete-default-body": "Adicionar opções a este produto fará com que a variação padrão existente seja excluída. Você deseja continuar?",
-    "confirm-adding-options-delete-default-title": "Excluir variação padrão?",
     "confirm-delete-administrator": "Excluir administrador?",
     "confirm-delete-assets": "Excluir {count} {count, plural, one {asset} other {assets}}?",
     "confirm-delete-channel": "Exluir canal?",
@@ -80,15 +78,17 @@
     "confirm-delete-promotion": "Excluir promoção?",
     "confirm-delete-shipping-method": "Excluir método de envio?",
     "confirm-delete-zone": "Excluir zona?",
+    "confirm-deletion-of-unused-variants-body": "",
+    "confirm-deletion-of-unused-variants-title": "",
     "create-new-collection": "Criar nova categoria",
     "create-new-facet": "Criar nova etiqueta",
     "create-new-product": "Novo produto",
     "created-new-variants-success": "Criado com sucesso {count} new {count, plural, one {variant} other {variants}}",
     "default-variant": "Variação padrão",
-    "delete-default-variant": "Excluir variação padrão",
     "display-variant-cards": "Ver como detalhes",
     "display-variant-table": "Ver como tabela",
     "drop-files-to-upload": "Soltar arquivos para envio",
+    "duplicate-sku-warning": "",
     "expand-all-collections": "Expandir todas as categorias",
     "facet-values": "Valor da Etiqueta",
     "filter-by-name": "Filtrar por nome",
@@ -169,6 +169,7 @@
     "change-selection": "",
     "channel": "Canal",
     "channels": "Canais",
+    "close": "",
     "code": "Código",
     "collapse-entries": "Recolher entradas",
     "confirm": "Confirme",

+ 4 - 3
packages/admin-ui/src/lib/static/i18n-messages/ru.json

@@ -64,8 +64,6 @@
     "auto-update-product-variant-name": "Автоматически обновлять названия вариантов товара",
     "channel-price-preview": "Предварительный просмотр цен канала",
     "collection-contents": "Содержание коллекции",
-    "confirm-adding-options-delete-default-body": "Добавление опций к этому товару приведет к удалению существующего варианта товара по умолчанию. Вы хотите продолжить?",
-    "confirm-adding-options-delete-default-title": "Вариант товара",
     "confirm-delete-administrator": "Удалить администратора?",
     "confirm-delete-assets": "Удалить {count} {count, plural, one {медиа-объект} other {медиа-объектов}}?",
     "confirm-delete-channel": "Удалить канал?",
@@ -80,15 +78,17 @@
     "confirm-delete-promotion": "Удалить промо-акцию?",
     "confirm-delete-shipping-method": "Удалить метод доставки?",
     "confirm-delete-zone": "Удалить зону?",
+    "confirm-deletion-of-unused-variants-body": "",
+    "confirm-deletion-of-unused-variants-title": "",
     "create-new-collection": "Создать новую коллекцию",
     "create-new-facet": "Создать новый тег",
     "create-new-product": "Создать новый товар",
     "created-new-variants-success": "Успешно создан {count} новый {count, plural, one {вариант} other {вариантов}}",
     "default-variant": "Вариант товара по умолчанию",
-    "delete-default-variant": "Удалить вариант товара по умолчанию",
     "display-variant-cards": "Просмотр карточек вариантов",
     "display-variant-table": "Просмотр в виде таблицы",
     "drop-files-to-upload": "Перетащите файлы для загрузки",
+    "duplicate-sku-warning": "",
     "expand-all-collections": "Развернуть все коллекции",
     "facet-values": "Значения тега",
     "filter-by-name": "Фильтр по имени",
@@ -169,6 +169,7 @@
     "change-selection": "Изменить выбор",
     "channel": "Канал",
     "channels": "Каналы",
+    "close": "",
     "code": "Код",
     "collapse-entries": "Свернуть записи",
     "confirm": "Подтверждать",

+ 4 - 3
packages/admin-ui/src/lib/static/i18n-messages/uk.json

@@ -64,8 +64,6 @@
     "auto-update-product-variant-name": "Автоматично оновлювати назви варіантів товару",
     "channel-price-preview": "Попередній перегляд цін каналу",
     "collection-contents": "Зміст колекції",
-    "confirm-adding-options-delete-default-body": "Додавання опцій до цього товару приведе до видалення існуючого варіанта товару за замовчуванням. Ви хочете продовжити?",
-    "confirm-adding-options-delete-default-title": "Варіант товару",
     "confirm-delete-administrator": "Видалити адміністратора?",
     "confirm-delete-assets": "Видалити {count} {count, plural, one {медіа-об'єкт} other {медіа-об'єктів}}?",
     "confirm-delete-channel": "Видалити канал?",
@@ -80,15 +78,17 @@
     "confirm-delete-promotion": "Видалити промо-акцію?",
     "confirm-delete-shipping-method": "Видалити метод доставки?",
     "confirm-delete-zone": "Видалити зону?",
+    "confirm-deletion-of-unused-variants-body": "",
+    "confirm-deletion-of-unused-variants-title": "",
     "create-new-collection": "Створити нову колекцію",
     "create-new-facet": "Створити новий тег",
     "create-new-product": "Створити новий товар",
     "created-new-variants-success": "Успішно створено {count} новий {count, plural, one {варіант} other {варіантів}}",
     "default-variant": "Варіант товару за замовчуванням",
-    "delete-default-variant": "Видалити варіант товару за замовчуванням",
     "display-variant-cards": "Перегляд карток варіантів",
     "display-variant-table": "Перегляд у вигляді таблиці",
     "drop-files-to-upload": "Перетягніть файли для завантаження",
+    "duplicate-sku-warning": "",
     "expand-all-collections": "Розгорнути всі колекції",
     "facet-values": "Значення тегу",
     "filter-by-name": "Фільтр по імені",
@@ -169,6 +169,7 @@
     "change-selection": "Змінити вибір",
     "channel": "Канал",
     "channels": "Канали",
+    "close": "",
     "code": "Код",
     "collapse-entries": "Згорнути записи",
     "confirm": "Підтверджувати",

+ 4 - 3
packages/admin-ui/src/lib/static/i18n-messages/zh_Hans.json

@@ -64,8 +64,6 @@
     "auto-update-product-variant-name": "自动更新不同商品变体名称",
     "channel-price-preview": "渠道价格预览",
     "collection-contents": "系列产品",
-    "confirm-adding-options-delete-default-body": "添加新规格到此产品会导致含此规格的产品被删除,确认继续吗?",
-    "confirm-adding-options-delete-default-title": "确认删除产品规格么?",
     "confirm-delete-administrator": "确认删除管理员吗?",
     "confirm-delete-assets": "确认删除{count}个资源吗?",
     "confirm-delete-channel": "确认删除销售渠道?",
@@ -80,15 +78,17 @@
     "confirm-delete-promotion": "确认删除优惠券?",
     "confirm-delete-shipping-method": "确认删除邮寄方式?",
     "confirm-delete-zone": "确认删除分区么?",
+    "confirm-deletion-of-unused-variants-body": "",
+    "confirm-deletion-of-unused-variants-title": "",
     "create-new-collection": "添加系列",
     "create-new-facet": "添加特征",
     "create-new-product": "添加商品",
     "created-new-variants-success": "成功创建{count}个商品规格",
     "default-variant": "默认商品规格",
-    "delete-default-variant": "删除默认商品规格",
     "display-variant-cards": "卡片显示",
     "display-variant-table": "表格显示",
     "drop-files-to-upload": "拖拽文件上传",
+    "duplicate-sku-warning": "",
     "expand-all-collections": "展开所有系列",
     "facet-values": "特征值列表",
     "filter-by-name": "按名字过滤",
@@ -169,6 +169,7 @@
     "change-selection": "更改选项",
     "channel": "销售渠道",
     "channels": "销售渠道",
+    "close": "",
     "code": "编码",
     "collapse-entries": "收起",
     "confirm": "确认",

+ 4 - 3
packages/admin-ui/src/lib/static/i18n-messages/zh_Hant.json

@@ -64,8 +64,6 @@
     "auto-update-product-variant-name": "",
     "channel-price-preview": "渠道價格覽",
     "collection-contents": "系列產品",
-    "confirm-adding-options-delete-default-body": "新增規格到此產品會引致包含此規格的產品被移除,確認繼續吗?",
-    "confirm-adding-options-delete-default-title": "確認移除產品規格嗎?",
     "confirm-delete-administrator": "",
     "confirm-delete-assets": "",
     "confirm-delete-channel": "確認移除渠道?",
@@ -80,15 +78,17 @@
     "confirm-delete-promotion": "確認移除優惠券?",
     "confirm-delete-shipping-method": "確認移除此郵寄方式?",
     "confirm-delete-zone": "",
+    "confirm-deletion-of-unused-variants-body": "",
+    "confirm-deletion-of-unused-variants-title": "",
     "create-new-collection": "新增系列",
     "create-new-facet": "新增特徵",
     "create-new-product": "新增商品",
     "created-new-variants-success": "成功建立{count}個商品規格",
     "default-variant": "默認商品規格",
-    "delete-default-variant": "移除默認商品規格",
     "display-variant-cards": "卡片顯示",
     "display-variant-table": "表格顯示",
     "drop-files-to-upload": "拖拽文件上傳",
+    "duplicate-sku-warning": "",
     "expand-all-collections": "展開所有系列",
     "facet-values": "特徵值列表",
     "filter-by-name": "按名字篩選",
@@ -169,6 +169,7 @@
     "change-selection": "",
     "channel": "渠道",
     "channels": "渠道",
+    "close": "",
     "code": "編碼",
     "collapse-entries": "",
     "confirm": "",