argos/dmp-frontend/src/app/ui/admin/dataset-profile/editor/components/section-fieldset/dataset-profile-editor-sect...

185 lines
6.0 KiB
TypeScript

import { CdkDragDrop, moveItemInArray } from '@angular/cdk/drag-drop';
import { Component, EventEmitter, Input, OnChanges, OnInit, Output, SimpleChanges } from '@angular/core';
import { FormArray, FormGroup } from '@angular/forms';
import { FieldEditorModel } from '@app/ui/admin/dataset-profile/admin/field-editor-model';
import { FieldSetEditorModel } from '@app/ui/admin/dataset-profile/admin/field-set-editor-model';
import { SectionEditorModel } from '@app/ui/admin/dataset-profile/admin/section-editor-model';
import { BaseComponent } from '@common/base/base.component';
import { Guid } from '@common/types/guid';
import { takeUntil } from 'rxjs/operators';
import { ToCEntry, ToCEntryType } from '../../../table-of-contents/table-of-contents-entry';
@Component({
selector: 'app-dataset-profile-editor-section-fieldset-component',
templateUrl: './dataset-profile-editor-section-fieldset.component.html',
styleUrls: ['./dataset-profile-editor-section-fieldset.component.scss']
})
export class DatasetProfileEditorSectionFieldSetComponent extends BaseComponent implements OnInit, OnChanges {
// @Input() form: FormGroup;
//@Input() dataModel: SectionEditorModel;
// @Input() indexPath: string;
@Input() viewOnly: boolean;
// @Input() numbering: string;
@Input() tocentry: ToCEntry;
@Output() selectedEntryId = new EventEmitter<string>();
@Output() dataNeedsRefresh = new EventEmitter<void> ();
// @Output() fieldsetAdded = new EventEmitter<String>(); //returns the id of the fieldset added
constructor() { super(); }
ngOnChanges(changes: SimpleChanges): void {
this.initialize();
}
form;
numbering;
private _selectedFieldSetId: string = null;
get selectedFieldSetId(){
return this._selectedFieldSetId;
}
set selectedFieldSetId(id: string){
if(id === this._selectedFieldSetId) return;
this._selectedFieldSetId = id;
this.selectedEntryId.emit(this._selectedFieldSetId);
}
private _findParentSection():FormGroup{
const parent = this.form.parent;
return parent;
}
private initialize(){
if(this.tocentry.type === ToCEntryType.Section){
this.form = this.tocentry.form;
this.numbering = this.tocentry.numbering;
this._selectedFieldSetId = null;
}else if(this.tocentry.type === ToCEntryType.FieldSet){
this.form = this.tocentry.form.parent.parent;
const numberingArray = this.tocentry.numbering.split('.');
if(numberingArray.length){
numberingArray.splice(numberingArray.length-1);
this.numbering = numberingArray.join('.');
}
this.selectedFieldSetId = this.tocentry.id;
//scroll to fieldset
// setTimeout(() => {
// const element = document.getElementById(this.selectedFieldSetId);
// element.scrollTop = element.scrollHeight;
// }, 2000);
}
}
ngOnInit() {
this.initialize();
//TODO
// this.form.root.get('pages').valueChanges
// .pipe(takeUntil(this._destroyed))
// .subscribe(x =>
// this.keepPageSelectionValid(x)
// );
}
drop(event: CdkDragDrop<string[]>) {
// if(!this.links || !this.links.length) return;
if(event.container === event.previousContainer){
// moveItemInArray(this.links, event.previousIndex, event.currentIndex);
let arrayToUpdate: FormArray = this.form.get('fieldSets') as FormArray;
// if(this.parentLink && this.parentLink.form){
// switch(this.parentLink.subEntriesType){
// case this.tocEntryType.Field:
// arrayToUpdate = (this.parentLink.form.get('fields') as FormArray);
// break;
// case this.tocEntryType.FieldSet:
// arrayToUpdate = (this.parentLink.form.get('fieldSets') as FormArray);
// break;
// case this.tocEntryType.Section:
// arrayToUpdate = (this.parentLink.form.get('sections') as FormArray);
// break
// }
// }
if(arrayToUpdate.controls){
moveItemInArray(arrayToUpdate.controls, event.previousIndex, event.currentIndex);
//update ordinality
arrayToUpdate.controls.forEach((element,idx ) => {
element.get('ordinal').setValue(idx);
element.updateValueAndValidity();
});
}
this.dataNeedsRefresh.emit();
}else{
console.log('not same container');
}
}
// addField() {
// const fieldSet: FieldSetEditorModel = new FieldSetEditorModel();
// fieldSet.ordinal = (this.form.get('fieldSets') as FormArray).length;
// const field: FieldEditorModel = new FieldEditorModel();
// field.id = Guid.create().toString();
// field.ordinal = 0;//first field in fields
// fieldSet.fields.push(field);
// // if (this.dataModel.fieldSets) {
// fieldSet.id = Guid.create().toString();
// //this.dataModel.fieldSets.push(fieldSet);
// //}
// const fieldsetsArray = this.form.get('fieldSets') as FormArray;
// fieldsetsArray.push(fieldSet.buildForm());
// const fieldSetForm = fieldsetsArray.at(fieldsetsArray.length-1);
// //emit id inserted
// if(fieldSetForm){
// const id: string = fieldSetForm.get('id').value;
// this.fieldsetAdded.emit(id);
// }
// }
// addSectioninSection() {
// const section: SectionEditorModel = new SectionEditorModel();
// //this.dataModel.sections.push(section);
// (<FormArray>this.form.get('sections')).push(section.buildForm());
// }
// DeleteSectionInSection(index) {
// //this.dataModel.sections.splice(index, 1);
// (<FormArray>this.form.get('sections')).removeAt(index);
// }
// deleteFieldSet(index) {
// //this.dataModel.fieldSets.splice(index, 1);
// (<FormArray>this.form.get('fieldSets')).removeAt(index);
// }
// keepPageSelectionValid(pagesJson: Array<any>) {
// const selectedPage = this.form.get('page').value as String;
// // const pages: Array<PageEditorModel> = JsonSerializer.fromJSONArray(pagesJson, Page);
// if (pagesJson.find(elem => elem.id === selectedPage) === undefined) {
// this.form.get('page').reset();
// }
// }
// 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);
// }
}