diff --git a/src/app/collection-page/collection-form/collection-form.component.ts b/src/app/collection-page/collection-form/collection-form.component.ts index e8b368a25f..c4c8635991 100644 --- a/src/app/collection-page/collection-form/collection-form.component.ts +++ b/src/app/collection-page/collection-form/collection-form.component.ts @@ -1,18 +1,28 @@ -import { Component, Input } from '@angular/core'; +import { Component, Input, OnInit } from '@angular/core'; + +import { Observable } from 'rxjs'; +import { TranslateService } from '@ngx-translate/core'; import { DynamicFormControlModel, + DynamicFormOptionConfig, DynamicFormService, DynamicInputModel, + DynamicSelectModel, DynamicTextAreaModel } from '@ng-dynamic-forms/core'; + import { Collection } from '../../core/shared/collection.model'; import { ComColFormComponent } from '../../shared/comcol-forms/comcol-form/comcol-form.component'; -import { TranslateService } from '@ngx-translate/core'; import { NotificationsService } from '../../shared/notifications/notifications.service'; import { CommunityDataService } from '../../core/data/community-data.service'; import { AuthService } from '../../core/auth/auth.service'; import { RequestService } from '../../core/data/request.service'; import { ObjectCacheService } from '../../core/cache/object-cache.service'; +import { EntityTypeService } from '../../core/data/entity-type.service'; +import { ItemType } from '../../core/shared/item-relationships/item-type.model'; +import { MetadataValue } from '../../core/shared/metadata.models'; +import { getFirstSucceededRemoteListPayload } from '../../core/shared/operators'; +import { collectionFormEntityTypeSelectionConfig, collectionFormModels, } from './collection-form.models'; /** * Form used for creating and editing collections @@ -22,7 +32,7 @@ import { ObjectCacheService } from '../../core/cache/object-cache.service'; styleUrls: ['../../shared/comcol-forms/comcol-form/comcol-form.component.scss'], templateUrl: '../../shared/comcol-forms/comcol-form/comcol-form.component.html' }) -export class CollectionFormComponent extends ComColFormComponent { +export class CollectionFormComponent extends ComColFormComponent implements OnInit { /** * @type {Collection} A new collection when a collection is being created, an existing Input collection when a collection is being edited */ @@ -33,47 +43,17 @@ export class CollectionFormComponent extends ComColFormComponent { */ type = Collection.type; + /** + * The dynamic form field used for entity type selection + * @type {DynamicSelectModel} + */ + entityTypeSelection: DynamicSelectModel = new DynamicSelectModel(collectionFormEntityTypeSelectionConfig); + /** * The dynamic form fields used for creating/editing a collection * @type {(DynamicInputModel | DynamicTextAreaModel)[]} */ - formModel: DynamicFormControlModel[] = [ - new DynamicInputModel({ - id: 'title', - name: 'dc.title', - required: true, - validators: { - required: null - }, - errorMessages: { - required: 'Please enter a name for this title' - }, - }), - new DynamicTextAreaModel({ - id: 'description', - name: 'dc.description', - }), - new DynamicTextAreaModel({ - id: 'abstract', - name: 'dc.description.abstract', - }), - new DynamicTextAreaModel({ - id: 'rights', - name: 'dc.rights', - }), - new DynamicTextAreaModel({ - id: 'tableofcontents', - name: 'dc.description.tableofcontents', - }), - new DynamicTextAreaModel({ - id: 'license', - name: 'dc.rights.license', - }), - new DynamicTextAreaModel({ - id: 'provenance', - name: 'dc.description.provenance', - }), - ]; + formModel: DynamicFormControlModel[]; public constructor(protected formService: DynamicFormService, protected translate: TranslateService, @@ -81,7 +61,41 @@ export class CollectionFormComponent extends ComColFormComponent { protected authService: AuthService, protected dsoService: CommunityDataService, protected requestService: RequestService, - protected objectCache: ObjectCacheService) { + protected objectCache: ObjectCacheService, + protected entityTypeService: EntityTypeService) { super(formService, translate, notificationsService, authService, requestService, objectCache); } + + ngOnInit() { + + let currentRelationshipValue: MetadataValue[]; + if (this.dso && this.dso.metadata) { + currentRelationshipValue = this.dso.metadata['dspace.entity.type']; + } + + const entities$: Observable = this.entityTypeService.findAll({ elementsPerPage: 100, currentPage: 1 }).pipe( + getFirstSucceededRemoteListPayload() + ); + + // retrieve all entity types to populate the dropdowns selection + entities$.subscribe((entityTypes: ItemType[]) => { + + entityTypes.forEach((type: ItemType, index: number) => { + this.entityTypeSelection.add({ + disabled: false, + label: type.label, + value: type.label + } as DynamicFormOptionConfig); + if (currentRelationshipValue && currentRelationshipValue.length > 0 && currentRelationshipValue[0].value === type.label) { + this.entityTypeSelection.select(index); + this.entityTypeSelection.disabled = true; + } + }); + + this.formModel = [...collectionFormModels, this.entityTypeSelection]; + + super.ngOnInit(); + }); + + } } diff --git a/src/app/collection-page/collection-form/collection-form.models.ts b/src/app/collection-page/collection-form/collection-form.models.ts new file mode 100644 index 0000000000..dc26b787c4 --- /dev/null +++ b/src/app/collection-page/collection-form/collection-form.models.ts @@ -0,0 +1,53 @@ +import { DynamicFormControlModel, DynamicInputModel, DynamicTextAreaModel } from '@ng-dynamic-forms/core'; +import { DynamicSelectModelConfig } from '@ng-dynamic-forms/core/lib/model/select/dynamic-select.model'; + +export const collectionFormEntityTypeSelectionConfig: DynamicSelectModelConfig = { + id: 'entityType', + name: 'dspace.entity.type', + required: true, + disabled: false, + validators: { + required: null + }, + errorMessages: { + required: 'collection.form.errors.entityType.required' + }, +}; + +/** + * The dynamic form fields used for creating/editing a collection + * @type {(DynamicInputModel | DynamicTextAreaModel)[]} + */ +export const collectionFormModels: DynamicFormControlModel[] = [ + new DynamicInputModel({ + id: 'title', + name: 'dc.title', + required: true, + validators: { + required: null + }, + errorMessages: { + required: 'Please enter a name for this title' + }, + }), + new DynamicTextAreaModel({ + id: 'description', + name: 'dc.description', + }), + new DynamicTextAreaModel({ + id: 'abstract', + name: 'dc.description.abstract', + }), + new DynamicTextAreaModel({ + id: 'rights', + name: 'dc.rights', + }), + new DynamicTextAreaModel({ + id: 'tableofcontents', + name: 'dc.description.tableofcontents', + }), + new DynamicTextAreaModel({ + id: 'license', + name: 'dc.rights.license', + }) +]; diff --git a/src/assets/i18n/en.json5 b/src/assets/i18n/en.json5 index 8908ca42f6..f02f2afc84 100644 --- a/src/assets/i18n/en.json5 +++ b/src/assets/i18n/en.json5 @@ -854,6 +854,10 @@ "collection.form.title": "Name", + "collection.form.entityType": "Entity Type", + + "collection.form.errors.entityType.required": "Please choose an entity type for this collection", + "collection.listelement.badge": "Collection",