commit
709d8bf43b
|
@ -270,10 +270,13 @@ export class AddonMessagesGroupConversationsPage implements OnInit, OnDestroy {
|
|||
async ngOnInit(): Promise<void> {
|
||||
this.route.queryParams.subscribe(async (params) => {
|
||||
// When a child page loads this callback is triggered too.
|
||||
this.selectedConversationId =
|
||||
CoreNavigator.getRouteNumberParam('conversationId', { params }) ?? this.selectedConversationId;
|
||||
this.selectedUserId =
|
||||
CoreNavigator.getRouteNumberParam('userId', { params }) ?? this.selectedUserId;
|
||||
const conversationId =CoreNavigator.getRouteNumberParam('conversationId', { params });
|
||||
const userId = CoreNavigator.getRouteNumberParam('userId', { params });
|
||||
if (conversationId || userId) {
|
||||
// Update the selected ones.
|
||||
this.selectedConversationId = conversationId;
|
||||
this.selectedUserId = userId;
|
||||
}
|
||||
});
|
||||
|
||||
await this.fetchData();
|
||||
|
|
|
@ -280,9 +280,11 @@
|
|||
</ion-item>
|
||||
</ng-container>
|
||||
|
||||
<addon-mod-assign-feedback-plugin *ngFor="let plugin of feedback!.plugins" [assign]="assign"
|
||||
[submission]="userSubmission" [userId]="submitId" [plugin]="plugin" [canEdit]="canSaveGrades">
|
||||
</addon-mod-assign-feedback-plugin>
|
||||
<ng-container *ngIf="feedback">
|
||||
<addon-mod-assign-feedback-plugin *ngFor="let plugin of feedback.plugins" [assign]="assign"
|
||||
[submission]="userSubmission" [userId]="submitId" [plugin]="plugin" [canEdit]="canSaveGrades">
|
||||
</addon-mod-assign-feedback-plugin>
|
||||
</ng-container>
|
||||
|
||||
<!-- Workflow status. -->
|
||||
<ion-item class="ion-text-wrap" *ngIf="workflowStatusTranslationId">
|
||||
|
@ -338,7 +340,7 @@
|
|||
</ion-item>
|
||||
|
||||
<!-- Grader is hidden, display only the grade date. -->
|
||||
<ion-item class="ion-text-wrap" *ngIf="!grader && feedback!.gradeddate">
|
||||
<ion-item class="ion-text-wrap" *ngIf="!grader && feedback?.gradeddate">
|
||||
<ion-label>
|
||||
<h2>{{ 'addon.mod_assign.gradedon' | translate }}</h2>
|
||||
<p>{{ feedback!.gradeddate * 1000 | coreFormatDate }}</p>
|
||||
|
|
|
@ -671,8 +671,8 @@ export class AddonModAssignSubmissionComponent implements OnInit, OnDestroy, Can
|
|||
AddonModAssign.getSubmissionGradingStatusTranslationId(this.grade.gradingStatus);
|
||||
}
|
||||
|
||||
if (this.lastAttempt?.gradingstatus == 'graded' && !this.assign!.markingworkflow) {
|
||||
if (this.feedback!.gradeddate < this.lastAttempt!.submission!.timemodified) {
|
||||
if (this.lastAttempt?.gradingstatus == 'graded' && !this.assign!.markingworkflow && this.userSubmission && feedback) {
|
||||
if (feedback.gradeddate < this.userSubmission.timemodified) {
|
||||
this.lastAttempt.gradingstatus = AddonModAssignProvider.GRADED_FOLLOWUP_SUBMIT;
|
||||
|
||||
// Get grading text and color.
|
||||
|
|
|
@ -29,6 +29,7 @@ import {
|
|||
AddonModAssignSubmission,
|
||||
AddonModAssignProvider,
|
||||
AddonModAssign,
|
||||
AddonModAssignGrade,
|
||||
} from '../../services/assign';
|
||||
import { AddonModAssignHelper, AddonModAssignSubmissionFormatted } from '../../services/assign-helper';
|
||||
import { AddonModAssignOffline } from '../../services/assign-offline';
|
||||
|
@ -252,7 +253,10 @@ export class AddonModAssignSubmissionListPage implements AfterViewInit, OnDestro
|
|||
// Get the last grade of the submission.
|
||||
const grade = grades
|
||||
.filter((grade) => grade.userid == submission.userid)
|
||||
.reduce((a, b) => (a.timemodified > b.timemodified ? a : b));
|
||||
.reduce(
|
||||
(a, b) => (a && a.timemodified > b.timemodified ? a : b),
|
||||
<AddonModAssignGrade | undefined> undefined,
|
||||
);
|
||||
|
||||
if (grade && grade.timemodified < submission.timemodified) {
|
||||
submission.gradingstatus = AddonModAssignProvider.GRADED_FOLLOWUP_SUBMIT;
|
||||
|
|
|
@ -1377,6 +1377,8 @@ export class AddonModAssignProvider {
|
|||
// The WebService returned warnings, reject.
|
||||
throw new CoreWSError(warnings[0]);
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
// WS not available, fallback to save_grade.
|
||||
|
|
|
@ -458,6 +458,11 @@ export class AddonModAssignPrefetchHandlerService extends CoreCourseActivityPref
|
|||
userIds.push(userSubmission.userid);
|
||||
}
|
||||
}
|
||||
|
||||
if (assign.teamsubmission && submission.lastattempt.submissiongroup) {
|
||||
// Prefetch group info.
|
||||
promises.push(CoreGroups.getActivityAllowedGroups(assign.cmid));
|
||||
}
|
||||
}
|
||||
|
||||
// Prefetch grade items.
|
||||
|
|
|
@ -190,7 +190,10 @@ export class AddonModLessonOfflineProvider {
|
|||
const attempts = await this.getRetakeAttemptsForPage(lessonId, retake, retakeData.lastquestionpage, siteId);
|
||||
|
||||
// Return the attempt with highest timemodified.
|
||||
return attempts.reduce((a, b) => a.timemodified > b.timemodified ? a : b);
|
||||
return attempts.reduce(
|
||||
(a, b) => a && a.timemodified > b.timemodified ? a : b,
|
||||
<AddonModLessonPageAttemptRecord | undefined> undefined,
|
||||
);
|
||||
} catch {
|
||||
// Error, return undefined.
|
||||
}
|
||||
|
|
|
@ -53,7 +53,7 @@
|
|||
[access]="access" [assessmentId]="assessmentId" [userId]="profile && profile.id" [strategy]="strategy">
|
||||
</addon-mod-workshop-assessment-strategy>
|
||||
|
||||
<form ion-list [formGroup]="evaluateForm" *ngIf="evaluating" #evaluateFormEl>
|
||||
<form [formGroup]="evaluateForm" *ngIf="evaluating" #evaluateFormEl>
|
||||
<ion-item class="ion-text-wrap">
|
||||
<ion-label><h2>{{ 'addon.mod_workshop.assessmentsettings' | translate }}</h2></ion-label>
|
||||
</ion-item>
|
||||
|
|
|
@ -13,7 +13,7 @@
|
|||
</ion-header>
|
||||
<ion-content>
|
||||
<core-loading [hideUntil]="loaded">
|
||||
<form ion-list [formGroup]="editForm" *ngIf="workshop" #editFormEl>
|
||||
<form [formGroup]="editForm" *ngIf="workshop" #editFormEl>
|
||||
<ion-item class="ion-text-wrap">
|
||||
<ion-label position="stacked">
|
||||
<span core-mark-required="true">
|
||||
|
|
|
@ -97,7 +97,7 @@
|
|||
</addon-mod-workshop-assessment>
|
||||
</ion-list>
|
||||
|
||||
<form ion-list [formGroup]="feedbackForm" *ngIf="canAddFeedback && submission" #feedbackFormEl>
|
||||
<form [formGroup]="feedbackForm" *ngIf="canAddFeedback && submission" #feedbackFormEl>
|
||||
<ion-item class="ion-text-wrap">
|
||||
<ion-label>
|
||||
<h2>{{ 'addon.mod_workshop.feedbackauthor' | translate }}</h2>
|
||||
|
|
|
@ -632,7 +632,7 @@ export class CoreCourseFormatComponent implements OnInit, OnChanges, OnDestroy {
|
|||
const completionModules = (<CoreCourseModule[]> [])
|
||||
.concat(...this.sections!.map((section) => section.modules))
|
||||
.map((module) => module.completion && module.completion > 0 ? 1 : module.completion)
|
||||
.reduce((accumulator, currentValue) => (accumulator || 0) + (currentValue || 0));
|
||||
.reduce((accumulator, currentValue) => (accumulator || 0) + (currentValue || 0), 0);
|
||||
|
||||
const moduleProgressPercent = 100 / (completionModules || 1);
|
||||
// Use min/max here to avoid floating point rounding errors over/under-flowing the progress bar.
|
||||
|
|
|
@ -52,9 +52,8 @@ export class CoreLoginHelperProvider {
|
|||
static readonly FAQ_QRCODE_IMAGE_HTML = '<img src="assets/img/login/faq_qrcode.png" role="presentation" alt="">';
|
||||
|
||||
protected logger: CoreLogger;
|
||||
protected isSSOConfirmShown = false;
|
||||
protected sessionExpiredCheckingSite: Record<string, boolean> = {};
|
||||
protected isOpenEditAlertShown = false;
|
||||
protected isOpeningReconnect = false;
|
||||
protected waitingForBrowser = false;
|
||||
|
||||
constructor() {
|
||||
|
@ -885,6 +884,12 @@ export class CoreLoginHelperProvider {
|
|||
return; // Site that triggered the event is not current site.
|
||||
}
|
||||
|
||||
if (this.sessionExpiredCheckingSite[siteId || '']) {
|
||||
return; // Operation pending.
|
||||
}
|
||||
|
||||
this.sessionExpiredCheckingSite[siteId || ''] = true;
|
||||
|
||||
try {
|
||||
// Check authentication method.
|
||||
const result = await CoreSites.checkSite(siteUrl);
|
||||
|
@ -895,9 +900,7 @@ export class CoreLoginHelperProvider {
|
|||
|
||||
if (this.isSSOLoginNeeded(result.code)) {
|
||||
// SSO. User needs to authenticate in a browser. Check if we need to display a message.
|
||||
if (!CoreApp.isSSOAuthenticationOngoing() && !this.isSSOConfirmShown && !this.waitingForBrowser) {
|
||||
this.isSSOConfirmShown = true;
|
||||
|
||||
if (!CoreApp.isSSOAuthenticationOngoing() && !this.waitingForBrowser) {
|
||||
try {
|
||||
if (this.shouldShowSSOConfirm(result.code)) {
|
||||
await CoreDomUtils.showConfirm(Translate.instant('core.login.' +
|
||||
|
@ -917,8 +920,6 @@ export class CoreLoginHelperProvider {
|
|||
} catch (error) {
|
||||
// User cancelled, logout him.
|
||||
CoreSites.logout();
|
||||
} finally {
|
||||
this.isSSOConfirmShown = false;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
|
@ -932,10 +933,8 @@ export class CoreLoginHelperProvider {
|
|||
});
|
||||
|
||||
if (providerToUse) {
|
||||
if (!CoreApp.isSSOAuthenticationOngoing() && !this.isSSOConfirmShown && !this.waitingForBrowser) {
|
||||
if (!CoreApp.isSSOAuthenticationOngoing() && !this.waitingForBrowser) {
|
||||
// Open browser to perform the OAuth.
|
||||
this.isSSOConfirmShown = true;
|
||||
|
||||
const confirmMessage = Translate.instant('core.login.' +
|
||||
(currentSite.isLoggedOut() ? 'loggedoutssodescription' : 'reconnectssodescription'));
|
||||
|
||||
|
@ -955,8 +954,6 @@ export class CoreLoginHelperProvider {
|
|||
} catch (error) {
|
||||
// User cancelled, logout him.
|
||||
CoreSites.logout();
|
||||
} finally {
|
||||
this.isSSOConfirmShown = false;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -965,14 +962,12 @@ export class CoreLoginHelperProvider {
|
|||
}
|
||||
|
||||
const info = currentSite.getInfo();
|
||||
if (typeof info != 'undefined' && typeof info.username != 'undefined' && !this.isOpeningReconnect) {
|
||||
if (typeof info != 'undefined' && typeof info.username != 'undefined') {
|
||||
// If current page is already reconnect, stop.
|
||||
if (CoreNavigator.isCurrent('/login/reconnect')) {
|
||||
return;
|
||||
}
|
||||
|
||||
this.isOpeningReconnect = true;
|
||||
|
||||
await CoreUtils.ignoreErrors(CoreNavigator.navigate('/login/reconnect', {
|
||||
params: {
|
||||
siteId,
|
||||
|
@ -981,8 +976,6 @@ export class CoreLoginHelperProvider {
|
|||
},
|
||||
reset: true,
|
||||
}));
|
||||
|
||||
this.isOpeningReconnect = false;
|
||||
}
|
||||
}
|
||||
} catch (error) {
|
||||
|
@ -992,6 +985,8 @@ export class CoreLoginHelperProvider {
|
|||
CoreDomUtils.showErrorModalDefault(error, 'core.networkerrormsg', true);
|
||||
CoreSites.logout();
|
||||
}
|
||||
} finally {
|
||||
this.sessionExpiredCheckingSite[siteId || ''] = false;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue