Skip to content

Commit 340cca1

Browse files
aliaksei.bykauatarix83
authored andcommitted
Merged in DSC-CST-12624 (pull request DSpace#1061)
[CST-12624] updated the logic of the suggestion-targets feature. Approved-by: Giuseppe Digilio
2 parents 85a295e + de56ad4 commit 340cca1

File tree

10 files changed

+197
-104
lines changed

10 files changed

+197
-104
lines changed

src/app/openaire/openaire.module.ts

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,8 @@ const MODULES = [
5151
CoreModule.forRoot(),
5252
StoreModule.forFeature('openaire', openaireReducers, storeModuleConfig as StoreConfig<OpenaireState, Action>),
5353
EffectsModule.forFeature(openaireEffects),
54-
TranslateModule
54+
TranslateModule,
55+
SearchModule
5556
];
5657

5758
const COMPONENTS = [
@@ -86,7 +87,6 @@ const PROVIDERS = [
8687
@NgModule({
8788
imports: [
8889
...MODULES,
89-
SearchModule
9090
],
9191
declarations: [
9292
...COMPONENTS,
@@ -96,9 +96,6 @@ const PROVIDERS = [
9696
providers: [
9797
...PROVIDERS
9898
],
99-
entryComponents: [
100-
...ENTRY_COMPONENTS
101-
],
10299
exports: [
103100
...COMPONENTS,
104101
...DIRECTIVES
Lines changed: 42 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,10 @@
1-
import { createFeatureSelector, createSelector, MemoizedSelector } from '@ngrx/store';
1+
import { createSelector, MemoizedSelector } from '@ngrx/store';
22
import { subStateSelector } from '../../shared/selector.util';
33
import { openaireSelector, OpenaireState } from '../openaire.reducer';
4-
import { OpenaireSuggestionTarget } from '../../core/openaire/reciter-suggestions/models/openaire-suggestion-target.model';
5-
import { SuggestionTargetState } from './suggestion-targets/suggestion-targets.reducer';
6-
7-
/**
8-
* Returns the Reciter Suggestion Target state.
9-
* @function _getReciterSuggestionTargetState
10-
* @param {AppState} state Top level state.
11-
* @return {OpenaireState}
12-
*/
13-
const _getReciterSuggestionTargetState = createFeatureSelector<OpenaireState>('openaire');
4+
import {
5+
OpenaireSuggestionTarget
6+
} from '../../core/openaire/reciter-suggestions/models/openaire-suggestion-target.model';
7+
import { SuggestionTargetEntry, SuggestionTargetState } from './suggestion-targets/suggestion-targets.reducer';
148

159
// Reciter Suggestion Targets
1610
// ----------------------------------------------------------------------------
@@ -25,73 +19,82 @@ export function reciterSuggestionTargetStateSelector(): MemoizedSelector<Openair
2519
}
2620

2721
/**
28-
* Returns the Reciter Suggestion Targets list.
22+
* Returns the Reciter Suggestion source state
23+
* @function reciterSuggestionTargetObjectSelector
24+
* @return {SuggestionTargetEntry}
25+
*/
26+
export function reciterSuggestionSourceSelector(source: string): MemoizedSelector<OpenaireState, SuggestionTargetEntry> {
27+
return createSelector(reciterSuggestionTargetStateSelector(),(state: SuggestionTargetState) => state.sources[source]);
28+
}
29+
30+
/**
31+
* Returns the Reciter Suggestion Targets list by source.
2932
* @function reciterSuggestionTargetObjectSelector
30-
* @return {OpenaireReciterSuggestionTarget[]}
33+
* @return {OpenaireSuggestionTarget[]}
3134
*/
32-
export function reciterSuggestionTargetObjectSelector(): MemoizedSelector<OpenaireState, OpenaireSuggestionTarget[]> {
33-
return subStateSelector<OpenaireState, OpenaireSuggestionTarget[]>(reciterSuggestionTargetStateSelector(), 'targets');
35+
export function reciterSuggestionTargetObjectSelector(source: string): MemoizedSelector<OpenaireState, OpenaireSuggestionTarget[]> {
36+
return createSelector(reciterSuggestionSourceSelector(source), (state: SuggestionTargetEntry) => state.targets);
3437
}
3538

3639
/**
3740
* Returns true if the Reciter Suggestion Targets are loaded.
3841
* @function isReciterSuggestionTargetLoadedSelector
3942
* @return {boolean}
4043
*/
41-
export const isReciterSuggestionTargetLoadedSelector = createSelector(_getReciterSuggestionTargetState,
42-
(state: OpenaireState) => state.suggestionTarget.loaded
43-
);
44+
export const isReciterSuggestionTargetLoadedSelector = (source: string) => {
45+
return createSelector(reciterSuggestionSourceSelector(source), (state: SuggestionTargetEntry) => state?.loaded || false);
46+
};
4447

4548
/**
4649
* Returns true if the deduplication sets are processing.
4750
* @function isDeduplicationSetsProcessingSelector
4851
* @return {boolean}
4952
*/
50-
export const isreciterSuggestionTargetProcessingSelector = createSelector(_getReciterSuggestionTargetState,
51-
(state: OpenaireState) => state.suggestionTarget.processing
52-
);
53+
export const isreciterSuggestionTargetProcessingSelector = (source: string) => {
54+
return createSelector(reciterSuggestionSourceSelector(source), (state: SuggestionTargetEntry) => state?.processing || false);
55+
};
5356

5457
/**
5558
* Returns the total available pages of Reciter Suggestion Targets.
5659
* @function getreciterSuggestionTargetTotalPagesSelector
5760
* @return {number}
5861
*/
59-
export const getreciterSuggestionTargetTotalPagesSelector = createSelector(_getReciterSuggestionTargetState,
60-
(state: OpenaireState) => state.suggestionTarget.totalPages
61-
);
62+
export const getReciterSuggestionTargetTotalPagesSelector = (source: string) => {
63+
return createSelector(reciterSuggestionSourceSelector(source), (state: SuggestionTargetEntry) => state?.totalPages || 0);
64+
};
6265

6366
/**
6467
* Returns the current page of Reciter Suggestion Targets.
65-
* @function getreciterSuggestionTargetCurrentPageSelector
68+
* @function getReciterSuggestionTargetCurrentPageSelector
6669
* @return {number}
6770
*/
68-
export const getreciterSuggestionTargetCurrentPageSelector = createSelector(_getReciterSuggestionTargetState,
69-
(state: OpenaireState) => state.suggestionTarget.currentPage
70-
);
71+
export const getReciterSuggestionTargetCurrentPageSelector = (source: string) => {
72+
return createSelector(reciterSuggestionSourceSelector(source), (state: SuggestionTargetEntry) => state?.currentPage || 0);
73+
};
7174

7275
/**
7376
* Returns the total number of Reciter Suggestion Targets.
74-
* @function getreciterSuggestionTargetTotalsSelector
77+
* @function getReciterSuggestionTargetTotalsSelector
7578
* @return {number}
7679
*/
77-
export const getreciterSuggestionTargetTotalsSelector = createSelector(_getReciterSuggestionTargetState,
78-
(state: OpenaireState) => state.suggestionTarget.totalElements
79-
);
80+
export const getReciterSuggestionTargetTotalsSelector = (source: string) => {
81+
return createSelector(reciterSuggestionSourceSelector(source), (state: SuggestionTargetEntry) => state?.totalElements || 0);
82+
};
8083

8184
/**
8285
* Returns Suggestion Targets for the current user.
8386
* @function getCurrentUserReciterSuggestionTargetSelector
8487
* @return {OpenaireSuggestionTarget[]}
8588
*/
86-
export const getCurrentUserSuggestionTargetsSelector = createSelector(_getReciterSuggestionTargetState,
87-
(state: OpenaireState) => state.suggestionTarget.currentUserTargets
88-
);
89+
export const getCurrentUserSuggestionTargetsSelector = () => {
90+
return createSelector(reciterSuggestionTargetStateSelector(), (state: SuggestionTargetState) => state?.currentUserTargets || []);
91+
};
8992

9093
/**
91-
* Returns whether or not the user has consulted their suggestions
94+
* Returns whether the user has consulted their suggestions
9295
* @function getCurrentUserReciterSuggestionTargetSelector
9396
* @return {boolean}
9497
*/
95-
export const getCurrentUserSuggestionTargetsVisitedSelector = createSelector(_getReciterSuggestionTargetState,
96-
(state: OpenaireState) => state.suggestionTarget.currentUserTargetsVisited
97-
);
98+
export const getCurrentUserSuggestionTargetsVisitedSelector = () => {
99+
return createSelector(reciterSuggestionTargetStateSelector(), (state: SuggestionTargetState) => state?.currentUserTargetsVisited || false);
100+
};

src/app/openaire/reciter-suggestions/suggestion-targets/suggestion-targets.actions.ts

Lines changed: 48 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,12 @@
22

33
import { Action } from '@ngrx/store';
44
import { type } from '../../../shared/ngrx/type';
5-
import { OpenaireSuggestionTarget } from '../../../core/openaire/reciter-suggestions/models/openaire-suggestion-target.model';
5+
import {
6+
OpenaireSuggestionTarget
7+
} from '../../../core/openaire/reciter-suggestions/models/openaire-suggestion-target.model';
68

79
/**
8-
* For each action type in an action group, make a simple
10+
* For each action type in A action group, make a simple
911
* enum object for all of this group's action types.
1012
*
1113
* The 'type' utility function coerces strings into string
@@ -23,7 +25,7 @@ export const SuggestionTargetActionTypes = {
2325
};
2426

2527
/**
26-
* An ngrx action to retrieve all the Suggestion Targets.
28+
* A ngrx action to retrieve all the Suggestion Targets.
2729
*/
2830
export class RetrieveTargetsBySourceAction implements Action {
2931
type = SuggestionTargetActionTypes.RETRIEVE_TARGETS_BY_SOURCE;
@@ -53,18 +55,34 @@ export class RetrieveTargetsBySourceAction implements Action {
5355
}
5456

5557
/**
56-
* An ngrx action for retrieving 'all Suggestion Targets' error.
58+
* A ngrx action for notifying error.
5759
*/
58-
export class RetrieveAllTargetsErrorAction implements Action {
60+
export class RetrieveTargetsBySourceErrorAction implements Action {
5961
type = SuggestionTargetActionTypes.RETRIEVE_TARGETS_BY_SOURCE_ERROR;
62+
payload: {
63+
source: string;
64+
};
65+
66+
/**
67+
* Create a new RetrieveTargetsBySourceAction.
68+
*
69+
* @param source
70+
* the source for which to retrieve suggestion targets
71+
*/
72+
constructor(source: string) {
73+
this.payload = {
74+
source
75+
};
76+
}
6077
}
6178

6279
/**
63-
* An ngrx action to load the Suggestion Target objects.
80+
* A ngrx action to load the Suggestion Target objects.
6481
*/
6582
export class AddTargetAction implements Action {
6683
type = SuggestionTargetActionTypes.ADD_TARGETS;
6784
payload: {
85+
source: string;
6886
targets: OpenaireSuggestionTarget[];
6987
totalPages: number;
7088
currentPage: number;
@@ -74,6 +92,8 @@ export class AddTargetAction implements Action {
7492
/**
7593
* Create a new AddTargetAction.
7694
*
95+
* @param source
96+
* the source of suggestion targets
7797
* @param targets
7898
* the list of targets
7999
* @param totalPages
@@ -83,8 +103,9 @@ export class AddTargetAction implements Action {
83103
* @param totalElements
84104
* the total available Suggestion Targets
85105
*/
86-
constructor(targets: OpenaireSuggestionTarget[], totalPages: number, currentPage: number, totalElements: number) {
106+
constructor(source: string, targets: OpenaireSuggestionTarget[], totalPages: number, currentPage: number, totalElements: number) {
87107
this.payload = {
108+
source,
88109
targets,
89110
totalPages,
90111
currentPage,
@@ -95,7 +116,7 @@ export class AddTargetAction implements Action {
95116
}
96117

97118
/**
98-
* An ngrx action to load the user Suggestion Target object.
119+
* A ngrx action to load the user Suggestion Target object.
99120
* Called by the ??? effect.
100121
*/
101122
export class AddUserSuggestionsAction implements Action {
@@ -117,26 +138,41 @@ export class AddUserSuggestionsAction implements Action {
117138
}
118139

119140
/**
120-
* An ngrx action to reload the user Suggestion Target object.
141+
* A ngrx action to reload the user Suggestion Target object.
121142
* Called by the ??? effect.
122143
*/
123144
export class RefreshUserSuggestionsAction implements Action {
124145
type = SuggestionTargetActionTypes.REFRESH_USER_SUGGESTIONS;
125146
}
126147

127148
/**
128-
* An ngrx action to Mark User Suggestions As Visited.
149+
* A ngrx action to Mark User Suggestions As Visited.
129150
* Called by the ??? effect.
130151
*/
131152
export class MarkUserSuggestionsAsVisitedAction implements Action {
132153
type = SuggestionTargetActionTypes.MARK_USER_SUGGESTIONS_AS_VISITED;
133154
}
134155

135156
/**
136-
* An ngrx action to clear targets state.
157+
* A ngrx action to clear targets state.
137158
*/
138159
export class ClearSuggestionTargetsAction implements Action {
139160
type = SuggestionTargetActionTypes.CLEAR_TARGETS;
161+
payload: {
162+
source: string;
163+
};
164+
165+
/**
166+
* Create a new ClearSuggestionTargetsAction.
167+
*
168+
* @param source
169+
* the source of suggestion targets
170+
*/
171+
constructor(source: string) {
172+
this.payload = {
173+
source
174+
};
175+
}
140176
}
141177

142178
/**
@@ -149,4 +185,4 @@ export type SuggestionTargetsActions
149185
| ClearSuggestionTargetsAction
150186
| MarkUserSuggestionsAsVisitedAction
151187
| RetrieveTargetsBySourceAction
152-
| RetrieveAllTargetsErrorAction;
188+
| RetrieveTargetsBySourceErrorAction;

src/app/openaire/reciter-suggestions/suggestion-targets/suggestion-targets.component.html

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@
33
<div class="col-12">
44
<h3 id="header" class="border-bottom pb-2">{{'reciter.suggestion.title'| translate}}</h3>
55

6-
<ds-loading class="container" *ngIf="(isTargetsLoading() | async)" message="{{'reciter.suggestion.loading' | translate}}"></ds-loading>
7-
<ds-pagination *ngIf="!(isTargetsLoading() | async)"
6+
<ds-loading class="container" *ngIf="(isTargetsLoading(source) | async)" message="{{'reciter.suggestion.loading' | translate}}"></ds-loading>
7+
<ds-pagination *ngIf="!(isTargetsLoading(source) | async)"
88
[paginationOptions]="paginationConfig"
99
[collectionSize]="(totalElements$ | async)"
1010
[hideGear]="false"

src/app/openaire/reciter-suggestions/suggestion-targets/suggestion-targets.component.ts

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
1-
import { Component, Input, OnInit } from '@angular/core';
1+
import { AfterViewInit, Component, Input, OnDestroy, OnInit } from '@angular/core';
22
import { Router } from '@angular/router';
33

44
import { Observable, Subscription } from 'rxjs';
55
import { distinctUntilChanged, take } from 'rxjs/operators';
66

7-
import { OpenaireSuggestionTarget } from '../../../core/openaire/reciter-suggestions/models/openaire-suggestion-target.model';
7+
import {
8+
OpenaireSuggestionTarget
9+
} from '../../../core/openaire/reciter-suggestions/models/openaire-suggestion-target.model';
810
import { hasValue } from '../../../shared/empty.util';
911
import { PaginationComponentOptions } from '../../../shared/pagination/pagination-component-options.model';
1012
import { SuggestionTargetsStateService } from './suggestion-targets.state.service';
@@ -21,7 +23,7 @@ import { UUIDService } from '../../../core/shared/uuid.service';
2123
templateUrl: './suggestion-targets.component.html',
2224
styleUrls: ['./suggestion-targets.component.scss'],
2325
})
24-
export class SuggestionTargetsComponent implements OnInit {
26+
export class SuggestionTargetsComponent implements AfterViewInit, OnInit, OnDestroy {
2527

2628
/**
2729
* The source for which to list targets
@@ -72,16 +74,16 @@ export class SuggestionTargetsComponent implements OnInit {
7274
* Component initialization.
7375
*/
7476
ngOnInit(): void {
75-
this.targets$ = this.suggestionTargetsStateService.getReciterSuggestionTargets();
76-
this.totalElements$ = this.suggestionTargetsStateService.getReciterSuggestionTargetsTotals();
77+
this.targets$ = this.suggestionTargetsStateService.getReciterSuggestionTargets(this.source);
78+
this.totalElements$ = this.suggestionTargetsStateService.getReciterSuggestionTargetsTotals(this.source);
7779
}
7880

7981
/**
8082
* First Suggestion Targets loading after view initialization.
8183
*/
8284
ngAfterViewInit(): void {
8385
this.subs.push(
84-
this.suggestionTargetsStateService.isReciterSuggestionTargetsLoaded().pipe(
86+
this.suggestionTargetsStateService.isReciterSuggestionTargetsLoaded(this.source).pipe(
8587
take(1)
8688
).subscribe(() => {
8789
this.getSuggestionTargets();
@@ -95,8 +97,8 @@ export class SuggestionTargetsComponent implements OnInit {
9597
* @return Observable<boolean>
9698
* 'true' if the targets are loading, 'false' otherwise.
9799
*/
98-
public isTargetsLoading(): Observable<boolean> {
99-
return this.suggestionTargetsStateService.isReciterSuggestionTargetsLoading();
100+
public isTargetsLoading(source: string): Observable<boolean> {
101+
return this.suggestionTargetsStateService.isReciterSuggestionTargetsLoading(source);
100102
}
101103

102104
/**
@@ -106,7 +108,7 @@ export class SuggestionTargetsComponent implements OnInit {
106108
* 'true' if there are operations running on the targets (ex.: a REST call), 'false' otherwise.
107109
*/
108110
public isTargetsProcessing(): Observable<boolean> {
109-
return this.suggestionTargetsStateService.isReciterSuggestionTargetsProcessing();
111+
return this.suggestionTargetsStateService.isReciterSuggestionTargetsProcessing(this.source);
110112
}
111113

112114
/**
@@ -125,7 +127,7 @@ export class SuggestionTargetsComponent implements OnInit {
125127
* Unsubscribe from all subscriptions.
126128
*/
127129
ngOnDestroy(): void {
128-
this.suggestionTargetsStateService.dispatchClearSuggestionTargetsAction();
130+
this.suggestionTargetsStateService.dispatchClearSuggestionTargetsAction(this.source);
129131
this.subs
130132
.filter((sub) => hasValue(sub))
131133
.forEach((sub) => sub.unsubscribe());

0 commit comments

Comments
 (0)