Browse Source

feat(admin-ui): Support custom fields on custom entities

Relates to #1848
Michael Bromley 2 years ago
parent
commit
74aeb86dca

+ 1 - 1
packages/admin-ui/src/lib/core/src/common/base-list.component.ts

@@ -262,7 +262,7 @@ export class TypedBaseListComponent<
         this.dataService.client.setContentLanguage(code).subscribe();
         this.dataService.client.setContentLanguage(code).subscribe();
     }
     }
 
 
-    getCustomFieldConfig(key: Exclude<keyof CustomFields, '__typename'>): CustomFieldConfig[] {
+    getCustomFieldConfig(key: Exclude<keyof CustomFields, '__typename'> | string): CustomFieldConfig[] {
         return this.serverConfigService.getCustomFieldsFor(key);
         return this.serverConfigService.getCustomFieldsFor(key);
     }
     }
 }
 }

File diff suppressed because it is too large
+ 0 - 0
packages/admin-ui/src/lib/core/src/common/generated-types.ts


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

@@ -85,7 +85,7 @@ export class CoreModule {
 
 
         const lastLanguage = this.localStorageService.get('uiLanguageCode');
         const lastLanguage = this.localStorageService.get('uiLanguageCode');
         const availableLanguages = getAppConfig().availableLanguages;
         const availableLanguages = getAppConfig().availableLanguages;
-        const availableLocales = getAppConfig().availableLocales;
+        const availableLocales = getAppConfig().availableLocales ?? [defaultLocale];
 
 
         if (!!defaultLanguage && !availableLanguages.includes(defaultLanguage)) {
         if (!!defaultLanguage && !availableLanguages.includes(defaultLanguage)) {
             throw new Error(
             throw new Error(

+ 3 - 80
packages/admin-ui/src/lib/core/src/data/definitions/settings-definitions.ts

@@ -696,86 +696,9 @@ export const GET_SERVER_CONFIG = gql`
                     description
                     description
                     assignable
                     assignable
                 }
                 }
-                customFieldConfig {
-                    Address {
-                        ...CustomFields
-                    }
-                    Administrator {
-                        ...CustomFields
-                    }
-                    Asset {
-                        ...CustomFields
-                    }
-                    Channel {
-                        ...CustomFields
-                    }
-                    Collection {
-                        ...CustomFields
-                    }
-                    Customer {
-                        ...CustomFields
-                    }
-                    CustomerGroup {
-                        ...CustomFields
-                    }
-                    Facet {
-                        ...CustomFields
-                    }
-                    FacetValue {
-                        ...CustomFields
-                    }
-                    Fulfillment {
-                        ...CustomFields
-                    }
-                    GlobalSettings {
-                        ...CustomFields
-                    }
-                    Order {
-                        ...CustomFields
-                    }
-                    OrderLine {
-                        ...CustomFields
-                    }
-                    PaymentMethod {
-                        ...CustomFields
-                    }
-                    Product {
-                        ...CustomFields
-                    }
-                    ProductOption {
-                        ...CustomFields
-                    }
-                    ProductOptionGroup {
-                        ...CustomFields
-                    }
-                    ProductVariant {
-                        ...CustomFields
-                    }
-                    Promotion {
-                        ...CustomFields
-                    }
-                    Region {
-                        ...CustomFields
-                    }
-                    Seller {
-                        ...CustomFields
-                    }
-                    ShippingMethod {
-                        ...CustomFields
-                    }
-                    StockLocation {
-                        ...CustomFields
-                    }
-                    TaxCategory {
-                        ...CustomFields
-                    }
-                    TaxRate {
-                        ...CustomFields
-                    }
-                    User {
-                        ...CustomFields
-                    }
-                    Zone {
+                entityCustomFields {
+                    entityName
+                    customFields {
                         ...CustomFields
                         ...CustomFields
                     }
                     }
                 }
                 }

+ 3 - 3
packages/admin-ui/src/lib/core/src/data/providers/base-data.service.ts

@@ -7,7 +7,7 @@ import { DocumentNode } from 'graphql/language/ast';
 import { Observable } from 'rxjs';
 import { Observable } from 'rxjs';
 import { map } from 'rxjs/operators';
 import { map } from 'rxjs/operators';
 
 
-import { CustomFields } from '../../common/generated-types';
+import { CustomFieldConfig } from '../../common/generated-types';
 import { QueryResult } from '../query-result';
 import { QueryResult } from '../query-result';
 import { ServerConfigService } from '../server-config';
 import { ServerConfigService } from '../server-config';
 import { addCustomFields } from '../utils/add-custom-fields';
 import { addCustomFields } from '../utils/add-custom-fields';
@@ -21,8 +21,8 @@ import { transformRelationCustomFieldInputs } from '../utils/transform-relation-
 export class BaseDataService {
 export class BaseDataService {
     constructor(private apollo: Apollo, private serverConfigService: ServerConfigService) {}
     constructor(private apollo: Apollo, private serverConfigService: ServerConfigService) {}
 
 
-    private get customFields(): CustomFields {
-        return this.serverConfigService.serverConfig.customFieldConfig || {};
+    private get customFields(): Map<string, CustomFieldConfig[]> {
+        return this.serverConfigService.customFieldsMap;
     }
     }
 
 
     /**
     /**

+ 8 - 5
packages/admin-ui/src/lib/core/src/data/server-config.ts

@@ -24,8 +24,8 @@ export function initializeServerConfigService(serverConfigService: ServerConfigS
  */
  */
 @Injectable()
 @Injectable()
 export class ServerConfigService {
 export class ServerConfigService {
-    private _serverConfig: ServerConfig = {} as any;
-
+    private _serverConfig: GetServerConfigQuery['globalSettings']['serverConfig'] = {} as any;
+    customFieldsMap: Map<string, CustomFieldConfig[]> = new Map();
     private get baseDataService() {
     private get baseDataService() {
         return this.injector.get<BaseDataService>(BaseDataService);
         return this.injector.get<BaseDataService>(BaseDataService);
     }
     }
@@ -49,6 +49,9 @@ export class ServerConfigService {
         ).then(
         ).then(
             result => {
             result => {
                 this._serverConfig = result.globalSettings.serverConfig;
                 this._serverConfig = result.globalSettings.serverConfig;
+                for (const entityCustomFields of this._serverConfig.entityCustomFields) {
+                    this.customFieldsMap.set(entityCustomFields.entityName, entityCustomFields.customFields);
+                }
             },
             },
             err => {
             err => {
                 // Let the error fall through to be caught by the http interceptor.
                 // Let the error fall through to be caught by the http interceptor.
@@ -73,8 +76,8 @@ export class ServerConfigService {
     /**
     /**
      * Retrieves the custom field configs for the given entity type.
      * Retrieves the custom field configs for the given entity type.
      */
      */
-    getCustomFieldsFor(type: Exclude<keyof CustomFields, '__typename'>): CustomFieldConfig[] {
-        return this.serverConfig.customFieldConfig[type] || [];
+    getCustomFieldsFor(type: Exclude<keyof CustomFields, '__typename'> | string): CustomFieldConfig[] {
+        return this.customFieldsMap.get(type) || [];
     }
     }
 
 
     getOrderProcessStates(): OrderProcessState[] {
     getOrderProcessStates(): OrderProcessState[] {
@@ -89,7 +92,7 @@ export class ServerConfigService {
         return this.serverConfig.permissions;
         return this.serverConfig.permissions;
     }
     }
 
 
-    get serverConfig(): ServerConfig {
+    get serverConfig(): GetServerConfigQuery['globalSettings']['serverConfig'] {
         return this._serverConfig;
         return this._serverConfig;
     }
     }
 }
 }

+ 11 - 3
packages/admin-ui/src/lib/core/src/data/utils/add-custom-fields.ts

@@ -7,13 +7,21 @@ import {
     SelectionNode,
     SelectionNode,
 } from 'graphql';
 } from 'graphql';
 
 
-import { CustomFields, RelationCustomFieldFragment } from '../../common/generated-types';
+import {
+    CustomFieldConfig,
+    CustomFields,
+    EntityCustomFields,
+    RelationCustomFieldFragment,
+} from '../../common/generated-types';
 
 
 /**
 /**
  * Given a GraphQL AST (DocumentNode), this function looks for fragment definitions and adds and configured
  * Given a GraphQL AST (DocumentNode), this function looks for fragment definitions and adds and configured
  * custom fields to those fragments.
  * custom fields to those fragments.
  */
  */
-export function addCustomFields(documentNode: DocumentNode, customFields: CustomFields): DocumentNode {
+export function addCustomFields(
+    documentNode: DocumentNode,
+    customFields: Map<string, CustomFieldConfig[]>,
+): DocumentNode {
     const fragmentDefs = documentNode.definitions.filter(isFragmentDefinition);
     const fragmentDefs = documentNode.definitions.filter(isFragmentDefinition);
 
 
     for (const fragmentDef of fragmentDefs) {
     for (const fragmentDef of fragmentDefs) {
@@ -33,7 +41,7 @@ export function addCustomFields(documentNode: DocumentNode, customFields: Custom
             entityType = 'Region';
             entityType = 'Region';
         }
         }
 
 
-        const customFieldsForType = customFields[entityType];
+        const customFieldsForType = customFields.get(entityType);
         if (customFieldsForType && customFieldsForType.length) {
         if (customFieldsForType && customFieldsForType.length) {
             (fragmentDef.selectionSet.selections as SelectionNode[]).push({
             (fragmentDef.selectionSet.selections as SelectionNode[]).push({
                 name: {
                 name: {

Some files were not shown because too many files changed in this diff