From ae6a6f28f7d749b94fdee1edf991ee52bae3c3fd Mon Sep 17 00:00:00 2001 From: lotte Date: Thu, 17 Oct 2019 16:37:55 +0200 Subject: [PATCH] added new submission list component for persons --- .../item-relationships.component.spec.ts | 2 +- .../research-entities.module.ts | 4 +- ...ult-list-submission-element.component.html | 17 ++++ ...ult-list-submission-element.component.scss | 0 ...-list-submission-element.component.spec.ts | 94 +++++++++++++++++++ ...esult-list-submission-element.component.ts | 19 ++++ ...-lookup-relation-search-tab.component.html | 2 + ...ic-lookup-relation-search-tab.component.ts | 15 ++- .../models/relationship-options.model.ts | 1 + .../builder/parsers/concat-field-parser.ts | 2 +- .../search-results.component.html | 1 + .../search-results.component.ts | 3 + 12 files changed, 155 insertions(+), 5 deletions(-) create mode 100644 src/app/entity-groups/research-entities/submission/item-list-elements/person/person-search-result-list-submission-element.component.html create mode 100644 src/app/entity-groups/research-entities/submission/item-list-elements/person/person-search-result-list-submission-element.component.scss create mode 100644 src/app/entity-groups/research-entities/submission/item-list-elements/person/person-search-result-list-submission-element.component.spec.ts create mode 100644 src/app/entity-groups/research-entities/submission/item-list-elements/person/person-search-result-list-submission-element.component.ts diff --git a/src/app/+item-page/edit-item-page/item-relationships/item-relationships.component.spec.ts b/src/app/+item-page/edit-item-page/item-relationships/item-relationships.component.spec.ts index 910ebad579..37745ec96a 100644 --- a/src/app/+item-page/edit-item-page/item-relationships/item-relationships.component.spec.ts +++ b/src/app/+item-page/edit-item-page/item-relationships/item-relationships.component.spec.ts @@ -158,7 +158,7 @@ describe('ItemRelationshipsComponent', () => { deleteRelationship: observableOf(new RestResponse(true, 200, 'OK')), getItemResolvedRelatedItemsAndRelationships: observableCombineLatest(observableOf([author1, author2]), observableOf([item, item]), observableOf(relationships)), getRelationshipsByRelatedItemIds: observableOf(relationships), - getRelationshipTypeLabelsByItem: observableOf([relationshipType.leftLabel]) + getRelationshipTypeLabelsByItem: observableOf([relationshipType.leftwardType]) } ); diff --git a/src/app/entity-groups/research-entities/research-entities.module.ts b/src/app/entity-groups/research-entities/research-entities.module.ts index 8829318f34..4185a1f6cd 100644 --- a/src/app/entity-groups/research-entities/research-entities.module.ts +++ b/src/app/entity-groups/research-entities/research-entities.module.ts @@ -20,6 +20,7 @@ import { OrgUnitSearchResultGridElementComponent } from './item-grid-elements/se import { ProjectSearchResultGridElementComponent } from './item-grid-elements/search-result-grid-elements/project/project-search-result-grid-element.component'; import { PersonItemMetadataListElementComponent } from './metadata-representations/person/person-item-metadata-list-element.component'; import { OrgUnitItemMetadataListElementComponent } from './metadata-representations/org-unit/org-unit-item-metadata-list-element.component'; +import { PersonSearchResultListSubmissionElementComponent } from './submission/item-list-elements/person/person-search-result-list-submission-element.component'; const ENTRY_COMPONENTS = [ OrgUnitComponent, @@ -38,7 +39,8 @@ const ENTRY_COMPONENTS = [ ProjectSearchResultListElementComponent, PersonSearchResultGridElementComponent, OrgUnitSearchResultGridElementComponent, - ProjectSearchResultGridElementComponent + ProjectSearchResultGridElementComponent, + PersonSearchResultListSubmissionElementComponent ]; @NgModule({ diff --git a/src/app/entity-groups/research-entities/submission/item-list-elements/person/person-search-result-list-submission-element.component.html b/src/app/entity-groups/research-entities/submission/item-list-elements/person/person-search-result-list-submission-element.component.html new file mode 100644 index 0000000000..2a53e88623 --- /dev/null +++ b/src/app/entity-groups/research-entities/submission/item-list-elements/person/person-search-result-list-submission-element.component.html @@ -0,0 +1,17 @@ + + + + + + + + + + + + + diff --git a/src/app/entity-groups/research-entities/submission/item-list-elements/person/person-search-result-list-submission-element.component.scss b/src/app/entity-groups/research-entities/submission/item-list-elements/person/person-search-result-list-submission-element.component.scss new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/app/entity-groups/research-entities/submission/item-list-elements/person/person-search-result-list-submission-element.component.spec.ts b/src/app/entity-groups/research-entities/submission/item-list-elements/person/person-search-result-list-submission-element.component.spec.ts new file mode 100644 index 0000000000..25786f7a56 --- /dev/null +++ b/src/app/entity-groups/research-entities/submission/item-list-elements/person/person-search-result-list-submission-element.component.spec.ts @@ -0,0 +1,94 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; +import { ChangeDetectionStrategy, NO_ERRORS_SCHEMA } from '@angular/core'; +import { By } from '@angular/platform-browser'; +import { of as observableOf } from 'rxjs'; +import { ItemSearchResult } from '../../../../../shared/object-collection/shared/item-search-result.model'; +import { PersonSearchResultListSubmissionElementComponent } from './person-search-result-list-submission-element.component'; +import { Item } from '../../../../../core/shared/item.model'; +import { TruncatePipe } from '../../../../../shared/utils/truncate.pipe'; +import { TruncatableService } from '../../../../../shared/truncatable/truncatable.service'; + +let personListElementComponent: PersonSearchResultListSubmissionElementComponent; +let fixture: ComponentFixture; + +const mockItemWithMetadata: ItemSearchResult = Object.assign( + new ItemSearchResult(), + { + indexableObject: Object.assign(new Item(), { + bitstreams: observableOf({}), + metadata: { + 'dc.title': [ + { + language: 'en_US', + value: 'This is just another title' + } + ], + 'person.jobTitle': [ + { + language: 'en_US', + value: 'Developer' + } + ] + } + }) + }); +const mockItemWithoutMetadata: ItemSearchResult = Object.assign( + new ItemSearchResult(), + { + indexableObject: Object.assign(new Item(), { + bitstreams: observableOf({}), + metadata: { + 'dc.title': [ + { + language: 'en_US', + value: 'This is just another title' + } + ] + } + }) + }); + +describe('PersonSearchResultListElementComponent', () => { + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [PersonSearchResultListSubmissionElementComponent, TruncatePipe], + providers: [ + { provide: TruncatableService, useValue: {} } + ], + + schemas: [NO_ERRORS_SCHEMA] + }).overrideComponent(PersonSearchResultListSubmissionElementComponent, { + set: { changeDetection: ChangeDetectionStrategy.Default } + }).compileComponents(); + })); + + beforeEach(async(() => { + fixture = TestBed.createComponent(PersonSearchResultListSubmissionElementComponent); + personListElementComponent = fixture.componentInstance; + + })); + + describe('When the item has a job title', () => { + beforeEach(() => { + personListElementComponent.object = mockItemWithMetadata; + fixture.detectChanges(); + }); + + it('should show the job title span', () => { + const jobTitleField = fixture.debugElement.query(By.css('span.item-list-job-title')); + expect(jobTitleField).not.toBeNull(); + }); + }); + + describe('When the item has no job title', () => { + beforeEach(() => { + personListElementComponent.object = mockItemWithoutMetadata; + fixture.detectChanges(); + }); + + it('should not show the job title span', () => { + const jobTitleField = fixture.debugElement.query(By.css('span.item-list-job-title')); + expect(jobTitleField).toBeNull(); + }); + }); +}); diff --git a/src/app/entity-groups/research-entities/submission/item-list-elements/person/person-search-result-list-submission-element.component.ts b/src/app/entity-groups/research-entities/submission/item-list-elements/person/person-search-result-list-submission-element.component.ts new file mode 100644 index 0000000000..4ddab97669 --- /dev/null +++ b/src/app/entity-groups/research-entities/submission/item-list-elements/person/person-search-result-list-submission-element.component.ts @@ -0,0 +1,19 @@ +import { Component } from '@angular/core'; +import { SearchResultListElementComponent } from '../../../../../shared/object-list/search-result-list-element/search-result-list-element.component'; +import { ItemSearchResult } from '../../../../../shared/object-collection/shared/item-search-result.model'; +import { listableObjectComponent } from '../../../../../shared/object-collection/shared/listable-object/listable-object.decorator'; +import { ViewMode } from '../../../../../core/shared/view-mode.model'; +import { Item } from '../../../../../core/shared/item.model'; +import { Context } from '../../../../../core/shared/context.model'; + +@listableObjectComponent('PersonSearchResult', ViewMode.ListElement, Context.Submission) +@Component({ + selector: 'ds-person-search-result-list-submission-element', + styleUrls: ['./person-search-result-list-submission-element.component.scss'], + templateUrl: './person-search-result-list-submission-element.component.html' +}) +/** + * The component for displaying a list element for an item search result of the type Person + */ +export class PersonSearchResultListSubmissionElementComponent extends SearchResultListElementComponent { +} diff --git a/src/app/shared/form/builder/ds-dynamic-form-ui/relation-lookup-modal/search-tab/dynamic-lookup-relation-search-tab.component.html b/src/app/shared/form/builder/ds-dynamic-form-ui/relation-lookup-modal/search-tab/dynamic-lookup-relation-search-tab.component.html index 9b4aa5372c..4e2da1f12b 100644 --- a/src/app/shared/form/builder/ds-dynamic-form-ui/relation-lookup-modal/search-tab/dynamic-lookup-relation-search-tab.component.html +++ b/src/app/shared/form/builder/ds-dynamic-form-ui/relation-lookup-modal/search-tab/dynamic-lookup-relation-search-tab.component.html @@ -60,6 +60,8 @@ [searchConfig]="this.searchConfig" [selectable]="true" [selectionConfig]="{ repeatable: repeatable, listId: listId }" + [linkType]="linkTypes.ExternalLink" + [context]="context" (deselectObject)="deselectObject.emit($event)" (selectObject)="selectObject.emit($event)"> diff --git a/src/app/shared/form/builder/ds-dynamic-form-ui/relation-lookup-modal/search-tab/dynamic-lookup-relation-search-tab.component.ts b/src/app/shared/form/builder/ds-dynamic-form-ui/relation-lookup-modal/search-tab/dynamic-lookup-relation-search-tab.component.ts index 59268992a6..ae8db45a48 100644 --- a/src/app/shared/form/builder/ds-dynamic-form-ui/relation-lookup-modal/search-tab/dynamic-lookup-relation-search-tab.component.ts +++ b/src/app/shared/form/builder/ds-dynamic-form-ui/relation-lookup-modal/search-tab/dynamic-lookup-relation-search-tab.component.ts @@ -18,6 +18,9 @@ import { concat, map, multicast, switchMap, take, takeWhile, tap } from 'rxjs/op import { DSpaceObject } from '../../../../../../core/shared/dspace-object.model'; import { getSucceededRemoteData } from '../../../../../../core/shared/operators'; import { RouteService } from '../../../../../../core/services/route.service'; +import { CollectionElementLinkType } from '../../../../../object-collection/collection-element-link.type'; +import { Context } from '../../../../../../core/shared/context.model'; +import { relationship } from '../../../../../../core/cache/builders/build-decorators'; @Component({ selector: 'ds-dynamic-lookup-relation-search-tab', @@ -48,6 +51,8 @@ export class DsDynamicLookupRelationSearchTabComponent implements OnInit, OnDest id: 'submission-relation-list', pageSize: 5 }); + linkTypes = CollectionElementLinkType; + context: Context; constructor( private searchService: SearchService, @@ -62,6 +67,13 @@ export class DsDynamicLookupRelationSearchTabComponent implements OnInit, OnDest this.resetRoute(); this.routeService.setParameter('fixedFilterQuery', this.relationship.filter); this.routeService.setParameter('configuration', this.relationship.searchConfiguration); + /** + * TODO REMOVE NEXT LINE + */ + this.relationship.nameVariants = true; + if (this.relationship.nameVariants) { + this.context = Context.Submission; + } this.someSelected$ = this.selection$.pipe(map((selection) => isNotEmpty(selection))); this.resultsRD$ = this.searchConfigService.paginatedSearchOptions.pipe( @@ -77,8 +89,7 @@ export class DsDynamicLookupRelationSearchTabComponent implements OnInit, OnDest () => new ReplaySubject(1), subject => subject.pipe( takeWhile((rd: RemoteData>>) => rd.isLoading), - concat(subject.pipe(take(1)) - ) + concat(subject.pipe(take(1))) ) ) as any ) diff --git a/src/app/shared/form/builder/models/relationship-options.model.ts b/src/app/shared/form/builder/models/relationship-options.model.ts index cd6e00e7dc..62caedb06e 100644 --- a/src/app/shared/form/builder/models/relationship-options.model.ts +++ b/src/app/shared/form/builder/models/relationship-options.model.ts @@ -2,4 +2,5 @@ export interface RelationshipOptions { relationshipType: string; filter: string; searchConfiguration: string; + nameVariants: boolean; } diff --git a/src/app/shared/form/builder/parsers/concat-field-parser.ts b/src/app/shared/form/builder/parsers/concat-field-parser.ts index 798f3ecaa3..57bdc8d0dc 100644 --- a/src/app/shared/form/builder/parsers/concat-field-parser.ts +++ b/src/app/shared/form/builder/parsers/concat-field-parser.ts @@ -52,7 +52,7 @@ export class ConcatFieldParser extends FieldParser { concatGroup.separator = this.separator; const input1ModelConfig: DynamicInputModelConfig = this.initModel(id + CONCAT_FIRST_INPUT_SUFFIX, false, false); - const input2ModelConfig: DynamicInputModelConfig = this.initModel(id + CONCAT_SECOND_INPUT_SUFFIX, true, false); + const input2ModelConfig: DynamicInputModelConfig = this.initModel(id + CONCAT_SECOND_INPUT_SUFFIX, false, false); input2ModelConfig.hint = ' '; if (this.configData.mandatory) { diff --git a/src/app/shared/search/search-results/search-results.component.html b/src/app/shared/search/search-results/search-results.component.html index 70e527373c..ab1e96c58f 100644 --- a/src/app/shared/search/search-results/search-results.component.html +++ b/src/app/shared/search/search-results/search-results.component.html @@ -7,6 +7,7 @@ [hideGear]="true" [selectable]="selectable" [selectionConfig]="selectionConfig" + [context]="context" (deselectObject)="deselectObject.emit($event)" (selectObject)="selectObject.emit($event)" > diff --git a/src/app/shared/search/search-results/search-results.component.ts b/src/app/shared/search/search-results/search-results.component.ts index 6f09e6624a..f245b5f9ae 100644 --- a/src/app/shared/search/search-results/search-results.component.ts +++ b/src/app/shared/search/search-results/search-results.component.ts @@ -10,6 +10,7 @@ import { SortOptions } from '../../../core/cache/models/sort-options.model'; import { ListableObject } from '../../object-collection/shared/listable-object.model'; import { CollectionElementLinkType } from '../../object-collection/collection-element-link.type'; import { ViewMode } from '../../../core/shared/view-mode.model'; +import { Context } from '../../../core/shared/context.model'; @Component({ selector: 'ds-search-results', @@ -64,6 +65,8 @@ export class SearchResultsComponent { @Input() selectable = false; + @Input() context: Context; + @Input() selectionConfig: {repeatable: boolean, listId: string}; @Output() deselectObject: EventEmitter = new EventEmitter();