MOBILE-3939 feedback: rename respondents

main
Noel De Martin 2021-12-02 13:23:49 +01:00
parent 4fb700b985
commit 00a12df79b
6 changed files with 63 additions and 62 deletions

View File

@ -72,7 +72,7 @@
</ion-select-option>
</ion-select>
</ion-item>
<ion-item class="ion-text-wrap" (click)="openRespondents()" [class.hide-detail]="!(access.canviewreports && completedCount > 0)"
<ion-item class="ion-text-wrap" (click)="openAttempts()" [class.hide-detail]="!(access.canviewreports && completedCount > 0)"
detail="true" [button]="access.canviewreports && completedCount > 0">
<ion-label>
<h2>{{ 'addon.mod_feedback.completed_feedbacks' | translate }}</h2>

View File

@ -400,15 +400,15 @@ export class AddonModFeedbackIndexComponent extends CoreCourseModuleMainActivity
}
/**
* Open respondents page.
* Open attempts page.
*/
openRespondents(): void {
openAttempts(): void {
if (!this.access!.canviewreports || this.completedCount <= 0) {
return;
}
CoreNavigator.navigateToSitePath(
AddonModFeedbackModuleHandlerService.PAGE_NAME + `/${this.courseId}/${this.module.id}/respondents`,
AddonModFeedbackModuleHandlerService.PAGE_NAME + `/${this.courseId}/${this.module.id}/attempts`,
{
params: {
group: this.group,

View File

@ -17,7 +17,7 @@ import { RouterModule, Routes } from '@angular/router';
import { CoreSharedModule } from '@/core/shared.module';
import { AddonModFeedbackComponentsModule } from './components/components.module';
import { AddonModFeedbackIndexPage } from './pages/index/index';
import { AddonModFeedbackRespondentsPage } from './pages/respondents/respondents';
import { AddonModFeedbackAttemptsPage } from './pages/attempts/attempts';
import { conditionalRoutes } from '@/app/app-routing.module';
import { CoreScreen } from '@services/screen';
@ -40,11 +40,11 @@ const commonRoutes: Routes = [
const mobileRoutes: Routes = [
...commonRoutes,
{
path: ':courseId/:cmId/respondents',
component: AddonModFeedbackRespondentsPage,
path: ':courseId/:cmId/attempts',
component: AddonModFeedbackAttemptsPage,
},
{
path: ':courseId/:cmId/respondents/attempt/:attemptId',
path: ':courseId/:cmId/attempts/:attemptId',
loadChildren: () => import('./pages/attempt/attempt.module').then(m => m.AddonModFeedbackAttemptPageModule),
},
];
@ -52,11 +52,11 @@ const mobileRoutes: Routes = [
const tabletRoutes: Routes = [
...commonRoutes,
{
path: ':courseId/:cmId/respondents',
component: AddonModFeedbackRespondentsPage,
path: ':courseId/:cmId/attempts',
component: AddonModFeedbackAttemptsPage,
children: [
{
path: 'attempt/:attemptId',
path: ':attemptId',
loadChildren: () => import('./pages/attempt/attempt.module').then(m => m.AddonModFeedbackAttemptPageModule),
},
],
@ -76,7 +76,7 @@ const routes: Routes = [
],
declarations: [
AddonModFeedbackIndexPage,
AddonModFeedbackRespondentsPage,
AddonModFeedbackAttemptsPage,
],
})
export class AddonModFeedbackLazyModule {}

View File

@ -29,14 +29,15 @@
</ion-select>
</ion-item>
<ng-container *ngIf="responses.responses.total > 0">
<ng-container *ngIf="attempts.identifiable.total > 0">
<ion-item-divider>
<ion-label>
<h2>{{ 'addon.mod_feedback.non_anonymous_entries' | translate : {$a: responses.responses.total } }}</h2>
<h2>{{ 'addon.mod_feedback.non_anonymous_entries' | translate : {$a: attempts.identifiable.total } }}
</h2>
</ion-label>
</ion-item-divider>
<ion-item *ngFor="let attempt of responses.responses.attempts" class="ion-text-wrap" button detail="true"
(click)="responses.select(attempt)" [attr.aria-current]="responses.getItemAriaCurrent(attempt)">
<ion-item *ngFor="let attempt of attempts.identifiable.items" class="ion-text-wrap" button detail="true"
(click)="attempts.select(attempt)" [attr.aria-current]="attempts.getItemAriaCurrent(attempt)">
<core-user-avatar [user]="attempt" slot="start"></core-user-avatar>
<ion-label>
<p class="item-heading">{{ attempt.fullname }}</p>
@ -45,36 +46,36 @@
</ion-item>
<!-- Button and spinner to show more attempts. -->
<ion-button *ngIf="responses.responses.canLoadMore && !loadingMore" class="ion-margin" expand="block"
<ion-button *ngIf="attempts.identifiable.canLoadMore && !loadingMore" class="ion-margin" expand="block"
(click)="loadAttempts()">
{{ 'core.loadmore' | translate }}
</ion-button>
<ion-item *ngIf="responses.responses.canLoadMore && loadingMore" class="ion-text-center">
<ion-item *ngIf="attempts.identifiable.canLoadMore && loadingMore" class="ion-text-center">
<ion-label>
<ion-spinner [attr.aria-label]="'core.loading' | translate"></ion-spinner>
</ion-label>
</ion-item>
</ng-container>
<ng-container *ngIf="responses.anonResponses.total > 0">
<ng-container *ngIf="attempts.anonymous.total > 0">
<ion-item-divider>
<ion-label>
<h2>{{ 'addon.mod_feedback.anonymous_entries' |translate : {$a: responses.anonResponses.total } }}</h2>
<h2>{{ 'addon.mod_feedback.anonymous_entries' |translate : {$a: attempts.anonymous.total } }}</h2>
</ion-label>
</ion-item-divider>
<ion-item *ngFor="let attempt of responses.anonResponses.attempts" class="ion-text-wrap" button detail="true"
(click)="responses.select(attempt)" [attr.aria-current]="responses.getItemAriaCurrent(attempt)">
<ion-item *ngFor="let attempt of attempts.anonymous.items" class="ion-text-wrap" button detail="true"
(click)="attempts.select(attempt)" [attr.aria-current]="attempts.getItemAriaCurrent(attempt)">
<ion-label>
<h2>{{ 'addon.mod_feedback.response_nr' |translate }}: {{attempt.number}}</h2>
</ion-label>
</ion-item>
<!-- Button and spinner to show more attempts. -->
<ion-button *ngIf="responses.anonResponses.canLoadMore && !loadingMore" class="ion-margin" expand="block"
<ion-button *ngIf="attempts.anonymous.canLoadMore && !loadingMore" class="ion-margin" expand="block"
(click)="loadAttempts()">
{{ 'core.loadmore' | translate }}
</ion-button>
<ion-item *ngIf="responses.anonResponses.canLoadMore && loadingMore" class="ion-text-center">
<ion-item *ngIf="attempts.anonymous.canLoadMore && loadingMore" class="ion-text-center">
<ion-label>
<ion-spinner [attr.aria-label]="'core.loading' | translate"></ion-spinner>
</ion-label>

View File

@ -30,13 +30,13 @@ import {
import { AddonModFeedbackHelper, AddonModFeedbackResponsesAnalysis } from '../../services/feedback-helper';
/**
* Page that displays feedback respondents.
* Page that displays feedback attempts.
*/
@Component({
selector: 'page-addon-mod-feedback-respondents',
templateUrl: 'respondents.html',
selector: 'page-addon-mod-feedback-attempts',
templateUrl: 'attempts.html',
})
export class AddonModFeedbackRespondentsPage implements AfterViewInit {
export class AddonModFeedbackAttemptsPage implements AfterViewInit {
@ViewChild(CoreSplitViewComponent) splitView!: CoreSplitViewComponent;
@ -45,7 +45,7 @@ export class AddonModFeedbackRespondentsPage implements AfterViewInit {
protected page = 0;
protected feedback?: AddonModFeedbackWSFeedback;
responses: AddonModFeedbackResponsesManager;
attempts: AddonModFeedbackAttemptsManager;
selectedGroup!: number;
groupInfo?: CoreGroupInfo;
loaded = false;
@ -54,7 +54,7 @@ export class AddonModFeedbackRespondentsPage implements AfterViewInit {
constructor(
route: ActivatedRoute,
) {
this.responses = new AddonModFeedbackResponsesManager(
this.attempts = new AddonModFeedbackAttemptsManager(
route.component,
);
}
@ -77,7 +77,7 @@ export class AddonModFeedbackRespondentsPage implements AfterViewInit {
await this.fetchData();
this.responses.start(this.splitView);
this.attempts.start(this.splitView);
}
/**
@ -88,7 +88,7 @@ export class AddonModFeedbackRespondentsPage implements AfterViewInit {
*/
async fetchData(refresh: boolean = false): Promise<void> {
this.page = 0;
this.responses.resetItems();
this.attempts.resetItems();
try {
this.feedback = await AddonModFeedback.getFeedback(this.courseId, this.cmId);
@ -121,17 +121,17 @@ export class AddonModFeedbackRespondentsPage implements AfterViewInit {
} else {
this.selectedGroup = groupId;
this.page = 0;
this.responses.resetItems();
this.attempts.resetItems();
}
try {
const responses = await AddonModFeedbackHelper.getResponsesAnalysis(this.feedback!.id, {
const attempts = await AddonModFeedbackHelper.getResponsesAnalysis(this.feedback!.id, {
groupId: this.selectedGroup,
page: this.page,
cmId: this.cmId,
});
this.responses.setResponses(responses);
this.attempts.setAttempts(attempts);
} finally {
this.loadingMore = false;
this.loaded = true;
@ -183,16 +183,16 @@ type EntryItem = AddonModFeedbackWSAttempt | AddonModFeedbackWSAnonAttempt;
/**
* Entries manager.
*/
class AddonModFeedbackResponsesManager extends CorePageItemsListManager<EntryItem> {
class AddonModFeedbackAttemptsManager extends CorePageItemsListManager<EntryItem> {
responses: AddonModFeedbackResponses = {
attempts: [],
identifiable: AddonModFeedbackIdentifiableAttempts = {
items: [],
total: 0,
canLoadMore: false,
};
anonResponses: AddonModFeedbackAnonResponses = {
attempts: [],
anonymous: AddonModFeedbackAnonymousAttempts = {
items: [],
total: 0,
canLoadMore: false,
};
@ -202,25 +202,25 @@ class AddonModFeedbackResponsesManager extends CorePageItemsListManager<EntryIte
}
/**
* Update responses.
* Update attempts.
*
* @param responses Responses.
* @param attempts Attempts.
*/
setResponses(responses: AddonModFeedbackResponsesAnalysis): void {
this.responses.total = responses.totalattempts;
this.anonResponses.total = responses.totalanonattempts;
setAttempts(attempts: AddonModFeedbackResponsesAnalysis): void {
this.identifiable.total = attempts.totalattempts;
this.anonymous.total = attempts.totalanonattempts;
if (this.anonResponses.attempts.length < responses.totalanonattempts) {
this.anonResponses.attempts = this.anonResponses.attempts.concat(responses.anonattempts);
if (this.anonymous.items.length < attempts.totalanonattempts) {
this.anonymous.items = this.anonymous.items.concat(attempts.anonattempts);
}
if (this.responses.attempts.length < responses.totalattempts) {
this.responses.attempts = this.responses.attempts.concat(responses.attempts);
if (this.identifiable.items.length < attempts.totalattempts) {
this.identifiable.items = this.identifiable.items.concat(attempts.attempts);
}
this.anonResponses.canLoadMore = this.anonResponses.attempts.length < responses.totalanonattempts;
this.responses.canLoadMore = this.responses.attempts.length < responses.totalattempts;
this.anonymous.canLoadMore = this.anonymous.items.length < attempts.totalanonattempts;
this.identifiable.canLoadMore = this.identifiable.items.length < attempts.totalattempts;
this.setItems((<EntryItem[]> this.responses.attempts).concat(this.anonResponses.attempts));
this.setItems((<EntryItem[]> this.identifiable.items).concat(this.anonymous.items));
}
/**
@ -228,29 +228,29 @@ class AddonModFeedbackResponsesManager extends CorePageItemsListManager<EntryIte
*/
resetItems(): void {
super.resetItems();
this.responses.total = 0;
this.responses.attempts = [];
this.anonResponses.total = 0;
this.anonResponses.attempts = [];
this.identifiable.total = 0;
this.identifiable.items = [];
this.anonymous.total = 0;
this.anonymous.items = [];
}
/**
* @inheritdoc
*/
protected getItemPath(entry: EntryItem): string {
return `attempt/${entry.id}`;
return entry.id.toString();
}
}
type AddonModFeedbackResponses = {
attempts: AddonModFeedbackWSAttempt[];
type AddonModFeedbackIdentifiableAttempts = {
items: AddonModFeedbackWSAttempt[];
total: number;
canLoadMore: boolean;
};
type AddonModFeedbackAnonResponses = {
attempts: AddonModFeedbackWSAnonAttempt[];
type AddonModFeedbackAnonymousAttempts = {
items: AddonModFeedbackWSAnonAttempt[];
total: number;
canLoadMore: boolean;
};

View File

@ -184,7 +184,7 @@ export class AddonModFeedbackHelperProvider {
if (params.showcompleted === undefined) {
// Param showcompleted not defined. Show entry list.
await CoreNavigator.navigateToSitePath(
AddonModFeedbackModuleHandlerService.PAGE_NAME + `/${module.course}/${module.id}/respondents`,
AddonModFeedbackModuleHandlerService.PAGE_NAME + `/${module.course}/${module.id}/attempts`,
{ siteId },
);