DmpBlueprint refactor

This commit is contained in:
Efstratios Giannopoulos 2023-10-24 12:13:05 +03:00
parent dc380cdc01
commit a68668f07e
6 changed files with 150 additions and 66 deletions

View File

@ -1,6 +1,7 @@
package eu.eudat.commons.types.dmpblueprint; package eu.eudat.commons.types.dmpblueprint;
import eu.eudat.commons.enums.DmpBlueprintExtraFieldDataType; import eu.eudat.commons.enums.DmpBlueprintExtraFieldDataType;
import eu.eudat.commons.enums.DmpBlueprintFieldCategory;
import org.w3c.dom.Element; import org.w3c.dom.Element;
public class ExtraFieldEntity extends FieldEntity { public class ExtraFieldEntity extends FieldEntity {
@ -23,6 +24,7 @@ public class ExtraFieldEntity extends FieldEntity {
@Override @Override
public ExtraFieldEntity fromXmlChild(Element item) { public ExtraFieldEntity fromXmlChild(Element item) {
this.type = DmpBlueprintExtraFieldDataType.of(Short.parseShort(item.getAttribute("type"))); this.type = DmpBlueprintExtraFieldDataType.of(Short.parseShort(item.getAttribute("type")));
this.setCategory(DmpBlueprintFieldCategory.Extra);
return this; return this;
} }
} }

View File

@ -1,5 +1,6 @@
package eu.eudat.commons.types.dmpblueprint; package eu.eudat.commons.types.dmpblueprint;
import eu.eudat.commons.enums.DmpBlueprintExtraFieldDataType;
import eu.eudat.commons.enums.DmpBlueprintFieldCategory; import eu.eudat.commons.enums.DmpBlueprintFieldCategory;
import eu.eudat.commons.types.xml.XmlSerializable; import eu.eudat.commons.types.xml.XmlSerializable;
import org.w3c.dom.Document; import org.w3c.dom.Document;

View File

@ -1,5 +1,6 @@
package eu.eudat.commons.types.dmpblueprint; package eu.eudat.commons.types.dmpblueprint;
import eu.eudat.commons.enums.DmpBlueprintFieldCategory;
import eu.eudat.commons.enums.DmpBlueprintSystemFieldType; import eu.eudat.commons.enums.DmpBlueprintSystemFieldType;
import eu.eudat.commons.types.xml.XmlSerializable; import eu.eudat.commons.types.xml.XmlSerializable;
import org.w3c.dom.Document; import org.w3c.dom.Document;
@ -27,6 +28,7 @@ public class SystemFieldEntity extends FieldEntity {
@Override @Override
public SystemFieldEntity fromXmlChild(Element item) { public SystemFieldEntity fromXmlChild(Element item) {
this.type = DmpBlueprintSystemFieldType.of(Short.parseShort(item.getAttribute("type"))); this.type = DmpBlueprintSystemFieldType.of(Short.parseShort(item.getAttribute("type")));
this.setCategory(DmpBlueprintFieldCategory.System);
return this; return this;
} }
} }

View File

@ -10,12 +10,17 @@ import { BaseHttpParams } from '@common/http/base-http-params';
import { InterceptorType } from '@common/http/interceptors/interceptor-type'; import { InterceptorType } from '@common/http/interceptors/interceptor-type';
import { QueryResult } from '@common/model/query-result'; import { QueryResult } from '@common/model/query-result';
import { Guid } from '@common/types/guid'; import { Guid } from '@common/types/guid';
import { Observable, throwError } from 'rxjs'; import { catchError, map } from 'rxjs/operators';
import { catchError } from 'rxjs/operators';
import { ConfigurationService } from '../configuration/configuration.service'; import { ConfigurationService } from '../configuration/configuration.service';
import { BaseHttpV2Service } from '../http/base-http-v2.service'; import { BaseHttpV2Service } from '../http/base-http-v2.service';
import { DmpBlueprintCriteria } from '@app/core/query/dmp/dmp-blueprint-criteria'; import { DmpBlueprintCriteria } from '@app/core/query/dmp/dmp-blueprint-criteria';
import { DataTableRequest } from '@app/core/model/data-table/data-table-request'; import { DataTableRequest } from '@app/core/model/data-table/data-table-request';
import { SingleAutoCompleteConfiguration } from '@app/library/auto-complete/single/single-auto-complete-configuration';
import { MultipleAutoCompleteConfiguration } from '@app/library/auto-complete/multiple/multiple-auto-complete-configuration';
import { IsActive } from '@app/core/common/enum/is-active.enum';
import { nameof } from 'ts-simple-nameof';
import { FilterService } from '@common/modules/text-filter/filter-service';
import { Observable, throwError } from 'rxjs';
@Injectable() @Injectable()
export class DmpBlueprintService { export class DmpBlueprintService {
@ -23,7 +28,7 @@ export class DmpBlueprintService {
private actionUrl: string; private actionUrl: string;
private headers = new HttpHeaders(); private headers = new HttpHeaders();
constructor(private http: BaseHttpV2Service, private httpClient: HttpClient, private configurationService: ConfigurationService) { constructor(private http: BaseHttpV2Service, private httpClient: HttpClient, private configurationService: ConfigurationService, private filterService: FilterService) {
this.actionUrl = configurationService.server + 'dmpprofile/'; this.actionUrl = configurationService.server + 'dmpprofile/';
} }
@ -65,10 +70,6 @@ export class DmpBlueprintService {
return this.http.post<DataTableData<DmpBlueprint>>(this.actionUrl + 'getPaged', dataTableRequest, { headers: this.headers }); return this.http.post<DataTableData<DmpBlueprint>>(this.actionUrl + 'getPaged', dataTableRequest, { headers: this.headers });
} }
getPagedBlueprint(dataTableRequest: DataTableRequest<DmpBlueprintCriteria>): Observable<DataTableData<DmpBlueprint>> {
return this.http.post<DataTableData<DmpBlueprint>>(this.actionUrl + 'getPagedBlueprint', dataTableRequest, { headers: this.headers });
}
getSingleBlueprint(id: String): Observable<DmpBlueprint> { getSingleBlueprint(id: String): Observable<DmpBlueprint> {
return this.http.get<DmpBlueprint>(this.actionUrl + 'getSingleBlueprint/' + id, { headers: this.headers }); return this.http.get<DmpBlueprint>(this.actionUrl + 'getSingleBlueprint/' + id, { headers: this.headers });
} }
@ -103,4 +104,44 @@ export class DmpBlueprintService {
externalAutocomplete(lookUpItem: RequestItem<DmpBlueprintExternalAutocompleteCriteria>): Observable<any> { externalAutocomplete(lookUpItem: RequestItem<DmpBlueprintExternalAutocompleteCriteria>): Observable<any> {
return this.httpClient.post(this.actionUrl + 'search/autocomplete', lookUpItem); return this.httpClient.post(this.actionUrl + 'search/autocomplete', lookUpItem);
} }
//
// Autocomplete Commons
//
// tslint:disable-next-line: member-ordering
singleAutocompleteConfiguration: SingleAutoCompleteConfiguration = {
initialItems: (data?: any) => this.query(this.buildAutocompleteLookup()).pipe(map(x => x.items)),
filterFn: (searchQuery: string, data?: any) => this.query(this.buildAutocompleteLookup(searchQuery)).pipe(map(x => x.items)),
getSelectedItem: (selectedItem: any) => this.query(this.buildAutocompleteLookup(null, null, [selectedItem])).pipe(map(x => x.items[0])),
displayFn: (item: DmpBlueprint) => item.label,
titleFn: (item: DmpBlueprint) => item.label,
valueAssign: (item: DmpBlueprint) => item.id,
};
// tslint:disable-next-line: member-ordering
multipleAutocompleteConfiguration: MultipleAutoCompleteConfiguration = {
initialItems: (excludedItems: any[], data?: any) => this.query(this.buildAutocompleteLookup(null, excludedItems ? excludedItems : null)).pipe(map(x => x.items)),
filterFn: (searchQuery: string, excludedItems: any[]) => this.query(this.buildAutocompleteLookup(searchQuery, excludedItems)).pipe(map(x => x.items)),
getSelectedItems: (selectedItems: any[]) => this.query(this.buildAutocompleteLookup(null, null, selectedItems)).pipe(map(x => x.items)),
displayFn: (item: DmpBlueprint) => item.label,
titleFn: (item: DmpBlueprint) => item.label,
valueAssign: (item: DmpBlueprint) => item.id,
};
private buildAutocompleteLookup(like?: string, excludedIds?: Guid[], ids?: Guid[]): DmpBlueprintLookup {
const lookup: DmpBlueprintLookup = new DmpBlueprintLookup();
lookup.page = { size: 100, offset: 0 };
if (excludedIds && excludedIds.length > 0) { lookup.excludedIds = excludedIds; }
if (ids && ids.length > 0) { lookup.ids = ids; }
lookup.isActive = [IsActive.Active];
lookup.project = {
fields: [
nameof<DmpBlueprint>(x => x.id),
nameof<DmpBlueprint>(x => x.label)
]
};
lookup.order = { items: [nameof<DmpBlueprint>(x => x.label)] };
if (like) { lookup.like = this.filterService.transformLike(like); }
return lookup;
}
} }

View File

@ -104,7 +104,7 @@
<div class="heading2">0.3 Blueprint of DMP *</div> <div class="heading2">0.3 Blueprint of DMP *</div>
<mat-form-field> <mat-form-field>
<mat-label>Select blueprint</mat-label> <mat-label>Select blueprint</mat-label>
<app-single-auto-complete [required]="false" [formControl]="formGroup.get('profile')" placeholder="Select blueprint" [configuration]="dmpBlueprintAutoCompleteConfiguration"> <app-single-auto-complete [required]="false" [formControl]="formGroup.get('profile')" placeholder="Select blueprint" [configuration]="dmpBlueprintService.singleAutocompleteConfiguration">
</app-single-auto-complete> </app-single-auto-complete>
</mat-form-field> </mat-form-field>
</div> </div>

View File

@ -54,9 +54,10 @@ import { ExtraPropertiesFormModel } from '../editor/general-tab/extra-properties
import { FunderFormModel } from '../editor/grant-tab/funder-form-model'; import { FunderFormModel } from '../editor/grant-tab/funder-form-model';
import { GrantTabModel } from '../editor/grant-tab/grant-tab-model'; import { GrantTabModel } from '../editor/grant-tab/grant-tab-model';
import { ProjectFormModel } from '../editor/grant-tab/project-form-model'; import { ProjectFormModel } from '../editor/grant-tab/project-form-model';
import { DmpBlueprintDefinition } from '@app/core/model/dmp-blueprint/dmp-blueprint'; import { DescriptionTemplatesInSection, DmpBlueprint, DmpBlueprintDefinition, DmpBlueprintDefinitionSection, FieldInSection } from '@app/core/model/dmp-blueprint/dmp-blueprint';
import { DmpBlueprintExtraFieldDataType } from '@app/core/common/enum/dmp-blueprint-extra-field-data-type'; import { DmpBlueprintExtraFieldDataType } from '@app/core/common/enum/dmp-blueprint-extra-field-data-type';
import { DmpBlueprintSystemFieldType } from '@app/core/common/enum/dmp-blueprint-system-field-type'; import { DmpBlueprintSystemFieldType } from '@app/core/common/enum/dmp-blueprint-system-field-type';
import { nameof } from 'ts-simple-nameof';
interface Visible { interface Visible {
value: boolean; value: boolean;
@ -129,7 +130,7 @@ export class DmpEditorBlueprintComponent extends CheckDeactivateBaseComponent im
profilesAutoCompleteConfiguration: MultipleAutoCompleteConfiguration; profilesAutoCompleteConfiguration: MultipleAutoCompleteConfiguration;
readonly defaultBlueprintId = '86635178-36a6-484f-9057-a934e4eeecd5'; readonly defaultBlueprintId: Guid = Guid.parse('86635178-36a6-484f-9057-a934e4eeecd5');
constructor( constructor(
private dmpBlueprintService: DmpBlueprintService, private dmpBlueprintService: DmpBlueprintService,
@ -179,15 +180,13 @@ export class DmpEditorBlueprintComponent extends CheckDeactivateBaseComponent im
this.formGroupRawValue = JSON.parse(JSON.stringify(this.formGroup.getRawValue())); this.formGroupRawValue = JSON.parse(JSON.stringify(this.formGroup.getRawValue()));
if (!isNullOrUndefined(this.formGroup.get('profile').value)) { if (!isNullOrUndefined(this.formGroup.get('profile').value)) {
this.dmpBlueprintService.getSingleBlueprint(this.formGroup.get('profile').value) this.getSingle(Guid.parse(this.formGroup.get('profile').value), data => {
.pipe(takeUntil(this._destroyed)) this.selectedDmpBlueprintDefinition = data.definition;
.subscribe(result => {
this.selectedDmpBlueprintDefinition = result.definition;
this.checkForGrant(); this.checkForGrant();
this.checkForFunder(); this.checkForFunder();
this.checkForProject(); this.checkForProject();
this.buildExtraFields(); this.buildExtraFields();
this.formGroup.get('profile').setValue(result); this.formGroup.get('profile').setValue(data);
this.maxStep = this.selectedDmpBlueprintDefinition.sections.length; this.maxStep = this.selectedDmpBlueprintDefinition.sections.length;
this.step = 1; this.step = 1;
this.addProfiles(this.dmp.profiles); this.addProfiles(this.dmp.profiles);
@ -252,15 +251,13 @@ export class DmpEditorBlueprintComponent extends CheckDeactivateBaseComponent im
this.formGroupRawValue = JSON.parse(JSON.stringify(this.formGroup.getRawValue())); this.formGroupRawValue = JSON.parse(JSON.stringify(this.formGroup.getRawValue()));
if (!isNullOrUndefined(this.formGroup.get('profile').value)) { if (!isNullOrUndefined(this.formGroup.get('profile').value)) {
this.dmpBlueprintService.getSingleBlueprint(this.formGroup.get('profile').value) this.getSingle(Guid.parse(this.formGroup.get('profile').value), data => {
.pipe(takeUntil(this._destroyed)) this.selectedDmpBlueprintDefinition = data.definition;
.subscribe(result => {
this.selectedDmpBlueprintDefinition = result.definition;
this.checkForGrant(); this.checkForGrant();
this.checkForFunder(); this.checkForFunder();
this.checkForProject(); this.checkForProject();
this.buildExtraFields(); this.buildExtraFields();
this.formGroup.get('profile').setValue(result); this.formGroup.get('profile').setValue(data);
this.maxStep = this.selectedDmpBlueprintDefinition.sections.length; this.maxStep = this.selectedDmpBlueprintDefinition.sections.length;
this.step = 1; this.step = 1;
this.addProfiles(); this.addProfiles();
@ -434,11 +431,9 @@ export class DmpEditorBlueprintComponent extends CheckDeactivateBaseComponent im
} }
selectDefaultBlueprint() { selectDefaultBlueprint() {
this.dmpBlueprintService.getSingleBlueprint(this.defaultBlueprintId) this.getSingle(this.defaultBlueprintId, data => {
.pipe(takeUntil(this._destroyed)) this.selectedDmpBlueprintDefinition = data.definition;
.subscribe(result => { this.formGroup.get('profile').setValue(data.id);
this.selectedDmpBlueprintDefinition = result.definition;
this.formGroup.get('profile').setValue(result);
this.maxStep = this.selectedDmpBlueprintDefinition.sections.length; this.maxStep = this.selectedDmpBlueprintDefinition.sections.length;
this.nextStep(); this.nextStep();
}); });
@ -834,18 +829,61 @@ export class DmpEditorBlueprintComponent extends CheckDeactivateBaseComponent im
return this.dmpService.searchDmpBlueprints(request); return this.dmpService.searchDmpBlueprints(request);
} }
private getSingle(blueprintId: Guid, successFunction) {
this.dmpBlueprintService.getSingle(blueprintId, [
nameof<DmpBlueprint>(x => x.id),
nameof<DmpBlueprint>(x => x.label),
nameof<DmpBlueprint>(x => x.status),
nameof<DmpBlueprint>(x => x.description),
nameof<DmpBlueprint>(x => x.status),
[nameof<DmpBlueprint>(x => x.definition), nameof<DmpBlueprintDefinition>(x => x.sections), nameof<DmpBlueprintDefinitionSection>(x => x.id)].join('.'),
[nameof<DmpBlueprint>(x => x.definition), nameof<DmpBlueprintDefinition>(x => x.sections), nameof<DmpBlueprintDefinitionSection>(x => x.label)].join('.'),
[nameof<DmpBlueprint>(x => x.definition), nameof<DmpBlueprintDefinition>(x => x.sections), nameof<DmpBlueprintDefinitionSection>(x => x.description)].join('.'),
[nameof<DmpBlueprint>(x => x.definition), nameof<DmpBlueprintDefinition>(x => x.sections), nameof<DmpBlueprintDefinitionSection>(x => x.ordinal)].join('.'),
[nameof<DmpBlueprint>(x => x.definition), nameof<DmpBlueprintDefinition>(x => x.sections), nameof<DmpBlueprintDefinitionSection>(x => x.hasTemplates)].join('.'),
[nameof<DmpBlueprint>(x => x.definition), nameof<DmpBlueprintDefinition>(x => x.sections), nameof<DmpBlueprintDefinitionSection>(x => x.fields), nameof<FieldInSection>(x => x.id)].join('.'),
[nameof<DmpBlueprint>(x => x.definition), nameof<DmpBlueprintDefinition>(x => x.sections), nameof<DmpBlueprintDefinitionSection>(x => x.fields), nameof<FieldInSection>(x => x.category)].join('.'),
[nameof<DmpBlueprint>(x => x.definition), nameof<DmpBlueprintDefinition>(x => x.sections), nameof<DmpBlueprintDefinitionSection>(x => x.fields), nameof<FieldInSection>(x => x.dataType)].join('.'),
[nameof<DmpBlueprint>(x => x.definition), nameof<DmpBlueprintDefinition>(x => x.sections), nameof<DmpBlueprintDefinitionSection>(x => x.fields), nameof<FieldInSection>(x => x.systemFieldType)].join('.'),
[nameof<DmpBlueprint>(x => x.definition), nameof<DmpBlueprintDefinition>(x => x.sections), nameof<DmpBlueprintDefinitionSection>(x => x.fields), nameof<FieldInSection>(x => x.label)].join('.'),
[nameof<DmpBlueprint>(x => x.definition), nameof<DmpBlueprintDefinition>(x => x.sections), nameof<DmpBlueprintDefinitionSection>(x => x.fields), nameof<FieldInSection>(x => x.placeholder)].join('.'),
[nameof<DmpBlueprint>(x => x.definition), nameof<DmpBlueprintDefinition>(x => x.sections), nameof<DmpBlueprintDefinitionSection>(x => x.fields), nameof<FieldInSection>(x => x.description)].join('.'),
[nameof<DmpBlueprint>(x => x.definition), nameof<DmpBlueprintDefinition>(x => x.sections), nameof<DmpBlueprintDefinitionSection>(x => x.fields), nameof<FieldInSection>(x => x.required)].join('.'),
[nameof<DmpBlueprint>(x => x.definition), nameof<DmpBlueprintDefinition>(x => x.sections), nameof<DmpBlueprintDefinitionSection>(x => x.fields), nameof<FieldInSection>(x => x.ordinal)].join('.'),
[nameof<DmpBlueprint>(x => x.definition), nameof<DmpBlueprintDefinition>(x => x.sections), nameof<DmpBlueprintDefinitionSection>(x => x.descriptionTemplates), nameof<DescriptionTemplatesInSection>(x => x.id)].join('.'),
[nameof<DmpBlueprint>(x => x.definition), nameof<DmpBlueprintDefinition>(x => x.sections), nameof<DmpBlueprintDefinitionSection>(x => x.descriptionTemplates), nameof<DescriptionTemplatesInSection>(x => x.descriptionTemplateId)].join('.'),
[nameof<DmpBlueprint>(x => x.definition), nameof<DmpBlueprintDefinition>(x => x.sections), nameof<DmpBlueprintDefinitionSection>(x => x.descriptionTemplates), nameof<DescriptionTemplatesInSection>(x => x.label)].join('.'),
[nameof<DmpBlueprint>(x => x.definition), nameof<DmpBlueprintDefinition>(x => x.sections), nameof<DmpBlueprintDefinitionSection>(x => x.descriptionTemplates), nameof<DescriptionTemplatesInSection>(x => x.minMultiplicity)].join('.'),
[nameof<DmpBlueprint>(x => x.definition), nameof<DmpBlueprintDefinition>(x => x.sections), nameof<DmpBlueprintDefinitionSection>(x => x.descriptionTemplates), nameof<DescriptionTemplatesInSection>(x => x.maxMultiplicity)].join('.'),
nameof<DmpBlueprint>(x => x.createdAt),
nameof<DmpBlueprint>(x => x.hash),
nameof<DmpBlueprint>(x => x.isActive)
]
)
.pipe(map(data => data as DmpBlueprint), takeUntil(this._destroyed))
.subscribe(
data => successFunction(data),
error => this.onCallbackError(error)
);
}
registerFormEventsForDmpBlueprint(): void { registerFormEventsForDmpBlueprint(): void {
this.formGroup.get('profile').valueChanges this.formGroup.get('profile').valueChanges
.pipe( .pipe(
takeUntil(this._destroyed)) takeUntil(this._destroyed))
.subscribe(Option => { .subscribe(blueprintIdString => {
if (Option instanceof Object) { const blueprintId = Guid.parse(blueprintIdString);
this.selectedDmpBlueprintDefinition = Option.definition; if (blueprintId) {
this.getSingle(blueprintId, data => {
this.selectedDmpBlueprintDefinition = data.definition;
this.checkForGrant(); this.checkForGrant();
this.checkForFunder(); this.checkForFunder();
this.checkForProject(); this.checkForProject();
this.buildExtraFields(); this.buildExtraFields();
this.addProfiles(); this.addProfiles();
});
} }
else { else {
this.selectedDmpBlueprintDefinition = null; this.selectedDmpBlueprintDefinition = null;
@ -964,21 +1002,21 @@ export class DmpEditorBlueprintComponent extends CheckDeactivateBaseComponent im
} }
dmpBlueprintAutoCompleteConfiguration: SingleAutoCompleteConfiguration = { // dmpBlueprintAutoCompleteConfiguration: SingleAutoCompleteConfiguration = {
filterFn: this.dmpBlueprintSearch.bind(this), // filterFn: this.dmpBlueprintSearch.bind(this),
initialItems: (extraData) => this.dmpBlueprintSearch(''), // initialItems: (extraData) => this.dmpBlueprintSearch(''),
displayFn: (item) => item['label'], // displayFn: (item) => item['label'],
titleFn: (item) => item['label'] // titleFn: (item) => item['label']
}; // };
dmpBlueprintSearch(query: string) { // dmpBlueprintSearch(query: string) {
let fields: Array<string> = new Array(); // let fields: Array<string> = new Array();
var request = new DataTableRequest<DmpBlueprintCriteria>(0, 20, { fields: fields }); // var request = new DataTableRequest<DmpBlueprintCriteria>(0, 20, { fields: fields });
request.criteria = new DmpBlueprintCriteria(); // request.criteria = new DmpBlueprintCriteria();
request.criteria.like = query; // request.criteria.like = query;
request.criteria.status = DmpBlueprintStatus.Finalized; // request.criteria.status = DmpBlueprintStatus.Finalized;
return this.dmpBlueprintService.getPagedBlueprint(request).pipe(map(x => x.data)); // return this.dmpBlueprintService.getPagedBlueprint(request).pipe(map(x => x.data));
} // }
getLanguageInfos(): LanguageInfo[] { getLanguageInfos(): LanguageInfo[] {
return this.languageInfoService.getLanguageInfoValues(); return this.languageInfoService.getLanguageInfoValues();