diff --git a/dmp-frontend/src/app/ui/dataset/dataset-wizard/dataset-wizard.component.html b/dmp-frontend/src/app/ui/dataset/dataset-wizard/dataset-wizard.component.html index a0f15db1b..5251bb0f2 100644 --- a/dmp-frontend/src/app/ui/dataset/dataset-wizard/dataset-wizard.component.html +++ b/dmp-frontend/src/app/ui/dataset/dataset-wizard/dataset-wizard.component.html @@ -89,6 +89,14 @@ +
+
+ +
+
+ +
+
@@ -54,6 +55,79 @@ [datasetProfileId]="datasetProfileId"> + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +
+
+
+
+ +
+
+
+ +
+ + + {{'DATASET-PROFILE-EDITOR.STEPS.FORM.COMPOSITE-FIELD.FIELDS.COMMENT-HINT' | translate}} + + +
+
+ +
+
+ +
+ + + + +
+
+ +
+
+
+ +
+ +
\ No newline at end of file diff --git a/dmp-frontend/src/app/ui/misc/dataset-description-form/components/form-section/form-section.component.ts b/dmp-frontend/src/app/ui/misc/dataset-description-form/components/form-section/form-section.component.ts index 123801f1a..413a0915f 100644 --- a/dmp-frontend/src/app/ui/misc/dataset-description-form/components/form-section/form-section.component.ts +++ b/dmp-frontend/src/app/ui/misc/dataset-description-form/components/form-section/form-section.component.ts @@ -5,6 +5,8 @@ import { VisibilityRulesService } from '../../visibility-rules/visibility-rules. import { DatasetDescriptionSectionEditorModel, DatasetDescriptionCompositeFieldEditorModel } from '../../dataset-description-form.model'; import { FormCompositeFieldComponent } from '../form-composite-field/form-composite-field.component'; import { LinkToScroll } from '../../tableOfContentsMaterial/table-of-contents'; +import { ToCEntry, ToCEntryType } from '../../dataset-description.component'; + @Component({ selector: 'app-form-section', @@ -16,6 +18,7 @@ export class FormSectionComponent implements OnInit, OnChanges { //@Input() section: DatasetDescriptionSectionEditorModel; @Input() datasetProfileId: String; @Input() form: FormGroup; + @Input() tocentry: ToCEntry; @Input() pathName: string; @Input() path: string; @Input() linkToScroll: LinkToScroll; @@ -23,6 +26,8 @@ export class FormSectionComponent implements OnInit, OnChanges { panelExpanded = true; // sub = true; subsectionLinkToScroll: LinkToScroll; + + tocentriesType = ToCEntryType; constructor( public visibilityRulesService: VisibilityRulesService, @@ -33,6 +38,10 @@ export class FormSectionComponent implements OnInit, OnChanges { // if (this.section) { // this.form = this.visibilityRulesService.getFormGroup(this.section.id); // } + + if(this.tocentry){//maybe not needed as well + this.form = this.tocentry.form as FormGroup; + } } ngOnChanges(changes: SimpleChanges) { diff --git a/dmp-frontend/src/app/ui/misc/dataset-description-form/dataset-description-form.model.ts b/dmp-frontend/src/app/ui/misc/dataset-description-form/dataset-description-form.model.ts index 1dc2c0923..c76550e26 100644 --- a/dmp-frontend/src/app/ui/misc/dataset-description-form/dataset-description-form.model.ts +++ b/dmp-frontend/src/app/ui/misc/dataset-description-form/dataset-description-form.model.ts @@ -64,6 +64,7 @@ export class DatasetDescriptionPageEditorModel extends BaseFormModel { }); formGroup.addControl('sections', this.formBuilder.array(sectionsFormArray)); formGroup.addControl('title', new FormControl({ value: this.title, disabled: true })); + formGroup.addControl('ordinal', new FormControl({value:this.ordinal, disabled:true})); return formGroup; } } @@ -115,6 +116,7 @@ export class DatasetDescriptionSectionEditorModel extends BaseFormModel { formGroup.addControl('numbering', new FormControl({ value: this.numbering, disabled: true })); formGroup.addControl('title', new FormControl({ value: this.title, disabled: true })); formGroup.addControl('id', new FormControl({ value: this.title, disabled: false })); + formGroup.addControl('ordinal', new FormControl({ value: this.ordinal, disabled: true })); return formGroup; } } diff --git a/dmp-frontend/src/app/ui/misc/dataset-description-form/dataset-description.component.html b/dmp-frontend/src/app/ui/misc/dataset-description-form/dataset-description.component.html index 9c7cbeeb1..e3c7aad22 100644 --- a/dmp-frontend/src/app/ui/misc/dataset-description-form/dataset-description.component.html +++ b/dmp-frontend/src/app/ui/misc/dataset-description-form/dataset-description.component.html @@ -5,15 +5,35 @@
-
-
-
- + +
+
+
+ +
-
+ + + + +
+

+ {{pageEntry.numbering}} - {{pageEntry.label}} +

+ +
+
+ +
+
+
+
+
diff --git a/dmp-frontend/src/app/ui/misc/dataset-description-form/dataset-description.component.ts b/dmp-frontend/src/app/ui/misc/dataset-description-form/dataset-description.component.ts index 5ca786b8e..f1b19ef16 100644 --- a/dmp-frontend/src/app/ui/misc/dataset-description-form/dataset-description.component.ts +++ b/dmp-frontend/src/app/ui/misc/dataset-description-form/dataset-description.component.ts @@ -1,7 +1,8 @@ import { AfterViewInit, Component, Input, OnChanges, OnInit, SimpleChanges, ViewChild, Output, EventEmitter } from '@angular/core'; -import { FormGroup } from '@angular/forms'; +import { AbstractControl, AbstractControlOptions, FormArray, FormGroup } from '@angular/forms'; import { MatHorizontalStepper } from '@angular/material/stepper'; import { Rule } from '@app/core/model/dataset-profile-definition/rule'; +import { DatasetProfileTableOfContentsInternalSection } from '@app/ui/admin/dataset-profile/table-of-contents/table-of-contents-internal-section/table-of-contents-internal-section'; import { LinkToScroll } from '@app/ui/misc/dataset-description-form/tableOfContentsMaterial/table-of-contents'; import { VisibilityRulesService } from '@app/ui/misc/dataset-description-form/visibility-rules/visibility-rules.service'; import { BaseComponent } from '@common/base/base.component'; @@ -16,16 +17,22 @@ export class DatasetDescriptionComponent extends BaseComponent implements OnInit // @ViewChild('stepper', { static: false }) stepper: MatHorizontalStepper; @Input() path: string; - @Input() form: FormGroup; @Input() visibilityRules: Rule[] = []; @Input() datasetProfileId: String; @Input() linkToScroll: LinkToScroll; @Output() formChanged: EventEmitter = new EventEmitter(); + tocentries: ToCEntry[]; + @Input() form: FormGroup; + + + + private _form: FormGroup; constructor( private visibilityRulesService: VisibilityRulesService, ) { super(); + } ngOnInit() { @@ -37,6 +44,8 @@ export class DatasetDescriptionComponent extends BaseComponent implements OnInit // this.formChanged.emit(val); // }); // } + + this.tocentries = this.getTocEntries(); } ngOnChanges(changes: SimpleChanges) { @@ -54,4 +63,135 @@ export class DatasetDescriptionComponent extends BaseComponent implements OnInit ngAfterViewInit() { } + + + + private _buildRecursively(form: FormGroup,whatAmI:ToCEntryType):ToCEntry{ + if(!form) return null; + + switch(whatAmI){ + case ToCEntryType.Section: + const sections = form.get('sections') as FormArray; + const fieldsets = form.get('compositeFields') as FormArray; + + + const tempResult:ToCEntry[] = []; + + if(sections &§ions.length){ + sections.controls.forEach(section=>{ + tempResult.push(this._buildRecursively(section as FormGroup, ToCEntryType.Section)); + }); + + }else if(fieldsets && fieldsets.length){ + fieldsets.controls.forEach(fieldset=>{ + tempResult.push(this._buildRecursively(fieldset as FormGroup, ToCEntryType.FieldSet)); + }); + } + return { + form: form, + id: form.get('id').value, + label: form.get('title').value, + numbering: '', + subEntries:tempResult, + subEntriesType: sections &§ions.length? ToCEntryType.Section: ToCEntryType.FieldSet, + type: ToCEntryType.Section, + ordinal: form.get('ordinal').value + } + case ToCEntryType.FieldSet: + return { + form: form, + label:form.get('title').value, + id: form.get('id').value, + numbering:'s', + subEntries:[], + subEntriesType: ToCEntryType.Field, + type: ToCEntryType.FieldSet, + ordinal: form.get('ordinal').value + } + } + } + + private _sortByOrdinal(tocentries: ToCEntry[]){ + + if(!tocentries || !tocentries.length) return; + + tocentries.sort(this._customCompare); + tocentries.forEach(entry=>{ + this._sortByOrdinal(entry.subEntries); + }); + } + + private _customCompare(a,b){ + return a.ordinal - b.ordinal; + } + + private _calculateNumbering(tocentries: ToCEntry[], depth:number[] = []){ + if(!tocentries || !tocentries.length){ + return; + } + + let prefixNumbering = depth.length? depth.join('.'): ''; + + if(depth.length) prefixNumbering = prefixNumbering+"."; + tocentries.forEach((entry,i)=>{ + entry.numbering = prefixNumbering + (i+1); + this._calculateNumbering(entry.subEntries, [...depth, i+1]) + }); + } + + + getTocEntries(): ToCEntry[] { + if (this.form == null) { return []; } + const result: ToCEntry[] = []; + + //build parent pages + (this.form.get('pages') as FormArray).controls.forEach((pageElement, i) => { + result.push({ + id: i+'id', + label: pageElement.get('title').value, + type: ToCEntryType.Page, + form: pageElement, + numbering: (i + 1).toString(), + subEntriesType: ToCEntryType.Section, + subEntries:[], + ordinal: pageElement.get('ordinal').value + } as ToCEntry) + }); + + + + result.forEach((entry,i)=>{ + + const sections = entry.form.get('sections') as FormArray; + + sections.controls.forEach(section=>{ + const tempResults = this._buildRecursively(section as FormGroup,ToCEntryType.Section); + entry.subEntries.push(tempResults); + }); + + }); + + this._sortByOrdinal(result); + //calculate numbering + this._calculateNumbering(result); + return result; + + } + } +export interface ToCEntry { + id: string; + label: string; + subEntriesType: ToCEntryType; + subEntries: ToCEntry[]; + type: ToCEntryType; + form: AbstractControl; + numbering: string; + ordinal: number; +} +export enum ToCEntryType { + Page = 0, + Section = 1, + FieldSet = 2, + Field = 3 +} \ No newline at end of file