MOBILE-3757 course: Display activity dates in course page
parent
b8c37b63b4
commit
962cd43d9e
|
@ -146,7 +146,8 @@
|
||||||
<ng-container *ngFor="let module of section.modules">
|
<ng-container *ngFor="let module of section.modules">
|
||||||
<core-course-module *ngIf="module.visibleoncoursepage !== 0" [module]="module" [courseId]="course?.id"
|
<core-course-module *ngIf="module.visibleoncoursepage !== 0" [module]="module" [courseId]="course?.id"
|
||||||
[downloadEnabled]="downloadEnabled" [section]="section" (completionChanged)="onCompletionChange($event)"
|
[downloadEnabled]="downloadEnabled" [section]="section" (completionChanged)="onCompletionChange($event)"
|
||||||
(statusChanged)="onModuleStatusChange()">
|
(statusChanged)="onModuleStatusChange()" [showActivityDates]="course?.showactivitydates"
|
||||||
|
[showCompletionConditions]="course?.showcompletionconditions">
|
||||||
</core-course-module>
|
</core-course-module>
|
||||||
</ng-container>
|
</ng-container>
|
||||||
</section>
|
</section>
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
(click)="moduleClicked($event)"
|
(click)="moduleClicked($event)"
|
||||||
[attr.aria-label]="module.handlerData.a11yTitle"
|
[attr.aria-label]="module.handlerData.a11yTitle"
|
||||||
[ngClass]="{
|
[ngClass]="{
|
||||||
'has-module-description': module.description,
|
'has-module-info': hasInfo,
|
||||||
'item-media': module.handlerData.icon,
|
'item-media': module.handlerData.icon,
|
||||||
'item-dimmed': module.visible === 0 || module.uservisible === false
|
'item-dimmed': module.visible === 0 || module.uservisible === false
|
||||||
}"
|
}"
|
||||||
|
@ -74,9 +74,9 @@
|
||||||
</div>
|
</div>
|
||||||
</ion-item>
|
</ion-item>
|
||||||
<ion-item
|
<ion-item
|
||||||
*ngIf="module.description"
|
*ngIf="hasInfo"
|
||||||
id="core-course-module-{{module.id}}-info"
|
id="core-course-module-{{module.id}}-info"
|
||||||
class="ion-text-wrap core-course-module-handler core-module-module-description {{module.handlerData.class}}"
|
class="ion-text-wrap core-course-module-handler core-module-module-info {{module.handlerData.class}}"
|
||||||
[ngClass]="{
|
[ngClass]="{
|
||||||
'item-media': module.handlerData.icon,
|
'item-media': module.handlerData.icon,
|
||||||
'item-dimmed': module.visible === 0 || module.uservisible === false
|
'item-dimmed': module.visible === 0 || module.uservisible === false
|
||||||
|
@ -84,6 +84,11 @@
|
||||||
detail="false"
|
detail="false"
|
||||||
>
|
>
|
||||||
<ion-label>
|
<ion-label>
|
||||||
|
<div *ngIf="showActivityDates && module.dates && module.dates.length" class="core-module-dates">
|
||||||
|
<p *ngFor="let date of module.dates">
|
||||||
|
<strong>{{ date.label }}</strong> {{ date.timestamp * 1000 | coreFormatDate:'strftimedatetime' }}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
<core-format-text class="core-module-description" *ngIf="module.description" maxHeight="80" [text]="module.description"
|
<core-format-text class="core-module-description" *ngIf="module.description" maxHeight="80" [text]="module.description"
|
||||||
contextLevel="module" [contextInstanceId]="module.id" [courseId]="courseId">
|
contextLevel="module" [contextInstanceId]="module.id" [courseId]="courseId">
|
||||||
</core-format-text>
|
</core-format-text>
|
||||||
|
|
|
@ -31,7 +31,7 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.core-module-module-description {
|
.core-module-module-info {
|
||||||
ion-badge {
|
ion-badge {
|
||||||
text-align: start;
|
text-align: start;
|
||||||
}
|
}
|
||||||
|
@ -51,15 +51,15 @@
|
||||||
clear: both;
|
clear: both;
|
||||||
}
|
}
|
||||||
|
|
||||||
.core-module-main-item + .core-module-module-description ion-label {
|
.core-module-main-item + .core-module-module-info ion-label {
|
||||||
margin-top: 0px;
|
margin-top: 0px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.core-module-main-item.has-module-description {
|
.core-module-main-item.has-module-info {
|
||||||
--inner-border-width: 0;
|
--inner-border-width: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
.core-module-module-description ion-label {
|
.core-module-module-info ion-label {
|
||||||
margin-inline-start: 50px;
|
margin-inline-start: 50px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -47,6 +47,8 @@ export class CoreCourseModuleComponent implements OnInit, OnDestroy {
|
||||||
@Input() module!: CoreCourseModule; // The module to render.
|
@Input() module!: CoreCourseModule; // The module to render.
|
||||||
@Input() courseId?: number; // The course the module belongs to.
|
@Input() courseId?: number; // The course the module belongs to.
|
||||||
@Input() section?: CoreCourseSection; // The section the module belongs to.
|
@Input() section?: CoreCourseSection; // The section the module belongs to.
|
||||||
|
@Input() showActivityDates = false; // Whether to show activity dates.
|
||||||
|
@Input() showCompletionConditions = false; // Whether to show activity completion conditions.
|
||||||
// eslint-disable-next-line @angular-eslint/no-input-rename
|
// eslint-disable-next-line @angular-eslint/no-input-rename
|
||||||
@Input('downloadEnabled') set enabled(value: boolean) {
|
@Input('downloadEnabled') set enabled(value: boolean) {
|
||||||
this.downloadEnabled = value;
|
this.downloadEnabled = value;
|
||||||
|
@ -61,7 +63,7 @@ export class CoreCourseModuleComponent implements OnInit, OnDestroy {
|
||||||
|
|
||||||
// Get current status to decide which icon should be shown.
|
// Get current status to decide which icon should be shown.
|
||||||
this.calculateAndShowStatus();
|
this.calculateAndShowStatus();
|
||||||
};
|
}
|
||||||
|
|
||||||
@Output() completionChanged = new EventEmitter<CoreCourseModuleCompletionData>(); // Notify when module completion changes.
|
@Output() completionChanged = new EventEmitter<CoreCourseModuleCompletionData>(); // Notify when module completion changes.
|
||||||
@Output() statusChanged = new EventEmitter<CoreCourseModuleStatusChangedData>(); // Notify when the download status changes.
|
@Output() statusChanged = new EventEmitter<CoreCourseModuleStatusChangedData>(); // Notify when the download status changes.
|
||||||
|
@ -71,6 +73,7 @@ export class CoreCourseModuleComponent implements OnInit, OnDestroy {
|
||||||
spinner?: boolean; // Whether to display a loading spinner.
|
spinner?: boolean; // Whether to display a loading spinner.
|
||||||
downloadEnabled?: boolean; // Whether the download of sections and modules is enabled.
|
downloadEnabled?: boolean; // Whether the download of sections and modules is enabled.
|
||||||
modNameTranslated = '';
|
modNameTranslated = '';
|
||||||
|
hasInfo = false;
|
||||||
|
|
||||||
protected prefetchHandler?: CoreCourseModulePrefetchHandler;
|
protected prefetchHandler?: CoreCourseModulePrefetchHandler;
|
||||||
protected statusObserver?: CoreEventObserver;
|
protected statusObserver?: CoreEventObserver;
|
||||||
|
@ -89,6 +92,10 @@ export class CoreCourseModuleComponent implements OnInit, OnDestroy {
|
||||||
}
|
}
|
||||||
|
|
||||||
this.module.handlerData.a11yTitle = this.module.handlerData.a11yTitle ?? this.module.handlerData.title;
|
this.module.handlerData.a11yTitle = this.module.handlerData.a11yTitle ?? this.module.handlerData.title;
|
||||||
|
this.hasInfo = !!(
|
||||||
|
this.module.description ||
|
||||||
|
(this.showActivityDates && this.module.dates && this.module.dates.length)
|
||||||
|
);
|
||||||
|
|
||||||
if (this.module.handlerData.showDownloadButton) {
|
if (this.module.handlerData.showDownloadButton) {
|
||||||
// Listen for changes on this module status, even if download isn't enabled.
|
// Listen for changes on this module status, even if download isn't enabled.
|
||||||
|
|
|
@ -1262,6 +1262,8 @@ export type CoreCourseSummary = {
|
||||||
timeaccess?: number; // @since 3.6. Timeaccess.
|
timeaccess?: number; // @since 3.6. Timeaccess.
|
||||||
showshortname: boolean; // @since 3.6. Showshortname.
|
showshortname: boolean; // @since 3.6. Showshortname.
|
||||||
coursecategory: string; // @since 3.7. Coursecategory.
|
coursecategory: string; // @since 3.7. Coursecategory.
|
||||||
|
showactivitydates: boolean | null; // @since 3.11. Whether the activity dates are shown or not.
|
||||||
|
showcompletionconditions: boolean | null; // @since 3.11. Whether the activity completion conditions are shown or not.
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -1442,6 +1444,10 @@ export type CoreCourseWSModule = {
|
||||||
completion?: number; // Type of completion tracking: 0 means none, 1 manual, 2 automatic.
|
completion?: number; // Type of completion tracking: 0 means none, 1 manual, 2 automatic.
|
||||||
completiondata?: CoreCourseModuleWSCompletionData; // Module completion data.
|
completiondata?: CoreCourseModuleWSCompletionData; // Module completion data.
|
||||||
contents: CoreCourseModuleContentFile[];
|
contents: CoreCourseModuleContentFile[];
|
||||||
|
dates?: {
|
||||||
|
label: string;
|
||||||
|
timestamp: number;
|
||||||
|
}[]; // @since 3.11. Activity dates.
|
||||||
contentsinfo?: { // Contents summary information.
|
contentsinfo?: { // Contents summary information.
|
||||||
filescount: number; // Total number of files.
|
filescount: number; // Total number of files.
|
||||||
filessize: number; // Total files size.
|
filessize: number; // Total files size.
|
||||||
|
|
|
@ -1264,6 +1264,8 @@ export type CoreEnrolledCourseData = CoreEnrolledCourseBasicData & {
|
||||||
isfavourite?: boolean; // If the user marked this course a favourite.
|
isfavourite?: boolean; // If the user marked this course a favourite.
|
||||||
hidden?: boolean; // If the user hide the course from the dashboard.
|
hidden?: boolean; // If the user hide the course from the dashboard.
|
||||||
overviewfiles?: CoreWSExternalFile[];
|
overviewfiles?: CoreWSExternalFile[];
|
||||||
|
showactivitydates?: boolean; // @since 3.11. Whether the activity dates are shown or not.
|
||||||
|
showcompletionconditions?: boolean; // @since 3.11. Whether the activity completion conditions are shown or not.
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -1281,6 +1283,8 @@ export type CoreCourseBasicSearchedData = CoreCourseBasicData & {
|
||||||
}[];
|
}[];
|
||||||
enrollmentmethods: string[]; // Enrollment methods list.
|
enrollmentmethods: string[]; // Enrollment methods list.
|
||||||
customfields?: CoreCourseCustomField[]; // Custom fields and associated values.
|
customfields?: CoreCourseCustomField[]; // Custom fields and associated values.
|
||||||
|
showactivitydates?: boolean; // @since 3.11. Whether the activity dates are shown or not.
|
||||||
|
showcompletionconditions?: boolean; // @since 3.11. Whether the activity completion conditions are shown or not.
|
||||||
};
|
};
|
||||||
|
|
||||||
export type CoreCourseSearchedData = CoreCourseBasicSearchedData & {
|
export type CoreCourseSearchedData = CoreCourseBasicSearchedData & {
|
||||||
|
@ -1342,6 +1346,8 @@ export type CoreCourseGetCoursesData = CoreEnrolledCourseBasicData & {
|
||||||
forcetheme?: string; // Name of the force theme.
|
forcetheme?: string; // Name of the force theme.
|
||||||
courseformatoptions?: CoreCourseFormatOption[]; // Additional options for particular course format.
|
courseformatoptions?: CoreCourseFormatOption[]; // Additional options for particular course format.
|
||||||
customfields?: CoreCourseCustomField[]; // Custom fields and associated values.
|
customfields?: CoreCourseCustomField[]; // Custom fields and associated values.
|
||||||
|
showactivitydates?: boolean; // @since 3.11. Whether the activity dates are shown or not.
|
||||||
|
showcompletionconditions?: boolean; // @since 3.11. Whether the activity completion conditions are shown or not.
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
Loading…
Reference in New Issue