diff --git a/src/core/features/course/pages/contents/contents.ts b/src/core/features/course/pages/contents/contents.ts
index 2cccc6ecb..3a95835d6 100644
--- a/src/core/features/course/pages/contents/contents.ts
+++ b/src/core/features/course/pages/contents/contents.ts
@@ -89,16 +89,16 @@ export class CoreCourseContentsPage implements OnInit, OnDestroy {
* Component being initialized.
*/
async ngOnInit(): Promise {
- const course = CoreNavigator.getRouteParam('course');
- if (!course) {
- CoreDomUtils.showErrorModal('Missing required course parameter.');
+ try {
+ this.course = CoreNavigator.getRequiredRouteParam('course');
+ } catch (error) {
+ CoreDomUtils.showErrorModal(error);
CoreNavigator.back();
return;
}
- this.course = course;
this.sectionId = CoreNavigator.getRouteNumberParam('sectionId');
this.sectionNumber = CoreNavigator.getRouteNumberParam('sectionNumber');
this.moduleId = CoreNavigator.getRouteNumberParam('moduleId');
diff --git a/src/core/features/course/services/course-helper.ts b/src/core/features/course/services/course-helper.ts
index 5b322d60d..b87b0ab95 100644
--- a/src/core/features/course/services/course-helper.ts
+++ b/src/core/features/course/services/course-helper.ts
@@ -190,8 +190,8 @@ export class CoreCourseHelperProvider {
hasContent = true;
- section.modules.forEach((module) => {
- module.handlerData = CoreCourseModuleDelegate.getModuleDataFor(
+ section.modules.forEach(async (module) => {
+ module.handlerData = await CoreCourseModuleDelegate.getModuleDataFor(
module.modname,
module,
courseId,
@@ -1610,7 +1610,7 @@ export class CoreCourseHelperProvider {
if (CoreSites.getCurrentSiteId() == site.getId()) {
// Try to use the module's handler to navigate cleanly.
- module.handlerData = CoreCourseModuleDelegate.getModuleDataFor(
+ module.handlerData = await CoreCourseModuleDelegate.getModuleDataFor(
module.modname,
module,
courseId,
@@ -1664,9 +1664,9 @@ export class CoreCourseHelperProvider {
* @param modParams Params to pass to the module
* @param True if module can be opened, false otherwise.
*/
- openModule(module: CoreCourseModule, courseId: number, sectionId?: number, modParams?: Params): boolean {
+ async openModule(module: CoreCourseModule, courseId: number, sectionId?: number, modParams?: Params): Promise {
if (!module.handlerData) {
- module.handlerData = CoreCourseModuleDelegate.getModuleDataFor(
+ module.handlerData = await CoreCourseModuleDelegate.getModuleDataFor(
module.modname,
module,
courseId,
diff --git a/src/core/features/course/services/course.ts b/src/core/features/course/services/course.ts
index c714008fa..81505df14 100644
--- a/src/core/features/course/services/course.ts
+++ b/src/core/features/course/services/course.ts
@@ -83,7 +83,7 @@ export class CoreCourseProvider {
static readonly COMPONENT = 'CoreCourse';
- protected readonly CORE_MODULES = [
+ readonly CORE_MODULES = [
'assign', 'assignment', 'book', 'chat', 'choice', 'data', 'database', 'date', 'external-tool',
'feedback', 'file', 'folder', 'forum', 'glossary', 'ims', 'imscp', 'label', 'lesson', 'lti', 'page', 'quiz',
'resource', 'scorm', 'survey', 'url', 'wiki', 'workshop', 'h5pactivity',
@@ -402,15 +402,16 @@ export class CoreCourseProvider {
): Promise => {
const params: CoreCourseGetContentsParams = {
courseid: courseId!,
- options: [],
};
+ params.options = [];
+
const preSets: CoreSiteWSPreSets = {
omitExpires: preferCache,
updateFrequency: CoreSite.FREQUENCY_RARELY,
};
if (includeStealth) {
- params.options!.push({
+ params.options.push({
name: 'includestealthmodules',
value: true,
});
@@ -418,13 +419,13 @@ export class CoreCourseProvider {
// If modName is set, retrieve all modules of that type. Otherwise get only the module.
if (modName) {
- params.options!.push({
+ params.options.push({
name: 'modname',
value: modName,
});
preSets.cacheKey = this.getModuleByModNameCacheKey(modName);
} else {
- params.options!.push({
+ params.options.push({
name: 'cmid',
value: moduleId,
});
@@ -520,7 +521,7 @@ export class CoreCourseProvider {
const params: CoreCourseGetCourseModuleWSParams = {
cmid: moduleId,
};
- const preSets = {
+ const preSets: CoreSiteWSPreSets = {
cacheKey: this.getModuleCacheKey(moduleId),
updateFrequency: CoreSite.FREQUENCY_RARELY,
};
@@ -528,11 +529,9 @@ export class CoreCourseProvider {
if (response.warnings && response.warnings.length) {
throw new CoreWSError(response.warnings[0]);
- } else if (response.cm) {
- return response.cm;
}
- throw Error('WS core_course_get_course_module failed.');
+ return response.cm;
}
/**
@@ -632,7 +631,11 @@ export class CoreCourseProvider {
* @param modicon The mod icon string to use in case we are not using a core activity.
* @return The IMG src.
*/
- getModuleIconSrc(moduleName: string, modicon?: string): string {
+ async getModuleIconSrc(moduleName: string, modicon?: string, mimetypeIcon = ''): Promise {
+ if (mimetypeIcon) {
+ return mimetypeIcon;
+ }
+
if (this.CORE_MODULES.indexOf(moduleName) < 0) {
if (modicon) {
return modicon;
@@ -1491,7 +1494,7 @@ export type CoreCourseWSModule = {
label: string;
timestamp: number;
}[]; // @since 3.11. Activity dates.
- contentsinfo?: { // Contents summary information.
+ contentsinfo?: { // @since v3.7.6 Contents summary information.
filescount: number; // Total number of files.
filessize: number; // Total files size.
lastmodified: number; // Last time files were modified.
diff --git a/src/core/features/course/services/handlers/default-module.ts b/src/core/features/course/services/handlers/default-module.ts
index 75dfd0586..25bf41663 100644
--- a/src/core/features/course/services/handlers/default-module.ts
+++ b/src/core/features/course/services/handlers/default-module.ts
@@ -16,7 +16,7 @@ import { Injectable, Type } from '@angular/core';
import { CoreSites } from '@services/sites';
import { CoreCourseModuleHandler, CoreCourseModuleHandlerData } from '../module-delegate';
-import { CoreCourse, CoreCourseAnyModuleData } from '../course';
+import { CoreCourse } from '../course';
import { CoreCourseModule } from '../course-helper';
import { CoreCourseUnsupportedModuleComponent } from '@features/course/components/unsupported-module/unsupported-module';
import { CoreNavigationOptions, CoreNavigator } from '@services/navigator';
@@ -41,12 +41,12 @@ export class CoreCourseModuleDefaultHandler implements CoreCourseModuleHandler {
/**
* @inheritdoc
*/
- getData(
- module: CoreCourseAnyModuleData,
- ): CoreCourseModuleHandlerData {
+ async getData(
+ module: CoreCourseModule,
+ ): Promise {
// Return the default data.
const defaultData: CoreCourseModuleHandlerData = {
- icon: CoreCourse.getModuleIconSrc(module.modname, 'modicon' in module ? module.modicon : undefined),
+ icon: await CoreCourse.getModuleIconSrc(module.modname, module.modicon),
title: module.name,
class: 'core-course-default-handler core-course-module-' + module.modname + '-handler',
action: (event: Event, module: CoreCourseModule, courseId: number, options?: CoreNavigationOptions) => {
diff --git a/src/core/features/course/services/module-delegate.ts b/src/core/features/course/services/module-delegate.ts
index 072188859..f967c89a5 100644
--- a/src/core/features/course/services/module-delegate.ts
+++ b/src/core/features/course/services/module-delegate.ts
@@ -20,7 +20,7 @@ import { CoreSite } from '@classes/site';
import { CoreCourseModuleDefaultHandler } from './handlers/default-module';
import { CoreDelegate, CoreDelegateHandler } from '@classes/delegate';
import { CoreCourseAnyCourseData } from '@features/courses/services/courses';
-import { CoreCourse, CoreCourseAnyModuleData, CoreCourseWSModule } from './course';
+import { CoreCourse, CoreCourseWSModule } from './course';
import { CoreSites } from '@services/sites';
import { makeSingleton } from '@singletons';
import { CoreCourseModule } from './course-helper';
@@ -52,11 +52,11 @@ export interface CoreCourseModuleHandler extends CoreDelegateHandler {
* @return Data to render the module.
*/
getData(
- module: CoreCourseAnyModuleData,
+ module: CoreCourseModule,
courseId: number,
sectionId?: number,
forCoursePage?: boolean,
- ): CoreCourseModuleHandlerData;
+ ): Promise | CoreCourseModuleHandlerData;
/**
* Get the component to render the module. This is needed to support singleactivity course format.
@@ -82,7 +82,7 @@ export interface CoreCourseModuleHandler extends CoreDelegateHandler {
*
* @return The icon src.
*/
- getIconSrc?(): string | undefined;
+ getIconSrc?(module: CoreCourseWSModule): Promise | string | undefined;
/**
* Check if this type of module supports a certain feature.
@@ -277,14 +277,14 @@ export class CoreCourseModuleDelegateService extends CoreDelegate(
+ ): Promise {
+ return await this.executeFunctionOnEnabled(
modname,
'getData',
[module, courseId, sectionId, forCoursePage],
@@ -343,12 +343,12 @@ export class CoreCourseModuleDelegateService extends CoreDelegate(modname, 'getIconSrc') ||
- CoreCourse.getModuleIconSrc(modname, modicon) ||
- '';
+ async getModuleIconSrc(modname: string, modicon?: string): Promise {
+ const icon = await this.executeFunctionOnEnabled>(modname, 'getIconSrc');
+
+ return icon || await CoreCourse.getModuleIconSrc(modname, modicon) || '';
}
/**
diff --git a/src/core/features/grades/pages/course/course.html b/src/core/features/grades/pages/course/course.html
index c4d8ee0fd..3883ca2d3 100644
--- a/src/core/features/grades/pages/course/course.html
+++ b/src/core/features/grades/pages/course/course.html
@@ -52,8 +52,11 @@
>
-
+
+
diff --git a/src/core/features/grades/pages/course/course.page.ts b/src/core/features/grades/pages/course/course.page.ts
index ee13e8248..224d9369b 100644
--- a/src/core/features/grades/pages/course/course.page.ts
+++ b/src/core/features/grades/pages/course/course.page.ts
@@ -114,7 +114,7 @@ export class CoreGradesCoursePage implements AfterViewInit, OnDestroy {
* Update the table of grades.
*/
private async fetchGrades(): Promise {
- const table = await CoreGrades.getCourseGradesTable(this.grades.courseId!, this.grades.userId);
+ const table = await CoreGrades.getCourseGradesTable(this.grades.courseId, this.grades.userId);
const formattedTable = await CoreGradesHelper.formatGradesTable(table);
this.grades.setTable(formattedTable);
@@ -192,7 +192,7 @@ class CoreGradesCourseManager extends CorePageItemsListManager {
- await CoreGrades.logCourseGradesView(this.courseId!, this.userId!);
+ await CoreGrades.logCourseGradesView(this.courseId, this.userId);
}
/**
diff --git a/src/core/features/grades/pages/course/course.scss b/src/core/features/grades/pages/course/course.scss
index aca518a0f..2f0239c09 100644
--- a/src/core/features/grades/pages/course/course.scss
+++ b/src/core/features/grades/pages/course/course.scss
@@ -82,6 +82,11 @@
height: 16px;
}
+ core-mod-icon {
+ --size: 16px;
+ }
+
+
ion-icon {
color: var(--icon-color);
}
@@ -119,6 +124,11 @@
background-color: var(--cell-hover);
}
}
+
+ th, td {
+ height: var(--a11y-min-target-size);
+ vertical-align: middle;
+ }
}
}
diff --git a/src/core/features/grades/pages/grade/grade.html b/src/core/features/grades/pages/grade/grade.html
index 4b3198ee2..9abe2b1f3 100644
--- a/src/core/features/grades/pages/grade/grade.html
+++ b/src/core/features/grades/pages/grade/grade.html
@@ -17,8 +17,9 @@
-
+
+
+
@@ -27,7 +28,9 @@
-
+
+
+
diff --git a/src/core/features/grades/services/grades-helper.ts b/src/core/features/grades/services/grades-helper.ts
index 3d003415b..319dc9313 100644
--- a/src/core/features/grades/services/grades-helper.ts
+++ b/src/core/features/grades/services/grades-helper.ts
@@ -54,7 +54,7 @@ export class CoreGradesHelperProvider {
* @param tableRow JSON object representing row of grades table data.
* @return Formatted row object.
*/
- protected formatGradeRow(tableRow: CoreGradesTableRow): CoreGradesFormattedRow {
+ protected async formatGradeRow(tableRow: CoreGradesTableRow): Promise {
const row: CoreGradesFormattedRow = {
rowclass: '',
};
@@ -68,7 +68,7 @@ export class CoreGradesHelperProvider {
let content = String(column.content);
if (name == 'itemname') {
- this.setRowIcon(row, content);
+ await this.setRowIcon(row, content);
row.link = this.getModuleLink(content);
row.rowclass += column.class.indexOf('hidden') >= 0 ? ' hidden' : '';
row.rowclass += column.class.indexOf('dimmed_text') >= 0 ? ' dimmed_text' : '';
@@ -95,7 +95,7 @@ export class CoreGradesHelperProvider {
* @param tableRow JSON object representing row of grades table data.
* @return Formatted row object.
*/
- protected formatGradeRowForTable(tableRow: CoreGradesTableRow): CoreGradesFormattedTableRow {
+ protected async formatGradeRowForTable(tableRow: CoreGradesTableRow): Promise {
const row: CoreGradesFormattedTableRow = {};
for (let name in tableRow) {
const column: CoreGradesTableColumn = tableRow[name];
@@ -113,7 +113,7 @@ export class CoreGradesHelperProvider {
row.colspan = itemNameColumn.colspan;
row.rowspan = tableRow.leader?.rowspan || 1;
- this.setRowIcon(row, content);
+ await this.setRowIcon(row, content);
row.rowclass = itemNameColumn.class.indexOf('leveleven') < 0 ? 'odd' : 'even';
row.rowclass += itemNameColumn.class.indexOf('hidden') >= 0 ? ' hidden' : '';
row.rowclass += itemNameColumn.class.indexOf('dimmed_text') >= 0 ? ' dimmed_text' : '';
@@ -158,7 +158,7 @@ export class CoreGradesHelperProvider {
* @param table JSON object representing a table with data.
* @return Formatted HTML table.
*/
- formatGradesTable(table: CoreGradesTable): CoreGradesFormattedTable {
+ async formatGradesTable(table: CoreGradesTable): Promise {
const maxDepth = table.maxdepth;
const formatted: CoreGradesFormattedTable = {
columns: [],
@@ -178,7 +178,7 @@ export class CoreGradesHelperProvider {
feedback: false,
contributiontocoursetotal: false,
};
- formatted.rows = table.tabledata.map(row => this.formatGradeRowForTable(row));
+ formatted.rows = await Promise.all(table.tabledata.map(row => this.formatGradeRowForTable(row)));
// Get a row with some info.
let normalRow = formatted.rows.find(
@@ -382,7 +382,7 @@ export class CoreGradesHelperProvider {
* @param gradeId Grade Object identifier.
* @return Formatted HTML table.
*/
- getGradesTableRow(table: CoreGradesTable, gradeId: number): CoreGradesFormattedRow | null {
+ async getGradesTableRow(table: CoreGradesTable, gradeId: number): Promise {
if (table.tabledata) {
const selectedRow = table.tabledata.find(
(row) =>
@@ -393,7 +393,7 @@ export class CoreGradesHelperProvider {
);
if (selectedRow) {
- return this.formatGradeRow(selectedRow);
+ return await this.formatGradeRow(selectedRow);
}
}
@@ -408,7 +408,7 @@ export class CoreGradesHelperProvider {
* @return Formatted HTML table.
* @deprecated since app 4.0
*/
- getModuleGradesTableRows(table: CoreGradesTable, moduleId: number): CoreGradesFormattedRow[] {
+ async getModuleGradesTableRows(table: CoreGradesTable, moduleId: number): Promise {
if (!table.tabledata) {
return [];
}
@@ -416,7 +416,7 @@ export class CoreGradesHelperProvider {
// Find href containing "/mod/xxx/xxx.php".
const regex = /href="([^"]*\/mod\/[^"|^/]*\/[^"|^.]*\.php[^"]*)/;
- return table.tabledata.filter((row) => {
+ return await Promise.all(table.tabledata.filter((row) => {
if (row.itemname && row.itemname.content) {
const matches = row.itemname.content.match(regex);
@@ -428,7 +428,7 @@ export class CoreGradesHelperProvider {
}
return false;
- }).map((row) => this.formatGradeRow(row));
+ }).map((row) => this.formatGradeRow(row)));
}
/**
@@ -534,7 +534,7 @@ export class CoreGradesHelperProvider {
* @param text HTML where the image will be rendered.
* @return Row object with the image.
*/
- protected setRowIcon(row: T, text: string): T {
+ protected async setRowIcon(row: T, text: string): Promise {
text = text.replace('%2F', '/').replace('%2f', '/');
if (text.indexOf('/agg_mean') > -1) {
row.itemtype = 'agg_mean';
@@ -566,7 +566,7 @@ export class CoreGradesHelperProvider {
row.itemtype = 'mod';
row.itemmodule = module[1];
row.iconAlt = CoreCourse.translateModuleName(row.itemmodule) || '';
- row.image = CoreCourse.getModuleIconSrc(
+ row.image = await CoreCourse.getModuleIconSrc(
module[1],
CoreDomUtils.convertToElement(text).querySelector('img')?.getAttribute('src') ?? undefined,
);
diff --git a/src/core/features/sitehome/pages/index/index.ts b/src/core/features/sitehome/pages/index/index.ts
index 8976ef25e..7f59dae6d 100644
--- a/src/core/features/sitehome/pages/index/index.ts
+++ b/src/core/features/sitehome/pages/index/index.ts
@@ -17,7 +17,7 @@ import { IonRefresher } from '@ionic/angular';
import { Params } from '@angular/router';
import { CoreSite, CoreSiteConfig } from '@classes/site';
-import { CoreCourse, CoreCourseModuleBasicInfo, CoreCourseWSSection } from '@features/course/services/course';
+import { CoreCourse, CoreCourseWSModule, CoreCourseWSSection } from '@features/course/services/course';
import { CoreDomUtils } from '@services/utils/dom';
import { CoreSites } from '@services/sites';
import { CoreSiteHome } from '@features/sitehome/services/sitehome';
@@ -48,7 +48,7 @@ export class CoreSiteHomeIndexPage implements OnInit, OnDestroy {
hasContent = false;
items: string[] = [];
siteHomeId = 1;
- currentSite?: CoreSite;
+ currentSite!: CoreSite;
searchEnabled = false;
downloadEnabled = false;
downloadCourseEnabled = false;
@@ -75,7 +75,7 @@ export class CoreSiteHomeIndexPage implements OnInit, OnDestroy {
this.switchDownload(this.downloadEnabled && this.downloadCourseEnabled && this.downloadCoursesEnabled);
}, CoreSites.getCurrentSiteId());
- this.currentSite = CoreSites.getCurrentSite()!;
+ this.currentSite = CoreSites.getRequiredCurrentSite();
this.siteHomeId = CoreSites.getCurrentSiteHomeId();
const module = CoreNavigator.getRouteParam('module');
@@ -97,7 +97,7 @@ export class CoreSiteHomeIndexPage implements OnInit, OnDestroy {
protected async loadContent(): Promise {
this.hasContent = false;
- const config = this.currentSite!.getStoredConfig() || { numsections: 1, frontpageloggedin: undefined };
+ const config = this.currentSite.getStoredConfig() || { numsections: 1, frontpageloggedin: undefined };
this.items = await CoreSiteHome.getFrontPageItems(config.frontpageloggedin);
this.hasContent = this.items.length > 0;
@@ -105,13 +105,13 @@ export class CoreSiteHomeIndexPage implements OnInit, OnDestroy {
if (this.items.some((item) => item == 'NEWS_ITEMS')) {
// Get the news forum.
try {
- const forum = await CoreSiteHome.getNewsForum();
- this.newsForumModule = await CoreCourse.getModuleBasicInfo(forum.cmid);
- this.newsForumModule.handlerData = CoreCourseModuleDelegate.getModuleDataFor(
+ const forum = await CoreSiteHome.getNewsForum(this.siteHomeId);
+ this.newsForumModule = await CoreCourse.getModule(forum.cmid, forum.course);
+ this.newsForumModule.handlerData = await CoreCourseModuleDelegate.getModuleDataFor(
this.newsForumModule.modname,
this.newsForumModule,
this.siteHomeId,
- this.newsForumModule.section,
+ undefined,
true,
);
} catch {
@@ -120,7 +120,7 @@ export class CoreSiteHomeIndexPage implements OnInit, OnDestroy {
}
try {
- const sections = await CoreCourse.getSections(this.siteHomeId!, false, true);
+ const sections = await CoreCourse.getSections(this.siteHomeId, false, true);
// Check "Include a topic section" setting from numsections.
this.section = config.numsections ? sections.find((section) => section.section == 1) : undefined;
@@ -137,10 +137,10 @@ export class CoreSiteHomeIndexPage implements OnInit, OnDestroy {
// Add log in Moodle.
CoreCourse.logView(
- this.siteHomeId!,
+ this.siteHomeId,
undefined,
undefined,
- this.currentSite!.getInfo()?.sitename,
+ this.currentSite.getInfo()?.sitename,
).catch(() => {
// Ignore errors.
});
@@ -157,11 +157,11 @@ export class CoreSiteHomeIndexPage implements OnInit, OnDestroy {
doRefresh(refresher?: IonRefresher): void {
const promises: Promise[] = [];
- promises.push(CoreCourse.invalidateSections(this.siteHomeId!));
- promises.push(this.currentSite!.invalidateConfig().then(async () => {
+ promises.push(CoreCourse.invalidateSections(this.siteHomeId));
+ promises.push(this.currentSite.invalidateConfig().then(async () => {
// Config invalidated, fetch it again.
- const config: CoreSiteConfig = await this.currentSite!.getConfig();
- this.currentSite!.setConfig(config);
+ const config: CoreSiteConfig = await this.currentSite.getConfig();
+ this.currentSite.setConfig(config);
return;
}));
@@ -251,6 +251,6 @@ export class CoreSiteHomeIndexPage implements OnInit, OnDestroy {
}
-type NewsForum = CoreCourseModuleBasicInfo & {
+type NewsForum = CoreCourseWSModule & {
handlerData?: CoreCourseModuleHandlerData;
};
diff --git a/src/core/features/sitehome/services/sitehome.ts b/src/core/features/sitehome/services/sitehome.ts
index 8cb52346d..3de9e2ef9 100644
--- a/src/core/features/sitehome/services/sitehome.ts
+++ b/src/core/features/sitehome/services/sitehome.ts
@@ -20,6 +20,7 @@ import { makeSingleton } from '@singletons';
import { CoreCourse } from '../../course/services/course';
import { CoreCourses } from '../../courses/services/courses';
import { AddonModForum, AddonModForumData } from '@addons/mod/forum/services/forum';
+import { CoreError } from '@classes/errors/error';
/**
* Items with index 1 and 3 were removed on 2.5 and not being supported in the app.
@@ -57,7 +58,7 @@ export class CoreSiteHomeProvider {
return forum;
}
- throw null;
+ throw new CoreError('No news forum found');
}
/**
diff --git a/src/core/features/tag/components/feed/core-tag-feed.html b/src/core/features/tag/components/feed/core-tag-feed.html
index b0f626f67..1be13ee74 100644
--- a/src/core/features/tag/components/feed/core-tag-feed.html
+++ b/src/core/features/tag/components/feed/core-tag-feed.html
@@ -3,8 +3,8 @@
-
+
+
{{ item.heading }}
{{ text }}
diff --git a/src/theme/theme.base.scss b/src/theme/theme.base.scss
index ef149d2ca..0253a989c 100644
--- a/src/theme/theme.base.scss
+++ b/src/theme/theme.base.scss
@@ -527,36 +527,10 @@ img[core-external-content]:not([src]) {
visibility: hidden;
}
-// Activity modules
-.core-module-icon {
- --size: var(--module-icon-size);
- width: var(--size);
- height: var(--size);
- max-width: var(--size);
- max-height: var(--size);
-}
-
-ion-item img.core-module-icon[slot="start"] {
- margin-top: 12px;
- margin-bottom: 12px;
- margin-right: 32px;
-}
-
-ion-card ion-item img.core-module-icon[slot="start"] {
- margin-top: 12px;
- margin-bottom: 12px;
- margin-right: 12px;
-}
-
ion-card ion-item:only-child {
--inner-border-width: 0;
}
-[dir=rtl] ion-item img.core-module-icon[slot="start"] {
- margin-right: unset;
- margin-left: 32px;
-}
-
.core-course-module-handler:not(.addon-mod-label-handler) .item-heading .filter_mathjaxloader_equation div {
display: inline !important;
}