Browse Source

Merge branch 'master' into minor

Michael Bromley 2 years ago
parent
commit
5148bac3a5

+ 19 - 0
CHANGELOG.md

@@ -1,3 +1,22 @@
+## <small>2.0.7 (2023-09-08)</small>
+
+
+#### Fixes
+
+* **admin-ui** Add custom field support to Customer list ([298e90c](https://github.com/vendure-ecommerce/vendure/commit/298e90c))
+* **admin-ui** Added and improved Italian translations (#2371) ([19292a8](https://github.com/vendure-ecommerce/vendure/commit/19292a8)), closes [#2371](https://github.com/vendure-ecommerce/vendure/issues/2371)
+* **admin-ui** Correct handling of ID filters in data tables ([52ddd96](https://github.com/vendure-ecommerce/vendure/commit/52ddd96))
+* **admin-ui** Data table filters react to page navigation ([2471350](https://github.com/vendure-ecommerce/vendure/commit/2471350))
+* **admin-ui** Fix alignment of facet value chip ([7eb43ef](https://github.com/vendure-ecommerce/vendure/commit/7eb43ef))
+* **admin-ui** Fix channel switcher icon style ([6e70794](https://github.com/vendure-ecommerce/vendure/commit/6e70794))
+* **admin-ui** Fix filter shortcut triggering from rich text component ([e6f95b3](https://github.com/vendure-ecommerce/vendure/commit/e6f95b3)), closes [#2384](https://github.com/vendure-ecommerce/vendure/issues/2384)
+* **admin-ui** Fix styling of custom field tabs ([ef3d2f9](https://github.com/vendure-ecommerce/vendure/commit/ef3d2f9))
+* **admin-ui** Reinstate multi-deletion of Assets ([a203e50](https://github.com/vendure-ecommerce/vendure/commit/a203e50)), closes [#380](https://github.com/vendure-ecommerce/vendure/issues/380)
+* **admin-ui** Use appropriate default values for custom fields ([85a8866](https://github.com/vendure-ecommerce/vendure/commit/85a8866)), closes [#2362](https://github.com/vendure-ecommerce/vendure/issues/2362)
+* **admin-ui** Aligns items horizontally in the Chip component ([19d3e51](https://github.com/vendure-ecommerce/vendure/commit/19d3e51))
+* **admin-ui** Add price field on variation dialog modal (#2378) ([5b99bae](https://github.com/vendure-ecommerce/vendure/commit/5b99bae)), closes [#2378](https://github.com/vendure-ecommerce/vendure/issues/2378)
+* **core** Fix channel association on promotion update (#2376) ([47e688d](https://github.com/vendure-ecommerce/vendure/commit/47e688d)), closes [#2376](https://github.com/vendure-ecommerce/vendure/issues/2376)
+
 ## <small>2.0.6 (2023-08-11)</small>
 
 

+ 11 - 21
packages/admin-ui/src/lib/catalog/src/components/create-product-variant-dialog/create-product-variant-dialog.component.html

@@ -4,21 +4,12 @@
 <form [formGroup]="form">
     <div formGroupName="options" class="form-grid">
         <vdr-form-field [label]="optionGroup.name" *ngFor="let optionGroup of product.optionGroups">
-            <ng-select
-                [items]="optionGroup.options"
-                [formControlName]="optionGroup.code"
-                bindLabel="name"
-                bindValue="id"
-                appendTo="body"
-            >
+            <ng-select [items]="optionGroup.options" [formControlName]="optionGroup.code" bindLabel="name"
+                bindValue="id" appendTo="body">
             </ng-select>
         </vdr-form-field>
-        <clr-alert
-            *ngIf="product.optionGroups.length === 0"
-            clrAlertType="warning"
-            [clrAlertClosable]="false"
-            class="form-grid-span"
-        >
+        <clr-alert *ngIf="product.optionGroups.length === 0" clrAlertType="warning" [clrAlertClosable]="false"
+            class="form-grid-span">
             <clr-alert-item>
                 <span class="alert-text">
                     {{ 'catalog.cannot-create-variants-without-options' | translate }}
@@ -31,7 +22,7 @@
             <clr-alert-item>
                 <span class="alert-text">
                     {{ 'catalog.product-variant-exists' | translate }}: {{ existingVariant.name }} ({{
-                        existingVariant.sku
+                    existingVariant.sku
                     }})
                 </span>
             </clr-alert-item>
@@ -44,16 +35,15 @@
         <vdr-form-field [label]="'catalog.sku' | translate">
             <input type="text" formControlName="sku" />
         </vdr-form-field>
+        <vdr-form-field [label]="'catalog.price' | translate">
+            <vdr-currency-input name="price" [currencyCode]="currencyCode" formControlName="price" />
+        </vdr-form-field>
     </div>
 </form>
 <ng-template vdrDialogButtons>
     <button type="button" class="btn" (click)="cancel()">{{ 'common.cancel' | translate }}</button>
-    <button
-        type="submit"
-        (click)="confirm()"
-        class="btn btn-primary"
-        [disabled]="form.invalid || existingVariant || product.optionGroups.length === 0"
-    >
+    <button type="submit" (click)="confirm()" class="btn btn-primary"
+        [disabled]="form.invalid || existingVariant || product.optionGroups.length === 0">
         {{ 'common.confirm' | translate }}
     </button>
-</ng-template>
+</ng-template>

+ 15 - 4
packages/admin-ui/src/lib/catalog/src/components/create-product-variant-dialog/create-product-variant-dialog.component.ts

@@ -1,7 +1,13 @@
 import { ChangeDetectionStrategy, Component, OnInit } from '@angular/core';
-import { FormBuilder, FormControl, FormRecord, Validators } from '@angular/forms';
-import { CreateProductVariantInput, Dialog, GetProductVariantOptionsQuery } from '@vendure/admin-ui/core';
+import { FormBuilder, FormControl, FormGroup, FormRecord, Validators } from '@angular/forms';
+import {
+    CreateProductVariantInput,
+    CurrencyCode,
+    Dialog,
+    GetProductVariantOptionsQuery,
+} from '@vendure/admin-ui/core';
 import { notNullOrUndefined } from '@vendure/common/lib/shared-utils';
+import { combineLatest } from 'rxjs';
 
 @Component({
     selector: 'vdr-create-product-variant-dialog',
@@ -15,13 +21,16 @@ export class CreateProductVariantDialogComponent implements Dialog<CreateProduct
     form = this.formBuilder.group({
         name: ['', Validators.required],
         sku: ['', Validators.required],
+        price: ['', Validators.required],
         options: this.formBuilder.record<string>({}),
     });
     existingVariant: NonNullable<GetProductVariantOptionsQuery['product']>['variants'][number] | undefined;
+    currencyCode: CurrencyCode;
 
     constructor(private formBuilder: FormBuilder) {}
 
     ngOnInit() {
+        this.currencyCode = this.product.variants[0].currencyCode;
         for (const optionGroup of this.product.optionGroups) {
             (this.form.get('options') as FormRecord).addControl(
                 optionGroup.code,
@@ -57,14 +66,16 @@ export class CreateProductVariantDialogComponent implements Dialog<CreateProduct
     }
 
     confirm() {
-        const { name, sku, options } = this.form.value;
-        if (!name || !sku || !options) {
+        const { name, sku, options, price } = this.form.value;
+        if (!name || !sku || !options || !price) {
             return;
         }
+
         const optionIds = Object.values(options).filter(notNullOrUndefined);
         this.resolveWith({
             productId: this.product.id,
             sku,
+            price: Number(price),
             optionIds,
             translations: [
                 {

+ 34 - 1
packages/admin-ui/src/lib/core/src/common/utilities/create-updated-translatable.spec.ts

@@ -182,7 +182,7 @@ describe('createUpdatedTranslatable()', () => {
         });
     });
 
-    it('coerces empty customFields to correct type', () => {
+    it('coerces empty customFields to correct type (non-nullable)', () => {
         const customFieldConfig: CustomFieldConfig[] = [
             { name: 'a', type: 'boolean', list: false, nullable: false },
             { name: 'b', type: 'int', list: false, nullable: false },
@@ -220,4 +220,37 @@ describe('createUpdatedTranslatable()', () => {
         expect(result.customFields.f).toBe(null);
         expect(result.customFields.g).toBe(null);
     });
+
+    it('coerces empty customFields to correct type (nullable)', () => {
+        const customFieldConfig: CustomFieldConfig[] = [
+            { name: 'a', type: 'boolean', list: false, nullable: true },
+            { name: 'b', type: 'int', list: false, nullable: true },
+            { name: 'c', type: 'float', list: false, nullable: true },
+            { name: 'd', type: 'datetime', list: false, nullable: true },
+            { name: 'e', type: 'string', list: false, nullable: true },
+        ];
+
+        const formValue = {
+            customFields: {
+                a: '',
+                b: '',
+                c: '',
+                d: '',
+                e: '',
+            },
+        };
+
+        const result = createUpdatedTranslatable({
+            translatable: product,
+            updatedFields: formValue,
+            customFieldConfig,
+            languageCode: LanguageCode.en,
+        });
+
+        expect(result.customFields.a).toBe(false);
+        expect(result.customFields.b).toBe(null);
+        expect(result.customFields.c).toBe(null);
+        expect(result.customFields.d).toBe(null);
+        expect(result.customFields.e).toBe('');
+    });
 });

+ 1 - 1
packages/admin-ui/src/lib/core/src/shared/components/chip/chip.component.scss

@@ -51,7 +51,7 @@
     padding: 5px 8px;
     white-space: nowrap;
     display: flex;
-    align-items: baseline;
+    align-items: center;
     gap: 2px;
 }
 

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

@@ -44,7 +44,11 @@ export class DataTableFiltersComponent implements AfterViewInit {
     @HostListener('window:keydown.f', ['$event'])
     onFKeyPress(event: KeyboardEvent) {
         if (event.target instanceof HTMLElement) {
-            if (event.target.tagName === 'INPUT' || event.target.tagName === 'TEXTAREA') {
+            if (
+                event.target.tagName === 'INPUT' ||
+                event.target.tagName === 'TEXTAREA' ||
+                event.target.classList.contains('vdr-prosemirror')
+            ) {
                 return;
             }
         }

+ 0 - 1
packages/admin-ui/src/lib/core/src/shared/components/facet-value-chip/facet-value-chip.component.scss

@@ -8,5 +8,4 @@
     text-transform: uppercase;
     font-size: 10px;
     margin-inline-end: 3px;
-    height: 11px;
 }

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

@@ -35,20 +35,20 @@
     "dashboard": "Pannello",
     "facets": "Attributi",
     "global-settings": "Impostazioni Globali",
-    "inventory": "",
+    "inventory": "Inventario",
     "job-queue": "Coda operazioni",
     "manage-variants": "Gestione varianti",
     "modifying": "Modifica",
     "orders": "Ordini",
     "payment-methods": "Metodi di pagamento",
-    "product-options": "",
+    "product-options": "Opzioni prodotto",
     "profile": "Profilo",
     "promotions": "Promozioni",
     "roles": "Ruoli",
-    "seller-orders": "",
-    "sellers": "",
+    "seller-orders": "Ordini venditore",
+    "sellers": "Venditore",
     "shipping-methods": "Metodi di spedizione",
-    "stock-locations": "",
+    "stock-locations": "Posizioni magazzino",
     "system-status": "Stato del sistema",
     "tax-categories": "Impostazioni Tasse",
     "tax-rates": "Importo Tasse",
@@ -58,12 +58,12 @@
     "add-facet-value": "Aggiungi valore attributo",
     "add-facets": "Aggiungi attributi",
     "add-option": "Aggiungi opzione",
-    "add-price-in-another-currency": "",
-    "add-stock-location": "",
-    "add-stock-to-location": "",
-    "asset": "",
-    "asset-preview-links": "",
-    "assets": "",
+    "add-price-in-another-currency": "Aggiungi un prezzo in un'altra valuta",
+    "add-stock-location": "Aggiungi posizione magazzino",
+    "add-stock-to-location": "ggiungi merce alla posizione",
+    "asset": "Media",
+    "asset-preview-links": "Media preview link",
+    "assets": "Media",
     "assign-product-to-channel-success": "Prodotto assegnato correttamente a \"{ channel }\"",
     "assign-products-to-channel": "Assegna prodotto al canale",
     "assign-to-channel": "Assegna a un canale",
@@ -72,84 +72,84 @@
     "assign-variants-to-channel": "Assegna varianti al canale",
     "auto-update-option-variant-name": "Aggiorna automaticamente i nomi delle Varianti utilizzando questa opzione",
     "auto-update-product-variant-name": "Aggiorna automaticamente i nomi delle Varianti",
-    "cannot-create-variants-without-options": "",
+    "cannot-create-variants-without-options": "Le varianti di prodotto possono essere create solo se è stato definito un gruppo di opzioni con almeno due opzioni di prodotto.",
     "channel-price-preview": "Anteprima prezzo canale",
-    "collection": "",
+    "collection": "Collezione",
     "collection-contents": "Contenuti della Collezione",
-    "collections": "",
-    "confirm-bulk-delete-products": "",
-    "confirm-cancel": "",
+    "collections": "Collezioni",
+    "confirm-bulk-delete-products": "Cancellare {count} prodotti?",
+    "confirm-cancel": "Conferma cancellazione",
     "confirm-delete-assets": "Eliminare {count} {count, plural, one {media} other {media}}?",
     "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-option-group-body": "",
+    "confirm-delete-product-option": "Cancellare l'opzione di prodotto \"{name}\"?",
+    "confirm-delete-product-option-group": "Cancellare il gruppo di opzioni di prodotto \"{name}\"",
+    "confirm-delete-product-option-group-body": "Questo gruppo di opzioni è utilizzato da {count} {count, plural, one {variant} other {variants}}. Sei sicuro di volerlo eliminare?",
     "confirm-delete-product-variant": "Eliminare la variante?",
     "confirm-deletion-of-unused-variants-body": "Le seguenti varianti sono diventate obsolete a seguito dell'aggiunta di nuove opzioni. Queste verranno cancellate durante la creazione delle nuove varianti.",
     "confirm-deletion-of-unused-variants-title": "Cancellare le varianti obsolete?",
-    "create-draft-order": "",
+    "create-draft-order": "Crea bozza ordine",
     "create-new-collection": "Crea nuova Collezione",
     "create-new-facet": "Crea nuovo attributo",
     "create-new-product": "Crea nuovo prodotto",
-    "create-new-stock-location": "",
-    "create-product-option-group": "",
-    "create-product-variant": "",
-    "default-currency": "",
-    "do-not-inherit-filters": "",
+    "create-new-stock-location": "Creare una nuova posizione di magazzino",
+    "create-product-option-group": "Crea gruppo di opzione di prodotto",
+    "create-product-variant": "Crea variante prodotto",
+    "default-currency": "Valuta predefinita",
+    "do-not-inherit-filters": "Non ereditare i filtri",
     "drop-files-to-upload": "Trascina file da caricare",
-    "edit-facet-values": "",
-    "edit-options": "",
-    "facet": "",
-    "facet-value-not-available": "",
+    "edit-facet-values": "Modifica il valore degli attributi",
+    "edit-options": "Modifica opzioni",
+    "facet": "Attributo",
+    "facet-value-not-available": "Valore attributo \"{ id }\" non disponibile",
     "facet-values": "Valori attributo",
-    "facets": "",
+    "facets": "Attributi",
     "filter-by-name": "Filtra per nome",
     "filter-by-sku": "Filtra per codice SKU",
-    "filter-inheritance": "",
+    "filter-inheritance": "Ereditarietà filtri",
     "filters": "Filtri",
-    "inherit-filters-from-parent": "",
-    "live-preview-contents": "",
+    "inherit-filters-from-parent": "Eredita filtri dal padre",
+    "live-preview-contents": "Anteprima Contenuti",
     "manage-variants": "Gestione varianti",
-    "move-collection-to": "",
-    "move-collections": "",
-    "move-collections-success": "",
+    "move-collection-to": "Sposta su { name }",
+    "move-collections": "Sposta collezioni",
+    "move-collections-success": "Spostate {count, plural, one {1 collezione} other {{count} collezioni}}",
     "move-down": "Sposta in basso",
     "move-to": "Sposta in",
     "move-up": "Sposta in alto",
-    "name": "",
+    "name": "Nome",
     "no-channel-selected": "Nessun canale selezionato",
     "no-featured-asset": "Nessun media in evidenza",
     "no-selection": "Nessuna selezione",
-    "no-stock-locations-available-on-current-channel": "",
-    "notify-bulk-delete-products-success": "",
-    "notify-remove-facets-from-channel-success": "",
+    "no-stock-locations-available-on-current-channel": "Non sono disponibili posizioni di magazzino nel canale corrente. Impostare almeno una posizione di magazzino prima di aggiungere prodotti.",
+    "notify-bulk-delete-products-success": "Rimossi con successo {count, plural, one {1 prodotto} other {{count} prodotti}}",
+    "notify-remove-facets-from-channel-success": "Rimossi con successo {count, plural, one {1 attributo} other {{count} attributi}} da { channelCode }",
     "notify-remove-product-from-channel-error": "Impossibile rimuovere il prodotto dal canale",
     "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": "",
+    "number-of-variants": "Numero di varianti",
     "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.",
-    "page-description-options-editor": "",
+    "page-description-options-editor": "Modificare i nomi e i codici delle opzioni per questo prodotto. Per aggiungere o rimuovere opzioni, utilizzare il pulsante \"Gestione varianti\" sotto l'elenco delle varianti del prodotto.",
     "price": "Prezzo",
-    "price-and-tax": "",
+    "price-and-tax": "Prezzo e tasse",
     "price-conversion-factor": "Fattore di conversione del prezzo",
     "price-in-channel": "Prezzo in { channel }",
     "price-includes-tax-at": "Include tasse al { rate }%",
     "price-with-tax-in-default-zone": "Inc. { rate }% di tasse: { price }",
     "private": "Privato",
-    "product": "",
+    "product": "Prodotto",
     "product-name": "Nome del Prodotto",
-    "product-options": "",
-    "product-variant-exists": "",
+    "product-options": "Opzioni prodotto",
+    "product-variant-exists": "Esiste già una variante del prodotto con queste opzioni",
     "product-variants": "Varianti del Prodotto",
-    "products": "",
+    "products": "Prodotti",
     "public": "Pubblico",
-    "quick-jump-placeholder": "",
+    "quick-jump-placeholder": "Salto rapido alla variante",
     "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",
@@ -158,10 +158,10 @@
     "remove-option": "Rimuovi opzione",
     "remove-product-from-channel": "Rimuovi prodotto dal canale",
     "remove-product-variant-from-channel": "Rimuovi variante dal canale",
-    "reorder-collection": "",
+    "reorder-collection": "Riordina collezione",
     "root-collection": "",
-    "run-pending-search-index-updates": "",
-    "running-search-index-updates": "",
+    "run-pending-search-index-updates": "Indice di ricerca: eseguire {count, plural, one {1 aggiornamento in attesa} other {{count} aggiornamenti in attesa}}",
+    "running-search-index-updates": "Esecuzione {count, plural, one {1 aggiornamento} other {{count} aggiornamenti}} all'indice di ricerca",
     "search-asset-name-or-tag": "Cerca per nome o tag del media",
     "search-for-term": "Ricerca termine",
     "search-product-name-or-code": "Ricerca per nome o codice prodotto",
@@ -171,9 +171,9 @@
     "slug": "Slug",
     "slug-pattern-error": "Lo slug non è valido",
     "stock-allocated": "Allocato",
-    "stock-levels": "",
-    "stock-location": "",
-    "stock-locations": "",
+    "stock-levels": "Livelli di scorte",
+    "stock-location": "Posizione delle scorte",
+    "stock-locations": "Posizioni delle scorte",
     "stock-on-hand": "Scorte",
     "tax-category": "Categoria Tassa",
     "taxes": "Tasse",
@@ -186,41 +186,41 @@
     "use-global-value": "Usa valore generale",
     "values": "Valori",
     "variant": "Variante",
-    "variant-count": "",
+    "variant-count": "{count, plural, one {1 variante} other {{count} varianti}}",
     "view-contents": "Mostra contenuti",
     "visibility": "Visibilità"
   },
   "common": {
     "ID": "ID",
     "actions": "Azioni",
-    "add-filter": "",
+    "add-filter": "Aggiungi filtro",
     "add-item-to-list": "Aggiungi elemento alla lista",
     "add-note": "Aggiungi nota",
-    "apply": "",
-    "assign-to-channel": "",
-    "available-currencies": "",
+    "apply": "Applica",
+    "assign-to-channel": "Assegna a un canale",
+    "available-currencies": "Valute disponibili",
     "available-languages": "Lingue disponibili",
-    "boolean-and": "",
-    "boolean-false": "",
-    "boolean-or": "",
-    "boolean-true": "",
-    "breadcrumb": "",
-    "browser-default": "",
+    "boolean-and": "e",
+    "boolean-false": "falso",
+    "boolean-or": "o",
+    "boolean-true": "vero",
+    "breadcrumb": "Breadcrump",
+    "browser-default": "Predefinito del browser",
     "cancel": "Annulla",
     "cancel-navigation": "Annulla navigazione",
     "change-selection": "Cambia selezione",
     "channel": "Canale",
     "channels": "Canali",
-    "clear-selection": "",
+    "clear-selection": "Pulisci selezione",
     "code": "Codice",
     "collapse-entries": "Riduci elementi",
     "confirm": "Conferma",
-    "confirm-bulk-assign-to-channel": "",
-    "confirm-bulk-delete": "",
-    "confirm-bulk-remove-from-channel": "",
+    "confirm-bulk-assign-to-channel": "Assegnare gli elementi al canale?",
+    "confirm-bulk-delete": "Cancellare gli elementi selezionati?",
+    "confirm-bulk-remove-from-channel": "Rimuovere gli elementi dal canale corrente?",
     "confirm-delete-note": "Cancellare la nota?",
     "confirm-navigation": "Prosegui con la navigazione",
-    "contents": "",
+    "contents": "Contenuti",
     "create": "Crea",
     "created-at": "Creato il",
     "custom-fields": "Campi personalizzati",
@@ -239,93 +239,93 @@
     "edit-field": "Modifica campo",
     "edit-note": "Modifica nota",
     "enabled": "Abilitato",
-    "end-date": "",
+    "end-date": "Data di fine",
     "expand-entries": "Espandi elementi",
     "extension-running-in-separate-window": "L'estensione è in esecuzione in un'altra finestra",
     "filter": "Filtra",
     "filter-preset-name": "Nome preimpostazione filtro",
-    "force-delete": "",
-    "force-remove": "",
-    "general": "",
+    "force-delete": "Forza eliminazione",
+    "force-remove": "Forza cancellazione",
+    "general": "Generale",
     "guest": "Ospite",
-    "id": "",
-    "image": "",
+    "id": "ID",
+    "image": "Immagine",
     "items-per-page-option": "{ count } per pagina",
-    "items-selected-count": "",
-    "keep-editing": "",
+    "items-selected-count": "{ count } {count, plural, one {elemento} other {elementi}} selezionati",
+    "keep-editing": "Continua a modificare",
     "language": "Lingua",
     "launch-extension": "Lancia estensione",
-    "list-items-and-n-more": "",
+    "list-items-and-n-more": "{ items } e altri {nMore}",
     "live-update": "Aggiornamenti live",
-    "locale": "",
+    "locale": "Località",
     "log-out": "Log out",
     "login": "Log in",
-    "login-image-title": "",
-    "login-title": "",
+    "login-image-title": "Ciao! Bentornato. È bello rivederti.",
+    "login-title": "Accedi su {brand}",
     "manage-tags": "Gestisci tag",
     "manage-tags-description": "Aggiungi o elimina tag globalmente",
-    "medium-date": "",
+    "medium-date": "Data media",
     "more": "Altri...",
     "name": "Nome",
-    "no-alerts": "",
-    "no-bulk-actions-available": "",
+    "no-alerts": "Nessun avviso",
+    "no-bulk-actions-available": "Nessuna azione di massa disponibile",
     "no-results": "Nessun risultato",
-    "not-applicable": "",
+    "not-applicable": "Non applicabile",
     "not-set": "Non impostato",
-    "notify-assign-to-channel-success-with-count": "",
-    "notify-bulk-update-success": "",
+    "notify-assign-to-channel-success-with-count": "Assegnato con successo {count, plural, one {1 elemento} other {{count} elementi}} a { channelCode }",
+    "notify-bulk-update-success": "Aggiornati { count } { entity }",
     "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 }",
-    "notify-delete-error-with-count": "",
+    "notify-delete-error-with-count": "Impossibile eliminare {count, plural, one {1 elemento} other {{count} elementi}}",
     "notify-delete-success": "Cancellato { entity }",
-    "notify-delete-success-with-count": "",
-    "notify-remove-from-channel-success-with-count": "",
+    "notify-delete-success-with-count": "Eliminati con successo {count, plural, one {1 elemento} other {{count} elementi}}",
+    "notify-remove-from-channel-success-with-count": "Rimossi con successo { count } elementi dal canale",
     "notify-save-changes-error": "Si è verificato un errore, impossibile salvare le modifiche",
     "notify-saved-changes": "Modifiche salvate",
     "notify-update-error": "Si è verificato un errore, impossibile aggiornare { entity }",
     "notify-update-success": "Aggiornato { entity }",
     "notify-updated-tags-success": "Tags aggiornati con successo",
-    "okay": "",
-    "operator-contains": "",
-    "operator-eq": "",
-    "operator-gt": "",
-    "operator-lt": "",
-    "operator-not-contains": "",
-    "operator-not-eq": "",
-    "operator-notContains": "",
-    "operator-regex": "",
+    "okay": "Ok",
+    "operator-contains": "contiene",
+    "operator-eq": "uguale",
+    "operator-gt": "maggiore di",
+    "operator-lt": "minore di",
+    "operator-not-contains": "non contiene",
+    "operator-not-eq": "non uguale",
+    "operator-notContains": "non contiene",
+    "operator-regex": "corrisponde a una regex",
     "password": "Password",
-    "position": "",
+    "position": "Posizione",
     "price": "Prezzo",
     "price-with-tax": "Prezzo tasse incluse",
     "private": "Privato",
     "public": "Pubblico",
     "remember-me": "Ricordami",
     "remove": "Rimuovi",
-    "remove-from-channel": "",
+    "remove-from-channel": "Rimuovi dal canale",
     "remove-item-from-list": "Rimuovi elemento dalla lista",
     "rename-filter-preset": "Rinomina preimpostazione",
-    "reset-columns": "",
+    "reset-columns": "Reimposta Colonne",
     "results-count": "{ count } {count, plural, one {risultato} other {risultati}}",
-    "sample-formatting": "",
+    "sample-formatting": "Esempio di formattazione",
     "save-filter-preset": "Salva come preimpostazione",
-    "search-and-filter-list": "",
-    "search-by-name": "",
+    "search-and-filter-list": "Ricerca e filtra questa lista",
+    "search-by-name": "Ricerca per nome",
     "select": "Seleziona...",
     "select-display-language": "Seleziona lingua",
-    "select-items-with-count": "",
-    "select-products": "",
-    "select-relation-id": "",
-    "select-table-columns": "",
+    "select-items-with-count": "Seleziona { count } {count, plural, one {elemento} other {elementi}}",
+    "select-products": "Seleziona prodotti",
+    "select-relation-id": "Seleziona ID relazione",
+    "select-table-columns": "Seleziona le colonne della tabella",
     "select-today": "Seleziona oggi",
-    "select-variants": "",
-    "seller": "",
-    "set-language": "",
-    "short-date": "",
-    "slug": "",
-    "start-date": "",
-    "status": "",
+    "select-variants": "Seleziona varianti",
+    "seller": "Venditore",
+    "set-language": "Imposta lingua",
+    "short-date": "Data breve",
+    "slug": "Slug",
+    "start-date": "Data di inizio",
+    "status": "Stato",
     "tags": "Tag",
     "theme": "Tema",
     "there-are-unsaved-changes": "Ci sono modifiche non salvate. Lasciando questa pagina le modifiche andranno perse.",
@@ -334,11 +334,11 @@
     "update": "Aggiorna",
     "updated-at": "Aggiornare a",
     "username": "Username",
-    "value": "",
-    "view-contents": "",
+    "value": "Valore",
+    "view-contents": "Mostra contenuti",
     "view-next-month": "Vedi mese successivo",
     "view-previous-month": "Vedi mese precedente",
-    "visibility": "",
+    "visibility": "Visibilità",
     "with-selected": "Con selezionato..."
   },
   "customer": {
@@ -350,18 +350,18 @@
     "add-customers-to-group-with-name": "Aggiungi clienti a \"{ groupName }\"",
     "addresses": "Indirizzi",
     "city": "Città",
-    "company": "",
+    "company": "Azienda",
     "confirm-remove-customer-from-group": "Rimuovere il cliente dal gruppo?",
     "country": "Nazione",
     "create-customer-group": "Crea gruppo di clienti",
     "create-new-address": "Crea nuovo indirizzo",
     "create-new-customer": "Crea nuovo cliente",
     "create-new-customer-group": "Crea nuovo gruppo di clienti",
-    "customer": "",
-    "customer-group": "",
+    "customer": "Cliente",
+    "customer-group": "Gruppi di clienti",
     "customer-groups": "Gruppi di clienti",
     "customer-history": "Storico cliente",
-    "customers": "",
+    "customers": "Clienti",
     "default-billing-address": "Indirizzo di fatturazione principale",
     "default-shipping-address": "Indirizzo di spedizione principale",
     "email-address": "Indirizzo email",
@@ -414,10 +414,10 @@
   "dashboard": {
     "add-widget": "Aggiungi widget",
     "latest-orders": "Ultimi ordini",
-    "metric-average-order-value": "",
-    "metric-number-of-orders": "",
-    "metric-order-total-value": "",
-    "metrics": "",
+    "metric-average-order-value": "Valore medio degli ordini",
+    "metric-number-of-orders": "Numero di ordini",
+    "metric-order-total-value": "Valore totale dell'ordine",
+    "metrics": "Metriche",
     "orders-summary": "Riepilogo ordini",
     "remove-widget": "Rimuovi widget",
     "thisMonth": "Questo mese",
@@ -471,7 +471,7 @@
     "image-title": "Titolo",
     "insert-image": "Inserisci immagine",
     "link-href": "Link",
-    "link-target": "",
+    "link-target": "Destinazione link",
     "link-title": "Titolo link",
     "remove-link": "Rimuovi",
     "set-link": "Imposta link"
@@ -494,8 +494,8 @@
     "ends-at": "Finisce a",
     "per-customer-limit": "Limiti per cliente",
     "per-customer-limit-tooltip": "Numero massimo di volte in cui questa promozione può essere utilizzata da un singolo cliente",
-    "promotion": "",
-    "search-by-name-or-coupon-code": "",
+    "promotion": "Promozione",
+    "search-by-name-or-coupon-code": "Ricerca per nome o codice coupon",
     "starts-at": "Inizia a",
     "usage-limit": "Limite totale di utilizzo",
     "usage-limit-tooltip": "Numero massimo di volte in cui questa promozione può essere utilizzata in totale"
@@ -511,7 +511,7 @@
     "customers": "Clienti",
     "facets": "Attributi",
     "global-settings": "Impostazioni globali",
-    "inventory": "",
+    "inventory": "Inventario",
     "job-queue": "Coda operazioni",
     "marketing": "Marketing",
     "orders": "Ordini",
@@ -519,7 +519,7 @@
     "promotions": "Promozioni",
     "roles": "Ruoli",
     "sales": "Vendite",
-    "sellers": "",
+    "sellers": "Venditori",
     "settings": "Impostazioni",
     "shipping-methods": "Metodi di Spedizione",
     "system": "Sistema",
@@ -540,7 +540,7 @@
     "arrange-additional-payment": "Effettua un ulteriore pagamento",
     "billing-address": "Indirizzo di fatturazione",
     "cancel": "Annulla",
-    "cancel-entire-order": "",
+    "cancel-entire-order": "Annulla intero ordine",
     "cancel-fulfillment": "Annulla consegna",
     "cancel-modification": "Annulla modifica",
     "cancel-order": "Annulla ordine",
@@ -548,23 +548,23 @@
     "cancel-reason-customer-request": "Richiesta del cliente",
     "cancel-reason-not-available": "Non disponibile",
     "cancel-selected-items": "Cancella prodotti selezionati",
-    "cancel-specified-items": "",
+    "cancel-specified-items": "Cancella prodotti specifcati",
     "cancellation-reason": "Motivo dell'annullamento",
     "cancelled-order-success": "Ordine cancellato con successo",
-    "complete-draft-order": "",
+    "complete-draft-order": "Salva bozza",
     "confirm-modifications": "Conferma modifiche",
     "contents": "Contenuti",
     "create-fulfillment": "Crea consegna",
     "create-fulfillment-success": "Consegna creata",
     "customer": "Cliente",
-    "delete-draft-order": "",
-    "draft-order": "",
+    "delete-draft-order": "Cancella bozza",
+    "draft-order": "Bozza ordine",
     "edit-billing-address": "Modifica indirizzo di fatturazione",
     "edit-shipping-address": "Modifica indirizzo di spedizione",
     "error-message": "Messaggio di errore",
-    "existing-address": "",
-    "existing-customer": "",
-    "filter-is-active": "",
+    "existing-address": "Indirizzo esistente",
+    "existing-customer": "Indirizzo cliente",
+    "filter-is-active": "È attivo",
     "fulfill": "Consegna",
     "fulfill-order": "Consegna ordine",
     "fulfillment": "Consegna",
@@ -607,22 +607,22 @@
     "note-is-private": "Le note sono private",
     "note-only-visible-to-administrators": "Visibile solo agli amministratori",
     "note-visible-to-customer": "Visibile agli amministratori e al cliente",
-    "order": "",
+    "order": "Ordina",
     "order-history": "Storico ordine",
-    "order-is-empty": "",
+    "order-is-empty": "L'ordine è vuoto",
     "order-state-diagram": "Diagramma di stato dell'ordine",
-    "order-type": "",
-    "order-type-aggregate": "",
-    "order-type-regular": "",
-    "order-type-seller": "",
-    "orders": "",
+    "order-type": "Tipo ordine",
+    "order-type-aggregate": "Aggregato",
+    "order-type-regular": "Regolare",
+    "order-type-seller": "Venditore",
+    "orders": "Ordini",
     "payment": "Pagamento",
     "payment-amount": "Importo pagamento",
     "payment-metadata": "Metadati pagamento",
     "payment-method": "Metodo di pagamento",
     "payment-state": "Stato",
     "payment-to-refund": "Pagamento da rimborsare",
-    "payments": "",
+    "payments": "Pagamenti",
     "placed-at": "Effettuato a",
     "preview-changes": "Anteprima modifiche",
     "product-name": "Nome prodotto",
@@ -649,16 +649,16 @@
     "refunded-count": "Hai rimborsato {count} {count, plural, one {prodotto} other {prodotti}}",
     "removed-items": "Prodotti rimossi",
     "search-by-order-filters": "Cerca per codice ordine / cognome cliente / ID transazione",
-    "select-address": "",
-    "select-shipping-method": "",
+    "select-address": "Inserisci indirizzo",
+    "select-shipping-method": "Seleziona il metodo di consegna",
     "select-state": "Seleziona stato",
-    "seller-orders": "",
-    "set-billing-address": "",
-    "set-coupon-codes": "",
-    "set-customer-for-order": "",
+    "seller-orders": "Ordini venditore",
+    "set-billing-address": "Inserisci indirizzo di fatturazioine",
+    "set-coupon-codes": "Inserisci i codici coupon",
+    "set-customer-for-order": "Seleziona cliente",
     "set-fulfillment-state": "Segna come {state}",
-    "set-shipping-address": "",
-    "set-shipping-method": "",
+    "set-shipping-address": "Seleziona indirizzo di spedizione",
+    "set-shipping-method": "Seleziona metodo di consegna",
     "settle-payment": "Incassa pagamento",
     "settle-payment-error": "Non è stato possibile incassare il pagamento",
     "settle-payment-success": "Pagamento incassato con successo",
@@ -667,7 +667,7 @@
     "settle-refund-success": "Rimborso effettuato con successo",
     "shipping": "Spedizione",
     "shipping-address": "Indirizzo di spedizione",
-    "shipping-cancelled": "",
+    "shipping-cancelled": "Spedizione cancellata",
     "shipping-method": "Metodo di spedizione",
     "state": "Stato",
     "sub-total": "Sub totale",
@@ -692,30 +692,30 @@
     "add-countries-to-zone": "Aggiungi nazioni a { zoneName }",
     "add-countries-to-zone-success": "Ho aggiunto { countryCount } {countryCount, plural, one {nazione} other {nazioni}} alla zona \"{ zoneName }\"",
     "add-products-to-test-order": "Aggiunti prodotti all'ordine di test",
-    "administrator": "",
+    "administrator": "Amministratore",
     "channel": "Canale",
     "channel-token": "Token del canale",
-    "country": "",
+    "country": "Nazione",
     "create-new-channel": "Crea nuovo canale",
     "create-new-country": "Crea nuova nazione",
     "create-new-payment-method": "Crea nuovo metodo di pagamento",
     "create-new-role": "Crea nuovo ruolo",
-    "create-new-seller": "",
+    "create-new-seller": "Crea nuovo venditore",
     "create-new-shipping-method": "Crea nuovo metodo di spedizione",
     "create-new-tax-category": "Crea categoria tassa",
     "create-new-tax-rate": "Crea nuovo tasso fiscale",
     "create-new-zone": "Crea nuova zona",
-    "default-currency": "",
+    "default-currency": "Valuta predefinita",
     "default-role-label": "Questo è un ruolo predefinito e non può essere modificato",
     "default-shipping-zone": "Zona di spedizione predefinita",
     "default-tax-zone": "Zona di tassazione predefinita",
-    "defaults": "",
+    "defaults": "Predefiniti",
     "eligible": "Compatibile",
     "email-address": "Indirizzo email",
-    "email-address-or-identifier": "",
+    "email-address-or-identifier": "Indirizzo email o identificativo",
     "first-name": "Nome",
     "fulfillment-handler": "Gestore spedizione",
-    "global-available-languages-tooltip": "",
+    "global-available-languages-tooltip": "Imposta le lingue disponibili per tutti i canali. I singoli canali possono poi supportare un sottoinsieme di queste lingue.",
     "global-out-of-stock-threshold": "Soglia globale di indisponibilità",
     "global-out-of-stock-threshold-tooltip": "Imposta il livello di scorte al quale questa variante viene considerata esaurita. Usando un valore negativo si abilitano gli ordini in riapprovvigionamento. Può essere modificato per le singole varianti.",
     "last-name": "Cognome",
@@ -723,17 +723,17 @@
     "password": "Password",
     "payment-eligibility-checker": "Metodo di verifica compatibilità pagamento",
     "payment-handler": "Funzione gestione pagamento",
-    "payment-method": "",
+    "payment-method": "Metodo di pagamento",
     "permissions": "Permessi",
     "prices-include-tax": "I prezzi includono le tasse per la zona fiscale predefinita",
     "profile": "Profilo",
     "rate": "Tasso",
     "remove-countries-from-zone-success": "Ho rimosso { countryCount } {countryCount, plural, one {nazione} other {nazioni}} dalla zona \"{ zoneName }\"",
     "remove-from-zone": "Rimuovi dalla zona",
-    "role": "",
+    "role": "Ruolo",
     "roles": "Ruoli",
     "search-by-product-name-or-sku": "Cerca per prodotto o codice SKU",
-    "seller": "",
+    "seller": "Venditore",
     "shipping-calculator": "Calcolo prezzo spedizioni",
     "shipping-eligibility-checker": "Criterio di selezione metodi di spedizione",
     "shipping-method": "Metodo di spedizione",
@@ -756,7 +756,7 @@
     "created": "Creato",
     "declined": "Rifiutato",
     "delivered": "Consegnato",
-    "draft": "",
+    "draft": "Bozza",
     "error": "Errore",
     "failed": "Fallito",
     "modifying": "In modifica",