2019-01-18 18:03:45 +01:00
|
|
|
import { FormBuilder, FormGroup, Validators } from "@angular/forms";
|
2019-12-11 15:51:03 +01:00
|
|
|
import { DmpProfileFieldDataType } from '@app/core/common/enum/dmp-profile-field-type';
|
|
|
|
import { DmpProfileType } from '@app/core/common/enum/dmp-profile-type';
|
2019-12-13 12:15:12 +01:00
|
|
|
import { DmpStatus } from '@app/core/common/enum/dmp-status';
|
2019-12-11 15:51:03 +01:00
|
|
|
import { DatasetModel } from '@app/core/model/dataset/dataset';
|
|
|
|
import { DmpProfile, DmpProfileDefinition } from '@app/core/model/dmp-profile/dmp-profile';
|
|
|
|
import { DmpProfileField } from '@app/core/model/dmp-profile/dmp-profile-field';
|
|
|
|
import { DmpModel } from '@app/core/model/dmp/dmp';
|
|
|
|
import { DmpDynamicField } from '@app/core/model/dmp/dmp-dynamic-field';
|
|
|
|
import { DmpDynamicFieldDependency } from '@app/core/model/dmp/dmp-dynamic-field-dependency';
|
|
|
|
import { OrganizationModel } from '@app/core/model/organisation/organization';
|
|
|
|
import { ResearcherModel } from '@app/core/model/researcher/researcher';
|
|
|
|
import { UserModel } from '@app/core/model/user/user';
|
|
|
|
import { UserInfoListingModel } from '@app/core/model/user/user-info-listing';
|
|
|
|
import { ValidJsonValidator } from '@app/library/auto-complete/auto-complete-custom-validator';
|
|
|
|
import { DmpProfileExternalAutoCompleteFieldDataEditorModel } from '@app/ui/admin/dmp-profile/editor/external-autocomplete/dmp-profile-external-autocomplete-field-editor.model';
|
|
|
|
import { FunderFormModel } from '@app/ui/dmp/editor/grant-tab/funder-form-model';
|
|
|
|
import { GrantTabModel } from '@app/ui/dmp/editor/grant-tab/grant-tab-model';
|
|
|
|
import { ProjectFormModel } from '@app/ui/dmp/editor/grant-tab/project-form-model';
|
|
|
|
import { BackendErrorValidator } from '@common/forms/validation/custom-validator';
|
|
|
|
import { ValidationErrorModel } from '@common/forms/validation/error-model/validation-error-model';
|
|
|
|
import { ValidationContext } from '@common/forms/validation/validation-context';
|
2020-06-03 11:13:31 +02:00
|
|
|
import { ExtraPropertiesFormModel } from './general-tab/extra-properties-form.model';
|
2020-06-26 17:57:04 +02:00
|
|
|
import { isNullOrUndefined } from 'util';
|
2020-07-29 17:04:19 +02:00
|
|
|
import { DatasetWizardEditorModel } from '@app/ui/dataset/dataset-wizard/dataset-wizard-editor.model';
|
|
|
|
import { DatasetsAutoCompleteFieldDataEditorModel } from '@app/ui/admin/dataset-profile/admin/field-data/datasets-autocomplete-field-data-editor-mode';
|
|
|
|
import { DatasetWizardModel } from '@app/core/model/dataset/dataset-wizard';
|
2018-10-12 10:22:23 +02:00
|
|
|
|
2019-01-18 18:03:45 +01:00
|
|
|
export class DmpEditorModel {
|
2018-10-05 17:00:54 +02:00
|
|
|
public id: string;
|
|
|
|
public label: string;
|
|
|
|
public groupId: String;
|
|
|
|
public profile: String;
|
|
|
|
public version: number;
|
2018-10-11 13:22:03 +02:00
|
|
|
public lockable: boolean;
|
2019-01-18 18:03:45 +01:00
|
|
|
public creator: UserModel;
|
2019-12-13 12:15:12 +01:00
|
|
|
public status: DmpStatus = DmpStatus.Draft;
|
2018-10-05 17:00:54 +02:00
|
|
|
public description: String;
|
2019-08-01 09:54:40 +02:00
|
|
|
public grant: GrantTabModel;
|
2019-08-20 17:32:42 +02:00
|
|
|
public project: ProjectFormModel;
|
2019-08-26 16:29:57 +02:00
|
|
|
public funder: FunderFormModel;
|
2019-01-18 18:03:45 +01:00
|
|
|
public organisations: OrganizationModel[] = [];
|
2018-10-05 17:00:54 +02:00
|
|
|
public researchers: ResearcherModel[] = [];
|
2019-01-18 18:03:45 +01:00
|
|
|
public profiles: DmpProfile[] = [];
|
2020-07-29 17:04:19 +02:00
|
|
|
public datasets: DatasetWizardEditorModel[] = [];
|
|
|
|
// public datasets: DatasetModel[] = [];
|
2019-07-01 11:35:09 +02:00
|
|
|
public datasetsToBeFinalized: string[] = [];
|
2019-01-18 18:03:45 +01:00
|
|
|
public associatedUsers: UserModel[] = [];
|
2019-05-28 09:49:09 +02:00
|
|
|
public users: UserInfoListingModel[] = [];
|
2019-01-18 18:03:45 +01:00
|
|
|
public definition: DmpProfileDefinition;
|
|
|
|
public dynamicFields: Array<DmpDynamicFieldEditorModel> = [];
|
2019-01-21 12:14:20 +01:00
|
|
|
public validationErrorModel: ValidationErrorModel = new ValidationErrorModel();
|
2020-02-10 17:21:06 +01:00
|
|
|
public modified: Date;
|
2020-06-03 11:13:31 +02:00
|
|
|
public extraProperties: ExtraPropertiesFormModel;
|
2017-12-14 14:10:56 +01:00
|
|
|
|
2019-01-18 18:03:45 +01:00
|
|
|
fromModel(item: DmpModel): DmpEditorModel {
|
2018-10-05 17:00:54 +02:00
|
|
|
this.id = item.id;
|
|
|
|
this.profile = item.profile;
|
|
|
|
this.label = item.label;
|
|
|
|
this.groupId = item.groupId;
|
|
|
|
this.version = item.version;
|
|
|
|
this.status = item.status;
|
2018-10-11 13:22:03 +02:00
|
|
|
this.lockable = item.lockable;
|
2018-10-05 17:00:54 +02:00
|
|
|
this.description = item.description;
|
2019-08-01 09:54:40 +02:00
|
|
|
this.grant.fromModel(item.grant);
|
2019-08-20 17:32:42 +02:00
|
|
|
this.project.fromModel(item.project);
|
2019-08-26 16:29:57 +02:00
|
|
|
this.funder.fromModel(item.funder);
|
2019-01-18 18:03:45 +01:00
|
|
|
this.organisations = item.organisations;
|
|
|
|
this.researchers = item.researchers;
|
|
|
|
this.profiles = item.profiles;
|
2020-07-29 17:04:19 +02:00
|
|
|
if (item.datasets) { item.datasets.map(x => this.datasets.push(new DatasetWizardEditorModel().fromModel(x))); }
|
2019-06-24 11:21:23 +02:00
|
|
|
this.datasetsToBeFinalized = item.datasetsToBeFinalized;
|
2019-01-18 18:03:45 +01:00
|
|
|
this.associatedUsers = item.associatedUsers;
|
2019-05-28 09:49:09 +02:00
|
|
|
this.users = item.users;
|
2019-01-18 18:03:45 +01:00
|
|
|
if (item.definition) { this.definition = item.definition; }
|
|
|
|
if (item.dynamicFields) { item.dynamicFields.map(x => this.dynamicFields.push(new DmpDynamicFieldEditorModel().fromModel(x))); }
|
|
|
|
this.creator = item.creator;
|
2020-02-10 17:21:06 +01:00
|
|
|
this.modified = new Date(item.modified);
|
2020-06-26 17:57:04 +02:00
|
|
|
if (!isNullOrUndefined(item.extraProperties)) {
|
|
|
|
this.extraProperties.fromModel(item.extraProperties);
|
|
|
|
}
|
2018-10-05 17:00:54 +02:00
|
|
|
return this;
|
|
|
|
}
|
2017-12-18 11:01:22 +01:00
|
|
|
|
2018-10-05 17:00:54 +02:00
|
|
|
buildForm(context: ValidationContext = null, disabled: boolean = false): FormGroup {
|
|
|
|
if (context == null) { context = this.createValidationContext(); }
|
2017-12-18 11:01:22 +01:00
|
|
|
|
2018-10-05 17:00:54 +02:00
|
|
|
const formGroup = new FormBuilder().group({
|
|
|
|
id: [{ value: this.id, disabled: disabled }, context.getValidation('id').validators],
|
|
|
|
profile: [{ value: this.profile, disabled: disabled }, context.getValidation('profile').validators],
|
|
|
|
label: [{ value: this.label, disabled: disabled }, context.getValidation('label').validators],
|
|
|
|
groupId: [{ value: this.groupId, disabled: disabled }, context.getValidation('groupId').validators],
|
|
|
|
version: [{ value: this.version, disabled: disabled }, context.getValidation('version').validators],
|
|
|
|
status: [{ value: this.status, disabled: disabled }, context.getValidation('status').validators],
|
2019-04-02 15:48:45 +02:00
|
|
|
description: [{ value: this.description, disabled: disabled }],
|
2019-08-01 09:54:40 +02:00
|
|
|
grant: this.grant.buildForm(),
|
2019-08-20 17:32:42 +02:00
|
|
|
project: this.project.buildForm(),
|
2019-08-26 16:29:57 +02:00
|
|
|
funder: this.funder.buildForm(),
|
2018-10-05 17:00:54 +02:00
|
|
|
organisations: [{ value: this.organisations, disabled: disabled }, context.getValidation('organisations').validators],
|
|
|
|
researchers: [{ value: this.researchers, disabled: disabled }, context.getValidation('researchers').validators],
|
|
|
|
profiles: [{ value: this.profiles, disabled: disabled }, context.getValidation('profiles').validators],
|
2020-07-29 17:04:19 +02:00
|
|
|
// datasets: [{ value: this.datasets, disabled: disabled }, context.getValidation('datasets').validators],
|
2019-06-24 11:21:23 +02:00
|
|
|
datasetsToBeFinalized: [{ value: this.datasetsToBeFinalized, disabled: disabled }, context.getValidation('datasetsToBeFinalized').validators],
|
2018-10-05 17:00:54 +02:00
|
|
|
associatedUsers: [{ value: this.associatedUsers, disabled: disabled }, context.getValidation('associatedUsers').validators],
|
2020-02-10 17:21:06 +01:00
|
|
|
users: [{ value: this.users, disabled: disabled }, context.getValidation('users').validators],
|
2020-06-03 11:13:31 +02:00
|
|
|
modified: [{value: this.modified, disabled: disabled}, context.getValidation('modified').validators],
|
|
|
|
extraProperties: this.extraProperties.buildForm(),
|
2018-10-05 17:00:54 +02:00
|
|
|
});
|
2017-12-18 11:01:22 +01:00
|
|
|
|
2020-07-29 17:04:19 +02:00
|
|
|
const datasets = new Array<FormGroup>();
|
|
|
|
if(this.datasets) { this.datasets.forEach(item => datasets.push(item.buildForm())); }
|
|
|
|
formGroup.addControl('datasets', new FormBuilder().array(datasets));
|
|
|
|
|
2018-10-05 17:00:54 +02:00
|
|
|
const dynamicFields = new Array<FormGroup>();
|
|
|
|
if (this.dynamicFields) { this.dynamicFields.forEach(item => dynamicFields.push(item.buildForm())); }
|
|
|
|
formGroup.addControl('dynamicFields', new FormBuilder().array(dynamicFields));
|
2018-03-28 15:24:47 +02:00
|
|
|
|
2019-07-25 13:06:22 +02:00
|
|
|
if (this.definition) {
|
|
|
|
const fields = new Array<FormGroup>();
|
|
|
|
this.definition.fields.forEach(item => fields.push(new DmpDefinitionFieldEditorModel().fromModel(item).buildForm()));
|
|
|
|
const definition = new FormBuilder().group({
|
|
|
|
fields: new FormBuilder().array(fields)
|
|
|
|
});
|
|
|
|
formGroup.addControl('definition', definition);
|
|
|
|
}
|
|
|
|
|
2018-10-05 17:00:54 +02:00
|
|
|
return formGroup;
|
|
|
|
}
|
2017-12-18 11:01:22 +01:00
|
|
|
|
2018-10-05 17:00:54 +02:00
|
|
|
createValidationContext(): ValidationContext {
|
|
|
|
const baseContext: ValidationContext = new ValidationContext();
|
2019-01-21 12:14:20 +01:00
|
|
|
baseContext.validation.push({ key: 'id', validators: [BackendErrorValidator(this.validationErrorModel, 'id')] });
|
|
|
|
baseContext.validation.push({ key: 'profile', validators: [BackendErrorValidator(this.validationErrorModel, 'profile')] });
|
|
|
|
baseContext.validation.push({ key: 'label', validators: [Validators.required, BackendErrorValidator(this.validationErrorModel, 'label')] });
|
|
|
|
baseContext.validation.push({ key: 'groupId', validators: [BackendErrorValidator(this.validationErrorModel, 'groupId')] });
|
|
|
|
baseContext.validation.push({ key: 'version', validators: [BackendErrorValidator(this.validationErrorModel, 'version')] });
|
|
|
|
baseContext.validation.push({ key: 'status', validators: [Validators.required, BackendErrorValidator(this.validationErrorModel, 'status')] });
|
|
|
|
baseContext.validation.push({ key: 'description', validators: [Validators.required, BackendErrorValidator(this.validationErrorModel, 'description')] });
|
2019-08-01 09:54:40 +02:00
|
|
|
baseContext.validation.push({ key: 'grant', validators: [Validators.required, BackendErrorValidator(this.validationErrorModel, 'grant')] });
|
2019-08-20 17:32:42 +02:00
|
|
|
baseContext.validation.push({ key: 'project', validators: [BackendErrorValidator(this.validationErrorModel, 'project')] });
|
2019-08-26 16:29:57 +02:00
|
|
|
baseContext.validation.push({ key: 'funder', validators: [BackendErrorValidator(this.validationErrorModel, 'funder')] });
|
2019-01-21 12:14:20 +01:00
|
|
|
baseContext.validation.push({ key: 'organisations', validators: [BackendErrorValidator(this.validationErrorModel, 'organisations')] });
|
|
|
|
baseContext.validation.push({ key: 'researchers', validators: [BackendErrorValidator(this.validationErrorModel, 'researchers')] });
|
|
|
|
baseContext.validation.push({ key: 'profiles', validators: [Validators.required, ValidJsonValidator, BackendErrorValidator(this.validationErrorModel, 'profiles')] });
|
2019-06-24 11:21:23 +02:00
|
|
|
baseContext.validation.push({ key: 'datasets', validators: [BackendErrorValidator(this.validationErrorModel, 'datasets')] });
|
|
|
|
baseContext.validation.push({ key: 'datasetsToBeFinalized', validators: [BackendErrorValidator(this.validationErrorModel, 'datasetsToBeFinalized')] });
|
2019-01-21 12:14:20 +01:00
|
|
|
baseContext.validation.push({ key: 'associatedUsers', validators: [BackendErrorValidator(this.validationErrorModel, 'associatedUsers')] });
|
2019-05-28 11:59:23 +02:00
|
|
|
baseContext.validation.push({ key: 'users', validators: [BackendErrorValidator(this.validationErrorModel, 'users')] });
|
2020-02-11 17:29:40 +01:00
|
|
|
baseContext.validation.push({ key: 'modified', validators: [] });
|
2018-10-05 17:00:54 +02:00
|
|
|
return baseContext;
|
|
|
|
}
|
2018-06-27 12:29:21 +02:00
|
|
|
}
|
2019-01-18 18:03:45 +01:00
|
|
|
|
|
|
|
export class DmpDynamicFieldEditorModel {
|
|
|
|
|
|
|
|
public id: string;
|
|
|
|
public name: string;
|
|
|
|
public required: boolean;
|
|
|
|
public queryProperty;
|
|
|
|
public value: string;
|
|
|
|
public dependencies: Array<DmpDynamicFieldDependencyEditorModel> = [];
|
|
|
|
|
|
|
|
fromModel(item: DmpDynamicField): DmpDynamicFieldEditorModel {
|
|
|
|
this.id = item.id;
|
|
|
|
this.name = item.name;
|
|
|
|
this.required = item.required;
|
|
|
|
this.value = item.value;
|
|
|
|
this.queryProperty = item.queryProperty;
|
|
|
|
if (item.dependencies) { item.dependencies.map(x => this.dependencies.push(new DmpDynamicFieldDependencyEditorModel().fromModel(x))); }
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
|
|
|
|
buildForm(): FormGroup {
|
|
|
|
const builder = new FormBuilder();
|
|
|
|
const formGroup = builder.group({
|
|
|
|
id: [this.id],
|
|
|
|
name: [this.name],
|
|
|
|
required: [this.required],
|
|
|
|
value: [this.value],
|
|
|
|
queryProperty: [this.queryProperty],
|
|
|
|
dependencies: [this.dependencies]
|
|
|
|
});
|
|
|
|
return formGroup;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
export class DmpDynamicFieldDependencyEditorModel {
|
|
|
|
public id: string;
|
|
|
|
public queryProperty: string;
|
|
|
|
|
|
|
|
fromModel(item: DmpDynamicFieldDependency): DmpDynamicFieldDependencyEditorModel {
|
|
|
|
this.id = item.id;
|
|
|
|
this.queryProperty = item.queryProperty;
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
|
|
|
|
buildForm(): FormGroup {
|
|
|
|
return new FormBuilder().group({
|
|
|
|
id: [this.id],
|
|
|
|
queryProperty: [this.queryProperty]
|
|
|
|
});
|
|
|
|
}
|
2019-01-24 16:30:23 +01:00
|
|
|
}
|
|
|
|
|
2019-07-25 13:06:22 +02:00
|
|
|
export class DmpDefinitionFieldEditorModel implements DmpProfileField {
|
|
|
|
public id: string;
|
|
|
|
public type: DmpProfileType;
|
|
|
|
public dataType: DmpProfileFieldDataType;
|
|
|
|
public required = false;
|
|
|
|
public label: string;
|
|
|
|
public value: any;
|
|
|
|
public externalAutocomplete?: DmpProfileExternalAutoCompleteFieldDataEditorModel;
|
|
|
|
|
|
|
|
fromModel(item: DmpProfileField): DmpDefinitionFieldEditorModel {
|
|
|
|
this.type = item.type;
|
|
|
|
this.dataType = item.dataType;
|
|
|
|
this.required = item.required;
|
|
|
|
this.label = item.label;
|
|
|
|
this.id = item.id;
|
|
|
|
this.value = item.value;
|
|
|
|
if (item.externalAutocomplete)
|
|
|
|
this.externalAutocomplete = new DmpProfileExternalAutoCompleteFieldDataEditorModel().fromModel(item.externalAutocomplete);
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
|
|
|
|
buildForm(): FormGroup {
|
|
|
|
const formGroup = new FormBuilder().group({
|
|
|
|
type: [this.type],
|
|
|
|
id: [this.id],
|
|
|
|
dataType: [this.dataType],
|
|
|
|
required: [this.required],
|
|
|
|
label: [this.label],
|
|
|
|
value: [this.value]
|
|
|
|
});
|
|
|
|
if (this.externalAutocomplete) {
|
|
|
|
formGroup.addControl('externalAutocomplete', this.externalAutocomplete.buildForm());
|
|
|
|
}
|
|
|
|
return formGroup;
|
|
|
|
}
|
|
|
|
}
|