Merge branch 'AdminTemplateRedesign' into WizardDescriptionRefactor
This commit is contained in:
commit
a3572f92ed
|
@ -55,5 +55,10 @@ export const GENERAL_ANIMATIONS = [
|
|||
}),
|
||||
animate('800ms ease', style({transform:'scale(1)', opacity:1}))
|
||||
])
|
||||
]),
|
||||
trigger('fadeElement',[
|
||||
state('updated',style({opacity:0})),
|
||||
transition("*=>updated",
|
||||
animate('2s 40ms ease-out'))
|
||||
])
|
||||
]
|
|
@ -184,15 +184,23 @@
|
|||
<!-- PREVIEW -->
|
||||
|
||||
<div class="col-12" >
|
||||
<div class="mb-1" *ngIf="hasFocus">
|
||||
<div class="mb-1" *ngIf="hasFocus" class="d-flex" style="justify-content: space-between;">
|
||||
<span style="font-weight: bold;">{{'DATASET-PROFILE-EDITOR.ACTIONS.FIELD.PREVIEW' | translate}}</span>
|
||||
<span [@fadeElement]="updatedClass" *ngIf="firstField?.get('viewStyle').get('renderStyle').value">
|
||||
<ng-container *ngIf="!previewDirty">
|
||||
Preview updated!
|
||||
</ng-container>
|
||||
<ng-container *ngIf="previewDirty">
|
||||
... caculating preview
|
||||
</ng-container>
|
||||
</span>
|
||||
</div>
|
||||
|
||||
<div style="margin-right: -15px; margin-left: -15px;" *ngIf="previewForm && firstField?.get('viewStyle').get('renderStyle').value">
|
||||
<div [id]="'preview_container'+ form.get('id').value" class="w-100" style="margin-right: -15px; margin-left: -15px;" >
|
||||
<div *ngIf="previewForm && showPreview && firstField?.get('viewStyle').get('renderStyle').value">
|
||||
<app-form-section-inner [form]="previewForm">
|
||||
|
||||
</app-form-section-inner>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="w-100" *ngIf="!firstField?.get('viewStyle').get('renderStyle').value">
|
||||
<em>
|
||||
|
|
|
@ -42,11 +42,13 @@ import {Field as FieldDefinition} from '@app/core/model/dataset-profile-definiti
|
|||
import { Subject } from 'rxjs';
|
||||
import { debounce, debounceTime } from 'rxjs/operators';
|
||||
import { setUncaughtExceptionCaptureCallback } from 'process';
|
||||
import { GENERAL_ANIMATIONS } from '../../animations/animations';
|
||||
|
||||
@Component({
|
||||
selector: 'app-dataset-profile-editor-composite-field-component',
|
||||
templateUrl: './dataset-profile-editor-composite-field.component.html',
|
||||
styleUrls: ['./dataset-profile-editor-composite-field.component.scss']
|
||||
styleUrls: ['./dataset-profile-editor-composite-field.component.scss'],
|
||||
animations:[GENERAL_ANIMATIONS]
|
||||
})
|
||||
export class DatasetProfileEditorCompositeFieldComponent implements OnInit, OnChanges {
|
||||
|
||||
|
@ -57,6 +59,8 @@ export class DatasetProfileEditorCompositeFieldComponent implements OnInit, OnCh
|
|||
@Input() numbering: string;
|
||||
@Input() hasFocus: boolean = false;
|
||||
|
||||
showPreview: boolean = true;
|
||||
previewDirty: boolean = false;
|
||||
|
||||
|
||||
showDescription: boolean = true;
|
||||
|
@ -128,12 +132,14 @@ export class DatasetProfileEditorCompositeFieldComponent implements OnInit, OnCh
|
|||
this.showAdditionalInfo = !!this.form.get('additionalInformation').value;
|
||||
|
||||
this.form.valueChanges.subscribe(changes=>{
|
||||
this.previewForm = null;
|
||||
// this.previewForm = null;
|
||||
this.previewDirty = true;
|
||||
this.generatePreviewForm();
|
||||
|
||||
});
|
||||
this.previewSubject$.pipe(debounceTime(600)).subscribe(model=>{
|
||||
this.previewForm = model.buildForm();
|
||||
const updatedForm = model.buildForm();
|
||||
this.reloadPreview(updatedForm)
|
||||
})
|
||||
|
||||
|
||||
|
@ -141,6 +147,47 @@ export class DatasetProfileEditorCompositeFieldComponent implements OnInit, OnCh
|
|||
}
|
||||
|
||||
|
||||
get updatedClass(){
|
||||
if(this.previewDirty) return '';
|
||||
else return 'updated';
|
||||
}
|
||||
private reloadPreview(updatedForm: FormGroup){
|
||||
setTimeout(() => {
|
||||
|
||||
const previewContainer = document.getElementById('preview_container'+ this.form.get('id').value);
|
||||
// let clientHeight = -1;
|
||||
if(previewContainer){
|
||||
// console.log(previewContainer);
|
||||
const clientHeight = previewContainer.clientHeight;
|
||||
// console.log(clientHeight);
|
||||
|
||||
if(clientHeight){
|
||||
previewContainer.style.height = clientHeight.toString() + 'px';
|
||||
|
||||
// console.log('height:' ,previewContainer.style.height);
|
||||
}
|
||||
}
|
||||
this.showPreview = false;
|
||||
this.previewDirty = true;
|
||||
this.previewForm = updatedForm;
|
||||
|
||||
setTimeout(() => {
|
||||
|
||||
|
||||
this.showPreview = true;
|
||||
this.previewDirty = false;
|
||||
|
||||
if(previewContainer){
|
||||
setTimeout(() => {
|
||||
if(previewContainer){
|
||||
previewContainer.style.height = 'auto';
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
previewSubject$: Subject<DatasetDescriptionSectionEditorModel> = new Subject<DatasetDescriptionSectionEditorModel>();
|
||||
|
||||
private generatePreviewForm(){
|
||||
|
@ -187,7 +234,7 @@ export class DatasetProfileEditorCompositeFieldComponent implements OnInit, OnCh
|
|||
multiplicityItems: null,
|
||||
viewStyle: editorField.viewStyle,
|
||||
defaultValue:editorField.defaultValue,
|
||||
value: editorField.defaultValue.value,
|
||||
value: null,
|
||||
validations: editorField.validations,
|
||||
} as FieldDefinition;
|
||||
|
||||
|
|
|
@ -125,20 +125,20 @@ export class FormFieldComponent extends BaseComponent implements OnInit {
|
|||
this.singleAutoCompleteConfiguration = {
|
||||
filterFn: this.searchFromAutocomplete.bind(this),
|
||||
initialItems: () => this.searchFromAutocomplete(''),
|
||||
displayFn: (item) => (item != null && item.length > 1) ? JSON.parse(item).label : item['label'],
|
||||
titleFn: (item) => item['label'],
|
||||
valueAssign: (item) => JSON.stringify(item),
|
||||
subtitleFn: (item) => item['source'] ? this.language.instant('DATASET-WIZARD.EDITOR.FIELDS.EXTERNAL-AUTOCOMPLETE-SUBTITLE') + item['source'] : this.language.instant('DATASET-WIZARD.EDITOR.FIELDS.EXTERNAL-AUTOCOMPLETE-NO-SOURCE')
|
||||
displayFn: (item) => {try{return (item != null && item.length > 1) ? JSON.parse(item).label : item['label']}catch{return ''}},
|
||||
titleFn: (item) => {try{return item['label'] }catch{return''}},
|
||||
valueAssign: (item) => {try{return JSON.stringify(item)}catch{return''}},
|
||||
subtitleFn: (item) => {try{return item['source'] ? this.language.instant('DATASET-WIZARD.EDITOR.FIELDS.EXTERNAL-AUTOCOMPLETE-SUBTITLE') + item['source'] : this.language.instant('DATASET-WIZARD.EDITOR.FIELDS.EXTERNAL-AUTOCOMPLETE-NO-SOURCE')}catch{return''}}
|
||||
};
|
||||
}
|
||||
else {
|
||||
this.multipleAutoCompleteConfiguration = {
|
||||
filterFn: this.searchFromAutocomplete.bind(this),
|
||||
initialItems: () => this.searchFromAutocomplete(''),
|
||||
displayFn: (item) => typeof (item) == 'string' ? JSON.parse(item)['label'] : item['label'],
|
||||
titleFn: (item) => typeof (item) == 'string' ? JSON.parse(item)['label'] : item['label'],
|
||||
valueAssign: (item) => typeof (item) == 'string' ? item : JSON.stringify(item),
|
||||
subtitleFn: (item) => item['source'] ? this.language.instant('DATASET-WIZARD.EDITOR.FIELDS.EXTERNAL-AUTOCOMPLETE-SUBTITLE') + item['source'] : this.language.instant('DATASET-WIZARD.EDITOR.FIELDS.EXTERNAL-AUTOCOMPLETE-NO-SOURCE')
|
||||
displayFn: (item) =>{try{return typeof (item) == 'string' ? JSON.parse(item)['label'] : item['label']}catch{return''}},
|
||||
titleFn: (item) =>{ try{return typeof (item) == 'string' ? JSON.parse(item)['label'] : item['label']}catch{return''}},
|
||||
valueAssign: (item) =>{ try{return typeof (item) == 'string' ? item : JSON.stringify(item)}catch{return''}},
|
||||
subtitleFn: (item) => { try{return item['source'] ? this.language.instant('DATASET-WIZARD.EDITOR.FIELDS.EXTERNAL-AUTOCOMPLETE-SUBTITLE') + item['source'] : this.language.instant('DATASET-WIZARD.EDITOR.FIELDS.EXTERNAL-AUTOCOMPLETE-NO-SOURCE')}catch{return''}}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -148,49 +148,49 @@ export class FormFieldComponent extends BaseComponent implements OnInit {
|
|||
this.externalDatasetAutoCompleteConfiguration = {
|
||||
filterFn: this.searchDatasetExternalDatasets.bind(this),
|
||||
initialItems: () => this.searchDatasetExternalDatasets(''),//.filter(resultItem => (excludedItems || []).map(x => x.id).indexOf(resultItem.id) === -1),
|
||||
displayFn: (item) => typeof (item) == 'string' ? JSON.parse(item)['name'] : item.name,
|
||||
titleFn: (item) => typeof (item) == 'string' ? JSON.parse(item)['name'] : item.name,
|
||||
subtitleFn: (item) => item.source ? this.language.instant('TYPES.EXTERNAL-DATASET-TYPE.SOURCE:') + item.source : item.tag ? this.language.instant('TYPES.EXTERNAL-DATASET-TYPE.SOURCE:') + item.tag : this.language.instant('TYPES.EXTERNAL-DATASET-TYPE.NO-SOURCE'),
|
||||
valueAssign: (item) => typeof (item) == 'string' ? item : JSON.stringify(item)
|
||||
displayFn: (item) => { try{return typeof (item) == 'string' ? JSON.parse(item)['name'] : item.name}catch{return''}},
|
||||
titleFn: (item) => { try{return typeof (item) == 'string' ? JSON.parse(item)['name'] : item.name}catch{return''}},
|
||||
subtitleFn: (item) => { try{return item.source ? this.language.instant('TYPES.EXTERNAL-DATASET-TYPE.SOURCE:') + item.source : item.tag ? this.language.instant('TYPES.EXTERNAL-DATASET-TYPE.SOURCE:') + item.tag : this.language.instant('TYPES.EXTERNAL-DATASET-TYPE.NO-SOURCE')}catch{return''}},
|
||||
valueAssign: (item) => { try{return typeof (item) == 'string' ? item : JSON.stringify(item)}catch{return''}}
|
||||
};
|
||||
break;
|
||||
case DatasetProfileFieldViewStyle.DataRepositories:
|
||||
this.dataRepositoriesAutoCompleteConfiguration = {
|
||||
filterFn: this.searchDatasetExternalDataRepositories.bind(this),
|
||||
initialItems: () => this.searchDatasetExternalDataRepositories(''),
|
||||
displayFn: (item) => typeof (item) == 'string' ? JSON.parse(item)['name'] : item.name,
|
||||
titleFn: (item) => typeof (item) == 'string' ? JSON.parse(item)['name'] : item.name,
|
||||
subtitleFn: (item) => item.source ? this.language.instant('TYPES.EXTERNAL-DATASET-TYPE.SOURCE:') + item.source : item.tag ? this.language.instant('TYPES.EXTERNAL-DATASET-TYPE.SOURCE:') + item.tag : this.language.instant('TYPES.EXTERNAL-DATASET-TYPE.NO-SOURCE'),
|
||||
valueAssign: (item) => typeof (item) == 'string' ? item : JSON.stringify(item)
|
||||
displayFn: (item) => { try{return typeof (item) == 'string' ? JSON.parse(item)['name'] : item.name}catch{return''}},
|
||||
titleFn: (item) => { try{return typeof (item) == 'string' ? JSON.parse(item)['name'] : item.name}catch{return''}},
|
||||
subtitleFn: (item) => { try{return item.source ? this.language.instant('TYPES.EXTERNAL-DATASET-TYPE.SOURCE:') + item.source : item.tag ? this.language.instant('TYPES.EXTERNAL-DATASET-TYPE.SOURCE:') + item.tag : this.language.instant('TYPES.EXTERNAL-DATASET-TYPE.NO-SOURCE')}catch{return''}},
|
||||
valueAssign: (item) => { try{return typeof (item) == 'string' ? item : JSON.stringify(item)}catch{return''}}
|
||||
};
|
||||
break;
|
||||
case DatasetProfileFieldViewStyle.Registries:
|
||||
this.registriesAutoCompleteConfiguration = {
|
||||
filterFn: this.searchDatasetExternalRegistries.bind(this),
|
||||
initialItems: () => this.searchDatasetExternalRegistries(''),
|
||||
displayFn: (item) => typeof (item) == 'string' ? JSON.parse(item)['name'] : item.name,
|
||||
titleFn: (item) => typeof (item) == 'string' ? JSON.parse(item)['name'] : item.name,
|
||||
subtitleFn: (item) => item.source ? this.language.instant('TYPES.EXTERNAL-DATASET-TYPE.SOURCE:') + item.source : this.language.instant('TYPES.EXTERNAL-DATASET-TYPE.NO-SOURCE'),
|
||||
valueAssign: (item) => typeof (item) == 'string' ? item : JSON.stringify(item)
|
||||
displayFn: (item) => { try{return typeof (item) == 'string' ? JSON.parse(item)['name'] : item.name}catch{return''}},
|
||||
titleFn: (item) => { try{return typeof (item) == 'string' ? JSON.parse(item)['name'] : item.name}catch{return''}},
|
||||
subtitleFn: (item) => { try{return item.source ? this.language.instant('TYPES.EXTERNAL-DATASET-TYPE.SOURCE:') + item.source : this.language.instant('TYPES.EXTERNAL-DATASET-TYPE.NO-SOURCE')}catch{return''}},
|
||||
valueAssign: (item) => { try{return typeof (item) == 'string' ? item : JSON.stringify(item)}catch{return''}}
|
||||
};
|
||||
break;
|
||||
case DatasetProfileFieldViewStyle.Services:
|
||||
this.servicesAutoCompleteConfiguration = {
|
||||
filterFn: this.searchDatasetExternalServices.bind(this),
|
||||
initialItems: () => this.searchDatasetExternalServices(''),
|
||||
displayFn: (item) => typeof (item) == 'string' ? JSON.parse(item)['name'] : item.name,
|
||||
titleFn: (item) => typeof (item) == 'string' ? JSON.parse(item)['name'] : item.name,
|
||||
subtitleFn: (item) => item.source ? this.language.instant('TYPES.EXTERNAL-DATASET-TYPE.SOURCE:') + item.source : item.tag ? this.language.instant('TYPES.EXTERNAL-DATASET-TYPE.SOURCE:') + item.tag : this.language.instant('TYPES.EXTERNAL-DATASET-TYPE.NO-SOURCE'),
|
||||
valueAssign: (item) => typeof (item) == 'string' ? item : JSON.stringify(item)
|
||||
displayFn: (item) => { try{return typeof (item) == 'string' ? JSON.parse(item)['name'] : item.name}catch{return ''}},
|
||||
titleFn: (item) => { try{return typeof (item) == 'string' ? JSON.parse(item)['name'] : item.name}catch{return''}},
|
||||
subtitleFn: (item) => { try{return item.source ? this.language.instant('TYPES.EXTERNAL-DATASET-TYPE.SOURCE:') + item.source : item.tag ? this.language.instant('TYPES.EXTERNAL-DATASET-TYPE.SOURCE:') + item.tag : this.language.instant('TYPES.EXTERNAL-DATASET-TYPE.NO-SOURCE')}catch{return''}},
|
||||
valueAssign: (item) => { try{return typeof (item) == 'string' ? item : JSON.stringify(item)}catch{return''}}
|
||||
};
|
||||
break;
|
||||
case DatasetProfileFieldViewStyle.Tags:
|
||||
this.tagsAutoCompleteConfiguration = {
|
||||
filterFn: this.filterTags.bind(this),
|
||||
initialItems: (excludedItems: any[]) => this.filterTags('').pipe(map(result => result.filter(resultItem => (excludedItems || []).map(x => x.id).indexOf(resultItem.id) === -1))),
|
||||
displayFn: (item) => this.showTag(item),
|
||||
titleFn: (item) => item['name'],
|
||||
valueAssign: (item) => this.addTag(item)
|
||||
displayFn: (item) => { try{return this.showTag(item)}catch{return''}},
|
||||
titleFn: (item) => { try{return item['name']}catch{return''}},
|
||||
valueAssign: (item) => { try{return this.addTag(item)}catch{return''}}
|
||||
};
|
||||
this.parseTags();
|
||||
break;
|
||||
|
@ -198,20 +198,20 @@ export class FormFieldComponent extends BaseComponent implements OnInit {
|
|||
this.researchersAutoCompleteConfiguration = {
|
||||
filterFn: this.filterResearchers.bind(this),
|
||||
initialItems: (excludedItems: any[]) => this.filterResearchers('').pipe(map(result => result.filter(resultItem => (excludedItems || []).map(x => x.id).indexOf(resultItem.id) === -1))),
|
||||
displayFn: (item) => typeof (item) == 'string' ? JSON.parse(item)['name'] : item.name,
|
||||
titleFn: (item) => typeof (item) == 'string' ? JSON.parse(item)['name'] : item.name,
|
||||
subtitleFn: (item) => item['tag'] ? this.language.instant('TYPES.EXTERNAL-DATASET-TYPE.SOURCE:') + item['tag'] : (item['key'] ? this.language.instant('TYPES.EXTERNAL-DATASET-TYPE.SOURCE:') + item['key'] : this.language.instant('TYPES.EXTERNAL-DATASET-TYPE.NO-SOURCE')),
|
||||
valueAssign: (item) => typeof (item) == 'string' ? item : JSON.stringify(item)
|
||||
displayFn: (item) => { try{return typeof (item) == 'string' ? JSON.parse(item)['name'] : item.name}catch{return''}},
|
||||
titleFn: (item) =>{ try{return typeof (item) == 'string' ? JSON.parse(item)['name'] : item.name}catch{return''}},
|
||||
subtitleFn: (item) => { try{return item['tag'] ? this.language.instant('TYPES.EXTERNAL-DATASET-TYPE.SOURCE:') + item['tag'] : (item['key'] ? this.language.instant('TYPES.EXTERNAL-DATASET-TYPE.SOURCE:') + item['key'] : this.language.instant('TYPES.EXTERNAL-DATASET-TYPE.NO-SOURCE'))}catch{return''}},
|
||||
valueAssign: (item) => { try{return typeof (item) == 'string' ? item : JSON.stringify(item)}catch{return''}}
|
||||
};
|
||||
break;
|
||||
case DatasetProfileFieldViewStyle.Organizations:
|
||||
this.organisationsAutoCompleteConfiguration = {
|
||||
filterFn: this.filterOrganisations.bind(this),
|
||||
initialItems: (excludedItems: any[]) => this.filterOrganisations('').pipe(map(result => result.filter(resultItem => (excludedItems || []).map(x => x.id).indexOf(resultItem.id) === -1))),
|
||||
displayFn: (item) => typeof (item) == 'string' ? JSON.parse(item)['name'] : item.name,
|
||||
titleFn: (item) => typeof (item) == 'string' ? JSON.parse(item)['name'] : item.name,
|
||||
subtitleFn: (item) => item['tag'] ? this.language.instant('TYPES.EXTERNAL-DATASET-TYPE.SOURCE:') + item['tag'] : (item['key'] ? this.language.instant('TYPES.EXTERNAL-DATASET-TYPE.SOURCE:') + item['key'] : this.language.instant('TYPES.EXTERNAL-DATASET-TYPE.NO-SOURCE')),
|
||||
valueAssign: (item) => typeof (item) == 'string' ? item : JSON.stringify(item)
|
||||
displayFn:(item) => { try{return typeof (item) == 'string' ? JSON.parse(item)['name'] : item.name}catch{return''}},
|
||||
titleFn: (item) =>{ try{return typeof (item) == 'string' ? JSON.parse(item)['name'] : item.name}catch{return''}},
|
||||
subtitleFn: (item) =>{ try{return item['tag'] ? this.language.instant('TYPES.EXTERNAL-DATASET-TYPE.SOURCE:') + item['tag'] : (item['key'] ? this.language.instant('TYPES.EXTERNAL-DATASET-TYPE.SOURCE:') + item['key'] : this.language.instant('TYPES.EXTERNAL-DATASET-TYPE.NO-SOURCE'))}catch{return''}},
|
||||
valueAssign: (item) =>{ try{return typeof (item) == 'string' ? item : JSON.stringify(item)}catch{return''}}
|
||||
};
|
||||
break;
|
||||
case DatasetProfileFieldViewStyle.DatasetIdentifier:
|
||||
|
@ -224,9 +224,9 @@ export class FormFieldComponent extends BaseComponent implements OnInit {
|
|||
this.currencyAutoCompleteConfiguration = {
|
||||
filterFn: this.searchCurrency.bind(this),
|
||||
initialItems: () => this.searchCurrency(''),
|
||||
displayFn: (item) => typeof (item) == 'string' ? JSON.parse(item)['name'] : item.name,
|
||||
titleFn: (item) => typeof (item) == 'string' ? JSON.parse(item)['name'] : item.name,
|
||||
valueAssign: (item) => typeof (item) == 'string' ? item : JSON.stringify(item)
|
||||
displayFn: (item) => { try{return typeof (item) == 'string' ? JSON.parse(item)['name'] : item.name}catch{return''}},
|
||||
titleFn: (item) => { try{return typeof (item) == 'string' ? JSON.parse(item)['name'] : item.name}catch{return''}},
|
||||
valueAssign: (item) => { try{return typeof (item) == 'string' ? item : JSON.stringify(item)}catch{return''}}
|
||||
};
|
||||
break;
|
||||
case DatasetProfileFieldViewStyle.Validation:
|
||||
|
@ -325,20 +325,20 @@ export class FormFieldComponent extends BaseComponent implements OnInit {
|
|||
this.singleAutoCompleteConfiguration = {
|
||||
filterFn: myfunc.bind(this),
|
||||
initialItems: (extraData) => myfunc(''),
|
||||
displayFn: (item) => (item != null && item.length > 1) ? JSON.parse(item)[title] : item[title],
|
||||
titleFn: (item) => item[title],
|
||||
displayFn: (item) => { try{return (item != null && item.length > 1) ? JSON.parse(item)[title] : item[title]}catch{return''}},
|
||||
titleFn: (item) => { try{return item[title]}catch{return''}},
|
||||
valueAssign: (item) => JSON.stringify(item),
|
||||
subtitleFn: (item) => item[subtitle]
|
||||
subtitleFn: (item) => { try{return item[subtitle]}catch{return''}}
|
||||
};
|
||||
}
|
||||
else {
|
||||
this.multipleAutoCompleteConfiguration = {
|
||||
filterFn: myfunc.bind(this),
|
||||
initialItems: (extraData) => myfunc(''),
|
||||
displayFn: (item) => typeof (item) == 'string' ? JSON.parse(item)['label'] : item['label'],
|
||||
titleFn: (item) => typeof (item) == 'string' ? JSON.parse(item)['label'] : item['label'],
|
||||
valueAssign: (item) => typeof (item) == 'string' ? item : JSON.stringify(item),
|
||||
subtitleFn: (item) => item[subtitle]
|
||||
displayFn: (item) => { try{return typeof (item) == 'string' ? JSON.parse(item)['label'] : item['label']}catch{return''}},
|
||||
titleFn: (item) => { try{return typeof (item) == 'string' ? JSON.parse(item)['label'] : item['label']}catch{return''}},
|
||||
valueAssign: (item) => { try{return typeof (item) == 'string' ? item : JSON.stringify(item)}catch{return''}},
|
||||
subtitleFn: (item) => { try{return item[subtitle]}catch{return''}}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
<div *ngFor="let compositeFieldFormGroup of form.get('compositeFields')['controls']; let i = index;" class="col-12">
|
||||
<ng-container *ngIf="form">
|
||||
<div *ngFor="let compositeFieldFormGroup of form.get('compositeFields')['controls']; let i = index;" class="col-12">
|
||||
|
||||
<div class="row" *ngIf="this.visibilityRulesService.checkElementVisibility(compositeFieldFormGroup.get('id').value) && this.visibilityRulesService.scanIfChildsOfCompositeFieldHasVisibleItems(compositeFieldFormGroup)">
|
||||
|
||||
|
@ -34,4 +35,5 @@
|
|||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</ng-container>
|
|
@ -466,25 +466,25 @@
|
|||
"VALUE": "Required Value",
|
||||
"RULE-IF": "If Value is",
|
||||
"RULE-THEN": "then show Field With Id",
|
||||
"FIELDSETS": "Input sets",
|
||||
"FIELDSETS": "Questions",
|
||||
"FIELDS":"Inputs"
|
||||
}
|
||||
},
|
||||
"FORM-VALIDATION":{
|
||||
"ERROR-MESSAGES":{
|
||||
"PAGE-MUST-HAVE-SECTION": "Each section must have at least one subsection.",
|
||||
"PAGE-MUST-HAVE-SECTION": "Each chapter must have at least one section.",
|
||||
"NEEDS-MORE-INFORMATION": " needs more information.",
|
||||
"MUST-HAVE-SECTION-OR-FIELDSET": " must have either subsection or input set.",
|
||||
"MUST-HAVE-SECTION-OR-FIELDSET": " must have either section or question.",
|
||||
"MISSING":"Missing",
|
||||
"PROVIDE-PAGE-AND-SECTION":"Make sure you provide a section and a subsection"
|
||||
"PROVIDE-PAGE-AND-SECTION":"Make sure you provide a chapter and at least one section per chapter."
|
||||
}
|
||||
},
|
||||
"TABLE-OF-CONTENTS":{
|
||||
"ERROR-MESSAGES":{
|
||||
"FIELDSET-MUST-HAVE-PARENT-SECTION":"Input set can only be child of subsection.",
|
||||
"INPUT-SECTION-SAME-LEVEL": "Cannot have input set and section on the same level.",
|
||||
"DRAG-NOT-SUPPORTED":"Drag n drop of subsection not supported to target container.",
|
||||
"PAGE-ELEMENT-ONLY-TOP-LEVEL": "Section elements can only be at top level"
|
||||
"FIELDSET-MUST-HAVE-PARENT-SECTION":"Question can only be child of section.",
|
||||
"INPUT-SECTION-SAME-LEVEL": "Cannot have question and section on the same level.",
|
||||
"DRAG-NOT-SUPPORTED":"Drag n drop of section not supported to target container.",
|
||||
"PAGE-ELEMENT-ONLY-TOP-LEVEL": "Chapter elements can only be at top level"
|
||||
}
|
||||
}
|
||||
},
|
||||
|
@ -515,8 +515,8 @@
|
|||
"FIELDSET": {
|
||||
"ADD-INPUT": "Add new input",
|
||||
"COMMENT-FIELD": "Comment field",
|
||||
"INCLUDE-COMMENT-FIELD": "Include comment field",
|
||||
"ENABLE-MULTIPLICITY": "Enable multiplicity",
|
||||
"INCLUDE-COMMENT-FIELD": "A comment field input is appended to the givven question.",
|
||||
"ENABLE-MULTIPLICITY": "User may provide more than one answer to the givven question.",
|
||||
"MULTIPLICITY": "Multiplicity",
|
||||
"MORE": "More.."
|
||||
}
|
||||
|
|
|
@ -466,25 +466,25 @@
|
|||
"VALUE": "Required Value",
|
||||
"RULE-IF": "If Value is",
|
||||
"RULE-THEN": "then show Field With Id",
|
||||
"FIELDSETS": "Input sets",
|
||||
"FIELDSETS": "Questions",
|
||||
"FIELDS":"Inputs"
|
||||
}
|
||||
},
|
||||
"FORM-VALIDATION":{
|
||||
"ERROR-MESSAGES":{
|
||||
"PAGE-MUST-HAVE-SECTION": "Each section must have at least one subsection.",
|
||||
"PAGE-MUST-HAVE-SECTION": "Each chapter must have at least one section.",
|
||||
"NEEDS-MORE-INFORMATION": " needs more information.",
|
||||
"MUST-HAVE-SECTION-OR-FIELDSET": " must have either subsection or input set.",
|
||||
"MUST-HAVE-SECTION-OR-FIELDSET": " must have either section or question.",
|
||||
"MISSING":"Missing",
|
||||
"PROVIDE-PAGE-AND-SECTION":"Make sure you provide a section and a subsection"
|
||||
"PROVIDE-PAGE-AND-SECTION":"Make sure you provide a chapter and at least one section per chapter."
|
||||
}
|
||||
},
|
||||
"TABLE-OF-CONTENTS":{
|
||||
"ERROR-MESSAGES":{
|
||||
"FIELDSET-MUST-HAVE-PARENT-SECTION":"Input set can only be child of subsection.",
|
||||
"INPUT-SECTION-SAME-LEVEL": "Cannot have input set and section on the same level.",
|
||||
"DRAG-NOT-SUPPORTED":"Drag n drop of subsection not supported to target container.",
|
||||
"PAGE-ELEMENT-ONLY-TOP-LEVEL": "Section elements can only be at top level"
|
||||
"FIELDSET-MUST-HAVE-PARENT-SECTION":"Question can only be child of section.",
|
||||
"INPUT-SECTION-SAME-LEVEL": "Cannot have question and section on the same level.",
|
||||
"DRAG-NOT-SUPPORTED":"Drag n drop of section not supported to target container.",
|
||||
"PAGE-ELEMENT-ONLY-TOP-LEVEL": "Chapter elements can only be at top level"
|
||||
}
|
||||
}
|
||||
},
|
||||
|
@ -515,8 +515,8 @@
|
|||
"FIELDSET": {
|
||||
"ADD-INPUT": "Add new input",
|
||||
"COMMENT-FIELD": "Comment field",
|
||||
"INCLUDE-COMMENT-FIELD": "Include comment field",
|
||||
"ENABLE-MULTIPLICITY": "Enable multiplicity",
|
||||
"INCLUDE-COMMENT-FIELD": "A comment field input is appended to the givven question.",
|
||||
"ENABLE-MULTIPLICITY": "User may provide more than one answer to the givven question.",
|
||||
"MULTIPLICITY": "Multiplicity",
|
||||
"MORE": "More.."
|
||||
}
|
||||
|
|
|
@ -466,25 +466,25 @@
|
|||
"VALUE": "Valor requerido",
|
||||
"RULE-IF": "Si el valor es",
|
||||
"RULE-THEN": "entonces muestra el campo con identificación",
|
||||
"FIELDSETS": "Input sets",
|
||||
"FIELDSETS": "Questions",
|
||||
"FIELDS":"Inputs"
|
||||
}
|
||||
},
|
||||
"FORM-VALIDATION":{
|
||||
"ERROR-MESSAGES":{
|
||||
"PAGE-MUST-HAVE-SECTION": "Each section must have at least one subsection.",
|
||||
"PAGE-MUST-HAVE-SECTION": "Each chapter must have at least one section.",
|
||||
"NEEDS-MORE-INFORMATION": " needs more information.",
|
||||
"MUST-HAVE-SECTION-OR-FIELDSET": " must have either subsection or input set.",
|
||||
"MUST-HAVE-SECTION-OR-FIELDSET": " must have either section or question.",
|
||||
"MISSING":"Missing",
|
||||
"PROVIDE-PAGE-AND-SECTION":"Make sure you provide a section and a subsection"
|
||||
"PROVIDE-PAGE-AND-SECTION":"Make sure you provide a chapter and at least one section per chapter."
|
||||
}
|
||||
},
|
||||
"TABLE-OF-CONTENTS":{
|
||||
"ERROR-MESSAGES":{
|
||||
"FIELDSET-MUST-HAVE-PARENT-SECTION":"Input set can only be child of subsection.",
|
||||
"INPUT-SECTION-SAME-LEVEL": "Cannot have input set and section on the same level.",
|
||||
"DRAG-NOT-SUPPORTED":"Drag n drop of subsection not supported to target container.",
|
||||
"PAGE-ELEMENT-ONLY-TOP-LEVEL": "Section elements can only be at top level"
|
||||
"FIELDSET-MUST-HAVE-PARENT-SECTION":"Question can only be child of section.",
|
||||
"INPUT-SECTION-SAME-LEVEL": "Cannot have question and section on the same level.",
|
||||
"DRAG-NOT-SUPPORTED":"Drag n drop of section not supported to target container.",
|
||||
"PAGE-ELEMENT-ONLY-TOP-LEVEL": "Chapter elements can only be at top level"
|
||||
}
|
||||
}
|
||||
},
|
||||
|
@ -515,8 +515,8 @@
|
|||
"FIELDSET": {
|
||||
"ADD-INPUT": "Add new input",
|
||||
"COMMENT-FIELD": "Comment field",
|
||||
"INCLUDE-COMMENT-FIELD": "Include comment field",
|
||||
"ENABLE-MULTIPLICITY": "Enable multiplicity",
|
||||
"INCLUDE-COMMENT-FIELD": "A comment field input is appended to the givven question.",
|
||||
"ENABLE-MULTIPLICITY": "User may provide more than one answer to the givven question.",
|
||||
"MULTIPLICITY": "Multiplicity",
|
||||
"MORE": "More.."
|
||||
}
|
||||
|
|
|
@ -466,25 +466,25 @@
|
|||
"VALUE": "Απαιτούμενη τιμή",
|
||||
"RULE-IF": "Εάν η τιμή είναι",
|
||||
"RULE-THEN": "τότε δείξε το Πεδίο με ταυτοποίηση",
|
||||
"FIELDSETS": "Input sets",
|
||||
"FIELDSETS": "Questions",
|
||||
"FIELDS":"Inputs"
|
||||
}
|
||||
},
|
||||
"FORM-VALIDATION":{
|
||||
"ERROR-MESSAGES":{
|
||||
"PAGE-MUST-HAVE-SECTION": "Each section must have at least one subsection.",
|
||||
"PAGE-MUST-HAVE-SECTION": "Each chapter must have at least one section.",
|
||||
"NEEDS-MORE-INFORMATION": " needs more information.",
|
||||
"MUST-HAVE-SECTION-OR-FIELDSET": " must have either subsection or input set.",
|
||||
"MUST-HAVE-SECTION-OR-FIELDSET": " must have either section or question.",
|
||||
"MISSING":"Missing",
|
||||
"PROVIDE-PAGE-AND-SECTION":"Make sure you provide a section and a subsection"
|
||||
"PROVIDE-PAGE-AND-SECTION":"Make sure you provide a chapter and at least one section per chapter."
|
||||
}
|
||||
},
|
||||
"TABLE-OF-CONTENTS":{
|
||||
"ERROR-MESSAGES":{
|
||||
"FIELDSET-MUST-HAVE-PARENT-SECTION":"Input set can only be child of subsection.",
|
||||
"INPUT-SECTION-SAME-LEVEL": "Cannot have input set and section on the same level.",
|
||||
"DRAG-NOT-SUPPORTED":"Drag n drop of subsection not supported to target container.",
|
||||
"PAGE-ELEMENT-ONLY-TOP-LEVEL": "Section elements can only be at top level"
|
||||
"FIELDSET-MUST-HAVE-PARENT-SECTION":"Question can only be child of section.",
|
||||
"INPUT-SECTION-SAME-LEVEL": "Cannot have question and section on the same level.",
|
||||
"DRAG-NOT-SUPPORTED":"Drag n drop of section not supported to target container.",
|
||||
"PAGE-ELEMENT-ONLY-TOP-LEVEL": "Chapter elements can only be at top level"
|
||||
}
|
||||
}
|
||||
},
|
||||
|
@ -515,8 +515,8 @@
|
|||
"FIELDSET": {
|
||||
"ADD-INPUT": "Add new input",
|
||||
"COMMENT-FIELD": "Comment field",
|
||||
"INCLUDE-COMMENT-FIELD": "Include comment field",
|
||||
"ENABLE-MULTIPLICITY": "Enable multiplicity",
|
||||
"INCLUDE-COMMENT-FIELD": "A comment field input is appended to the givven question.",
|
||||
"ENABLE-MULTIPLICITY": "User may provide more than one answer to the givven question.",
|
||||
"MULTIPLICITY": "Multiplicity",
|
||||
"MORE": "More.."
|
||||
}
|
||||
|
|
|
@ -466,25 +466,25 @@
|
|||
"VALUE": "Valor Obrigatório",
|
||||
"RULE-IF": "Se Valor é",
|
||||
"RULE-THEN": "então mostrar Campo com o Id",
|
||||
"FIELDSETS": "Input sets",
|
||||
"FIELDSETS": "Questions",
|
||||
"FIELDS":"Inputs"
|
||||
}
|
||||
},
|
||||
"FORM-VALIDATION":{
|
||||
"ERROR-MESSAGES":{
|
||||
"PAGE-MUST-HAVE-SECTION": "Each section must have at least one subsection.",
|
||||
"PAGE-MUST-HAVE-SECTION": "Each chapter must have at least one section.",
|
||||
"NEEDS-MORE-INFORMATION": " needs more information.",
|
||||
"MUST-HAVE-SECTION-OR-FIELDSET": " must have either subsection or input set.",
|
||||
"MUST-HAVE-SECTION-OR-FIELDSET": " must have either section or question.",
|
||||
"MISSING":"Missing",
|
||||
"PROVIDE-PAGE-AND-SECTION":"Make sure you provide a section and a subsection"
|
||||
"PROVIDE-PAGE-AND-SECTION":"Make sure you provide a chapter and at least one section per chapter."
|
||||
}
|
||||
},
|
||||
"TABLE-OF-CONTENTS":{
|
||||
"ERROR-MESSAGES":{
|
||||
"FIELDSET-MUST-HAVE-PARENT-SECTION":"Input set can only be child of subsection.",
|
||||
"INPUT-SECTION-SAME-LEVEL": "Cannot have input set and section on the same level.",
|
||||
"DRAG-NOT-SUPPORTED":"Drag n drop of subsection not supported to target container.",
|
||||
"PAGE-ELEMENT-ONLY-TOP-LEVEL": "Section elements can only be at top level"
|
||||
"FIELDSET-MUST-HAVE-PARENT-SECTION":"Question can only be child of section.",
|
||||
"INPUT-SECTION-SAME-LEVEL": "Cannot have question and section on the same level.",
|
||||
"DRAG-NOT-SUPPORTED":"Drag n drop of section not supported to target container.",
|
||||
"PAGE-ELEMENT-ONLY-TOP-LEVEL": "Chapter elements can only be at top level"
|
||||
}
|
||||
}
|
||||
},
|
||||
|
@ -515,8 +515,8 @@
|
|||
"FIELDSET": {
|
||||
"ADD-INPUT": "Add new input",
|
||||
"COMMENT-FIELD": "Comment field",
|
||||
"INCLUDE-COMMENT-FIELD": "Include comment field",
|
||||
"ENABLE-MULTIPLICITY": "Enable multiplicity",
|
||||
"INCLUDE-COMMENT-FIELD": "A comment field input is appended to the givven question.",
|
||||
"ENABLE-MULTIPLICITY": "User may provide more than one answer to the givven question.",
|
||||
"MULTIPLICITY": "Multiplicity",
|
||||
"MORE": "More.."
|
||||
}
|
||||
|
|
|
@ -466,25 +466,25 @@
|
|||
"VALUE": "Required Value",
|
||||
"RULE-IF": "If Value is",
|
||||
"RULE-THEN": "then show Field With Id",
|
||||
"FIELDSETS": "Input sets",
|
||||
"FIELDSETS": "Questions",
|
||||
"FIELDS":"Inputs"
|
||||
}
|
||||
},
|
||||
"FORM-VALIDATION":{
|
||||
"ERROR-MESSAGES":{
|
||||
"PAGE-MUST-HAVE-SECTION": "Each section must have at least one subsection.",
|
||||
"PAGE-MUST-HAVE-SECTION": "Each chapter must have at least one section.",
|
||||
"NEEDS-MORE-INFORMATION": " needs more information.",
|
||||
"MUST-HAVE-SECTION-OR-FIELDSET": " must have either subsection or input set.",
|
||||
"MUST-HAVE-SECTION-OR-FIELDSET": " must have either section or question.",
|
||||
"MISSING":"Missing",
|
||||
"PROVIDE-PAGE-AND-SECTION":"Make sure you provide a section and a subsection"
|
||||
"PROVIDE-PAGE-AND-SECTION":"Make sure you provide a chapter and at least one section per chapter."
|
||||
}
|
||||
},
|
||||
"TABLE-OF-CONTENTS":{
|
||||
"ERROR-MESSAGES":{
|
||||
"FIELDSET-MUST-HAVE-PARENT-SECTION":"Input set can only be child of subsection.",
|
||||
"INPUT-SECTION-SAME-LEVEL": "Cannot have input set and section on the same level.",
|
||||
"DRAG-NOT-SUPPORTED":"Drag n drop of subsection not supported to target container.",
|
||||
"PAGE-ELEMENT-ONLY-TOP-LEVEL": "Section elements can only be at top level"
|
||||
"FIELDSET-MUST-HAVE-PARENT-SECTION":"Question can only be child of section.",
|
||||
"INPUT-SECTION-SAME-LEVEL": "Cannot have question and section on the same level.",
|
||||
"DRAG-NOT-SUPPORTED":"Drag n drop of section not supported to target container.",
|
||||
"PAGE-ELEMENT-ONLY-TOP-LEVEL": "Chapter elements can only be at top level"
|
||||
}
|
||||
}
|
||||
},
|
||||
|
@ -515,8 +515,8 @@
|
|||
"FIELDSET": {
|
||||
"ADD-INPUT": "Add new input",
|
||||
"COMMENT-FIELD": "Comment field",
|
||||
"INCLUDE-COMMENT-FIELD": "Include comment field",
|
||||
"ENABLE-MULTIPLICITY": "Enable multiplicity",
|
||||
"INCLUDE-COMMENT-FIELD": "A comment field input is appended to the givven question.",
|
||||
"ENABLE-MULTIPLICITY": "User may provide more than one answer to the givven question.",
|
||||
"MULTIPLICITY": "Multiplicity",
|
||||
"MORE": "More.."
|
||||
}
|
||||
|
|
|
@ -466,25 +466,25 @@
|
|||
"VALUE": "Obavezna vrednost",
|
||||
"RULE-IF": "Ako je vrednost",
|
||||
"RULE-THEN": "tada prikazati polje sa Id",
|
||||
"FIELDSETS": "Input sets",
|
||||
"FIELDSETS": "Questions",
|
||||
"FIELDS":"Inputs"
|
||||
}
|
||||
},
|
||||
"FORM-VALIDATION":{
|
||||
"ERROR-MESSAGES":{
|
||||
"PAGE-MUST-HAVE-SECTION": "Each section must have at least one subsection.",
|
||||
"PAGE-MUST-HAVE-SECTION": "Each chapter must have at least one section.",
|
||||
"NEEDS-MORE-INFORMATION": " needs more information.",
|
||||
"MUST-HAVE-SECTION-OR-FIELDSET": " must have either subsection or input set.",
|
||||
"MUST-HAVE-SECTION-OR-FIELDSET": " must have either section or question.",
|
||||
"MISSING":"Missing",
|
||||
"PROVIDE-PAGE-AND-SECTION":"Make sure you provide a section and a subsection"
|
||||
"PROVIDE-PAGE-AND-SECTION":"Make sure you provide a chapter and at least one section per chapter."
|
||||
}
|
||||
},
|
||||
"TABLE-OF-CONTENTS":{
|
||||
"ERROR-MESSAGES":{
|
||||
"FIELDSET-MUST-HAVE-PARENT-SECTION":"Input set can only be child of subsection.",
|
||||
"INPUT-SECTION-SAME-LEVEL": "Cannot have input set and section on the same level.",
|
||||
"DRAG-NOT-SUPPORTED":"Drag n drop of subsection not supported to target container.",
|
||||
"PAGE-ELEMENT-ONLY-TOP-LEVEL": "Section elements can only be at top level"
|
||||
"FIELDSET-MUST-HAVE-PARENT-SECTION":"Question can only be child of section.",
|
||||
"INPUT-SECTION-SAME-LEVEL": "Cannot have question and section on the same level.",
|
||||
"DRAG-NOT-SUPPORTED":"Drag n drop of section not supported to target container.",
|
||||
"PAGE-ELEMENT-ONLY-TOP-LEVEL": "Chapter elements can only be at top level"
|
||||
}
|
||||
}
|
||||
},
|
||||
|
@ -515,8 +515,8 @@
|
|||
"FIELDSET": {
|
||||
"ADD-INPUT": "Add new input",
|
||||
"COMMENT-FIELD": "Comment field",
|
||||
"INCLUDE-COMMENT-FIELD": "Include comment field",
|
||||
"ENABLE-MULTIPLICITY": "Enable multiplicity",
|
||||
"INCLUDE-COMMENT-FIELD": "A comment field input is appended to the givven question.",
|
||||
"ENABLE-MULTIPLICITY": "User may provide more than one answer to the givven question.",
|
||||
"MULTIPLICITY": "Multiplicity",
|
||||
"MORE": "More.."
|
||||
}
|
||||
|
|
|
@ -466,25 +466,25 @@
|
|||
"VALUE": "Gerekli Değer",
|
||||
"RULE-IF": "Eğer değer",
|
||||
"RULE-THEN": "sonra alanı kimliği ile göster",
|
||||
"FIELDSETS": "Input sets",
|
||||
"FIELDSETS": "Questions",
|
||||
"FIELDS":"Inputs"
|
||||
}
|
||||
},
|
||||
"FORM-VALIDATION":{
|
||||
"ERROR-MESSAGES":{
|
||||
"PAGE-MUST-HAVE-SECTION": "Each section must have at least one subsection.",
|
||||
"PAGE-MUST-HAVE-SECTION": "Each chapter must have at least one section.",
|
||||
"NEEDS-MORE-INFORMATION": " needs more information.",
|
||||
"MUST-HAVE-SECTION-OR-FIELDSET": " must have either subsection or input set.",
|
||||
"MUST-HAVE-SECTION-OR-FIELDSET": " must have either section or question.",
|
||||
"MISSING":"Missing",
|
||||
"PROVIDE-PAGE-AND-SECTION":"Make sure you provide a section and a subsection"
|
||||
"PROVIDE-PAGE-AND-SECTION":"Make sure you provide a chapter and at least one section per chapter."
|
||||
}
|
||||
},
|
||||
"TABLE-OF-CONTENTS":{
|
||||
"ERROR-MESSAGES":{
|
||||
"FIELDSET-MUST-HAVE-PARENT-SECTION":"Input set can only be child of subsection.",
|
||||
"INPUT-SECTION-SAME-LEVEL": "Cannot have input set and section on the same level.",
|
||||
"DRAG-NOT-SUPPORTED":"Drag n drop of subsection not supported to target container.",
|
||||
"PAGE-ELEMENT-ONLY-TOP-LEVEL": "Section elements can only be at top level"
|
||||
"FIELDSET-MUST-HAVE-PARENT-SECTION":"Question can only be child of section.",
|
||||
"INPUT-SECTION-SAME-LEVEL": "Cannot have question and section on the same level.",
|
||||
"DRAG-NOT-SUPPORTED":"Drag n drop of section not supported to target container.",
|
||||
"PAGE-ELEMENT-ONLY-TOP-LEVEL": "Chapter elements can only be at top level"
|
||||
}
|
||||
}
|
||||
},
|
||||
|
@ -515,8 +515,8 @@
|
|||
"FIELDSET": {
|
||||
"ADD-INPUT": "Add new input",
|
||||
"COMMENT-FIELD": "Comment field",
|
||||
"INCLUDE-COMMENT-FIELD": "Include comment field",
|
||||
"ENABLE-MULTIPLICITY": "Enable multiplicity",
|
||||
"INCLUDE-COMMENT-FIELD": "A comment field input is appended to the givven question.",
|
||||
"ENABLE-MULTIPLICITY": "User may provide more than one answer to the givven question.",
|
||||
"MULTIPLICITY": "Multiplicity",
|
||||
"MORE": "More.."
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue