Skip to content

Commit 8f29dcd

Browse files
author
aliaksei.bykau
committed
[CST-12624] updated the logic of the suggestion-targets feature.
1 parent ca43885 commit 8f29dcd

5 files changed

Lines changed: 156 additions & 82 deletions

File tree

Lines changed: 42 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
1-
import { createFeatureSelector, createSelector, MemoizedSelector } from '@ngrx/store';
2-
import { subStateSelector } from '../../shared/selector.util';
3-
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';
1+
import {createFeatureSelector, createSelector, MemoizedSelector} from '@ngrx/store';
2+
import {subStateSelector} from '../../shared/selector.util';
3+
import {openaireSelector, OpenaireState} from '../openaire.reducer';
4+
import {
5+
OpenaireSuggestionTarget
6+
} from '../../core/openaire/reciter-suggestions/models/openaire-suggestion-target.model';
7+
import {SuggestionTargetState} from './suggestion-targets/suggestion-targets.reducer';
68

79
/**
810
* Returns the Reciter Suggestion Target state.
@@ -29,62 +31,74 @@ export function reciterSuggestionTargetStateSelector(): MemoizedSelector<Openair
2931
* @function reciterSuggestionTargetObjectSelector
3032
* @return {OpenaireReciterSuggestionTarget[]}
3133
*/
32-
export function reciterSuggestionTargetObjectSelector(): MemoizedSelector<OpenaireState, OpenaireSuggestionTarget[]> {
33-
return subStateSelector<OpenaireState, OpenaireSuggestionTarget[]>(reciterSuggestionTargetStateSelector(), 'targets');
34+
export function reciterSuggestionTargetObjectSelector(source: string): MemoizedSelector<OpenaireState, OpenaireSuggestionTarget[]> {
35+
return createSelector(reciterSuggestionTargetStateSelector(),
36+
(state: SuggestionTargetState) => state[source]?.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(_getReciterSuggestionTargetState, (state: OpenaireState) => {
46+
const loaded = state.suggestionTarget[source]?.loaded;
47+
return loaded || false;
48+
});
49+
};
4450

4551
/**
4652
* Returns true if the deduplication sets are processing.
4753
* @function isDeduplicationSetsProcessingSelector
4854
* @return {boolean}
4955
*/
50-
export const isreciterSuggestionTargetProcessingSelector = createSelector(_getReciterSuggestionTargetState,
51-
(state: OpenaireState) => state.suggestionTarget.processing
52-
);
56+
export const isreciterSuggestionTargetProcessingSelector = (source: string) => {
57+
return createSelector(_getReciterSuggestionTargetState, (state: OpenaireState) => {
58+
const processing = state.suggestionTarget[source]?.processing;
59+
return processing || false;
60+
});
61+
};
5362

5463
/**
5564
* Returns the total available pages of Reciter Suggestion Targets.
5665
* @function getreciterSuggestionTargetTotalPagesSelector
5766
* @return {number}
5867
*/
59-
export const getreciterSuggestionTargetTotalPagesSelector = createSelector(_getReciterSuggestionTargetState,
60-
(state: OpenaireState) => state.suggestionTarget.totalPages
61-
);
68+
export const getreciterSuggestionTargetTotalPagesSelector = (source: string) => {
69+
return createSelector(_getReciterSuggestionTargetState, (state: OpenaireState) => state.suggestionTarget[source]?.totalPages);
70+
};
6271

6372
/**
6473
* Returns the current page of Reciter Suggestion Targets.
6574
* @function getreciterSuggestionTargetCurrentPageSelector
6675
* @return {number}
6776
*/
68-
export const getreciterSuggestionTargetCurrentPageSelector = createSelector(_getReciterSuggestionTargetState,
69-
(state: OpenaireState) => state.suggestionTarget.currentPage
70-
);
77+
export const getreciterSuggestionTargetCurrentPageSelector = (source: string) => {
78+
return createSelector(_getReciterSuggestionTargetState, (state: OpenaireState) => state.suggestionTarget[source]?.currentPage);
79+
};
7180

7281
/**
7382
* Returns the total number of Reciter Suggestion Targets.
7483
* @function getreciterSuggestionTargetTotalsSelector
7584
* @return {number}
7685
*/
77-
export const getreciterSuggestionTargetTotalsSelector = createSelector(_getReciterSuggestionTargetState,
78-
(state: OpenaireState) => state.suggestionTarget.totalElements
79-
);
86+
export const getreciterSuggestionTargetTotalsSelector = (source: string) => {
87+
return createSelector(_getReciterSuggestionTargetState, (state: OpenaireState) => state.suggestionTarget[source]?.totalElements);
88+
};
8089

8190
/**
8291
* Returns Suggestion Targets for the current user.
8392
* @function getCurrentUserReciterSuggestionTargetSelector
8493
* @return {OpenaireSuggestionTarget[]}
8594
*/
8695
export const getCurrentUserSuggestionTargetsSelector = createSelector(_getReciterSuggestionTargetState,
87-
(state: OpenaireState) => state.suggestionTarget.currentUserTargets
96+
(state: OpenaireState) => {
97+
const suggestionTargetValues = Object.values(state.suggestionTarget);
98+
return suggestionTargetValues.reduce(
99+
(acc, entry) => acc.concat(entry?.currentUserTargets || []),
100+
[]);
101+
}
88102
);
89103

90104
/**
@@ -93,5 +107,9 @@ export const getCurrentUserSuggestionTargetsSelector = createSelector(_getRecite
93107
* @return {boolean}
94108
*/
95109
export const getCurrentUserSuggestionTargetsVisitedSelector = createSelector(_getReciterSuggestionTargetState,
96-
(state: OpenaireState) => state.suggestionTarget.currentUserTargetsVisited
110+
(state: OpenaireState) => {
111+
const suggestionTargetValues = Object.values(state.suggestionTarget);
112+
return suggestionTargetValues.some(
113+
(entry) => entry?.currentUserTargetsVisited === true);
114+
}
97115
);

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: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -72,16 +72,16 @@ export class SuggestionTargetsComponent implements OnInit {
7272
* Component initialization.
7373
*/
7474
ngOnInit(): void {
75-
this.targets$ = this.suggestionTargetsStateService.getReciterSuggestionTargets();
76-
this.totalElements$ = this.suggestionTargetsStateService.getReciterSuggestionTargetsTotals();
75+
this.targets$ = this.suggestionTargetsStateService.getReciterSuggestionTargets(this.source);
76+
this.totalElements$ = this.suggestionTargetsStateService.getReciterSuggestionTargetsTotals(this.source);
7777
}
7878

7979
/**
8080
* First Suggestion Targets loading after view initialization.
8181
*/
8282
ngAfterViewInit(): void {
8383
this.subs.push(
84-
this.suggestionTargetsStateService.isReciterSuggestionTargetsLoaded().pipe(
84+
this.suggestionTargetsStateService.isReciterSuggestionTargetsLoaded(this.source).pipe(
8585
take(1)
8686
).subscribe(() => {
8787
this.getSuggestionTargets();
@@ -95,8 +95,8 @@ export class SuggestionTargetsComponent implements OnInit {
9595
* @return Observable<boolean>
9696
* 'true' if the targets are loading, 'false' otherwise.
9797
*/
98-
public isTargetsLoading(): Observable<boolean> {
99-
return this.suggestionTargetsStateService.isReciterSuggestionTargetsLoading();
98+
public isTargetsLoading(source: string): Observable<boolean> {
99+
return this.suggestionTargetsStateService.isReciterSuggestionTargetsLoading(source);
100100
}
101101

102102
/**
@@ -106,7 +106,7 @@ export class SuggestionTargetsComponent implements OnInit {
106106
* 'true' if there are operations running on the targets (ex.: a REST call), 'false' otherwise.
107107
*/
108108
public isTargetsProcessing(): Observable<boolean> {
109-
return this.suggestionTargetsStateService.isReciterSuggestionTargetsProcessing();
109+
return this.suggestionTargetsStateService.isReciterSuggestionTargetsProcessing(this.source);
110110
}
111111

112112
/**

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

Lines changed: 92 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import { OpenaireSuggestionTarget } from '../../../core/openaire/reciter-suggest
44
/**
55
* The interface representing the OpenAIRE suggestion targets state.
66
*/
7-
export interface SuggestionTargetState {
7+
export interface SuggestionTargetEntry {
88
targets: OpenaireSuggestionTarget[];
99
processing: boolean;
1010
loaded: boolean;
@@ -15,10 +15,14 @@ export interface SuggestionTargetState {
1515
currentUserTargetsVisited: boolean;
1616
}
1717

18+
export interface SuggestionTargetState {
19+
[source: string]: SuggestionTargetEntry;
20+
}
21+
1822
/**
1923
* Used for the OpenAIRE Suggestion Target state initialization.
2024
*/
21-
const SuggestionTargetInitialState: SuggestionTargetState = {
25+
const SuggestionTargetInitialEntity: SuggestionTargetEntry = {
2226
targets: [],
2327
processing: false,
2428
loaded: false,
@@ -29,6 +33,10 @@ const SuggestionTargetInitialState: SuggestionTargetState = {
2933
currentUserTargetsVisited: false
3034
};
3135

36+
const SuggestionTargetInitialState: SuggestionTargetState = {
37+
'oaire' : SuggestionTargetInitialEntity
38+
};
39+
3240
/**
3341
* The OpenAIRE Broker Topic Reducer
3442
*
@@ -42,55 +50,103 @@ const SuggestionTargetInitialState: SuggestionTargetState = {
4250
export function SuggestionTargetsReducer(state = SuggestionTargetInitialState, action: SuggestionTargetsActions): SuggestionTargetState {
4351
switch (action.type) {
4452
case SuggestionTargetActionTypes.RETRIEVE_TARGETS_BY_SOURCE: {
45-
return Object.assign({}, state, {
46-
targets: [],
47-
processing: true
48-
});
53+
const updatedSuggestion = {};
54+
55+
for (const key in state) {
56+
if (state.hasOwnProperty(key)) {
57+
if (key === action.payload.source) {
58+
updatedSuggestion[key] = {
59+
targets: [],
60+
processing: true
61+
};
62+
} else {
63+
updatedSuggestion[key] = state[key];
64+
}
65+
}
66+
}
67+
return Object.assign({}, state, updatedSuggestion);
4968
}
5069

5170
case SuggestionTargetActionTypes.ADD_TARGETS: {
52-
return Object.assign({}, state, {
53-
targets: state.targets.concat(action.payload.targets),
54-
processing: false,
55-
loaded: true,
56-
totalPages: action.payload.totalPages,
57-
currentPage: state.currentPage,
58-
totalElements: action.payload.totalElements
59-
});
71+
const updatedSuggestion = {};
72+
73+
for (const key in state) {
74+
if (state.hasOwnProperty(key)) {
75+
updatedSuggestion[key] = {
76+
targets: state[key].targets.concat(action.payload.targets
77+
.filter(target => target.source === key)),
78+
processing: false,
79+
loaded: true,
80+
totalPages: action.payload.totalPages,
81+
currentPage: state[key].currentPage,
82+
totalElements: action.payload.totalElements,
83+
};
84+
}
85+
}
86+
return Object.assign({}, state, updatedSuggestion);
6087
}
6188

6289
case SuggestionTargetActionTypes.RETRIEVE_TARGETS_BY_SOURCE_ERROR: {
63-
return Object.assign({}, state, {
64-
targets: [],
65-
processing: false,
66-
loaded: true,
67-
totalPages: 0,
68-
currentPage: 0,
69-
totalElements: 0,
70-
});
90+
const updatedSuggestion = {};
91+
92+
for (const key in state) {
93+
if (state.hasOwnProperty(key)) {
94+
updatedSuggestion[key] = {
95+
targets: [],
96+
processing: false,
97+
loaded: true,
98+
totalPages: 0,
99+
currentPage: 0,
100+
totalElements: 0,
101+
};
102+
}
103+
}
104+
return Object.assign({}, state, updatedSuggestion);
71105
}
72106

73107
case SuggestionTargetActionTypes.ADD_USER_SUGGESTIONS: {
74-
return Object.assign({}, state, {
75-
currentUserTargets: action.payload.suggestionTargets
76-
});
108+
const updatedSuggestion = {};
109+
110+
for (const key in state) {
111+
if (state.hasOwnProperty(key)) {
112+
updatedSuggestion[key] = {
113+
targets: state[key].targets.concat(action.payload.suggestionTargets
114+
.filter(target => target.source === key)),
115+
};
116+
}
117+
}
118+
return Object.assign({}, state, updatedSuggestion);
77119
}
78120

79121
case SuggestionTargetActionTypes.MARK_USER_SUGGESTIONS_AS_VISITED: {
80-
return Object.assign({}, state, {
81-
currentUserTargetsVisited: true
82-
});
122+
const updatedSuggestion = {};
123+
124+
for (const key in state) {
125+
if (state.hasOwnProperty(key)) {
126+
updatedSuggestion[key] = {
127+
currentUserTargetsVisited: true
128+
};
129+
}
130+
}
131+
return Object.assign({}, state, updatedSuggestion);
83132
}
84133

85134
case SuggestionTargetActionTypes.CLEAR_TARGETS: {
86-
return Object.assign({}, state, {
87-
targets: [],
88-
processing: false,
89-
loaded: false,
90-
totalPages: 0,
91-
currentPage: 0,
92-
totalElements: 0,
93-
});
135+
const updatedSuggestion = {};
136+
137+
for (const key in state) {
138+
if (state.hasOwnProperty(key)) {
139+
updatedSuggestion[key] = {
140+
targets: [],
141+
processing: false,
142+
loaded: false,
143+
totalPages: 0,
144+
currentPage: 0,
145+
totalElements: 0,
146+
};
147+
}
148+
}
149+
return Object.assign({}, state, updatedSuggestion);
94150
}
95151

96152
default: {

0 commit comments

Comments
 (0)