MOBILE-3787 assign: Improve submission list filtering
parent
7cdafca794
commit
c5ef18183b
|
@ -170,68 +170,69 @@ export class AddonModAssignSubmissionsSource extends CoreRoutedItemsManagerSourc
|
||||||
: [];
|
: [];
|
||||||
|
|
||||||
// Filter the submissions to get only the ones with the right status and add some extra data.
|
// Filter the submissions to get only the ones with the right status and add some extra data.
|
||||||
const getNeedGrading = this.SELECTED_STATUS == AddonModAssignListFilterName.NEED_GRADING;
|
if (this.SELECTED_STATUS == AddonModAssignListFilterName.NEED_GRADING) {
|
||||||
const searchStatus = getNeedGrading ? AddonModAssignSubmissionStatusValues.SUBMITTED : this.SELECTED_STATUS;
|
const promises: Promise<void>[] = submissions.map(async (submission: AddonModAssignSubmissionForList) => {
|
||||||
|
// Only show the submissions that need to be graded.
|
||||||
|
submission.needsGrading = await AddonModAssign.needsSubmissionToBeGraded(submission, assign.id);
|
||||||
|
});
|
||||||
|
|
||||||
const showSubmissions: AddonModAssignSubmissionForList[] = [];
|
await Promise.all(promises);
|
||||||
|
|
||||||
if (searchStatus) {
|
submissions = submissions.filter((submission: AddonModAssignSubmissionForList) => submission.needsGrading);
|
||||||
submissions = submissions.filter((submission: AddonModAssignSubmissionForList) => searchStatus == submission.status);
|
} else if (this.SELECTED_STATUS) {
|
||||||
|
const searchStatus = this.SELECTED_STATUS == AddonModAssignListFilterName.DRAFT
|
||||||
|
? AddonModAssignSubmissionStatusValues.DRAFT
|
||||||
|
: AddonModAssignSubmissionStatusValues.SUBMITTED;
|
||||||
|
|
||||||
|
submissions = submissions.filter((submission: AddonModAssignSubmissionForList) => submission.status == searchStatus);
|
||||||
}
|
}
|
||||||
|
|
||||||
const promises: Promise<void>[] = submissions.map(async (submission: AddonModAssignSubmissionForList) => {
|
const showSubmissions: AddonModAssignSubmissionForList[] = await Promise.all(
|
||||||
const gradeData = await CoreUtils.ignoreErrors(AddonModAssignOffline.getSubmissionGrade(assign.id, submission.userid));
|
submissions.map(async (submission: AddonModAssignSubmissionForList) => {
|
||||||
if (getNeedGrading) {
|
const gradeData =
|
||||||
// Only show the submissions that need to be graded.
|
await CoreUtils.ignoreErrors(AddonModAssignOffline.getSubmissionGrade(assign.id, submission.userid));
|
||||||
const add = await AddonModAssign.needsSubmissionToBeGraded(submission, assign.id);
|
|
||||||
|
|
||||||
if (!add) {
|
// Load offline grades.
|
||||||
return;
|
const notSynced = !!gradeData && submission.timemodified < gradeData.timemodified;
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Load offline grades.
|
if (submission.gradingstatus == AddonModAssignGradingStates.GRADED && !assign.markingworkflow) {
|
||||||
const notSynced = !!gradeData && submission.timemodified < gradeData.timemodified;
|
// Get the last grade of the submission.
|
||||||
|
const grade = grades
|
||||||
if (submission.gradingstatus == AddonModAssignGradingStates.GRADED && !assign.markingworkflow) {
|
.filter((grade) => grade.userid == submission.userid)
|
||||||
// Get the last grade of the submission.
|
.reduce(
|
||||||
const grade = grades
|
(a, b) => (a && a.timemodified > b.timemodified ? a : b),
|
||||||
.filter((grade) => grade.userid == submission.userid)
|
|
||||||
.reduce(
|
|
||||||
(a, b) => (a && a.timemodified > b.timemodified ? a : b),
|
|
||||||
<AddonModAssignGrade | undefined> undefined,
|
<AddonModAssignGrade | undefined> undefined,
|
||||||
);
|
);
|
||||||
|
|
||||||
if (grade && grade.timemodified < submission.timemodified) {
|
if (grade && grade.timemodified < submission.timemodified) {
|
||||||
submission.gradingstatus = AddonModAssignGradingStates.GRADED_FOLLOWUP_SUBMIT;
|
submission.gradingstatus = AddonModAssignGradingStates.GRADED_FOLLOWUP_SUBMIT;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
submission.statusColor = AddonModAssign.getSubmissionStatusColor(submission.status);
|
||||||
submission.statusColor = AddonModAssign.getSubmissionStatusColor(submission.status);
|
submission.gradingColor = AddonModAssign.getSubmissionGradingStatusColor(
|
||||||
submission.gradingColor = AddonModAssign.getSubmissionGradingStatusColor(
|
|
||||||
submission.gradingstatus,
|
|
||||||
);
|
|
||||||
|
|
||||||
submission.statusTranslated = Translate.instant(
|
|
||||||
'addon.mod_assign.submissionstatus_' + submission.status,
|
|
||||||
);
|
|
||||||
|
|
||||||
if (notSynced) {
|
|
||||||
submission.gradingStatusTranslationId = 'addon.mod_assign.gradenotsynced';
|
|
||||||
submission.gradingColor = '';
|
|
||||||
} else if (submission.statusColor != CoreIonicColorNames.DANGER ||
|
|
||||||
submission.gradingColor != CoreIonicColorNames.DANGER) {
|
|
||||||
// Show grading status if one of the statuses is not done.
|
|
||||||
submission.gradingStatusTranslationId = AddonModAssign.getSubmissionGradingStatusTranslationId(
|
|
||||||
submission.gradingstatus,
|
submission.gradingstatus,
|
||||||
);
|
);
|
||||||
} else {
|
|
||||||
submission.gradingStatusTranslationId = '';
|
|
||||||
}
|
|
||||||
|
|
||||||
showSubmissions.push(submission);
|
submission.statusTranslated = Translate.instant(
|
||||||
});
|
'addon.mod_assign.submissionstatus_' + submission.status,
|
||||||
|
);
|
||||||
|
|
||||||
await Promise.all(promises);
|
if (notSynced) {
|
||||||
|
submission.gradingStatusTranslationId = 'addon.mod_assign.gradenotsynced';
|
||||||
|
submission.gradingColor = '';
|
||||||
|
} else if (submission.statusColor != CoreIonicColorNames.DANGER ||
|
||||||
|
submission.gradingColor != CoreIonicColorNames.DANGER) {
|
||||||
|
// Show grading status if one of the statuses is not done.
|
||||||
|
submission.gradingStatusTranslationId = AddonModAssign.getSubmissionGradingStatusTranslationId(
|
||||||
|
submission.gradingstatus,
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
submission.gradingStatusTranslationId = '';
|
||||||
|
}
|
||||||
|
|
||||||
|
return submission;
|
||||||
|
}),
|
||||||
|
);
|
||||||
|
|
||||||
return { items: showSubmissions };
|
return { items: showSubmissions };
|
||||||
}
|
}
|
||||||
|
@ -246,6 +247,7 @@ export type AddonModAssignSubmissionForList = AddonModAssignSubmissionFormatted
|
||||||
gradingColor?: string; // Calculated in the app. Color of the submission grading status.
|
gradingColor?: string; // Calculated in the app. Color of the submission grading status.
|
||||||
statusTranslated?: string; // Calculated in the app. Translated text of the submission status.
|
statusTranslated?: string; // Calculated in the app. Translated text of the submission status.
|
||||||
gradingStatusTranslationId?: string; // Calculated in the app. Key of the text of the submission grading status.
|
gradingStatusTranslationId?: string; // Calculated in the app. Key of the text of the submission grading status.
|
||||||
|
needsGrading?: boolean; // Calculated in the app. If submission and grading status means that it needs grading.
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -955,6 +955,10 @@ export class AddonModAssignProvider {
|
||||||
* @return Promise resolved with boolean: whether it needs to be graded or not.
|
* @return Promise resolved with boolean: whether it needs to be graded or not.
|
||||||
*/
|
*/
|
||||||
async needsSubmissionToBeGraded(submission: AddonModAssignSubmissionFormatted, assignId: number): Promise<boolean> {
|
async needsSubmissionToBeGraded(submission: AddonModAssignSubmissionFormatted, assignId: number): Promise<boolean> {
|
||||||
|
if (submission.status != AddonModAssignSubmissionStatusValues.SUBMITTED) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
if (!submission.gradingstatus) {
|
if (!submission.gradingstatus) {
|
||||||
// This should not happen, but it's better to show rather than not showing any of the submissions.
|
// This should not happen, but it's better to show rather than not showing any of the submissions.
|
||||||
return true;
|
return true;
|
||||||
|
|
Loading…
Reference in New Issue