From 19b3a394d25f0a38bed2d2668fdf72a16018cd9a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pau=20Ferrer=20Oca=C3=B1a?= Date: Fri, 11 Feb 2022 15:37:26 +0100 Subject: [PATCH 1/5] MOBILE-3970 course: Open course summary in a lateral modal --- .../course/pages/index/index.module.ts | 2 + src/core/features/course/pages/index/index.ts | 12 +- .../course/pages/preview/preview.html | 117 +++++++++--------- .../course/pages/preview/preview.module.ts | 11 +- .../course/pages/preview/preview.page.ts | 40 ++++-- .../course/pages/preview/preview.scss | 39 +----- .../user-menu-button/user-menu-button.ts | 1 - 7 files changed, 109 insertions(+), 113 deletions(-) diff --git a/src/core/features/course/pages/index/index.module.ts b/src/core/features/course/pages/index/index.module.ts index 314528baa..b3dcd1791 100644 --- a/src/core/features/course/pages/index/index.module.ts +++ b/src/core/features/course/pages/index/index.module.ts @@ -19,6 +19,7 @@ import { resolveModuleRoutes } from '@/app/app-routing.module'; import { CoreSharedModule } from '@/core/shared.module'; import { CoreCourseIndexPage } from '.'; import { COURSE_INDEX_ROUTES } from './index-routing.module'; +import { CoreCoursePreviewPageComponentModule } from '../preview/preview.module'; function buildRoutes(injector: Injector): Routes { const routes = resolveModuleRoutes(injector, COURSE_INDEX_ROUTES); @@ -42,6 +43,7 @@ function buildRoutes(injector: Injector): Routes { ], imports: [ CoreSharedModule, + CoreCoursePreviewPageComponentModule, ], declarations: [ CoreCourseIndexPage, diff --git a/src/core/features/course/pages/index/index.ts b/src/core/features/course/pages/index/index.ts index 6f0f32b25..cf49aea06 100644 --- a/src/core/features/course/pages/index/index.ts +++ b/src/core/features/course/pages/index/index.ts @@ -28,6 +28,7 @@ import { CoreNavigator } from '@services/navigator'; import { CONTENTS_PAGE_NAME } from '@features/course/course.module'; import { CoreDomUtils } from '@services/utils/dom'; import { CoreCollapsibleHeaderDirective } from '@directives/collapsible-header'; +import { CoreCoursePreviewPage } from '../preview/preview.page'; /** * Page that displays the list of courses the user is enrolled in. @@ -279,10 +280,13 @@ export class CoreCourseIndexPage implements OnInit, OnDestroy { return; } - CoreNavigator.navigateToSitePath( - `/course/${this.course.id}/preview`, - { params: { course: this.course, avoidOpenCourse: true } }, - ); + CoreDomUtils.openSideModal({ + component: CoreCoursePreviewPage, + componentProps: { + courseId: this.course.id, + course: this.course, + }, + }); } /** diff --git a/src/core/features/course/pages/preview/preview.html b/src/core/features/course/pages/preview/preview.html index 7aeaeda68..e787a7d42 100644 --- a/src/core/features/course/pages/preview/preview.html +++ b/src/core/features/course/pages/preview/preview.html @@ -8,6 +8,11 @@ {{'core.course.coursesummary' | translate}} + + + + + @@ -15,12 +20,10 @@ -
-
- -
+
+
-
+

@@ -40,6 +43,10 @@

+ + + @@ -87,59 +94,53 @@ - - - - - -

{{ instance.name }}

- - {{ 'core.courses.enrolme' | translate }} - -
-
- - -

{{ 'core.courses.otherenrolments' | translate }}

- - {{ 'core.courses.completeenrolmentbrowser' | translate }} - -
-
- - -

{{ 'core.courses.notenrollable' | translate }}

-
-
-
- - - - - - {{ 'core.course.downloadcourse' | translate }} - {{ 'core.course.refreshcourse' | translate }} - - - - - - {{ 'core.course' | translate }} - - - - - - - {{ 'core.openinbrowser' | translate }} - - -
+ + + + + + +

{{ instance.name }}

+ + {{ 'core.courses.enrolme' | translate }} + +
+
+ + +

{{ 'core.courses.otherenrolments' | translate }}

+ + {{ 'core.courses.completeenrolmentbrowser' | translate }} + +
+
+ + +

{{ 'core.courses.notenrollable' | translate }}

+
+
+
+ + + + + + {{ 'core.course.downloadcourse' | translate }} + {{ 'core.course.refreshcourse' | translate }} + + + + + + {{ 'core.course' | translate }} + + +
diff --git a/src/core/features/course/pages/preview/preview.module.ts b/src/core/features/course/pages/preview/preview.module.ts index 168aed845..3ef168504 100644 --- a/src/core/features/course/pages/preview/preview.module.ts +++ b/src/core/features/course/pages/preview/preview.module.ts @@ -24,15 +24,22 @@ const routes: Routes = [ component: CoreCoursePreviewPage, }, ]; - @NgModule({ imports: [ - RouterModule.forChild(routes), CoreSharedModule, ], declarations: [ CoreCoursePreviewPage, ], +}) +export class CoreCoursePreviewPageComponentModule { } + +@NgModule({ + imports: [ + RouterModule.forChild(routes), + CoreSharedModule, + CoreCoursePreviewPageComponentModule, + ], exports: [RouterModule], }) export class CoreCoursePreviewPageModule { } diff --git a/src/core/features/course/pages/preview/preview.page.ts b/src/core/features/course/pages/preview/preview.page.ts index 425bf962b..561dcb8a4 100644 --- a/src/core/features/course/pages/preview/preview.page.ts +++ b/src/core/features/course/pages/preview/preview.page.ts @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -import { Component, OnDestroy, OnInit } from '@angular/core'; +import { Component, OnDestroy, OnInit, Input } from '@angular/core'; import { IonRefresher } from '@ionic/angular'; import { CoreEventObserver, CoreEvents } from '@singletons/events'; import { CoreSites } from '@services/sites'; @@ -29,7 +29,7 @@ import { import { CoreCourseOptionsDelegate } from '@features/course/services/course-options-delegate'; import { CoreCourse, CoreCourseProvider } from '@features/course/services/course'; import { CoreCourseHelper, CorePrefetchStatusInfo } from '@features/course/services/course-helper'; -import { NgZone, Platform, Translate } from '@singletons'; +import { ModalController, NgZone, Platform, Translate } from '@singletons'; import { CoreConstants } from '@/core/constants'; import { CoreCoursesSelfEnrolPasswordComponent } from '../../../courses/components/self-enrol-password/self-enrol-password'; import { CoreNavigator } from '@services/navigator'; @@ -47,7 +47,9 @@ import { Subscription } from 'rxjs'; }) export class CoreCoursePreviewPage implements OnInit, OnDestroy { - course?: CoreCourseSummaryData; + @Input() course?: CoreCourseSummaryData; + @Input() courseId = 0; + isEnrolled = false; canAccessCourse = true; selfEnrolInstances: CoreCourseEnrolmentMethod[] = []; @@ -76,7 +78,6 @@ export class CoreCoursePreviewPage implements OnInit, OnDestroy { protected enrolUrl = ''; protected pageDestroyed = false; protected courseStatusObserver?: CoreEventObserver; - protected courseId!: number; protected appResumeSubscription: Subscription; protected waitingForBrowserEnrol = false; @@ -111,18 +112,24 @@ export class CoreCoursePreviewPage implements OnInit, OnDestroy { * @inheritdoc */ async ngOnInit(): Promise { - try { - this.courseId = CoreNavigator.getRequiredRouteNumberParam('courseId'); - } catch (error) { - CoreDomUtils.showErrorModal(error); - CoreNavigator.back(); + if (!this.courseId) { + // Opened as a page. + try { + this.courseId = CoreNavigator.getRequiredRouteNumberParam('courseId'); + } catch (error) { + CoreDomUtils.showErrorModal(error); + CoreNavigator.back(); + this.closeModal(); // Just in case. - return; + return; + } + + this.course = CoreNavigator.getRouteParam('course'); + } else { + // Opened as a modal. + this.avoidOpenCourse = true; } - this.avoidOpenCourse = !!CoreNavigator.getRouteBooleanParam('avoidOpenCourse'); - this.course = CoreNavigator.getRouteParam('course'); - const currentSiteUrl = CoreSites.getRequiredCurrentSite().getURL(); this.enrolUrl = CoreTextUtils.concatenatePaths(currentSiteUrl, 'enrol/index.php?id=' + this.courseId); this.courseUrl = CoreTextUtils.concatenatePaths(currentSiteUrl, 'course/view.php?id=' + this.courseId); @@ -452,6 +459,13 @@ export class CoreCoursePreviewPage implements OnInit, OnDestroy { } } + /** + * Close the modal. + */ + closeModal(): void { + ModalController.dismiss(); + } + /** * Prefetch the course. */ diff --git a/src/core/features/course/pages/preview/preview.scss b/src/core/features/course/pages/preview/preview.scss index 8f159c333..ae3a0347f 100644 --- a/src/core/features/course/pages/preview/preview.scss +++ b/src/core/features/course/pages/preview/preview.scss @@ -1,43 +1,12 @@ :host { - ion-content:not(.animating) { - &::part(scroll) { - perspective: 1px; - perspective-origin: center top; - transform-style: preserve-3d; - } - - .core-course-thumb { - transform-origin: center top; - - --scroll-factor: 0.5; - --translate-z: calc(-2 * var(--scroll-factor))px; - --scale: calc(1 + var(--scroll-factor) * 2); - - /** - * Calculated with scroll-factor: 0.5; - * translate-z: -2 * $scroll-factor px; - * scale: 1 + $scroll-factor * 2; - */ - transform: translateZ(-1px) scale(2); - } - } - - .core-course-thumb-parallax-content { - transform: translateZ(0); - -webkit-filter: drop-shadow(0px -3px 3px rgba(var(--drop-shadow))); - filter: drop-shadow(0px -3px 3px rgba(var(--drop-shadow))); - } - - .core-course-thumb-parallax { + .core-course-thumb { + overflow: hidden; + text-align: center; height: 40vw; max-height: 35vh; z-index: -1; overflow: hidden; - } - - .core-course-thumb { - overflow: hidden; - text-align: center; + border-bottom: 1px solid var(--stroke); } diff --git a/src/core/features/mainmenu/components/user-menu-button/user-menu-button.ts b/src/core/features/mainmenu/components/user-menu-button/user-menu-button.ts index ce23461e3..f1140b4ec 100644 --- a/src/core/features/mainmenu/components/user-menu-button/user-menu-button.ts +++ b/src/core/features/mainmenu/components/user-menu-button/user-menu-button.ts @@ -58,7 +58,6 @@ export class CoreMainMenuUserButtonComponent implements OnInit { CoreDomUtils.openSideModal({ component: CoreMainMenuUserMenuComponent, - cssClass: 'core-modal-lateral', }); } From 449727d2c2ac6ea31af7b5e47f0e42af4713134f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pau=20Ferrer=20Oca=C3=B1a?= Date: Fri, 11 Feb 2022 16:17:05 +0100 Subject: [PATCH 2/5] MOBILE-3970 course: Delete download course from Course summary --- .../course/pages/preview/preview.html | 13 --- .../course/pages/preview/preview.page.ts | 79 +------------------ 2 files changed, 2 insertions(+), 90 deletions(-) diff --git a/src/core/features/course/pages/preview/preview.html b/src/core/features/course/pages/preview/preview.html index e787a7d42..60cedf7c5 100644 --- a/src/core/features/course/pages/preview/preview.html +++ b/src/core/features/course/pages/preview/preview.html @@ -124,19 +124,6 @@ - - - - - {{ 'core.course.downloadcourse' | translate }} - {{ 'core.course.refreshcourse' | translate }} - - diff --git a/src/core/features/course/pages/preview/preview.page.ts b/src/core/features/course/pages/preview/preview.page.ts index 561dcb8a4..c2b686885 100644 --- a/src/core/features/course/pages/preview/preview.page.ts +++ b/src/core/features/course/pages/preview/preview.page.ts @@ -27,10 +27,8 @@ import { CoreEnrolledCourseData, } from '@features/courses/services/courses'; import { CoreCourseOptionsDelegate } from '@features/course/services/course-options-delegate'; -import { CoreCourse, CoreCourseProvider } from '@features/course/services/course'; -import { CoreCourseHelper, CorePrefetchStatusInfo } from '@features/course/services/course-helper'; +import { CoreCourseHelper } from '@features/course/services/course-helper'; import { ModalController, NgZone, Platform, Translate } from '@singletons'; -import { CoreConstants } from '@/core/constants'; import { CoreCoursesSelfEnrolPasswordComponent } from '../../../courses/components/self-enrol-password/self-enrol-password'; import { CoreNavigator } from '@services/navigator'; import { CoreUtils } from '@services/utils/utils'; @@ -56,16 +54,7 @@ export class CoreCoursePreviewPage implements OnInit, OnDestroy { paypalEnabled = false; dataLoaded = false; avoidOpenCourse = false; - prefetchCourseData: CorePrefetchStatusInfo = { - icon: '', - statusTranslatable: 'core.loading', - status: '', - loading: true, - }; - statusDownloaded = CoreConstants.DOWNLOADED; - - downloadCourseEnabled: boolean; courseUrl = ''; courseImageUrl?: string; progress?: number; @@ -82,17 +71,6 @@ export class CoreCoursePreviewPage implements OnInit, OnDestroy { protected waitingForBrowserEnrol = false; constructor() { - this.downloadCourseEnabled = !CoreCourses.isDownloadCourseDisabledInSite(); - - if (this.downloadCourseEnabled) { - // Listen for status change in course. - this.courseStatusObserver = CoreEvents.on(CoreEvents.COURSE_STATUS_CHANGED, (data) => { - if (data.courseId == this.courseId || data.courseId == CoreCourseProvider.ALL_COURSES_CLEARED) { - this.updateCourseStatus(data.status); - } - }, CoreSites.getCurrentSiteId()); - } - // Refresh the view when the app is resumed. this.appResumeSubscription = Platform.resume.subscribe(() => { if (!this.waitingForBrowserEnrol || !this.dataLoaded) { @@ -134,31 +112,7 @@ export class CoreCoursePreviewPage implements OnInit, OnDestroy { this.enrolUrl = CoreTextUtils.concatenatePaths(currentSiteUrl, 'enrol/index.php?id=' + this.courseId); this.courseUrl = CoreTextUtils.concatenatePaths(currentSiteUrl, 'course/view.php?id=' + this.courseId); - try { - await this.getCourse(); - } finally { - if (this.downloadCourseEnabled) { - - // Determine course prefetch icon. - this.prefetchCourseData = await CoreCourseHelper.getCourseStatusIconAndTitle(this.courseId); - - if (this.prefetchCourseData.loading) { - // Course is being downloaded. Get the download promise. - const promise = CoreCourseHelper.getCourseDownloadPromise(this.courseId); - if (promise) { - // There is a download promise. If it fails, show an error. - promise.catch((error) => { - if (!this.pageDestroyed) { - CoreDomUtils.showErrorModalDefault(error, 'core.course.errordownloadingcourse', true); - } - }); - } else { - // No download, this probably means that the app was closed while downloading. Set previous status. - CoreCourse.setCoursePreviousStatus(this.courseId); - } - } - } - } + await this.getCourse(); } /** @@ -410,20 +364,6 @@ export class CoreCoursePreviewPage implements OnInit, OnDestroy { }); } - /** - * Update the course status icon and title. - * - * @param status Status to show. - */ - protected updateCourseStatus(status: string): void { - const statusData = CoreCourseHelper.getCoursePrefetchStatusInfo(status); - - this.prefetchCourseData.status = statusData.status; - this.prefetchCourseData.icon = statusData.icon; - this.prefetchCourseData.statusTranslatable = statusData.statusTranslatable; - this.prefetchCourseData.loading = statusData.loading; - } - /** * Wait for the user to be enrolled in the course. * @@ -466,21 +406,6 @@ export class CoreCoursePreviewPage implements OnInit, OnDestroy { ModalController.dismiss(); } - /** - * Prefetch the course. - */ - async prefetchCourse(): Promise { - try { - await CoreCourseHelper.confirmAndPrefetchCourse(this.prefetchCourseData, this.course as CoreEnrolledCourseData, { - isGuest: this.useGuestAccess, - }); - } catch (error) { - if (!this.pageDestroyed) { - CoreDomUtils.showErrorModalDefault(error, 'core.course.errordownloadingcourse', true); - } - } - } - /** * @inheritdoc */ From 53f986a26bd573ef4cd9e4bf77e1ae7839eabfea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pau=20Ferrer=20Oca=C3=B1a?= Date: Fri, 11 Feb 2022 16:34:25 +0100 Subject: [PATCH 3/5] MOBILE-3970 course: Move courseMenuHandlers to course summary --- .../course/pages/contents/contents.html | 5 --- .../course/pages/contents/contents.ts | 28 +------------- .../course/pages/preview/preview.html | 16 ++++++-- .../course/pages/preview/preview.page.ts | 38 ++++++++++++++++++- 4 files changed, 49 insertions(+), 38 deletions(-) diff --git a/src/core/features/course/pages/contents/contents.html b/src/core/features/course/pages/contents/contents.html index 2648ff943..b12da3cc6 100644 --- a/src/core/features/course/pages/contents/contents.html +++ b/src/core/features/course/pages/contents/contents.html @@ -1,9 +1,4 @@ - - - - diff --git a/src/core/features/course/pages/contents/contents.ts b/src/core/features/course/pages/contents/contents.ts index d93a3cb18..26c407028 100644 --- a/src/core/features/course/pages/contents/contents.ts +++ b/src/core/features/course/pages/contents/contents.ts @@ -29,10 +29,7 @@ import { } from '@features/course/services/course-helper'; import { CoreCourseFormatDelegate } from '@features/course/services/format-delegate'; import { CoreCourseModulePrefetchDelegate } from '@features/course/services/module-prefetch-delegate'; -import { - CoreCourseOptionsDelegate, - CoreCourseOptionsMenuHandlerToDisplay, -} from '@features/course/services/course-options-delegate'; +import { CoreCourseOptionsMenuHandlerToDisplay } from '@features/course/services/course-options-delegate'; import { CoreCourseSync, CoreCourseSyncProvider } from '@features/course/services/sync'; import { CoreCourseFormatComponent } from '../../components/format/format'; import { @@ -69,7 +66,6 @@ export class CoreCourseContentsPage implements OnInit, OnDestroy { protected syncObserver?: CoreEventObserver; protected isDestroyed = false; protected modulesHaveCompletion = false; - protected isGuest = false; protected debouncedUpdateCachedCompletion?: () => void; // Update the cached completion after a certain time. /** @@ -89,7 +85,6 @@ export class CoreCourseContentsPage implements OnInit, OnDestroy { this.sectionId = CoreNavigator.getRouteNumberParam('sectionId'); this.sectionNumber = CoreNavigator.getRouteNumberParam('sectionNumber'); this.moduleId = CoreNavigator.getRouteNumberParam('moduleId'); - this.isGuest = !!CoreNavigator.getRouteBooleanParam('isGuest'); this.debouncedUpdateCachedCompletion = CoreUtils.debounce(() => { if (this.modulesHaveCompletion) { @@ -184,7 +179,6 @@ export class CoreCourseContentsPage implements OnInit, OnDestroy { try { await Promise.all([ this.loadSections(refresh), - this.loadMenuHandlers(refresh), this.loadCourseFormatOptions(), ]); } catch (error) { @@ -248,16 +242,6 @@ export class CoreCourseContentsPage implements OnInit, OnDestroy { this.displayRefresher = CoreCourseFormatDelegate.displayRefresher(this.course, this.sections); } - /** - * Load the course menu handlers. - * - * @param refresh If it's refreshing content. - * @return Promise resolved when done. - */ - protected async loadMenuHandlers(refresh?: boolean): Promise { - this.courseMenuHandlers = await CoreCourseOptionsDelegate.getMenuHandlersToDisplay(this.course, refresh, this.isGuest); - } - /** * Load course format options if needed. * @@ -379,16 +363,6 @@ export class CoreCourseContentsPage implements OnInit, OnDestroy { } } - /** - * Opens a menu item registered to the delegate. - * - * @param item Item to open - */ - openMenuItem(item: CoreCourseOptionsMenuHandlerToDisplay): void { - const params = Object.assign({ course: this.course }, item.data.pageParams); - CoreNavigator.navigateToSitePath(item.data.page, { params }); - } - /** * Page destroyed. */ diff --git a/src/core/features/course/pages/preview/preview.html b/src/core/features/course/pages/preview/preview.html index 60cedf7c5..2bb64554c 100644 --- a/src/core/features/course/pages/preview/preview.html +++ b/src/core/features/course/pages/preview/preview.html @@ -23,7 +23,7 @@
-
+

@@ -94,13 +94,13 @@ -

+
- + - +

{{ instance.name }}

@@ -122,6 +122,14 @@

{{ 'core.courses.notenrollable' | translate }}

+
+ + + + + {{item.data.title | translate }} + diff --git a/src/core/features/course/pages/preview/preview.page.ts b/src/core/features/course/pages/preview/preview.page.ts index c2b686885..f269e84c3 100644 --- a/src/core/features/course/pages/preview/preview.page.ts +++ b/src/core/features/course/pages/preview/preview.page.ts @@ -26,7 +26,10 @@ import { CoreCoursesProvider, CoreEnrolledCourseData, } from '@features/courses/services/courses'; -import { CoreCourseOptionsDelegate } from '@features/course/services/course-options-delegate'; +import { + CoreCourseOptionsDelegate, + CoreCourseOptionsMenuHandlerToDisplay, +} from '@features/course/services/course-options-delegate'; import { CoreCourseHelper } from '@features/course/services/course-helper'; import { ModalController, NgZone, Platform, Translate } from '@singletons'; import { CoreCoursesSelfEnrolPasswordComponent } from '../../../courses/components/self-enrol-password/self-enrol-password'; @@ -59,6 +62,8 @@ export class CoreCoursePreviewPage implements OnInit, OnDestroy { courseImageUrl?: string; progress?: number; + courseMenuHandlers: CoreCourseOptionsMenuHandlerToDisplay[] = []; + protected isGuestEnabled = false; protected useGuestAccess = false; protected guestInstanceId?: number; @@ -145,8 +150,10 @@ export class CoreCoursePreviewPage implements OnInit, OnDestroy { /** * Convenience function to get course. We use this to determine if a user can see the course or not. + * + * @param refresh If it's refreshing content. */ - protected async getCourse(): Promise { + protected async getCourse(refresh = false): Promise { // Get course enrolment methods. this.selfEnrolInstances = []; @@ -223,9 +230,26 @@ export class CoreCoursePreviewPage implements OnInit, OnDestroy { this.progress = this.course.progress; } + await this.loadMenuHandlers(refresh); + this.dataLoaded = true; } + /** + * Load the course menu handlers. + * + * @param refresh If it's refreshing content. + * @return Promise resolved when done. + */ + protected async loadMenuHandlers(refresh?: boolean): Promise { + if (!this.course) { + return; + } + + this.courseMenuHandlers = + await CoreCourseOptionsDelegate.getMenuHandlersToDisplay(this.course, refresh, this.useGuestAccess); + } + /** * Open the course. * @@ -399,6 +423,16 @@ export class CoreCoursePreviewPage implements OnInit, OnDestroy { } } + /** + * Opens a menu item registered to the delegate. + * + * @param item Item to open + */ + openMenuItem(item: CoreCourseOptionsMenuHandlerToDisplay): void { + const params = Object.assign({ course: this.course }, item.data.pageParams); + CoreNavigator.navigateToSitePath(item.data.page, { params }); + } + /** * Close the modal. */ From f22fec5e97137d43893c6b4f5cb385f83d9cd286 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pau=20Ferrer=20Oca=C3=B1a?= Date: Fri, 11 Feb 2022 16:51:29 +0100 Subject: [PATCH 4/5] MOBILE-3970 course: Add course date styles --- scripts/langindex.json | 2 ++ src/core/features/course/lang.json | 2 ++ .../course/pages/preview/preview.html | 27 ++++++++++++------- .../course/pages/preview/preview.page.ts | 6 ++--- .../course/pages/preview/preview.scss | 14 +++++++++- 5 files changed, 38 insertions(+), 13 deletions(-) diff --git a/scripts/langindex.json b/scripts/langindex.json index 0b8edb055..4edb31980 100644 --- a/scripts/langindex.json +++ b/scripts/langindex.json @@ -1549,6 +1549,7 @@ "core.course.downloadcourse": "tool_mobile", "core.course.downloadcoursesprogressdescription": "local_moodlemobileapp", "core.course.downloadsectionprogressdescription": "local_moodlemobileapp", + "core.course.enddate": "moodle", "core.course.errordownloadingcourse": "local_moodlemobileapp", "core.course.errordownloadingsection": "local_moodlemobileapp", "core.course.errorgetmodule": "local_moodlemobileapp", @@ -1568,6 +1569,7 @@ "core.course.overriddennotice": "grades", "core.course.refreshcourse": "local_moodlemobileapp", "core.course.section": "moodle", + "core.course.startdate": "moodle", "core.course.thisweek": "format_weeks/currentsection", "core.course.todo": "completion", "core.course.useactivityonbrowser": "local_moodlemobileapp", diff --git a/src/core/features/course/lang.json b/src/core/features/course/lang.json index 4fddbfd81..36f792de9 100644 --- a/src/core/features/course/lang.json +++ b/src/core/features/course/lang.json @@ -32,6 +32,7 @@ "downloadcourse": "Download course", "downloadcoursesprogressdescription": "Downloading courses: downloaded {{count}} out of {{total}}.", "downloadsectionprogressdescription": "Downloading section: downloaded {{count}} out of {{total}}.", + "enddate": "Course end date", "errordownloadingcourse": "Error downloading course.", "errordownloadingsection": "Error downloading section.", "errorgetmodule": "Error getting activity data.", @@ -51,6 +52,7 @@ "overriddennotice": "Your final grade from this activity was manually adjusted.", "refreshcourse": "Refresh course", "section": "Section", + "startdate": "Course start date", "thisweek": "This week", "todo": "To do", "useactivityonbrowser": "You can still use it using your device's web browser.", diff --git a/src/core/features/course/pages/preview/preview.html b/src/core/features/course/pages/preview/preview.html index 2bb64554c..56baec734 100644 --- a/src/core/features/course/pages/preview/preview.html +++ b/src/core/features/course/pages/preview/preview.html @@ -8,7 +8,7 @@ {{'core.course.coursesummary' | translate}} - + @@ -34,18 +34,27 @@ -

- {{course.startdate * 1000 | coreFormatDate:"strftimedatefullshort" }} - - {{course.enddate * 1000 | coreFormatDate:"strftimedatefullshort" }} -

+
+
+

+ + {{ 'core.course.startdate' | translate }}: {{ course.startdate * 1000 | + coreFormatDate:'strftimedatefullshort' }} +

+

+ + {{ 'core.course.enddate' | translate }}: {{ course.enddate * 1000 | + coreFormatDate:'strftimedatefullshort' }} +

+
- + @@ -62,7 +71,7 @@ -

{{ 'core.teachers' | translate }}

+

{{ 'core.teachers' | translate }}

- +

{{ 'core.courses.otherenrolments' | translate }}

@@ -132,7 +141,7 @@ - + {{ 'core.course' | translate }} diff --git a/src/core/features/course/pages/preview/preview.page.ts b/src/core/features/course/pages/preview/preview.page.ts index f269e84c3..e53981367 100644 --- a/src/core/features/course/pages/preview/preview.page.ts +++ b/src/core/features/course/pages/preview/preview.page.ts @@ -56,7 +56,7 @@ export class CoreCoursePreviewPage implements OnInit, OnDestroy { selfEnrolInstances: CoreCourseEnrolmentMethod[] = []; paypalEnabled = false; dataLoaded = false; - avoidOpenCourse = false; + isModal = false; courseUrl = ''; courseImageUrl?: string; @@ -110,7 +110,7 @@ export class CoreCoursePreviewPage implements OnInit, OnDestroy { this.course = CoreNavigator.getRouteParam('course'); } else { // Opened as a modal. - this.avoidOpenCourse = true; + this.isModal = true; } const currentSiteUrl = CoreSites.getRequiredCurrentSite().getURL(); @@ -256,7 +256,7 @@ export class CoreCoursePreviewPage implements OnInit, OnDestroy { * @param replaceCurrentPage If current place should be replaced in the navigation stack. */ openCourse(replaceCurrentPage = false): void { - if (!this.canAccessCourse || !this.course || this.avoidOpenCourse) { + if (!this.canAccessCourse || !this.course || this.isModal) { return; } diff --git a/src/core/features/course/pages/preview/preview.scss b/src/core/features/course/pages/preview/preview.scss index ae3a0347f..0386bcac6 100644 --- a/src/core/features/course/pages/preview/preview.scss +++ b/src/core/features/course/pages/preview/preview.scss @@ -1,8 +1,9 @@ +@import '~theme/globals.scss'; + :host { .core-course-thumb { overflow: hidden; text-align: center; - height: 40vw; max-height: 35vh; z-index: -1; overflow: hidden; @@ -13,4 +14,15 @@ .core-customfieldvalue core-format-text { display: inline; } + + .core-course-dates { + background: var(--light); + border-radius: var(--small-radius); + padding: 8px; + + ion-icon { + @include margin-horizontal(null, 8px); + } + } + } From d26e39861b8e582330e7e87e7e97e558e7b50193 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pau=20Ferrer=20Oca=C3=B1a?= Date: Mon, 14 Feb 2022 10:50:46 +0100 Subject: [PATCH 5/5] MOBILE-3970 course: Change course preview page name to course summary --- src/core/features/course/course-lazy.module.ts | 4 ++-- .../course-summary.html} | 0 .../course-summary.module.ts} | 8 ++++---- .../course-summary.scss} | 0 .../course-summary.ts} | 10 +++++----- src/core/features/course/pages/index/index.module.ts | 2 +- src/core/features/course/pages/index/index.ts | 4 ++-- .../components/course-list-item/course-list-item.ts | 2 +- .../courses/services/handlers/enrol-push-click.ts | 2 +- .../courses/services/handlers/request-push-click.ts | 2 +- upgrade.txt | 1 + 11 files changed, 18 insertions(+), 17 deletions(-) rename src/core/features/course/pages/{preview/preview.html => course-summary/course-summary.html} (100%) rename src/core/features/course/pages/{preview/preview.module.ts => course-summary/course-summary.module.ts} (86%) rename src/core/features/course/pages/{preview/preview.scss => course-summary/course-summary.scss} (100%) rename src/core/features/course/pages/{preview/preview.page.ts => course-summary/course-summary.ts} (98%) diff --git a/src/core/features/course/course-lazy.module.ts b/src/core/features/course/course-lazy.module.ts index 5233864dd..691b8c05b 100644 --- a/src/core/features/course/course-lazy.module.ts +++ b/src/core/features/course/course-lazy.module.ts @@ -32,9 +32,9 @@ const routes: Routes = [ loadChildren: () => import('./pages/list-mod-type/list-mod-type.module').then(m => m.CoreCourseListModTypePageModule), }, { - path: ':courseId/preview', + path: ':courseId/summary', loadChildren: () => - import('./pages/preview/preview.module').then(m => m.CoreCoursePreviewPageModule), + import('./pages/course-summary/course-summary.module').then(m => m.CoreCourseSummaryPageModule), }, ]; diff --git a/src/core/features/course/pages/preview/preview.html b/src/core/features/course/pages/course-summary/course-summary.html similarity index 100% rename from src/core/features/course/pages/preview/preview.html rename to src/core/features/course/pages/course-summary/course-summary.html diff --git a/src/core/features/course/pages/preview/preview.module.ts b/src/core/features/course/pages/course-summary/course-summary.module.ts similarity index 86% rename from src/core/features/course/pages/preview/preview.module.ts rename to src/core/features/course/pages/course-summary/course-summary.module.ts index 3ef168504..daeb7f70c 100644 --- a/src/core/features/course/pages/preview/preview.module.ts +++ b/src/core/features/course/pages/course-summary/course-summary.module.ts @@ -16,12 +16,12 @@ import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; import { CoreSharedModule } from '@/core/shared.module'; -import { CoreCoursePreviewPage } from './preview.page'; +import { CoreCourseSummaryPage } from './course-summary'; const routes: Routes = [ { path: '', - component: CoreCoursePreviewPage, + component: CoreCourseSummaryPage, }, ]; @NgModule({ @@ -29,7 +29,7 @@ const routes: Routes = [ CoreSharedModule, ], declarations: [ - CoreCoursePreviewPage, + CoreCourseSummaryPage, ], }) export class CoreCoursePreviewPageComponentModule { } @@ -42,4 +42,4 @@ export class CoreCoursePreviewPageComponentModule { } ], exports: [RouterModule], }) -export class CoreCoursePreviewPageModule { } +export class CoreCourseSummaryPageModule { } diff --git a/src/core/features/course/pages/preview/preview.scss b/src/core/features/course/pages/course-summary/course-summary.scss similarity index 100% rename from src/core/features/course/pages/preview/preview.scss rename to src/core/features/course/pages/course-summary/course-summary.scss diff --git a/src/core/features/course/pages/preview/preview.page.ts b/src/core/features/course/pages/course-summary/course-summary.ts similarity index 98% rename from src/core/features/course/pages/preview/preview.page.ts rename to src/core/features/course/pages/course-summary/course-summary.ts index e53981367..547e9a6cb 100644 --- a/src/core/features/course/pages/preview/preview.page.ts +++ b/src/core/features/course/pages/course-summary/course-summary.ts @@ -39,14 +39,14 @@ import { CoreCourseWithImageAndColor } from '@features/courses/services/courses- import { Subscription } from 'rxjs'; /** - * Page that allows "previewing" a course and enrolling in it if enabled and not enrolled. + * Page that shows the summary of a course including buttons to enrol and other available options. */ @Component({ - selector: 'page-core-course-preview', - templateUrl: 'preview.html', - styleUrls: ['preview.scss'], + selector: 'page-core-course-summary', + templateUrl: 'course-summary.html', + styleUrls: ['course-summary.scss'], }) -export class CoreCoursePreviewPage implements OnInit, OnDestroy { +export class CoreCourseSummaryPage implements OnInit, OnDestroy { @Input() course?: CoreCourseSummaryData; @Input() courseId = 0; diff --git a/src/core/features/course/pages/index/index.module.ts b/src/core/features/course/pages/index/index.module.ts index b3dcd1791..fafa96425 100644 --- a/src/core/features/course/pages/index/index.module.ts +++ b/src/core/features/course/pages/index/index.module.ts @@ -19,7 +19,7 @@ import { resolveModuleRoutes } from '@/app/app-routing.module'; import { CoreSharedModule } from '@/core/shared.module'; import { CoreCourseIndexPage } from '.'; import { COURSE_INDEX_ROUTES } from './index-routing.module'; -import { CoreCoursePreviewPageComponentModule } from '../preview/preview.module'; +import { CoreCoursePreviewPageComponentModule } from '../course-summary/course-summary.module'; function buildRoutes(injector: Injector): Routes { const routes = resolveModuleRoutes(injector, COURSE_INDEX_ROUTES); diff --git a/src/core/features/course/pages/index/index.ts b/src/core/features/course/pages/index/index.ts index cf49aea06..449058e33 100644 --- a/src/core/features/course/pages/index/index.ts +++ b/src/core/features/course/pages/index/index.ts @@ -28,7 +28,7 @@ import { CoreNavigator } from '@services/navigator'; import { CONTENTS_PAGE_NAME } from '@features/course/course.module'; import { CoreDomUtils } from '@services/utils/dom'; import { CoreCollapsibleHeaderDirective } from '@directives/collapsible-header'; -import { CoreCoursePreviewPage } from '../preview/preview.page'; +import { CoreCourseSummaryPage } from '../course-summary/course-summary'; /** * Page that displays the list of courses the user is enrolled in. @@ -281,7 +281,7 @@ export class CoreCourseIndexPage implements OnInit, OnDestroy { } CoreDomUtils.openSideModal({ - component: CoreCoursePreviewPage, + component: CoreCourseSummaryPage, componentProps: { courseId: this.course.id, course: this.course, diff --git a/src/core/features/courses/components/course-list-item/course-list-item.ts b/src/core/features/courses/components/course-list-item/course-list-item.ts index c44645ed9..c73a3dd3a 100644 --- a/src/core/features/courses/components/course-list-item/course-list-item.ts +++ b/src/core/features/courses/components/course-list-item/course-list-item.ts @@ -171,7 +171,7 @@ export class CoreCoursesCourseListItemComponent implements OnInit, OnDestroy, On CoreCourseHelper.openCourse(this.course); } else { CoreNavigator.navigateToSitePath( - `/course/${this.course.id}/preview`, + `/course/${this.course.id}/summary`, { params: { course: this.course } }, ); } diff --git a/src/core/features/courses/services/handlers/enrol-push-click.ts b/src/core/features/courses/services/handlers/enrol-push-click.ts index c606d3384..63408f432 100644 --- a/src/core/features/courses/services/handlers/enrol-push-click.ts +++ b/src/core/features/courses/services/handlers/enrol-push-click.ts @@ -66,7 +66,7 @@ export class CoreCoursesEnrolPushClickHandlerService implements CorePushNotifica params.selectedTab = 'participants'; // @todo: Set this when participants is done. } else if (!result.enrolled) { // User not enrolled anymore, open the preview page. - page += '/preview'; + page += '/summary'; } await CoreNavigator.navigateToSitePath(page, { params, siteId: notification.site }); diff --git a/src/core/features/courses/services/handlers/request-push-click.ts b/src/core/features/courses/services/handlers/request-push-click.ts index 92fdea4fc..2eb12d9a9 100644 --- a/src/core/features/courses/services/handlers/request-push-click.ts +++ b/src/core/features/courses/services/handlers/request-push-click.ts @@ -79,7 +79,7 @@ export class CoreCoursesRequestPushClickHandlerService implements CorePushNotifi if (!result.enrolled) { // User not enrolled (shouldn't happen), open the preview page. - page += '/preview'; + page += '/summary'; } await CoreNavigator.navigateToSitePath(page, { params, siteId: notification.site }); diff --git a/upgrade.txt b/upgrade.txt index a7549b1c3..e943d0f93 100644 --- a/upgrade.txt +++ b/upgrade.txt @@ -18,6 +18,7 @@ information provided here is intended especially for developers. - CoreCourseHelperProvider.openCourse parameters changed, now it admits CoreNavigationOptions + siteId on the same object that includes Params passed to page. - displaySectionSelector has been deprecated on CoreCourseFormatHandler, use displayCourseIndex instead. - Most of the functions or callbacks that handle redirects/deeplinks have been modified to accept an object instead of just path + options. E.g.: CoreLoginHelper.isSiteLoggedOut, CoreLoginHelper.openBrowserForSSOLogin, CoreLoginHelper.openBrowserForOAuthLogin, CoreLoginHelper.prepareForSSOLogin, CoreApp.storeRedirect, CoreSites.loadSite. +- Course preview page route has changed from course/:courseId/preview to course/:courseId/summary to match with the page name and characteristics. === 3.9.5 ===