Skip to content

Commit a1c734d

Browse files
atarix83corrad82-4s
authored andcommitted
Merged in dspacecris7-CST-6876 (pull request DSpace#316)
MyDSpace fixes
2 parents 380aadb + dfc8133 commit a1c734d

34 files changed

Lines changed: 468 additions & 172 deletions

File tree

src/app/core/shared/search/search-filter.service.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { combineLatest as observableCombineLatest, Observable } from 'rxjs';
1+
import { BehaviorSubject, combineLatest as observableCombineLatest, Observable } from 'rxjs';
22
import { distinctUntilChanged, map } from 'rxjs/operators';
33
import { Injectable, InjectionToken } from '@angular/core';
44
import {
@@ -26,6 +26,7 @@ const filterStateSelector = (state: SearchFiltersState) => state.searchFilter;
2626

2727
export const FILTER_CONFIG: InjectionToken<SearchFilterConfig> = new InjectionToken<SearchFilterConfig>('filterConfig');
2828
export const IN_PLACE_SEARCH: InjectionToken<boolean> = new InjectionToken<boolean>('inPlaceSearch');
29+
export const REFRESH_FILTER: InjectionToken<BehaviorSubject<any>> = new InjectionToken<boolean>('refreshFilters');
2930

3031
/**
3132
* Service that performs all actions that have to do with search filters and facets

src/app/core/shared/search/search.service.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -408,9 +408,11 @@ export class SearchService implements OnDestroy {
408408
* @param {number} valuePage The page number of the filter values
409409
* @param {SearchOptions} searchOptions The search configuration for the current search
410410
* @param {string} filterQuery The optional query used to filter out filter values
411+
* @param useCachedVersionIfAvailable If this is true, the request will only be sent if there's
412+
* no valid cached version. Defaults to true
411413
* @returns {Observable<RemoteData<PaginatedList<FacetValue>>>} Emits the given page of facet values
412414
*/
413-
getFacetValuesFor(filterConfig: SearchFilterConfig, valuePage: number, searchOptions?: SearchOptions, filterQuery?: string): Observable<RemoteData<FacetValues>> {
415+
getFacetValuesFor(filterConfig: SearchFilterConfig, valuePage: number, searchOptions?: SearchOptions, filterQuery?: string, useCachedVersionIfAvailable = true): Observable<RemoteData<FacetValues>> {
414416
let href;
415417
const args: string[] = [`page=${valuePage - 1}`, `size=${filterConfig.pageSize}`];
416418
if (hasValue(filterQuery)) {
@@ -428,7 +430,7 @@ export class SearchService implements OnDestroy {
428430
return FacetValueResponseParsingService;
429431
}
430432
});
431-
this.requestService.send(request, true);
433+
this.requestService.send(request, useCachedVersionIfAvailable);
432434

433435
return this.rdb.buildFromHref(href);
434436
}

src/app/shared/object-collection/object-collection.component.html

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
[importConfig]="importConfig"
2121
[customData]="customData"
2222
(importObject)="importObject.emit($event)"
23-
(contentChange)="contentChange.emit()"
23+
(contentChange)="contentChange.emit($event)"
2424
(customEvent)="customEvent.emit($event)"
2525
(prev)="goPrev()"
2626
(next)="goNext()"
@@ -51,6 +51,7 @@
5151
[context]="context"
5252
[hidePaginationDetail]="hidePaginationDetail"
5353
[showPaginator]="showPaginator"
54+
(contentChange)="contentChange.emit($event)"
5455
*ngIf="(currentMode$ | async) === viewModeEnum.DetailedListElement">
5556
</ds-object-detail>
5657

src/app/shared/object-collection/object-collection.component.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,11 @@ export class ObjectCollectionComponent implements OnInit {
5050
@Input() hideGear = false;
5151
@Input() selectable = false;
5252
@Input() selectionConfig: {repeatable: boolean, listId: string};
53+
54+
/**
55+
* Emit custom event for listable object custom actions.
56+
*/
57+
@Output() customEvent = new EventEmitter<any>();
5358
@Output() deselectObject: EventEmitter<ListableObject> = new EventEmitter<ListableObject>();
5459
@Output() selectObject: EventEmitter<ListableObject> = new EventEmitter<ListableObject>();
5560

@@ -132,11 +137,6 @@ export class ObjectCollectionComponent implements OnInit {
132137
*/
133138
@Output() sortFieldChange: EventEmitter<string> = new EventEmitter<string>();
134139

135-
/**
136-
* Emit custom event for listable object custom actions.
137-
*/
138-
@Output() customEvent = new EventEmitter<any>();
139-
140140
/**
141141
* If showPaginator is set to true, emit when the previous button is clicked
142142
*/

src/app/shared/object-collection/shared/listable-object/listable-object-component-loader.component.spec.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,9 @@ import { ListableObject } from '../listable-object.model';
55
import { GenericConstructor } from '../../../../core/shared/generic-constructor';
66
import { Context } from '../../../../core/shared/context.model';
77
import { ViewMode } from '../../../../core/shared/view-mode.model';
8-
import { ItemListElementComponent } from '../../../object-list/item-list-element/item-types/item/item-list-element.component';
8+
import {
9+
ItemListElementComponent
10+
} from '../../../object-list/item-list-element/item-types/item/item-list-element.component';
911
import { ListableObjectDirective } from './listable-object.directive';
1012
import { TranslateModule } from '@ngx-translate/core';
1113
import { By } from '@angular/platform-browser';
@@ -146,7 +148,7 @@ describe('ListableObjectComponentLoaderComponent', () => {
146148
expect((comp as any).instantiateComponent).not.toHaveBeenCalled();
147149

148150
(listableComponent as any).reloadedObject.emit(reloadedObject);
149-
tick();
151+
tick(200);
150152

151153
expect((comp as any).instantiateComponent).toHaveBeenCalledWith(reloadedObject);
152154
}));
@@ -155,7 +157,7 @@ describe('ListableObjectComponentLoaderComponent', () => {
155157
expect((comp as any).contentChange.emit).not.toHaveBeenCalled();
156158

157159
(listableComponent as any).reloadedObject.emit(reloadedObject);
158-
tick();
160+
tick(200);
159161

160162
expect((comp as any).contentChange.emit).toHaveBeenCalledWith(reloadedObject);
161163
}));

src/app/shared/object-collection/shared/listable-object/listable-object-component-loader.component.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -197,7 +197,10 @@ export class ListableObjectComponentLoaderComponent implements OnInit, OnChanges
197197
this.compRef.destroy();
198198
this.object = reloadedObject;
199199
this.instantiateComponent(reloadedObject);
200-
this.contentChange.emit(reloadedObject);
200+
// Add delay before emitting event to allow the new object is instantiated
201+
setTimeout(() => {
202+
this.contentChange.emit(reloadedObject);
203+
}, 100);
201204
}
202205
});
203206
}

src/app/shared/object-detail/object-detail.component.html

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,14 @@
1414
(sortFieldChange)="onSortFieldChange($event)"
1515
(paginationChange)="onPaginationChange($event)"
1616
(prev)="goPrev()"
17-
(next)="goNext()"
18-
>
17+
(next)="goNext()">
1918
<div class="row mt-2" *ngIf="objects?.hasSucceeded" @fadeIn>
2019
<div class="col"
2120
*ngFor="let object of objects?.payload?.page">
22-
<ds-listable-object-component-loader [object]="object" [viewMode]="viewMode" [context]="context"></ds-listable-object-component-loader>
21+
<ds-listable-object-component-loader [object]="object"
22+
[viewMode]="viewMode"
23+
[context]="context"
24+
(contentChange)="contentChange.emit($event)"></ds-listable-object-component-loader>
2325
</div>
2426
</div>
2527
<ds-error *ngIf="objects.hasFailed" message="{{'error.objects' | translate}}"></ds-error>

src/app/shared/object-detail/object-detail.component.ts

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,4 @@
1-
import {
2-
ChangeDetectionStrategy,
3-
Component,
4-
EventEmitter,
5-
Input,
6-
Output,
7-
ViewEncapsulation
8-
} from '@angular/core';
1+
import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output, ViewEncapsulation } from '@angular/core';
92

103
import { SortDirection, SortOptions } from '../../core/cache/models/sort-options.model';
114
import { PaginatedList } from '../../core/data/paginated-list.model';
@@ -71,6 +64,11 @@ export class ObjectDetailComponent {
7164
*/
7265
@Input() showPaginator = true;
7366

67+
/**
68+
* Emit when one of the listed object has changed.
69+
*/
70+
@Output() contentChange = new EventEmitter<any>();
71+
7472
/**
7573
* If showPaginator is set to true, emit when the previous button is clicked
7674
*/

src/app/shared/object-list/my-dspace-result-list-element/claimed-search-result/claimed-search-result-list-element.component.spec.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import { getMockLinkService } from '../../../mocks/link-service.mock';
1818
import { By } from '@angular/platform-browser';
1919
import { DSONameService } from '../../../../core/breadcrumbs/dso-name.service';
2020
import { DSONameServiceMock } from '../../../mocks/dso-name.service.mock';
21+
import { ObjectCacheService } from '../../../../core/cache/object-cache.service';
2122

2223
let component: ClaimedSearchResultListElementComponent;
2324
let fixture: ComponentFixture<ClaimedSearchResultListElementComponent>;
@@ -59,6 +60,9 @@ const workflowitem = Object.assign(new WorkflowItem(), { item: observableOf(rdIt
5960
const rdWorkflowitem = createSuccessfulRemoteDataObject(workflowitem);
6061
mockResultObject.indexableObject = Object.assign(new ClaimedTask(), { workflowitem: observableOf(rdWorkflowitem) });
6162
const linkService = getMockLinkService();
63+
const objectCacheServiceMock = jasmine.createSpyObj('ObjectCacheService', {
64+
remove: jasmine.createSpy('remove')
65+
});
6266

6367
describe('ClaimedSearchResultListElementComponent', () => {
6468
beforeEach(waitForAsync(() => {
@@ -68,7 +72,8 @@ describe('ClaimedSearchResultListElementComponent', () => {
6872
providers: [
6973
{ provide: TruncatableService, useValue: {} },
7074
{ provide: LinkService, useValue: linkService },
71-
{ provide: DSONameService, useClass: DSONameServiceMock }
75+
{ provide: DSONameService, useClass: DSONameServiceMock },
76+
{ provide: ObjectCacheService, useValue: objectCacheServiceMock }
7277
],
7378
schemas: [NO_ERRORS_SCHEMA]
7479
}).overrideComponent(ClaimedSearchResultListElementComponent, {

src/app/shared/object-list/my-dspace-result-list-element/claimed-search-result/claimed-search-result-list-element.component.ts

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { Component } from '@angular/core';
1+
import { Component, OnDestroy, OnInit } from '@angular/core';
22

33
import { ViewMode } from '../../../../core/shared/view-mode.model';
44
import { listableObjectComponent } from '../../../object-collection/shared/listable-object/listable-object.decorator';
@@ -13,14 +13,15 @@ import { followLink } from '../../../utils/follow-link-config.model';
1313
import { SearchResultListElementComponent } from '../../search-result-list-element/search-result-list-element.component';
1414
import { ClaimedTask } from '../../../../core/tasks/models/claimed-task-object.model';
1515
import { DSONameService } from '../../../../core/breadcrumbs/dso-name.service';
16+
import { ObjectCacheService } from '../../../../core/cache/object-cache.service';
1617

1718
@Component({
1819
selector: 'ds-claimed-search-result-list-element',
1920
styleUrls: ['../../search-result-list-element/search-result-list-element.component.scss'],
2021
templateUrl: './claimed-search-result-list-element.component.html'
2122
})
2223
@listableObjectComponent(ClaimedTaskSearchResult, ViewMode.ListElement)
23-
export class ClaimedSearchResultListElementComponent extends SearchResultListElementComponent<ClaimedTaskSearchResult, ClaimedTask> {
24+
export class ClaimedSearchResultListElementComponent extends SearchResultListElementComponent<ClaimedTaskSearchResult, ClaimedTask> implements OnInit, OnDestroy {
2425

2526
/**
2627
* A boolean representing if to show submitter information
@@ -40,7 +41,8 @@ export class ClaimedSearchResultListElementComponent extends SearchResultListEle
4041
public constructor(
4142
protected linkService: LinkService,
4243
protected truncatableService: TruncatableService,
43-
protected dsoNameService: DSONameService
44+
protected dsoNameService: DSONameService,
45+
protected objectCache: ObjectCacheService
4446
) {
4547
super(truncatableService, dsoNameService);
4648
}
@@ -56,4 +58,9 @@ export class ClaimedSearchResultListElementComponent extends SearchResultListEle
5658
this.workflowitemRD$ = this.dso.workflowitem as Observable<RemoteData<WorkflowItem>>;
5759
}
5860

61+
ngOnDestroy() {
62+
// This ensures the object is removed from cache, when action is performed on task
63+
this.objectCache.remove(this.dso._links.workflowitem.href);
64+
}
65+
5966
}

0 commit comments

Comments
 (0)