Skip to content

Commit 9caadb3

Browse files
authored
Merge pull request #4363 from crazyserver/MOBILE-4653
Mobile 4653
2 parents 1243d14 + 1513815 commit 9caadb3

File tree

67 files changed

+979
-660
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

67 files changed

+979
-660
lines changed

.github/workflows/testing.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ jobs:
6969
cat circular-dependencies
7070
lines=$(cat circular-dependencies | wc -l)
7171
echo "Total circular dependencies: $lines"
72-
test $lines -eq 85
72+
test $lines -eq 80
7373
- name: JavaScript code compatibility
7474
run: |
7575
npx check-es-compat www/*.js --polyfills="\{Array,String,TypedArray\}.prototype.at,Object.hasOwn"

scripts/langindex.json

-4
Original file line numberDiff line numberDiff line change
@@ -386,7 +386,6 @@
386386
"addon.mod_assign.extensionduedate": "assign",
387387
"addon.mod_assign.feedback": "assign",
388388
"addon.mod_assign.feedbacknotsupported": "local_moodlemobileapp",
389-
"addon.mod_assign.grade": "grades",
390389
"addon.mod_assign.graded": "assign",
391390
"addon.mod_assign.gradedby": "assign",
392391
"addon.mod_assign.gradedfollowupsubmit": "assign",
@@ -815,7 +814,6 @@
815814
"addon.mod_lesson.finishretakeoffline": "local_moodlemobileapp",
816815
"addon.mod_lesson.firstwrong": "lesson",
817816
"addon.mod_lesson.gotoendoflesson": "lesson",
818-
"addon.mod_lesson.grade": "lesson",
819817
"addon.mod_lesson.highscore": "lesson",
820818
"addon.mod_lesson.hightime": "lesson",
821819
"addon.mod_lesson.leftduringtimed": "lesson",
@@ -909,7 +907,6 @@
909907
"addon.mod_quiz.feedback": "quiz",
910908
"addon.mod_quiz.finishattemptdots": "quiz",
911909
"addon.mod_quiz.finishedofflinenotice": "local_moodlemobileapp",
912-
"addon.mod_quiz.grade": "quiz",
913910
"addon.mod_quiz.gradeaverage": "quiz",
914911
"addon.mod_quiz.gradehighest": "quiz",
915912
"addon.mod_quiz.grademethod": "quiz",
@@ -1886,7 +1883,6 @@
18861883
"core.grades.contributiontocoursetotal": "grades",
18871884
"core.grades.fail": "grades",
18881885
"core.grades.feedback": "grades",
1889-
"core.grades.grade": "grades",
18901886
"core.grades.gradebook": "grades",
18911887
"core.grades.gradeitem": "grades",
18921888
"core.grades.gradelong": "grades",

src/addons/block/activitymodules/components/activitymodules/activitymodules.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import { CoreCourseHelper } from '@features/course/services/course-helper';
2525
import { CoreUrl } from '@singletons/url';
2626
import { CoreSharedModule } from '@/core/shared.module';
2727
import { ModFeature, ModArchetype } from '@addons/mod/constants';
28+
import { CoreCourseModuleHelper } from '@features/course/services/course-module-helper';
2829

2930
/**
3031
* Component to render an "activity modules" block.
@@ -73,7 +74,7 @@ export class AddonBlockActivityModulesComponent extends CoreBlockBaseComponent i
7374

7475
const modules = CoreCourse.getSectionsModules(sections, {
7576
ignoreSection: section => !CoreCourseHelper.canUserViewSection(section),
76-
ignoreModule: module => !CoreCourseHelper.canUserViewModule(module) || !CoreCourse.moduleHasView(module),
77+
ignoreModule: module => !CoreCourseHelper.canUserViewModule(module) || !CoreCourseModuleHelper.moduleHasView(module),
7778
});
7879

7980
modules.forEach((mod) => {

src/addons/block/recentlyaccesseditems/services/recentlyaccesseditems.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
import { Injectable } from '@angular/core';
1616
import { CoreSites } from '@services/sites';
1717
import { CoreDomUtils } from '@services/utils/dom';
18-
import { CoreCourse } from '@features/course/services/course';
18+
import { CoreCourseModuleHelper } from '@features/course/services/course-module-helper';
1919
import { CoreSiteWSPreSets } from '@classes/sites/authenticated-site';
2020
import { makeSingleton } from '@singletons';
2121
import { CoreCourseModuleDelegate } from '@features/course/services/module-delegate';
@@ -77,7 +77,7 @@ export class AddonBlockRecentlyAccessedItemsProvider {
7777
}));
7878

7979
// Check if the viewed module should be updated for each activity.
80-
const lastViewedMap = await CoreCourse.getCertainModulesViewed(cmIds, site.getId());
80+
const lastViewedMap = await CoreCourseModuleHelper.getCertainModulesViewed(cmIds, site.getId());
8181

8282
itemsToDisplay.forEach((recentItem) => {
8383
const timeAccess = recentItem.timeaccess * 1000;
@@ -88,7 +88,7 @@ export class AddonBlockRecentlyAccessedItemsProvider {
8888
}
8989

9090
// Update access.
91-
CoreCourse.storeModuleViewed(recentItem.courseid, recentItem.cmid, {
91+
CoreCourseModuleHelper.storeModuleViewed(recentItem.courseid, recentItem.cmid, {
9292
timeaccess: recentItem.timeaccess * 1000,
9393
sectionId: lastViewed && lastViewed.sectionId,
9494
siteId: site.getId(),

src/addons/block/timeline/classes/section.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414

1515
import { AddonBlockTimeline } from '@addons/block/timeline/services/timeline';
1616
import { AddonCalendarEvent } from '@addons/calendar/services/calendar';
17-
import { CoreCourse } from '@features/course/services/course';
17+
import { CoreCourseModuleHelper } from '@features/course/services/course-module-helper';
1818
import { CoreCourseModuleDelegate } from '@features/course/services/module-delegate';
1919
import { CoreEnrolledCourseDataWithOptions } from '@features/courses/services/courses-helper';
2020
import { CoreTime } from '@singletons/time';
@@ -171,7 +171,7 @@ export class AddonBlockTimelineSection {
171171
modulename,
172172
overdue: event.timesort < now,
173173
iconUrl: await CoreCourseModuleDelegate.getModuleIconSrc(event.icon.component, event.icon.iconurl),
174-
iconTitle: CoreCourse.translateModuleName(modulename),
174+
iconTitle: CoreCourseModuleHelper.translateModuleName(modulename),
175175
} as AddonBlockTimelineEvent;
176176
}
177177

src/addons/calendar/pages/event/event.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ import { CoreNetwork } from '@services/network';
2424
import { CoreEventObserver, CoreEvents } from '@singletons/events';
2525
import { CoreText } from '@singletons/text';
2626
import { CoreSites } from '@services/sites';
27-
import { CoreCourse } from '@features/course/services/course';
27+
import { CoreCourseModuleHelper } from '@features/course/services/course-module-helper';
2828
import { CoreTime } from '@singletons/time';
2929
import { DomSanitizer, NgZone, Translate } from '@singletons';
3030
import { Subscription } from 'rxjs';
@@ -269,7 +269,7 @@ export default class AddonCalendarEventPage implements OnInit, OnDestroy {
269269

270270
if (this.event.moduleIcon) {
271271
// It's a module event, translate the module name to the current language.
272-
const name = CoreCourse.translateModuleName(this.event.modulename || '');
272+
const name = CoreCourseModuleHelper.translateModuleName(this.event.modulename || '');
273273
if (name.indexOf('core.mod_') === -1) {
274274
this.event.modulename = name;
275275
}

src/addons/calendar/services/calendar-helper.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ import {
2626
} from './calendar';
2727
import { CoreConfig } from '@services/config';
2828
import { CoreObject } from '@singletons/object';
29-
import { CoreCourse } from '@features/course/services/course';
29+
import { CoreCourseModuleHelper } from '@features/course/services/course-module-helper';
3030
import { ContextLevel, CoreConstants } from '@/core/constants';
3131
import dayjs, { Dayjs } from 'dayjs';
3232
import { makeSingleton } from '@singletons';
@@ -184,7 +184,7 @@ export class AddonCalendarHelperProvider {
184184
'icon' in event ? event.icon.iconurl : undefined,
185185
);
186186
eventFormatted.moduleIcon = eventFormatted.eventIcon;
187-
eventFormatted.iconTitle = CoreCourse.translateModuleName(event.modulename);
187+
eventFormatted.iconTitle = CoreCourseModuleHelper.translateModuleName(event.modulename);
188188
}
189189

190190
eventFormatted.formattedType = AddonCalendar.getEventType(event);

src/addons/mod/assign/components/edit-feedback-modal/edit-feedback-modal.html

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<ion-header>
22
<ion-toolbar>
33
<ion-title>
4-
<h1>{{'addon.mod_assign.grade' | translate}}</h1>
4+
<h1>{{'core.gradenoun' | translate}}</h1>
55
</ion-title>
66
<ion-buttons slot="end">
77
<ion-button fill="clear" (click)="closeModal()" [ariaLabel]="'core.close' | translate">
@@ -25,8 +25,8 @@ <h1>{{'addon.mod_assign.grade' | translate}}</h1>
2525
<!-- Grade using a scale. -->
2626
<ion-item class="ion-text-wrap" *ngIf="grade.method === 'simple' && grade.scale">
2727
<ion-select name="grade" [(ngModel)]="grade.grade" interface="action-sheet" [disabled]="grade.disabled"
28-
[cancelText]="'core.cancel' | translate" [interfaceOptions]="{header: 'addon.mod_assign.grade' | translate}">
29-
<p class="item-heading" slot="label">{{ 'addon.mod_assign.grade' | translate }}</p>
28+
[cancelText]="'core.cancel' | translate" [interfaceOptions]="{header: 'core.gradenoun' | translate}">
29+
<p class="item-heading" slot="label">{{ 'core.gradenoun' | translate }}</p>
3030
<ion-select-option *ngFor="let grade of grade.scale" [value]="grade.value">
3131
{{grade.label}}
3232
</ion-select-option>

src/addons/mod/assign/components/submission/addon-mod-assign-submission.html

+1-1
Original file line numberDiff line numberDiff line change
@@ -357,7 +357,7 @@ <h3>{{ 'addon.mod_assign.attempt' | translate : { '$a' : attempt.attemptnumber +
357357
@if (attempt.grade) {
358358
<ion-item class="divider">
359359
<ion-label>
360-
<h4 class="big">{{'addon.mod_assign.grade' | translate}}</h4>
360+
<h4 class="big">{{'core.gradenoun' | translate}}</h4>
361361
</ion-label>
362362
</ion-item>
363363

src/addons/mod/assign/components/submission/submission.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -789,7 +789,7 @@ export class AddonModAssignSubmissionComponent implements OnInit, OnDestroy {
789789
*/
790790
showAdvancedGrade(grade: string): void {
791791
CoreViewer.viewText(
792-
Translate.instant('core.grades.grade'),
792+
Translate.instant('core.gradenoun'),
793793
grade,
794794
{
795795
component: ADDON_MOD_ASSIGN_COMPONENT_LEGACY,

src/addons/mod/assign/lang.json

-1
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,6 @@
4141
"extensionduedate": "Extension due date",
4242
"feedback": "Feedback",
4343
"feedbacknotsupported": "This feedback is not supported by the app and may not contain all the information.",
44-
"grade": "Grade",
4544
"graded": "Graded",
4645
"gradedby": "Graded by",
4746
"gradedfollowupsubmit": "Graded - resubmitted",

src/addons/mod/data/pages/entry/entry.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
import { Component, OnDestroy, ViewChild, ChangeDetectorRef, OnInit, Type } from '@angular/core';
1616
import { CoreCommentsCommentsComponent } from '@features/comments/components/comments/comments';
1717
import { CoreComments } from '@features/comments/services/comments';
18-
import { CoreCourse } from '@features/course/services/course';
18+
import { CoreCourseModuleHelper } from '@features/course/services/course-module-helper';
1919
import { CoreRatingInfo } from '@features/rating/services/rating';
2020
import { IonContent } from '@ionic/angular';
2121
import { CoreGroups, CoreGroupInfo } from '@services/groups';
@@ -117,7 +117,7 @@ export default class AddonModDataEntryPage implements OnInit, OnDestroy {
117117
constructor(
118118
private cdr: ChangeDetectorRef,
119119
) {
120-
this.moduleName = CoreCourse.translateModuleName('data');
120+
this.moduleName = CoreCourseModuleHelper.translateModuleName('data');
121121
this.siteId = CoreSites.getCurrentSiteId();
122122

123123
// Refresh data if this discussion is synchronized automatically.
@@ -450,7 +450,7 @@ export default class AddonModDataEntryPage implements OnInit, OnDestroy {
450450
await CorePromiseUtils.ignoreErrors(AddonModData.logView(this.database.id));
451451

452452
// Store module viewed because this page also updates recent accessed items block.
453-
CoreCourse.storeModuleViewed(this.courseId, this.moduleId);
453+
CoreCourseModuleHelper.storeModuleViewed(this.courseId, this.moduleId);
454454

455455
CoreAnalytics.logEvent({
456456
type: CoreAnalyticsEventType.VIEW_ITEM,

src/addons/mod/lesson/components/index/addon-mod-lesson-index.html

+1-1
Original file line numberDiff line numberDiff line change
@@ -191,7 +191,7 @@
191191
<core-user-avatar [user]="student" slot="start" [userId]="student.id" [courseId]="courseId" />
192192
<ion-label>
193193
<p class="item-heading">{{ student.fullname }}</p>
194-
<core-progress-bar [progress]="student.bestgrade" a11yText="addon.mod_lesson.grade" />
194+
<core-progress-bar [progress]="student.bestgrade" a11yText="core.gradenoun" />
195195
</ion-label>
196196
</ion-item>
197197
</ion-card>

src/addons/mod/lesson/lang.json

-1
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@
2828
"finishretakeoffline": "This attempt was finished offline.",
2929
"firstwrong": "You have answered incorrectly. Would you like to attempt the question again? (If you now answer the question correctly, it will not count towards your final score.)",
3030
"gotoendoflesson": "Go to the end of the lesson",
31-
"grade": "Grade",
3231
"highscore": "High score",
3332
"hightime": "High time",
3433
"leftduringtimed": "You have left during a timed lesson.<br />Please click on Continue to restart the lesson.",

src/addons/mod/lesson/pages/user-retake/user-retake.html

+2-2
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ <h1>{{ 'addon.mod_lesson.detailedstats' | translate }}</h1>
2020
<core-user-avatar [user]="student" slot="start" [userId]="student.id" [courseId]="courseId" [linkProfile]="false" />
2121
<ion-label>
2222
<h2>{{student.fullname}}</h2>
23-
<core-progress-bar [progress]="student.bestgrade" a11yText="addon.mod_lesson.grade" />
23+
<core-progress-bar [progress]="student.bestgrade" a11yText="core.gradenoun" />
2424
</ion-label>
2525
</ion-item>
2626

@@ -43,7 +43,7 @@ <h2>{{student.fullname}}</h2>
4343
<ion-grid class="ion-no-padding">
4444
<ion-row>
4545
<ion-col>
46-
<p class="item-heading">{{ 'addon.mod_lesson.grade' | translate }}</p>
46+
<p class="item-heading">{{ 'core.gradenoun' | translate }}</p>
4747
<p>{{ 'core.percentagenumber' | translate:{$a: retake.userstats.grade} }}</p>
4848
</ion-col>
4949

src/addons/mod/lti/services/handlers/module.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ import { CoreCourseModuleData } from '@features/course/services/course-helper';
1919
import { makeSingleton } from '@singletons';
2020
import { AddonModLtiHelper } from '../lti-helper';
2121
import { CoreModuleHandlerBase } from '@features/course/classes/module-base-handler';
22-
import { CoreCourse } from '@features/course/services/course';
22+
import { CoreCourseModuleHelper } from '@features/course/services/course-module-helper';
2323
import { ADDON_MOD_LTI_PAGE_NAME } from '../../constants';
2424
import { ModFeature, ModPurpose } from '@addons/mod/constants';
2525

@@ -63,7 +63,7 @@ export class AddonModLtiModuleHandlerService extends CoreModuleHandlerBase imple
6363
// Launch the LTI.
6464
AddonModLtiHelper.getDataAndLaunch(courseId, module);
6565

66-
CoreCourse.storeModuleViewed(courseId, module.id);
66+
CoreCourseModuleHelper.storeModuleViewed(courseId, module.id);
6767
},
6868
};
6969

@@ -83,7 +83,7 @@ export class AddonModLtiModuleHandlerService extends CoreModuleHandlerBase imple
8383
* @inheritdoc
8484
*/
8585
getIconSrc(module?: CoreCourseModuleData | undefined, modicon?: string | undefined): string | undefined {
86-
return module?.modicon ?? modicon ?? CoreCourse.getModuleIconSrc(this.modName);
86+
return module?.modicon ?? modicon ?? CoreCourseModuleHelper.getModuleIconSrc(this.modName);
8787
}
8888

8989
}

src/addons/mod/quiz/components/attempt-info/attempt-info.html

+55-55
Original file line numberDiff line numberDiff line change
@@ -13,66 +13,66 @@
1313
</ion-item>
1414

1515
@if (isFinished) {
16-
<ion-item class="ion-text-wrap addon-mod_quiz-attempt-completedon">
17-
<ion-label>
18-
<p class="item-heading">{{ 'addon.mod_quiz.completedon' | translate }}</p>
19-
<p>{{ attempt.timefinish! * 1000 | coreFormatDate }}</p>
20-
</ion-label>
21-
</ion-item>
16+
<ion-item class="ion-text-wrap addon-mod_quiz-attempt-completedon">
17+
<ion-label>
18+
<p class="item-heading">{{ 'addon.mod_quiz.completedon' | translate }}</p>
19+
<p>{{ attempt.timefinish! * 1000 | coreFormatDate }}</p>
20+
</ion-label>
21+
</ion-item>
2222

23-
@if (timeTaken) {
24-
<ion-item class="ion-text-wrap addon-mod_quiz-attempt-duration">
25-
<ion-label>
26-
<p class="item-heading">{{ 'addon.mod_quiz.attemptduration' | translate }}</p>
27-
<p>{{ timeTaken }}</p>
28-
</ion-label>
29-
</ion-item>
30-
}
23+
@if (timeTaken) {
24+
<ion-item class="ion-text-wrap addon-mod_quiz-attempt-duration">
25+
<ion-label>
26+
<p class="item-heading">{{ 'addon.mod_quiz.attemptduration' | translate }}</p>
27+
<p>{{ timeTaken }}</p>
28+
</ion-label>
29+
</ion-item>
30+
}
3131

32-
@if (overTime) {
33-
<ion-item class="ion-text-wrap addon-mod_quiz-attempt-overdue">
34-
<ion-label>
35-
<p class="item-heading">{{ 'addon.mod_quiz.overdue' | translate }}</p>
36-
<p>{{ overTime }}</p>
37-
</ion-label>
38-
</ion-item>
39-
}
32+
@if (overTime) {
33+
<ion-item class="ion-text-wrap addon-mod_quiz-attempt-overdue">
34+
<ion-label>
35+
<p class="item-heading">{{ 'addon.mod_quiz.overdue' | translate }}</p>
36+
<p>{{ overTime }}</p>
37+
</ion-label>
38+
</ion-item>
39+
}
4040

41-
@for (gradeItemMark of gradeItemMarks; track $index) {
42-
<ion-item class="ion-text-wrap addon-mod_quiz-attempt-gradeitemmark">
43-
<ion-label>
44-
<p class="item-heading">{{ gradeItemMark.name }}</p>
45-
<p [innerHTML]="gradeItemMark.grade"></p>
46-
</ion-label>
47-
</ion-item>
48-
}
41+
@for (gradeItemMark of gradeItemMarks; track $index) {
42+
<ion-item class="ion-text-wrap addon-mod_quiz-attempt-gradeitemmark">
43+
<ion-label>
44+
<p class="item-heading">{{ gradeItemMark.name }}</p>
45+
<p [innerHTML]="gradeItemMark.grade"></p>
46+
</ion-label>
47+
</ion-item>
48+
}
4949

50-
@if (quiz.showAttemptsMarks && readableMark && attempt?.sumgrades !== null) {
51-
<ion-item class="ion-text-wrap addon-mod_quiz-attempt-mark">
52-
<ion-label>
53-
<p class="item-heading">{{ 'addon.mod_quiz.marks' | translate }}</p>
54-
<p>{{ readableMark }}</p>
55-
</ion-label>
56-
</ion-item>
57-
}
50+
@if (quiz.showAttemptsMarks && readableMark && attempt?.sumgrades !== null) {
51+
<ion-item class="ion-text-wrap addon-mod_quiz-attempt-mark">
52+
<ion-label>
53+
<p class="item-heading">{{ 'addon.mod_quiz.marks' | translate }}</p>
54+
<p>{{ readableMark }}</p>
55+
</ion-label>
56+
</ion-item>
57+
}
5858

59-
@if (readableGrade) {
60-
<ion-item class="ion-text-wrap addon-mod_quiz-attempt-grade">
61-
<ion-label>
62-
<p class="item-heading">{{ 'addon.mod_quiz.grade' | translate }}</p>
63-
<p [innerHTML]="readableGrade"></p>
64-
</ion-label>
65-
</ion-item>
66-
}
59+
@if (readableGrade) {
60+
<ion-item class="ion-text-wrap addon-mod_quiz-attempt-grade">
61+
<ion-label>
62+
<p class="item-heading">{{ 'core.gradenoun' | translate }}</p>
63+
<p [innerHTML]="readableGrade"></p>
64+
</ion-label>
65+
</ion-item>
66+
}
6767

68-
@for (data of additionalData; track data.id) {
69-
<ion-item class="ion-text-wrap addon-mod_quiz-attempt-{{data.id}}">
70-
<ion-label>
71-
<p class="item-heading">{{ data.title }}</p>
72-
<core-format-text [component]="component" [componentId]="quiz.coursemodule" [text]="data.content" contextLevel="module"
73-
[contextInstanceId]="quiz.coursemodule" [courseId]="quiz.course" />
74-
</ion-label>
75-
</ion-item>
76-
}
68+
@for (data of additionalData; track data.id) {
69+
<ion-item class="ion-text-wrap addon-mod_quiz-attempt-{{data.id}}">
70+
<ion-label>
71+
<p class="item-heading">{{ data.title }}</p>
72+
<core-format-text [component]="component" [componentId]="quiz.coursemodule" [text]="data.content" contextLevel="module"
73+
[contextInstanceId]="quiz.coursemodule" [courseId]="quiz.course" />
74+
</ion-label>
75+
</ion-item>
76+
}
7777

7878
}

0 commit comments

Comments
 (0)