MOBILE-3919 assign: Display activity instructions

main
Dani Palou 2022-03-07 07:47:51 +01:00
parent 1da073eefa
commit b793a9dbe9
4 changed files with 58 additions and 10 deletions

View File

@ -11,7 +11,7 @@
<!-- Activity info. --> <!-- Activity info. -->
<core-course-module-info [module]="module" [description]="description" [component]="component" [componentId]="componentId" <core-course-module-info [module]="module" [description]="description" [component]="component" [componentId]="componentId"
[courseId]="courseId" [hasDataToSync]="hasOffline" (completionChanged)="onCompletionChange()"> [courseId]="courseId" [hasDataToSync]="hasOffline" (completionChanged)="onCompletionChange()">
<ion-list inset="true" description *ngIf="assign && assign.introattachments && assign.introattachments.length"> <ion-list inset="true" description *ngIf="assign && assign.introattachments?.length && !assign.submissionattachments">
<core-file *ngFor="let file of assign.introattachments" [file]="file" [component]="component" [componentId]="componentId"> <core-file *ngFor="let file of assign.introattachments" [file]="file" [component]="component" [componentId]="componentId">
</core-file> </core-file>
</ion-list> </ion-list>

View File

@ -25,6 +25,20 @@
[underTimeClassThresholds]="[300, 900]" class="ion-margin-horizontal"> [underTimeClassThresholds]="[300, 900]" class="ion-margin-horizontal">
</core-timer> </core-timer>
<!-- Assign activity instructions and attachments if needed. -->
<ion-item class="ion-text-wrap" *ngIf="activityInstructions">
<ion-label>
<core-format-text [text]="activityInstructions" [component]="component" [componentId]="moduleId" contextLevel="module"
[contextInstanceId]="moduleId" [courseId]="courseId" [maxHeight]="120">
</core-format-text>
</ion-label>
</ion-item>
<ng-container *ngIf="assign?.submissionattachments">
<core-file *ngFor="let file of introAttachments" [file]="file" [component]="component" [componentId]="moduleId">
</core-file>
</ng-container>
<form name="addon-mod_assign-edit-form" #editSubmissionForm> <form name="addon-mod_assign-edit-form" #editSubmissionForm>
<!-- Submission statement. --> <!-- Submission statement. -->
<ion-item class="ion-text-wrap" *ngIf="submissionStatement"> <ion-item class="ion-text-wrap" *ngIf="submissionStatement">

View File

@ -38,6 +38,7 @@ import { AddonModAssignHelper } from '../../services/assign-helper';
import { AddonModAssignOffline } from '../../services/assign-offline'; import { AddonModAssignOffline } from '../../services/assign-offline';
import { AddonModAssignSync } from '../../services/assign-sync'; import { AddonModAssignSync } from '../../services/assign-sync';
import { CoreUtils } from '@services/utils/utils'; import { CoreUtils } from '@services/utils/utils';
import { CoreWSExternalFile } from '@services/ws';
/** /**
* Page that allows adding or editing an assigment submission. * Page that allows adding or editing an assigment submission.
@ -61,6 +62,9 @@ export class AddonModAssignEditPage implements OnInit, OnDestroy, CanLeave {
submissionStatementAccepted = false; // Whether submission statement is accepted. submissionStatementAccepted = false; // Whether submission statement is accepted.
loaded = false; // Whether data has been loaded. loaded = false; // Whether data has been loaded.
timeLimitEndTime = 0; // If time limit is enabled, the end time for the timer. timeLimitEndTime = 0; // If time limit is enabled, the end time for the timer.
activityInstructions?: string; // Activity instructions.
introAttachments?: CoreWSExternalFile[]; // Intro attachments.
component = AddonModAssignProvider.COMPONENT;
protected userId: number; // User doing the submission. protected userId: number; // User doing the submission.
protected isBlind = false; // Whether blind is used. protected isBlind = false; // Whether blind is used.
@ -184,6 +188,20 @@ export class AddonModAssignEditPage implements OnInit, OnDestroy, CanLeave {
submissionStatus = await this.startSubmissionIfNeeded(submissionStatus, options); submissionStatus = await this.startSubmissionIfNeeded(submissionStatus, options);
if (submissionStatus.assignmentdata?.activity) {
// There are activity instructions. Make sure to display it with filters applied.
const filteredSubmissionStatus = options.filter ?
submissionStatus :
await AddonModAssign.getSubmissionStatus(this.assign.id, {
...options,
filter: true,
});
this.activityInstructions = filteredSubmissionStatus.assignmentdata?.activity;
}
this.introAttachments = submissionStatus.assignmentdata?.attachments?.intro ?? this.assign.introattachments;
this.allowOffline = true; // If offline isn't allowed we shouldn't have reached this point. this.allowOffline = true; // If offline isn't allowed we shouldn't have reached this point.
// Only show submission statement if we are editing our own submission. // Only show submission statement if we are editing our own submission.
if (this.assign.requiresubmissionstatement && !this.assign.submissiondrafts && this.userId == currentUserId) { if (this.assign.requiresubmissionstatement && !this.assign.submissiondrafts && this.userId == currentUserId) {

View File

@ -101,19 +101,26 @@ export class AddonModAssignPrefetchHandlerService extends CoreCourseActivityPref
await AddonModAssignHelper.getSubmissionsUserData(assign, submissionData.submissions, 0, { siteId }); await AddonModAssignHelper.getSubmissionsUserData(assign, submissionData.submissions, 0, { siteId });
// Get all the files in the submissions. // Get all the files in the submissions.
const promises = submissions.map((submission) => const promises = submissions.map(async (submission) => {
this.getSubmissionFiles(assign, submission.submitid!, !!submission.blindid, siteId).then((submissionFiles) => { try {
files = files.concat(submissionFiles); const submissionFiles = await this.getSubmissionFiles(
assign,
submission.submitid!,
!!submission.blindid,
true,
siteId,
);
return; files = files.concat(submissionFiles);
}).catch((error) => { } catch (error) {
if (error && error.errorcode == 'nopermission') { if (error && error.errorcode == 'nopermission') {
// The user does not have persmission to view this submission, ignore it. // The user does not have persmission to view this submission, ignore it.
return; return;
} }
throw error; throw error;
})); }
});
await Promise.all(promises); await Promise.all(promises);
} else { } else {
@ -121,7 +128,7 @@ export class AddonModAssignPrefetchHandlerService extends CoreCourseActivityPref
const userId = CoreSites.getCurrentSiteUserId(); const userId = CoreSites.getCurrentSiteUserId();
const blindMarking = !!assign.blindmarking && !assign.revealidentities; const blindMarking = !!assign.blindmarking && !assign.revealidentities;
const submissionFiles = await this.getSubmissionFiles(assign, userId, blindMarking, siteId); const submissionFiles = await this.getSubmissionFiles(assign, userId, blindMarking, false, siteId);
files = files.concat(submissionFiles); files = files.concat(submissionFiles);
} }
@ -138,6 +145,7 @@ export class AddonModAssignPrefetchHandlerService extends CoreCourseActivityPref
* @param assign Assign. * @param assign Assign.
* @param submitId User ID of the submission to get. * @param submitId User ID of the submission to get.
* @param blindMarking True if blind marking, false otherwise. * @param blindMarking True if blind marking, false otherwise.
* @param canViewAllSubmissions Whether the user can view all submissions.
* @param siteId Site ID. If not defined, current site. * @param siteId Site ID. If not defined, current site.
* @return Promise resolved with array of files. * @return Promise resolved with array of files.
*/ */
@ -145,6 +153,7 @@ export class AddonModAssignPrefetchHandlerService extends CoreCourseActivityPref
assign: AddonModAssignAssign, assign: AddonModAssignAssign,
submitId: number, submitId: number,
blindMarking: boolean, blindMarking: boolean,
canViewAllSubmissions: boolean,
siteId?: string, siteId?: string,
): Promise<CoreWSFile[]> { ): Promise<CoreWSFile[]> {
@ -155,8 +164,15 @@ export class AddonModAssignPrefetchHandlerService extends CoreCourseActivityPref
}); });
const userSubmission = AddonModAssign.getSubmissionObjectFromAttempt(assign, submissionStatus.lastattempt); const userSubmission = AddonModAssign.getSubmissionObjectFromAttempt(assign, submissionStatus.lastattempt);
// Get intro and activity files from the submission status if it's a student.
// It's ok if they were already obtained from the assignment instance, they won't be downloaded twice.
const files = canViewAllSubmissions ?
[] :
(submissionStatus.assignmentdata?.attachments?.intro || [])
.concat(submissionStatus.assignmentdata?.attachments?.activity || []);
if (!submissionStatus.lastattempt || !userSubmission) { if (!submissionStatus.lastattempt || !userSubmission) {
return []; return files;
} }
const promises: Promise<CoreWSFile[]>[] = []; const promises: Promise<CoreWSFile[]>[] = [];
@ -177,7 +193,7 @@ export class AddonModAssignPrefetchHandlerService extends CoreCourseActivityPref
const filesLists = await Promise.all(promises); const filesLists = await Promise.all(promises);
return [].concat.apply([], filesLists); return files.concat.apply(files, filesLists);
} }
/** /**