reference type changes

This commit is contained in:
amentis 2024-02-15 16:43:12 +02:00
parent 20498001b3
commit aabcdd8c65
8 changed files with 323 additions and 550 deletions

View File

@ -113,18 +113,23 @@ public class AuthenticationConfigurationPersist {
.must(() -> !this.isNull(item.getEnabled()))
.failOn(AuthenticationConfigurationPersist._enabled).failWith(messageSource.getMessage("Validation_Required", new Object[]{AuthenticationConfigurationPersist._enabled}, LocaleContextHolder.getLocale())),
this.spec()
.iff(() -> !this.isNull(item.getEnabled()))
.must(() -> !this.isEmpty(item.getAuthUrl()))
.failOn(AuthenticationConfigurationPersist._authUrl).failWith(messageSource.getMessage("Validation_Required", new Object[]{AuthenticationConfigurationPersist._authUrl}, LocaleContextHolder.getLocale())),
this.spec()
.iff(() -> !this.isNull(item.getEnabled()))
.must(() -> !this.isNull(item.getAuthMethod()))
.failOn(AuthenticationConfigurationPersist._authMethod).failWith(messageSource.getMessage("Validation_Required", new Object[]{AuthenticationConfigurationPersist._authMethod}, LocaleContextHolder.getLocale())),
this.spec()
.iff(() -> !this.isNull(item.getEnabled()))
.must(() -> !this.isEmpty(item.getAuthTokenPath()))
.failOn(AuthenticationConfigurationPersist._authTokenPath).failWith(messageSource.getMessage("Validation_Required", new Object[]{AuthenticationConfigurationPersist._authTokenPath}, LocaleContextHolder.getLocale())),
this.spec()
.iff(() -> !this.isNull(item.getEnabled()))
.must(() -> !this.isEmpty(item.getAuthRequestBody()))
.failOn(AuthenticationConfigurationPersist._authRequestBody).failWith(messageSource.getMessage("Validation_Required", new Object[]{AuthenticationConfigurationPersist._authRequestBody}, LocaleContextHolder.getLocale())),
this.spec()
.iff(() -> !this.isNull(item.getEnabled()))
.must(() -> !this.isEmpty(item.getType()))
.failOn(AuthenticationConfigurationPersist._type).failWith(messageSource.getMessage("Validation_Required", new Object[]{AuthenticationConfigurationPersist._type}, LocaleContextHolder.getLocale()))
);

View File

@ -98,7 +98,11 @@ public class QueryCaseConfigPersist {
return Arrays.asList(
this.spec()
.must(() -> !this.isEmpty(item.getValue()))
.failOn(QueryCaseConfigPersist._value).failWith(messageSource.getMessage("Validation_Required", new Object[]{QueryCaseConfigPersist._value}, LocaleContextHolder.getLocale()))
.failOn(QueryCaseConfigPersist._value).failWith(messageSource.getMessage("Validation_Required", new Object[]{QueryCaseConfigPersist._value}, LocaleContextHolder.getLocale())),
this.spec()
.iff(() -> this.isValidGuid(item.getReferenceTypeId()))
.must(() -> !this.isEmpty(item.getReferenceTypeSourceKey()))
.failOn(QueryCaseConfigPersist._referenceTypeSourceKey).failWith(messageSource.getMessage("Validation_Required", new Object[]{QueryCaseConfigPersist._referenceTypeSourceKey}, LocaleContextHolder.getLocale()))
);
}
}

View File

@ -2,6 +2,7 @@ import { ReferenceFieldDataType } from "@app/core/common/enum/reference-field-da
import { ReferenceTypeExternalApiHTTPMethodType } from "@app/core/common/enum/reference-type-external-api-http-method-type";
import { ReferenceTypeSourceType } from "@app/core/common/enum/reference-type-source-type";
import { BaseEntity, BaseEntityPersist } from "@common/base/base-entity.model";
import { Guid } from "@common/types/guid";
export interface ReferenceType extends BaseEntity{
name: string;
@ -26,7 +27,7 @@ export interface ReferenceTypeSourceBaseConfiguration extends ReferenceTypeSourc
key: string;
label: string;
ordinal: number;
dependencies: ReferenceTypeSourceBaseDependency[];
referenceTypeDependencies?: ReferenceType[];
}
export interface ReferenceTypeSourceExternalApiConfiguration{
@ -34,7 +35,6 @@ export interface ReferenceTypeSourceExternalApiConfiguration{
results: ResultsConfiguration;
paginationPath: string;
contentType: string;
//funderQuery?: string;
firstPage: string;
httpMethod: ReferenceTypeExternalApiHTTPMethodType;
requestBody?: string;
@ -64,10 +64,17 @@ export interface AuthenticationConfiguration{
}
export interface QueryConfig{
condition: string;
name: string;
defaultValue: string;
cases: QueryCaseConfig[];
}
export interface QueryCaseConfig{
likePattern: string,
separator: string;
value: string;
ordinal: number;
referenceType?: ReferenceType;
referenceTypeSourceKey: string
}
export interface ReferenceTypeSourceStaticOptionConfiguration{
@ -79,20 +86,6 @@ export interface ReferenceTypeStaticOption{
value: string;
}
export interface ReferenceTypeSourceBaseDependency{
referenceTypeCode: string;
key: string;
required: boolean;
properties: DependencyProperty[];
}
export interface DependencyProperty{
code: string;
target: string;
required: boolean;
}
// Persist
export interface ReferenceTypePersist extends BaseEntityPersist{
@ -118,7 +111,7 @@ export interface ReferenceTypeSourceBaseConfigurationPersist extends ReferenceTy
key: string;
label: string;
ordinal: number;
dependencies?: ReferenceTypeSourceBaseDependencyPersist[];
referenceTypeDependencyIds?: Guid[];
}
export interface ReferenceTypeSourceExternalApiConfigurationPersist{
@ -126,8 +119,6 @@ export interface ReferenceTypeSourceExternalApiConfigurationPersist{
results: ResultsConfigurationPersist;
paginationPath: string;
contentType: string;
// toDo move to a general query
//funderQuery?: string;
firstPage: string;
httpMethod: ReferenceTypeExternalApiHTTPMethodType;
requestBody?: string;
@ -158,10 +149,17 @@ export interface AuthenticationConfigurationPersist{
}
export interface QueryConfigPersist{
condition: string;
name: string;
defaultValue: string;
cases: QueryCaseConfigPersist[];
}
export interface QueryCaseConfigPersist{
likePattern: string,
separator: string;
value: string;
ordinal: number;
referenceTypeId: Guid;
referenceTypeSourceKey: string
}
export interface ReferenceTypeSourceStaticOptionConfigurationPersist {
@ -172,16 +170,3 @@ export interface ReferenceTypeStaticOptionPersist{
code: string;
value: string;
}
export interface ReferenceTypeSourceBaseDependencyPersist{
referenceTypeCode: string;
key: string;
required: boolean;
properties: DependencyPropertyPersist[];
}
export interface DependencyPropertyPersist{
code: string;
target: string;
required: boolean;
}

View File

@ -173,11 +173,19 @@
<div class="col-6">
<mat-form-field class="w-100">
<mat-label>{{'REFERENCE-TYPE-EDITOR.FIELDS.ORDINAL' | translate}}</mat-label>
<input matInput type="text" name="ordinal" [formControl]="source.get('ordinal')" required>
<input matInput type="number" name="ordinal" [formControl]="source.get('ordinal')" required>
<mat-error *ngIf="source.get('ordinal').hasError('backendError')">{{source.get('ordinal').getError('backendError').message}}</mat-error>
<mat-error *ngIf="source.get('ordinal').hasError('required')">{{'GENERAL.VALIDATION.REQUIRED' | translate}}</mat-error>
</mat-form-field>
</div>
<div class="col-6">
<mat-form-field class="w-100">
<mat-label>{{'REFERENCE-TYPE-EDITOR.FIELDS.DEPENDENCIES' | translate}}</mat-label>
<app-multiple-auto-complete [formControl]="source.get('referenceTypeDependencyIds')" [configuration]="referenceTypeService.multipleAutocompleteConfiguration"></app-multiple-auto-complete>
<mat-error *ngIf="source.get('referenceTypeDependencyIds').hasError('backendError')">{{source.get('referenceTypeDependencyIds').getError('backendError').message}}</mat-error>
<mat-error *ngIf="source.get('referenceTypeDependencyIds').hasError('required')">{{'GENERAL.VALIDATION.REQUIRED' | translate}}</mat-error>
</mat-form-field>
</div>
<div class="col-6">
<mat-form-field class="w-100">
<mat-label>{{'REFERENCE-TYPE-EDITOR.FIELDS.SOURCE-TYPE' | translate}}</mat-label>
@ -348,7 +356,7 @@
</div>
<!-- Queries info -->
<h3 class="col-12">{{'REFERENCE-TYPE-EDITOR.FIELDS.QUERIES' | translate}}
<button mat-button type="button" (click)="addQuery(sourceIndex)" [disabled]="formGroup.disabled">{{'REFERENCE-TYPE-EDITOR.ACTIONS.ADD-QUERY' | translate}}</button>
<button mat-button type="button" class="action-btn" (click)="addQuery(sourceIndex)" [disabled]="formGroup.disabled">{{'REFERENCE-TYPE-EDITOR.ACTIONS.ADD-QUERY' | translate}}</button>
</h3>
<div class="col-12">
<div *ngFor="let query of source.get('queries').controls; let queryIndex=index;" class="row mb-3">
@ -363,40 +371,95 @@
<mat-icon>delete</mat-icon>
</button>
</div>
<div class="col-auto">
<button mat-button class="action-btn" type="button" (click)="addCase(sourceIndex, queryIndex)" [disabled]="formGroup.disabled">{{'REFERENCE-TYPE-EDITOR.ACTIONS.ADD-CASE' | translate}}</button>
</div>
</div>
</mat-card-header>
<mat-card-content>
<div class="row">
<div class="col-6">
<mat-form-field class="w-100">
<mat-label>{{'REFERENCE-TYPE-EDITOR.FIELDS.CONDITION' | translate}}</mat-label>
<input matInput type="text" name="condition" [formControl]="query.get('condition')" required>
<mat-error *ngIf="query.get('condition').hasError('backendError')">{{query.get('condition').getError('backendError').message}}</mat-error>
<mat-error *ngIf="query.get('condition').hasError('required')">{{'GENERAL.VALIDATION.REQUIRED' | translate}}</mat-error>
<mat-label>{{'REFERENCE-TYPE-EDITOR.FIELDS.NAME' | translate}}</mat-label>
<input matInput type="text" name="name" [formControl]="query.get('name')" required>
<mat-error *ngIf="query.get('name').hasError('backendError')">{{query.get('name').getError('backendError').message}}</mat-error>
<mat-error *ngIf="query.get('name').hasError('required')">{{'GENERAL.VALIDATION.REQUIRED' | translate}}</mat-error>
</mat-form-field>
</div>
<div class="col-6">
<mat-form-field class="w-100">
<mat-label>{{'REFERENCE-TYPE-EDITOR.FIELDS.DEFAULT-VALUE' | translate}}</mat-label>
<input matInput type="text" name="defaultValue" [formControl]="query.get('defaultValue')">
<mat-error *ngIf="query.get('defaultValue').hasError('backendError')">{{query.get('defaultValue').getError('backendError').message}}</mat-error>
<mat-error *ngIf="query.get('defaultValue').hasError('required')">{{'GENERAL.VALIDATION.REQUIRED' | translate}}</mat-error>
</mat-form-field>
</div>
</div>
</mat-card-content>
</div>
<!-- Query Cases -->
<div *ngFor="let case of query.get('cases').controls; let caseIndex=index;" class="row mb-3">
<div class="col-12">
<mat-card-header>
<div class="row mb-3 d-flex align-items-center">
<div class="col-auto d-flex">
<h4 class="col-12">{{'REFERENCE-TYPE-EDITOR.FIELDS.CASE' | translate}} {{caseIndex + 1}}</h4>
</div>
<div class="col-auto d-flex">
<button mat-icon-button class="action-list-icon" matTooltip="{{'REFERENCE-TYPE-EDITOR.ACTIONS.REMOVE-CASE' | translate}}" (click)="removeCase(sourceIndex, queryIndex, caseIndex)" [disabled]="formGroup.disabled">
<mat-icon>delete</mat-icon>
</button>
</div>
</div>
</mat-card-header>
<mat-card-content>
<div class="row">
<div class="col-6">
<mat-form-field class="w-100">
<mat-label>{{'REFERENCE-TYPE-EDITOR.FIELDS.LIKE-PATTERN' | translate}}</mat-label>
<input matInput type="text" name="likePattern" [formControl]="case.get('likePattern')">
<mat-error *ngIf="case.get('likePattern').hasError('backendError')">{{case.get('likePattern').getError('backendError').message}}</mat-error>
<mat-error *ngIf="case.get('likePattern').hasError('required')">{{'GENERAL.VALIDATION.REQUIRED' | translate}}</mat-error>
</mat-form-field>
</div>
<div class="col-6">
<mat-form-field class="w-100">
<mat-label>{{'REFERENCE-TYPE-EDITOR.FIELDS.SEPARATOR' | translate}}</mat-label>
<input matInput type="text" name="separator" [formControl]="query.get('separator')" required>
<mat-error *ngIf="query.get('separator').hasError('backendError')">{{query.get('separator').getError('backendError').message}}</mat-error>
<mat-error *ngIf="query.get('separator').hasError('required')">{{'GENERAL.VALIDATION.REQUIRED' | translate}}</mat-error>
<input matInput type="text" name="separator" [formControl]="case.get('separator')">
<mat-error *ngIf="case.get('separator').hasError('backendError')">{{case.get('separator').getError('backendError').message}}</mat-error>
<mat-error *ngIf="case.get('separator').hasError('required')">{{'GENERAL.VALIDATION.REQUIRED' | translate}}</mat-error>
</mat-form-field>
</div>
<div class="col-6">
<mat-form-field class="w-100">
<mat-label>{{'REFERENCE-TYPE-EDITOR.FIELDS.VALUE' | translate}}</mat-label>
<input matInput type="text" name="value" [formControl]="query.get('value')" required>
<mat-error *ngIf="query.get('value').hasError('backendError')">{{query.get('value').getError('backendError').message}}</mat-error>
<mat-error *ngIf="query.get('value').hasError('required')">{{'GENERAL.VALIDATION.REQUIRED' | translate}}</mat-error>
<input matInput type="text" name="value" [formControl]="case.get('value')">
<mat-error *ngIf="case.get('value').hasError('backendError')">{{case.get('value').getError('backendError').message}}</mat-error>
<mat-error *ngIf="case.get('value').hasError('required')">{{'GENERAL.VALIDATION.REQUIRED' | translate}}</mat-error>
</mat-form-field>
</div>
<div class="col-6">
<mat-form-field class="w-100">
<mat-label>{{'REFERENCE-TYPE-EDITOR.FIELDS.ORDINAL' | translate}}</mat-label>
<input matInput type="text" name="value" [formControl]="query.get('ordinal')" required>
<mat-error *ngIf="query.get('ordinal').hasError('backendError')">{{query.get('ordinal').getError('backendError').message}}</mat-error>
<mat-error *ngIf="query.get('ordinal').hasError('required')">{{'GENERAL.VALIDATION.REQUIRED' | translate}}</mat-error>
<mat-label>{{'REFERENCE-TYPE-EDITOR.FIELDS.REFERENCE-TYPE' | translate}}</mat-label>
<mat-select (selectionChange)="selectedReferenceTypeChanged($event.value)" name="referenceTypeId" [formControl]="case.get('referenceTypeId')">
<mat-option *ngFor="let referenceType of referenceTypes" [value]="referenceType.id">
{{referenceType.code}}
</mat-option>
</mat-select>
<mat-error *ngIf="case.get('referenceTypeId').hasError('backendError')">{{case.get('referenceTypeId').getError('backendError').message}}</mat-error>
<mat-error *ngIf="case.get('referenceTypeId').hasError('required')">{{'GENERAL.VALIDATION.REQUIRED' | translate}}</mat-error>
</mat-form-field>
</div>
<div class="col-6" *ngIf="case.get('referenceTypeId').value">
<mat-form-field class="w-100">
<mat-label>{{'REFERENCE-TYPE-EDITOR.FIELDS.SOURCE-KEY' | translate}}</mat-label>
<mat-select name = 'referenceTypeSourceKey' [formControl]="case.get('referenceTypeSourceKey')">
<mat-option *ngFor="let sourceKey of sourceKeysMap.get(case.get('referenceTypeId').value)" [value]="sourceKey">
{{sourceKey}}
</mat-option>
</mat-select>
<mat-error *ngIf="case.get('referenceTypeSourceKey').hasError('backendError')">{{case.get('referenceTypeSourceKey').getError('backendError').message}}</mat-error>
<mat-error *ngIf="case.get('referenceTypeSourceKey').hasError('required')">{{'GENERAL.VALIDATION.REQUIRED' | translate}}</mat-error>
</mat-form-field>
</div>
</div>
@ -405,6 +468,7 @@
</div>
</div>
</div>
</div>
<!-- Options -->
<div class="row" *ngIf="source.get('type').value == referenceTypeSourceType.STATIC">
<div class="col-12">
@ -442,123 +506,6 @@
</div>
</div>
</div>
<!-- Dependencies -->
<h3 class="col-12">{{'REFERENCE-TYPE-EDITOR.FIELDS.DEPENDENCIES' | translate}}
<button mat-button type="button" (click)="addDependency(sourceIndex)" [disabled]="formGroup.disabled">{{'REFERENCE-TYPE-EDITOR.ACTIONS.ADD-DEPENDENCY' | translate}}</button>
</h3>
<div class="col-12">
<div *ngFor="let dependency of source.get('dependencies').controls; let dependencyIndex= index;" class="row mb-3">
<div class="col-12">
<mat-card-header>
<div class="row mb-3 d-flex align-items-center">
<div class="col-auto d-flex">
<h3 class="col-12">{{'REFERENCE-TYPE-EDITOR.FIELDS.DEPENDENCY' | translate}} {{dependencyIndex + 1}}</h3>
</div>
<div class="col-auto d-flex">
<button mat-icon-button class="action-list-icon" matTooltip="{{'REFERENCE-TYPE-EDITOR.ACTIONS.REMOVE-DEPENDENCY' | translate}}" (click)="removeDependency(sourceIndex, dependencyIndex)" [disabled]="formGroup.disabled">
<mat-icon>delete</mat-icon>
</button>
</div>
</div>
</mat-card-header>
<mat-card-content>
<div class="row">
<div class="col-6">
<mat-form-field class="w-100">
<mat-label>{{'REFERENCE-TYPE-EDITOR.FIELDS.CODE' | translate}}</mat-label>
<mat-select (selectionChange)="selectedReferenceTypeChanged($event.value)" name="referenceTypeCode" [formControl]="dependency.get('referenceTypeCode')" required>
<mat-option *ngFor="let referenceType of referenceTypes" [value]="referenceType.code">
{{referenceType.code}}
</mat-option>
</mat-select>
<mat-error *ngIf="dependency.get('referenceTypeCode').hasError('backendError')">{{dependency.get('referenceTypeCode').getError('backendError').message}}</mat-error>
<mat-error *ngIf="dependency.get('referenceTypeCode').hasError('required')">{{'GENERAL.VALIDATION.REQUIRED' | translate}}</mat-error>
</mat-form-field>
</div>
<div class="col-6" *ngIf="dependency.get('referenceTypeCode').value">
<mat-form-field class="w-100">
<mat-label>{{'REFERENCE-TYPE-EDITOR.FIELDS.KEY' | translate}}</mat-label>
<mat-select name = 'key' [formControl]="dependency.get('key')" required>
<mat-option *ngFor="let key of sourceKeysMap.get(dependency.get('referenceTypeCode').value)" [value]="key">
{{key}}
</mat-option>
</mat-select>
<mat-error *ngIf="dependency.get('key').hasError('backendError')">{{dependency.get('key').getError('backendError').message}}</mat-error>
<mat-error *ngIf="dependency.get('key').hasError('required')">{{'GENERAL.VALIDATION.REQUIRED' | translate}}</mat-error>
</mat-form-field>
</div>
<div class="col-6">
<mat-form-field class="w-100">
<mat-label>{{'REFERENCE-TYPE-EDITOR.FIELDS.REQUIRED' | translate}}</mat-label>
<input matInput type="text" name="required" [formControl]="dependency.get('required')" required>
<mat-error *ngIf="dependency.get('required').hasError('backendError')">{{dependency.get('required').getError('backendError').message}}</mat-error>
<mat-error *ngIf="dependency.get('required').hasError('required')">{{'GENERAL.VALIDATION.REQUIRED' | translate}}</mat-error>
</mat-form-field>
</div>
</div>
<!-- Properties -->
<h3 class="col-12">{{'REFERENCE-TYPE-EDITOR.FIELDS.PROPERTIES' | translate}}
<button mat-button type="button" (click)="addProperty(sourceIndex, dependencyIndex)" [disabled]="formGroup.disabled">{{'REFERENCE-TYPE-EDITOR.ACTIONS.ADD-PROPERTY' | translate}}</button>
</h3>
<div class="col-12">
<div *ngFor="let property of dependency.get('properties').controls; let propertyIndex= index;" class="row mb-3">
<div class="col-12">
<div class="row mb-3 d-flex align-items-center">
<div class="col-auto d-flex">
<h4>{{'REFERENCE-TYPE-EDITOR.FIELDS.PROPERTY' | translate}} {{propertyIndex + 1}}</h4>
</div>
<div class="col-auto d-flex">
<button mat-icon-button class="action-list-icon" matTooltip="{{'REFERENCE-TYPE-EDITOR.ACTIONS.REMOVE-PROPERTY' | translate}}" (click)="removeProperty(sourceIndex, dependencyIndex, propertyIndex)" [disabled]="formGroup.disabled">
<mat-icon>delete</mat-icon>
</button>
</div>
</div>
<div class="row">
<div class="col-6">
<mat-form-field class="w-100">
<mat-label>{{'REFERENCE-TYPE-EDITOR.FIELDS.CODE' | translate}}</mat-label>
<mat-select name="code" [formControl]="property.get('code')" required>
<mat-option *ngFor="let code of propertyCodes" [value]="code">
{{code}}
</mat-option>
</mat-select>
<mat-error *ngIf="property.get('code').hasError('backendError')">{{property.get('code').getError('backendError').message}}</mat-error>
<mat-error *ngIf="property.get('code').hasError('required')">{{'GENERAL.VALIDATION.REQUIRED' | translate}}</mat-error>
</mat-form-field>
</div>
<div class="col-6">
<mat-form-field class="w-100">
<mat-label>{{'REFERENCE-TYPE-EDITOR.FIELDS.TARGET' | translate}}</mat-label>
<mat-select name = 'target' [formControl]="property.get('target')" required>
<mat-option *ngFor="let targetCode of targetPropertyCodesMap.get(dependency.get('referenceTypeCode').value)" [value]="targetCode">
{{targetCode}}
</mat-option>
</mat-select>
<mat-error *ngIf="property.get('target').hasError('backendError')">{{property.get('target').getError('backendError').message}}</mat-error>
<mat-error *ngIf="property.get('target').hasError('required')">{{'GENERAL.VALIDATION.REQUIRED' | translate}}</mat-error>
</mat-form-field>
</div>
<div class="col-6">
<mat-form-field class="w-100">
<mat-label>{{'REFERENCE-TYPE-EDITOR.FIELDS.REQUIRED' | translate}}</mat-label>
<input matInput type="text" name="required" [formControl]="property.get('required')" required>
<mat-error *ngIf="property.get('required').hasError('backendError')">{{property.get('required').getError('backendError').message}}</mat-error>
<mat-error *ngIf="property.get('required').hasError('required')">{{'GENERAL.VALIDATION.REQUIRED' | translate}}</mat-error>
</mat-form-field>
</div>
</div>
</div>
</div>
<mat-error *ngIf="dependency.get('properties').dirty && dependency.get('properties').hasError('required')">{{'REFERENCE-TYPE-EDITOR.SOURCES-REQUIRED' | translate}}</mat-error>
<mat-error *ngIf="dependency.get('properties').hasError('backendError')">{{dependency.get('properties').getError('backendError').message}}</mat-error>
</div>
</mat-card-content>
</div>
</div>
</div>
</div>
</mat-card-content>
</div>
@ -567,6 +514,7 @@
<mat-error *ngIf="formGroup.get('definition').get('sources').hasError('backendError')">{{formGroup.get('definition').get('sources').getError('backendError').message}}</mat-error>
</div>
</form>
{{formGroup.value | json}}
</mat-card-content>
</mat-card>

View File

@ -25,7 +25,7 @@ import { FilterService } from '@common/modules/text-filter/filter-service';
import { Guid } from '@common/types/guid';
import { TranslateService } from '@ngx-translate/core';
import { map, takeUntil } from 'rxjs/operators';
import { DependencyPropertyEditorModel, QueryConfigEditorModel, ReferenceTypeDefinitionEditorModel, ReferenceTypeEditorModel, ReferenceTypeFieldEditorModel, ReferenceTypeSourceBaseConfigurationEditorModel, ReferenceTypeSourceBaseDependencyEditorModel, ReferenceTypeStaticOptionEditorModel, ResultFieldsMappingConfigurationEditorModel } from './reference-type-editor.model';
import { ReferenceTypeEditorModel} from './reference-type-editor.model';
import { ReferenceTypeEditorResolver } from './reference-type-editor.resolver';
import { ReferenceTypeEditorService } from './reference-type-editor.service';
@ -48,11 +48,7 @@ export class ReferenceTypeEditorComponent extends BaseEditor<ReferenceTypeEditor
public referenceFieldDataTypeEnum = this.enumUtils.getEnumValues<ReferenceFieldDataType>(ReferenceFieldDataType);
public referenceTypeExternalApiHTTPMethodTypeEnum = this.enumUtils.getEnumValues<ReferenceTypeExternalApiHTTPMethodType>(ReferenceTypeExternalApiHTTPMethodType);
referenceTypes: ReferenceType[] = null;
sourceKeys: string[] = [];
sourceKeysMap: Map<string, string[]> = new Map<string, string[]>();
propertyCodes: string[] = [];
targetPropertyCodes: string[] = [];
targetPropertyCodesMap: Map<string, string[]> = new Map<string, string[]>();
sourceKeysMap: Map<Guid, string[]> = new Map<Guid, string[]>();
protected get canDelete(): boolean {
return !this.isDeleted && !this.isNew && this.hasPermission(this.authService.permissionEnum.DeleteReferenceType);
@ -86,7 +82,7 @@ export class ReferenceTypeEditorComponent extends BaseEditor<ReferenceTypeEditor
// Rest dependencies. Inject any other needed deps here:
public authService: AuthService,
public enumUtils: EnumUtils,
private referenceTypeService: ReferenceTypeService,
public referenceTypeService: ReferenceTypeService,
private logger: LoggingService,
private referenceTypeEditorService: ReferenceTypeEditorService
) {
@ -114,18 +110,13 @@ export class ReferenceTypeEditorComponent extends BaseEditor<ReferenceTypeEditor
this.editorModel = data ? new ReferenceTypeEditorModel().fromModel(data) : new ReferenceTypeEditorModel();
this.getReferenceTypes(this.editorModel.id);
this.propertyCodes = this.referenceTypeService.getSystemFields([]);
if (data) {
this.editorModel.definition.sources.forEach(source => source.dependencies.forEach(dependency => {
this.selectedReferenceTypeChanged(dependency.referenceTypeCode);
data.definition.sources?.forEach(source => source.queries?.forEach(query => {
query?.cases?.forEach(queryCase => {
this.selectedReferenceTypeChanged(queryCase.referenceType.id);
})
}));
this.editorModel.definition.fields.forEach(field => {
if (!this.propertyCodes.includes(field.code)) {
this.propertyCodes.push(field.code);
}
});
}
this.isDeleted = data ? data.isActive === IsActive.Inactive : false;
@ -217,15 +208,10 @@ export class ReferenceTypeEditorComponent extends BaseEditor<ReferenceTypeEditor
}
removeField(fieldIndex: number): void {
const fieldCode = (this.formGroup.get('definition').get('fields') as FormArray).at(fieldIndex).get('code').value
const fieldForm = this.formGroup.get('definition').get('fields') as FormArray;
const fieldCode = fieldForm.at(fieldIndex).get('code').value;
if (this.propertyCodes.length > 0) {
if (this.propertyCodes.includes(fieldCode)) {
this.propertyCodes.splice(this.propertyCodes.indexOf(fieldCode), 1);
}
}
(this.formGroup.get('definition').get('fields') as FormArray).removeAt(fieldIndex);
fieldForm.removeAt(fieldIndex);
//Reapply validators
ReferenceTypeEditorModel.reApplyDefinitionFieldsValidators(
@ -234,26 +220,28 @@ export class ReferenceTypeEditorComponent extends BaseEditor<ReferenceTypeEditor
validationErrorModel: this.editorModel.validationErrorModel
}
)
this.formGroup.get('definition').get('fields').markAsDirty();
fieldForm.markAsDirty();
const sourceFormArray = ((this.formGroup.get('definition').get('sources') as FormArray));
const sourceFormArray = (this.formGroup.get('definition').get('sources') as FormArray);
if(sourceFormArray){
for (let i = 0; i < sourceFormArray.length; i++) {
const optionsFormArray = ((this.formGroup.get('definition').get('sources') as FormArray).at(i).get('options') as FormArray);
const optionsFormArray = (sourceFormArray.at(i).get('options') as FormArray);
for (let j = 0; j < optionsFormArray.length; j++) {
if (fieldCode == ((this.formGroup.get('definition').get('sources') as FormArray).at(i).get('options') as FormArray).at(j).get('code').getRawValue()) {
if (fieldCode == optionsFormArray.at(j).get('code').getRawValue()) {
this.removeOption(i, j);
}
}
const fieldMappingFormArray = ((this.formGroup.get('definition').get('sources') as FormArray).at(i).get('results').get('fieldsMapping') as FormArray);
const fieldMappingFormArray = (sourceFormArray.at(i).get('results').get('fieldsMapping') as FormArray);
for (let j = 0; j < fieldMappingFormArray.length; j++) {
if (fieldCode == ((this.formGroup.get('definition').get('sources') as FormArray).at(i).get('results').get('fieldsMapping') as FormArray).at(j).get('code').getRawValue()) {
if (fieldCode == fieldMappingFormArray.at(j).get('code').getRawValue()) {
this.removeFieldMapping(i, j);
}
}
}
}
}
submitFields(): void {
const fieldsFormArray = (this.formGroup.get('definition').get('fields') as FormArray);
@ -266,10 +254,6 @@ export class ReferenceTypeEditorComponent extends BaseEditor<ReferenceTypeEditor
for (let i = 0; i < fieldsFormArray.length; i++) {
this.addFieldMapping(j, fieldsFormArray.at(i).get('code').value);
this.addOption(j, fieldsFormArray.at(i).get('code').value);
if (!this.propertyCodes.includes(fieldsFormArray.at(i).get('code').value)) {
this.propertyCodes.push(fieldsFormArray.at(i).get('code').value);
}
}
}
}
@ -299,7 +283,8 @@ export class ReferenceTypeEditorComponent extends BaseEditor<ReferenceTypeEditor
}
removeSource(sourceIndex: number): void {
(this.formGroup.get('definition').get('sources') as FormArray).removeAt(sourceIndex);
const formArray = (this.formGroup.get('definition').get('sources') as FormArray);
formArray.removeAt(sourceIndex);
ReferenceTypeEditorModel.reApplyDefinitionSourcesValidators(
{
@ -307,7 +292,7 @@ export class ReferenceTypeEditorComponent extends BaseEditor<ReferenceTypeEditor
validationErrorModel: this.editorModel.validationErrorModel
}
)
this.formGroup.get('definition').get('sources').markAsDirty();
formArray.markAsDirty();
}
//
@ -316,7 +301,6 @@ export class ReferenceTypeEditorComponent extends BaseEditor<ReferenceTypeEditor
//
//
addFieldMapping(sourceIndex: number, code: string): void {
const fieldMapping: ResultFieldsMappingConfigurationEditorModel = new ResultFieldsMappingConfigurationEditorModel();
const fieldMappingSize = ((this.formGroup.get('definition').get('sources') as FormArray).at(sourceIndex).get('results').get('fieldsMapping') as FormArray).length;
if (fieldMappingSize > 0) {
@ -366,13 +350,32 @@ export class ReferenceTypeEditorComponent extends BaseEditor<ReferenceTypeEditor
validationErrorModel: this.editorModel.validationErrorModel
}
);
(this.formGroup.get('definition').get('sources') as FormArray).at(sourceIndex).get('queries').markAsDirty();
formArray.markAsDirty();
}
// cases
addCase(sourceIndex: number, queryIndex: number): void {
const formArray = ((this.formGroup.get('definition').get('sources') as FormArray).at(sourceIndex).get('queries') as FormArray).at(queryIndex).get('cases') as FormArray;
formArray.push(this.editorModel.createCase(sourceIndex, queryIndex, formArray.length));
}
removeCase(sourceIndex: number, queryIndex: number, index: number): void {
const formArray = ((this.formGroup.get('definition').get('sources') as FormArray).at(sourceIndex).get('queries') as FormArray).at(queryIndex).get('cases') as FormArray;
formArray.removeAt(index);
ReferenceTypeEditorModel.reApplyDefinitionSourcesValidators(
{
formGroup: this.formGroup,
validationErrorModel: this.editorModel.validationErrorModel
}
);
formArray.markAsDirty();
}
// Options
addOption(sourceIndex: number, code: string): void {
const options: ReferenceTypeStaticOptionEditorModel = new ReferenceTypeStaticOptionEditorModel();
const optionsSize = ((this.formGroup.get('definition').get('sources') as FormArray).at(sourceIndex).get('options') as FormArray).length;
if (optionsSize > 0) {
@ -400,30 +403,6 @@ export class ReferenceTypeEditorComponent extends BaseEditor<ReferenceTypeEditor
(this.formGroup.get('definition').get('sources') as FormArray).at(sourceIndex).get('options').markAsDirty();
}
// Dependencies
addDependency(sourceIndex: number): void {
const depedencySize = ((this.formGroup.get('definition').get('sources') as FormArray).at(sourceIndex).get('dependencies') as FormArray).length;
((this.formGroup.get('definition').get('sources') as FormArray).at(sourceIndex).get('dependencies') as FormArray)
.push(this.editorModel.createDepedency(sourceIndex, depedencySize));
//this.addProperty(sourceIndex, (depedencySize));
}
removeDependency(sourceIndex: number, dependencyIndex: number): void {
const formArray = ((this.formGroup.get('definition').get('sources') as FormArray).at(sourceIndex).get('dependencies') as FormArray);
formArray.removeAt(dependencyIndex);
ReferenceTypeEditorModel.reApplyDefinitionSourcesValidators(
{
formGroup: this.formGroup,
validationErrorModel: this.editorModel.validationErrorModel
}
);
(this.formGroup.get('definition').get('sources') as FormArray).at(sourceIndex).get('dependencies').markAsDirty();
}
private getReferenceTypes(excludedId?: Guid): void {
const lookup = ReferenceTypeService.DefaultReferenceTypeLookup();
@ -434,73 +413,29 @@ export class ReferenceTypeEditorComponent extends BaseEditor<ReferenceTypeEditor
.subscribe(response => {
this.referenceTypes = response.items as ReferenceType[];
this.referenceTypes.forEach(referenceType => {
this.sourceKeysMap.set(referenceType.code, []);
this.targetPropertyCodesMap.set(referenceType.code, []);
this.sourceKeysMap.set(referenceType.id, []);
})
});
}
selectedReferenceTypeChanged(code: string): void {
this.sourceKeys = [];
this.targetPropertyCodes = [];
selectedReferenceTypeChanged(id: Guid): void {
let sourceKeys: string[] = [];
this.referenceTypeService.getSingleWithCode(code, ReferenceTypeEditorResolver.lookupFields())
this.referenceTypeService.getSingle(id, ReferenceTypeEditorResolver.lookupFields())
.pipe(takeUntil(this._destroyed))
.subscribe(data => {
const referenceType = data as ReferenceType;
// source keys
referenceType.definition.sources.forEach(source => {
if (!this.sourceKeys.includes(source.key)) this.sourceKeys.push(source.key)
if (!sourceKeys.includes(source.key)) sourceKeys.push(source.key)
});
if (this.sourceKeysMap.has(code) && this.sourceKeysMap.get(code).length == 0) {
this.sourceKeysMap.set(code, this.sourceKeys);
if (this.sourceKeysMap.has(referenceType.id) && this.sourceKeysMap.get(referenceType.id).length == 0) {
this.sourceKeysMap.set(referenceType.id, sourceKeys);
}
// targetPropertyCodes
let fields = [];
if (referenceType.definition.fields) {
fields = this.referenceTypeService.getSystemFields(referenceType.definition.fields.map(x => x.code));
} else {
fields = this.referenceTypeService.getSystemFields(fields);
}
fields.forEach(field => {
if (!this.targetPropertyCodes.includes(field)) this.targetPropertyCodes.push(field)
})
if (this.targetPropertyCodesMap.has(code) && this.targetPropertyCodesMap.get(code).length == 0) {
this.targetPropertyCodesMap.set(code, this.targetPropertyCodes);
}
});
}
// Properties
addProperty(sourceIndex: number, dependencyIndex: number): void {
if (((this.formGroup.get('definition').get('sources') as FormArray).at(sourceIndex).get('dependencies') as FormArray).at(dependencyIndex).get('referenceTypeCode').value == null) {
return;
}
const formArray = ((this.formGroup.get('definition').get('sources') as FormArray).at(sourceIndex).get('dependencies') as FormArray).at(dependencyIndex).get("properties") as FormArray
formArray.push(this.editorModel.createProperty(sourceIndex, dependencyIndex, formArray.length));
}
removeProperty(sourceIndex: number, dependencyIndex: number, propertyIndex: number): void {
const formArray = (((this.formGroup.get('definition').get('sources') as FormArray).at(sourceIndex).get('dependencies') as FormArray).at(dependencyIndex).get("properties") as FormArray);
formArray.removeAt(propertyIndex);
ReferenceTypeEditorModel.reApplyDefinitionSourcesValidators(
{
formGroup: this.formGroup,
validationErrorModel: this.editorModel.validationErrorModel
}
);
((this.formGroup.get('definition').get('sources') as FormArray).at(sourceIndex).get('dependencies') as FormArray).at(dependencyIndex).get("properties").markAsDirty();
}
}

View File

@ -2,11 +2,12 @@ import { FormArray, UntypedFormArray, UntypedFormBuilder, UntypedFormGroup, Vali
import { ReferenceFieldDataType } from "@app/core/common/enum/reference-field-data-type";
import { ReferenceTypeExternalApiHTTPMethodType } from "@app/core/common/enum/reference-type-external-api-http-method-type";
import { ReferenceTypeSourceType } from "@app/core/common/enum/reference-type-source-type";
import { AuthenticationConfiguration, AuthenticationConfigurationPersist, DependencyProperty, DependencyPropertyPersist, QueryConfig, QueryConfigPersist, ReferenceType, ReferenceTypeDefinition, ReferenceTypeDefinitionPersist, ReferenceTypeField, ReferenceTypeFieldPersist, ReferenceTypePersist, ReferenceTypeSourceBaseConfiguration, ReferenceTypeSourceBaseConfigurationPersist, ReferenceTypeSourceBaseDependency, ReferenceTypeSourceBaseDependencyPersist, ReferenceTypeStaticOption, ReferenceTypeStaticOptionPersist, ResultFieldsMappingConfiguration, ResultFieldsMappingConfigurationPersist, ResultsConfiguration, ResultsConfigurationPersist } from "@app/core/model/reference-type/reference-type";
import { AuthenticationConfiguration, AuthenticationConfigurationPersist, QueryCaseConfig, QueryCaseConfigPersist, QueryConfig, QueryConfigPersist, ReferenceType, ReferenceTypeDefinition, ReferenceTypeDefinitionPersist, ReferenceTypeField, ReferenceTypeFieldPersist, ReferenceTypePersist, ReferenceTypeSourceBaseConfiguration, ReferenceTypeSourceBaseConfigurationPersist, ReferenceTypeStaticOption, ReferenceTypeStaticOptionPersist, ResultFieldsMappingConfiguration, ResultFieldsMappingConfigurationPersist, ResultsConfiguration, ResultsConfigurationPersist } from "@app/core/model/reference-type/reference-type";
import { BaseEditorModel } from "@common/base/base-form-editor-model";
import { BackendErrorValidator } from "@common/forms/validation/custom-validator";
import { ValidationErrorModel } from "@common/forms/validation/error-model/validation-error-model";
import { Validation, ValidationContext } from "@common/forms/validation/validation-context";
import { Guid } from "@common/types/guid";
export class ReferenceTypeEditorModel extends BaseEditorModel implements ReferenceTypePersist {
name: string;
@ -84,14 +85,9 @@ export class ReferenceTypeEditorModel extends BaseEditorModel implements Referen
return query.buildForm({ rootPath: 'definition.sources[' + sourceIndex + '].queries[' + index + '].'});
}
createDepedency(sourceIndex: number, index: number): UntypedFormGroup {
const dependency: ReferenceTypeSourceBaseDependencyEditorModel = new ReferenceTypeSourceBaseDependencyEditorModel(this.validationErrorModel);
return dependency.buildForm({ rootPath: 'definition.sources[' + sourceIndex + '].dependencies[' + index + '].'});
}
createProperty(sourceIndex: number, dependencyIndex: number, index: number): UntypedFormGroup {
const property: DependencyPropertyEditorModel = new DependencyPropertyEditorModel(this.validationErrorModel);
return property.buildForm({ rootPath: 'definition.sources[' + sourceIndex + '].dependencies[' + dependencyIndex + '].properties[' + index + '].'});
createCase(sourceIndex: number, queryIndex: number, index: number): UntypedFormGroup {
const queryCase: QueryCaseConfigEditorModel = new QueryCaseConfigEditorModel(this.validationErrorModel);
return queryCase.buildForm({ rootPath: 'definition.sources[' + sourceIndex + '].queries[' + queryIndex + '].cases[' + index + '].'});
}
static reApplyDefinitionFieldsValidators(params: {
@ -166,9 +162,7 @@ export class ReferenceTypeDefinitionEditorModel implements ReferenceTypeDefiniti
),
sources: this.formBuilder.array(
(this.sources ?? []).map(
(item, index) => new ReferenceTypeSourceBaseConfigurationEditorModel(
this.validationErrorModel
).fromModel(item).buildForm({
(item, index) =>item.buildForm({
rootPath: `${rootPath}sources[${index}].`
})
), context.getValidation('sources').validators
@ -322,7 +316,7 @@ export class ReferenceTypeSourceBaseConfigurationEditorModel implements Referenc
options: ReferenceTypeStaticOptionEditorModel[] = [];
dependencies: ReferenceTypeSourceBaseDependencyEditorModel[] = [];
referenceTypeDependencyIds: Guid[] = [];
protected formBuilder: UntypedFormBuilder = new UntypedFormBuilder();
@ -356,7 +350,7 @@ export class ReferenceTypeSourceBaseConfigurationEditorModel implements Referenc
this.options.push(new ReferenceTypeStaticOptionEditorModel().fromModel({ code: 'description', value: undefined }));
}
if (item.dependencies) { item.dependencies.map(x => this.dependencies.push(new ReferenceTypeSourceBaseDependencyEditorModel(this.validationErrorModel).fromModel(x))); }
if (item.referenceTypeDependencies) { item.referenceTypeDependencies.forEach(referenceType => this.referenceTypeDependencyIds.push(referenceType.id))}
}
return this;
}
@ -395,9 +389,7 @@ export class ReferenceTypeSourceBaseConfigurationEditorModel implements Referenc
}),
queries: this.formBuilder.array(
(this.queries ?? []).map(
(item, index) => new QueryConfigEditorModel(
this.validationErrorModel
).fromModel(item).buildForm({
(item, index) => item.buildForm({
rootPath: `${rootPath}queries[${index}].`
})
), context.getValidation('queries').validators
@ -411,15 +403,7 @@ export class ReferenceTypeSourceBaseConfigurationEditorModel implements Referenc
})
), context.getValidation('options').validators
),
dependencies: this.formBuilder.array(
(this.dependencies ?? []).map(
(item, index) => new ReferenceTypeSourceBaseDependencyEditorModel(
this.validationErrorModel
).fromModel(item).buildForm({
rootPath: `${rootPath}dependencies[${index}].`
})
), context.getValidation('dependencies').validators
)
referenceTypeDependencyIds: [{ value: this.referenceTypeDependencyIds, disabled: disabled }, context.getValidation('referenceTypeDependencyIds').validators],
});
}
@ -449,7 +433,7 @@ export class ReferenceTypeSourceBaseConfigurationEditorModel implements Referenc
baseValidationArray.push({ key: 'options', validators: [BackendErrorValidator(validationErrorModel, `${rootPath}options`)] });
baseValidationArray.push({ key: 'dependencies', validators: [BackendErrorValidator(validationErrorModel, `${rootPath}dependencies`)] });
baseValidationArray.push({ key: 'referenceTypeDependencyIds', validators: [BackendErrorValidator(validationErrorModel, `${rootPath}referenceTypeDependencyIds`)] });
baseContext.validation = baseValidationArray;
return baseContext;
@ -467,7 +451,7 @@ export class ReferenceTypeSourceBaseConfigurationEditorModel implements Referenc
validationErrorModel
});
['type', 'key', 'label', 'ordinal', 'url', 'paginationPath', 'contentType', 'firstPage', 'httpMethod', 'requestBody','filterType'].forEach(keyField => {
['type', 'key', 'label', 'ordinal', 'url', 'paginationPath', 'contentType', 'firstPage', 'httpMethod', 'requestBody','filterType', 'referenceTypeDependencyIds'].forEach(keyField => {
const control = formGroup?.get(keyField);
control?.clearValidators();
control?.addValidators(context.getValidation(keyField).validators);
@ -502,13 +486,6 @@ export class ReferenceTypeSourceBaseConfigurationEditorModel implements Referenc
})
);
(formGroup.get('dependencies') as FormArray).controls?.forEach(
(control, index) => ReferenceTypeSourceBaseDependencyEditorModel.reapplyDepedencyValidators({
formGroup: control as UntypedFormGroup,
rootPath: `${rootPath}dependencies[${index}].`,
validationErrorModel: validationErrorModel
})
);
}
}
@ -526,9 +503,9 @@ export class ResultsConfigurationEditorModel implements ResultsConfigurationPers
this.resultsArrayPath = item.resultsArrayPath;
if (item.fieldsMapping) { item.fieldsMapping.map(x => this.fieldsMapping.push(new ResultFieldsMappingConfigurationEditorModel(this.validationErrorModel).fromModel(x))); }
else {
this.fieldsMapping.push(new ResultFieldsMappingConfigurationEditorModel().fromModel({ code: 'reference_id', responsePath: undefined }));
this.fieldsMapping.push(new ResultFieldsMappingConfigurationEditorModel().fromModel({ code: 'label', responsePath: undefined }));
this.fieldsMapping.push(new ResultFieldsMappingConfigurationEditorModel().fromModel({ code: 'description', responsePath: undefined }));
this.fieldsMapping.push(new ResultFieldsMappingConfigurationEditorModel(this.validationErrorModel).fromModel({ code: 'reference_id', responsePath: undefined }));
this.fieldsMapping.push(new ResultFieldsMappingConfigurationEditorModel(this.validationErrorModel).fromModel({ code: 'label', responsePath: undefined }));
this.fieldsMapping.push(new ResultFieldsMappingConfigurationEditorModel(this.validationErrorModel).fromModel({ code: 'description', responsePath: undefined }));
}
return this;
}
@ -764,10 +741,9 @@ export class AuthenticationConfigurationEditorModel implements AuthenticationCon
}
export class QueryConfigEditorModel implements QueryConfigPersist {
public condition: string;
public separator: string;
public value: string;
public ordinal: number;
public name: string;
public defaultValue: string;
public cases: QueryCaseConfigEditorModel[] = [];
protected formBuilder: UntypedFormBuilder = new UntypedFormBuilder();
@ -776,10 +752,9 @@ export class QueryConfigEditorModel implements QueryConfigPersist {
) { }
fromModel(item: QueryConfig): QueryConfigEditorModel {
this.condition = item.condition;
this.separator = item.separator;
this.value = item.value;
this.ordinal = item.ordinal;
this.name = item.name;
this.defaultValue = item.defaultValue;
if (item.cases) { item.cases.map(x => this.cases.push(new QueryCaseConfigEditorModel(this.validationErrorModel).fromModel(x))); }
return this;
}
@ -798,10 +773,15 @@ export class QueryConfigEditorModel implements QueryConfigPersist {
}
return this.formBuilder.group({
condition: [{ value: this.condition, disabled: disabled }, context.getValidation('condition').validators],
separator: [{ value: this.separator, disabled: disabled }, context.getValidation('separator').validators],
value: [{ value: this.value, disabled: disabled }, context.getValidation('value').validators],
ordinal: [{ value: this.ordinal, disabled: disabled }, context.getValidation('ordinal').validators],
name: [{ value: this.name, disabled: disabled }, context.getValidation('name').validators],
defaultValue: [{ value: this.defaultValue, disabled: disabled }, context.getValidation('defaultValue').validators],
cases: this.formBuilder.array(
(this.cases ?? []).map(
(item, index) => item.buildForm({
rootPath: `${rootPath}cases[${index}].`
})
), context.getValidation('cases').validators
)
});
}
@ -813,10 +793,9 @@ export class QueryConfigEditorModel implements QueryConfigPersist {
const baseContext: ValidationContext = new ValidationContext();
const baseValidationArray: Validation[] = new Array<Validation>();
baseValidationArray.push({ key: 'condition', validators: [Validators.required, BackendErrorValidator(validationErrorModel, `${rootPath}condition`)] });
baseValidationArray.push({ key: 'separator', validators: [Validators.required, BackendErrorValidator(validationErrorModel, `${rootPath}separator`)] });
baseValidationArray.push({ key: 'value', validators: [Validators.required, BackendErrorValidator(validationErrorModel, `${rootPath}value`)] });
baseValidationArray.push({ key: 'ordinal', validators: [Validators.required, Validators.pattern("^[0-9]*$"), BackendErrorValidator(validationErrorModel, `${rootPath}ordinal`)] });
baseValidationArray.push({ key: 'name', validators: [Validators.required, BackendErrorValidator(validationErrorModel, `${rootPath}name`)] });
baseValidationArray.push({ key: 'defaultValue', validators: [BackendErrorValidator(validationErrorModel, `${rootPath}defaultValue`)] });
baseValidationArray.push({ key: 'cases', validators: [BackendErrorValidator(validationErrorModel, `${rootPath}cases`)] });
baseContext.validation = baseValidationArray;
return baseContext;
@ -834,7 +813,99 @@ export class QueryConfigEditorModel implements QueryConfigPersist {
validationErrorModel
});
['condition', 'separator', 'value', 'ordinal'].forEach(keyField => {
['name', 'defaultValue'].forEach(keyField => {
const control = formGroup?.get(keyField);
control?.clearValidators();
control?.addValidators(context.getValidation(keyField).validators);
});
(formGroup.get('cases') as FormArray).controls?.forEach(
(control, index) => QueryCaseConfigEditorModel.reapplyValidators({
formGroup: control as UntypedFormGroup,
rootPath: `${rootPath}cases[${index}].`,
validationErrorModel: validationErrorModel
}
)
);
}
}
export class QueryCaseConfigEditorModel implements QueryCaseConfigPersist {
public likePattern: string;
public separator: string;
public value: string;
public referenceTypeId: Guid;
public referenceTypeSourceKey: string;
protected formBuilder: UntypedFormBuilder = new UntypedFormBuilder();
constructor(
public validationErrorModel: ValidationErrorModel = new ValidationErrorModel()
) { }
fromModel(item: QueryCaseConfig): QueryCaseConfigEditorModel {
this.likePattern = item.likePattern;
this.separator = item.separator;
this.value = item.value;
if(item?.referenceType?.id) this.referenceTypeId = item.referenceType.id;
this.referenceTypeSourceKey = item.referenceTypeSourceKey;
return this;
}
buildForm(params?: {
context?: ValidationContext,
disabled?: boolean,
rootPath?: string
}): UntypedFormGroup {
let { context = null, disabled = false, rootPath } = params ?? {}
if (context == null) {
context = QueryCaseConfigEditorModel.createValidationContext({
validationErrorModel: this.validationErrorModel,
rootPath
});
}
return this.formBuilder.group({
likePattern: [{ value: this.likePattern, disabled: disabled }, context.getValidation('likePattern').validators],
separator: [{ value: this.separator, disabled: disabled }, context.getValidation('separator').validators],
value: [{ value: this.value, disabled: disabled }, context.getValidation('value').validators],
referenceTypeId: [{ value: this.referenceTypeId, disabled: disabled }, context.getValidation('referenceTypeId').validators],
referenceTypeSourceKey: [{ value: this.referenceTypeSourceKey, disabled: disabled }, context.getValidation('referenceTypeSourceKey').validators],
});
}
static createValidationContext(params: {
rootPath?: string,
validationErrorModel: ValidationErrorModel
}): ValidationContext {
const { rootPath = '', validationErrorModel } = params;
const baseContext: ValidationContext = new ValidationContext();
const baseValidationArray: Validation[] = new Array<Validation>();
baseValidationArray.push({ key: 'likePattern', validators: [BackendErrorValidator(validationErrorModel, `${rootPath}likePattern`)] });
baseValidationArray.push({ key: 'separator', validators: [BackendErrorValidator(validationErrorModel, `${rootPath}separator`)] });
baseValidationArray.push({ key: 'value', validators: [Validators.required, BackendErrorValidator(validationErrorModel, `${rootPath}value`)] });
baseValidationArray.push({ key: 'referenceTypeId', validators: [BackendErrorValidator(validationErrorModel, `${rootPath}referenceTypeId`)] });
baseValidationArray.push({ key: 'referenceTypeSourceKey', validators: [BackendErrorValidator(validationErrorModel, `${rootPath}referenceTypeSourceKey`)] });
baseContext.validation = baseValidationArray;
return baseContext;
}
static reapplyValidators(params: {
formGroup: UntypedFormGroup,
validationErrorModel: ValidationErrorModel,
rootPath: string
}): void {
const { formGroup, rootPath, validationErrorModel } = params;
const context = QueryCaseConfigEditorModel.createValidationContext({
rootPath,
validationErrorModel
});
['likePattern', 'separator', 'value', 'referenceTypeId', 'referenceTypeSourceKey'].forEach(keyField => {
const control = formGroup?.get(keyField);
control?.clearValidators();
control?.addValidators(context.getValidation(keyField).validators);
@ -915,174 +986,3 @@ export class ReferenceTypeStaticOptionEditorModel implements ReferenceTypeStatic
}
}
export class ReferenceTypeSourceBaseDependencyEditorModel implements ReferenceTypeSourceBaseDependencyPersist {
public referenceTypeCode: string;
public key: string;
public required = true;
public properties: DependencyPropertyEditorModel[] = [];
protected formBuilder: UntypedFormBuilder = new UntypedFormBuilder();
constructor(
public validationErrorModel: ValidationErrorModel = new ValidationErrorModel()
) { }
fromModel(item: ReferenceTypeSourceBaseDependency): ReferenceTypeSourceBaseDependencyEditorModel {
this.referenceTypeCode = item.referenceTypeCode;
this.key = item.key;
this.required = item.required;
if (item.properties) { item.properties.map(x => this.properties.push(new DependencyPropertyEditorModel(this.validationErrorModel).fromModel(x))); }
return this;
}
buildForm(params?: {
context?: ValidationContext,
disabled?: boolean,
rootPath?: string
}): UntypedFormGroup {
let { context = null, disabled = false, rootPath } = params ?? {}
if (context == null) {
context = ReferenceTypeSourceBaseDependencyEditorModel.createValidationContext({
validationErrorModel: this.validationErrorModel,
rootPath
});
}
return this.formBuilder.group({
referenceTypeCode: [{ value: this.referenceTypeCode, disabled: disabled }, context.getValidation('referenceTypeCode').validators],
key: [{ value: this.key, disabled: disabled }, context.getValidation('key').validators],
required: [{ value: this.required, disabled: true }, context.getValidation('required').validators],
properties: this.formBuilder.array(
(this.properties ?? []).map(
(item, index) => new DependencyPropertyEditorModel(
this.validationErrorModel
).fromModel(item).buildForm({
rootPath: `${rootPath}properties[${index}].`
})
), context.getValidation('properties').validators
),
});
}
static createValidationContext(params: {
rootPath?: string,
validationErrorModel: ValidationErrorModel
}): ValidationContext {
const { rootPath = '', validationErrorModel } = params;
const baseContext: ValidationContext = new ValidationContext();
const baseValidationArray: Validation[] = new Array<Validation>();
baseValidationArray.push({ key: 'referenceTypeCode', validators: [Validators.required, BackendErrorValidator(validationErrorModel, `${rootPath}referenceTypeCode`)] });
baseValidationArray.push({ key: 'key', validators: [Validators.required, BackendErrorValidator(validationErrorModel, `${rootPath}key`)] });
baseValidationArray.push({ key: 'required', validators: [Validators.required, BackendErrorValidator(validationErrorModel, `${rootPath}required`)] });
baseValidationArray.push({ key: 'properties', validators: [Validators.required, BackendErrorValidator(validationErrorModel, `${rootPath}properties`)] });
baseContext.validation = baseValidationArray;
return baseContext;
}
static reapplyDepedencyValidators(params: {
formGroup: UntypedFormGroup,
validationErrorModel: ValidationErrorModel,
rootPath: string
}): void {
const { formGroup, rootPath, validationErrorModel } = params;
const context = ReferenceTypeSourceBaseDependencyEditorModel.createValidationContext({
rootPath,
validationErrorModel
});
['referenceTypeCode', 'key', 'required'].forEach(keyField => {
const control = formGroup?.get(keyField);
control?.clearValidators();
control?.addValidators(context.getValidation(keyField).validators);
});
(formGroup.get('properties') as FormArray).controls?.forEach(
(control, index) => DependencyPropertyEditorModel.reapplyPropertyValidators({
formGroup: control as UntypedFormGroup,
rootPath: `${rootPath}properties[${index}].`,
validationErrorModel: validationErrorModel
})
);
}
}
export class DependencyPropertyEditorModel implements DependencyPropertyPersist {
public code: string;
public target: string;
public required = true;
protected formBuilder: UntypedFormBuilder = new UntypedFormBuilder();
constructor(
public validationErrorModel: ValidationErrorModel = new ValidationErrorModel()
) { }
fromModel(item: DependencyProperty): DependencyPropertyEditorModel {
this.code = item.code;
this.target = item.target;
this.required = item.required;
return this;
}
buildForm(params?: {
context?: ValidationContext,
disabled?: boolean,
rootPath?: string
}): UntypedFormGroup {
let { context = null, disabled = false, rootPath } = params ?? {}
if (context == null) {
context = DependencyPropertyEditorModel.createValidationContext({
validationErrorModel: this.validationErrorModel,
rootPath
});
}
return this.formBuilder.group({
code: [{ value: this.code, disabled: disabled }, context.getValidation('code').validators],
target: [{ value: this.target, disabled: disabled }, context.getValidation('target').validators],
required: [{ value: this.required, disabled: true }, context.getValidation('required').validators],
});
}
static createValidationContext(params: {
rootPath?: string,
validationErrorModel: ValidationErrorModel
}): ValidationContext {
const { rootPath = '', validationErrorModel } = params;
const baseContext: ValidationContext = new ValidationContext();
const baseValidationArray: Validation[] = new Array<Validation>();
baseValidationArray.push({ key: 'code', validators: [Validators.required, BackendErrorValidator(validationErrorModel, `${rootPath}code`)] });
baseValidationArray.push({ key: 'target', validators: [Validators.required, BackendErrorValidator(validationErrorModel, `${rootPath}target`)] });
baseValidationArray.push({ key: 'required', validators: [Validators.required, BackendErrorValidator(validationErrorModel, `${rootPath}required`)] });
baseContext.validation = baseValidationArray;
return baseContext;
}
static reapplyPropertyValidators(params: {
formGroup: UntypedFormGroup,
validationErrorModel: ValidationErrorModel,
rootPath: string
}): void {
const { formGroup, rootPath, validationErrorModel } = params;
const context = DependencyPropertyEditorModel.createValidationContext({
rootPath,
validationErrorModel
});
['code', 'target', 'required'].forEach(keyField => {
const control = formGroup?.get(keyField);
control?.clearValidators();
control?.addValidators(context.getValidation(keyField).validators);
})
}
}

View File

@ -1,6 +1,6 @@
import { Injectable } from '@angular/core';
import { ActivatedRouteSnapshot, RouterStateSnapshot } from '@angular/router';
import { AuthenticationConfiguration, QueryConfig, ReferenceType, ReferenceTypeDefinition, ReferenceTypeField, ReferenceTypeSourceBaseConfiguration, ResultsConfiguration, ResultFieldsMappingConfiguration, ReferenceTypeStaticOption, ReferenceTypeSourceBaseDependency, DependencyProperty } from '@app/core/model/reference-type/reference-type';
import { AuthenticationConfiguration, QueryConfig, ReferenceType, ReferenceTypeDefinition, ReferenceTypeField, ReferenceTypeSourceBaseConfiguration, ResultsConfiguration, ResultFieldsMappingConfiguration, ReferenceTypeStaticOption, QueryCaseConfig } from '@app/core/model/reference-type/reference-type';
import { ReferenceTypeService } from '@app/core/services/reference-type/reference-type.service';
import { BreadcrumbService } from '@app/ui/misc/breadcrumb/breadcrumb.service';
import { BaseEditorResolver } from '@common/base/base-editor.resolver';
@ -31,6 +31,8 @@ export class ReferenceTypeEditorResolver extends BaseEditorResolver {
[nameof<ReferenceType>(x => x.definition), nameof<ReferenceTypeDefinition>(x => x.sources), nameof<ReferenceTypeSourceBaseConfiguration>(x => x.key)].join('.'),
[nameof<ReferenceType>(x => x.definition), nameof<ReferenceTypeDefinition>(x => x.sources), nameof<ReferenceTypeSourceBaseConfiguration>(x => x.label)].join('.'),
[nameof<ReferenceType>(x => x.definition), nameof<ReferenceTypeDefinition>(x => x.sources), nameof<ReferenceTypeSourceBaseConfiguration>(x => x.ordinal)].join('.'),
[nameof<ReferenceType>(x => x.definition), nameof<ReferenceTypeDefinition>(x => x.sources), nameof<ReferenceTypeSourceBaseConfiguration>(x => x.referenceTypeDependencies),nameof<ReferenceType>(x => x.id)].join('.'),
[nameof<ReferenceType>(x => x.definition), nameof<ReferenceTypeDefinition>(x => x.sources), nameof<ReferenceTypeSourceBaseConfiguration>(x => x.referenceTypeDependencies),nameof<ReferenceType>(x => x.name)].join('.'),
[nameof<ReferenceType>(x => x.definition), nameof<ReferenceTypeDefinition>(x => x.sources), nameof<ReferenceTypeSourceBaseConfiguration>(x => x.url)].join('.'),
[nameof<ReferenceType>(x => x.definition), nameof<ReferenceTypeDefinition>(x => x.sources), nameof<ReferenceTypeSourceBaseConfiguration>(x => x.results), nameof<ResultsConfiguration>(x => x.resultsArrayPath)].join('.'),
@ -52,22 +54,19 @@ export class ReferenceTypeEditorResolver extends BaseEditorResolver {
[nameof<ReferenceType>(x => x.definition), nameof<ReferenceTypeDefinition>(x => x.sources), nameof<ReferenceTypeSourceBaseConfiguration>(x => x.auth),nameof<AuthenticationConfiguration>(x => x.authRequestBody)].join('.'),
[nameof<ReferenceType>(x => x.definition), nameof<ReferenceTypeDefinition>(x => x.sources), nameof<ReferenceTypeSourceBaseConfiguration>(x => x.auth),nameof<AuthenticationConfiguration>(x => x.type)].join('.'),
[nameof<ReferenceType>(x => x.definition), nameof<ReferenceTypeDefinition>(x => x.sources), nameof<ReferenceTypeSourceBaseConfiguration>(x => x.queries),nameof<QueryConfig>(x => x.condition)].join('.'),
[nameof<ReferenceType>(x => x.definition), nameof<ReferenceTypeDefinition>(x => x.sources), nameof<ReferenceTypeSourceBaseConfiguration>(x => x.queries),nameof<QueryConfig>(x => x.separator)].join('.'),
[nameof<ReferenceType>(x => x.definition), nameof<ReferenceTypeDefinition>(x => x.sources), nameof<ReferenceTypeSourceBaseConfiguration>(x => x.queries),nameof<QueryConfig>(x => x.value)].join('.'),
[nameof<ReferenceType>(x => x.definition), nameof<ReferenceTypeDefinition>(x => x.sources), nameof<ReferenceTypeSourceBaseConfiguration>(x => x.queries),nameof<QueryConfig>(x => x.ordinal)].join('.'),
[nameof<ReferenceType>(x => x.definition), nameof<ReferenceTypeDefinition>(x => x.sources), nameof<ReferenceTypeSourceBaseConfiguration>(x => x.queries),nameof<QueryConfig>(x => x.name)].join('.'),
[nameof<ReferenceType>(x => x.definition), nameof<ReferenceTypeDefinition>(x => x.sources), nameof<ReferenceTypeSourceBaseConfiguration>(x => x.queries),nameof<QueryConfig>(x => x.defaultValue)].join('.'),
[nameof<ReferenceType>(x => x.definition), nameof<ReferenceTypeDefinition>(x => x.sources), nameof<ReferenceTypeSourceBaseConfiguration>(x => x.queries),nameof<QueryConfig>(x => x.cases),nameof<QueryCaseConfig>(x => x.likePattern)].join('.'),
[nameof<ReferenceType>(x => x.definition), nameof<ReferenceTypeDefinition>(x => x.sources), nameof<ReferenceTypeSourceBaseConfiguration>(x => x.queries),nameof<QueryConfig>(x => x.cases),nameof<QueryCaseConfig>(x => x.separator)].join('.'),
[nameof<ReferenceType>(x => x.definition), nameof<ReferenceTypeDefinition>(x => x.sources), nameof<ReferenceTypeSourceBaseConfiguration>(x => x.queries),nameof<QueryConfig>(x => x.cases),nameof<QueryCaseConfig>(x => x.value)].join('.'),
[nameof<ReferenceType>(x => x.definition), nameof<ReferenceTypeDefinition>(x => x.sources), nameof<ReferenceTypeSourceBaseConfiguration>(x => x.queries),nameof<QueryConfig>(x => x.cases),nameof<QueryCaseConfig>(x => x.referenceType)].join('.'),
[nameof<ReferenceType>(x => x.definition), nameof<ReferenceTypeDefinition>(x => x.sources), nameof<ReferenceTypeSourceBaseConfiguration>(x => x.queries),nameof<QueryConfig>(x => x.cases),nameof<QueryCaseConfig>(x => x.referenceType),nameof<ReferenceType>(x => x.id)].join('.'),
[nameof<ReferenceType>(x => x.definition), nameof<ReferenceTypeDefinition>(x => x.sources), nameof<ReferenceTypeSourceBaseConfiguration>(x => x.queries),nameof<QueryConfig>(x => x.cases),nameof<QueryCaseConfig>(x => x.referenceType),nameof<ReferenceType>(x => x.name)].join('.'),
[nameof<ReferenceType>(x => x.definition), nameof<ReferenceTypeDefinition>(x => x.sources), nameof<ReferenceTypeSourceBaseConfiguration>(x => x.queries),nameof<QueryConfig>(x => x.cases),nameof<QueryCaseConfig>(x => x.referenceTypeSourceKey)].join('.'),
[nameof<ReferenceType>(x => x.definition), nameof<ReferenceTypeDefinition>(x => x.sources), nameof<ReferenceTypeSourceBaseConfiguration>(x => x.options),nameof<ReferenceTypeStaticOption>(x => x.code)].join('.'),
[nameof<ReferenceType>(x => x.definition), nameof<ReferenceTypeDefinition>(x => x.sources), nameof<ReferenceTypeSourceBaseConfiguration>(x => x.options),nameof<ReferenceTypeStaticOption>(x => x.value)].join('.'),
[nameof<ReferenceType>(x => x.definition), nameof<ReferenceTypeDefinition>(x => x.sources), nameof<ReferenceTypeSourceBaseConfiguration>(x => x.dependencies),nameof<ReferenceTypeSourceBaseDependency>(x => x.referenceTypeCode)].join('.'),
[nameof<ReferenceType>(x => x.definition), nameof<ReferenceTypeDefinition>(x => x.sources), nameof<ReferenceTypeSourceBaseConfiguration>(x => x.dependencies),nameof<ReferenceTypeSourceBaseDependency>(x => x.key)].join('.'),
[nameof<ReferenceType>(x => x.definition), nameof<ReferenceTypeDefinition>(x => x.sources), nameof<ReferenceTypeSourceBaseConfiguration>(x => x.dependencies),nameof<ReferenceTypeSourceBaseDependency>(x => x.required)].join('.'),
[nameof<ReferenceType>(x => x.definition), nameof<ReferenceTypeDefinition>(x => x.sources), nameof<ReferenceTypeSourceBaseConfiguration>(x => x.dependencies),nameof<ReferenceTypeSourceBaseDependency>(x => x.properties), nameof<DependencyProperty>(x => x.code)].join('.'),
[nameof<ReferenceType>(x => x.definition), nameof<ReferenceTypeDefinition>(x => x.sources), nameof<ReferenceTypeSourceBaseConfiguration>(x => x.dependencies),nameof<ReferenceTypeSourceBaseDependency>(x => x.properties), nameof<DependencyProperty>(x => x.target)].join('.'),
[nameof<ReferenceType>(x => x.definition), nameof<ReferenceTypeDefinition>(x => x.sources), nameof<ReferenceTypeSourceBaseConfiguration>(x => x.dependencies),nameof<ReferenceTypeSourceBaseDependency>(x => x.properties), nameof<DependencyProperty>(x => x.required)].join('.'),
nameof<ReferenceType>(x => x.createdAt),
nameof<ReferenceType>(x => x.updatedAt),
nameof<ReferenceType>(x => x.isActive)

View File

@ -1496,14 +1496,13 @@
"RESULTS-PATH": "Results Path",
"TOKEN-PATH": "Token Path",
"TYPE": "Type",
"CONDITION": "Condition",
"SEPARATOR": "Separator",
"DEPENDENCIES": "Dependencies",
"DEPENDENCY": "Dependency",
"REQUIRED": "Required",
"PROPERTIES": "Properties",
"PROPERTY": "Property",
"TARGET": "Target"
"DEFAULT-VALUE": "Default Value",
"CASE": "Case",
"LIKE-PATTERN": "Condition",
"SOURCE-KEY": "Source Key"
},
"ACTIONS": {
"SAVE": "Save",
@ -1515,10 +1514,8 @@
"REMOVE-SOURCE": "Remove Source",
"ADD-QUERY": "Add Query",
"REMOVE-QUERY": "Remove Query",
"ADD-DEPENDENCY": "Add Dependency",
"REMOVE-DEPENDENCY": "Remove Dependency",
"ADD-PROPERTY": "Add property",
"REMOVE-PROPERTY": "Remove property"
"ADD-CASE": "Add Case",
"REMOVE-CASE": "Remove Case"
},
"CONFIRM-DELETE-DIALOG": {
"MESSAGE": "Would you like to delete this Reference type?",