Skip to content

Commit

Permalink
Merged in DSC-CST-12624 (pull request DSpace#1061)
Browse files Browse the repository at this point in the history
[CST-12624] updated the logic of the suggestion-targets feature.

Approved-by: Giuseppe Digilio
  • Loading branch information
aliaksei.bykau authored and atarix83 committed Nov 29, 2023
2 parents 85a295e + de56ad4 commit 340cca1
Show file tree
Hide file tree
Showing 10 changed files with 197 additions and 104 deletions.
7 changes: 2 additions & 5 deletions src/app/openaire/openaire.module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,8 @@ const MODULES = [
CoreModule.forRoot(),
StoreModule.forFeature('openaire', openaireReducers, storeModuleConfig as StoreConfig<OpenaireState, Action>),
EffectsModule.forFeature(openaireEffects),
TranslateModule
TranslateModule,
SearchModule
];

const COMPONENTS = [
Expand Down Expand Up @@ -86,7 +87,6 @@ const PROVIDERS = [
@NgModule({
imports: [
...MODULES,
SearchModule
],
declarations: [
...COMPONENTS,
Expand All @@ -96,9 +96,6 @@ const PROVIDERS = [
providers: [
...PROVIDERS
],
entryComponents: [
...ENTRY_COMPONENTS
],
exports: [
...COMPONENTS,
...DIRECTIVES
Expand Down
81 changes: 42 additions & 39 deletions src/app/openaire/reciter-suggestions/selectors.ts
Original file line number Diff line number Diff line change
@@ -1,16 +1,10 @@
import { createFeatureSelector, createSelector, MemoizedSelector } from '@ngrx/store';
import { createSelector, MemoizedSelector } from '@ngrx/store';
import { subStateSelector } from '../../shared/selector.util';
import { openaireSelector, OpenaireState } from '../openaire.reducer';
import { OpenaireSuggestionTarget } from '../../core/openaire/reciter-suggestions/models/openaire-suggestion-target.model';
import { SuggestionTargetState } from './suggestion-targets/suggestion-targets.reducer';

/**
* Returns the Reciter Suggestion Target state.
* @function _getReciterSuggestionTargetState
* @param {AppState} state Top level state.
* @return {OpenaireState}
*/
const _getReciterSuggestionTargetState = createFeatureSelector<OpenaireState>('openaire');
import {
OpenaireSuggestionTarget
} from '../../core/openaire/reciter-suggestions/models/openaire-suggestion-target.model';
import { SuggestionTargetEntry, SuggestionTargetState } from './suggestion-targets/suggestion-targets.reducer';

// Reciter Suggestion Targets
// ----------------------------------------------------------------------------
Expand All @@ -25,73 +19,82 @@ export function reciterSuggestionTargetStateSelector(): MemoizedSelector<Openair
}

/**
* Returns the Reciter Suggestion Targets list.
* Returns the Reciter Suggestion source state
* @function reciterSuggestionTargetObjectSelector
* @return {SuggestionTargetEntry}
*/
export function reciterSuggestionSourceSelector(source: string): MemoizedSelector<OpenaireState, SuggestionTargetEntry> {
return createSelector(reciterSuggestionTargetStateSelector(),(state: SuggestionTargetState) => state.sources[source]);
}

/**
* Returns the Reciter Suggestion Targets list by source.
* @function reciterSuggestionTargetObjectSelector
* @return {OpenaireReciterSuggestionTarget[]}
* @return {OpenaireSuggestionTarget[]}
*/
export function reciterSuggestionTargetObjectSelector(): MemoizedSelector<OpenaireState, OpenaireSuggestionTarget[]> {
return subStateSelector<OpenaireState, OpenaireSuggestionTarget[]>(reciterSuggestionTargetStateSelector(), 'targets');
export function reciterSuggestionTargetObjectSelector(source: string): MemoizedSelector<OpenaireState, OpenaireSuggestionTarget[]> {
return createSelector(reciterSuggestionSourceSelector(source), (state: SuggestionTargetEntry) => state.targets);
}

/**
* Returns true if the Reciter Suggestion Targets are loaded.
* @function isReciterSuggestionTargetLoadedSelector
* @return {boolean}
*/
export const isReciterSuggestionTargetLoadedSelector = createSelector(_getReciterSuggestionTargetState,
(state: OpenaireState) => state.suggestionTarget.loaded
);
export const isReciterSuggestionTargetLoadedSelector = (source: string) => {
return createSelector(reciterSuggestionSourceSelector(source), (state: SuggestionTargetEntry) => state?.loaded || false);
};

/**
* Returns true if the deduplication sets are processing.
* @function isDeduplicationSetsProcessingSelector
* @return {boolean}
*/
export const isreciterSuggestionTargetProcessingSelector = createSelector(_getReciterSuggestionTargetState,
(state: OpenaireState) => state.suggestionTarget.processing
);
export const isreciterSuggestionTargetProcessingSelector = (source: string) => {
return createSelector(reciterSuggestionSourceSelector(source), (state: SuggestionTargetEntry) => state?.processing || false);
};

/**
* Returns the total available pages of Reciter Suggestion Targets.
* @function getreciterSuggestionTargetTotalPagesSelector
* @return {number}
*/
export const getreciterSuggestionTargetTotalPagesSelector = createSelector(_getReciterSuggestionTargetState,
(state: OpenaireState) => state.suggestionTarget.totalPages
);
export const getReciterSuggestionTargetTotalPagesSelector = (source: string) => {
return createSelector(reciterSuggestionSourceSelector(source), (state: SuggestionTargetEntry) => state?.totalPages || 0);
};

/**
* Returns the current page of Reciter Suggestion Targets.
* @function getreciterSuggestionTargetCurrentPageSelector
* @function getReciterSuggestionTargetCurrentPageSelector
* @return {number}
*/
export const getreciterSuggestionTargetCurrentPageSelector = createSelector(_getReciterSuggestionTargetState,
(state: OpenaireState) => state.suggestionTarget.currentPage
);
export const getReciterSuggestionTargetCurrentPageSelector = (source: string) => {
return createSelector(reciterSuggestionSourceSelector(source), (state: SuggestionTargetEntry) => state?.currentPage || 0);
};

/**
* Returns the total number of Reciter Suggestion Targets.
* @function getreciterSuggestionTargetTotalsSelector
* @function getReciterSuggestionTargetTotalsSelector
* @return {number}
*/
export const getreciterSuggestionTargetTotalsSelector = createSelector(_getReciterSuggestionTargetState,
(state: OpenaireState) => state.suggestionTarget.totalElements
);
export const getReciterSuggestionTargetTotalsSelector = (source: string) => {
return createSelector(reciterSuggestionSourceSelector(source), (state: SuggestionTargetEntry) => state?.totalElements || 0);
};

/**
* Returns Suggestion Targets for the current user.
* @function getCurrentUserReciterSuggestionTargetSelector
* @return {OpenaireSuggestionTarget[]}
*/
export const getCurrentUserSuggestionTargetsSelector = createSelector(_getReciterSuggestionTargetState,
(state: OpenaireState) => state.suggestionTarget.currentUserTargets
);
export const getCurrentUserSuggestionTargetsSelector = () => {
return createSelector(reciterSuggestionTargetStateSelector(), (state: SuggestionTargetState) => state?.currentUserTargets || []);
};

/**
* Returns whether or not the user has consulted their suggestions
* Returns whether the user has consulted their suggestions
* @function getCurrentUserReciterSuggestionTargetSelector
* @return {boolean}
*/
export const getCurrentUserSuggestionTargetsVisitedSelector = createSelector(_getReciterSuggestionTargetState,
(state: OpenaireState) => state.suggestionTarget.currentUserTargetsVisited
);
export const getCurrentUserSuggestionTargetsVisitedSelector = () => {
return createSelector(reciterSuggestionTargetStateSelector(), (state: SuggestionTargetState) => state?.currentUserTargetsVisited || false);
};
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,12 @@

import { Action } from '@ngrx/store';
import { type } from '../../../shared/ngrx/type';
import { OpenaireSuggestionTarget } from '../../../core/openaire/reciter-suggestions/models/openaire-suggestion-target.model';
import {
OpenaireSuggestionTarget
} from '../../../core/openaire/reciter-suggestions/models/openaire-suggestion-target.model';

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

/**
* An ngrx action to retrieve all the Suggestion Targets.
* A ngrx action to retrieve all the Suggestion Targets.
*/
export class RetrieveTargetsBySourceAction implements Action {
type = SuggestionTargetActionTypes.RETRIEVE_TARGETS_BY_SOURCE;
Expand Down Expand Up @@ -53,18 +55,34 @@ export class RetrieveTargetsBySourceAction implements Action {
}

/**
* An ngrx action for retrieving 'all Suggestion Targets' error.
* A ngrx action for notifying error.
*/
export class RetrieveAllTargetsErrorAction implements Action {
export class RetrieveTargetsBySourceErrorAction implements Action {
type = SuggestionTargetActionTypes.RETRIEVE_TARGETS_BY_SOURCE_ERROR;
payload: {
source: string;
};

/**
* Create a new RetrieveTargetsBySourceAction.
*
* @param source
* the source for which to retrieve suggestion targets
*/
constructor(source: string) {
this.payload = {
source
};
}
}

/**
* An ngrx action to load the Suggestion Target objects.
* A ngrx action to load the Suggestion Target objects.
*/
export class AddTargetAction implements Action {
type = SuggestionTargetActionTypes.ADD_TARGETS;
payload: {
source: string;
targets: OpenaireSuggestionTarget[];
totalPages: number;
currentPage: number;
Expand All @@ -74,6 +92,8 @@ export class AddTargetAction implements Action {
/**
* Create a new AddTargetAction.
*
* @param source
* the source of suggestion targets
* @param targets
* the list of targets
* @param totalPages
Expand All @@ -83,8 +103,9 @@ export class AddTargetAction implements Action {
* @param totalElements
* the total available Suggestion Targets
*/
constructor(targets: OpenaireSuggestionTarget[], totalPages: number, currentPage: number, totalElements: number) {
constructor(source: string, targets: OpenaireSuggestionTarget[], totalPages: number, currentPage: number, totalElements: number) {
this.payload = {
source,
targets,
totalPages,
currentPage,
Expand All @@ -95,7 +116,7 @@ export class AddTargetAction implements Action {
}

/**
* An ngrx action to load the user Suggestion Target object.
* A ngrx action to load the user Suggestion Target object.
* Called by the ??? effect.
*/
export class AddUserSuggestionsAction implements Action {
Expand All @@ -117,26 +138,41 @@ export class AddUserSuggestionsAction implements Action {
}

/**
* An ngrx action to reload the user Suggestion Target object.
* A ngrx action to reload the user Suggestion Target object.
* Called by the ??? effect.
*/
export class RefreshUserSuggestionsAction implements Action {
type = SuggestionTargetActionTypes.REFRESH_USER_SUGGESTIONS;
}

/**
* An ngrx action to Mark User Suggestions As Visited.
* A ngrx action to Mark User Suggestions As Visited.
* Called by the ??? effect.
*/
export class MarkUserSuggestionsAsVisitedAction implements Action {
type = SuggestionTargetActionTypes.MARK_USER_SUGGESTIONS_AS_VISITED;
}

/**
* An ngrx action to clear targets state.
* A ngrx action to clear targets state.
*/
export class ClearSuggestionTargetsAction implements Action {
type = SuggestionTargetActionTypes.CLEAR_TARGETS;
payload: {
source: string;
};

/**
* Create a new ClearSuggestionTargetsAction.
*
* @param source
* the source of suggestion targets
*/
constructor(source: string) {
this.payload = {
source
};
}
}

/**
Expand All @@ -149,4 +185,4 @@ export type SuggestionTargetsActions
| ClearSuggestionTargetsAction
| MarkUserSuggestionsAsVisitedAction
| RetrieveTargetsBySourceAction
| RetrieveAllTargetsErrorAction;
| RetrieveTargetsBySourceErrorAction;
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@
<div class="col-12">
<h3 id="header" class="border-bottom pb-2">{{'reciter.suggestion.title'| translate}}</h3>

<ds-loading class="container" *ngIf="(isTargetsLoading() | async)" message="{{'reciter.suggestion.loading' | translate}}"></ds-loading>
<ds-pagination *ngIf="!(isTargetsLoading() | async)"
<ds-loading class="container" *ngIf="(isTargetsLoading(source) | async)" message="{{'reciter.suggestion.loading' | translate}}"></ds-loading>
<ds-pagination *ngIf="!(isTargetsLoading(source) | async)"
[paginationOptions]="paginationConfig"
[collectionSize]="(totalElements$ | async)"
[hideGear]="false"
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
import { Component, Input, OnInit } from '@angular/core';
import { AfterViewInit, Component, Input, OnDestroy, OnInit } from '@angular/core';
import { Router } from '@angular/router';

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

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

/**
* The source for which to list targets
Expand Down Expand Up @@ -72,16 +74,16 @@ export class SuggestionTargetsComponent implements OnInit {
* Component initialization.
*/
ngOnInit(): void {
this.targets$ = this.suggestionTargetsStateService.getReciterSuggestionTargets();
this.totalElements$ = this.suggestionTargetsStateService.getReciterSuggestionTargetsTotals();
this.targets$ = this.suggestionTargetsStateService.getReciterSuggestionTargets(this.source);
this.totalElements$ = this.suggestionTargetsStateService.getReciterSuggestionTargetsTotals(this.source);
}

/**
* First Suggestion Targets loading after view initialization.
*/
ngAfterViewInit(): void {
this.subs.push(
this.suggestionTargetsStateService.isReciterSuggestionTargetsLoaded().pipe(
this.suggestionTargetsStateService.isReciterSuggestionTargetsLoaded(this.source).pipe(
take(1)
).subscribe(() => {
this.getSuggestionTargets();
Expand All @@ -95,8 +97,8 @@ export class SuggestionTargetsComponent implements OnInit {
* @return Observable<boolean>
* 'true' if the targets are loading, 'false' otherwise.
*/
public isTargetsLoading(): Observable<boolean> {
return this.suggestionTargetsStateService.isReciterSuggestionTargetsLoading();
public isTargetsLoading(source: string): Observable<boolean> {
return this.suggestionTargetsStateService.isReciterSuggestionTargetsLoading(source);
}

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

/**
Expand All @@ -125,7 +127,7 @@ export class SuggestionTargetsComponent implements OnInit {
* Unsubscribe from all subscriptions.
*/
ngOnDestroy(): void {
this.suggestionTargetsStateService.dispatchClearSuggestionTargetsAction();
this.suggestionTargetsStateService.dispatchClearSuggestionTargetsAction(this.source);
this.subs
.filter((sub) => hasValue(sub))
.forEach((sub) => sub.unsubscribe());
Expand Down
Loading

0 comments on commit 340cca1

Please sign in to comment.