MOBILE-4616 assign: Move assign constants to a file

main
Pau Ferrer Ocaña 2024-07-11 16:39:55 +02:00
parent 3400d18792
commit af4e07df36
21 changed files with 150 additions and 117 deletions

View File

@ -82,4 +82,4 @@ const routes: Routes = [
AddonModAssignEditPage, AddonModAssignEditPage,
], ],
}) })
export class AddonModAssignLazyModule {} export default class AddonModAssignLazyModule {}

View File

@ -23,15 +23,15 @@ import { CorePushNotificationsDelegate } from '@features/pushnotifications/servi
import { CoreCronDelegate } from '@services/cron'; import { CoreCronDelegate } from '@services/cron';
import { CORE_SITE_SCHEMAS } from '@services/sites'; import { CORE_SITE_SCHEMAS } from '@services/sites';
import { AddonModAssignFeedbackModule } from './feedback/feedback.module'; import { AddonModAssignFeedbackModule } from './feedback/feedback.module';
import { AddonModAssignProvider } from './services/assign';
import { OFFLINE_SITE_SCHEMA } from './services/database/assign'; import { OFFLINE_SITE_SCHEMA } from './services/database/assign';
import { AddonModAssignIndexLinkHandler } from './services/handlers/index-link'; import { AddonModAssignIndexLinkHandler } from './services/handlers/index-link';
import { AddonModAssignListLinkHandler } from './services/handlers/list-link'; import { AddonModAssignListLinkHandler } from './services/handlers/list-link';
import { AddonModAssignModuleHandler, AddonModAssignModuleHandlerService } from './services/handlers/module'; import { AddonModAssignModuleHandler } from './services/handlers/module';
import { AddonModAssignPrefetchHandler } from './services/handlers/prefetch'; import { AddonModAssignPrefetchHandler } from './services/handlers/prefetch';
import { AddonModAssignPushClickHandler } from './services/handlers/push-click'; import { AddonModAssignPushClickHandler } from './services/handlers/push-click';
import { AddonModAssignSyncCronHandler } from './services/handlers/sync-cron'; import { AddonModAssignSyncCronHandler } from './services/handlers/sync-cron';
import { AddonModAssignSubmissionModule } from './submission/submission.module'; import { AddonModAssignSubmissionModule } from './submission/submission.module';
import { ADDON_MOD_ASSIGN_COMPONENT, ADDON_MOD_ASSIGN_PAGE_NAME } from './constants';
/** /**
* Get mod assign services. * Get mod assign services.
@ -69,8 +69,8 @@ export async function getModAssignComponentModules(): Promise<unknown[]> {
const routes: Routes = [ const routes: Routes = [
{ {
path: AddonModAssignModuleHandlerService.PAGE_NAME, path: ADDON_MOD_ASSIGN_PAGE_NAME,
loadChildren: () => import('./assign-lazy.module').then(m => m.AddonModAssignLazyModule), loadChildren: () => import('./assign-lazy.module'),
}, },
]; ];
@ -97,7 +97,7 @@ const routes: Routes = [
CoreCronDelegate.register(AddonModAssignSyncCronHandler.instance); CoreCronDelegate.register(AddonModAssignSyncCronHandler.instance);
CorePushNotificationsDelegate.registerClickHandler(AddonModAssignPushClickHandler.instance); CorePushNotificationsDelegate.registerClickHandler(AddonModAssignPushClickHandler.instance);
CoreCourseHelper.registerModuleReminderClick(AddonModAssignProvider.COMPONENT); CoreCourseHelper.registerModuleReminderClick(ADDON_MOD_ASSIGN_COMPONENT);
}, },
}, },
], ],

View File

@ -29,7 +29,8 @@ import {
} from '../services/assign'; } from '../services/assign';
import { AddonModAssignHelper, AddonModAssignSubmissionFormatted } from '../services/assign-helper'; import { AddonModAssignHelper, AddonModAssignSubmissionFormatted } from '../services/assign-helper';
import { AddonModAssignOffline } from '../services/assign-offline'; import { AddonModAssignOffline } from '../services/assign-offline';
import { AddonModAssignSync, AddonModAssignSyncProvider } from '../services/assign-sync'; import { AddonModAssignSync } from '../services/assign-sync';
import { ADDON_MOD_ASSIGN_MANUAL_SYNCED } from '../constants';
/** /**
* Provides a collection of assignment submissions. * Provides a collection of assignment submissions.
@ -116,7 +117,7 @@ export class AddonModAssignSubmissionsSource extends CoreRoutedItemsManagerSourc
if (result && result.updated) { if (result && result.updated) {
CoreEvents.trigger( CoreEvents.trigger(
AddonModAssignSyncProvider.MANUAL_SYNCED, ADDON_MOD_ASSIGN_MANUAL_SYNCED,
{ {
assignId: this.assign.id, assignId: this.assign.id,
warnings: result.warnings, warnings: result.warnings,

View File

@ -20,11 +20,11 @@ import {
AddonModAssignAssign, AddonModAssignAssign,
AddonModAssignSubmission, AddonModAssignSubmission,
AddonModAssignPlugin, AddonModAssignPlugin,
AddonModAssignProvider,
AddonModAssign, AddonModAssign,
} from '../../services/assign'; } from '../../services/assign';
import { AddonModAssignHelper, AddonModAssignPluginConfig } from '../../services/assign-helper'; import { AddonModAssignHelper, AddonModAssignPluginConfig } from '../../services/assign-helper';
import { AddonModAssignFeedbackDelegate } from '../../services/feedback-delegate'; import { AddonModAssignFeedbackDelegate } from '../../services/feedback-delegate';
import { ADDON_MOD_ASSIGN_COMPONENT } from '../../constants';
/** /**
* Component that displays an assignment feedback plugin. * Component that displays an assignment feedback plugin.
@ -48,7 +48,7 @@ export class AddonModAssignFeedbackPluginComponent implements OnInit {
data?: AddonModAssignFeedbackPluginData; // Data to pass to the component. data?: AddonModAssignFeedbackPluginData; // Data to pass to the component.
// Data to render the plugin if it isn't supported. // Data to render the plugin if it isn't supported.
component = AddonModAssignProvider.COMPONENT; component = ADDON_MOD_ASSIGN_COMPONENT;
text = ''; text = '';
files: CoreWSFile[] = []; files: CoreWSFile[] = [];
notSupported = false; notSupported = false;

View File

@ -32,18 +32,26 @@ import { AddonModAssignListFilterName } from '../../classes/submissions-source';
import { import {
AddonModAssign, AddonModAssign,
AddonModAssignAssign, AddonModAssignAssign,
AddonModAssignProvider,
AddonModAssignSubmissionGradingSummary, AddonModAssignSubmissionGradingSummary,
} from '../../services/assign'; } from '../../services/assign';
import { AddonModAssignOffline } from '../../services/assign-offline'; import { AddonModAssignOffline } from '../../services/assign-offline';
import { import {
AddonModAssignAutoSyncData, AddonModAssignAutoSyncData,
AddonModAssignSync, AddonModAssignSync,
AddonModAssignSyncProvider,
AddonModAssignSyncResult, AddonModAssignSyncResult,
} from '../../services/assign-sync'; } from '../../services/assign-sync';
import { AddonModAssignModuleHandlerService } from '../../services/handlers/module';
import { AddonModAssignSubmissionComponent } from '../submission/submission'; import { AddonModAssignSubmissionComponent } from '../submission/submission';
import {
ADDON_MOD_ASSIGN_AUTO_SYNCED,
ADDON_MOD_ASSIGN_COMPONENT,
ADDON_MOD_ASSIGN_GRADED_EVENT,
ADDON_MOD_ASSIGN_PAGE_NAME,
ADDON_MOD_ASSIGN_STARTED_EVENT,
ADDON_MOD_ASSIGN_SUBMISSION_SAVED_EVENT,
ADDON_MOD_ASSIGN_SUBMITTED_FOR_GRADING_EVENT,
ADDON_MOD_ASSIGN_WARN_GROUPS_OPTIONAL,
ADDON_MOD_ASSIGN_WARN_GROUPS_REQUIRED,
} from '../../constants';
/** /**
* Component that displays an assignment. * Component that displays an assignment.
@ -56,7 +64,7 @@ export class AddonModAssignIndexComponent extends CoreCourseModuleMainActivityCo
@ViewChild(AddonModAssignSubmissionComponent) submissionComponent?: AddonModAssignSubmissionComponent; @ViewChild(AddonModAssignSubmissionComponent) submissionComponent?: AddonModAssignSubmissionComponent;
component = AddonModAssignProvider.COMPONENT; component = ADDON_MOD_ASSIGN_COMPONENT;
pluginName = 'assign'; pluginName = 'assign';
assign?: AddonModAssignAssign; // The assign object. assign?: AddonModAssignAssign; // The assign object.
@ -82,7 +90,7 @@ export class AddonModAssignIndexComponent extends CoreCourseModuleMainActivityCo
protected currentUserId!: number; // Current user ID. protected currentUserId!: number; // Current user ID.
protected currentSite!: CoreSite; // Current site. protected currentSite!: CoreSite; // Current site.
protected syncEventName = AddonModAssignSyncProvider.AUTO_SYNCED; protected syncEventName = ADDON_MOD_ASSIGN_AUTO_SYNCED;
// Observers. // Observers.
protected savedObserver?: CoreEventObserver; protected savedObserver?: CoreEventObserver;
@ -108,7 +116,7 @@ export class AddonModAssignIndexComponent extends CoreCourseModuleMainActivityCo
// Listen to events. // Listen to events.
this.savedObserver = CoreEvents.on( this.savedObserver = CoreEvents.on(
AddonModAssignProvider.SUBMISSION_SAVED_EVENT, ADDON_MOD_ASSIGN_SUBMISSION_SAVED_EVENT,
(data) => { (data) => {
if (this.assign && data.assignmentId == this.assign.id && data.userId == this.currentUserId) { if (this.assign && data.assignmentId == this.assign.id && data.userId == this.currentUserId) {
// Assignment submission saved, refresh data. // Assignment submission saved, refresh data.
@ -119,7 +127,7 @@ export class AddonModAssignIndexComponent extends CoreCourseModuleMainActivityCo
); );
this.submittedObserver = CoreEvents.on( this.submittedObserver = CoreEvents.on(
AddonModAssignProvider.SUBMITTED_FOR_GRADING_EVENT, ADDON_MOD_ASSIGN_SUBMITTED_FOR_GRADING_EVENT,
(data) => { (data) => {
if (this.assign && data.assignmentId == this.assign.id && data.userId == this.currentUserId) { if (this.assign && data.assignmentId == this.assign.id && data.userId == this.currentUserId) {
// Assignment submitted, check completion. // Assignment submitted, check completion.
@ -132,14 +140,14 @@ export class AddonModAssignIndexComponent extends CoreCourseModuleMainActivityCo
this.siteId, this.siteId,
); );
this.gradedObserver = CoreEvents.on(AddonModAssignProvider.GRADED_EVENT, (data) => { this.gradedObserver = CoreEvents.on(ADDON_MOD_ASSIGN_GRADED_EVENT, (data) => {
if (this.assign && data.assignmentId == this.assign.id && data.userId == this.currentUserId) { if (this.assign && data.assignmentId == this.assign.id && data.userId == this.currentUserId) {
// Assignment graded, refresh data. // Assignment graded, refresh data.
this.showLoadingAndRefresh(true, false); this.showLoadingAndRefresh(true, false);
} }
}, this.siteId); }, this.siteId);
this.startedObserver = CoreEvents.on(AddonModAssignProvider.STARTED_EVENT, (data) => { this.startedObserver = CoreEvents.on(ADDON_MOD_ASSIGN_STARTED_EVENT, (data) => {
if (this.assign && data.assignmentId == this.assign.id) { if (this.assign && data.assignmentId == this.assign.id) {
// Assignment submission started, refresh data. // Assignment submission started, refresh data.
this.showLoadingAndRefresh(false, false); this.showLoadingAndRefresh(false, false);
@ -276,10 +284,10 @@ export class AddonModAssignIndexComponent extends CoreCourseModuleMainActivityCo
this.summary.warnofungroupedusers = 'ungroupedusers'; this.summary.warnofungroupedusers = 'ungroupedusers';
} else { } else {
switch (this.summary.warnofungroupedusers) { switch (this.summary.warnofungroupedusers) {
case AddonModAssignProvider.WARN_GROUPS_REQUIRED: case ADDON_MOD_ASSIGN_WARN_GROUPS_REQUIRED:
this.summary.warnofungroupedusers = 'ungroupedusers'; this.summary.warnofungroupedusers = 'ungroupedusers';
break; break;
case AddonModAssignProvider.WARN_GROUPS_OPTIONAL: case ADDON_MOD_ASSIGN_WARN_GROUPS_OPTIONAL:
this.summary.warnofungroupedusers = 'ungroupedusersoptional'; this.summary.warnofungroupedusers = 'ungroupedusersoptional';
break; break;
default: default:
@ -311,7 +319,7 @@ export class AddonModAssignIndexComponent extends CoreCourseModuleMainActivityCo
} }
CoreNavigator.navigateToSitePath( CoreNavigator.navigateToSitePath(
AddonModAssignModuleHandlerService.PAGE_NAME + `/${this.courseId}/${this.module.id}/submission`, ADDON_MOD_ASSIGN_PAGE_NAME + `/${this.courseId}/${this.module.id}/submission`,
{ {
params, params,
}, },

View File

@ -18,13 +18,13 @@ import {
AddonModAssignAssign, AddonModAssignAssign,
AddonModAssignSubmission, AddonModAssignSubmission,
AddonModAssignPlugin, AddonModAssignPlugin,
AddonModAssignProvider,
AddonModAssign, AddonModAssign,
} from '../../services/assign'; } from '../../services/assign';
import { AddonModAssignHelper, AddonModAssignPluginConfig } from '../../services/assign-helper'; import { AddonModAssignHelper, AddonModAssignPluginConfig } from '../../services/assign-helper';
import { AddonModAssignSubmissionDelegate } from '../../services/submission-delegate'; import { AddonModAssignSubmissionDelegate } from '../../services/submission-delegate';
import { CoreFileEntry } from '@services/file-helper'; import { CoreFileEntry } from '@services/file-helper';
import type { AddonModAssignSubmissionPluginBaseComponent } from '@addons/mod/assign/classes/base-submission-plugin-component'; import type { AddonModAssignSubmissionPluginBaseComponent } from '@addons/mod/assign/classes/base-submission-plugin-component';
import { ADDON_MOD_ASSIGN_COMPONENT } from '../../constants';
/** /**
* Component that displays an assignment submission plugin. * Component that displays an assignment submission plugin.
@ -47,7 +47,7 @@ export class AddonModAssignSubmissionPluginComponent implements OnInit {
data?: AddonModAssignSubmissionPluginData; // Data to pass to the component. data?: AddonModAssignSubmissionPluginData; // Data to pass to the component.
// Data to render the plugin if it isn't supported. // Data to render the plugin if it isn't supported.
component = AddonModAssignProvider.COMPONENT; component = ADDON_MOD_ASSIGN_COMPONENT;
text = ''; text = '';
files: CoreFileEntry[] = []; files: CoreFileEntry[] = [];
notSupported = false; notSupported = false;

View File

@ -16,7 +16,6 @@ import { Component, Input, OnInit, OnDestroy, ViewChild, Optional, ViewChildren,
import { CoreEvents, CoreEventObserver } from '@singletons/events'; import { CoreEvents, CoreEventObserver } from '@singletons/events';
import { CoreSites } from '@services/sites'; import { CoreSites } from '@services/sites';
import { import {
AddonModAssignProvider,
AddonModAssignAssign, AddonModAssignAssign,
AddonModAssignSubmissionFeedback, AddonModAssignSubmissionFeedback,
AddonModAssignSubmissionAttempt, AddonModAssignSubmissionAttempt,
@ -33,7 +32,6 @@ import {
AddonModAssignAutoSyncData, AddonModAssignAutoSyncData,
AddonModAssignManualSyncData, AddonModAssignManualSyncData,
AddonModAssignSync, AddonModAssignSync,
AddonModAssignSyncProvider,
} from '../../services/assign-sync'; } from '../../services/assign-sync';
import { CoreTabsComponent } from '@components/tabs/tabs'; import { CoreTabsComponent } from '@components/tabs/tabs';
import { CoreTabComponent } from '@components/tabs/tab'; import { CoreTabComponent } from '@components/tabs/tab';
@ -56,11 +54,19 @@ import { CoreError } from '@classes/errors/error';
import { CoreGroups } from '@services/groups'; import { CoreGroups } from '@services/groups';
import { CoreSync } from '@services/sync'; import { CoreSync } from '@services/sync';
import { AddonModAssignSubmissionPluginComponent } from '../submission-plugin/submission-plugin'; import { AddonModAssignSubmissionPluginComponent } from '../submission-plugin/submission-plugin';
import { AddonModAssignModuleHandlerService } from '../../services/handlers/module';
import { CanLeave } from '@guards/can-leave'; import { CanLeave } from '@guards/can-leave';
import { CoreTime } from '@singletons/time'; import { CoreTime } from '@singletons/time';
import { isSafeNumber, SafeNumber } from '@/core/utils/types'; import { isSafeNumber, SafeNumber } from '@/core/utils/types';
import { CoreIonicColorNames } from '@singletons/colors'; import { CoreIonicColorNames } from '@singletons/colors';
import {
ADDON_MOD_ASSIGN_AUTO_SYNCED,
ADDON_MOD_ASSIGN_COMPONENT,
ADDON_MOD_ASSIGN_GRADED_EVENT,
ADDON_MOD_ASSIGN_MANUAL_SYNCED,
ADDON_MOD_ASSIGN_PAGE_NAME,
ADDON_MOD_ASSIGN_SUBMITTED_FOR_GRADING_EVENT,
ADDON_MOD_ASSIGN_UNLIMITED_ATTEMPTS,
} from '../../constants';
/** /**
* Component that displays an assignment submission. * Component that displays an assignment submission.
@ -137,7 +143,7 @@ export class AddonModAssignSubmissionComponent implements OnInit, OnDestroy, Can
statusNew = AddonModAssignSubmissionStatusValues.NEW; statusNew = AddonModAssignSubmissionStatusValues.NEW;
statusReopened = AddonModAssignSubmissionStatusValues.REOPENED; statusReopened = AddonModAssignSubmissionStatusValues.REOPENED;
attemptReopenMethodNone = AddonModAssignAttemptReopenMethodValues.NONE; attemptReopenMethodNone = AddonModAssignAttemptReopenMethodValues.NONE;
unlimitedAttempts = AddonModAssignProvider.UNLIMITED_ATTEMPTS; unlimitedAttempts = ADDON_MOD_ASSIGN_UNLIMITED_ATTEMPTS;
protected siteId: string; // Current site ID. protected siteId: string; // Current site ID.
protected currentUserId: number; // Current user ID. protected currentUserId: number; // Current user ID.
@ -161,7 +167,7 @@ export class AddonModAssignSubmissionComponent implements OnInit, OnDestroy, Can
this.maxAttemptsText = Translate.instant('addon.mod_assign.unlimitedattempts'); this.maxAttemptsText = Translate.instant('addon.mod_assign.unlimitedattempts');
// Refresh data if this assign is synchronized and it's grading. // Refresh data if this assign is synchronized and it's grading.
const events = [AddonModAssignSyncProvider.AUTO_SYNCED, AddonModAssignSyncProvider.MANUAL_SYNCED]; const events = [ADDON_MOD_ASSIGN_AUTO_SYNCED, ADDON_MOD_ASSIGN_MANUAL_SYNCED];
this.syncObserver = CoreEvents.onMultiple<AddonModAssignAutoSyncData | AddonModAssignManualSyncData>( this.syncObserver = CoreEvents.onMultiple<AddonModAssignAutoSyncData | AddonModAssignManualSyncData>(
events, events,
async (data) => { async (data) => {
@ -341,7 +347,7 @@ export class AddonModAssignSubmissionComponent implements OnInit, OnDestroy, Can
if (!this.assign.submissiondrafts && this.userSubmission) { if (!this.assign.submissiondrafts && this.userSubmission) {
// No drafts allowed, so it was submitted. Trigger event. // No drafts allowed, so it was submitted. Trigger event.
CoreEvents.trigger(AddonModAssignProvider.SUBMITTED_FOR_GRADING_EVENT, { CoreEvents.trigger(ADDON_MOD_ASSIGN_SUBMITTED_FOR_GRADING_EVENT, {
assignmentId: this.assign.id, assignmentId: this.assign.id,
submissionId: this.userSubmission.id, submissionId: this.userSubmission.id,
userId: this.currentUserId, userId: this.currentUserId,
@ -389,7 +395,7 @@ export class AddonModAssignSubmissionComponent implements OnInit, OnDestroy, Can
} }
CoreNavigator.navigateToSitePath( CoreNavigator.navigateToSitePath(
AddonModAssignModuleHandlerService.PAGE_NAME + '/' + this.courseId + '/' + this.moduleId + '/edit', ADDON_MOD_ASSIGN_PAGE_NAME + '/' + this.courseId + '/' + this.moduleId + '/edit',
{ {
params: { params: {
blindId: this.blindId, blindId: this.blindId,
@ -528,7 +534,7 @@ export class AddonModAssignSubmissionComponent implements OnInit, OnDestroy, Can
const result = await AddonModAssignSync.syncAssign(this.assign.id); const result = await AddonModAssignSync.syncAssign(this.assign.id);
if (result && result.updated) { if (result && result.updated) {
CoreEvents.trigger(AddonModAssignSyncProvider.MANUAL_SYNCED, { CoreEvents.trigger(ADDON_MOD_ASSIGN_MANUAL_SYNCED, {
assignId: this.assign.id, assignId: this.assign.id,
warnings: result.warnings, warnings: result.warnings,
gradesBlocked: result.gradesBlocked, gradesBlocked: result.gradesBlocked,
@ -703,7 +709,7 @@ export class AddonModAssignSubmissionComponent implements OnInit, OnDestroy, Can
await this.treatGradeInfo(assign); await this.treatGradeInfo(assign);
const isManual = assign.attemptreopenmethod == AddonModAssignAttemptReopenMethodValues.MANUAL; const isManual = assign.attemptreopenmethod == AddonModAssignAttemptReopenMethodValues.MANUAL;
const isUnlimited = assign.maxattempts == AddonModAssignProvider.UNLIMITED_ATTEMPTS; const isUnlimited = assign.maxattempts == ADDON_MOD_ASSIGN_UNLIMITED_ATTEMPTS;
const isLessThanMaxAttempts = !!this.userSubmission && (this.userSubmission.attemptnumber < (assign.maxattempts - 1)); const isLessThanMaxAttempts = !!this.userSubmission && (this.userSubmission.attemptnumber < (assign.maxattempts - 1));
this.allowAddAttempt = isManual && (!this.userSubmission || isUnlimited || isLessThanMaxAttempts); this.allowAddAttempt = isManual && (!this.userSubmission || isUnlimited || isLessThanMaxAttempts);
@ -864,7 +870,7 @@ export class AddonModAssignSubmissionComponent implements OnInit, OnDestroy, Can
Translate.instant('core.grades.grade'), Translate.instant('core.grades.grade'),
this.feedback.gradefordisplay, this.feedback.gradefordisplay,
{ {
component: AddonModAssignProvider.COMPONENT, component: ADDON_MOD_ASSIGN_COMPONENT,
componentId: this.moduleId, componentId: this.moduleId,
}, },
); );
@ -903,7 +909,7 @@ export class AddonModAssignSubmissionComponent implements OnInit, OnDestroy, Can
); );
// Submitted, trigger event. // Submitted, trigger event.
CoreEvents.trigger(AddonModAssignProvider.SUBMITTED_FOR_GRADING_EVENT, { CoreEvents.trigger(ADDON_MOD_ASSIGN_SUBMITTED_FOR_GRADING_EVENT, {
assignmentId: this.assign.id, assignmentId: this.assign.id,
submissionId: this.userSubmission.id, submissionId: this.userSubmission.id,
userId: this.currentUserId, userId: this.currentUserId,
@ -977,7 +983,7 @@ export class AddonModAssignSubmissionComponent implements OnInit, OnDestroy, Can
// Invalidate and refresh data. // Invalidate and refresh data.
this.invalidateAndRefresh(true); this.invalidateAndRefresh(true);
CoreEvents.trigger(AddonModAssignProvider.GRADED_EVENT, { CoreEvents.trigger(ADDON_MOD_ASSIGN_GRADED_EVENT, {
assignmentId: this.assign.id, assignmentId: this.assign.id,
submissionId: this.submitId, submissionId: this.submitId,
userId: this.currentUserId, userId: this.currentUserId,
@ -1228,9 +1234,9 @@ export class AddonModAssignSubmissionComponent implements OnInit, OnDestroy, Can
const syncId = AddonModAssignSync.getGradeSyncId(this.assign.id, this.submitId); const syncId = AddonModAssignSync.getGradeSyncId(this.assign.id, this.submitId);
if (block) { if (block) {
CoreSync.blockOperation(AddonModAssignProvider.COMPONENT, syncId); CoreSync.blockOperation(ADDON_MOD_ASSIGN_COMPONENT, syncId);
} else { } else {
CoreSync.unblockOperation(AddonModAssignProvider.COMPONENT, syncId); CoreSync.unblockOperation(ADDON_MOD_ASSIGN_COMPONENT, syncId);
} }
} }

View File

@ -13,3 +13,20 @@
// limitations under the License. // limitations under the License.
export const ADDON_MOD_ASSIGN_FEATURE_NAME = 'CoreCourseModuleDelegate_AddonModAssign'; export const ADDON_MOD_ASSIGN_FEATURE_NAME = 'CoreCourseModuleDelegate_AddonModAssign';
export const ADDON_MOD_ASSIGN_COMPONENT = 'mmaModAssign';
export const ADDON_MOD_ASSIGN_PAGE_NAME = 'mod_assign';
export const ADDON_MOD_ASSIGN_UNLIMITED_ATTEMPTS = -1;
// Group submissions warnings.
export const ADDON_MOD_ASSIGN_WARN_GROUPS_REQUIRED = 'warnrequired';
export const ADDON_MOD_ASSIGN_WARN_GROUPS_OPTIONAL = 'warnoptional';
// Events.
export const ADDON_MOD_ASSIGN_SUBMISSION_SAVED_EVENT = 'addon_mod_assign_submission_saved';
export const ADDON_MOD_ASSIGN_SUBMITTED_FOR_GRADING_EVENT = 'addon_mod_assign_submitted_for_grading';
export const ADDON_MOD_ASSIGN_GRADED_EVENT = 'addon_mod_assign_graded';
export const ADDON_MOD_ASSIGN_STARTED_EVENT = 'addon_mod_assign_started';
export const ADDON_MOD_ASSIGN_AUTO_SYNCED = 'addon_mod_assign_autom_synced';
export const ADDON_MOD_ASSIGN_MANUAL_SYNCED = 'addon_mod_assign_manual_synced';

View File

@ -14,7 +14,7 @@
import { Component, OnInit, ElementRef } from '@angular/core'; import { Component, OnInit, ElementRef } from '@angular/core';
import { FormBuilder, FormControl } from '@angular/forms'; import { FormBuilder, FormControl } from '@angular/forms';
import { AddonModAssign, AddonModAssignProvider } from '@addons/mod/assign/services/assign'; import { AddonModAssign } from '@addons/mod/assign/services/assign';
import { CoreTextUtils } from '@services/utils/text'; import { CoreTextUtils } from '@services/utils/text';
import { import {
AddonModAssignFeedbackCommentsDraftData, AddonModAssignFeedbackCommentsDraftData,
@ -26,6 +26,7 @@ import { AddonModAssignOffline } from '@addons/mod/assign/services/assign-offlin
import { CoreUtils } from '@services/utils/utils'; import { CoreUtils } from '@services/utils/utils';
import { AddonModAssignFeedbackPluginBaseComponent } from '@addons/mod/assign/classes/base-feedback-plugin-component'; import { AddonModAssignFeedbackPluginBaseComponent } from '@addons/mod/assign/classes/base-feedback-plugin-component';
import { ContextLevel } from '@/core/constants'; import { ContextLevel } from '@/core/constants';
import { ADDON_MOD_ASSIGN_COMPONENT } from '@addons/mod/assign/constants';
/** /**
* Component to render a comments feedback plugin. * Component to render a comments feedback plugin.
*/ */
@ -36,7 +37,7 @@ import { ContextLevel } from '@/core/constants';
export class AddonModAssignFeedbackCommentsComponent extends AddonModAssignFeedbackPluginBaseComponent implements OnInit { export class AddonModAssignFeedbackCommentsComponent extends AddonModAssignFeedbackPluginBaseComponent implements OnInit {
control?: FormControl<string>; control?: FormControl<string>;
component = AddonModAssignProvider.COMPONENT; component = ADDON_MOD_ASSIGN_COMPONENT;
text = ''; text = '';
isSent = false; isSent = false;
loaded = false; loaded = false;

View File

@ -13,7 +13,8 @@
// limitations under the License. // limitations under the License.
import { AddonModAssignFeedbackPluginBaseComponent } from '@addons/mod/assign/classes/base-feedback-plugin-component'; import { AddonModAssignFeedbackPluginBaseComponent } from '@addons/mod/assign/classes/base-feedback-plugin-component';
import { AddonModAssignProvider, AddonModAssign } from '@addons/mod/assign/services/assign'; import { ADDON_MOD_ASSIGN_COMPONENT } from '@addons/mod/assign/constants';
import { AddonModAssign } from '@addons/mod/assign/services/assign';
import { Component, OnInit } from '@angular/core'; import { Component, OnInit } from '@angular/core';
import { CoreWSFile } from '@services/ws'; import { CoreWSFile } from '@services/ws';
@ -26,7 +27,7 @@ import { CoreWSFile } from '@services/ws';
}) })
export class AddonModAssignFeedbackEditPdfComponent extends AddonModAssignFeedbackPluginBaseComponent implements OnInit { export class AddonModAssignFeedbackEditPdfComponent extends AddonModAssignFeedbackPluginBaseComponent implements OnInit {
component = AddonModAssignProvider.COMPONENT; component = ADDON_MOD_ASSIGN_COMPONENT;
files: CoreWSFile[] = []; files: CoreWSFile[] = [];
/** /**

View File

@ -13,7 +13,8 @@
// limitations under the License. // limitations under the License.
import { AddonModAssignFeedbackPluginBaseComponent } from '@addons/mod/assign/classes/base-feedback-plugin-component'; import { AddonModAssignFeedbackPluginBaseComponent } from '@addons/mod/assign/classes/base-feedback-plugin-component';
import { AddonModAssign, AddonModAssignProvider } from '@addons/mod/assign/services/assign'; import { ADDON_MOD_ASSIGN_COMPONENT } from '@addons/mod/assign/constants';
import { AddonModAssign } from '@addons/mod/assign/services/assign';
import { Component, OnInit } from '@angular/core'; import { Component, OnInit } from '@angular/core';
import { CoreWSFile } from '@services/ws'; import { CoreWSFile } from '@services/ws';
@ -26,7 +27,7 @@ import { CoreWSFile } from '@services/ws';
}) })
export class AddonModAssignFeedbackFileComponent extends AddonModAssignFeedbackPluginBaseComponent implements OnInit { export class AddonModAssignFeedbackFileComponent extends AddonModAssignFeedbackPluginBaseComponent implements OnInit {
component = AddonModAssignProvider.COMPONENT; component = ADDON_MOD_ASSIGN_COMPONENT;
files: CoreWSFile[] = []; files: CoreWSFile[] = [];
/** /**

View File

@ -27,7 +27,6 @@ import { CoreEvents } from '@singletons/events';
import { import {
AddonModAssignAssign, AddonModAssignAssign,
AddonModAssignSubmission, AddonModAssignSubmission,
AddonModAssignProvider,
AddonModAssign, AddonModAssign,
AddonModAssignSubmissionStatusOptions, AddonModAssignSubmissionStatusOptions,
AddonModAssignGetSubmissionStatusWSResponse, AddonModAssignGetSubmissionStatusWSResponse,
@ -40,6 +39,12 @@ import { AddonModAssignSync } from '../../services/assign-sync';
import { CoreUtils } from '@services/utils/utils'; import { CoreUtils } from '@services/utils/utils';
import { CoreWSExternalFile } from '@services/ws'; import { CoreWSExternalFile } from '@services/ws';
import { CoreAnalytics, CoreAnalyticsEventType } from '@services/analytics'; import { CoreAnalytics, CoreAnalyticsEventType } from '@services/analytics';
import {
ADDON_MOD_ASSIGN_COMPONENT,
ADDON_MOD_ASSIGN_STARTED_EVENT,
ADDON_MOD_ASSIGN_SUBMISSION_SAVED_EVENT,
ADDON_MOD_ASSIGN_SUBMITTED_FOR_GRADING_EVENT,
} from '../../constants';
/** /**
* Page that allows adding or editing an assigment submission. * Page that allows adding or editing an assigment submission.
@ -65,7 +70,7 @@ export class AddonModAssignEditPage implements OnInit, OnDestroy, CanLeave {
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. activityInstructions?: string; // Activity instructions.
introAttachments?: CoreWSExternalFile[]; // Intro attachments. introAttachments?: CoreWSExternalFile[]; // Intro attachments.
component = AddonModAssignProvider.COMPONENT; component = ADDON_MOD_ASSIGN_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.
@ -144,7 +149,7 @@ export class AddonModAssignEditPage implements OnInit, OnDestroy, CanLeave {
if (!this.isDestroyed) { if (!this.isDestroyed) {
// Block the assignment. // Block the assignment.
CoreSync.blockOperation(AddonModAssignProvider.COMPONENT, this.assign.id); CoreSync.blockOperation(ADDON_MOD_ASSIGN_COMPONENT, this.assign.id);
} }
// Wait for sync to be over (if any). // Wait for sync to be over (if any).
@ -276,7 +281,7 @@ export class AddonModAssignEditPage implements OnInit, OnDestroy, CanLeave {
await AddonModAssign.startSubmission(this.assign.id); await AddonModAssign.startSubmission(this.assign.id);
CoreEvents.trigger(AddonModAssignProvider.STARTED_EVENT, { CoreEvents.trigger(ADDON_MOD_ASSIGN_STARTED_EVENT, {
assignmentId: this.assign.id, assignmentId: this.assign.id,
}, CoreSites.getCurrentSiteId()); }, CoreSites.getCurrentSiteId());
@ -453,7 +458,7 @@ export class AddonModAssignEditPage implements OnInit, OnDestroy, CanLeave {
CoreForms.triggerFormSubmittedEvent(this.formElement, sent, CoreSites.getCurrentSiteId()); CoreForms.triggerFormSubmittedEvent(this.formElement, sent, CoreSites.getCurrentSiteId());
CoreEvents.trigger( CoreEvents.trigger(
AddonModAssignProvider.SUBMISSION_SAVED_EVENT, ADDON_MOD_ASSIGN_SUBMISSION_SAVED_EVENT,
{ {
assignmentId: this.assign!.id, assignmentId: this.assign!.id,
submissionId: this.userSubmission!.id, submissionId: this.userSubmission!.id,
@ -465,7 +470,7 @@ export class AddonModAssignEditPage implements OnInit, OnDestroy, CanLeave {
if (!this.assign!.submissiondrafts) { if (!this.assign!.submissiondrafts) {
// No drafts allowed, so it was submitted. Trigger event. // No drafts allowed, so it was submitted. Trigger event.
CoreEvents.trigger( CoreEvents.trigger(
AddonModAssignProvider.SUBMITTED_FOR_GRADING_EVENT, ADDON_MOD_ASSIGN_SUBMITTED_FOR_GRADING_EVENT,
{ {
assignmentId: this.assign!.id, assignmentId: this.assign!.id,
submissionId: this.userSubmission!.id, submissionId: this.userSubmission!.id,
@ -500,7 +505,7 @@ export class AddonModAssignEditPage implements OnInit, OnDestroy, CanLeave {
// Unblock the assignment. // Unblock the assignment.
if (this.assign) { if (this.assign) {
CoreSync.unblockOperation(AddonModAssignProvider.COMPONENT, this.assign.id); CoreSync.unblockOperation(ADDON_MOD_ASSIGN_COMPONENT, this.assign.id);
} }
} }

View File

@ -27,13 +27,13 @@ import {
AddonModAssignSubmissionForList, AddonModAssignSubmissionForList,
AddonModAssignSubmissionsSource, AddonModAssignSubmissionsSource,
} from '../../classes/submissions-source'; } from '../../classes/submissions-source';
import { AddonModAssignAssign, AddonModAssignProvider } from '../../services/assign'; import { AddonModAssignAssign } from '../../services/assign';
import { import {
AddonModAssignSyncProvider,
AddonModAssignManualSyncData, AddonModAssignManualSyncData,
AddonModAssignAutoSyncData, AddonModAssignAutoSyncData,
} from '../../services/assign-sync'; } from '../../services/assign-sync';
import { CoreAnalytics, CoreAnalyticsEventType } from '@services/analytics'; import { CoreAnalytics, CoreAnalyticsEventType } from '@services/analytics';
import { ADDON_MOD_ASSIGN_AUTO_SYNCED, ADDON_MOD_ASSIGN_GRADED_EVENT, ADDON_MOD_ASSIGN_MANUAL_SYNCED } from '../../constants';
/** /**
* Page that displays a list of submissions of an assignment. * Page that displays a list of submissions of an assignment.
@ -56,7 +56,7 @@ export class AddonModAssignSubmissionListPage implements AfterViewInit, OnDestro
constructor() { constructor() {
// Update data if some grade changes. // Update data if some grade changes.
this.gradedObserver = CoreEvents.on( this.gradedObserver = CoreEvents.on(
AddonModAssignProvider.GRADED_EVENT, ADDON_MOD_ASSIGN_GRADED_EVENT,
(data) => { (data) => {
if ( if (
this.submissions.loaded && this.submissions.loaded &&
@ -72,7 +72,7 @@ export class AddonModAssignSubmissionListPage implements AfterViewInit, OnDestro
); );
// Refresh data if this assign is synchronized. // Refresh data if this assign is synchronized.
const events = [AddonModAssignSyncProvider.AUTO_SYNCED, AddonModAssignSyncProvider.MANUAL_SYNCED]; const events = [ADDON_MOD_ASSIGN_AUTO_SYNCED, ADDON_MOD_ASSIGN_MANUAL_SYNCED];
this.syncObserver = CoreEvents.onMultiple<AddonModAssignAutoSyncData | AddonModAssignManualSyncData>( this.syncObserver = CoreEvents.onMultiple<AddonModAssignAutoSyncData | AddonModAssignManualSyncData>(
events, events,
(data) => { (data) => {

View File

@ -17,7 +17,6 @@ import { CoreFileUploader, CoreFileUploaderStoreFilesResult } from '@features/fi
import { CoreSites, CoreSitesCommonWSOptions } from '@services/sites'; import { CoreSites, CoreSitesCommonWSOptions } from '@services/sites';
import { FileEntry, DirectoryEntry } from '@awesome-cordova-plugins/file/ngx'; import { FileEntry, DirectoryEntry } from '@awesome-cordova-plugins/file/ngx';
import { import {
AddonModAssignProvider,
AddonModAssignAssign, AddonModAssignAssign,
AddonModAssignSubmission, AddonModAssignSubmission,
AddonModAssignParticipant, AddonModAssignParticipant,
@ -37,6 +36,7 @@ import { AddonModAssignFeedbackDelegate } from './feedback-delegate';
import { makeSingleton } from '@singletons'; import { makeSingleton } from '@singletons';
import { CoreFormFields } from '@singletons/form'; import { CoreFormFields } from '@singletons/form';
import { CoreFileEntry } from '@services/file-helper'; import { CoreFileEntry } from '@services/file-helper';
import { ADDON_MOD_ASSIGN_COMPONENT } from '../constants';
/** /**
* Service that provides some helper functions for assign. * Service that provides some helper functions for assign.
@ -650,7 +650,7 @@ export class AddonModAssignHelperProvider {
* @returns Promise resolved with the itemId. * @returns Promise resolved with the itemId.
*/ */
uploadFile(assignId: number, file: CoreFileEntry, itemId?: number, siteId?: string): Promise<number> { uploadFile(assignId: number, file: CoreFileEntry, itemId?: number, siteId?: string): Promise<number> {
return CoreFileUploader.uploadOrReuploadFile(file, itemId, AddonModAssignProvider.COMPONENT, assignId, siteId); return CoreFileUploader.uploadOrReuploadFile(file, itemId, ADDON_MOD_ASSIGN_COMPONENT, assignId, siteId);
} }
/** /**
@ -664,7 +664,7 @@ export class AddonModAssignHelperProvider {
* @returns Promise resolved with the itemId. * @returns Promise resolved with the itemId.
*/ */
uploadFiles(assignId: number, files: CoreFileEntry[], siteId?: string): Promise<number> { uploadFiles(assignId: number, files: CoreFileEntry[], siteId?: string): Promise<number> {
return CoreFileUploader.uploadOrReuploadFiles(files, AddonModAssignProvider.COMPONENT, assignId, siteId); return CoreFileUploader.uploadOrReuploadFiles(files, ADDON_MOD_ASSIGN_COMPONENT, assignId, siteId);
} }
/** /**

View File

@ -17,7 +17,6 @@ import { CoreEvents } from '@singletons/events';
import { CoreSites, CoreSitesReadingStrategy } from '@services/sites'; import { CoreSites, CoreSitesReadingStrategy } from '@services/sites';
import { CoreSyncBlockedError } from '@classes/base-sync'; import { CoreSyncBlockedError } from '@classes/base-sync';
import { import {
AddonModAssignProvider,
AddonModAssignAssign, AddonModAssignAssign,
AddonModAssignSubmission, AddonModAssignSubmission,
AddonModAssign, AddonModAssign,
@ -40,6 +39,7 @@ import { CoreNetworkError } from '@classes/errors/network-error';
import { CoreGradesFormattedItem, CoreGradesHelper } from '@features/grades/services/grades-helper'; import { CoreGradesFormattedItem, CoreGradesHelper } from '@features/grades/services/grades-helper';
import { AddonModAssignSubmissionDelegate } from './submission-delegate'; import { AddonModAssignSubmissionDelegate } from './submission-delegate';
import { AddonModAssignFeedbackDelegate } from './feedback-delegate'; import { AddonModAssignFeedbackDelegate } from './feedback-delegate';
import { ADDON_MOD_ASSIGN_AUTO_SYNCED, ADDON_MOD_ASSIGN_COMPONENT } from '../constants';
/** /**
* Service to sync assigns. * Service to sync assigns.
@ -47,9 +47,6 @@ import { AddonModAssignFeedbackDelegate } from './feedback-delegate';
@Injectable({ providedIn: 'root' }) @Injectable({ providedIn: 'root' })
export class AddonModAssignSyncProvider extends CoreCourseActivitySyncBaseProvider<AddonModAssignSyncResult> { export class AddonModAssignSyncProvider extends CoreCourseActivitySyncBaseProvider<AddonModAssignSyncResult> {
static readonly AUTO_SYNCED = 'addon_mod_assign_autom_synced';
static readonly MANUAL_SYNCED = 'addon_mod_assign_manual_synced';
protected componentTranslatableString = 'assign'; protected componentTranslatableString = 'assign';
constructor() { constructor() {
@ -129,7 +126,7 @@ export class AddonModAssignSyncProvider extends CoreCourseActivitySyncBaseProvid
: await this.syncAssignIfNeeded(assignId, siteId); : await this.syncAssignIfNeeded(assignId, siteId);
if (result?.updated) { if (result?.updated) {
CoreEvents.trigger(AddonModAssignSyncProvider.AUTO_SYNCED, { CoreEvents.trigger(ADDON_MOD_ASSIGN_AUTO_SYNCED, {
assignId: assignId, assignId: assignId,
warnings: result.warnings, warnings: result.warnings,
gradesBlocked: result.gradesBlocked, gradesBlocked: result.gradesBlocked,
@ -170,7 +167,7 @@ export class AddonModAssignSyncProvider extends CoreCourseActivitySyncBaseProvid
} }
// Verify that assign isn't blocked. // Verify that assign isn't blocked.
if (CoreSync.isBlocked(AddonModAssignProvider.COMPONENT, assignId, siteId)) { if (CoreSync.isBlocked(ADDON_MOD_ASSIGN_COMPONENT, assignId, siteId)) {
this.logger.debug('Cannot sync assign ' + assignId + ' because it is blocked.'); this.logger.debug('Cannot sync assign ' + assignId + ' because it is blocked.');
throw new CoreSyncBlockedError(Translate.instant('core.errorsyncblocked', { $a: this.componentTranslate })); throw new CoreSyncBlockedError(Translate.instant('core.errorsyncblocked', { $a: this.componentTranslate }));
@ -193,7 +190,7 @@ export class AddonModAssignSyncProvider extends CoreCourseActivitySyncBaseProvid
protected async performSyncAssign(assignId: number, siteId: string): Promise<AddonModAssignSyncResult> { protected async performSyncAssign(assignId: number, siteId: string): Promise<AddonModAssignSyncResult> {
// Sync offline logs. // Sync offline logs.
await CoreUtils.ignoreErrors( await CoreUtils.ignoreErrors(
CoreCourseLogHelper.syncActivity(AddonModAssignProvider.COMPONENT, assignId, siteId), CoreCourseLogHelper.syncActivity(ADDON_MOD_ASSIGN_COMPONENT, assignId, siteId),
); );
const result: AddonModAssignSyncResult = { const result: AddonModAssignSyncResult = {
@ -433,7 +430,7 @@ export class AddonModAssignSyncProvider extends CoreCourseActivitySyncBaseProvid
}; };
// Check if this grade sync is blocked. // Check if this grade sync is blocked.
if (CoreSync.isBlocked(AddonModAssignProvider.COMPONENT, syncId, siteId)) { if (CoreSync.isBlocked(ADDON_MOD_ASSIGN_COMPONENT, syncId, siteId)) {
this.logger.error(`Cannot sync grade for assign ${assign.id} and user ${userId} because it is blocked.!!!!`); this.logger.error(`Cannot sync grade for assign ${assign.id} and user ${userId} because it is blocked.!!!!`);
throw new CoreSyncBlockedError(Translate.instant( throw new CoreSyncBlockedError(Translate.instant(

View File

@ -31,14 +31,21 @@ import { AddonModAssignSubmissionDelegate } from './submission-delegate';
import { CoreComments } from '@features/comments/services/comments'; import { CoreComments } from '@features/comments/services/comments';
import { AddonModAssignSubmissionFormatted } from './assign-helper'; import { AddonModAssignSubmissionFormatted } from './assign-helper';
import { CoreWSError } from '@classes/errors/wserror'; import { CoreWSError } from '@classes/errors/wserror';
import { AddonModAssignAutoSyncData, AddonModAssignManualSyncData, AddonModAssignSyncProvider } from './assign-sync'; import { AddonModAssignAutoSyncData, AddonModAssignManualSyncData } from './assign-sync';
import { CoreFormFields } from '@singletons/form'; import { CoreFormFields } from '@singletons/form';
import { CoreFileHelper } from '@services/file-helper'; import { CoreFileHelper } from '@services/file-helper';
import { CoreIonicColorNames } from '@singletons/colors'; import { CoreIonicColorNames } from '@singletons/colors';
import { CoreSiteWSPreSets } from '@classes/sites/authenticated-site'; import { CoreSiteWSPreSets } from '@classes/sites/authenticated-site';
import { ContextLevel } from '@/core/constants'; import { ContextLevel } from '@/core/constants';
import {
const ROOT_CACHE_KEY = 'mmaModAssign:'; ADDON_MOD_ASSIGN_AUTO_SYNCED,
ADDON_MOD_ASSIGN_COMPONENT,
ADDON_MOD_ASSIGN_GRADED_EVENT,
ADDON_MOD_ASSIGN_MANUAL_SYNCED,
ADDON_MOD_ASSIGN_STARTED_EVENT,
ADDON_MOD_ASSIGN_SUBMISSION_SAVED_EVENT,
ADDON_MOD_ASSIGN_SUBMITTED_FOR_GRADING_EVENT,
} from '../constants';
declare module '@singletons/events' { declare module '@singletons/events' {
@ -48,12 +55,12 @@ declare module '@singletons/events' {
* @see https://www.typescriptlang.org/docs/handbook/declaration-merging.html#module-augmentation * @see https://www.typescriptlang.org/docs/handbook/declaration-merging.html#module-augmentation
*/ */
export interface CoreEventsData { export interface CoreEventsData {
[AddonModAssignProvider.SUBMISSION_SAVED_EVENT]: AddonModAssignSubmissionSavedEventData; [ADDON_MOD_ASSIGN_SUBMISSION_SAVED_EVENT]: AddonModAssignSubmissionSavedEventData;
[AddonModAssignProvider.SUBMITTED_FOR_GRADING_EVENT]: AddonModAssignSubmittedForGradingEventData; [ADDON_MOD_ASSIGN_SUBMITTED_FOR_GRADING_EVENT]: AddonModAssignSubmittedForGradingEventData;
[AddonModAssignProvider.GRADED_EVENT]: AddonModAssignGradedEventData; [ADDON_MOD_ASSIGN_GRADED_EVENT]: AddonModAssignGradedEventData;
[AddonModAssignProvider.STARTED_EVENT]: AddonModAssignStartedEventData; [ADDON_MOD_ASSIGN_STARTED_EVENT]: AddonModAssignStartedEventData;
[AddonModAssignSyncProvider.MANUAL_SYNCED]: AddonModAssignManualSyncData; [ADDON_MOD_ASSIGN_MANUAL_SYNCED]: AddonModAssignManualSyncData;
[AddonModAssignSyncProvider.AUTO_SYNCED]: AddonModAssignAutoSyncData; [ADDON_MOD_ASSIGN_AUTO_SYNCED]: AddonModAssignAutoSyncData;
} }
} }
@ -64,19 +71,7 @@ declare module '@singletons/events' {
@Injectable({ providedIn: 'root' }) @Injectable({ providedIn: 'root' })
export class AddonModAssignProvider { export class AddonModAssignProvider {
static readonly COMPONENT = 'mmaModAssign'; protected static readonly ROOT_CACHE_KEY = 'mmaModAssign:';
static readonly SUBMISSION_COMPONENT = 'mmaModAssignSubmission';
static readonly UNLIMITED_ATTEMPTS = -1;
// Group submissions warnings.
static readonly WARN_GROUPS_REQUIRED = 'warnrequired';
static readonly WARN_GROUPS_OPTIONAL = 'warnoptional';
// Events.
static readonly SUBMISSION_SAVED_EVENT = 'addon_mod_assign_submission_saved';
static readonly SUBMITTED_FOR_GRADING_EVENT = 'addon_mod_assign_submitted_for_grading';
static readonly GRADED_EVENT = 'addon_mod_assign_graded';
static readonly STARTED_EVENT = 'addon_mod_assign_started';
/** /**
* Check if the user can submit in offline. This should only be used if submissionStatus.lastattempt.cansubmit cannot * Check if the user can submit in offline. This should only be used if submissionStatus.lastattempt.cansubmit cannot
@ -179,7 +174,7 @@ export class AddonModAssignProvider {
const preSets: CoreSiteWSPreSets = { const preSets: CoreSiteWSPreSets = {
cacheKey: this.getAssignmentCacheKey(courseId), cacheKey: this.getAssignmentCacheKey(courseId),
updateFrequency: CoreSite.FREQUENCY_RARELY, updateFrequency: CoreSite.FREQUENCY_RARELY,
component: AddonModAssignProvider.COMPONENT, component: ADDON_MOD_ASSIGN_COMPONENT,
...CoreSites.getReadingStrategyPreSets(options.readingStrategy), // Include reading strategy preSets. ...CoreSites.getReadingStrategyPreSets(options.readingStrategy), // Include reading strategy preSets.
}; };
@ -226,7 +221,7 @@ export class AddonModAssignProvider {
* @returns Cache key. * @returns Cache key.
*/ */
protected getAssignmentCacheKey(courseId: number): string { protected getAssignmentCacheKey(courseId: number): string {
return ROOT_CACHE_KEY + 'assignment:' + courseId; return AddonModAssignProvider.ROOT_CACHE_KEY + 'assignment:' + courseId;
} }
/** /**
@ -251,7 +246,7 @@ export class AddonModAssignProvider {
const preSets: CoreSiteWSPreSets = { const preSets: CoreSiteWSPreSets = {
cacheKey: this.getAssignmentUserMappingsCacheKey(assignId), cacheKey: this.getAssignmentUserMappingsCacheKey(assignId),
updateFrequency: CoreSite.FREQUENCY_OFTEN, updateFrequency: CoreSite.FREQUENCY_OFTEN,
component: AddonModAssignProvider.COMPONENT, component: ADDON_MOD_ASSIGN_COMPONENT,
componentId: options.cmId, componentId: options.cmId,
...CoreSites.getReadingStrategyPreSets(options.readingStrategy), ...CoreSites.getReadingStrategyPreSets(options.readingStrategy),
}; };
@ -279,7 +274,7 @@ export class AddonModAssignProvider {
* @returns Cache key. * @returns Cache key.
*/ */
protected getAssignmentUserMappingsCacheKey(assignId: number): string { protected getAssignmentUserMappingsCacheKey(assignId: number): string {
return ROOT_CACHE_KEY + 'usermappings:' + assignId; return AddonModAssignProvider.ROOT_CACHE_KEY + 'usermappings:' + assignId;
} }
/** /**
@ -297,7 +292,7 @@ export class AddonModAssignProvider {
}; };
const preSets: CoreSiteWSPreSets = { const preSets: CoreSiteWSPreSets = {
cacheKey: this.getAssignmentGradesCacheKey(assignId), cacheKey: this.getAssignmentGradesCacheKey(assignId),
component: AddonModAssignProvider.COMPONENT, component: ADDON_MOD_ASSIGN_COMPONENT,
componentId: options.cmId, componentId: options.cmId,
...CoreSites.getReadingStrategyPreSets(options.readingStrategy), ...CoreSites.getReadingStrategyPreSets(options.readingStrategy),
}; };
@ -326,7 +321,7 @@ export class AddonModAssignProvider {
* @returns Cache key. * @returns Cache key.
*/ */
protected getAssignmentGradesCacheKey(assignId: number): string { protected getAssignmentGradesCacheKey(assignId: number): string {
return ROOT_CACHE_KEY + 'assigngrades:' + assignId; return AddonModAssignProvider.ROOT_CACHE_KEY + 'assigngrades:' + assignId;
} }
/** /**
@ -461,7 +456,7 @@ export class AddonModAssignProvider {
const preSets: CoreSiteWSPreSets = { const preSets: CoreSiteWSPreSets = {
cacheKey: this.getSubmissionsCacheKey(assignId), cacheKey: this.getSubmissionsCacheKey(assignId),
updateFrequency: CoreSite.FREQUENCY_OFTEN, updateFrequency: CoreSite.FREQUENCY_OFTEN,
component: AddonModAssignProvider.COMPONENT, component: ADDON_MOD_ASSIGN_COMPONENT,
componentId: options.cmId, componentId: options.cmId,
...CoreSites.getReadingStrategyPreSets(options.readingStrategy), ...CoreSites.getReadingStrategyPreSets(options.readingStrategy),
}; };
@ -489,7 +484,7 @@ export class AddonModAssignProvider {
* @returns Cache key. * @returns Cache key.
*/ */
protected getSubmissionsCacheKey(assignId: number): string { protected getSubmissionsCacheKey(assignId: number): string {
return ROOT_CACHE_KEY + 'submissions:' + assignId; return AddonModAssignProvider.ROOT_CACHE_KEY + 'submissions:' + assignId;
} }
/** /**
@ -529,7 +524,7 @@ export class AddonModAssignProvider {
getCacheUsingCacheKey: true, getCacheUsingCacheKey: true,
filter: options.filter, filter: options.filter,
rewriteurls: options.filter, rewriteurls: options.filter,
component: AddonModAssignProvider.COMPONENT, component: ADDON_MOD_ASSIGN_COMPONENT,
componentId: options.cmId, componentId: options.cmId,
// Don't cache when getting text without filters. // Don't cache when getting text without filters.
// @todo Change this to support offline editing. // @todo Change this to support offline editing.
@ -659,7 +654,7 @@ export class AddonModAssignProvider {
const preSets: CoreSiteWSPreSets = { const preSets: CoreSiteWSPreSets = {
cacheKey: this.listParticipantsCacheKey(assignId, groupId), cacheKey: this.listParticipantsCacheKey(assignId, groupId),
updateFrequency: CoreSite.FREQUENCY_OFTEN, updateFrequency: CoreSite.FREQUENCY_OFTEN,
component: AddonModAssignProvider.COMPONENT, component: ADDON_MOD_ASSIGN_COMPONENT,
componentId: options.cmId, componentId: options.cmId,
...CoreSites.getReadingStrategyPreSets(options.readingStrategy), ...CoreSites.getReadingStrategyPreSets(options.readingStrategy),
}; };
@ -685,7 +680,7 @@ export class AddonModAssignProvider {
* @returns Cache key. * @returns Cache key.
*/ */
protected listParticipantsPrefixCacheKey(assignId: number): string { protected listParticipantsPrefixCacheKey(assignId: number): string {
return ROOT_CACHE_KEY + 'participants:' + assignId; return AddonModAssignProvider.ROOT_CACHE_KEY + 'participants:' + assignId;
} }
/** /**
@ -891,7 +886,7 @@ export class AddonModAssignProvider {
await CoreCourseLogHelper.log( await CoreCourseLogHelper.log(
'mod_assign_view_submission_status', 'mod_assign_view_submission_status',
params, params,
AddonModAssignProvider.COMPONENT, ADDON_MOD_ASSIGN_COMPONENT,
assignid, assignid,
siteId, siteId,
); );
@ -912,7 +907,7 @@ export class AddonModAssignProvider {
await CoreCourseLogHelper.log( await CoreCourseLogHelper.log(
'mod_assign_view_grading_table', 'mod_assign_view_grading_table',
params, params,
AddonModAssignProvider.COMPONENT, ADDON_MOD_ASSIGN_COMPONENT,
assignid, assignid,
siteId, siteId,
); );
@ -933,7 +928,7 @@ export class AddonModAssignProvider {
await CoreCourseLogHelper.log( await CoreCourseLogHelper.log(
'mod_assign_view_assign', 'mod_assign_view_assign',
params, params,
AddonModAssignProvider.COMPONENT, ADDON_MOD_ASSIGN_COMPONENT,
assignid, assignid,
siteId, siteId,
); );

View File

@ -17,6 +17,7 @@ import { Injectable, Type } from '@angular/core';
import { CoreCourseModuleHandler } from '@features/course/services/module-delegate'; import { CoreCourseModuleHandler } from '@features/course/services/module-delegate';
import { makeSingleton } from '@singletons'; import { makeSingleton } from '@singletons';
import { CoreModuleHandlerBase } from '@features/course/classes/module-base-handler'; import { CoreModuleHandlerBase } from '@features/course/classes/module-base-handler';
import { ADDON_MOD_ASSIGN_PAGE_NAME } from '../../constants';
/** /**
* Handler to support assign modules. * Handler to support assign modules.
@ -24,11 +25,9 @@ import { CoreModuleHandlerBase } from '@features/course/classes/module-base-hand
@Injectable({ providedIn: 'root' }) @Injectable({ providedIn: 'root' })
export class AddonModAssignModuleHandlerService extends CoreModuleHandlerBase implements CoreCourseModuleHandler { export class AddonModAssignModuleHandlerService extends CoreModuleHandlerBase implements CoreCourseModuleHandler {
static readonly PAGE_NAME = 'mod_assign';
name = 'AddonModAssign'; name = 'AddonModAssign';
modName = 'assign'; modName = 'assign';
protected pageName = AddonModAssignModuleHandlerService.PAGE_NAME; protected pageName = ADDON_MOD_ASSIGN_PAGE_NAME;
supportedFeatures = { supportedFeatures = {
[CoreConstants.FEATURE_GROUPS]: true, [CoreConstants.FEATURE_GROUPS]: true,

View File

@ -18,7 +18,6 @@ import { makeSingleton } from '@singletons';
import { import {
AddonModAssign, AddonModAssign,
AddonModAssignAssign, AddonModAssignAssign,
AddonModAssignProvider,
AddonModAssignSubmission, AddonModAssignSubmission,
AddonModAssignSubmissionStatusOptions, AddonModAssignSubmissionStatusOptions,
} from '../assign'; } from '../assign';
@ -35,6 +34,7 @@ import { AddonModAssignSync, AddonModAssignSyncResult } from '../assign-sync';
import { CoreUser } from '@features/user/services/user'; import { CoreUser } from '@features/user/services/user';
import { CoreGradesHelper } from '@features/grades/services/grades-helper'; import { CoreGradesHelper } from '@features/grades/services/grades-helper';
import { CoreCourses } from '@features/courses/services/courses'; import { CoreCourses } from '@features/courses/services/courses';
import { ADDON_MOD_ASSIGN_COMPONENT } from '../../constants';
/** /**
* Handler to prefetch assigns. * Handler to prefetch assigns.
@ -44,7 +44,7 @@ export class AddonModAssignPrefetchHandlerService extends CoreCourseActivityPref
name = 'AddonModAssign'; name = 'AddonModAssign';
modName = 'assign'; modName = 'assign';
component = AddonModAssignProvider.COMPONENT; component = ADDON_MOD_ASSIGN_COMPONENT;
updatesNames = /^configuration$|^.*files$|^submissions$|^grades$|^gradeitems$|^outcomes$|^comments$/; updatesNames = /^configuration$|^.*files$|^submissions$|^grades$|^gradeitems$|^outcomes$|^comments$/;
/** /**

View File

@ -12,7 +12,7 @@
// See the License for the specific language governing permissions and // See the License for the specific language governing permissions and
// limitations under the License. // limitations under the License.
import { AddonModAssign, AddonModAssignProvider } from '@addons/mod/assign/services/assign'; import { AddonModAssign } from '@addons/mod/assign/services/assign';
import { AddonModAssignHelper } from '@addons/mod/assign/services/assign-helper'; import { AddonModAssignHelper } from '@addons/mod/assign/services/assign-helper';
import { AddonModAssignOffline } from '@addons/mod/assign/services/assign-offline'; import { AddonModAssignOffline } from '@addons/mod/assign/services/assign-offline';
import { Component, OnInit } from '@angular/core'; import { Component, OnInit } from '@angular/core';
@ -23,6 +23,7 @@ import { AddonModAssignSubmissionFileHandlerService } from '../services/handler'
import { FileEntry } from '@awesome-cordova-plugins/file/ngx'; import { FileEntry } from '@awesome-cordova-plugins/file/ngx';
import { AddonModAssignSubmissionPluginBaseComponent } from '@addons/mod/assign/classes/base-submission-plugin-component'; import { AddonModAssignSubmissionPluginBaseComponent } from '@addons/mod/assign/classes/base-submission-plugin-component';
import { CoreFileEntry } from '@services/file-helper'; import { CoreFileEntry } from '@services/file-helper';
import { ADDON_MOD_ASSIGN_COMPONENT } from '@addons/mod/assign/constants';
/** /**
* Component to render a file submission plugin. * Component to render a file submission plugin.
@ -33,7 +34,7 @@ import { CoreFileEntry } from '@services/file-helper';
}) })
export class AddonModAssignSubmissionFileComponent extends AddonModAssignSubmissionPluginBaseComponent implements OnInit { export class AddonModAssignSubmissionFileComponent extends AddonModAssignSubmissionPluginBaseComponent implements OnInit {
component = AddonModAssignProvider.COMPONENT; component = ADDON_MOD_ASSIGN_COMPONENT;
files: CoreFileEntry[] = []; files: CoreFileEntry[] = [];
maxSize?: number; maxSize?: number;

View File

@ -16,7 +16,6 @@ import {
AddonModAssignAssign, AddonModAssignAssign,
AddonModAssignSubmission, AddonModAssignSubmission,
AddonModAssignPlugin, AddonModAssignPlugin,
AddonModAssignProvider,
AddonModAssign, AddonModAssign,
} from '@addons/mod/assign/services/assign'; } from '@addons/mod/assign/services/assign';
import { AddonModAssignHelper } from '@addons/mod/assign/services/assign-helper'; import { AddonModAssignHelper } from '@addons/mod/assign/services/assign-helper';
@ -32,6 +31,7 @@ import { makeSingleton } from '@singletons';
import { AddonModAssignSubmissionFileComponent } from '../component/file'; import { AddonModAssignSubmissionFileComponent } from '../component/file';
import { FileEntry } from '@awesome-cordova-plugins/file/ngx'; import { FileEntry } from '@awesome-cordova-plugins/file/ngx';
import type { AddonModAssignSubmissionPluginBaseComponent } from '@addons/mod/assign/classes/base-submission-plugin-component'; import type { AddonModAssignSubmissionPluginBaseComponent } from '@addons/mod/assign/classes/base-submission-plugin-component';
import { ADDON_MOD_ASSIGN_COMPONENT } from '@addons/mod/assign/constants';
/** /**
* Handler for file submission plugin. * Handler for file submission plugin.
@ -65,10 +65,10 @@ export class AddonModAssignSubmissionFileHandlerService implements AddonModAssig
* @inheritdoc * @inheritdoc
*/ */
clearTmpData(assign: AddonModAssignAssign): void { clearTmpData(assign: AddonModAssignAssign): void {
const files = CoreFileSession.getFiles(AddonModAssignProvider.COMPONENT, assign.id); const files = CoreFileSession.getFiles(ADDON_MOD_ASSIGN_COMPONENT, assign.id);
// Clear the files in session for this assign. // Clear the files in session for this assign.
CoreFileSession.clearFiles(AddonModAssignProvider.COMPONENT, assign.id); CoreFileSession.clearFiles(ADDON_MOD_ASSIGN_COMPONENT, assign.id);
// Now delete the local files from the tmp folder. // Now delete the local files from the tmp folder.
CoreFileUploader.clearTmpFiles(files); CoreFileUploader.clearTmpFiles(files);
@ -148,7 +148,7 @@ export class AddonModAssignSubmissionFileHandlerService implements AddonModAssig
// Check if there's any change. // Check if there's any change.
const hasChanged = await this.hasDataChanged(assign, submission, plugin); const hasChanged = await this.hasDataChanged(assign, submission, plugin);
if (hasChanged) { if (hasChanged) {
const files = CoreFileSession.getFiles(AddonModAssignProvider.COMPONENT, assign.id); const files = CoreFileSession.getFiles(ADDON_MOD_ASSIGN_COMPONENT, assign.id);
return CoreFileHelper.getTotalFilesSize(files); return CoreFileHelper.getTotalFilesSize(files);
} else { } else {
@ -183,7 +183,7 @@ export class AddonModAssignSubmissionFileHandlerService implements AddonModAssig
numFiles = pluginFiles && pluginFiles.length; numFiles = pluginFiles && pluginFiles.length;
} }
const currentFiles = CoreFileSession.getFiles(AddonModAssignProvider.COMPONENT, assign.id); const currentFiles = CoreFileSession.getFiles(ADDON_MOD_ASSIGN_COMPONENT, assign.id);
if (currentFiles.length != numFiles) { if (currentFiles.length != numFiles) {
// Number of files has changed. // Number of files has changed.
@ -230,7 +230,7 @@ export class AddonModAssignSubmissionFileHandlerService implements AddonModAssig
} }
// Data has changed, we need to upload new files and re-upload all the existing files. // Data has changed, we need to upload new files and re-upload all the existing files.
const currentFiles = CoreFileSession.getFiles(AddonModAssignProvider.COMPONENT, assign.id); const currentFiles = CoreFileSession.getFiles(ADDON_MOD_ASSIGN_COMPONENT, assign.id);
const error = CoreUtils.hasRepeatedFilenames(currentFiles); const error = CoreUtils.hasRepeatedFilenames(currentFiles);
if (error) { if (error) {

View File

@ -13,7 +13,7 @@
// limitations under the License. // limitations under the License.
import { AddonModAssignSubmissionPluginBaseComponent } from '@addons/mod/assign/classes/base-submission-plugin-component'; import { AddonModAssignSubmissionPluginBaseComponent } from '@addons/mod/assign/classes/base-submission-plugin-component';
import { AddonModAssignProvider, AddonModAssign } from '@addons/mod/assign/services/assign'; import { AddonModAssign } from '@addons/mod/assign/services/assign';
import { AddonModAssignOffline } from '@addons/mod/assign/services/assign-offline'; import { AddonModAssignOffline } from '@addons/mod/assign/services/assign-offline';
import { Component, OnInit, ElementRef } from '@angular/core'; import { Component, OnInit, ElementRef } from '@angular/core';
import { FormBuilder, FormControl } from '@angular/forms'; import { FormBuilder, FormControl } from '@angular/forms';
@ -22,6 +22,7 @@ import { CoreTextUtils } from '@services/utils/text';
import { CoreUtils } from '@services/utils/utils'; import { CoreUtils } from '@services/utils/utils';
import { AddonModAssignSubmissionOnlineTextPluginData } from '../services/handler'; import { AddonModAssignSubmissionOnlineTextPluginData } from '../services/handler';
import { ContextLevel } from '@/core/constants'; import { ContextLevel } from '@/core/constants';
import { ADDON_MOD_ASSIGN_COMPONENT } from '@addons/mod/assign/constants';
/** /**
* Component to render an onlinetext submission plugin. * Component to render an onlinetext submission plugin.
@ -34,7 +35,7 @@ export class AddonModAssignSubmissionOnlineTextComponent extends AddonModAssignS
control?: FormControl<string>; control?: FormControl<string>;
words = 0; words = 0;
component = AddonModAssignProvider.COMPONENT; component = ADDON_MOD_ASSIGN_COMPONENT;
text = ''; text = '';
loaded = false; loaded = false;
wordLimitEnabled = false; wordLimitEnabled = false;