ソースを参照

feat(admin-ui): Switch to products query for list view

Michael Bromley 2 年 前
コミット
cac8b3a037
26 ファイル変更212 行追加193 行削除
  1. 31 31
      packages/admin-ui/i18n-coverage.json
  2. 1 1
      packages/admin-ui/src/lib/catalog/src/components/collection-data-table/collection-data-table.component.html
  3. 10 0
      packages/admin-ui/src/lib/catalog/src/components/facet-list/facet-list.component.html
  4. 1 0
      packages/admin-ui/src/lib/catalog/src/components/facet-list/facet-list.component.ts
  5. 57 29
      packages/admin-ui/src/lib/catalog/src/components/product-list/product-list.component.html
  6. 2 0
      packages/admin-ui/src/lib/catalog/src/components/product-list/product-list.component.scss
  7. 59 30
      packages/admin-ui/src/lib/catalog/src/components/product-list/product-list.component.ts
  8. 2 2
      packages/admin-ui/src/lib/core/src/common/generated-types.ts
  9. 7 0
      packages/admin-ui/src/lib/core/src/data/definitions/product-definitions.ts
  10. 1 0
      packages/admin-ui/src/lib/core/src/shared/components/data-table-2/data-table2.component.html
  11. 1 1
      packages/admin-ui/src/lib/core/src/shared/components/data-table-2/data-table2.component.ts
  12. 0 8
      packages/admin-ui/src/lib/order/src/components/order-list/order-list.component.html
  13. 3 7
      packages/admin-ui/src/lib/static/i18n-messages/cs.json
  14. 3 7
      packages/admin-ui/src/lib/static/i18n-messages/de.json
  15. 3 6
      packages/admin-ui/src/lib/static/i18n-messages/en.json
  16. 3 7
      packages/admin-ui/src/lib/static/i18n-messages/es.json
  17. 3 7
      packages/admin-ui/src/lib/static/i18n-messages/fr.json
  18. 3 7
      packages/admin-ui/src/lib/static/i18n-messages/it.json
  19. 3 7
      packages/admin-ui/src/lib/static/i18n-messages/pl.json
  20. 3 7
      packages/admin-ui/src/lib/static/i18n-messages/pt_BR.json
  21. 3 7
      packages/admin-ui/src/lib/static/i18n-messages/pt_PT.json
  22. 3 7
      packages/admin-ui/src/lib/static/i18n-messages/ru.json
  23. 3 7
      packages/admin-ui/src/lib/static/i18n-messages/uk.json
  24. 3 7
      packages/admin-ui/src/lib/static/i18n-messages/zh_Hans.json
  25. 3 7
      packages/admin-ui/src/lib/static/i18n-messages/zh_Hant.json
  26. 1 1
      packages/dev-server/dev-config.ts

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

@@ -1,70 +1,70 @@
 {
-  "generatedOn": "2023-05-10T18:52:34.237Z",
-  "lastCommit": "39e22046182d30fe4359977e55175454ff82e239",
+  "generatedOn": "2023-05-11T18:09:21.483Z",
+  "lastCommit": "7cce542211604d55d932d0e5c2610a0f19cb2581",
   "translationStatus": {
     "cs": {
-      "tokenCount": 706,
-      "translatedCount": 568,
-      "percentage": 80
+      "tokenCount": 702,
+      "translatedCount": 566,
+      "percentage": 81
     },
     "de": {
-      "tokenCount": 706,
-      "translatedCount": 551,
+      "tokenCount": 702,
+      "translatedCount": 549,
       "percentage": 78
     },
     "en": {
-      "tokenCount": 706,
-      "translatedCount": 693,
-      "percentage": 98
+      "tokenCount": 702,
+      "translatedCount": 699,
+      "percentage": 100
     },
     "es": {
-      "tokenCount": 706,
-      "translatedCount": 596,
-      "percentage": 84
+      "tokenCount": 702,
+      "translatedCount": 594,
+      "percentage": 85
     },
     "fr": {
-      "tokenCount": 706,
-      "translatedCount": 588,
+      "tokenCount": 702,
+      "translatedCount": 586,
       "percentage": 83
     },
     "it": {
-      "tokenCount": 706,
-      "translatedCount": 594,
+      "tokenCount": 702,
+      "translatedCount": 592,
       "percentage": 84
     },
     "pl": {
-      "tokenCount": 706,
-      "translatedCount": 395,
+      "tokenCount": 702,
+      "translatedCount": 393,
       "percentage": 56
     },
     "pt_BR": {
-      "tokenCount": 706,
-      "translatedCount": 566,
+      "tokenCount": 702,
+      "translatedCount": 564,
       "percentage": 80
     },
     "pt_PT": {
-      "tokenCount": 706,
-      "translatedCount": 607,
+      "tokenCount": 702,
+      "translatedCount": 602,
       "percentage": 86
     },
     "ru": {
-      "tokenCount": 706,
-      "translatedCount": 593,
+      "tokenCount": 702,
+      "translatedCount": 591,
       "percentage": 84
     },
     "uk": {
-      "tokenCount": 706,
-      "translatedCount": 593,
+      "tokenCount": 702,
+      "translatedCount": 591,
       "percentage": 84
     },
     "zh_Hans": {
-      "tokenCount": 706,
-      "translatedCount": 536,
+      "tokenCount": 702,
+      "translatedCount": 534,
       "percentage": 76
     },
     "zh_Hant": {
-      "tokenCount": 706,
-      "translatedCount": 375,
+      "tokenCount": 702,
+      "translatedCount": 373,
       "percentage": 53
     }
   }

+ 1 - 1
packages/admin-ui/src/lib/catalog/src/components/collection-data-table/collection-data-table.component.html

@@ -131,7 +131,7 @@
 
 <ng-template #collectionRowTmp let-item="item" let-i="i" let-depth="depth">
     <tr #collectionRow cdkDrag [cdkDragData]="{ depth: depth, collection: item }" cdkDragBoundary="tbody">
-        <td *ngIf="selectionManager" class="selection-col" [class.active]="activeIndex === i">
+        <td *ngIf="selectionManager" class="flex" [class.active]="activeIndex === i">
             <div class="drag-handle" cdkDragHandle [title]="'catalog.reorder-collection' | translate">
                 <clr-icon shape="drag-handle"></clr-icon>
             </div>

+ 10 - 0
packages/admin-ui/src/lib/catalog/src/components/facet-list/facet-list.component.html

@@ -38,6 +38,16 @@
                 [searchTermControl]="searchTermControl"
                 [searchTermPlaceholder]="'catalog.filter-by-name' | translate"
             ></vdr-dt2-search>
+            <vdr-dt2-column [heading]="'common.id' | translate" [hiddenByDefault]="true" [sort]="sorts.get('id')">
+                <ng-template let-facet="item">
+                    {{ facet.id }}
+                </ng-template>
+            </vdr-dt2-column>
+            <vdr-dt2-column [heading]="'common.created-at' | translate" [hiddenByDefault]="true" [sort]="sorts.get('createdAt')">
+                <ng-template let-facet="item">
+                    {{ facet.createdAt | localeDate : 'short' }}
+                </ng-template>
+            </vdr-dt2-column>
             <vdr-dt2-column [heading]="'common.created-at' | translate" [hiddenByDefault]="true" [sort]="sorts.get('createdAt')">
                 <ng-template let-facet="item">
                     {{ facet.createdAt | localeDate : 'short' }}

+ 1 - 0
packages/admin-ui/src/lib/catalog/src/components/facet-list/facet-list.component.ts

@@ -46,6 +46,7 @@ export class FacetListComponent
     readonly sorts = this.dataTableService
         .createSortCollection<FacetSortParameter>()
         .defaultSort('createdAt', 'DESC')
+        .addSort({ name: 'id' })
         .addSort({ name: 'createdAt' })
         .addSort({ name: 'updatedAt' })
         .addSort({ name: 'name' })

+ 57 - 29
packages/admin-ui/src/lib/catalog/src/components/product-list/product-list.component.html

@@ -10,15 +10,22 @@
             {{ 'catalog.create-new-product' | translate }}
         </a>
     </vdr-page-title>
+       <!--<vdr-page-header-description>Description of the current page (if applicable)</vdr-page-header-description>-->
+         <vdr-page-header-tabs
+             [tabs]="[
+                 { id: 'products', label: 'catalog.products' | translate },
+                 { id: 'variants', label: 'catalog.product-variants' | translate }
+             ]"
+         ></vdr-page-header-tabs>
 </vdr-page-header>
 <vdr-page-body>
     <div class="flex wrap ml-4">
-        <clr-toggle-wrapper class="mt-2">
+        <!-- <clr-toggle-wrapper class="mt-2">
             <input type="checkbox" clrToggle [(ngModel)]="groupByProduct" (ngModelChange)="refresh()" />
             <label>
                 {{ 'catalog.group-by-product' | translate }}
             </label>
-        </clr-toggle-wrapper>
+        </clr-toggle-wrapper>-->
         <vdr-language-selector
             [availableLanguageCodes]="availableLanguages$ | async"
             [currentLanguageCode]="contentLanguage$ | async"
@@ -41,7 +48,7 @@
             [hostComponent]="this"
             [selectionManager]="selectionManager"
         ></vdr-bulk-action-menu>
-        <ng-template #vdrDt2CustomSearch>
+        <!--<ng-template #vdrDt2CustomSearch>
             <div class="search-form">
                 <vdr-product-search-input
                     #productSearchInputComponent
@@ -93,17 +100,39 @@
                     </vdr-dropdown-menu>
                 </vdr-dropdown>
             </div>
-        </ng-template>
+        </ng-template>-->
+        <vdr-dt2-search
+            [searchTermControl]="searchTermControl"
+            [searchTermPlaceholder]="'catalog.filter-by-name' | translate"
+        />
+        <vdr-dt2-column [heading]="'common.id' | translate" [hiddenByDefault]="true" [sort]="sorts.get('id')">
+            <ng-template let-product="item">
+                {{ product.id }}
+            </ng-template>
+        </vdr-dt2-column>
+        <vdr-dt2-column
+            [heading]="'common.created-at' | translate"
+            [hiddenByDefault]="true"
+            [sort]="sorts.get('createdAt')"
+        >
+            <ng-template let-product="item">
+                {{ product.createdAt | localeDate : 'short' }}
+            </ng-template>
+        </vdr-dt2-column>
+        <vdr-dt2-column
+            [heading]="'common.updated-at' | translate"
+            [hiddenByDefault]="true"
+            [sort]="sorts.get('updatedAt')"
+        >
+            <ng-template let-product="item">
+                {{ product.updatedAt | localeDate : 'short' }}
+            </ng-template>
+        </vdr-dt2-column>
         <vdr-dt2-column [heading]="'common.image' | translate">
-            <ng-template let-result="item">
+            <ng-template let-product="item">
                 <div class="image-placeholder">
                     <img
-                        *ngIf="
-                            groupByProduct
-                                ? result.productAsset
-                                : result.productVariantAsset || result.productAsset as asset;
-                            else imagePlaceholder
-                        "
+                        *ngIf="product.featuredAsset as asset; else imagePlaceholder"
                         [src]="asset | assetPreview : 'tiny'"
                     />
                     <ng-template #imagePlaceholder>
@@ -114,33 +143,32 @@
                 </div>
             </ng-template>
         </vdr-dt2-column>
-        <vdr-dt2-column [heading]="'catalog.name' | translate" [optional]="false">
-            <ng-template let-result="item">
-                <a class="button-ghost" [routerLink]="['./', result.productId]"
-                    ><span>{{ groupByProduct ? result.productName : result.productVariantName }}</span
+        <vdr-dt2-column [heading]="'catalog.name' | translate" [optional]="false" [sort]="sorts.get('name')">
+            <ng-template let-product="item">
+                <a class="button-ghost" [routerLink]="['./', product.id]"
+                    ><span>{{ product.name }}</span
                     ><clr-icon shape="arrow right"
                 /></a>
             </ng-template>
         </vdr-dt2-column>
-        <vdr-dt2-column [heading]="'catalog.sku' | translate" [optional]="false">
-            <ng-template let-result="item">
-                {{ result.sku }}
+        <vdr-dt2-column [heading]="'common.slug' | translate" [sort]="sorts.get('slug')">
+            <ng-template let-product="item">
+                {{ product.slug }}
             </ng-template>
         </vdr-dt2-column>
         <vdr-dt2-column [heading]="'common.enabled' | translate">
-            <ng-template let-result="item">
-                <vdr-chip *ngIf="!result.enabled">{{ 'common.disabled' | translate }}</vdr-chip>
+            <ng-template let-product="item">
+                <vdr-chip *ngIf="product.enabled" colorType="success">{{
+                    'common.enabled' | translate
+                }}</vdr-chip>
+                <vdr-chip *ngIf="!product.enabled" colorType="warning">{{
+                    'common.disabled' | translate
+                }}</vdr-chip>
             </ng-template>
         </vdr-dt2-column>
-        <vdr-dt2-column [heading]="'catalog.price' | translate">
-            <ng-template let-result="item">
-                <span *ngIf="result.priceWithTax.min"
-                    >{{ result.priceWithTax.min | localeCurrency : result.currencyCode }} -
-                    {{ result.priceWithTax.max | localeCurrency : result.currencyCode }}</span
-                >
-                <span *ngIf="result.priceWithTax.value">{{
-                    result.priceWithTax.value | localeCurrency : result.currencyCode
-                }}</span>
+        <vdr-dt2-column [heading]="'catalog.number-of-variants' | translate">
+            <ng-template let-product="item">
+                {{ 'catalog.variant-count' | translate : { count: product.variantList?.totalItems } }}
             </ng-template>
         </vdr-dt2-column>
     </vdr-data-table-2>

+ 2 - 0
packages/admin-ui/src/lib/catalog/src/components/product-list/product-list.component.scss

@@ -6,6 +6,8 @@
 .image-placeholder {
     width: 50px;
     height: 50px;
+    margin-top: calc(var(--space-unit) * -1);
+    margin-bottom: calc(var(--space-unit) * -1);
     background-color: var(--color-component-bg-200);
     img {
         border-radius: var(--border-radius-img);

+ 59 - 30
packages/admin-ui/src/lib/catalog/src/components/product-list/product-list.component.ts

@@ -4,23 +4,23 @@ import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
 import {
     BaseListComponent,
     DataService,
+    GetProductListQuery,
+    GetProductListQueryVariables,
     ItemOf,
     JobQueueService,
     JobState,
     LanguageCode,
-    LogicalOperator,
     ModalService,
     NotificationService,
-    OrderFilterParameter,
+    ProductFilterParameter,
     ProductSearchInputComponent,
-    SearchInput,
+    ProductSortParameter,
     SearchProductsQuery,
-    SearchProductsQueryVariables,
     SelectionManager,
     ServerConfigService,
 } from '@vendure/admin-ui/core';
 import { EMPTY, Observable } from 'rxjs';
-import { delay, map, switchMap, take, takeUntil, tap, withLatestFrom } from 'rxjs/operators';
+import { delay, map, switchMap, takeUntil, tap } from 'rxjs/operators';
 import { DataTableService } from '../../../../core/src/providers/data-table/data-table.service';
 
 export type SearchItem = ItemOf<SearchProductsQuery, 'search'>;
@@ -31,7 +31,11 @@ export type SearchItem = ItemOf<SearchProductsQuery, 'search'>;
     styleUrls: ['./product-list.component.scss'],
 })
 export class ProductListComponent
-    extends BaseListComponent<SearchProductsQuery, SearchItem, SearchProductsQueryVariables>
+    extends BaseListComponent<
+        GetProductListQuery,
+        ItemOf<GetProductListQuery, 'products'>,
+        GetProductListQueryVariables
+    >
     implements OnInit, AfterViewInit
 {
     searchTerm = '';
@@ -48,14 +52,37 @@ export class ProductListComponent
             this.groupByProduct ? a.productId === b.productId : a.productVariantId === b.productVariantId,
         additiveMode: true,
     });
-    readonly filters = this.dataTableFilterService
-        .createFilterCollection<SearchInput>()
+    readonly filters = this.dataTableService
+        .createFilterCollection<ProductFilterParameter>()
+        .addDateFilters()
         .addFilter({
-            name: 'collectionSlug',
+            name: 'id',
             type: { kind: 'text' },
-            label: _('catalog.collection-slug'),
-            filterField: 'collectionSlug',
+            label: _('common.id'),
+            filterField: 'id',
         })
+        .addFilter({
+            name: 'enabled',
+            type: { kind: 'boolean' },
+            label: _('common.enabled'),
+            filterField: 'enabled',
+        })
+        .addFilter({
+            name: 'slug',
+            type: { kind: 'text' },
+            label: _('common.slug'),
+            filterField: 'slug',
+        })
+        .connectToRoute(this.route);
+
+    readonly sorts = this.dataTableService
+        .createSortCollection<ProductSortParameter>()
+        .defaultSort('createdAt', 'DESC')
+        .addSort({ name: 'id' })
+        .addSort({ name: 'createdAt' })
+        .addSort({ name: 'updatedAt' })
+        .addSort({ name: 'name' })
+        .addSort({ name: 'slug' })
         .connectToRoute(this.route);
 
     @ViewChild('productSearchInputComponent', { static: true })
@@ -67,7 +94,7 @@ export class ProductListComponent
         private notificationService: NotificationService,
         private jobQueueService: JobQueueService,
         private serverConfigService: ServerConfigService,
-        private dataTableFilterService: DataTableService,
+        private dataTableService: DataTableService,
         router: Router,
         route: ActivatedRoute,
     ) {
@@ -92,19 +119,21 @@ export class ProductListComponent
             }
         });
         super.setQueryFn(
-            (...args: any[]) =>
-                this.dataService.product.searchProducts(this.searchTerm, ...args).refetchOnChannelChange(),
-            data => data.search,
+            (args: any) => this.dataService.product.getProducts(args).refetchOnChannelChange(),
+            data => data.products,
             // eslint-disable-next-line @typescript-eslint/no-shadow
             (skip, take) => ({
-                input: {
+                options: {
                     skip,
                     take,
-                    term: this.searchTerm,
-                    facetValueIds: this.facetValueIds,
-                    facetValueOperator: LogicalOperator.AND,
-                    groupByProduct: this.groupByProduct,
-                } as SearchInput,
+                    filter: {
+                        name: {
+                            contains: this.searchTermControl.value,
+                        },
+                        ...this.filters.createFilterInput(),
+                    },
+                    sort: this.sorts.createSortInput(),
+                },
             }),
         );
     }
@@ -112,25 +141,25 @@ export class ProductListComponent
     ngOnInit() {
         super.ngOnInit();
 
-        this.facetValues$ = this.result$.pipe(map(data => data.search.facetValues));
-
-        this.facetValues$
-            .pipe(take(1), delay(100), withLatestFrom(this.selectedFacetValueIds$))
-            .subscribe(([__, ids]) => {
-                this.productSearchInput.setFacetValues(ids);
-            });
+        // this.facetValues$ = this.result$.pipe(map(data => data.search.facetValues));
+        //
+        // this.facetValues$
+        //     .pipe(take(1), delay(100), withLatestFrom(this.selectedFacetValueIds$))
+        //     .subscribe(([__, ids]) => {
+        //         this.productSearchInput.setFacetValues(ids);
+        //     });
         this.availableLanguages$ = this.serverConfigService.getAvailableLanguages();
         this.contentLanguage$ = this.dataService.client
             .uiState()
             .mapStream(({ uiState }) => uiState.contentLanguage)
             .pipe(tap(() => this.refresh()));
 
-        this.filters.valueChanges.subscribe(() => this.refresh());
-
         this.dataService.product
             .getPendingSearchIndexUpdates()
             .mapSingle(({ pendingSearchIndexUpdates }) => pendingSearchIndexUpdates)
             .subscribe(value => (this.pendingSearchIndexUpdates = value));
+
+        super.refreshListOnChanges(this.contentLanguage$, this.filters.valueChanges, this.sorts.valueChanges);
     }
 
     ngAfterViewInit() {

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

@@ -7322,7 +7322,7 @@ export type GetProductListQueryVariables = Exact<{
 }>;
 
 
-export type GetProductListQuery = { products: { __typename?: 'ProductList', totalItems: number, items: Array<{ __typename?: 'Product', id: string, createdAt: any, updatedAt: any, enabled: boolean, languageCode: LanguageCode, name: string, slug: string, featuredAsset?: { __typename?: 'Asset', id: string, createdAt: any, updatedAt: any, preview: string } | null }> } };
+export type GetProductListQuery = { products: { __typename?: 'ProductList', totalItems: number, items: Array<{ __typename?: 'Product', id: string, createdAt: any, updatedAt: any, enabled: boolean, languageCode: LanguageCode, name: string, slug: string, featuredAsset?: { __typename?: 'Asset', id: string, createdAt: any, updatedAt: any, preview: string, focalPoint?: { __typename?: 'Coordinate', x: number, y: number } | null } | null, variantList: { __typename?: 'ProductVariantList', totalItems: number } }> } };
 
 export type GetProductOptionGroupsQueryVariables = Exact<{
   filterTerm?: InputMaybe<Scalars['String']>;
@@ -7558,7 +7558,7 @@ export type GetCountryListQueryVariables = Exact<{
 }>;
 
 
-export type GetCountryListQuery = { countries: { __typename?: 'CountryList', totalItems: number, items: Array<{ __typename?: 'Country', id: string, code: string, name: string, enabled: boolean }> } };
+export type GetCountryListQuery = { countries: { __typename?: 'CountryList', totalItems: number, items: Array<{ __typename?: 'Country', id: string, createdAt: any, updatedAt: any, code: string, name: string, enabled: boolean }> } };
 
 export type GetAvailableCountriesQueryVariables = Exact<{ [key: string]: never; }>;
 

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

@@ -380,6 +380,13 @@ export const GET_PRODUCT_LIST = gql`
                     createdAt
                     updatedAt
                     preview
+                    focalPoint {
+                        x
+                        y
+                    }
+                }
+                variantList {
+                    totalItems
                 }
             }
             totalItems

+ 1 - 0
packages/admin-ui/src/lib/core/src/shared/components/data-table-2/data-table2.component.html

@@ -79,6 +79,7 @@
                     let item of items
                         | paginate
                             : {
+                                  id: id,
                                   itemsPerPage: itemsPerPage,
                                   currentPage: currentPage,
                                   totalItems: totalItems

+ 1 - 1
packages/admin-ui/src/lib/core/src/shared/components/data-table-2/data-table2.component.ts

@@ -197,7 +197,7 @@ export class DataTable2Component<T> implements AfterContentInit, OnChanges, OnIn
                 this.changeDetectorRef.markForCheck();
             });
         }
-        this.showSearchFilterRow = dataTableConfig?.[this.id].showSearchFilterRow ?? false;
+        this.showSearchFilterRow = dataTableConfig?.[this.id]?.showSearchFilterRow ?? false;
     }
 
     toggleSearchFilterRow() {

+ 0 - 8
packages/admin-ui/src/lib/order/src/components/order-list/order-list.component.html

@@ -8,14 +8,6 @@
             </a>
         </ng-container>
     </vdr-page-title>
-    <!--   <vdr-page-header-description>Description of the current page (if applicable)</vdr-page-header-description>
-       <vdr-page-header-tabs
-           [tabs]="[
-               { id: 'tab1', label: 'Tab 1' },
-               { id: 'tab2', label: 'Tab 2' },
-               { id: 'tab3', label: 'Tab 3' }
-           ]"
-       ></vdr-page-header-tabs>-->
 </vdr-page-header>
 <vdr-page-body>
     <vdr-data-table-2

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

@@ -70,7 +70,6 @@
     "auto-update-product-variant-name": "Automaticky aktualizovat jména variant",
     "channel-price-preview": "Náhled ceny v kanálu",
     "collection-contents": "Obsah kolekce",
-    "collection-slug": "",
     "confirm-bulk-delete": "",
     "confirm-bulk-delete-collections": "",
     "confirm-bulk-delete-products": "",
@@ -105,7 +104,6 @@
     "filter-by-name-or-sku": "Filtrovat dle jména nebo SKU",
     "filter-inheritance": "",
     "filters": "Filtry",
-    "group-by-product": "Seskupovat varianty",
     "inherit-filters-from-parent": "",
     "live-preview-contents": "",
     "manage-variants": "Správa variant",
@@ -129,12 +127,12 @@
     "notify-remove-product-from-channel-success": "Produkt byl úspěšně odebrán z kanálu",
     "notify-remove-variant-from-channel-error": "Variantu se nepovedlo odebrat z kanálu",
     "notify-remove-variant-from-channel-success": "Varianta byla úspěšně odebrána z kanálu",
+    "number-of-variants": "",
     "option": "Volba",
     "option-name": "Jméno volby",
     "option-values": "Hodnoty volby",
     "out-of-stock-threshold": "Prahová hodnota pro vyprodání zásob",
     "out-of-stock-threshold-tooltip": "Nastaví hodnotu skladu, při které je tato varianta považována za vyprodanou. Použití záporné hodnoty umožňuje objednávat \"na objednávku\".",
-    "pending-search-index-updates": "",
     "price": "Cena",
     "price-conversion-factor": "Přepočítávací koeficient ceny",
     "price-in-channel": "Cena v { channel }",
@@ -145,7 +143,6 @@
     "product-name": "Jméno produktu",
     "product-variants": "Varianty produktu",
     "public": "Veřejný",
-    "rebuild-search-index": "Regenerovat vyhledávací index",
     "reindex-error": "Při regeneraci vyhledávacího indexu došlo k chybě",
     "reindex-successful": "Zaindexováno: {count, plural, one {varianta produktu} other {{count} variant produktu}} během {time}ms",
     "reindexing": "Regenerovat vyhledávací index",
@@ -155,11 +152,9 @@
     "remove-product-variant-from-channel": "Odebrat variantu z kanálu",
     "reorder-collection": "",
     "root-collection": "",
-    "run-pending-search-index-updates": "",
     "running-search-index-updates": "",
     "search-asset-name-or-tag": "",
     "search-for-term": "Hledat výraz",
-    "search-index-controls": "",
     "search-product-name-or-code": "Hledat produkt dle jména, nebo kódu",
     "select-product": "",
     "select-product-variant": "",
@@ -183,6 +178,7 @@
     "use-global-value": "Dle globálního nastavení",
     "values": "Hodnoty",
     "variant": "Varianta",
+    "variant-count": "",
     "view-contents": "Zobrazit obsah",
     "visibility": "Viditelnost"
   },
@@ -291,6 +287,7 @@
     "remove-item-from-list": "Odebrat položku ze seznamu",
     "results-count": "{ count } {count, plural, one {výsledek} other {výsledků/y}}",
     "sample-formatting": "",
+    "search-and-filter-list": "",
     "search-by-name": "",
     "select": "Vybrat...",
     "select-display-language": "Vyberte jazyk",
@@ -665,7 +662,6 @@
     "default-tax-zone": "Výchozí daňová zóna",
     "eligible": "Způsobilé",
     "email-address": "E-mailová adresa",
-    "emailAddress": "",
     "first-name": "Jméno",
     "fulfillment-handler": "Způsob zpracování",
     "global-out-of-stock-threshold": "Globální prahová hodnota pro vyprodání zásob",

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

@@ -70,7 +70,6 @@
     "auto-update-product-variant-name": "Automatisch Namen der Produktvariante aktualisieren",
     "channel-price-preview": "Kanal-Preisvorschau",
     "collection-contents": "Inhalt der Sammlung",
-    "collection-slug": "",
     "confirm-bulk-delete": "",
     "confirm-bulk-delete-collections": "",
     "confirm-bulk-delete-products": "",
@@ -105,7 +104,6 @@
     "filter-by-name-or-sku": "Nach Name oder Artikelnummer filtern",
     "filter-inheritance": "",
     "filters": "Filter",
-    "group-by-product": "Nach Produkt gruppieren",
     "inherit-filters-from-parent": "",
     "live-preview-contents": "",
     "manage-variants": "Varianten verwalten",
@@ -129,12 +127,12 @@
     "notify-remove-product-from-channel-success": "Das Produkt wurde erfolgreich aus dem Kanal entfernt",
     "notify-remove-variant-from-channel-error": "Die Produktvariante konnte nicht aus dem Kanal entfernt werden",
     "notify-remove-variant-from-channel-success": "Die Produktvariante wurde erfolgreich aus dem Kanal entfernt",
+    "number-of-variants": "",
     "option": "Option",
     "option-name": "Optionsname",
     "option-values": "Optionswerte",
     "out-of-stock-threshold": "Ausverkauft-Grenze",
     "out-of-stock-threshold-tooltip": "Legt fest, ab welcher Untergrenze ein Produkt als ausverkauft angezeigt wird. Ein negativer Wert kann verwendet werden, um mit einer Fehlmenge zu arbeiten.",
-    "pending-search-index-updates": "",
     "price": "Preis",
     "price-conversion-factor": "Preisumwandlungsfaktor",
     "price-in-channel": "Preis in { channel }",
@@ -145,7 +143,6 @@
     "product-name": "Produktname",
     "product-variants": "Produktvarianten",
     "public": "Öffentlich",
-    "rebuild-search-index": "Suchindex neu aufbauen",
     "reindex-error": "Beim Neuaufbau des Suchindex ist ein Fehler aufgetreten",
     "reindex-successful": "{count, plural, one {Produktvariante} other {{count} Produktvarianten}} indiziert in {time}ms",
     "reindexing": "Suchindex wird neu aufgebaut",
@@ -155,11 +152,9 @@
     "remove-product-variant-from-channel": "",
     "reorder-collection": "",
     "root-collection": "",
-    "run-pending-search-index-updates": "",
     "running-search-index-updates": "",
     "search-asset-name-or-tag": "",
     "search-for-term": "Suche nach Begriff",
-    "search-index-controls": "",
     "search-product-name-or-code": "Suche nach Produktname oder Artikelnummer",
     "select-product": "Produkt auswählen",
     "select-product-variant": "Produktvariante auswählen",
@@ -183,6 +178,7 @@
     "use-global-value": "Globalen Wert anwenden",
     "values": "Werte",
     "variant": "Variante",
+    "variant-count": "",
     "view-contents": "Inhalt anzeigen",
     "visibility": "Sichtbarkeit"
   },
@@ -291,6 +287,7 @@
     "remove-item-from-list": "Artikel von Liste entfernen",
     "results-count": "{ count } {count, plural, one {Ergebnis} other {Ergebnisse}}",
     "sample-formatting": "",
+    "search-and-filter-list": "",
     "search-by-name": "",
     "select": "Auswählen...",
     "select-display-language": "Anzeigesprache wählen",
@@ -665,7 +662,6 @@
     "default-tax-zone": "Standard-Steuerzone",
     "eligible": "Verfügbar",
     "email-address": "E-Mail-Adresse",
-    "emailAddress": "",
     "first-name": "Vorname",
     "fulfillment-handler": "Abwicklung über",
     "global-out-of-stock-threshold": "Globale ausverkauft-Grenze",

+ 3 - 6
packages/admin-ui/src/lib/static/i18n-messages/en.json

@@ -70,7 +70,6 @@
     "auto-update-product-variant-name": "Automatically update the names of ProductVariants",
     "channel-price-preview": "Channel price preview",
     "collection-contents": "Collection contents",
-    "collection-slug": "Collection slug",
     "confirm-bulk-delete": "Delete multiple items?",
     "confirm-bulk-delete-collections": "Delete {count} collections?",
     "confirm-bulk-delete-products": "Delete {count} products?",
@@ -105,7 +104,6 @@
     "filter-by-name-or-sku": "Filter by name or SKU",
     "filter-inheritance": "Filter inheritance",
     "filters": "Filters",
-    "group-by-product": "Group by product",
     "inherit-filters-from-parent": "Inherit filters from parent",
     "live-preview-contents": "Live-preview contents",
     "manage-variants": "Manage variants",
@@ -129,12 +127,12 @@
     "notify-remove-product-from-channel-success": "Successfully removed product from channel",
     "notify-remove-variant-from-channel-error": "Could not remove product variant from channel",
     "notify-remove-variant-from-channel-success": "Successfully removed product variant from channel",
+    "number-of-variants": "# variants",
     "option": "Option",
     "option-name": "Option name",
     "option-values": "Option values",
     "out-of-stock-threshold": "Out-of-stock threshold",
     "out-of-stock-threshold-tooltip": "Sets the stock level at which this variant is considered to be out of stock. Using a negative value enables backorder support.",
-    "pending-search-index-updates": "Search index has pending updates to run",
     "price": "Price",
     "price-conversion-factor": "Price conversion factor",
     "price-in-channel": "Price in { channel }",
@@ -145,7 +143,6 @@
     "product-name": "Product name",
     "product-variants": "Product variants",
     "public": "Public",
-    "rebuild-search-index": "Rebuild search index",
     "reindex-error": "An error occurred while rebuilding search index",
     "reindex-successful": "Indexed {count, plural, one {product variant} other {{count} product variants}} in {time}ms",
     "reindexing": "Rebuilding search index",
@@ -155,11 +152,9 @@
     "remove-product-variant-from-channel": "Remove product variant from channel",
     "reorder-collection": "Re-order collection",
     "root-collection": "Root collection",
-    "run-pending-search-index-updates": "Run {count, plural, one {1 pending update} other {{count} pending updates}}",
     "running-search-index-updates": "Running {count, plural, one {1 update} other {{count} updates}} to search index",
     "search-asset-name-or-tag": "Search by asset name or tags",
     "search-for-term": "Search for term",
-    "search-index-controls": "Search index controls",
     "search-product-name-or-code": "Search by product name or code",
     "select-product": "Select product",
     "select-product-variant": "Select product variant",
@@ -183,6 +178,7 @@
     "use-global-value": "Use global value",
     "values": "Values",
     "variant": "Variant",
+    "variant-count": "{count, plural, one {1 variant} other {{count} variants}}",
     "view-contents": "View contents",
     "visibility": "Visibility"
   },
@@ -291,6 +287,7 @@
     "remove-item-from-list": "Remove item from list",
     "results-count": "{ count } {count, plural, one {result} other {results}}",
     "sample-formatting": "Sample formatting",
+    "search-and-filter-list": "Search and filter this list",
     "search-by-name": "Search by name",
     "select": "Select...",
     "select-display-language": "Select display language",

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

@@ -70,7 +70,6 @@
     "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",
-    "collection-slug": "",
     "confirm-bulk-delete": "",
     "confirm-bulk-delete-collections": "",
     "confirm-bulk-delete-products": "",
@@ -105,7 +104,6 @@
     "filter-by-name-or-sku": "Filtrar por código de referencia",
     "filter-inheritance": "",
     "filters": "Filtros",
-    "group-by-product": "Agrupar por producto",
     "inherit-filters-from-parent": "",
     "live-preview-contents": "",
     "manage-variants": "Gestionar variantes",
@@ -129,12 +127,12 @@
     "notify-remove-product-from-channel-success": "Producto eliminado del canal con éxito",
     "notify-remove-variant-from-channel-error": "No fue posible eliminar la variante de producto del canal",
     "notify-remove-variant-from-channel-success": "Variante de producto eliminada del canal con éxito",
+    "number-of-variants": "",
     "option": "Opción",
     "option-name": "Nombre de la opción",
     "option-values": "Valores de la opción",
     "out-of-stock-threshold": "Límite de agotamiento de existencias",
     "out-of-stock-threshold-tooltip": "Fija el nivel de existencias a partir del cual se considera que esta variante está agotada. El uso de un valor negativo activa el soporte de pedidos pendientes.",
-    "pending-search-index-updates": "",
     "price": "Precio",
     "price-conversion-factor": "Factor de conversión de precio",
     "price-in-channel": "Precio en { channel }",
@@ -145,7 +143,6 @@
     "product-name": "Nombre del producto",
     "product-variants": "Variantes de producto",
     "public": "Público",
-    "rebuild-search-index": "Reconstruir índice de búsqueda",
     "reindex-error": "Ha ocurrido un error reconstruyendo el índice de búsqueda",
     "reindex-successful": "Indexado {count, plural, one {variante} other {{count} variantes}} en {time}ms",
     "reindexing": "Reconstruyendo índice de búsqueda",
@@ -155,11 +152,9 @@
     "remove-product-variant-from-channel": "Eliminar variante de producto del canal de ventas ",
     "reorder-collection": "",
     "root-collection": "",
-    "run-pending-search-index-updates": "",
     "running-search-index-updates": "",
     "search-asset-name-or-tag": "Buscar por nombre de recurso o faceta",
     "search-for-term": "Buscar por término",
-    "search-index-controls": "",
     "search-product-name-or-code": "Buscar por nombre o código de producto",
     "select-product": "Seleccionar producto",
     "select-product-variant": "Seleccionar variante de producto",
@@ -183,6 +178,7 @@
     "use-global-value": "Usar valor global",
     "values": "Valores",
     "variant": "Variantes",
+    "variant-count": "",
     "view-contents": "Ver contenidos",
     "visibility": "Visibilidad"
   },
@@ -291,6 +287,7 @@
     "remove-item-from-list": "Eliminar elemento de la lista",
     "results-count": "{ count } {count, plural, one {resultado} other {resultados}}",
     "sample-formatting": "",
+    "search-and-filter-list": "",
     "search-by-name": "",
     "select": "Seleccionar...",
     "select-display-language": "Seleccionar idioma de interfaz",
@@ -665,7 +662,6 @@
     "default-tax-zone": "Zona de impuestos por defecto",
     "eligible": "Disponible",
     "email-address": "Dirección de email",
-    "emailAddress": "",
     "first-name": "Nombre",
     "fulfillment-handler": "Gestor de ejecución de pedidos",
     "global-out-of-stock-threshold": "Límite agotamiento de existencias",

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

@@ -70,7 +70,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",
-    "collection-slug": "",
     "confirm-bulk-delete": "",
     "confirm-bulk-delete-collections": "",
     "confirm-bulk-delete-products": "",
@@ -105,7 +104,6 @@
     "filter-by-name-or-sku": "Filtrer par nom ou UGS",
     "filter-inheritance": "",
     "filters": "Filtres",
-    "group-by-product": "Grouper par produit",
     "inherit-filters-from-parent": "",
     "live-preview-contents": "",
     "manage-variants": "Gérer les variations",
@@ -129,12 +127,12 @@
     "notify-remove-product-from-channel-success": "Retrait du produit du canal réussi",
     "notify-remove-variant-from-channel-error": "Retrait de la variation du produit du canal échoué",
     "notify-remove-variant-from-channel-success": "Retrait de la variation du produit du canal réussi",
+    "number-of-variants": "",
     "option": "Option",
     "option-name": "Nom de l'option",
     "option-values": "Valeurs de l'option",
     "out-of-stock-threshold": "Limite de la rupture de stock",
     "out-of-stock-threshold-tooltip": "Régler le niveau de stock à partir duquel la variante est considéré en rupture de stock. Renseigner une valeur négative permet d'accepter des commandes en attente.",
-    "pending-search-index-updates": "",
     "price": "Prix",
     "price-conversion-factor": "Facteur de conversion du prix",
     "price-in-channel": "Prix dans { channel }",
@@ -145,7 +143,6 @@
     "product-name": "Nom du produit",
     "product-variants": "Variations du produit",
     "public": "Public",
-    "rebuild-search-index": "Reconstruire l'index de recherche",
     "reindex-error": "Une erreur s'est produite lors de la reconstruction de l'index de recherche",
     "reindex-successful": "Indexation {count, plural, one {d'une variation de produit} other {de {count} variations de produit}} en {time} ms",
     "reindexing": "Reconstruction de l'index de recherche",
@@ -155,11 +152,9 @@
     "remove-product-variant-from-channel": "Retirer la variante du produit du canal",
     "reorder-collection": "",
     "root-collection": "",
-    "run-pending-search-index-updates": "",
     "running-search-index-updates": "",
     "search-asset-name-or-tag": "Rechercher par nom de fichier ou mot-clé",
     "search-for-term": "Chercher le terme",
-    "search-index-controls": "",
     "search-product-name-or-code": "Chercher par nom de produit ou code",
     "select-product": "Sélectionner un produit",
     "select-product-variant": "Sélectionner une variation produit",
@@ -183,6 +178,7 @@
     "use-global-value": "Utiliser la valeur globale",
     "values": "Valeurs",
     "variant": "Variante",
+    "variant-count": "",
     "view-contents": "Voir les produits",
     "visibility": "Visibilité"
   },
@@ -291,6 +287,7 @@
     "remove-item-from-list": "Retirer l'article de la liste",
     "results-count": "{ count } {count, plural, one {resultat} other {resultats}}",
     "sample-formatting": "",
+    "search-and-filter-list": "",
     "search-by-name": "",
     "select": "Selectionner...",
     "select-display-language": "Choisir la langue d'affichage",
@@ -665,7 +662,6 @@
     "default-tax-zone": "Zone de taxe par défaut",
     "eligible": "Eligible",
     "email-address": "Adresse email",
-    "emailAddress": "",
     "first-name": "Prénom",
     "fulfillment-handler": "Gestionnaire de remplissage",
     "global-out-of-stock-threshold": "Limite de rupture de stock globale",

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

@@ -70,7 +70,6 @@
     "auto-update-product-variant-name": "Aggiorna automaticamente i nomi delle Varianti",
     "channel-price-preview": "Anteprima prezzo canale",
     "collection-contents": "Contenuti della Collezione",
-    "collection-slug": "",
     "confirm-bulk-delete": "",
     "confirm-bulk-delete-collections": "",
     "confirm-bulk-delete-products": "",
@@ -105,7 +104,6 @@
     "filter-by-name-or-sku": "Filtra per nome o SKU",
     "filter-inheritance": "",
     "filters": "Filtri",
-    "group-by-product": "Raggruppa per prodotto",
     "inherit-filters-from-parent": "",
     "live-preview-contents": "",
     "manage-variants": "Gestione varianti",
@@ -129,12 +127,12 @@
     "notify-remove-product-from-channel-success": "Prodotto rimosso dal canale",
     "notify-remove-variant-from-channel-error": "Impossibile rimuovere la variante dal canale",
     "notify-remove-variant-from-channel-success": "Variante rimossa dal canale",
+    "number-of-variants": "",
     "option": "Opzione",
     "option-name": "Nome opzione",
     "option-values": "Valori opzione",
     "out-of-stock-threshold": "Soglia prodotto esaurito",
     "out-of-stock-threshold-tooltip": "Imposta la soglia di scorte alla quale il prodotto è considerato non disponibile alla vendita. Utilizzando un valore negativo si abilitano gli ordini anche fuori scorta.",
-    "pending-search-index-updates": "",
     "price": "Prezzo",
     "price-conversion-factor": "Fattore di conversione del prezzo",
     "price-in-channel": "Prezzo in { channel }",
@@ -145,7 +143,6 @@
     "product-name": "Nome del Prodotto",
     "product-variants": "Varianti del Prodotto",
     "public": "Pubblico",
-    "rebuild-search-index": "Ricostruisci indice di ricerca",
     "reindex-error": "Si è verificato un errore nella ricostruzione dell'indice di ricerca",
     "reindex-successful": "{count, plural, one {Indicizzata una variante prodotto} other {Indicizzate {count} varianti prodotto}} in {time}ms",
     "reindexing": "Ricostruzione indice",
@@ -155,11 +152,9 @@
     "remove-product-variant-from-channel": "Rimuovi variante dal canale",
     "reorder-collection": "",
     "root-collection": "",
-    "run-pending-search-index-updates": "",
     "running-search-index-updates": "",
     "search-asset-name-or-tag": "Cerca per nome o tag del media",
     "search-for-term": "Ricerca termine",
-    "search-index-controls": "",
     "search-product-name-or-code": "Ricerca per nome o codice prodotto",
     "select-product": "Seleziona prodotto",
     "select-product-variant": "Seleziona variante",
@@ -183,6 +178,7 @@
     "use-global-value": "Usa valore generale",
     "values": "Valori",
     "variant": "Variante",
+    "variant-count": "",
     "view-contents": "Mostra contenuti",
     "visibility": "Visibilità"
   },
@@ -291,6 +287,7 @@
     "remove-item-from-list": "Rimuovi elemento dalla lista",
     "results-count": "{ count } {count, plural, one {risultato} other {risultati}}",
     "sample-formatting": "",
+    "search-and-filter-list": "",
     "search-by-name": "",
     "select": "Seleziona...",
     "select-display-language": "Seleziona lingua",
@@ -665,7 +662,6 @@
     "default-tax-zone": "Zona di tassazione predefinita",
     "eligible": "Compatibile",
     "email-address": "Indirizzo email",
-    "emailAddress": "",
     "first-name": "Nome",
     "fulfillment-handler": "Gestore spedizione",
     "global-out-of-stock-threshold": "Soglia globale di indisponibilità",

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

@@ -70,7 +70,6 @@
     "auto-update-product-variant-name": "",
     "channel-price-preview": "Podgląd cen kanału",
     "collection-contents": "Zawartość kolekcji",
-    "collection-slug": "",
     "confirm-bulk-delete": "",
     "confirm-bulk-delete-collections": "",
     "confirm-bulk-delete-products": "",
@@ -105,7 +104,6 @@
     "filter-by-name-or-sku": "",
     "filter-inheritance": "",
     "filters": "Filtry",
-    "group-by-product": "Grupuj po produkcie",
     "inherit-filters-from-parent": "",
     "live-preview-contents": "",
     "manage-variants": "Zarządzaj wariantami",
@@ -129,12 +127,12 @@
     "notify-remove-product-from-channel-success": "Produkt pomyślnie usunięty z kanału",
     "notify-remove-variant-from-channel-error": "",
     "notify-remove-variant-from-channel-success": "",
+    "number-of-variants": "",
     "option": "Opcje",
     "option-name": "Nazwa opcji",
     "option-values": "Wartość opcji",
     "out-of-stock-threshold": "",
     "out-of-stock-threshold-tooltip": "",
-    "pending-search-index-updates": "",
     "price": "Cena",
     "price-conversion-factor": "Przelicznik cen",
     "price-in-channel": "Cena w { channel }",
@@ -145,7 +143,6 @@
     "product-name": "Nazwa produktu",
     "product-variants": "Warianty produktu",
     "public": "",
-    "rebuild-search-index": "Przebuduj indeksy wyszukiwania",
     "reindex-error": "Wystąpił błąd podczas przebudowania indeksów",
     "reindex-successful": "Zaindeksowano {count, plural, one {wariant produktu} other {{count} wariantów produktu}} w {time}ms",
     "reindexing": "Przebudowuje indeksy wyszukiwania",
@@ -155,11 +152,9 @@
     "remove-product-variant-from-channel": "",
     "reorder-collection": "",
     "root-collection": "",
-    "run-pending-search-index-updates": "",
     "running-search-index-updates": "",
     "search-asset-name-or-tag": "",
     "search-for-term": "Szukaj frazy",
-    "search-index-controls": "",
     "search-product-name-or-code": "Szukaj produktu po nazwie lub kodzie",
     "select-product": "",
     "select-product-variant": "",
@@ -183,6 +178,7 @@
     "use-global-value": "",
     "values": "Wartości",
     "variant": "Warianty",
+    "variant-count": "",
     "view-contents": "Zobacz zawartość",
     "visibility": "Widoczność"
   },
@@ -291,6 +287,7 @@
     "remove-item-from-list": "",
     "results-count": "{ count } {count, plural, one {wynik} other {wyników}}",
     "sample-formatting": "",
+    "search-and-filter-list": "",
     "search-by-name": "",
     "select": "Wybrano...",
     "select-display-language": "Wybierz język",
@@ -665,7 +662,6 @@
     "default-tax-zone": "Domyślna strefa podatkowa",
     "eligible": "Wybieralny",
     "email-address": "Email",
-    "emailAddress": "",
     "first-name": "Imię",
     "fulfillment-handler": "",
     "global-out-of-stock-threshold": "",

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

@@ -70,7 +70,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",
-    "collection-slug": "",
     "confirm-bulk-delete": "",
     "confirm-bulk-delete-collections": "",
     "confirm-bulk-delete-products": "",
@@ -105,7 +104,6 @@
     "filter-by-name-or-sku": "Filtrar por nome ou SKU",
     "filter-inheritance": "",
     "filters": "Filtros",
-    "group-by-product": "Agrupar por produto",
     "inherit-filters-from-parent": "",
     "live-preview-contents": "",
     "manage-variants": "Gerência das variações",
@@ -129,12 +127,12 @@
     "notify-remove-product-from-channel-success": "Produto removido com sucesso do canal",
     "notify-remove-variant-from-channel-error": "Erro ao remover variação do canal",
     "notify-remove-variant-from-channel-success": "Variação removida com sucesso do canal",
+    "number-of-variants": "",
     "option": "Opção",
     "option-name": "Nome da opção",
     "option-values": "Valor da opção",
     "out-of-stock-threshold": "Limite reserva de fora de estoque",
     "out-of-stock-threshold-tooltip": "Define o nível de estoque no qual essa variação é considerada sem estoque. Usar um valor negativo ativa o suporte a pedidos em espera.",
-    "pending-search-index-updates": "",
     "price": "Preço",
     "price-conversion-factor": "Fator de conversão de preço",
     "price-in-channel": "Preço em { channel }",
@@ -145,7 +143,6 @@
     "product-name": "Nome do produto",
     "product-variants": "Variações do produto",
     "public": "Público",
-    "rebuild-search-index": "Reconstruir índice de pesquisa",
     "reindex-error": "Ocorreu um erro ao recriar o índice de pesquisa",
     "reindex-successful": "Indexado {count, plural, one {product variant} other {{count} product variants}} em {time}ms",
     "reindexing": "Reconstruindo o índice de pesquisa",
@@ -155,11 +152,9 @@
     "remove-product-variant-from-channel": "",
     "reorder-collection": "",
     "root-collection": "",
-    "run-pending-search-index-updates": "",
     "running-search-index-updates": "",
     "search-asset-name-or-tag": "",
     "search-for-term": "Pesquisar termo",
-    "search-index-controls": "",
     "search-product-name-or-code": "Pesquisar por nome ou código do produto",
     "select-product": "",
     "select-product-variant": "",
@@ -183,6 +178,7 @@
     "use-global-value": "Usar configuração global",
     "values": "Valores",
     "variant": "Variação",
+    "variant-count": "",
     "view-contents": "Visualizar conteúdo",
     "visibility": "Visibilidade"
   },
@@ -291,6 +287,7 @@
     "remove-item-from-list": "",
     "results-count": "{ count } {count, plural, one {result} other {results}}",
     "sample-formatting": "",
+    "search-and-filter-list": "",
     "search-by-name": "",
     "select": "Selecione...",
     "select-display-language": "Selecionar idioma de exibição",
@@ -665,7 +662,6 @@
     "default-tax-zone": "Zona de imposto padrão",
     "eligible": "Elegível",
     "email-address": "Email",
-    "emailAddress": "",
     "first-name": "Nome",
     "fulfillment-handler": "Manipulador de preenchimento",
     "global-out-of-stock-threshold": "Limite global de falta de estoque",

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

@@ -70,7 +70,6 @@
     "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",
-    "collection-slug": "",
     "confirm-bulk-delete": "",
     "confirm-bulk-delete-collections": "",
     "confirm-bulk-delete-products": "",
@@ -105,7 +104,6 @@
     "filter-by-name-or-sku": "Filtrar por nome ou SKU",
     "filter-inheritance": "",
     "filters": "Filtros",
-    "group-by-product": "Agrupar por produto",
     "inherit-filters-from-parent": "",
     "live-preview-contents": "",
     "manage-variants": "Gerir variações",
@@ -129,12 +127,12 @@
     "notify-remove-product-from-channel-success": "Produto removido do canal com sucesso",
     "notify-remove-variant-from-channel-error": "Erro ao remover a variante do canal",
     "notify-remove-variant-from-channel-success": "Variante removida do canal com sucesso",
+    "number-of-variants": "",
     "option": "Opção",
     "option-name": "Nome da opção",
     "option-values": "Valor da opção",
     "out-of-stock-threshold": "Limite para fora de estoque",
     "out-of-stock-threshold-tooltip": "Define o limite para a variante ser considerada sem estoque. Usar um valor negativo activa o suporte a pedidos pendentes.",
-    "pending-search-index-updates": "O índice de pesquisa tem atualizações pendentes para executar",
     "price": "Preço",
     "price-conversion-factor": "Factor de conversão de preço",
     "price-in-channel": "Preço no canal { channel }",
@@ -145,7 +143,6 @@
     "product-name": "Nome do produto",
     "product-variants": "Variações do produto",
     "public": "Público",
-    "rebuild-search-index": "Reconstruir índice de pesquisa",
     "reindex-error": "Ocorreu um erro ao reconstruir o índice de pesquisa",
     "reindex-successful": "{count, plural, one {Variante do produto indexada} other {{count} variantes de produtos indexadas}} em {time}ms",
     "reindexing": "A reconstruir o índice de pesquisa",
@@ -155,11 +152,9 @@
     "remove-product-variant-from-channel": "Remover variante do canal?",
     "reorder-collection": "",
     "root-collection": "",
-    "run-pending-search-index-updates": "Executar {count, plural, one {1 actualização pendente} other {{count} actualizações pendentes}}",
     "running-search-index-updates": "A executar {count, plural, one {1 actualização} other {{count} actualizações}}",
     "search-asset-name-or-tag": "Pesquisar pelo nome ou tag",
     "search-for-term": "Pesquisar termo",
-    "search-index-controls": "Controles de índice de pesquisa",
     "search-product-name-or-code": "Pesquisar por nome ou código do produto",
     "select-product": "Seleccione o produto",
     "select-product-variant": "Seleccione a variante do produto",
@@ -183,6 +178,7 @@
     "use-global-value": "Utilizar configuração global",
     "values": "Valores",
     "variant": "Variante",
+    "variant-count": "",
     "view-contents": "Visualizar conteúdo",
     "visibility": "Visibilidade"
   },
@@ -291,6 +287,7 @@
     "remove-item-from-list": "Remover item da lista",
     "results-count": "{ count } {count, plural, one {resultado} other {resultados}}",
     "sample-formatting": "Formatação de amostra",
+    "search-and-filter-list": "",
     "search-by-name": "",
     "select": "Seleccione...",
     "select-display-language": "Seleccionar idioma",
@@ -665,7 +662,6 @@
     "default-tax-zone": "Região de imposto padrão",
     "eligible": "Elegível",
     "email-address": "E-mail",
-    "emailAddress": "",
     "first-name": "Nome",
     "fulfillment-handler": "Manipulador para a execução de envio",
     "global-out-of-stock-threshold": "Limite globalpara fora de estoque",

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

@@ -70,7 +70,6 @@
     "auto-update-product-variant-name": "Автоматически обновлять названия вариантов товара",
     "channel-price-preview": "Предварительный просмотр цен канала",
     "collection-contents": "Содержание коллекции",
-    "collection-slug": "",
     "confirm-bulk-delete": "",
     "confirm-bulk-delete-collections": "",
     "confirm-bulk-delete-products": "",
@@ -105,7 +104,6 @@
     "filter-by-name-or-sku": "Фильтр по имени или артикулу (SKU)",
     "filter-inheritance": "",
     "filters": "Фильтры",
-    "group-by-product": "Группировать по товару",
     "inherit-filters-from-parent": "",
     "live-preview-contents": "",
     "manage-variants": "Управление вариантами",
@@ -129,12 +127,12 @@
     "notify-remove-product-from-channel-success": "Товар успешно удален из канала",
     "notify-remove-variant-from-channel-error": "Не удалось удалить вариант товара из канала",
     "notify-remove-variant-from-channel-success": "Вариант товара успешно удален из канала",
+    "number-of-variants": "",
     "option": "Опции",
     "option-name": "Имя опции",
     "option-values": "Значение опции",
     "out-of-stock-threshold": "Порог «нет в наличии»",
     "out-of-stock-threshold-tooltip": "Установите порог остатков на складе, после которого будет считаться, что варианта товара нет в наличии. При использовании отрицательного значения порога, включается поддержка предзаказа.",
-    "pending-search-index-updates": "",
     "price": "Цена",
     "price-conversion-factor": "Коэффициент пересчета цены",
     "price-in-channel": "Цена в { channel }",
@@ -145,7 +143,6 @@
     "product-name": "Имя товара",
     "product-variants": "Вариант товара",
     "public": "Публичный",
-    "rebuild-search-index": "Перестроить поисковый индекс",
     "reindex-error": "Произошла ошибка при перестройке индекса поиска",
     "reindex-successful": "Проиндексировано {count, plural, one {вариант товара} other {{count} вариантов товара}} за {time}мс",
     "reindexing": "Перестройка поискового индекса",
@@ -155,11 +152,9 @@
     "remove-product-variant-from-channel": "Удалить вариант товара из канала",
     "reorder-collection": "",
     "root-collection": "",
-    "run-pending-search-index-updates": "",
     "running-search-index-updates": "",
     "search-asset-name-or-tag": "Поиск по названию медиа-объект или тегам",
     "search-for-term": "Искать по фразе",
-    "search-index-controls": "",
     "search-product-name-or-code": "Поиск по названию товара или коду",
     "select-product": "Выбрать товара",
     "select-product-variant": "Выберите вариант товара",
@@ -183,6 +178,7 @@
     "use-global-value": "Использовать глобальное значение",
     "values": "Значения",
     "variant": "Вариант",
+    "variant-count": "",
     "view-contents": "Просмотр содержимого",
     "visibility": "Видимость"
   },
@@ -291,6 +287,7 @@
     "remove-item-from-list": "Удалить позицию из списка",
     "results-count": "{ count } {count, plural, one {результат} other {результатов}}",
     "sample-formatting": "",
+    "search-and-filter-list": "",
     "search-by-name": "",
     "select": "Выбрать...",
     "select-display-language": "Выберите язык отображения",
@@ -665,7 +662,6 @@
     "default-tax-zone": "Налоговая зона по умолчанию",
     "eligible": "Имеющий право",
     "email-address": "Адрес электронной почты",
-    "emailAddress": "",
     "first-name": "Имя",
     "fulfillment-handler": "Обработчик выполнения",
     "global-out-of-stock-threshold": "Глобальный порог отсутствия на складе",

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

@@ -70,7 +70,6 @@
     "auto-update-product-variant-name": "Автоматично оновлювати назви варіантів товару",
     "channel-price-preview": "Попередній перегляд цін каналу",
     "collection-contents": "Зміст колекції",
-    "collection-slug": "",
     "confirm-bulk-delete": "",
     "confirm-bulk-delete-collections": "",
     "confirm-bulk-delete-products": "",
@@ -105,7 +104,6 @@
     "filter-by-name-or-sku": "Фільтр по імені або артикулу (SKU)",
     "filter-inheritance": "",
     "filters": "Фільтри",
-    "group-by-product": "Групувати по товару",
     "inherit-filters-from-parent": "",
     "live-preview-contents": "",
     "manage-variants": "Управління варіантами",
@@ -129,12 +127,12 @@
     "notify-remove-product-from-channel-success": "Товар успішно видалений з каналу",
     "notify-remove-variant-from-channel-error": "Не вдалося видалити варіант товару з каналу",
     "notify-remove-variant-from-channel-success": "Варіант товару успішно видалений з каналу",
+    "number-of-variants": "",
     "option": "Опції",
     "option-name": "Ім'я опції",
     "option-values": "Значення опції",
     "out-of-stock-threshold": "Поріг «немає в наявності»",
     "out-of-stock-threshold-tooltip": "Встановіть поріг залишків на складі, після якого буде вважатися, що варіанту товару немає в наявності. При використанні від'ємного значення порога, включається підтримка попереднього замовлення.",
-    "pending-search-index-updates": "",
     "price": "Ціна",
     "price-conversion-factor": "Коефіцієнт перерахунку ціни",
     "price-in-channel": "Ціна в { channel }",
@@ -145,7 +143,6 @@
     "product-name": "Ім'я товару",
     "product-variants": "Варіант товару",
     "public": "Публічний",
-    "rebuild-search-index": "Перебудувати пошуковий індекс",
     "reindex-error": "Помилка при перебудові індексу пошуку",
     "reindex-successful": "Проіндексовано {count, plural, one {варіант товару} other {{count} варіантів товару}} за {time}мс",
     "reindexing": "Перебудова пошукового індексу",
@@ -155,11 +152,9 @@
     "remove-product-variant-from-channel": "Видалити варіант товару з каналу",
     "reorder-collection": "",
     "root-collection": "",
-    "run-pending-search-index-updates": "",
     "running-search-index-updates": "",
     "search-asset-name-or-tag": "Пошук за назвою медіа-об'єкта або тегами",
     "search-for-term": "Шукати по фразі",
-    "search-index-controls": "",
     "search-product-name-or-code": "Пошук за назвою товару або кодом",
     "select-product": "Вибрати товар",
     "select-product-variant": "Виберіть варіант товару",
@@ -183,6 +178,7 @@
     "use-global-value": "Використовувати глобальне значення",
     "values": "Значення",
     "variant": "Варіант",
+    "variant-count": "",
     "view-contents": "Перегляд вмісту",
     "visibility": "Видимість"
   },
@@ -291,6 +287,7 @@
     "remove-item-from-list": "Видалити позицію зі списку",
     "results-count": "{ count } {count, plural, one {результат} other {результатів}}",
     "sample-formatting": "",
+    "search-and-filter-list": "",
     "search-by-name": "",
     "select": "Вибрати...",
     "select-display-language": "Виберіть мову відображення",
@@ -665,7 +662,6 @@
     "default-tax-zone": "Податкова зона за замовчуванням",
     "eligible": "Який має право",
     "email-address": "Адреса електронної пошти",
-    "emailAddress": "",
     "first-name": "Ім'я",
     "fulfillment-handler": "Обробник виконання",
     "global-out-of-stock-threshold": "Глобальний поріг відсутності на складі",

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

@@ -70,7 +70,6 @@
     "auto-update-product-variant-name": "自动更新不同商品变体名称",
     "channel-price-preview": "渠道价格预览",
     "collection-contents": "系列产品",
-    "collection-slug": "",
     "confirm-bulk-delete": "",
     "confirm-bulk-delete-collections": "",
     "confirm-bulk-delete-products": "",
@@ -105,7 +104,6 @@
     "filter-by-name-or-sku": "按名字或商品编码过滤",
     "filter-inheritance": "",
     "filters": "过滤条件",
-    "group-by-product": "按商品分组显示",
     "inherit-filters-from-parent": "",
     "live-preview-contents": "",
     "manage-variants": "商品规格管理",
@@ -129,12 +127,12 @@
     "notify-remove-product-from-channel-success": "成功从渠道中移除商品",
     "notify-remove-variant-from-channel-error": "从渠道中移除商品变体失败",
     "notify-remove-variant-from-channel-success": "成功从渠道中移除商品变体",
+    "number-of-variants": "",
     "option": "规格",
     "option-name": "规格名称",
     "option-values": "规格列表(按回车键添加)",
     "out-of-stock-threshold": "售空限制",
     "out-of-stock-threshold-tooltip": "当此规格产品库存值低于此限制时,产品将为售空状态。设置为负数设置此规格产品为缺货状态。",
-    "pending-search-index-updates": "",
     "price": "价格",
     "price-conversion-factor": "价格换算因数",
     "price-in-channel": "渠道{ channel }价格",
@@ -145,7 +143,6 @@
     "product-name": "商品名称",
     "product-variants": "商品规格",
     "public": "公开",
-    "rebuild-search-index": "重建索引",
     "reindex-error": "重建索引失败",
     "reindex-successful": "已成功重建{count}个产品索引,耗时{time}毫秒",
     "reindexing": "正在重建搜索索引",
@@ -155,11 +152,9 @@
     "remove-product-variant-from-channel": "从销售渠道移除商品变体",
     "reorder-collection": "",
     "root-collection": "",
-    "run-pending-search-index-updates": "",
     "running-search-index-updates": "",
     "search-asset-name-or-tag": "输入要搜索的资源名称或标签",
     "search-for-term": "输入搜索条目",
-    "search-index-controls": "",
     "search-product-name-or-code": "输入要搜索的商品名称或商品编码",
     "select-product": "选择商品",
     "select-product-variant": "选择商品变体",
@@ -183,6 +178,7 @@
     "use-global-value": "使用系统默认值",
     "values": "值",
     "variant": "商品规格",
+    "variant-count": "",
     "view-contents": "查看详情",
     "visibility": "访问控制"
   },
@@ -291,6 +287,7 @@
     "remove-item-from-list": "从列表中移除",
     "results-count": "{count, plural, =0{无} other {{count}个过滤结果}}",
     "sample-formatting": "",
+    "search-and-filter-list": "",
     "search-by-name": "",
     "select": "选择...",
     "select-display-language": "选择显示语言",
@@ -665,7 +662,6 @@
     "default-tax-zone": "默认销售区域",
     "eligible": "符合条件",
     "email-address": "电子邮件",
-    "emailAddress": "",
     "first-name": "名",
     "fulfillment-handler": "",
     "global-out-of-stock-threshold": "默认售空限制",

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

@@ -70,7 +70,6 @@
     "auto-update-product-variant-name": "",
     "channel-price-preview": "渠道價格覽",
     "collection-contents": "系列產品",
-    "collection-slug": "",
     "confirm-bulk-delete": "",
     "confirm-bulk-delete-collections": "",
     "confirm-bulk-delete-products": "",
@@ -105,7 +104,6 @@
     "filter-by-name-or-sku": "",
     "filter-inheritance": "",
     "filters": "篩選條件",
-    "group-by-product": "按商品分组顯示",
     "inherit-filters-from-parent": "",
     "live-preview-contents": "",
     "manage-variants": "商品規格管理",
@@ -129,12 +127,12 @@
     "notify-remove-product-from-channel-success": "成功從渠道中移除商品",
     "notify-remove-variant-from-channel-error": "",
     "notify-remove-variant-from-channel-success": "",
+    "number-of-variants": "",
     "option": "規格",
     "option-name": "規格名稱",
     "option-values": "規格列表(按輸入鍵新增)",
     "out-of-stock-threshold": "",
     "out-of-stock-threshold-tooltip": "",
-    "pending-search-index-updates": "",
     "price": "價格",
     "price-conversion-factor": "價格轉換係數",
     "price-in-channel": "渠道{ channel }價格",
@@ -145,7 +143,6 @@
     "product-name": "商品名稱",
     "product-variants": "商品規格",
     "public": "公開",
-    "rebuild-search-index": "重建索引",
     "reindex-error": "重建索引失敗",
     "reindex-successful": "已成功重建{count}個產品索引,耗时{time}毫秒",
     "reindexing": "正在重建搜索索引",
@@ -155,11 +152,9 @@
     "remove-product-variant-from-channel": "",
     "reorder-collection": "",
     "root-collection": "",
-    "run-pending-search-index-updates": "",
     "running-search-index-updates": "",
     "search-asset-name-or-tag": "",
     "search-for-term": "輸入搜索條目",
-    "search-index-controls": "",
     "search-product-name-or-code": "輸入要搜索的商品名稱或商品編碼",
     "select-product": "",
     "select-product-variant": "",
@@ -183,6 +178,7 @@
     "use-global-value": "",
     "values": "值",
     "variant": "商品規格",
+    "variant-count": "",
     "view-contents": "查看詳情",
     "visibility": "訪問控制"
   },
@@ -291,6 +287,7 @@
     "remove-item-from-list": "",
     "results-count": "{count, plural, =0{無} other {{count}個篩選結果}}",
     "sample-formatting": "",
+    "search-and-filter-list": "",
     "search-by-name": "",
     "select": "選擇...",
     "select-display-language": "選擇顯示語言",
@@ -665,7 +662,6 @@
     "default-tax-zone": "默認銷售區域",
     "eligible": "符合條件",
     "email-address": "電子郵件",
-    "emailAddress": "",
     "first-name": "名",
     "fulfillment-handler": "",
     "global-out-of-stock-threshold": "",

+ 1 - 1
packages/dev-server/dev-config.ts

@@ -122,7 +122,7 @@ function getDbConfig(): DataSourceOptions {
         case 'postgres':
             console.log('Using postgres connection');
             return {
-                synchronize: true,
+                synchronize: false,
                 type: 'postgres',
                 host: process.env.DB_HOST || 'localhost',
                 port: Number(process.env.DB_PORT) || 5432,