|
|
|
@ -28,7 +28,6 @@ import { |
|
|
|
ViewContainerRef, |
|
|
|
} from '@angular/core'; |
|
|
|
import { |
|
|
|
AbstractControl, |
|
|
|
ControlValueAccessor, |
|
|
|
FormBuilder, |
|
|
|
NG_VALIDATORS, |
|
|
|
@ -60,6 +59,7 @@ import { Store } from '@ngrx/store'; |
|
|
|
import { AppState } from '@core/core.state'; |
|
|
|
import { catchError } from 'rxjs/operators'; |
|
|
|
import { NEVER } from 'rxjs'; |
|
|
|
import { NULL_UUID } from '@shared/models/id/has-uuid'; |
|
|
|
|
|
|
|
@Component({ |
|
|
|
selector: 'tb-calculated-field-arguments-table', |
|
|
|
@ -88,9 +88,8 @@ export class CalculatedFieldArgumentsTableComponent implements ControlValueAcces |
|
|
|
@ViewChild(MatSort, { static: true }) sort: MatSort; |
|
|
|
|
|
|
|
errorText = ''; |
|
|
|
argumentsFormArray = this.fb.array<AbstractControl>([]); |
|
|
|
entityNameMap = new Map<string, string>(); |
|
|
|
entityNameErrorSet = new Set<string>(); |
|
|
|
argumentsFormArray = this.fb.array<CalculatedFieldArgumentValue>([]); |
|
|
|
entityNameMap = new Map<string, string>([[NULL_UUID, '']]); |
|
|
|
sortOrder = { direction: 'asc', property: '' }; |
|
|
|
dataSource = new CalculatedFieldArgumentDatasource(); |
|
|
|
|
|
|
|
@ -100,6 +99,7 @@ export class CalculatedFieldArgumentsTableComponent implements ControlValueAcces |
|
|
|
readonly ArgumentType = ArgumentType; |
|
|
|
readonly CalculatedFieldType = CalculatedFieldType; |
|
|
|
readonly maxArgumentsPerCF = getCurrentAuthState(this.store).maxArgumentsPerCF; |
|
|
|
readonly NULL_UUID = NULL_UUID; |
|
|
|
|
|
|
|
private popoverComponent: TbPopoverComponent<CalculatedFieldArgumentPanelComponent>; |
|
|
|
private propagateChange: (argumentsObj: Record<string, CalculatedFieldArgument>) => void = () => {}; |
|
|
|
@ -154,7 +154,7 @@ export class CalculatedFieldArgumentsTableComponent implements ControlValueAcces |
|
|
|
this.argumentsFormArray.markAsDirty(); |
|
|
|
} |
|
|
|
|
|
|
|
manageArgument($event: Event, matButton: MatButton, argument = {} as CalculatedFieldArgumentValue, index?: number): void { |
|
|
|
manageArgument($event: Event, matButton: MatButton, argument = {} as CalculatedFieldArgumentValue): void { |
|
|
|
$event?.stopPropagation(); |
|
|
|
if (this.popoverComponent && !this.popoverComponent.tbHidden) { |
|
|
|
this.popoverComponent.hide(); |
|
|
|
@ -163,31 +163,30 @@ export class CalculatedFieldArgumentsTableComponent implements ControlValueAcces |
|
|
|
if (this.popoverService.hasPopover(trigger)) { |
|
|
|
this.popoverService.hidePopover(trigger); |
|
|
|
} else { |
|
|
|
const index = this.argumentsFormArray.controls.findIndex(control => isEqual(control.value, argument)); |
|
|
|
const isExists = index !== -1; |
|
|
|
const ctx = { |
|
|
|
index, |
|
|
|
argument, |
|
|
|
entityId: this.entityId, |
|
|
|
calculatedFieldType: this.calculatedFieldType, |
|
|
|
buttonTitle: this.argumentsFormArray.at(index)?.value ? 'action.apply' : 'action.add', |
|
|
|
buttonTitle: isExists ? 'action.apply' : 'action.add', |
|
|
|
tenantId: this.tenantId, |
|
|
|
entityName: this.entityName, |
|
|
|
entityHasError: this.entityNameErrorSet.has(argument.refEntityId?.id), |
|
|
|
usedArgumentNames: this.argumentsFormArray.value.map(({ argumentName }) => argumentName).filter(name => name !== argument.argumentName), |
|
|
|
}; |
|
|
|
this.popoverComponent = this.popoverService.displayPopover(trigger, this.renderer, |
|
|
|
this.viewContainerRef, CalculatedFieldArgumentPanelComponent, isDefined(index) ? 'left' : 'right', false, null, |
|
|
|
this.viewContainerRef, CalculatedFieldArgumentPanelComponent, isExists ? 'left' : 'right', false, null, |
|
|
|
ctx, |
|
|
|
{}, |
|
|
|
{}, {}, true); |
|
|
|
this.popoverComponent.tbComponentRef.instance.argumentsDataApplied.subscribe(({ value, index }) => { |
|
|
|
this.popoverComponent.tbComponentRef.instance.argumentsDataApplied.subscribe((value ) => { |
|
|
|
this.popoverComponent.hide(); |
|
|
|
const formGroup = this.fb.group(value); |
|
|
|
if (isDefinedAndNotNull(index)) { |
|
|
|
this.argumentsFormArray.setControl(index, formGroup); |
|
|
|
if (isExists) { |
|
|
|
this.argumentsFormArray.at(index).setValue(value); |
|
|
|
} else { |
|
|
|
this.argumentsFormArray.push(formGroup); |
|
|
|
this.argumentsFormArray.push(this.fb.control(value)); |
|
|
|
} |
|
|
|
formGroup.markAsDirty(); |
|
|
|
this.cd.markForCheck(); |
|
|
|
}); |
|
|
|
} |
|
|
|
@ -202,7 +201,7 @@ export class CalculatedFieldArgumentsTableComponent implements ControlValueAcces |
|
|
|
if (this.calculatedFieldType === CalculatedFieldType.SIMPLE |
|
|
|
&& this.argumentsFormArray.controls.some(control => control.value.refEntityKey.type === ArgumentType.Rolling)) { |
|
|
|
this.errorText = 'calculated-fields.hint.arguments-simple-with-rolling'; |
|
|
|
} else if (this.entityNameErrorSet.size) { |
|
|
|
} else if (this.argumentsFormArray.controls.some(control => control.value.refEntityId?.id === NULL_UUID)) { |
|
|
|
this.errorText = 'calculated-fields.hint.arguments-entity-not-found'; |
|
|
|
} else if (!this.argumentsFormArray.controls.length) { |
|
|
|
this.errorText = 'calculated-fields.hint.arguments-empty'; |
|
|
|
@ -234,20 +233,21 @@ export class CalculatedFieldArgumentsTableComponent implements ControlValueAcces |
|
|
|
...argumentsObj[key], |
|
|
|
argumentName: key |
|
|
|
}; |
|
|
|
this.argumentsFormArray.push(this.fb.group(value), { emitEvent: false }); |
|
|
|
this.argumentsFormArray.push(this.fb.control(value), { emitEvent: false }); |
|
|
|
}); |
|
|
|
this.argumentsFormArray.updateValueAndValidity(); |
|
|
|
} |
|
|
|
|
|
|
|
private updateEntityNameMap(value: CalculatedFieldArgumentValue[]): void { |
|
|
|
this.entityNameErrorSet.clear(); |
|
|
|
value.forEach(({ refEntityId = {}}) => { |
|
|
|
if (refEntityId.id && !this.entityNameMap.has(refEntityId.id)) { |
|
|
|
const { id, entityType } = refEntityId as EntityId; |
|
|
|
this.entityService.getEntity(entityType as EntityType, id, { ignoreLoading: true, ignoreErrors: true }) |
|
|
|
.pipe( |
|
|
|
catchError(() => { |
|
|
|
this.entityNameErrorSet.add(id); |
|
|
|
const control = this.argumentsFormArray.controls.find(control => control.value.refEntityId?.id === id); |
|
|
|
control.setValue({ ...control.value, refEntityId: { ...control.value.refEntityId, id: NULL_UUID } }); |
|
|
|
|
|
|
|
return NEVER; |
|
|
|
}), |
|
|
|
takeUntilDestroyed(this.destroyRef) |
|
|
|
|