2021-02-12 12:23:39 +01:00
|
|
|
|
import { Component, Input, OnChanges, OnInit } from '@angular/core';
|
2019-01-18 18:03:45 +01:00
|
|
|
|
import { FormArray, FormControl, FormGroup } from '@angular/forms';
|
|
|
|
|
import { FieldEditorModel } from '../../../admin/field-editor-model';
|
2019-12-11 15:51:03 +01:00
|
|
|
|
import { Guid } from '@common/types/guid';
|
2021-02-12 12:23:39 +01:00
|
|
|
|
import { RuleEditorModel } from '../../../admin/rule-editor-model';
|
|
|
|
|
import { ValidationType } from '@app/core/common/enum/validation-type';
|
|
|
|
|
import { MatCheckboxChange } from '@angular/material/checkbox';
|
|
|
|
|
import { DatasetDescriptionCompositeFieldEditorModel, DatasetDescriptionFieldEditorModel } from '@app/ui/misc/dataset-description-form/dataset-description-form.model';
|
|
|
|
|
import { DatasetProfileFieldViewStyle } from '@app/core/common/enum/dataset-profile-field-view-style';
|
2018-02-02 11:57:24 +01:00
|
|
|
|
|
|
|
|
|
@Component({
|
2019-01-18 18:03:45 +01:00
|
|
|
|
selector: 'app-dataset-profile-editor-composite-field-component',
|
|
|
|
|
templateUrl: './dataset-profile-editor-composite-field.component.html',
|
|
|
|
|
styleUrls: ['./dataset-profile-editor-composite-field.component.scss']
|
2018-02-02 11:57:24 +01:00
|
|
|
|
})
|
2021-02-12 12:23:39 +01:00
|
|
|
|
export class DatasetProfileEditorCompositeFieldComponent implements OnInit, OnChanges {
|
2018-02-02 11:57:24 +01:00
|
|
|
|
|
2018-10-05 17:00:54 +02:00
|
|
|
|
@Input() form: FormGroup;
|
|
|
|
|
@Input() indexPath: string;
|
2019-02-11 13:04:45 +01:00
|
|
|
|
@Input() viewOnly: boolean;
|
2018-10-05 17:00:54 +02:00
|
|
|
|
|
2021-02-12 12:23:39 +01:00
|
|
|
|
@Input() numbering: string;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
previewForm: FormGroup;
|
|
|
|
|
// isComposite = false;
|
2018-10-05 17:00:54 +02:00
|
|
|
|
isMultiplicityEnabled = false;
|
2021-02-12 12:23:39 +01:00
|
|
|
|
viewStyleEnum = DatasetProfileFieldViewStyle;
|
2018-10-05 17:00:54 +02:00
|
|
|
|
|
2019-01-18 18:03:45 +01:00
|
|
|
|
constructor() { }
|
2018-10-05 17:00:54 +02:00
|
|
|
|
|
2021-02-12 12:23:39 +01:00
|
|
|
|
ngOnChanges(){
|
|
|
|
|
this.setTargetField(null);
|
|
|
|
|
}
|
2018-10-05 17:00:54 +02:00
|
|
|
|
ngOnInit() {
|
|
|
|
|
//this.addNewField();
|
|
|
|
|
if (this.form.get('multiplicity')) {
|
|
|
|
|
if (this.form.get('multiplicity').value.min > 1 || this.form.get('multiplicity').value.max > 1) {
|
|
|
|
|
this.isMultiplicityEnabled = true;
|
|
|
|
|
}
|
|
|
|
|
}
|
2021-02-12 12:23:39 +01:00
|
|
|
|
// this.isComposite = (this.form.get('fields') as FormArray).length > 1;
|
2019-10-16 16:45:08 +02:00
|
|
|
|
|
|
|
|
|
if (this.viewOnly) {
|
|
|
|
|
this.form.get('hasCommentField').disable();
|
|
|
|
|
}
|
2021-02-12 12:23:39 +01:00
|
|
|
|
|
|
|
|
|
//SET UP TARGET FIELD
|
|
|
|
|
if((this.form.get('fields') as FormArray).length>0){
|
|
|
|
|
//get the first field in list
|
|
|
|
|
this.targetField = (this.form.get('fields') as FormArray).at(0) as FormGroup;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
generatePreview(){
|
|
|
|
|
const editorModel = new DatasetDescriptionCompositeFieldEditorModel();
|
|
|
|
|
editorModel.title = this.form.get('title').value;
|
|
|
|
|
editorModel.description = this.form.get('description').value;
|
|
|
|
|
editorModel.extendedDescription = this.form.get('extendedDescription').value;
|
|
|
|
|
editorModel.additionalInformation = this.form.get('additionalInformation').value;
|
|
|
|
|
editorModel.hasCommentField = this.form.get('hasCommentField').value;
|
|
|
|
|
editorModel.fields = [];
|
|
|
|
|
|
|
|
|
|
(this.form.get('fields') as FormArray).controls.forEach(field=>{
|
|
|
|
|
const fieldEditorModel = new DatasetDescriptionFieldEditorModel();
|
|
|
|
|
|
|
|
|
|
fieldEditorModel.viewStyle= {
|
|
|
|
|
renderStyle: field.get('viewStyle').get('renderStyle').value,
|
|
|
|
|
cssClass: null
|
|
|
|
|
};
|
|
|
|
|
fieldEditorModel.defaultValue = field.get('defaultValue').value;
|
|
|
|
|
switch (field.get('viewStyle').get('renderStyle').value) {
|
|
|
|
|
case DatasetProfileFieldViewStyle.TextArea:
|
|
|
|
|
fieldEditorModel.data = {
|
|
|
|
|
label: field.get('data').get('label').value
|
|
|
|
|
};
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
default:
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
editorModel.fields.push(fieldEditorModel);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
this.previewForm = editorModel.buildForm();
|
2018-10-05 17:00:54 +02:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
onIsCompositeChange(isComposite: boolean) {
|
|
|
|
|
if (!isComposite && (<FormArray>this.form.get('fields')).length > 1) {
|
|
|
|
|
for (let i = 0; i < (<FormArray>this.form.get('fields')).length - 1; i++) {
|
|
|
|
|
(<FormArray>this.form.get('fields')).removeAt(1);
|
|
|
|
|
}
|
2019-01-18 18:03:45 +01:00
|
|
|
|
(this.form.get('fields') as FormArray).controls.splice(1);
|
2018-10-05 17:00:54 +02:00
|
|
|
|
}
|
2019-03-14 10:29:35 +01:00
|
|
|
|
if ((<FormArray>this.form.get('fields')).length === 0) {
|
|
|
|
|
const field: FieldEditorModel = new FieldEditorModel();
|
|
|
|
|
(<FormArray>this.form.get('fields')).push(field.buildForm());
|
|
|
|
|
}
|
2018-10-05 17:00:54 +02:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
onIsMultiplicityEnabledChange(isMultiplicityEnabled: boolean) {
|
|
|
|
|
if (!isMultiplicityEnabled) {
|
|
|
|
|
(<FormControl>this.form.get('multiplicity').get('min')).setValue(0);
|
|
|
|
|
(<FormControl>this.form.get('multiplicity').get('max')).setValue(0);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
addNewField() {
|
2019-01-18 18:03:45 +01:00
|
|
|
|
const field: FieldEditorModel = new FieldEditorModel();
|
2019-10-17 17:23:19 +02:00
|
|
|
|
field.id=Guid.create().toString();
|
2018-10-05 17:00:54 +02:00
|
|
|
|
(<FormArray>this.form.get('fields')).push(field.buildForm());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
DeleteField(index) {
|
|
|
|
|
(<FormArray>this.form.get('fields')).removeAt(index);
|
|
|
|
|
}
|
2019-01-18 18:03:45 +01:00
|
|
|
|
|
|
|
|
|
getFieldTile(formGroup: FormGroup, index: number) {
|
|
|
|
|
if (formGroup.get('title') && formGroup.get('title').value && formGroup.get('title').value.length > 0) { return formGroup.get('title').value; }
|
|
|
|
|
return "Field " + (index + 1);
|
|
|
|
|
}
|
2021-02-12 12:23:39 +01:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
targetField:FormGroup;
|
|
|
|
|
validationTypeEnum = ValidationType;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
addVisibilityRule(targetField: FormGroup){
|
|
|
|
|
const rule: RuleEditorModel = new RuleEditorModel();
|
|
|
|
|
(<FormArray>targetField.get('visible').get('rules')).push(rule.buildForm());
|
|
|
|
|
}
|
|
|
|
|
toggleRequired(targetField: FormGroup, event:MatCheckboxChange){
|
|
|
|
|
|
|
|
|
|
let validationsControl = targetField.get('validations') as FormControl;
|
|
|
|
|
let validations: Array<ValidationType> = validationsControl.value;
|
|
|
|
|
|
|
|
|
|
if(event.checked){
|
|
|
|
|
if(!validations.includes(ValidationType.Required)){//IS ALREADY REQUIRED
|
|
|
|
|
// validationsControl.setValue(validations.filter(validator=> validator != ValidationType.Required));
|
|
|
|
|
// validationsControl.updateValueAndValidity();
|
|
|
|
|
validations.push(ValidationType.Required);
|
|
|
|
|
// validationsControl.setValue(validations);
|
|
|
|
|
validationsControl.updateValueAndValidity();
|
|
|
|
|
}
|
|
|
|
|
}else{
|
|
|
|
|
validationsControl.setValue(validations.filter(validator=> validator != ValidationType.Required));
|
|
|
|
|
validationsControl.updateValueAndValidity();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// if(validations.includes(ValidationType.Required)){//IS ALREADY REQUIRED
|
|
|
|
|
// validationsControl.setValue(validations.filter(validator=> validator != ValidationType.Required));
|
|
|
|
|
// validationsControl.updateValueAndValidity();
|
|
|
|
|
// }else{
|
|
|
|
|
// //SET REQUIRED VALIDATOR
|
|
|
|
|
// console.log('setting required validator');
|
|
|
|
|
// validations.push(ValidationType.Required);
|
|
|
|
|
// validationsControl.setValue(validations);
|
|
|
|
|
// validationsControl.updateValueAndValidity();
|
|
|
|
|
// }
|
|
|
|
|
}
|
|
|
|
|
setTargetField(field:FormGroup){
|
|
|
|
|
this.targetField = field;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
deleteTargetField(){
|
|
|
|
|
if(!this.targetField) return;
|
|
|
|
|
|
|
|
|
|
let index = -1;
|
|
|
|
|
|
|
|
|
|
const fields = this.form.get('fields') as FormArray;
|
|
|
|
|
|
|
|
|
|
for(let i=0;i< fields.length; i++){
|
|
|
|
|
let field = fields.at(i);
|
|
|
|
|
if(field.get('id').value === this.targetField.get('id').value){//index found
|
|
|
|
|
index = i;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if(index>=0){//target found in fields
|
|
|
|
|
this.DeleteField(index);
|
|
|
|
|
this.targetField = null;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
2018-10-02 16:33:58 +02:00
|
|
|
|
}
|