Просмотр исходного кода

feat(admin-ui): Add support for bulk product deletion

Relates to #853
Michael Bromley 3 лет назад
Родитель
Сommit
47fa230c3a
22 измененных файлов с 201 добавлено и 41 удалено
  1. 18 18
      packages/admin-ui/i18n-coverage.json
  2. 42 12
      packages/admin-ui/src/lib/catalog/src/components/product-list/product-list-bulk-actions.ts
  3. 9 4
      packages/admin-ui/src/lib/catalog/src/components/product-list/product-list.component.html
  4. 30 0
      packages/admin-ui/src/lib/core/src/common/generated-types.ts
  5. 4 0
      packages/admin-ui/src/lib/core/src/common/utilities/selection-manager.ts
  6. 9 0
      packages/admin-ui/src/lib/core/src/data/definitions/product-definitions.ts
  7. 11 0
      packages/admin-ui/src/lib/core/src/data/providers/product-data.service.ts
  8. 27 6
      packages/admin-ui/src/lib/core/src/providers/bulk-action-registry/bulk-action-types.ts
  9. 13 1
      packages/admin-ui/src/lib/core/src/shared/components/bulk-action-menu/bulk-action-menu.component.ts
  10. 3 0
      packages/admin-ui/src/lib/static/i18n-messages/cs.json
  11. 3 0
      packages/admin-ui/src/lib/static/i18n-messages/de.json
  12. 2 0
      packages/admin-ui/src/lib/static/i18n-messages/en.json
  13. 3 0
      packages/admin-ui/src/lib/static/i18n-messages/es.json
  14. 3 0
      packages/admin-ui/src/lib/static/i18n-messages/fr.json
  15. 3 0
      packages/admin-ui/src/lib/static/i18n-messages/it.json
  16. 3 0
      packages/admin-ui/src/lib/static/i18n-messages/pl.json
  17. 3 0
      packages/admin-ui/src/lib/static/i18n-messages/pt_BR.json
  18. 3 0
      packages/admin-ui/src/lib/static/i18n-messages/pt_PT.json
  19. 3 0
      packages/admin-ui/src/lib/static/i18n-messages/ru.json
  20. 3 0
      packages/admin-ui/src/lib/static/i18n-messages/uk.json
  21. 3 0
      packages/admin-ui/src/lib/static/i18n-messages/zh_Hans.json
  22. 3 0
      packages/admin-ui/src/lib/static/i18n-messages/zh_Hant.json

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

@@ -1,69 +1,69 @@
 {
-  "generatedOn": "2022-08-17T13:04:00.715Z",
-  "lastCommit": "afa9340409a191b75d701b3c4d789131e8a9c4db",
+  "generatedOn": "2022-09-26T12:56:28.131Z",
+  "lastCommit": "b9e89fd11bfdc8c5c6b492559dbda50d067b7a69",
   "translationStatus": {
     "cs": {
-      "tokenCount": 654,
+      "tokenCount": 657,
       "translatedCount": 593,
-      "percentage": 91
+      "percentage": 90
     },
     "de": {
-      "tokenCount": 654,
+      "tokenCount": 657,
       "translatedCount": 572,
       "percentage": 87
     },
     "en": {
-      "tokenCount": 654,
-      "translatedCount": 653,
+      "tokenCount": 657,
+      "translatedCount": 655,
       "percentage": 100
     },
     "es": {
-      "tokenCount": 654,
+      "tokenCount": 657,
       "translatedCount": 624,
       "percentage": 95
     },
     "fr": {
-      "tokenCount": 654,
+      "tokenCount": 657,
       "translatedCount": 614,
-      "percentage": 94
+      "percentage": 93
     },
     "it": {
-      "tokenCount": 654,
+      "tokenCount": 657,
       "translatedCount": 622,
       "percentage": 95
     },
     "pl": {
-      "tokenCount": 654,
+      "tokenCount": 657,
       "translatedCount": 407,
       "percentage": 62
     },
     "pt_BR": {
-      "tokenCount": 654,
+      "tokenCount": 657,
       "translatedCount": 591,
       "percentage": 90
     },
     "pt_PT": {
-      "tokenCount": 654,
+      "tokenCount": 657,
       "translatedCount": 635,
       "percentage": 97
     },
     "ru": {
-      "tokenCount": 654,
+      "tokenCount": 657,
       "translatedCount": 621,
       "percentage": 95
     },
     "uk": {
-      "tokenCount": 654,
+      "tokenCount": 657,
       "translatedCount": 621,
       "percentage": 95
     },
     "zh_Hans": {
-      "tokenCount": 654,
+      "tokenCount": 657,
       "translatedCount": 559,
       "percentage": 85
     },
     "zh_Hant": {
-      "tokenCount": 654,
+      "tokenCount": 657,
       "translatedCount": 387,
       "percentage": 59
     }

+ 42 - 12
packages/admin-ui/src/lib/catalog/src/components/product-list/product-list-bulk-actions.ts

@@ -1,15 +1,26 @@
 import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
-import { BulkAction, DataService, ModalService } from '@vendure/admin-ui/core';
-import { delay } from 'rxjs/operators';
+import {
+    BulkAction,
+    DataService,
+    DeletionResult,
+    ModalService,
+    NotificationService,
+    SearchProducts,
+} from '@vendure/admin-ui/core';
+import { EMPTY } from 'rxjs';
+import { switchMap } from 'rxjs/operators';
 
-export const deleteProductsBulkAction: BulkAction = {
+import { ProductListComponent } from './product-list.component';
+
+export const deleteProductsBulkAction: BulkAction<SearchProducts.Items, ProductListComponent> = {
     location: 'product-list',
     label: _('common.delete'),
     icon: 'trash',
     iconClass: 'is-danger',
-    onClick: ({ injector, selection }) => {
+    onClick: ({ injector, selection, hostComponent, clearSelection }) => {
         const modalService = injector.get(ModalService);
         const dataService = injector.get(DataService);
+        const notificationService = injector.get(NotificationService);
         modalService
             .dialog({
                 title: _('catalog.confirm-bulk-delete-products'),
@@ -21,13 +32,32 @@ export const deleteProductsBulkAction: BulkAction = {
                     { type: 'danger', label: _('common.delete'), returnValue: true },
                 ],
             })
-            .pipe
-            // switchMap(response =>
-            //     response ? dataService.product.deleteProduct(productId) : EMPTY,
-            // ),
-            // Short delay to allow the product to be removed from the search index before
-            // refreshing.
-            ()
-            .subscribe();
+            .pipe(
+                switchMap(response =>
+                    response ? dataService.product.deleteProducts(selection.map(p => p.productId)) : EMPTY,
+                ),
+            )
+            .subscribe(result => {
+                let deleted = 0;
+                const errors: string[] = [];
+                for (const item of result.deleteProducts) {
+                    if (item.result === DeletionResult.DELETED) {
+                        deleted++;
+                    } else if (item.message) {
+                        errors.push(item.message);
+                    }
+                }
+                if (0 < deleted) {
+                    notificationService.success(_('common.notify-bulk-delete-success'), {
+                        count: deleted,
+                        entity: 'Products',
+                    });
+                }
+                if (0 < errors.length) {
+                    notificationService.error(errors.join('\n'));
+                }
+                hostComponent.refresh();
+                clearSelection();
+            });
     },
 };

+ 9 - 4
packages/admin-ui/src/lib/catalog/src/components/product-list/product-list.component.html

@@ -34,8 +34,8 @@
                         >
                             <vdr-status-badge type="warning"></vdr-status-badge>
                             {{
-                            'catalog.run-pending-search-index-updates'
-                                | translate: {count: pendingSearchIndexUpdates}
+                                'catalog.run-pending-search-index-updates'
+                                    | translate: { count: pendingSearchIndexUpdates }
                             }}
                         </button>
                         <div class="dropdown-divider"></div>
@@ -53,7 +53,7 @@
         </div>
         <div class="flex wrap">
             <clr-checkbox-wrapper class="mt2">
-                <input type="checkbox" clrCheckbox [(ngModel)]="groupByProduct" (ngModelChange)="refresh()"/>
+                <input type="checkbox" clrCheckbox [(ngModel)]="groupByProduct" (ngModelChange)="refresh()" />
                 <label>{{ 'catalog.group-by-product' | translate }}</label>
             </clr-checkbox-wrapper>
             <vdr-language-selector
@@ -89,7 +89,12 @@
     (allSelectChange)="toggleSelectAll()"
 >
     <vdr-dt-column>
-        <vdr-bulk-action-menu locationId="product-list" [selection]="selectionManager.selection"></vdr-bulk-action-menu>
+        <vdr-bulk-action-menu
+            locationId="product-list"
+            [hostComponent]="this"
+            [selection]="selectionManager.selection"
+            (clearSelection)="selectionManager.clearSelection()"
+        ></vdr-bulk-action-menu>
     </vdr-dt-column>
     <vdr-dt-column></vdr-dt-column>
     <vdr-dt-column></vdr-dt-column>

+ 30 - 0
packages/admin-ui/src/lib/core/src/common/generated-types.ts

@@ -2456,6 +2456,10 @@ export type Mutation = {
   deleteProductOption: DeletionResponse;
   /** Delete a ProductVariant */
   deleteProductVariant: DeletionResponse;
+  /** Delete multiple ProductVariants */
+  deleteProductVariants: Array<DeletionResponse>;
+  /** Delete multiple Products */
+  deleteProducts: Array<DeletionResponse>;
   deletePromotion: DeletionResponse;
   /** Delete an existing Role */
   deleteRole: DeletionResponse;
@@ -2865,6 +2869,16 @@ export type MutationDeleteProductVariantArgs = {
 };
 
 
+export type MutationDeleteProductVariantsArgs = {
+  ids: Array<Scalars['ID']>;
+};
+
+
+export type MutationDeleteProductsArgs = {
+  ids: Array<Scalars['ID']>;
+};
+
+
 export type MutationDeletePromotionArgs = {
   id: Scalars['ID'];
 };
@@ -6965,6 +6979,16 @@ export type DeleteProductMutation = { deleteProduct: (
     & Pick<DeletionResponse, 'result' | 'message'>
   ) };
 
+export type DeleteProductsMutationVariables = Exact<{
+  ids: Array<Scalars['ID']> | Scalars['ID'];
+}>;
+
+
+export type DeleteProductsMutation = { deleteProducts: Array<(
+    { __typename?: 'DeletionResponse' }
+    & Pick<DeletionResponse, 'result' | 'message'>
+  )> };
+
 export type CreateProductVariantsMutationVariables = Exact<{
   input: Array<CreateProductVariantInput> | CreateProductVariantInput;
 }>;
@@ -10033,6 +10057,12 @@ export namespace DeleteProduct {
   export type DeleteProduct = (NonNullable<DeleteProductMutation['deleteProduct']>);
 }
 
+export namespace DeleteProducts {
+  export type Variables = DeleteProductsMutationVariables;
+  export type Mutation = DeleteProductsMutation;
+  export type DeleteProducts = NonNullable<(NonNullable<DeleteProductsMutation['deleteProducts']>)[number]>;
+}
+
 export namespace CreateProductVariants {
   export type Variables = CreateProductVariantsMutationVariables;
   export type Mutation = CreateProductVariantsMutation;

+ 4 - 0
packages/admin-ui/src/lib/core/src/common/utilities/selection-manager.ts

@@ -62,6 +62,10 @@ export class SelectionManager<T> {
         this._selection = items;
     }
 
+    clearSelection() {
+        this._selection = [];
+    }
+
     isSelected(item: T): boolean {
         return !!this._selection.find(a => this.options.itemsAreEqual(a, item));
     }

+ 9 - 0
packages/admin-ui/src/lib/core/src/data/definitions/product-definitions.ts

@@ -229,6 +229,15 @@ export const DELETE_PRODUCT = gql`
     }
 `;
 
+export const DELETE_PRODUCTS = gql`
+    mutation DeleteProducts($ids: [ID!]!) {
+        deleteProducts(ids: $ids) {
+            result
+            message
+        }
+    }
+`;
+
 export const CREATE_PRODUCT_VARIANTS = gql`
     mutation CreateProductVariants($input: [CreateProductVariantInput!]!) {
         createProductVariants(input: $input) {

+ 11 - 0
packages/admin-ui/src/lib/core/src/data/providers/product-data.service.ts

@@ -20,6 +20,7 @@ import {
     DeleteAssets,
     DeleteProduct,
     DeleteProductOption,
+    DeleteProducts,
     DeleteProductVariant,
     DeleteTag,
     GetAsset,
@@ -76,6 +77,7 @@ import {
     DELETE_PRODUCT,
     DELETE_PRODUCT_OPTION,
     DELETE_PRODUCT_VARIANT,
+    DELETE_PRODUCTS,
     DELETE_TAG,
     GET_ASSET,
     GET_ASSET_LIST,
@@ -255,6 +257,15 @@ export class ProductDataService {
         });
     }
 
+    deleteProducts(ids: string[]) {
+        return this.baseDataService.mutate<DeleteProducts.Mutation, DeleteProducts.Variables>(
+            DELETE_PRODUCTS,
+            {
+                ids,
+            },
+        );
+    }
+
     createProductVariants(input: CreateProductVariantInput[]) {
         return this.baseDataService.mutate<CreateProductVariants.Mutation, CreateProductVariants.Variables>(
             CREATE_PRODUCT_VARIANTS,

+ 27 - 6
packages/admin-ui/src/lib/core/src/providers/bulk-action-registry/bulk-action-types.ts

@@ -1,6 +1,5 @@
 import { Injector } from '@angular/core';
 import { ActivatedRoute } from '@angular/router';
-
 /**
  * @description
  * A valid location of a list view that supports the bulk actions API.
@@ -19,11 +18,33 @@ export type BulkActionLocationId = 'product-list' | 'order-list' | string;
  * @docsCategory bulk-actions
  * @docsPage BulkAction
  */
-export interface BulkActionClickContext<T> {
-    selection: T[];
+export interface BulkActionClickContext<ItemType, ComponentType> {
+    /**
+     * @description
+     * An array of the selected items from the list.
+     */
+    selection: ItemType[];
+    /**
+     * @description
+     * The component instance that is hosting the list view. For instance,
+     * `ProductListComponent`. This can be used to call methods on the instance,
+     * e.g. calling `hostComponent.refresh()` to force a list refresh after
+     * deleting the selected items.
+     */
+    hostComponent: ComponentType;
+    /**
+     * @description
+     * The Angular [Injector](https://angular.io/api/core/Injector) which can be used
+     * to get service instances which might be needed in the click handler.
+     */
+    injector: Injector;
+    /**
+     * @description
+     * Clears the selection in the active list view.
+     */
+    clearSelection: () => void;
     event: MouseEvent;
     route: ActivatedRoute;
-    injector: Injector;
 }
 
 /**
@@ -37,12 +58,12 @@ export interface BulkActionClickContext<T> {
  * @docsPage BulkAction
  * @docsWeight 0
  */
-export interface BulkAction<T = any> {
+export interface BulkAction<ItemType = any, ComponentType = any> {
     location: BulkActionLocationId;
     label: string;
     icon?: string;
     iconClass?: string;
-    onClick: (context: BulkActionClickContext<T>) => void;
+    onClick: (context: BulkActionClickContext<ItemType, ComponentType>) => void;
     /**
      * Control the display of this item based on the user permissions.
      */

+ 13 - 1
packages/admin-ui/src/lib/core/src/shared/components/bulk-action-menu/bulk-action-menu.component.ts

@@ -1,4 +1,12 @@
-import { ChangeDetectionStrategy, Component, Injector, Input, OnInit } from '@angular/core';
+import {
+    ChangeDetectionStrategy,
+    Component,
+    EventEmitter,
+    Injector,
+    Input,
+    OnInit,
+    Output,
+} from '@angular/core';
 import { ActivatedRoute } from '@angular/router';
 
 import { BulkActionRegistryService } from '../../../providers/bulk-action-registry/bulk-action-registry.service';
@@ -13,6 +21,8 @@ import { BulkAction, BulkActionLocationId } from '../../../providers/bulk-action
 export class BulkActionMenuComponent<T = any> implements OnInit {
     @Input() locationId: BulkActionLocationId;
     @Input() selection: T[];
+    @Input() hostComponent: any;
+    @Output() clearSelection = new EventEmitter<void>();
     actions: Array<BulkAction<T>>;
 
     constructor(
@@ -31,6 +41,8 @@ export class BulkActionMenuComponent<T = any> implements OnInit {
             event,
             route: this.route,
             selection: this.selection,
+            hostComponent: this.hostComponent,
+            clearSelection: () => this.clearSelection.next(),
         });
     }
 }

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

@@ -66,6 +66,7 @@
     "auto-update-product-variant-name": "Automaticky aktualizovat jména variant",
     "channel-price-preview": "Náhled ceny v kanálu",
     "collection-contents": "Obsah kolekce",
+    "confirm-bulk-delete-products": "",
     "confirm-cancel": "",
     "confirm-delete-administrator": "Smazat administrátora?",
     "confirm-delete-assets": "Smazat {count} {count, plural, one {médium} few {média} other {médií}}?",
@@ -78,6 +79,7 @@
     "confirm-delete-facet-value": "Smazat hodnotu atributu?",
     "confirm-delete-product": "Smazat produkt?",
     "confirm-delete-product-option": "",
+    "confirm-delete-product-option-group": "",
     "confirm-delete-product-variant": "Smazat variantu produktu?",
     "confirm-delete-promotion": "Smazat propagaci?",
     "confirm-delete-shipping-method": "Smazat dopravní metodu?",
@@ -226,6 +228,7 @@
     "no-results": "Žádné výsledky",
     "not-applicable": "",
     "not-set": "Nenastaveno",
+    "notify-bulk-delete-success": "",
     "notify-create-error": "Vyskytla se chyba, nebylo vytvořeno: { entity }",
     "notify-create-success": "Vytvořeno: { entity }",
     "notify-delete-error": "Vyskytla se chyba, nebylo smazáno: { entity }",

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

@@ -66,6 +66,7 @@
     "auto-update-product-variant-name": "Automatisch Namen der Produktvariante aktualisieren",
     "channel-price-preview": "Kanal-Preisvorschau",
     "collection-contents": "Inhalt der Sammlung",
+    "confirm-bulk-delete-products": "",
     "confirm-cancel": "",
     "confirm-delete-administrator": "Administrator löschen?",
     "confirm-delete-assets": "{count} {count, plural, one {Asset} other {Assets}} löschen?",
@@ -78,6 +79,7 @@
     "confirm-delete-facet-value": "Facettenwert löschen?",
     "confirm-delete-product": "Produkt löschen?",
     "confirm-delete-product-option": "",
+    "confirm-delete-product-option-group": "",
     "confirm-delete-product-variant": "Produktvariante löschen?",
     "confirm-delete-promotion": "Werbeaktion löschen?",
     "confirm-delete-shipping-method": "Versandart löschen?",
@@ -226,6 +228,7 @@
     "no-results": "Keine Ergebnisse",
     "not-applicable": "",
     "not-set": "Nicht festgelegt",
+    "notify-bulk-delete-success": "",
     "notify-create-error": "Ein Fehler ist aufgetreten, { entity } konnte nicht erstellt werden",
     "notify-create-success": "{ entity } erstellt",
     "notify-delete-error": "Ein Fehler ist aufgetreten, { entity } konnte nicht gelöscht werden",

+ 2 - 0
packages/admin-ui/src/lib/static/i18n-messages/en.json

@@ -66,6 +66,7 @@
     "auto-update-product-variant-name": "Automatically update the names of ProductVariants",
     "channel-price-preview": "Channel price preview",
     "collection-contents": "Collection contents",
+    "confirm-bulk-delete-products": "Delete {count} products?",
     "confirm-cancel": "Cancel?",
     "confirm-delete-administrator": "Delete administrator?",
     "confirm-delete-assets": "Delete {count} {count, plural, one {asset} other {assets}}?",
@@ -227,6 +228,7 @@
     "no-results": "No results",
     "not-applicable": "Not applicable",
     "not-set": "Not set",
+    "notify-bulk-delete-success": "Deleted { count } { entity }",
     "notify-create-error": "An error occurred, could not create { entity }",
     "notify-create-success": "Created new { entity }",
     "notify-delete-error": "An error occurred, could not delete { entity }",

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

@@ -66,6 +66,7 @@
     "auto-update-product-variant-name": "Actualiza los nombres de las variantes de producto automáticamente",
     "channel-price-preview": "Vista previa de precio para el canal de ventas",
     "collection-contents": "Contenidos de la colección",
+    "confirm-bulk-delete-products": "",
     "confirm-cancel": "",
     "confirm-delete-administrator": "¿Eliminar administrador?",
     "confirm-delete-assets": "¿Eliminar recurso?",
@@ -78,6 +79,7 @@
     "confirm-delete-facet-value": "¿Eliminar valor de faceta?",
     "confirm-delete-product": "¿Eliminar producto?",
     "confirm-delete-product-option": "",
+    "confirm-delete-product-option-group": "",
     "confirm-delete-product-variant": "¿Eliminar variante?",
     "confirm-delete-promotion": "¿Eliminar promoción?",
     "confirm-delete-shipping-method": "¿Eliminar método de envío?",
@@ -226,6 +228,7 @@
     "no-results": "Sin resultados",
     "not-applicable": "",
     "not-set": "Sin fijar",
+    "notify-bulk-delete-success": "",
     "notify-create-error": "Ha ocurrido un problema, imposible de crear { entity }",
     "notify-create-success": "Creado nuevo { entity }",
     "notify-delete-error": "Ha ocurrido un problema, imposible de eliminar { entity }",

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

@@ -66,6 +66,7 @@
     "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-bulk-delete-products": "",
     "confirm-cancel": "",
     "confirm-delete-administrator": "Supprimer administrateur?",
     "confirm-delete-assets": "Supprimer {count} {count, plural, one {fichier} other {fichiers}} ?",
@@ -78,6 +79,7 @@
     "confirm-delete-facet-value": "Supprimer valeur du composant ?",
     "confirm-delete-product": "Supprimer produit ?",
     "confirm-delete-product-option": "",
+    "confirm-delete-product-option-group": "",
     "confirm-delete-product-variant": "Supprimer variation du produit ?",
     "confirm-delete-promotion": "Supprimer promotion ?",
     "confirm-delete-shipping-method": "Supprimer mode d'expédition ?",
@@ -226,6 +228,7 @@
     "no-results": "Aucun resultat",
     "not-applicable": "",
     "not-set": "Non défini",
+    "notify-bulk-delete-success": "",
     "notify-create-error": "Une erreur est survenue, création de { entity } échouée",
     "notify-create-success": "Nouveau { entity } créé",
     "notify-delete-error": "Une erreur est survenue, suppression de { entity } échouée",

+ 3 - 0
packages/admin-ui/src/lib/static/i18n-messages/it.json

@@ -66,6 +66,7 @@
     "auto-update-product-variant-name": "Aggiorna automaticamente i nomi delle Varianti",
     "channel-price-preview": "Anteprima prezzo canale",
     "collection-contents": "Contenuti della Collezione",
+    "confirm-bulk-delete-products": "",
     "confirm-cancel": "",
     "confirm-delete-administrator": "Eliminare l'amministratore?",
     "confirm-delete-assets": "Eliminare {count} {count, plural, one {media} other {media}}?",
@@ -78,6 +79,7 @@
     "confirm-delete-facet-value": "Eliminare il valore attributo?",
     "confirm-delete-product": "Eliminare il prodotto?",
     "confirm-delete-product-option": "",
+    "confirm-delete-product-option-group": "",
     "confirm-delete-product-variant": "Eliminare la variante?",
     "confirm-delete-promotion": "Eliminare la promozione?",
     "confirm-delete-shipping-method": "Eliminare il metodo di spedizione?",
@@ -226,6 +228,7 @@
     "no-results": "Nessun risultato",
     "not-applicable": "",
     "not-set": "Non impostato",
+    "notify-bulk-delete-success": "",
     "notify-create-error": "Si è verificato un errore, impossibile creare { entity }",
     "notify-create-success": "Creato nuovo { entity }",
     "notify-delete-error": "Si è verificato un errore, impossibile cancellare { entity }",

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

@@ -66,6 +66,7 @@
     "auto-update-product-variant-name": "",
     "channel-price-preview": "Podgląd cen kanału",
     "collection-contents": "Zawartość kolekcji",
+    "confirm-bulk-delete-products": "",
     "confirm-cancel": "",
     "confirm-delete-administrator": "",
     "confirm-delete-assets": "",
@@ -78,6 +79,7 @@
     "confirm-delete-facet-value": "Usunąć wartość faseta?",
     "confirm-delete-product": "Usunąć produkt?",
     "confirm-delete-product-option": "",
+    "confirm-delete-product-option-group": "",
     "confirm-delete-product-variant": "Usunąć wariant produktu?",
     "confirm-delete-promotion": "Usunąć promocje?",
     "confirm-delete-shipping-method": "Usunąć metode wysyłki?",
@@ -226,6 +228,7 @@
     "no-results": "Brak wyników",
     "not-applicable": "",
     "not-set": "Nie ustawione",
+    "notify-bulk-delete-success": "",
     "notify-create-error": "Wystąpił błąd, nie można utworzyć { entity }",
     "notify-create-success": "Utworzono { entity }",
     "notify-delete-error": "Wystąpił błąd, nie można usunąć { entity }",

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

@@ -66,6 +66,7 @@
     "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-bulk-delete-products": "",
     "confirm-cancel": "",
     "confirm-delete-administrator": "Excluir administrador?",
     "confirm-delete-assets": "Excluir {count} {count, plural, one {asset} other {assets}}?",
@@ -78,6 +79,7 @@
     "confirm-delete-facet-value": "Excluir valor da etiqueta?",
     "confirm-delete-product": "Excluir produto?",
     "confirm-delete-product-option": "",
+    "confirm-delete-product-option-group": "",
     "confirm-delete-product-variant": "Excluir variação de produto?",
     "confirm-delete-promotion": "Excluir promoção?",
     "confirm-delete-shipping-method": "Excluir método de envio?",
@@ -226,6 +228,7 @@
     "no-results": "Sem resultados",
     "not-applicable": "",
     "not-set": "Não configurado",
+    "notify-bulk-delete-success": "",
     "notify-create-error": "Ocorreu um erro, não foi possível criar { entity }",
     "notify-create-success": "Criado novo { entity }",
     "notify-delete-error": "Ocorreu um erro, não foi possível excluir { entity }",

+ 3 - 0
packages/admin-ui/src/lib/static/i18n-messages/pt_PT.json

@@ -66,6 +66,7 @@
     "auto-update-product-variant-name": "Actualizar automaticamente os nomes das variantes do produto",
     "channel-price-preview": "Visualizar preço do canal",
     "collection-contents": "Conteúdo da categoria",
+    "confirm-bulk-delete-products": "",
     "confirm-cancel": "",
     "confirm-delete-administrator": "Eliminar administrador?",
     "confirm-delete-assets": "Eliminar {count} {count, plural, one {imagem} other {imagens}}?",
@@ -78,6 +79,7 @@
     "confirm-delete-facet-value": "Eliminar valor da etiqueta?",
     "confirm-delete-product": "Eliminar produto?",
     "confirm-delete-product-option": "",
+    "confirm-delete-product-option-group": "",
     "confirm-delete-product-variant": "Eliminar variante do produto?",
     "confirm-delete-promotion": "Eliminar promoção?",
     "confirm-delete-shipping-method": "Eliminar método de envio?",
@@ -226,6 +228,7 @@
     "no-results": "Nenhum resultado encontrado",
     "not-applicable": "",
     "not-set": "Não configurado",
+    "notify-bulk-delete-success": "",
     "notify-create-error": "Ocorreu um erro. Não foi possível criar { entity }",
     "notify-create-success": "Novo(a) { entity } adicionado(a)",
     "notify-delete-error": "Ocorreu um erro, não foi possível eliminar { entity }",

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

@@ -66,6 +66,7 @@
     "auto-update-product-variant-name": "Автоматически обновлять названия вариантов товара",
     "channel-price-preview": "Предварительный просмотр цен канала",
     "collection-contents": "Содержание коллекции",
+    "confirm-bulk-delete-products": "",
     "confirm-cancel": "",
     "confirm-delete-administrator": "Удалить администратора?",
     "confirm-delete-assets": "Удалить {count} {count, plural, one {медиа-объект} other {медиа-объектов}}?",
@@ -78,6 +79,7 @@
     "confirm-delete-facet-value": "Удалить значение тега?",
     "confirm-delete-product": "Удалить товар?",
     "confirm-delete-product-option": "",
+    "confirm-delete-product-option-group": "",
     "confirm-delete-product-variant": "Удалить вариант товара?",
     "confirm-delete-promotion": "Удалить промо-акцию?",
     "confirm-delete-shipping-method": "Удалить способ доставки?",
@@ -226,6 +228,7 @@
     "no-results": "Нет результатов",
     "not-applicable": "",
     "not-set": "Не задано",
+    "notify-bulk-delete-success": "",
     "notify-create-error": "Ошибка, не удалось создать { entity }",
     "notify-create-success": "Создано новое { entity }",
     "notify-delete-error": "Ошибка, не удалось удалить { entity }",

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

@@ -66,6 +66,7 @@
     "auto-update-product-variant-name": "Автоматично оновлювати назви варіантів товару",
     "channel-price-preview": "Попередній перегляд цін каналу",
     "collection-contents": "Зміст колекції",
+    "confirm-bulk-delete-products": "",
     "confirm-cancel": "",
     "confirm-delete-administrator": "Видалити адміністратора?",
     "confirm-delete-assets": "Видалити {count} {count, plural, one {медіа-об'єкт} other {медіа-об'єктів}}?",
@@ -78,6 +79,7 @@
     "confirm-delete-facet-value": "Видалити значення тегу?",
     "confirm-delete-product": "Видалити товар?",
     "confirm-delete-product-option": "",
+    "confirm-delete-product-option-group": "",
     "confirm-delete-product-variant": "Видалити варіант товару?",
     "confirm-delete-promotion": "Видалити промо-акцію?",
     "confirm-delete-shipping-method": "Видалити спосіб доставки?",
@@ -226,6 +228,7 @@
     "no-results": "Немає результатів",
     "not-applicable": "",
     "not-set": "Не задано",
+    "notify-bulk-delete-success": "",
     "notify-create-error": "Помилка, не вдалося створити { entity }",
     "notify-create-success": "Створено нове { entity }",
     "notify-delete-error": "Помилка, не вдалося видалити { entity }",

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

@@ -66,6 +66,7 @@
     "auto-update-product-variant-name": "自动更新不同商品变体名称",
     "channel-price-preview": "渠道价格预览",
     "collection-contents": "系列产品",
+    "confirm-bulk-delete-products": "",
     "confirm-cancel": "",
     "confirm-delete-administrator": "确认删除管理员吗?",
     "confirm-delete-assets": "确认删除{count}个资源吗?",
@@ -78,6 +79,7 @@
     "confirm-delete-facet-value": "确认删除特征值?",
     "confirm-delete-product": "确认删除商品?",
     "confirm-delete-product-option": "",
+    "confirm-delete-product-option-group": "",
     "confirm-delete-product-variant": "确认删除商品规格?",
     "confirm-delete-promotion": "确认删除优惠券?",
     "confirm-delete-shipping-method": "确认删除邮寄方式?",
@@ -226,6 +228,7 @@
     "no-results": "没找到任何结果",
     "not-applicable": "",
     "not-set": "未设置",
+    "notify-bulk-delete-success": "",
     "notify-create-error": "添加{ entity }失败",
     "notify-create-success": "{ entity }已添加",
     "notify-delete-error": "删除{ entity }失败",

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

@@ -66,6 +66,7 @@
     "auto-update-product-variant-name": "",
     "channel-price-preview": "渠道價格覽",
     "collection-contents": "系列產品",
+    "confirm-bulk-delete-products": "",
     "confirm-cancel": "",
     "confirm-delete-administrator": "",
     "confirm-delete-assets": "",
@@ -78,6 +79,7 @@
     "confirm-delete-facet-value": "確認移除特徵值?",
     "confirm-delete-product": "確認移除商品?",
     "confirm-delete-product-option": "",
+    "confirm-delete-product-option-group": "",
     "confirm-delete-product-variant": "確認移除商品規格?",
     "confirm-delete-promotion": "確認移除優惠券?",
     "confirm-delete-shipping-method": "確認移除此郵寄方式?",
@@ -226,6 +228,7 @@
     "no-results": "没找到任何結果",
     "not-applicable": "",
     "not-set": "未設定",
+    "notify-bulk-delete-success": "",
     "notify-create-error": "新增{ entity }失敗",
     "notify-create-success": "{ entity }已新增",
     "notify-delete-error": "移除{ entity }失敗",