98535: Cleaned up code & added documentation

This commit is contained in:
Alexandre Vryghem
2023-01-17 19:00:00 +01:00
parent bd2135bcd2
commit fe61bb7b6b
23 changed files with 184 additions and 130 deletions

View File

@@ -1,6 +1,10 @@
import { Component, OnInit } from '@angular/core';
import { ActivatedRoute } from '@angular/router';
/**
* The Advanced Workflow page containing the correct {@link AdvancedWorkflowActionComponent}
* based on the route parameters.
*/
@Component({
selector: 'ds-advanced-workflow-action-page',
templateUrl: './advanced-workflow-action-page.component.html',

View File

@@ -6,12 +6,15 @@ import { AdvancedWorkflowActionComponent } from '../advanced-workflow-action/adv
import { FormGroup, FormControl } from '@angular/forms';
import { WorkflowAction } from '../../../core/tasks/models/workflow-action-object.model';
import {
RatingReviewerActionAdvancedInfo
} from '../../../core/tasks/models/rating-reviewer-action-advanced-info.model';
RatingAdvancedWorkflowInfo
} from '../../../core/tasks/models/rating-advanced-workflow-info.model';
export const WORKFLOW_ADVANCED_TASK_OPTION_RATING = 'submit_score';
export const ADVANCED_WORKFLOW_TASK_OPTION_RATING = 'submit_score';
export const ADVANCED_WORKFLOW_ACTION_RATING = 'scorereviewaction';
/**
* The page on which reviewers can rate submitted items.
*/
@rendersAdvancedWorkflowTaskOption(ADVANCED_WORKFLOW_ACTION_RATING)
@Component({
selector: 'ds-advanced-workflow-action-rating-reviewer',
@@ -23,7 +26,7 @@ export class AdvancedWorkflowActionRatingComponent extends AdvancedWorkflowActio
ratingForm: FormGroup;
ngOnInit() {
ngOnInit(): void {
super.ngOnInit();
this.ratingForm = new FormGroup({
review: new FormControl(''),
@@ -43,9 +46,12 @@ export class AdvancedWorkflowActionRatingComponent extends AdvancedWorkflowActio
}
}
/**
* Returns the task option, the score and the review if one was provided
*/
createBody(): any {
const body = {
[WORKFLOW_ADVANCED_TASK_OPTION_RATING]: true,
[ADVANCED_WORKFLOW_TASK_OPTION_RATING]: true,
score: this.ratingForm.get('rating').value,
};
if (this.ratingForm.get('review').value !== '') {
@@ -59,8 +65,8 @@ export class AdvancedWorkflowActionRatingComponent extends AdvancedWorkflowActio
return ADVANCED_WORKFLOW_ACTION_RATING;
}
getAdvancedInfo(workflowAction: WorkflowAction | null): RatingReviewerActionAdvancedInfo | null {
return workflowAction ? (workflowAction.advancedInfo[0] as RatingReviewerActionAdvancedInfo) : null;
getAdvancedInfo(workflowAction: WorkflowAction | null): RatingAdvancedWorkflowInfo | null {
return workflowAction ? (workflowAction.advancedInfo[0] as RatingAdvancedWorkflowInfo) : null;
}
}

View File

@@ -5,17 +5,20 @@ import {
import { AdvancedWorkflowActionComponent } from '../advanced-workflow-action/advanced-workflow-action.component';
import { WorkflowAction } from '../../../core/tasks/models/workflow-action-object.model';
import {
SelectReviewerActionAdvancedInfo
} from '../../../core/tasks/models/select-reviewer-action-advanced-info.model';
SelectReviewerAdvancedWorkflowInfo
} from '../../../core/tasks/models/select-reviewer-advanced-workflow-info.model';
import {
EPersonListActionConfig
} from '../../../access-control/group-registry/group-form/members-list/members-list.component';
import { Subscription } from 'rxjs';
import { EPerson } from '../../../core/eperson/models/eperson.model';
export const WORKFLOW_ADVANCED_TASK_OPTION_SELECT_REVIEWER = 'submit_select_reviewer';
export const ADVANCED_WORKFLOW_TASK_OPTION_SELECT_REVIEWER = 'submit_select_reviewer';
export const ADVANCED_WORKFLOW_ACTION_SELECT_REVIEWER = 'selectrevieweraction';
/**
* The page on which Review Managers can assign Reviewers to review an item.
*/
@rendersAdvancedWorkflowTaskOption(ADVANCED_WORKFLOW_ACTION_SELECT_REVIEWER)
@Component({
selector: 'ds-advanced-workflow-action-select-reviewer',
@@ -75,7 +78,7 @@ export class AdvancedWorkflowActionSelectReviewerComponent extends AdvancedWorkf
}
this.subs.push(this.workflowAction$.subscribe((workflowAction: WorkflowAction) => {
if (workflowAction) {
this.groupId = (workflowAction.advancedInfo as SelectReviewerActionAdvancedInfo[])[0].group;
this.groupId = (workflowAction.advancedInfo as SelectReviewerAdvancedWorkflowInfo[])[0].group;
} else {
this.groupId = null;
}
@@ -86,18 +89,23 @@ export class AdvancedWorkflowActionSelectReviewerComponent extends AdvancedWorkf
return ADVANCED_WORKFLOW_ACTION_SELECT_REVIEWER;
}
/**
* Only performs the action when some reviewers have been selected.
*/
performAction(): void {
if (this.selectedReviewers.length > 0) {
super.performAction();
} else {
this.displayError = true;
}
console.log(this.displayError);
}
/**
* Returns the task option and the selected {@link EPerson} id(s)
*/
createBody(): any {
return {
[WORKFLOW_ADVANCED_TASK_OPTION_SELECT_REVIEWER]: true,
[ADVANCED_WORKFLOW_TASK_OPTION_SELECT_REVIEWER]: true,
eperson: this.selectedReviewers.map((ePerson: EPerson) => ePerson.id),
};
}

View File

@@ -14,7 +14,8 @@ import { Observable, of as observableOf } from 'rxjs';
import { hasValue } from '../../../../shared/empty.util';
import { PaginatedList } from '../../../../core/data/paginated-list.model';
import {
MembersListComponent, EPersonListActionConfig
MembersListComponent,
EPersonListActionConfig,
} from '../../../../access-control/group-registry/group-form/members-list/members-list.component';
/**
@@ -26,6 +27,9 @@ enum SubKey {
SearchResultsDTO,
}
/**
* A custom {@link MembersListComponent} for the advanced SelectReviewer workflow.
*/
@Component({
selector: 'ds-reviewers-list',
// templateUrl: './reviewers-list.component.html',
@@ -83,6 +87,12 @@ export class ReviewersListComponent extends MembersListComponent implements OnIn
}
}
/**
* Sets the list of currently selected members, when no group is defined the list of {@link selectedReviewers}
* will be set.
*
* @param page The number of the page to retrieve
*/
retrieveMembers(page: number): void {
this.config.currentPage = page;
if (this.groupId === null) {
@@ -95,19 +105,35 @@ export class ReviewersListComponent extends MembersListComponent implements OnIn
}
}
/**
* Checks whether the given {@link possibleMember} is part of the {@link selectedReviewers}.
*
* @param possibleMember The {@link EPerson} that needs to be checked
*/
isMemberOfGroup(possibleMember: EPerson): Observable<boolean> {
return observableOf(hasValue(this.selectedReviewers.find((reviewer: EpersonDtoModel) => reviewer.eperson.id === possibleMember.id)));
}
/**
* Removes the {@link ePerson} from the {@link selectedReviewers}
*
* @param ePerson The {@link EpersonDtoModel} containg the {@link EPerson} to remove
*/
deleteMemberFromGroup(ePerson: EpersonDtoModel) {
ePerson.memberOfGroup = false;
const index = this.selectedReviewers.indexOf(ePerson);
if (index !== -1) {
this.selectedReviewers.splice(index, 1);
}
this.selectedReviewersUpdated.emit(this.selectedReviewers.map((epersonDtoModel: EpersonDtoModel) => epersonDtoModel.eperson));
this.selectedReviewersUpdated.emit(this.selectedReviewers.map((ePersonDtoModel: EpersonDtoModel) => ePersonDtoModel.eperson));
}
/**
* Adds the {@link ePerson} to the {@link selectedReviewers} (or replaces it when {@link multipleReviewers} is
* `false`). Afterwards it will emit the list.
*
* @param ePerson The {@link EPerson} to add to the list
*/
addMemberToGroup(ePerson: EpersonDtoModel) {
ePerson.memberOfGroup = true;
if (!this.multipleReviewers) {

View File

@@ -108,7 +108,8 @@ describe('AdvancedWorkflowActionComponent', () => {
});
@Component({
selector: 'ds-test-cmp',
// tslint:disable-next-line:component-selector
selector: '',
template: ''
})
class TestComponent extends AdvancedWorkflowActionComponent {

View File

@@ -13,6 +13,12 @@ import { ClaimedTaskDataService } from '../../../core/tasks/claimed-task-data.se
import { map } from 'rxjs/operators';
import { ProcessTaskResponse } from '../../../core/tasks/models/process-task-response';
/**
* Abstract component for rendering an advanced claimed task's workflow page
* To create a child-component for a new option:
* - Set the "getType()" of the component
* - Implement the createBody, should always contain at least the ADVANCED_WORKFLOW_TASK_OPTION
*/
@Component({
selector: 'ds-advanced-workflow-action',
template: '',
@@ -62,7 +68,7 @@ export abstract class AdvancedWorkflowActionComponent extends WorkflowItemAction
/**
* Submits the task with the given {@link createBody}.
*
* @param id
* @param id The task id
*/
sendRequest(id: string): Observable<boolean> {
return this.claimedTaskDataService.submitTask(id, this.createBody()).pipe(

View File

@@ -1 +1 @@
<ng-template dsAdvancedClaimedTaskActions></ng-template>
<ng-template dsAdvancedWorkflowActions></ng-template>

View File

@@ -3,10 +3,13 @@ import { hasValue } from '../../../shared/empty.util';
import {
getAdvancedComponentByWorkflowTaskOption
} from '../../../shared/mydspace-actions/claimed-task/switcher/claimed-task-actions-decorator';
import { AdvancedClaimedTaskActionsDirective } from './advanced-claimed-task-actions.directive';
import { AdvancedWorkflowActionsDirective } from './advanced-workflow-actions.directive';
import { Router } from '@angular/router';
import { PAGE_NOT_FOUND_PATH } from '../../../app-routing-paths';
/**
* Component for loading a {@link AdvancedWorkflowActionComponent} depending on the "{@link type}" input
*/
@Component({
selector: 'ds-advanced-workflow-actions-loader',
templateUrl: './advanced-workflow-actions-loader.component.html',
@@ -23,7 +26,7 @@ export class AdvancedWorkflowActionsLoaderComponent implements OnInit {
/**
* Directive to determine where the dynamic child component is located
*/
@ViewChild(AdvancedClaimedTaskActionsDirective, { static: true }) claimedTaskActionsDirective: AdvancedClaimedTaskActionsDirective;
@ViewChild(AdvancedWorkflowActionsDirective, { static: true }) claimedTaskActionsDirective: AdvancedWorkflowActionsDirective;
constructor(
private componentFactoryResolver: ComponentFactoryResolver,
@@ -47,8 +50,8 @@ export class AdvancedWorkflowActionsLoaderComponent implements OnInit {
}
}
getComponentByWorkflowTaskOption(option: string) {
return getAdvancedComponentByWorkflowTaskOption(option);
getComponentByWorkflowTaskOption(type: string): any {
return getAdvancedComponentByWorkflowTaskOption(type);
}
}

View File

@@ -1,12 +1,12 @@
import { Directive, ViewContainerRef } from '@angular/core';
@Directive({
selector: '[dsAdvancedClaimedTaskActions]',
selector: '[dsAdvancedWorkflowActions]',
})
/**
* Directive used as a hook to know where to inject the dynamic Advanced Claimed Task Actions component
*/
export class AdvancedClaimedTaskActionsDirective {
export class AdvancedWorkflowActionsDirective {
constructor(
public viewContainerRef: ViewContainerRef,

View File

@@ -24,8 +24,8 @@ import {
AdvancedWorkflowActionPageComponent
} from './advanced-workflow-action/advanced-workflow-action-page/advanced-workflow-action-page.component';
import {
AdvancedClaimedTaskActionsDirective
} from './advanced-workflow-action/advanced-workflow-actions-loader/advanced-claimed-task-actions.directive';
AdvancedWorkflowActionsDirective
} from './advanced-workflow-action/advanced-workflow-actions-loader/advanced-workflow-actions.directive';
import { AccessControlModule } from '../access-control/access-control.module';
import {
ReviewersListComponent
@@ -54,7 +54,7 @@ import { RatingModule } from 'ngx-bootstrap/rating';
AdvancedWorkflowActionRatingComponent,
AdvancedWorkflowActionSelectReviewerComponent,
AdvancedWorkflowActionPageComponent,
AdvancedClaimedTaskActionsDirective,
AdvancedWorkflowActionsDirective,
ReviewersListComponent,
]
})