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

Merge branch 'master' into minor

Michael Bromley 2 лет назад
Родитель
Сommit
e2156cbded
29 измененных файлов с 110 добавлено и 130 удалено
  1. 2 2
      docs/layouts/partials/announcement-banner.html
  2. 3 3
      docs/layouts/partials/top-bar.html
  3. 2 3
      packages/admin-ui/src/lib/catalog/src/components/asset-detail/asset-detail.component.ts
  4. 2 4
      packages/admin-ui/src/lib/catalog/src/components/collection-detail/collection-detail.component.ts
  5. 2 3
      packages/admin-ui/src/lib/catalog/src/components/facet-detail/facet-detail.component.ts
  6. 2 6
      packages/admin-ui/src/lib/catalog/src/components/product-detail/product-detail.component.ts
  7. 2 3
      packages/admin-ui/src/lib/catalog/src/components/product-variant-detail/product-variant-detail.component.ts
  8. 2 3
      packages/admin-ui/src/lib/catalog/src/components/stock-location-detail/stock-location-detail.component.ts
  9. 1 22
      packages/admin-ui/src/lib/core/src/common/utilities/create-updated-translatable.ts
  10. 36 0
      packages/admin-ui/src/lib/core/src/common/utilities/custom-field-default-value.ts
  11. 1 1
      packages/admin-ui/src/lib/core/src/components/channel-switcher/channel-switcher.component.html
  12. 1 0
      packages/admin-ui/src/lib/core/src/public_api.ts
  13. 20 20
      packages/admin-ui/src/lib/core/src/shared/components/asset-gallery/asset-gallery.component.html
  14. 2 4
      packages/admin-ui/src/lib/customer/src/components/customer-detail/customer-detail.component.ts
  15. 3 5
      packages/admin-ui/src/lib/customer/src/components/customer-group-detail-dialog/customer-group-detail-dialog.component.ts
  16. 2 3
      packages/admin-ui/src/lib/customer/src/components/customer-group-detail/customer-group-detail.component.ts
  17. 2 3
      packages/admin-ui/src/lib/marketing/src/components/promotion-detail/promotion-detail.component.ts
  18. 2 3
      packages/admin-ui/src/lib/order/src/components/order-detail/order-detail.component.ts
  19. 2 4
      packages/admin-ui/src/lib/settings/src/components/admin-detail/admin-detail.component.ts
  20. 3 9
      packages/admin-ui/src/lib/settings/src/components/channel-detail/channel-detail.component.ts
  21. 2 3
      packages/admin-ui/src/lib/settings/src/components/country-detail/country-detail.component.ts
  22. 2 3
      packages/admin-ui/src/lib/settings/src/components/global-settings/global-settings.component.ts
  23. 2 3
      packages/admin-ui/src/lib/settings/src/components/payment-method-detail/payment-method-detail.component.ts
  24. 2 3
      packages/admin-ui/src/lib/settings/src/components/profile/profile.component.ts
  25. 2 3
      packages/admin-ui/src/lib/settings/src/components/seller-detail/seller-detail.component.ts
  26. 2 4
      packages/admin-ui/src/lib/settings/src/components/shipping-method-detail/shipping-method-detail.component.ts
  27. 2 3
      packages/admin-ui/src/lib/settings/src/components/tax-category-detail/tax-category-detail.component.ts
  28. 2 4
      packages/admin-ui/src/lib/settings/src/components/tax-rate-detail/tax-rate-detail.component.ts
  29. 2 3
      packages/admin-ui/src/lib/settings/src/components/zone-detail/zone-detail.component.ts

+ 2 - 2
docs/layouts/partials/announcement-banner.html

@@ -1,6 +1,6 @@
 <script>
   function bannerComponent() {
-    const bannerId = 4;
+    const bannerId = 5;
     const key = `banner-${bannerId}-dismissed`;
     const bannerDismissed = localStorage.getItem(key) ?? false;
     return {
@@ -15,7 +15,7 @@
 <div class="relative bg-gradient-to-r from-blue-600 via-indigo-700 to-blue-900" x-data="bannerComponent()" x-show="visible" x-cloak>
   <div class="max-w-7xl mx-auto py-1 px-3 sm:px-6 lg:px-8">
     <div class="pr-16 sm:text-center sm:px-16">
-      <p class="text-xs md:text-sm lg:text-base text-white"  @click="dismiss()">
+      <p class="text-xs md:text-sm lg:text-base text-white">
           {{ .content | safeHTML }}
       </p>
     </div>

+ 3 - 3
docs/layouts/partials/top-bar.html

@@ -7,9 +7,9 @@
         :class="{ 'hidden': isLandingPage }"
         class="absolute w-full h-1 bg-gradient-to-r from-blue-300 via-green-300 to-blue-100"
     ></div>
-    {{ partial "announcement-banner" (dict "content" ` 🚨 Announcing
-    <a href="https://vendure.io/" class="text-white font-medium underline"
-        >Announcing Vendure v2<span aria-hidden="true">&rarr;</span></a
+    {{ partial "announcement-banner" (dict "content" `🆕
+    <a href="https://beta-docs.vendure.io/" class="text-white font-medium underline"
+        >Try our new beta documentation! <span aria-hidden="true">&rarr;</span></a
     >
     `) }}
     <div class="max-w-screen-2xl mx-auto px-4 py-4 sm:px-6 md:pr-10">

+ 2 - 3
packages/admin-ui/src/lib/catalog/src/components/asset-detail/asset-detail.component.ts

@@ -6,6 +6,7 @@ import {
     AssetDetailQueryDocument,
     AssetDetailQueryQuery,
     DataService,
+    getCustomFieldsDefaults,
     LanguageCode,
     NotificationService,
     TAG_FRAGMENT,
@@ -40,9 +41,7 @@ export class AssetDetailComponent
     detailForm = new FormGroup({
         name: new FormControl(''),
         tags: new FormControl([] as string[]),
-        customFields: this.formBuilder.group(
-            this.customFields.reduce((hash, field) => ({ ...hash, [field.name]: '' }), {}),
-        ),
+        customFields: this.formBuilder.group(getCustomFieldsDefaults(this.customFields)),
     });
 
     constructor(

+ 2 - 4
packages/admin-ui/src/lib/catalog/src/components/collection-detail/collection-detail.component.ts

@@ -10,7 +10,6 @@ import { FormBuilder, UntypedFormArray, UntypedFormControl, Validators } from '@
 import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
 import {
     Asset,
-    Collection,
     COLLECTION_FRAGMENT,
     CollectionDetailQueryDocument,
     CollectionFragment,
@@ -23,6 +22,7 @@ import {
     encodeConfigArgValue,
     findTranslation,
     getConfigArgValue,
+    getCustomFieldsDefaults,
     LanguageCode,
     LocalStorageService,
     ModalService,
@@ -66,9 +66,7 @@ export class CollectionDetailComponent
         visible: false,
         inheritFilters: true,
         filters: this.formBuilder.array([]),
-        customFields: this.formBuilder.group(
-            this.customFields.reduce((hash, field) => ({ ...hash, [field.name]: '' }), {}),
-        ),
+        customFields: this.formBuilder.group(getCustomFieldsDefaults(this.customFields)),
     });
     assetChanges: { assets?: Asset[]; featuredAsset?: Asset } = {};
     filters: ConfigurableOperation[] = [];

+ 2 - 3
packages/admin-ui/src/lib/catalog/src/components/facet-detail/facet-detail.component.ts

@@ -16,6 +16,7 @@ import {
     FACET_WITH_VALUES_FRAGMENT,
     FacetWithValuesFragment,
     findTranslation,
+    getCustomFieldsDefaults,
     GetFacetDetailDocument,
     LanguageCode,
     ModalService,
@@ -57,9 +58,7 @@ export class FacetDetailComponent
             code: ['', Validators.required],
             name: '',
             visible: true,
-            customFields: this.formBuilder.group(
-                this.customFields.reduce((hash, field) => ({ ...hash, [field.name]: '' }), {}),
-            ),
+            customFields: this.formBuilder.group(getCustomFieldsDefaults(this.customFields)),
         }),
         values: this.formBuilder.array<{
             id: string;

+ 2 - 6
packages/admin-ui/src/lib/catalog/src/components/product-detail/product-detail.component.ts

@@ -4,17 +4,15 @@ import { ActivatedRoute, Router } from '@angular/router';
 import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
 import {
     Asset,
-    BaseDetailComponent,
     CreateProductInput,
     createUpdatedTranslatable,
     DataService,
     findTranslation,
     getChannelCodeFromUserStatus,
-    getDefaultUiLanguage,
+    getCustomFieldsDefaults,
     GetProductDetailDocument,
     GetProductDetailQuery,
     GetProductWithVariantsQuery,
-    ItemOf,
     LanguageCode,
     ModalService,
     NotificationService,
@@ -84,9 +82,7 @@ export class ProductDetailComponent
         slug: ['', unicodePatternValidator(/^[\p{Letter}0-9._-]+$/)],
         description: '',
         facetValueIds: [[] as string[]],
-        customFields: this.formBuilder.group(
-            this.customFields.reduce((hash, field) => ({ ...hash, [field.name]: '' }), {}),
-        ),
+        customFields: this.formBuilder.group(getCustomFieldsDefaults(this.customFields)),
     });
     assetChanges: SelectedAssets = {};
     productChannels$: Observable<ProductDetailFragment['channels']>;

+ 2 - 3
packages/admin-ui/src/lib/catalog/src/components/product-variant-detail/product-variant-detail.component.ts

@@ -8,6 +8,7 @@ import {
     CurrencyCode,
     DataService,
     findTranslation,
+    getCustomFieldsDefaults,
     GetProductVariantDetailDocument,
     GetProductVariantDetailQuery,
     GlobalFlag,
@@ -83,9 +84,7 @@ export class ProductVariantDetailComponent
         outOfStockThreshold: 0,
         trackInventory: GlobalFlag.TRUE,
         facetValueIds: [],
-        customFields: this.formBuilder.group(
-            this.customFields.reduce((hash, field) => ({ ...hash, [field.name]: '' }), {}),
-        ),
+        customFields: this.formBuilder.group(getCustomFieldsDefaults(this.customFields)),
     });
     stockLevelsForm = this.formBuilder.array<
         FormGroup<{

+ 2 - 3
packages/admin-ui/src/lib/catalog/src/components/stock-location-detail/stock-location-detail.component.ts

@@ -5,6 +5,7 @@ import {
     CreateStockLocationDocument,
     CreateStockLocationInput,
     DataService,
+    getCustomFieldsDefaults,
     GetStockLocationDetailDocument,
     NotificationService,
     StockLocationDetailFragment,
@@ -66,9 +67,7 @@ export class StockLocationDetailComponent
     detailForm = this.formBuilder.group({
         name: ['', Validators.required],
         description: [''],
-        customFields: this.formBuilder.group(
-            this.customFields.reduce((hash, field) => ({ ...hash, [field.name]: '' }), {}),
-        ),
+        customFields: this.formBuilder.group(getCustomFieldsDefaults(this.customFields)),
     });
 
     constructor(

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

@@ -1,9 +1,9 @@
 import { CustomFieldsObject, CustomFieldType } from '@vendure/common/lib/shared-types';
-import { assertNever } from '@vendure/common/lib/shared-utils';
 
 import { CustomFieldConfig, LanguageCode } from '../generated-types';
 
 import { findTranslation } from './find-translation';
+import { getDefaultValue } from './custom-field-default-value';
 
 export interface TranslatableUpdateOptions<T extends { translations: any[] } & MayHaveCustomFields> {
     translatable: T;
@@ -61,27 +61,6 @@ export function createUpdatedTranslatable<T extends { translations: any[] } & Ma
     return newTranslatable;
 }
 
-function getDefaultValue(type: CustomFieldType, isNullable?: boolean): any {
-    switch (type) {
-        case 'localeString':
-        case 'string':
-        case 'text':
-        case 'localeText':
-            return '';
-        case 'boolean':
-            return false;
-        case 'float':
-        case 'int':
-            return isNullable ? null : 0;
-        case 'datetime':
-            return isNullable ? null : new Date();
-        case 'relation':
-            return null;
-        default:
-            assertNever(type);
-    }
-}
-
 /**
  * Returns a shallow clone of `obj` with any properties contained in `patch` overwriting
  * those of `obj`.

+ 36 - 0
packages/admin-ui/src/lib/core/src/common/utilities/custom-field-default-value.ts

@@ -0,0 +1,36 @@
+import { CustomFieldType } from '@vendure/common/lib/shared-types';
+import { assertNever } from '@vendure/common/lib/shared-utils';
+import { CustomFieldConfig } from '../generated-types';
+
+export function getCustomFieldsDefaults(customFieldConfig: CustomFieldConfig[]): {
+    [key: string]: ReturnType<typeof getDefaultValue>;
+} {
+    return customFieldConfig.reduce(
+        (hash, field) => ({
+            ...hash,
+            [field.name]: getDefaultValue(field.type as CustomFieldType, field.nullable ?? undefined),
+        }),
+        {},
+    );
+}
+
+export function getDefaultValue(type: CustomFieldType, isNullable?: boolean) {
+    switch (type) {
+        case 'localeString':
+        case 'string':
+        case 'text':
+        case 'localeText':
+            return '';
+        case 'boolean':
+            return false;
+        case 'float':
+        case 'int':
+            return isNullable ? null : 0;
+        case 'datetime':
+            return isNullable ? null : new Date();
+        case 'relation':
+            return null;
+        default:
+            assertNever(type);
+    }
+}

+ 1 - 1
packages/admin-ui/src/lib/core/src/components/channel-switcher/channel-switcher.component.html

@@ -5,7 +5,7 @@
             <span class="channel-label">{{
                 activeChannelCode$ | async | channelCodeToLabel | translate
             }}</span>
-            <span class="trigger"><clr-icon shape="ellipsis-vertical"></clr-icon></span>
+            <span class="trigger"><clr-icon shape="ellipsis-vertical" size="12"></clr-icon></span>
         </button>
         <vdr-dropdown-menu vdrPosition="bottom-right">
             <input

+ 1 - 0
packages/admin-ui/src/lib/core/src/public_api.ts

@@ -16,6 +16,7 @@ export * from './common/title-setter';
 export * from './common/utilities/bulk-action-utils';
 export * from './common/utilities/configurable-operation-utils';
 export * from './common/utilities/create-updated-translatable';
+export * from './common/utilities/custom-field-default-value';
 export * from './common/utilities/find-translation';
 export * from './common/utilities/get-default-ui-language';
 export * from './common/utilities/interpolate-description';

+ 20 - 20
packages/admin-ui/src/lib/core/src/shared/components/asset-gallery/asset-gallery.component.html

@@ -44,27 +44,27 @@
                 <vdr-chip *ngFor="let tag of lastSelected().tags" [colorFrom]="tag.value"
                     ><clr-icon shape="tag" class="mr2"></clr-icon> {{ tag.value }}</vdr-chip
                 >
-                <div>
-                    <a [routerLink]="['./', lastSelected().id]" class="button-ghost">
-                        <clr-icon shape="pencil"></clr-icon> {{ 'common.edit' | translate }}
-                        <clr-icon shape="arrow right"></clr-icon>
-                    </a>
-                </div>
-                <div>
-                    <button (click)="previewAsset(lastSelected())" class="button-small mt-1">
-                        <clr-icon shape="eye"></clr-icon> {{ 'asset.preview' | translate }}
-                    </button>
-                </div>
-                <div *ngIf="canDelete">
-                    <button (click)="deleteAssets.emit(selectionManager.selection)" class="button-small mt-1">
-                        <clr-icon shape="trash" class="is-danger"></clr-icon>
-                        {{ 'common.delete' | translate }}
-                    </button>
-                </div>
-                <div class="mt-1">
-                    <vdr-asset-preview-links class="" [asset]="lastSelected()"></vdr-asset-preview-links>
-                </div>
             </ng-container>
+            <div *ngIf="selectionManager.selection.length === 1">
+                <a [routerLink]="['./', lastSelected().id]" class="button-ghost">
+                    <clr-icon shape="pencil"></clr-icon> {{ 'common.edit' | translate }}
+                    <clr-icon shape="arrow right"></clr-icon>
+                </a>
+            </div>
+            <div *ngIf="selectionManager.selection.length === 1">
+                <button (click)="previewAsset(lastSelected())" class="button-small mt-1">
+                    <clr-icon shape="eye"></clr-icon> {{ 'asset.preview' | translate }}
+                </button>
+            </div>
+            <div *ngIf="canDelete">
+                <button (click)="deleteAssets.emit(selectionManager.selection)" class="button-small mt-1">
+                    <clr-icon shape="trash" class="is-danger"></clr-icon>
+                    {{ 'common.delete' | translate }}
+                </button>
+            </div>
+            <div class="mt-1" *ngIf="selectionManager.selection.length === 1">
+                <vdr-asset-preview-links class="" [asset]="lastSelected()"></vdr-asset-preview-links>
+            </div>
         </div>
     </div>
     <div class="card stack" [class.visible]="selectionManager.selection.length > 1"></div>

+ 2 - 4
packages/admin-ui/src/lib/customer/src/components/customer-detail/customer-detail.component.ts

@@ -5,7 +5,6 @@ import {
     CreateAddressInput,
     CreateCustomerAddressMutation,
     CreateCustomerInput,
-    Customer,
     CUSTOMER_FRAGMENT,
     CustomerDetailQueryDocument,
     CustomerDetailQueryQuery,
@@ -14,6 +13,7 @@ import {
     EditNoteDialogComponent,
     GetAvailableCountriesQuery,
     GetCustomerHistoryQuery,
+    getCustomFieldsDefaults,
     ModalService,
     NotificationService,
     SortOrder,
@@ -90,9 +90,7 @@ export class CustomerDetailComponent
             phoneNumber: '',
             emailAddress: ['', [Validators.required, Validators.email]],
             password: '',
-            customFields: this.formBuilder.group(
-                this.customFields.reduce((hash, field) => ({ ...hash, [field.name]: '' }), {}),
-            ),
+            customFields: this.formBuilder.group(getCustomFieldsDefaults(this.customFields)),
         }),
         addresses: new UntypedFormArray([]),
     });

+ 3 - 5
packages/admin-ui/src/lib/customer/src/components/customer-group-detail-dialog/customer-group-detail-dialog.component.ts

@@ -1,11 +1,11 @@
 import { ChangeDetectionStrategy, Component, OnInit } from '@angular/core';
-import { FormControl, UntypedFormBuilder, UntypedFormGroup, Validators } from '@angular/forms';
+import { UntypedFormBuilder, UntypedFormGroup, Validators } from '@angular/forms';
 import {
     CreateCustomerGroupInput,
     CustomFieldConfig,
     Dialog,
+    getCustomFieldsDefaults,
     ServerConfigService,
-    UpdateCustomerGroupInput,
 } from '@vendure/admin-ui/core';
 
 @Component({
@@ -27,9 +27,7 @@ export class CustomerGroupDetailDialogComponent implements Dialog<CreateCustomer
     ngOnInit() {
         this.form = this.formBuilder.group({
             name: [this.group.name, Validators.required],
-            customFields: this.formBuilder.group(
-                this.customFields.reduce((hash, field) => ({ ...hash, [field.name]: '' }), {}),
-            ),
+            customFields: this.formBuilder.group(getCustomFieldsDefaults(this.customFields)),
         });
         if (this.customFields.length) {
             const customFieldsGroup = this.form.get('customFields') as UntypedFormGroup;

+ 2 - 3
packages/admin-ui/src/lib/customer/src/components/customer-group-detail/customer-group-detail.component.ts

@@ -5,6 +5,7 @@ import { ResultOf } from '@graphql-typed-document-node/core';
 import {
     DataService,
     GetCustomerGroupDetailDocument,
+    getCustomFieldsDefaults,
     ModalService,
     NotificationService,
     TypedBaseDetailComponent,
@@ -38,9 +39,7 @@ export class CustomerGroupDetailComponent
     customFields = this.getCustomFieldConfig('CustomerGroup');
     detailForm = this.formBuilder.group({
         name: '',
-        customFields: this.formBuilder.group(
-            this.customFields.reduce((hash, field) => ({ ...hash, [field.name]: '' }), {}),
-        ),
+        customFields: this.formBuilder.group(getCustomFieldsDefaults(this.customFields)),
     });
 
     constructor(

+ 2 - 3
packages/admin-ui/src/lib/marketing/src/components/promotion-detail/promotion-detail.component.ts

@@ -11,6 +11,7 @@ import {
     encodeConfigArgValue,
     findTranslation,
     getConfigArgValue,
+    getCustomFieldsDefaults,
     getDefaultConfigArgValue,
     GetPromotionDetailDocument,
     LanguageCode,
@@ -55,9 +56,7 @@ export class PromotionDetailComponent
         endsAt: null,
         conditions: this.formBuilder.array([]),
         actions: this.formBuilder.array([]),
-        customFields: this.formBuilder.group(
-            this.customFields.reduce((hash, field) => ({ ...hash, [field.name]: '' }), {}),
-        ),
+        customFields: this.formBuilder.group(getCustomFieldsDefaults(this.customFields)),
     });
     conditions: ConfigurableOperation[] = [];
     actions: ConfigurableOperation[] = [];

+ 2 - 3
packages/admin-ui/src/lib/order/src/components/order-detail/order-detail.component.ts

@@ -5,6 +5,7 @@ import {
     DataService,
     EditNoteDialogComponent,
     FulfillmentFragment,
+    getCustomFieldsDefaults,
     GetOrderHistoryQuery,
     GetOrderQuery,
     ModalService,
@@ -54,9 +55,7 @@ export class OrderDetailComponent
     customFields = this.getCustomFieldConfig('Order');
     orderLineCustomFields = this.getCustomFieldConfig('OrderLine');
     detailForm = new FormGroup({
-        customFields: this.formBuilder.group(
-            this.customFields.reduce((hash, field) => ({ ...hash, [field.name]: '' }), {}),
-        ),
+        customFields: this.formBuilder.group(getCustomFieldsDefaults(this.customFields)),
     });
     history$: Observable<NonNullable<GetOrderHistoryQuery['order']>['history']['items'] | undefined>;
     nextStates$: Observable<string[]>;

+ 2 - 4
packages/admin-ui/src/lib/settings/src/components/admin-detail/admin-detail.component.ts

@@ -3,11 +3,11 @@ import { FormBuilder, Validators } from '@angular/forms';
 import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
 import { ResultOf } from '@graphql-typed-document-node/core';
 import {
-    Administrator,
     ADMINISTRATOR_FRAGMENT,
     CreateAdministratorInput,
     DataService,
     GetAdministratorDetailDocument,
+    getCustomFieldsDefaults,
     LanguageCode,
     NotificationService,
     Permission,
@@ -58,9 +58,7 @@ export class AdminDetailComponent
                 ResultOf<typeof GetAdministratorDetailDocument>['administrator']
             >['user']['roles'],
         ],
-        customFields: this.formBuilder.group(
-            this.customFields.reduce((hash, field) => ({ ...hash, [field.name]: '' }), {}),
-        ),
+        customFields: this.formBuilder.group(getCustomFieldsDefaults(this.customFields)),
     });
     permissionDefinitions: PermissionDefinition[];
     allRoles$: Observable<RoleFragment[]>;

+ 3 - 9
packages/admin-ui/src/lib/settings/src/components/channel-detail/channel-detail.component.ts

@@ -1,19 +1,15 @@
 import { ChangeDetectionStrategy, ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core';
-import { FormBuilder, UntypedFormBuilder, UntypedFormGroup, Validators } from '@angular/forms';
-import { ActivatedRoute, Router } from '@angular/router';
+import { FormBuilder, Validators } from '@angular/forms';
 import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
 import {
-    BaseDetailComponent,
     CHANNEL_FRAGMENT,
     ChannelFragment,
     CreateChannelInput,
     CurrencyCode,
-    CustomFieldConfig,
     DataService,
     GetChannelDetailDocument,
+    getCustomFieldsDefaults,
     GetSellersQuery,
-    GetZoneListQuery,
-    ItemOf,
     LanguageCode,
     NotificationService,
     Permission,
@@ -60,9 +56,7 @@ export class ChannelDetailComponent
         defaultLanguageCode: [undefined as LanguageCode | undefined],
         defaultTaxZoneId: ['', Validators.required],
         sellerId: ['', Validators.required],
-        customFields: this.formBuilder.group(
-            this.customFields.reduce((hash, field) => ({ ...hash, [field.name]: '' }), {}),
-        ),
+        customFields: this.formBuilder.group(getCustomFieldsDefaults(this.customFields)),
     });
 
     availableLanguageCodes$: Observable<LanguageCode[]>;

+ 2 - 3
packages/admin-ui/src/lib/settings/src/components/country-detail/country-detail.component.ts

@@ -8,6 +8,7 @@ import {
     DataService,
     findTranslation,
     GetCountryDetailDocument,
+    getCustomFieldsDefaults,
     LanguageCode,
     NotificationService,
     Permission,
@@ -42,9 +43,7 @@ export class CountryDetailComponent
         code: ['', Validators.required],
         name: ['', Validators.required],
         enabled: [true],
-        customFields: this.formBuilder.group(
-            this.customFields.reduce((hash, field) => ({ ...hash, [field.name]: '' }), {}),
-        ),
+        customFields: this.formBuilder.group(getCustomFieldsDefaults(this.customFields)),
     });
     readonly updatePermission = [Permission.UpdateSettings, Permission.UpdateCountry];
 

+ 2 - 3
packages/admin-ui/src/lib/settings/src/components/global-settings/global-settings.component.ts

@@ -3,6 +3,7 @@ import { FormBuilder, Validators } from '@angular/forms';
 import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
 import {
     DataService,
+    getCustomFieldsDefaults,
     GetGlobalSettingsDetailDocument,
     GlobalSettings,
     LanguageCode,
@@ -44,9 +45,7 @@ export class GlobalSettingsComponent
         availableLanguages: [[] as LanguageCode[]],
         trackInventory: false,
         outOfStockThreshold: [0, Validators.required],
-        customFields: this.formBuilder.group(
-            this.customFields.reduce((hash, field) => ({ ...hash, [field.name]: '' }), {}),
-        ),
+        customFields: this.formBuilder.group(getCustomFieldsDefaults(this.customFields)),
     });
     languageCodes = Object.values(LanguageCode);
     readonly updatePermission = [Permission.UpdateSettings, Permission.UpdateGlobalSettings];

+ 2 - 3
packages/admin-ui/src/lib/settings/src/components/payment-method-detail/payment-method-detail.component.ts

@@ -10,6 +10,7 @@ import {
     DataService,
     findTranslation,
     getConfigArgValue,
+    getCustomFieldsDefaults,
     GetPaymentMethodDetailDocument,
     GetPaymentMethodDetailQuery,
     LanguageCode,
@@ -53,9 +54,7 @@ export class PaymentMethodDetailComponent
         enabled: [true, Validators.required],
         checker: {} as NonNullable<GetPaymentMethodDetailQuery['paymentMethod']>['checker'],
         handler: {} as NonNullable<GetPaymentMethodDetailQuery['paymentMethod']>['handler'],
-        customFields: this.formBuilder.group(
-            this.customFields.reduce((hash, field) => ({ ...hash, [field.name]: '' }), {}),
-        ),
+        customFields: this.formBuilder.group(getCustomFieldsDefaults(this.customFields)),
     });
     checkers: ConfigurableOperationDefinition[] = [];
     handlers: ConfigurableOperationDefinition[] = [];

+ 2 - 3
packages/admin-ui/src/lib/settings/src/components/profile/profile.component.ts

@@ -4,6 +4,7 @@ import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
 import {
     Administrator,
     DataService,
+    getCustomFieldsDefaults,
     GetProfileDetailDocument,
     LanguageCode,
     NotificationService,
@@ -50,9 +51,7 @@ export class ProfileComponent
         firstName: ['', Validators.required],
         lastName: ['', Validators.required],
         password: [''],
-        customFields: this.formBuilder.group(
-            this.customFields.reduce((hash, field) => ({ ...hash, [field.name]: '' }), {}),
-        ),
+        customFields: this.formBuilder.group(getCustomFieldsDefaults(this.customFields)),
     });
 
     constructor(

+ 2 - 3
packages/admin-ui/src/lib/settings/src/components/seller-detail/seller-detail.component.ts

@@ -4,6 +4,7 @@ import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
 import {
     CreateSellerInput,
     DataService,
+    getCustomFieldsDefaults,
     GetSellerDetailDocument,
     LanguageCode,
     NotificationService,
@@ -42,9 +43,7 @@ export class SellerDetailComponent
     customFields = this.getCustomFieldConfig('Seller');
     detailForm = this.formBuilder.group({
         name: ['', Validators.required],
-        customFields: this.formBuilder.group(
-            this.customFields.reduce((hash, field) => ({ ...hash, [field.name]: '' }), {}),
-        ),
+        customFields: this.formBuilder.group(getCustomFieldsDefaults(this.customFields)),
     });
     readonly updatePermission = [Permission.SuperAdmin, Permission.UpdateSeller, Permission.CreateSeller];
 

+ 2 - 4
packages/admin-ui/src/lib/settings/src/components/shipping-method-detail/shipping-method-detail.component.ts

@@ -11,13 +11,13 @@ import {
     findTranslation,
     GetActiveChannelQuery,
     getConfigArgValue,
+    getCustomFieldsDefaults,
     GetShippingMethodDetailDocument,
     GetShippingMethodDetailQuery,
     LanguageCode,
     NotificationService,
     Permission,
     SHIPPING_METHOD_FRAGMENT,
-    ShippingMethod,
     ShippingMethodFragment,
     TestShippingMethodInput,
     TestShippingMethodResult,
@@ -60,9 +60,7 @@ export class ShippingMethodDetailComponent
         fulfillmentHandler: ['', Validators.required],
         checker: {} as NonNullable<GetShippingMethodDetailQuery['shippingMethod']>['checker'],
         calculator: {} as NonNullable<GetShippingMethodDetailQuery['shippingMethod']>['calculator'],
-        customFields: this.formBuilder.group(
-            this.customFields.reduce((hash, field) => ({ ...hash, [field.name]: '' }), {}),
-        ),
+        customFields: this.formBuilder.group(getCustomFieldsDefaults(this.customFields)),
     });
     checkers: ConfigurableOperationDefinition[] = [];
     calculators: ConfigurableOperationDefinition[] = [];

+ 2 - 3
packages/admin-ui/src/lib/settings/src/components/tax-category-detail/tax-category-detail.component.ts

@@ -4,6 +4,7 @@ import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
 import {
     CreateTaxCategoryInput,
     DataService,
+    getCustomFieldsDefaults,
     GetTaxCategoryDetailDocument,
     LanguageCode,
     NotificationService,
@@ -39,9 +40,7 @@ export class TaxCategoryDetailComponent
     detailForm = this.formBuilder.group({
         name: ['', Validators.required],
         isDefault: false,
-        customFields: this.formBuilder.group(
-            this.customFields.reduce((hash, field) => ({ ...hash, [field.name]: '' }), {}),
-        ),
+        customFields: this.formBuilder.group(getCustomFieldsDefaults(this.customFields)),
     });
     readonly updatePermission = [Permission.UpdateSettings, Permission.UpdateTaxCategory];
 

+ 2 - 4
packages/admin-ui/src/lib/settings/src/components/tax-rate-detail/tax-rate-detail.component.ts

@@ -5,13 +5,13 @@ import {
     CreateTaxRateInput,
     CustomerGroup,
     DataService,
+    getCustomFieldsDefaults,
     GetTaxRateDetailDocument,
     LanguageCode,
     NotificationService,
     Permission,
     TAX_RATE_FRAGMENT,
     TaxCategoryFragment,
-    TaxRate,
     TaxRateFragment,
     TypedBaseDetailComponent,
     UpdateTaxRateInput,
@@ -47,9 +47,7 @@ export class TaxRateDetailComponent
         taxCategoryId: ['', Validators.required],
         zoneId: ['', Validators.required],
         customerGroupId: [''],
-        customFields: this.formBuilder.group(
-            this.customFields.reduce((hash, field) => ({ ...hash, [field.name]: '' }), {}),
-        ),
+        customFields: this.formBuilder.group(getCustomFieldsDefaults(this.customFields)),
     });
     taxCategories$: Observable<TaxCategoryFragment[]>;
     groups$: Observable<CustomerGroup[]>;

+ 2 - 3
packages/admin-ui/src/lib/settings/src/components/zone-detail/zone-detail.component.ts

@@ -4,6 +4,7 @@ import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';
 import {
     CreateZoneInput,
     DataService,
+    getCustomFieldsDefaults,
     GetZoneDetailDocument,
     GetZoneDetailQuery,
     LanguageCode,
@@ -42,9 +43,7 @@ export class ZoneDetailComponent
     customFields = this.getCustomFieldConfig('Zone');
     detailForm = this.formBuilder.group({
         name: ['', Validators.required],
-        customFields: this.formBuilder.group(
-            this.customFields.reduce((hash, field) => ({ ...hash, [field.name]: '' }), {}),
-        ),
+        customFields: this.formBuilder.group(getCustomFieldsDefaults(this.customFields)),
     });
     readonly updatePermission = [Permission.UpdateSettings, Permission.UpdateZone];