diff --git a/src/addons/badges/badges-lazy.module.ts b/src/addons/badges/badges-lazy.module.ts index e1aee5b89..f88a84958 100644 --- a/src/addons/badges/badges-lazy.module.ts +++ b/src/addons/badges/badges-lazy.module.ts @@ -13,7 +13,13 @@ // limitations under the License. import { NgModule } from '@angular/core'; -import { RouterModule, Routes } from '@angular/router'; +import { Route, RouterModule, Routes } from '@angular/router'; + + +export const AddonBadgesIssueRoute: Route = { + path: 'issue', + loadChildren: () => import('./pages/issued-badge/issued-badge.module').then( m => m.AddonBadgesIssuedBadgePageModule), +}; const routes: Routes = [ { @@ -21,10 +27,7 @@ const routes: Routes = [ redirectTo: 'user', pathMatch: 'full', }, - { - path: 'issue', - loadChildren: () => import('./pages/issued-badge/issued-badge.module').then( m => m.AddonBadgesIssuedBadgePageModule), - }, + AddonBadgesIssueRoute, { path: 'user', loadChildren: () => import('./pages/user-badges/user-badges.module').then( m => m.AddonBadgesUserBadgesPageModule), diff --git a/src/addons/badges/pages/issued-badge/issued-badge.page.ts b/src/addons/badges/pages/issued-badge/issued-badge.page.ts index 058267aa6..d146376e7 100644 --- a/src/addons/badges/pages/issued-badge/issued-badge.page.ts +++ b/src/addons/badges/pages/issued-badge/issued-badge.page.ts @@ -22,6 +22,7 @@ import { AddonBadges, AddonBadgesUserBadge } from '../../services/badges'; import { CoreUtils } from '@services/utils/utils'; import { CoreCourses, CoreEnrolledCourseData } from '@features/courses/services/courses'; import { CoreNavigator } from '@services/navigator'; +import { ActivatedRoute } from '@angular/router'; /** * Page that displays the list of calendar events. @@ -42,16 +43,24 @@ export class AddonBadgesIssuedBadgePage implements OnInit { badgeLoaded = false; currentTime = 0; + constructor( + protected route: ActivatedRoute, + ) { } + /** * View loaded. */ ngOnInit(): void { - this.courseId = CoreNavigator.instance.getRouteNumberParam('courseId') || this.courseId; // Use 0 for site badges. - this.userId = CoreNavigator.instance.getRouteNumberParam('userId') || CoreSites.instance.getCurrentSite()!.getUserId(); - this.badgeHash = CoreNavigator.instance.getRouteParam('badgeHash') || ''; + this.route.queryParams.subscribe(() => { + this.badgeLoaded = false; - this.fetchIssuedBadge().finally(() => { - this.badgeLoaded = true; + this.courseId = CoreNavigator.instance.getRouteNumberParam('courseId') || this.courseId; // Use 0 for site badges. + this.userId = CoreNavigator.instance.getRouteNumberParam('userId') || CoreSites.instance.getCurrentSite()!.getUserId(); + this.badgeHash = CoreNavigator.instance.getRouteParam('badgeHash') || ''; + + this.fetchIssuedBadge().finally(() => { + this.badgeLoaded = true; + }); }); } diff --git a/src/addons/badges/pages/user-badges/user-badges.html b/src/addons/badges/pages/user-badges/user-badges.html index 8f12e36d4..684182843 100644 --- a/src/addons/badges/pages/user-badges/user-badges.html +++ b/src/addons/badges/pages/user-badges/user-badges.html @@ -6,29 +6,31 @@ {{ 'addon.badges.badges' | translate }} - - - - - - - + + + + + + + - - - - - - -

{{ badge.name }}

-

{{ badge.dateissued * 1000 | coreFormatDate :'strftimedatetimeshort' }}

-
- - {{ 'addon.badges.expired' | translate }} - -
-
-
+ + + + + + +

{{ badge.name }}

+

{{ badge.dateissued * 1000 | coreFormatDate :'strftimedatetimeshort' }}

+
+ + {{ 'addon.badges.expired' | translate }} + +
+
+
+
diff --git a/src/addons/badges/pages/user-badges/user-badges.module.ts b/src/addons/badges/pages/user-badges/user-badges.module.ts index 11da23507..10d3a6e86 100644 --- a/src/addons/badges/pages/user-badges/user-badges.module.ts +++ b/src/addons/badges/pages/user-badges/user-badges.module.ts @@ -17,15 +17,34 @@ import { IonicModule } from '@ionic/angular'; import { TranslateModule } from '@ngx-translate/core'; import { RouterModule, Routes } from '@angular/router'; import { CommonModule } from '@angular/common'; +import { conditionalRoutes } from '@/app/app-routing.module'; +import { CoreScreen } from '@services/screen'; import { CoreSharedModule } from '@/core/shared.module'; import { AddonBadgesUserBadgesPage } from './user-badges.page'; +import { AddonBadgesIssueRoute } from '@addons/badges/badges-lazy.module'; -const routes: Routes = [ +const mobileRoutes: Routes = [ { path: '', component: AddonBadgesUserBadgesPage, }, + AddonBadgesIssueRoute, +]; + +const tabletRoutes: Routes = [ + { + path: '', + component: AddonBadgesUserBadgesPage, + children: [ + AddonBadgesIssueRoute, + ], + }, +]; + +const routes: Routes = [ + ...conditionalRoutes(mobileRoutes, () => CoreScreen.instance.isMobile), + ...conditionalRoutes(tabletRoutes, () => CoreScreen.instance.isTablet), ]; @NgModule({ diff --git a/src/addons/badges/pages/user-badges/user-badges.page.ts b/src/addons/badges/pages/user-badges/user-badges.page.ts index dae15b5e1..75087bfc4 100644 --- a/src/addons/badges/pages/user-badges/user-badges.page.ts +++ b/src/addons/badges/pages/user-badges/user-badges.page.ts @@ -20,7 +20,7 @@ import { CoreDomUtils } from '@services/utils/dom'; import { CoreSites } from '@services/sites'; import { CoreUtils } from '@services/utils/utils'; import { CoreNavigator } from '@services/navigator'; -// @todo import { CoreSplitViewComponent } from '@components/split-view/split-view'; +import { CoreScreen } from '@services/screen'; /** * Page that displays the list of calendar events. @@ -31,8 +31,6 @@ import { CoreNavigator } from '@services/navigator'; }) export class AddonBadgesUserBadgesPage implements OnInit { - // @ViewChild(CoreSplitViewComponent) splitviewCtrl: CoreSplitViewComponent; - courseId = 0; userId!: number; @@ -50,11 +48,10 @@ export class AddonBadgesUserBadgesPage implements OnInit { this.userId = CoreNavigator.instance.getRouteNumberParam('userId') || CoreSites.instance.getCurrentSite()!.getUserId(); this.fetchBadges().finally(() => { - // @todo splitview - /* if (!this.badgeHash && this.splitviewCtrl.isOn() && this.badges.length > 0) { + if (!this.badgeHash && CoreScreen.instance.isTablet && this.badges.length > 0) { // Take first and load it. this.loadIssuedBadge(this.badges[0].uniquehash); - }*/ + } this.badgesLoaded = true; }); } @@ -99,9 +96,11 @@ export class AddonBadgesUserBadgesPage implements OnInit { loadIssuedBadge(badgeHash: string): void { this.badgeHash = badgeHash; const params = { courseId: this.courseId, userId: this.userId, badgeHash: badgeHash }; - // @todo use splitview. - // this.splitviewCtrl.push('AddonBadgesIssuedBadgePage', params); - CoreNavigator.instance.navigateToSitePath('/badges/issue', { params }); + + const splitViewLoaded = CoreNavigator.instance.isCurrentPathInTablet('**/badges/user/issue'); + const path = (splitViewLoaded ? '../' : '') + 'issue'; + + CoreNavigator.instance.navigate(path, { params }); } } diff --git a/src/addons/calendar/calendar-lazy.module.ts b/src/addons/calendar/calendar-lazy.module.ts index 396831edf..8b7c40fc1 100644 --- a/src/addons/calendar/calendar-lazy.module.ts +++ b/src/addons/calendar/calendar-lazy.module.ts @@ -13,10 +13,21 @@ // limitations under the License. import { Injector, NgModule } from '@angular/core'; -import { RouterModule, ROUTES, Routes } from '@angular/router'; +import { Route, RouterModule, ROUTES, Routes } from '@angular/router'; import { buildTabMainRoutes } from '@features/mainmenu/mainmenu-tab-routing.module'; +export const AddonCalendarEditRoute: Route = { + path: 'edit', + loadChildren: () => + import('@/addons/calendar/pages/edit-event/edit-event.module').then(m => m.AddonCalendarEditEventPageModule), +}; + +export const AddonCalendarEventRoute: Route ={ + path: 'event', + loadChildren: () => import('@/addons/calendar/pages/event/event.module').then(m => m.AddonCalendarEventPageModule), +}; + function buildRoutes(injector: Injector): Routes { return [ { @@ -37,16 +48,8 @@ function buildRoutes(injector: Injector): Routes { loadChildren: () => import('@/addons/calendar/pages/day/day.module').then(m => m.AddonCalendarDayPageModule), }, - { - path: 'event', - loadChildren: () => - import('@/addons/calendar/pages/event/event.module').then(m => m.AddonCalendarEventPageModule), - }, - { - path: 'edit', - loadChildren: () => - import('@/addons/calendar/pages/edit-event/edit-event.module').then(m => m.AddonCalendarEditEventPageModule), - }, + AddonCalendarEventRoute, + AddonCalendarEditRoute, ...buildTabMainRoutes(injector, { redirectTo: 'index', pathMatch: 'full', diff --git a/src/addons/calendar/pages/edit-event/edit-event.page.ts b/src/addons/calendar/pages/edit-event/edit-event.page.ts index c757fc200..71ee3feb1 100644 --- a/src/addons/calendar/pages/edit-event/edit-event.page.ts +++ b/src/addons/calendar/pages/edit-event/edit-event.page.ts @@ -12,7 +12,7 @@ // See the License for the specific language governing permissions and // limitations under the License. -import { Component, OnInit, OnDestroy, ViewChild, ElementRef } from '@angular/core'; +import { Component, OnInit, OnDestroy, ViewChild, ElementRef, Optional } from '@angular/core'; import { FormControl, FormGroup, FormBuilder, Validators } from '@angular/forms'; import { IonRefresher } from '@ionic/angular'; import { CoreEvents } from '@singletons/events'; @@ -23,7 +23,7 @@ import { CoreDomUtils } from '@services/utils/dom'; import { CoreTimeUtils } from '@services/utils/time'; import { CoreUtils } from '@services/utils/utils'; import { CoreCategoryData, CoreCourses, CoreCourseSearchedData, CoreEnrolledCourseData } from '@features/courses/services/courses'; -// @todo import { CoreSplitViewComponent } from '@components/split-view/split-view'; +import { CoreSplitViewComponent } from '@components/split-view/split-view'; import { CoreEditorRichTextEditorComponent } from '@features/editor/components/rich-text-editor/rich-text-editor.ts'; import { AddonCalendarProvider, @@ -91,6 +91,7 @@ export class AddonCalendarEditEventPage implements OnInit, OnDestroy { constructor( protected fb: FormBuilder, + @Optional() protected svComponent: CoreSplitViewComponent, ) { this.currentSite = CoreSites.instance.getCurrentSite()!; @@ -569,14 +570,15 @@ export class AddonCalendarEditEventPage implements OnInit, OnDestroy { } } - /* if (this.svComponent && this.svComponent.isOn()) { + if (this.svComponent?.isOn()) { // Empty form. this.hasOffline = false; this.form.reset(this.originalData); this.originalData = CoreUtils.instance.clone(this.form.value); - } else {*/ - this.originalData = undefined; // Avoid asking for confirmation. - CoreNavigator.instance.back(); + } else { + this.originalData = undefined; // Avoid asking for confirmation. + CoreNavigator.instance.back(); + } } /** diff --git a/src/addons/calendar/pages/event/event.page.ts b/src/addons/calendar/pages/event/event.page.ts index 225fd8275..3d3c9e7a2 100644 --- a/src/addons/calendar/pages/event/event.page.ts +++ b/src/addons/calendar/pages/event/event.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, Optional } from '@angular/core'; import { IonRefresher } from '@ionic/angular'; import { AlertOptions } from '@ionic/core'; import { @@ -37,12 +37,14 @@ import { CoreLocalNotifications } from '@services/local-notifications'; import { CoreCourse } from '@features/course/services/course'; import { CoreTimeUtils } from '@services/utils/time'; import { CoreGroups } from '@services/groups'; -// @todo import { CoreSplitViewComponent } from '@components/split-view/split-view'; +import { CoreSplitViewComponent } from '@components/split-view/split-view'; import { Network, NgZone, Translate } from '@singletons'; import { Subscription } from 'rxjs'; import { CoreNavigator } from '@services/navigator'; import { CoreUtils } from '@services/utils/utils'; import { AddonCalendarReminderDBRecord } from '../../services/database/calendar'; +import { ActivatedRoute } from '@angular/router'; +import { CoreScreen } from '@services/screen'; /** * Page that displays a single calendar event. @@ -85,11 +87,15 @@ export class AddonCalendarEventPage implements OnInit, OnDestroy { syncIcon = 'spinner'; // Sync icon. isSplitViewOn = false; - constructor() { + constructor( + @Optional() protected svComponent: CoreSplitViewComponent, + protected route: ActivatedRoute, + ) { + this.notificationsEnabled = CoreLocalNotifications.instance.isAvailable(); this.siteHomeId = CoreSites.instance.getCurrentSiteHomeId(); this.currentSiteId = CoreSites.instance.getCurrentSiteId(); - // this.isSplitViewOn = this.svComponent && this.svComponent.isOn(); + this.isSplitViewOn = this.svComponent?.isOn(); // Check if site supports editing and deleting. No need to check allowed types, event.canedit already does it. this.canEdit = AddonCalendar.instance.canEditEventsInSite(); @@ -145,18 +151,22 @@ export class AddonCalendarEventPage implements OnInit, OnDestroy { * View loaded. */ ngOnInit(): void { - const eventId = CoreNavigator.instance.getRouteNumberParam('id'); - if (!eventId) { - CoreDomUtils.instance.showErrorModal('Event ID not supplied.'); - CoreNavigator.instance.back(); + this.route.queryParams.subscribe(() => { + this.eventLoaded = false; - return; - } + const eventId = CoreNavigator.instance.getRouteNumberParam('id'); + if (!eventId) { + CoreDomUtils.instance.showErrorModal('Event ID not supplied.'); + CoreNavigator.instance.back(); - this.eventId = eventId; - this.syncIcon = 'spinner'; + return; + } - this.fetchEvent(); + this.eventId = eventId; + this.syncIcon = 'spinner'; + + this.fetchEvent(); + }); } /** @@ -501,9 +511,9 @@ export class AddonCalendarEventPage implements OnInit, OnDestroy { CoreDomUtils.instance.showToast('addon.calendar.eventcalendareventdeleted', true, 3000); // Event deleted, close the view. - /* if (!this.svComponent || !this.svComponent.isOn()) { - this.navCtrl.pop(); - }*/ + if (CoreScreen.instance.isMobile) { + CoreNavigator.instance.back(); + } } else { // Event deleted in offline, just mark it as deleted. this.event.deleted = true; @@ -558,9 +568,9 @@ export class AddonCalendarEventPage implements OnInit, OnDestroy { CoreDomUtils.instance.showToast('addon.calendar.eventcalendareventdeleted', true, 3000); // Event was deleted, close the view. - /* if (!this.svComponent || !this.svComponent.isOn()) { - this.navCtrl.pop(); - }*/ + if (CoreScreen.instance.isMobile) { + CoreNavigator.instance.back(); + } } else if (data.events && (!isManual || data.source != 'event')) { const event = data.events.find((ev) => ev.id == this.eventId); diff --git a/src/addons/calendar/pages/index/index.page.ts b/src/addons/calendar/pages/index/index.page.ts index 60a7eb3bc..fbe1e8319 100644 --- a/src/addons/calendar/pages/index/index.page.ts +++ b/src/addons/calendar/pages/index/index.page.ts @@ -89,9 +89,9 @@ export class AddonCalendarIndexPage implements OnInit, OnDestroy { this.currentSiteId = CoreSites.instance.getCurrentSiteId(); // Listen for events added. When an event is added, reload the data. - this.newEventObserver = CoreEvents.on( + this.newEventObserver = CoreEvents.on( AddonCalendarProvider.NEW_EVENT_EVENT, - (data: AddonCalendarUpdatedEventEvent) => { + (data) => { if (data && data.eventId) { this.loaded = false; this.refreshData(true, false); @@ -107,9 +107,9 @@ export class AddonCalendarIndexPage implements OnInit, OnDestroy { }, this.currentSiteId); // Listen for events edited. When an event is edited, reload the data. - this.editEventObserver = CoreEvents.on( + this.editEventObserver = CoreEvents.on( AddonCalendarProvider.EDIT_EVENT_EVENT, - (data: AddonCalendarUpdatedEventEvent) => { + (data) => { if (data && data.eventId) { this.loaded = false; this.refreshData(true, false); @@ -125,7 +125,7 @@ export class AddonCalendarIndexPage implements OnInit, OnDestroy { }, this.currentSiteId); // Refresh data if calendar events are synchronized manually but not by this page. - this.manualSyncObserver = CoreEvents.on(AddonCalendarSyncProvider.MANUAL_SYNCED, (data: AddonCalendarSyncEvents) => { + this.manualSyncObserver = CoreEvents.on(AddonCalendarSyncProvider.MANUAL_SYNCED, (data) => { if (data && data.source != 'index') { this.loaded = false; this.refreshData(false, false); @@ -143,9 +143,9 @@ export class AddonCalendarIndexPage implements OnInit, OnDestroy { this.hasOffline = await AddonCalendarOffline.instance.hasOfflineData(); }, this.currentSiteId); - this.filterChangedObserver = CoreEvents.on( + this.filterChangedObserver = CoreEvents.on( AddonCalendarProvider.FILTER_CHANGED_EVENT, - async (filterData: AddonCalendarFilter) => { + async (filterData) => { this.filter = filterData; // Course viewed has changed, check if the user can create events for this course calendar. diff --git a/src/addons/calendar/pages/list/list.html b/src/addons/calendar/pages/list/list.html index 00a6a5c46..ed921dbe7 100644 --- a/src/addons/calendar/pages/list/list.html +++ b/src/addons/calendar/pages/list/list.html @@ -19,8 +19,8 @@ - - + + @@ -86,5 +86,5 @@ - - + + diff --git a/src/addons/calendar/pages/list/list.module.ts b/src/addons/calendar/pages/list/list.module.ts index 18d32c117..a8653f719 100644 --- a/src/addons/calendar/pages/list/list.module.ts +++ b/src/addons/calendar/pages/list/list.module.ts @@ -17,18 +17,40 @@ import { IonicModule } from '@ionic/angular'; import { TranslateModule } from '@ngx-translate/core'; import { RouterModule, Routes } from '@angular/router'; import { CommonModule } from '@angular/common'; +import { AddonCalendarEventRoute, AddonCalendarEditRoute } from '@addons/calendar/calendar-lazy.module'; +import { conditionalRoutes } from '@/app/app-routing.module'; +import { CoreScreen } from '@services/screen'; import { CoreSharedModule } from '@/core/shared.module'; import { AddonCalendarListPage } from './list.page'; -const routes: Routes = [ +const splitviewRoutes = [AddonCalendarEditRoute, AddonCalendarEventRoute]; + +const mobileRoutes: Routes = [ { path: '', component: AddonCalendarListPage, }, + ...splitviewRoutes, ]; +const tabletRoutes: Routes = [ + { + path: '', + component: AddonCalendarListPage, + children: [ + ...splitviewRoutes, + ], + }, +]; + +const routes: Routes = [ + ...conditionalRoutes(mobileRoutes, () => CoreScreen.instance.isMobile), + ...conditionalRoutes(tabletRoutes, () => CoreScreen.instance.isTablet), +]; + + @NgModule({ imports: [ RouterModule.forChild(routes), diff --git a/src/addons/calendar/pages/list/list.page.ts b/src/addons/calendar/pages/list/list.page.ts index 93451166f..a0142b4a0 100644 --- a/src/addons/calendar/pages/list/list.page.ts +++ b/src/addons/calendar/pages/list/list.page.ts @@ -30,7 +30,7 @@ import { CoreSites } from '@services/sites'; import { CoreLocalNotifications } from '@services/local-notifications'; import { CoreEventObserver, CoreEvents } from '@singletons/events'; import { CoreApp } from '@services/app'; -// @todo import { CoreSplitViewComponent } from '@components/split-view/split-view'; +import { CoreSplitViewComponent } from '@components/split-view/split-view'; import moment from 'moment'; import { CoreConstants } from '@/core/constants'; import { AddonCalendarFilterPopoverComponent } from '../../components/filter/filter'; @@ -52,7 +52,7 @@ import { CoreNavigator } from '@services/navigator'; export class AddonCalendarListPage implements OnInit, OnDestroy { @ViewChild(IonContent) content?: IonContent; - // @ViewChild(CoreSplitViewComponent) splitviewCtrl: CoreSplitViewComponent; + @ViewChild(CoreSplitViewComponent) splitviewCtrl?: CoreSplitViewComponent; protected initialTime = 0; protected daysLoaded = 0; @@ -117,30 +117,28 @@ export class AddonCalendarListPage implements OnInit, OnDestroy { } // Listen for events added. When an event is added, reload the data. - this.newEventObserver = CoreEvents.on(AddonCalendarProvider.NEW_EVENT_EVENT, (data: AddonCalendarUpdatedEventEvent) => { + this.newEventObserver = CoreEvents.on(AddonCalendarProvider.NEW_EVENT_EVENT, (data) => { if (data && data.eventId) { - /* if (this.splitviewCtrl.isOn()) { - // Discussion added, clear details page. - this.splitviewCtrl.emptyDetails(); - }*/ - this.eventsLoaded = false; this.refreshEvents(true, false).finally(() => { // In tablet mode try to open the event (only if it's an online event). - /* if (this.splitviewCtrl.isOn() && data.event.id > 0) { - this.gotoEvent(data.event.id); - }*/ + if (this.splitviewCtrl?.isOn() && data.eventId > 0) { + this.gotoEvent(data.eventId); + } else if (this.splitviewCtrl?.isOn()) { + // Discussion added, clear details page. + this.emptySplitView(); + } }); } }, this.currentSiteId); // Listen for new event discarded event. When it does, reload the data. this.discardedObserver = CoreEvents.on(AddonCalendarProvider.NEW_EVENT_DISCARDED_EVENT, () => { - /* if (this.splitviewCtrl.isOn()) { + if (this.splitviewCtrl?.isOn()) { // Discussion added, clear details page. - this.splitviewCtrl.emptyDetails(); - }*/ + this.emptySplitView(); + } this.eventsLoaded = false; this.refreshEvents(true, false); @@ -155,14 +153,14 @@ export class AddonCalendarListPage implements OnInit, OnDestroy { }, this.currentSiteId); // Refresh data if calendar events are synchronized automatically. - this.syncObserver = CoreEvents.on(AddonCalendarSyncProvider.AUTO_SYNCED, () => { + this.syncObserver = CoreEvents.on(AddonCalendarSyncProvider.AUTO_SYNCED, (data) => { this.eventsLoaded = false; this.refreshEvents(); - /* if (this.splitviewCtrl.isOn() && this.eventId && data && data.deleted && data.deleted.indexOf(this.eventId) != -1) { + if (this.splitviewCtrl?.isOn() && this.eventId && data && data.deleted && data.deleted.indexOf(this.eventId) != -1) { // Current selected event was deleted. Clear details. - this.splitviewCtrl.emptyDetails(); - } */ + this.emptySplitView(); + } }, this.currentSiteId); // Refresh data if calendar events are synchronized manually but not by this page. @@ -172,10 +170,10 @@ export class AddonCalendarListPage implements OnInit, OnDestroy { this.refreshEvents(); } - /* if (this.splitviewCtrl.isOn() && this.eventId && data && data.deleted && data.deleted.indexOf(this.eventId) != -1) { + if (this.splitviewCtrl?.isOn() && this.eventId && data && data.deleted && data.deleted.indexOf(this.eventId) != -1) { // Current selected event was deleted. Clear details. - this.splitviewCtrl.emptyDetails(); - }*/ + this.emptySplitView(); + } }, this.currentSiteId); // Update the list when an event is deleted. @@ -183,15 +181,15 @@ export class AddonCalendarListPage implements OnInit, OnDestroy { AddonCalendarProvider.DELETED_EVENT_EVENT, (data: AddonCalendarUpdatedEventEvent) => { if (data && !data.sent) { - // Event was deleted in offline. Just mark it as deleted, no need to refresh. + // Event was deleted in offline. Just mark it as deleted, no need to refresh. this.markAsDeleted(data.eventId, true); this.deletedEvents.push(data.eventId); this.hasOffline = true; } else { - // Event deleted, clear the details if needed and refresh the view. - /* if (this.splitviewCtrl.isOn()) { - this.splitviewCtrl.emptyDetails(); - } */ + // Event deleted, clear the details if needed and refresh the view. + if (this.splitviewCtrl?.isOn()) { + this.emptySplitView(); + } this.eventsLoaded = false; this.refreshEvents(); @@ -259,14 +257,26 @@ export class AddonCalendarListPage implements OnInit, OnDestroy { await this.fetchData(false, true, false); - /* if (!this.eventId && this.splitviewCtrl.isOn() && this.events.length > 0) { + if (!this.eventId && this.splitviewCtrl?.isOn() && this.events.length > 0) { // Take first online event and load it. If no online event, load the first offline. if (this.onlineEvents[0]) { this.gotoEvent(this.onlineEvents[0].id); } else { this.gotoEvent(this.offlineEvents[0].id); } - }*/ + } + } + + /** + * Convenience function to clear detail view of the split view. + */ + protected emptySplitView(): void { + // Empty details. + const splitViewLoaded = CoreNavigator.instance.isCurrentPathInTablet('**/calendar/list/event') || + CoreNavigator.instance.isCurrentPathInTablet('**/calendar/list/edit'); + if (splitViewLoaded) { + CoreNavigator.instance.navigate('../'); + } } /** @@ -642,7 +652,10 @@ export class AddonCalendarListPage implements OnInit, OnDestroy { params.courseId = this.filter.courseId; } - CoreNavigator.instance.navigateToSitePath('/calendar/edit', { params }); // @todo , this.splitviewCtrl); + const splitViewLoaded = CoreNavigator.instance.isCurrentPathInTablet('**/calendar/list/event') || + CoreNavigator.instance.isCurrentPathInTablet('**/calendar/list/edit'); + const path = (splitViewLoaded ? '../' : '') + 'edit'; + CoreNavigator.instance.navigate(path, { params }); } /** @@ -664,9 +677,12 @@ export class AddonCalendarListPage implements OnInit, OnDestroy { // It's an offline event, go to the edit page. this.openEdit(eventId); } else { - /* this.splitviewCtrl.push('/calendar/event', { + const splitViewLoaded = CoreNavigator.instance.isCurrentPathInTablet('**/calendar/list/event') || + CoreNavigator.instance.isCurrentPathInTablet('**/calendar/list/edit'); + const path = (splitViewLoaded ? '../' : '') + 'event'; + CoreNavigator.instance.navigate(path, { params: { id: eventId, - });*/ + } }); } } diff --git a/src/addons/messages/components/conversation-info/conversation-info.ts b/src/addons/messages/components/conversation-info/conversation-info.ts index 80641149d..42cc442f5 100644 --- a/src/addons/messages/components/conversation-info/conversation-info.ts +++ b/src/addons/messages/components/conversation-info/conversation-info.ts @@ -22,6 +22,7 @@ import { import { CoreDomUtils } from '@services/utils/dom'; import { ActivatedRoute } from '@angular/router'; import { ModalController } from '@singletons'; +import { CoreNavigator } from '@services/navigator'; /** * Component that displays the list of conversations, including group conversations. @@ -49,8 +50,8 @@ export class AddonMessagesConversationInfoComponent implements OnInit { * Component loaded. */ ngOnInit(): void { - this.route.queryParams.subscribe(async params => { - this.conversationId = parseInt(params['conversationId'], 10); + this.route.queryParams.subscribe(async () => { + this.conversationId = CoreNavigator.instance.getRouteNumberParam('conversationId') || 0; this.loaded = false; this.fetchData().finally(() => { diff --git a/src/addons/messages/messages-lazy.module.ts b/src/addons/messages/messages-lazy.module.ts index 52bb5f592..35e2a2431 100644 --- a/src/addons/messages/messages-lazy.module.ts +++ b/src/addons/messages/messages-lazy.module.ts @@ -18,7 +18,7 @@ import { Route, RouterModule, ROUTES, Routes } from '@angular/router'; import { buildTabMainRoutes } from '@features/mainmenu/mainmenu-tab-routing.module'; import { AddonMessagesSettingsHandlerService } from './services/handlers/settings'; -export const discussionRoute: Route = { +export const AddonMessagesDiscussionRoute: Route = { path: 'discussion', loadChildren: () => import('./pages/discussion/discussion.module') .then(m => m.AddonMessagesDiscussionPageModule), @@ -40,7 +40,7 @@ function buildRoutes(injector: Injector): Routes { loadChildren: () => import('./pages/group-conversations/group-conversations.module') .then(m => m.AddonMessagesGroupConversationsPageModule), }, - discussionRoute, + AddonMessagesDiscussionRoute, { path: 'search', loadChildren: () => import('./pages/search/search.module') diff --git a/src/addons/messages/pages/contacts-35/contacts.html b/src/addons/messages/pages/contacts-35/contacts.html index 7ab57b086..a91b3af6b 100644 --- a/src/addons/messages/pages/contacts-35/contacts.html +++ b/src/addons/messages/pages/contacts-35/contacts.html @@ -5,7 +5,8 @@ {{ 'addon.messages.contacts' | translate }} - + @@ -16,7 +17,7 @@ - @@ -35,7 +36,8 @@ - diff --git a/src/addons/messages/pages/contacts-35/contacts.module.ts b/src/addons/messages/pages/contacts-35/contacts.module.ts index 952cff0c6..de85dcb1d 100644 --- a/src/addons/messages/pages/contacts-35/contacts.module.ts +++ b/src/addons/messages/pages/contacts-35/contacts.module.ts @@ -18,7 +18,7 @@ import { TranslateModule } from '@ngx-translate/core'; import { RouterModule, Routes } from '@angular/router'; import { CommonModule } from '@angular/common'; import { conditionalRoutes } from '@/app/app-routing.module'; -import { discussionRoute } from '@addons/messages/messages-lazy.module'; +import { AddonMessagesDiscussionRoute } from '@addons/messages/messages-lazy.module'; import { CoreScreen } from '@services/screen'; import { CoreSharedModule } from '@/core/shared.module'; @@ -26,23 +26,27 @@ import { CoreSearchComponentsModule } from '@features/search/components/componen import { AddonMessagesContacts35Page } from './contacts.page'; -const routes: Routes = [ +const mobileRoutes: Routes = [ { - matcher: segments => { - const matches = CoreScreen.instance.isMobile ? segments.length === 0 : true; - - return matches ? { consumed: [] } : null; - }, + path: '', component: AddonMessagesContacts35Page, - children: conditionalRoutes([ - { - path: '', - pathMatch: 'full', - }, - discussionRoute, - ], () => CoreScreen.instance.isTablet), }, - ...conditionalRoutes([discussionRoute], () => CoreScreen.instance.isMobile), + AddonMessagesDiscussionRoute, +]; + +const tabletRoutes: Routes = [ + { + path: '', + component: AddonMessagesContacts35Page, + children: [ + AddonMessagesDiscussionRoute, + ], + }, +]; + +const routes: Routes = [ + ...conditionalRoutes(mobileRoutes, () => CoreScreen.instance.isMobile), + ...conditionalRoutes(tabletRoutes, () => CoreScreen.instance.isTablet), ]; @NgModule({ diff --git a/src/addons/messages/pages/contacts-35/contacts.page.ts b/src/addons/messages/pages/contacts-35/contacts.page.ts index 61e9745fe..ce3c9260b 100644 --- a/src/addons/messages/pages/contacts-35/contacts.page.ts +++ b/src/addons/messages/pages/contacts-35/contacts.page.ts @@ -87,10 +87,9 @@ export class AddonMessagesContacts35Page implements OnInit, OnDestroy { * Component loaded. */ ngOnInit(): void { - this.route.queryParams.subscribe(async params => { - const discussionUserId = params['discussionUserId'] - ? parseInt(params['discussionUserId'], 10) - : (params['userId'] ? parseInt(params['userId'], 10) : undefined); + this.route.queryParams.subscribe(async () => { + const discussionUserId = CoreNavigator.instance.getRouteNumberParam('discussionUserId') || + CoreNavigator.instance.getRouteNumberParam('userId') || undefined; if (this.loaded && this.discussionUserId == discussionUserId) { return; @@ -250,7 +249,7 @@ export class AddonMessagesContacts35Page implements OnInit, OnDestroy { userId: discussionUserId, }; - const splitViewLoaded = CoreNavigator.instance.isSplitViewOutletLoaded('**/messages/contacts-35/discussion'); + const splitViewLoaded = CoreNavigator.instance.isCurrentPathInTablet('**/messages/contacts-35/discussion'); const path = (splitViewLoaded ? '../' : '') + 'discussion'; // @todo Check why this is failing on ngInit. diff --git a/src/addons/messages/pages/contacts/contacts.html b/src/addons/messages/pages/contacts/contacts.html index cf02631a1..0beaf5f76 100644 --- a/src/addons/messages/pages/contacts/contacts.html +++ b/src/addons/messages/pages/contacts/contacts.html @@ -8,7 +8,8 @@ - + @@ -17,10 +18,10 @@ - + {{ 'addon.messages.contacts' | translate}} - + {{ 'addon.messages.requests' | translate}} {{ requestsBadge }} diff --git a/src/addons/messages/pages/contacts/contacts.module.ts b/src/addons/messages/pages/contacts/contacts.module.ts index b6ff6303c..33dee8bfd 100644 --- a/src/addons/messages/pages/contacts/contacts.module.ts +++ b/src/addons/messages/pages/contacts/contacts.module.ts @@ -18,32 +18,37 @@ import { TranslateModule } from '@ngx-translate/core'; import { RouterModule, Routes } from '@angular/router'; import { CommonModule } from '@angular/common'; import { conditionalRoutes } from '@/app/app-routing.module'; -import { discussionRoute } from '@addons/messages/messages-lazy.module'; +import { AddonMessagesDiscussionRoute } from '@addons/messages/messages-lazy.module'; import { CoreScreen } from '@services/screen'; import { CoreSharedModule } from '@/core/shared.module'; import { AddonMessagesContactsPage } from './contacts.page'; -const routes: Routes = [ +const mobileRoutes: Routes = [ { - matcher: segments => { - const matches = CoreScreen.instance.isMobile ? segments.length === 0 : true; - - return matches ? { consumed: [] } : null; - }, + path: '', component: AddonMessagesContactsPage, - children: conditionalRoutes([ - { - path: '', - pathMatch: 'full', - }, - discussionRoute, - ], () => CoreScreen.instance.isTablet), }, - ...conditionalRoutes([discussionRoute], () => CoreScreen.instance.isMobile), + AddonMessagesDiscussionRoute, ]; +const tabletRoutes: Routes = [ + { + path: '', + component: AddonMessagesContactsPage, + children: [ + AddonMessagesDiscussionRoute, + ], + }, +]; + +const routes: Routes = [ + ...conditionalRoutes(mobileRoutes, () => CoreScreen.instance.isMobile), + ...conditionalRoutes(tabletRoutes, () => CoreScreen.instance.isTablet), +]; + + @NgModule({ imports: [ RouterModule.forChild(routes), diff --git a/src/addons/messages/pages/contacts/contacts.page.ts b/src/addons/messages/pages/contacts/contacts.page.ts index 32d3bdb7f..583156ba1 100644 --- a/src/addons/messages/pages/contacts/contacts.page.ts +++ b/src/addons/messages/pages/contacts/contacts.page.ts @@ -258,7 +258,7 @@ export class AddonMessagesContactsPage implements OnInit, OnDestroy { this.selectedUserId = userId; - const splitViewLoaded = CoreNavigator.instance.isSplitViewOutletLoaded('**/messages/contacts/discussion'); + const splitViewLoaded = CoreNavigator.instance.isCurrentPathInTablet('**/messages/contacts/discussion'); const path = (splitViewLoaded ? '../' : '') + 'discussion'; CoreNavigator.instance.navigate(path, { params : { userId } }); diff --git a/src/addons/messages/pages/discussion/discussion.html b/src/addons/messages/pages/discussion/discussion.html index fef58336a..5188bb66b 100644 --- a/src/addons/messages/pages/discussion/discussion.html +++ b/src/addons/messages/pages/discussion/discussion.html @@ -61,7 +61,7 @@ - + @@ -72,18 +72,24 @@

{{ 'addon.messages.selfconversationdefaultmessage' | translate }}

- +
{{ message.timecreated | coreFormatDate: "strftimedayshort" }}
- + {{ 'addon.messages.newmessages' | translate }} - +

@@ -98,7 +104,8 @@

- +

- + - {{ newMessages }} @@ -125,24 +133,38 @@ -

{{ 'addon.messages.unabletomessage' | translate }}

+

+ {{ 'addon.messages.unabletomessage' | translate }} +

{{ 'addon.messages.youhaveblockeduser' | translate }}

- {{ 'addon.messages.unblockuser' | translate }} + + {{ 'addon.messages.unblockuser' | translate }} +
-
-

{{ 'addon.messages.isnotinyourcontacts' | translate: {$a: otherMember.fullname} }}

+
+

+ {{ 'addon.messages.isnotinyourcontacts' | translate: {$a: otherMember.fullname} }} +

{{ 'addon.messages.requirecontacttomessage' | translate: {$a: otherMember.fullname} }}

- {{ 'addon.messages.sendcontactrequest' | translate }} + + {{ 'addon.messages.sendcontactrequest' | translate }} +
-
+

{{ 'addon.messages.userwouldliketocontactyou' | translate: {$a: otherMember.fullname} }}

- {{ 'addon.messages.acceptandaddcontact' | translate }} - {{ 'addon.messages.decline' | translate }} + + {{ 'addon.messages.acceptandaddcontact' | translate }} + + + {{ 'addon.messages.decline' | translate }} +

{{ 'addon.messages.contactrequestsent' | translate }}

-

{{ 'addon.messages.yourcontactrequestpending' | translate: {$a: otherMember.fullname} }}

+

+ {{ 'addon.messages.yourcontactrequestpending' | translate: {$a: otherMember.fullname} }} +

diff --git a/src/addons/messages/pages/discussion/discussion.page.ts b/src/addons/messages/pages/discussion/discussion.page.ts index e423e4dd9..fc51c4034 100644 --- a/src/addons/messages/pages/discussion/discussion.page.ts +++ b/src/addons/messages/pages/discussion/discussion.page.ts @@ -61,7 +61,7 @@ import { AddonMessagesConversationInfoComponent } from '../../components/convers selector: 'page-addon-messages-discussion', templateUrl: 'discussion.html', animations: [CoreAnimations.SLIDE_IN_OUT], - styleUrls: ['discussion.scss', '../../../../theme/messages.scss'], + styleUrls: ['discussion.scss'], }) export class AddonMessagesDiscussionPage implements OnInit, OnDestroy, AfterViewInit { @@ -167,15 +167,15 @@ export class AddonMessagesDiscussionPage implements OnInit, OnDestroy, AfterView */ async ngOnInit(): Promise { - this.route.queryParams.subscribe(async params => { + this.route.queryParams.subscribe(async () => { // Disable the profile button if we're already coming from a profile. const backViewPage = CoreNavigator.instance.getPreviousPath(); this.showInfo = !backViewPage || !CoreTextUtils.instance.matchesGlob(backViewPage, '**/user/profile'); this.loaded = false; - this.conversationId = params['conversationId'] ? parseInt(params['conversationId'], 10) : undefined; - this.userId = params['userId'] ? parseInt(params['userId'], 10) : undefined; - this.showKeyboard = !!params['showKeyboard']; + this.conversationId = CoreNavigator.instance.getRouteNumberParam('conversationId') || undefined; + this.userId = CoreNavigator.instance.getRouteNumberParam('userId') || undefined; + this.showKeyboard = CoreNavigator.instance.getRouteBooleanParam('showKeyboard') || false; await this.fetchData(); @@ -1329,7 +1329,7 @@ export class AddonMessagesDiscussionPage implements OnInit, OnDestroy, AfterView const result = await modal.onDidDismiss(); if (typeof result.data != 'undefined') { - const splitViewLoaded = CoreNavigator.instance.isSplitViewOutletLoaded('**/messages/**/discussion'); + const splitViewLoaded = CoreNavigator.instance.isCurrentPathInTablet('**/messages/**/discussion'); // Open user conversation. if (splitViewLoaded) { diff --git a/src/addons/messages/pages/discussions-35/discussions.html b/src/addons/messages/pages/discussions-35/discussions.html index 64d6e92a5..eb37901dc 100644 --- a/src/addons/messages/pages/discussions-35/discussions.html +++ b/src/addons/messages/pages/discussions-35/discussions.html @@ -5,7 +5,8 @@ {{ 'addon.messages.messages' | translate }} - + @@ -16,7 +17,7 @@ - @@ -24,7 +25,7 @@ -

{{ 'addon.messages.contacts' | translate }}

@@ -37,9 +38,9 @@ {{ search.results.length }} - + [class.core-selected-item]="result.userid == discussionUserId">

{{ result.fullname }}

@@ -49,18 +50,21 @@
- +

{{ discussion.fullname }}

- {{discussion.message!.timecreated / 1000 | coreDateDayOrTime}} + + {{discussion.message!.timecreated / 1000 | coreDateDayOrTime}} +

- +

diff --git a/src/addons/messages/pages/discussions-35/discussions.module.ts b/src/addons/messages/pages/discussions-35/discussions.module.ts index 99ef467a3..7b0329662 100644 --- a/src/addons/messages/pages/discussions-35/discussions.module.ts +++ b/src/addons/messages/pages/discussions-35/discussions.module.ts @@ -19,30 +19,34 @@ import { RouterModule, Routes } from '@angular/router'; import { CommonModule } from '@angular/common'; import { CoreScreen } from '@services/screen'; import { conditionalRoutes } from '@/app/app-routing.module'; -import { discussionRoute } from '@addons/messages/messages-lazy.module'; +import { AddonMessagesDiscussionRoute } from '@addons/messages/messages-lazy.module'; import { CoreSharedModule } from '@/core/shared.module'; import { CoreSearchComponentsModule } from '@features/search/components/components.module'; import { AddonMessagesDiscussions35Page } from './discussions.page'; -const routes: Routes = [ +const mobileRoutes: Routes = [ { - matcher: segments => { - const matches = CoreScreen.instance.isMobile ? segments.length === 0 : true; - - return matches ? { consumed: [] } : null; - }, + path: '', component: AddonMessagesDiscussions35Page, - children: conditionalRoutes([ - { - path: '', - pathMatch: 'full', - }, - discussionRoute, - ], () => CoreScreen.instance.isTablet), }, - ...conditionalRoutes([discussionRoute], () => CoreScreen.instance.isMobile), + AddonMessagesDiscussionRoute, +]; + +const tabletRoutes: Routes = [ + { + path: '', + component: AddonMessagesDiscussions35Page, + children: [ + AddonMessagesDiscussionRoute, + ], + }, +]; + +const routes: Routes = [ + ...conditionalRoutes(mobileRoutes, () => CoreScreen.instance.isMobile), + ...conditionalRoutes(tabletRoutes, () => CoreScreen.instance.isTablet), ]; @NgModule({ diff --git a/src/addons/messages/pages/discussions-35/discussions.page.ts b/src/addons/messages/pages/discussions-35/discussions.page.ts index 562aefbcb..f8ca2fe7e 100644 --- a/src/addons/messages/pages/discussions-35/discussions.page.ts +++ b/src/addons/messages/pages/discussions-35/discussions.page.ts @@ -146,10 +146,9 @@ export class AddonMessagesDiscussions35Page implements OnInit, OnDestroy { * Component loaded. */ ngOnInit(): void { - this.route.queryParams.subscribe(async params => { - const discussionUserId = params['discussionUserId'] - ? parseInt(params['discussionUserId'], 10) - : (params['userId'] ? parseInt(params['userId'], 10) : undefined); + this.route.queryParams.subscribe(async () => { + const discussionUserId = CoreNavigator.instance.getRouteNumberParam('discussionUserId') || + CoreNavigator.instance.getRouteNumberParam('userId') || undefined; if (this.loaded && this.discussionUserId == discussionUserId) { return; @@ -281,7 +280,7 @@ export class AddonMessagesDiscussions35Page implements OnInit, OnDestroy { params.message = messageId; } - const splitViewLoaded = CoreNavigator.instance.isSplitViewOutletLoaded('**/messages/index/discussion'); + const splitViewLoaded = CoreNavigator.instance.isCurrentPathInTablet('**/messages/index/discussion'); const path = (splitViewLoaded ? '../' : '') + 'discussion'; CoreNavigator.instance.navigate(path, { params }); diff --git a/src/addons/messages/pages/group-conversations/group-conversations.html b/src/addons/messages/pages/group-conversations/group-conversations.html index a1701348d..15454d75a 100644 --- a/src/addons/messages/pages/group-conversations/group-conversations.html +++ b/src/addons/messages/pages/group-conversations/group-conversations.html @@ -8,7 +8,7 @@ - + - + {{ 'core.favourites' | translate }} ({{ favourites.count }}) @@ -42,7 +42,8 @@ - +

{{ 'addon.messages.nofavourites' | translate }}

@@ -52,16 +53,18 @@
- + {{ 'addon.messages.groupconversations' | translate }} ({{ group.count }}) {{ group.unread }}
- + + - +

{{ 'addon.messages.nogroupconversations' | translate }}

@@ -70,16 +73,18 @@ - + {{ 'addon.messages.individualconversations' | translate }} ({{ individual.count }}) {{ individual.unread }}
- + + - +

{{ 'addon.messages.noindividualconversations' | translate }}

@@ -95,10 +100,15 @@ - + - + @@ -108,20 +118,25 @@

- - - - + +

{{ conversation.unreadcount }} {{conversation.lastmessagedate | coreDateDayOrTime}} -

+

- {{ 'addon.messages.you' | translate }} - {{ conversation.members[0].fullname + ':' }} - + + {{ 'addon.messages.you' | translate }} + + {{ conversation.members[0].fullname + ':' }} +

diff --git a/src/addons/messages/pages/group-conversations/group-conversations.module.ts b/src/addons/messages/pages/group-conversations/group-conversations.module.ts index b9310503f..87b9da1c9 100644 --- a/src/addons/messages/pages/group-conversations/group-conversations.module.ts +++ b/src/addons/messages/pages/group-conversations/group-conversations.module.ts @@ -18,31 +18,34 @@ import { TranslateModule } from '@ngx-translate/core'; import { RouterModule, Routes } from '@angular/router'; import { CommonModule } from '@angular/common'; import { conditionalRoutes } from '@/app/app-routing.module'; -import { discussionRoute } from '@addons/messages/messages-lazy.module'; +import { AddonMessagesDiscussionRoute } from '@addons/messages/messages-lazy.module'; import { CoreScreen } from '@services/screen'; import { CoreSharedModule } from '@/core/shared.module'; import { AddonMessagesGroupConversationsPage } from './group-conversations.page'; +const mobileRoutes: Routes = [ + { + path: '', + component: AddonMessagesGroupConversationsPage, + }, + AddonMessagesDiscussionRoute, +]; + +const tabletRoutes: Routes = [ + { + path: '', + component: AddonMessagesGroupConversationsPage, + children: [ + AddonMessagesDiscussionRoute, + ], + }, +]; const routes: Routes = [ - { - matcher: segments => { - const matches = CoreScreen.instance.isMobile ? segments.length === 0 : true; - - return matches ? { consumed: [] } : null; - }, - component: AddonMessagesGroupConversationsPage, - children: conditionalRoutes([ - { - path: '', - pathMatch: 'full', - }, - discussionRoute, - ], () => CoreScreen.instance.isTablet), - }, - ...conditionalRoutes([discussionRoute], () => CoreScreen.instance.isMobile), + ...conditionalRoutes(mobileRoutes, () => CoreScreen.instance.isMobile), + ...conditionalRoutes(tabletRoutes, () => CoreScreen.instance.isTablet), ]; @NgModule({ diff --git a/src/addons/messages/pages/group-conversations/group-conversations.page.ts b/src/addons/messages/pages/group-conversations/group-conversations.page.ts index 932a23e1d..40af29f07 100644 --- a/src/addons/messages/pages/group-conversations/group-conversations.page.ts +++ b/src/addons/messages/pages/group-conversations/group-conversations.page.ts @@ -280,11 +280,11 @@ export class AddonMessagesGroupConversationsPage implements OnInit, OnDestroy { * Component loaded. */ ngOnInit(): void { - this.route.queryParams.subscribe(async params => { + this.route.queryParams.subscribe(async () => { // Conversation to load. - this.conversationId = params['conversationId'] ? parseInt(params['conversationId'], 10) : undefined; + this.conversationId = CoreNavigator.instance.getRouteNumberParam('conversationId') || undefined; if (!this.conversationId) { - this.discussionUserId = params['discussionUserId'] ? parseInt(params['discussionUserId'], 10) : undefined; + this.discussionUserId = CoreNavigator.instance.getRouteNumberParam('discussionUserId') || undefined; } if (this.conversationId || this.discussionUserId) { @@ -535,7 +535,7 @@ export class AddonMessagesGroupConversationsPage implements OnInit, OnDestroy { params.message = messageId; } - const splitViewLoaded = CoreNavigator.instance.isSplitViewOutletLoaded('**/messages/group-conversations/discussion'); + const splitViewLoaded = CoreNavigator.instance.isCurrentPathInTablet('**/messages/group-conversations/discussion'); const path = (splitViewLoaded ? '../' : '') + 'discussion'; CoreNavigator.instance.navigate(path, { params }); } diff --git a/src/addons/messages/pages/search/search.html b/src/addons/messages/pages/search/search.html index f41db63cf..ec3b67f65 100644 --- a/src/addons/messages/pages/search/search.html +++ b/src/addons/messages/pages/search/search.html @@ -5,14 +5,15 @@ {{ 'addon.messages.searchcombined' | translate }} - + - @@ -55,8 +56,12 @@ {{result.lastmessagedate | coreDateDayOrTime}}

- {{ 'addon.messages.you' | translate }} - + + {{ 'addon.messages.you' | translate }} + +

diff --git a/src/addons/messages/pages/search/search.module.ts b/src/addons/messages/pages/search/search.module.ts index 3e1f65f5f..e9eb63e61 100644 --- a/src/addons/messages/pages/search/search.module.ts +++ b/src/addons/messages/pages/search/search.module.ts @@ -19,30 +19,34 @@ import { RouterModule, Routes } from '@angular/router'; import { CommonModule } from '@angular/common'; import { CoreScreen } from '@services/screen'; import { conditionalRoutes } from '@/app/app-routing.module'; -import { discussionRoute } from '@addons/messages/messages-lazy.module'; +import { AddonMessagesDiscussionRoute } from '@addons/messages/messages-lazy.module'; import { CoreSharedModule } from '@/core/shared.module'; import { CoreSearchComponentsModule } from '@features/search/components/components.module'; import { AddonMessagesSearchPage } from './search.page'; -const routes: Routes = [ +const mobileRoutes: Routes = [ { - matcher: segments => { - const matches = CoreScreen.instance.isMobile ? segments.length === 0 : true; - - return matches ? { consumed: [] } : null; - }, + path: '', component: AddonMessagesSearchPage, - children: conditionalRoutes([ - { - path: '', - pathMatch: 'full', - }, - discussionRoute, - ], () => CoreScreen.instance.isTablet), }, - ...conditionalRoutes([discussionRoute], () => CoreScreen.instance.isMobile), + AddonMessagesDiscussionRoute, +]; + +const tabletRoutes: Routes = [ + { + path: '', + component: AddonMessagesSearchPage, + children: [ + AddonMessagesDiscussionRoute, + ], + }, +]; + +const routes: Routes = [ + ...conditionalRoutes(mobileRoutes, () => CoreScreen.instance.isMobile), + ...conditionalRoutes(tabletRoutes, () => CoreScreen.instance.isTablet), ]; @NgModule({ diff --git a/src/addons/messages/pages/search/search.page.ts b/src/addons/messages/pages/search/search.page.ts index 8e1545fe2..7ecef5284 100644 --- a/src/addons/messages/pages/search/search.page.ts +++ b/src/addons/messages/pages/search/search.page.ts @@ -108,7 +108,7 @@ export class AddonMessagesSearchPage implements OnDestroy { this.displayResults = false; // Empty details. - const splitViewLoaded = CoreNavigator.instance.isSplitViewOutletLoaded('**/messages/search/discussion'); + const splitViewLoaded = CoreNavigator.instance.isCurrentPathInTablet('**/messages/search/discussion'); if (splitViewLoaded) { CoreNavigator.instance.navigate('../'); } @@ -258,7 +258,7 @@ export class AddonMessagesSearchPage implements OnDestroy { params.userId = result.id; } - const splitViewLoaded = CoreNavigator.instance.isSplitViewOutletLoaded('**/messages/search/discussion'); + const splitViewLoaded = CoreNavigator.instance.isCurrentPathInTablet('**/messages/search/discussion'); const path = (splitViewLoaded ? '../' : '') + 'discussion'; CoreNavigator.instance.navigate(path, { params }); } diff --git a/src/core/features/settings/pages/site/site.ts b/src/core/features/settings/pages/site/site.ts index c6be86921..6631bba08 100644 --- a/src/core/features/settings/pages/site/site.ts +++ b/src/core/features/settings/pages/site/site.ts @@ -20,13 +20,13 @@ import { CoreSettingsDelegate, CoreSettingsHandlerData } from '../../services/se import { CoreEventObserver, CoreEvents, CoreEventSiteUpdatedData } from '@singletons/events'; import { CoreSites } from '@services/sites'; import { CoreDomUtils } from '@services/utils/dom'; -// import { CoreSplitViewComponent } from '@components/split-view/split-view'; // import { CoreSharedFiles } from '@features/sharedfiles/services/sharedfiles'; import { CoreSettingsHelper, CoreSiteSpaceUsage } from '../../services/settings-helper'; import { CoreApp } from '@services/app'; import { CoreSiteInfo } from '@classes/site'; import { Translate } from '@singletons'; import { CoreNavigator } from '@services/navigator'; +import { CoreScreen } from '@services/screen'; /** * Page that displays the list of site settings pages. @@ -37,8 +37,6 @@ import { CoreNavigator } from '@services/navigator'; }) export class CoreSitePreferencesPage implements OnInit, OnDestroy { - // @ViewChild(CoreSplitViewComponent) splitviewCtrl?: CoreSplitViewComponent; - isIOS: boolean; selectedPage?: string; @@ -80,13 +78,14 @@ export class CoreSitePreferencesPage implements OnInit, OnDestroy { if (this.selectedPage) { this.openHandler(this.selectedPage); - } /* else if (this.splitviewCtrl.isOn()) { + } else if (CoreScreen.instance.isTablet) { if (this.isIOS) { - this.openHandler('CoreSharedFilesListPage', { manage: true, siteId: this.siteId, hideSitePicker: true }); + // @todo + // this.openHandler('CoreSharedFilesListPage', { manage: true, siteId: this.siteId, hideSitePicker: true }); } else if (this.handlers.length > 0) { this.openHandler(this.handlers[0].page, this.handlers[0].params); } - }*/ + } }); } diff --git a/src/core/features/tag/pages/index-area/index-area.page.ts b/src/core/features/tag/pages/index-area/index-area.page.ts index 085220850..c57826de4 100644 --- a/src/core/features/tag/pages/index-area/index-area.page.ts +++ b/src/core/features/tag/pages/index-area/index-area.page.ts @@ -16,6 +16,7 @@ import { Component, OnInit, Type } from '@angular/core'; import { IonInfiniteScroll, IonRefresher } from '@ionic/angular'; import { CoreDomUtils } from '@services/utils/dom'; import { CoreTag } from '@features/tag/services/tag'; +import { ActivatedRoute } from '@angular/router'; import { CoreTagAreaDelegate } from '../../services/tag-area-delegate'; import { Translate } from '@singletons'; import { CoreNavigator } from '@services/navigator'; @@ -49,35 +50,43 @@ export class CoreTagIndexAreaPage implements OnInit { areaComponent?: Type; loadMoreError = false; + constructor( + protected route: ActivatedRoute, + ) { } + /** * View loaded. */ async ngOnInit(): Promise { - this.tagId = CoreNavigator.instance.getRouteNumberParam('tagId') || this.tagId; - this.tagName = CoreNavigator.instance.getRouteParam('tagName') || this.tagName; - this.collectionId = CoreNavigator.instance.getRouteNumberParam('collectionId') || this.collectionId; - this.areaId = CoreNavigator.instance.getRouteNumberParam('areaId') || this.areaId; - this.fromContextId = CoreNavigator.instance.getRouteNumberParam('fromContextId') || this.fromContextId; - this.contextId = CoreNavigator.instance.getRouteNumberParam('contextId') || this.contextId; - this.recursive = CoreNavigator.instance.getRouteBooleanParam('recursive') ?? true; + this.route.queryParams.subscribe(async () => { + this.loaded = false; - this.areaNameKey = CoreNavigator.instance.getRouteParam('areaNameKey') || ''; - // Pass the the following parameters to avoid fetching the first page. - this.componentName = CoreNavigator.instance.getRouteParam('componentName'); - this.itemType = CoreNavigator.instance.getRouteParam('itemType'); - this.items = CoreNavigator.instance.getRouteParam('items') || []; - this.nextPage = CoreNavigator.instance.getRouteNumberParam('nextPage') || 0; - this.canLoadMore = CoreNavigator.instance.getRouteBooleanParam('canLoadMore') || false; + this.tagId = CoreNavigator.instance.getRouteNumberParam('tagId') || this.tagId; + this.tagName = CoreNavigator.instance.getRouteParam('tagName') || this.tagName; + this.collectionId = CoreNavigator.instance.getRouteNumberParam('collectionId') || this.collectionId; + this.areaId = CoreNavigator.instance.getRouteNumberParam('areaId') || this.areaId; + this.fromContextId = CoreNavigator.instance.getRouteNumberParam('fromContextId') || this.fromContextId; + this.contextId = CoreNavigator.instance.getRouteNumberParam('contextId') || this.contextId; + this.recursive = CoreNavigator.instance.getRouteBooleanParam('recursive') ?? true; - try { - if (!this.componentName || !this.itemType || !this.items.length || this.nextPage == 0) { - await this.fetchData(true); + this.areaNameKey = CoreNavigator.instance.getRouteParam('areaNameKey') || ''; + // Pass the the following parameters to avoid fetching the first page. + this.componentName = CoreNavigator.instance.getRouteParam('componentName'); + this.itemType = CoreNavigator.instance.getRouteParam('itemType'); + this.items = CoreNavigator.instance.getRouteParam('items') || []; + this.nextPage = CoreNavigator.instance.getRouteNumberParam('nextPage') || 0; + this.canLoadMore = CoreNavigator.instance.getRouteBooleanParam('canLoadMore') || false; + + try { + if (!this.componentName || !this.itemType || !this.items.length || this.nextPage == 0) { + await this.fetchData(true); + } + + this.areaComponent = await CoreTagAreaDelegate.instance.getComponent(this.componentName!, this.itemType!); + } finally { + this.loaded = true; } - - this.areaComponent = await CoreTagAreaDelegate.instance.getComponent(this.componentName!, this.itemType!); - } finally { - this.loaded = true; - } + }); } /** diff --git a/src/core/features/tag/pages/index/index.html b/src/core/features/tag/pages/index/index.html index 62a9b753a..8172d9862 100644 --- a/src/core/features/tag/pages/index/index.html +++ b/src/core/features/tag/pages/index/index.html @@ -6,26 +6,28 @@ {{ 'core.tag.tag' | translate }}: {{ tagName }} - + - - - - - - - - {{ 'core.tag.warningareasnotsupported' | translate }} - - - -

{{ area!.nameKey | translate }}

-
- {{ area!.badge }} -
-
- -
+ + + + + + + + + {{ 'core.tag.warningareasnotsupported' | translate }} + + + +

{{ area!.nameKey | translate }}

+
+ {{ area!.badge }} +
+
+ +
+
diff --git a/src/core/features/tag/pages/index/index.page.module.ts b/src/core/features/tag/pages/index/index.page.module.ts index 2f21892ed..e11ccd89c 100644 --- a/src/core/features/tag/pages/index/index.page.module.ts +++ b/src/core/features/tag/pages/index/index.page.module.ts @@ -17,15 +17,34 @@ import { IonicModule } from '@ionic/angular'; import { TranslateModule } from '@ngx-translate/core'; import { CommonModule } from '@angular/common'; import { RouterModule, Routes } from '@angular/router'; +import { conditionalRoutes } from '@/app/app-routing.module'; +import { CoreTagIndexAreaRoute } from '@features/tag/tag-lazy.module'; +import { CoreScreen } from '@services/screen'; import { CoreSharedModule } from '@/core/shared.module'; import { CoreTagIndexPage } from './index.page'; -const routes: Routes = [ +const mobileRoutes: Routes = [ { path: '', component: CoreTagIndexPage, }, + CoreTagIndexAreaRoute, +]; + +const tabletRoutes: Routes = [ + { + path: '', + component: CoreTagIndexPage, + children: [ + CoreTagIndexAreaRoute, + ], + }, +]; + +const routes: Routes = [ + ...conditionalRoutes(mobileRoutes, () => CoreScreen.instance.isMobile), + ...conditionalRoutes(tabletRoutes, () => CoreScreen.instance.isTablet), ]; @NgModule({ diff --git a/src/core/features/tag/pages/index/index.page.ts b/src/core/features/tag/pages/index/index.page.ts index 5a6f3d8fc..f7fc03140 100644 --- a/src/core/features/tag/pages/index/index.page.ts +++ b/src/core/features/tag/pages/index/index.page.ts @@ -15,9 +15,9 @@ import { Component, OnInit } from '@angular/core'; import { IonRefresher } from '@ionic/angular'; import { CoreDomUtils } from '@services/utils/dom'; -// import { CoreSplitViewComponent } from '@components/split-view/split-view'; import { CoreTag } from '@features/tag/services/tag'; import { CoreTagAreaDelegate } from '@features/tag/services/tag-area-delegate'; +import { CoreScreen } from '@services/screen'; import { CoreNavigator } from '@services/navigator'; /** @@ -29,8 +29,6 @@ import { CoreNavigator } from '@services/navigator'; }) export class CoreTagIndexPage implements OnInit { - // @ViewChild(CoreSplitViewComponent) splitviewCtrl: CoreSplitViewComponent; - tagId = 0; tagName = ''; collectionId = 0; @@ -42,7 +40,7 @@ export class CoreTagIndexPage implements OnInit { selectedAreaId?: number; hasUnsupportedAreas = false; - areas: (CoreTagAreaDisplay | null)[] = []; + areas: CoreTagAreaDisplay[] = []; /** * View loaded. @@ -58,10 +56,10 @@ export class CoreTagIndexPage implements OnInit { try { await this.fetchData(); - /* if (this.splitviewCtrl.isOn() && this.areas && this.areas.length > 0) { + if (CoreScreen.instance.isTablet && this.areas && this.areas.length > 0) { const area = this.areas.find((area) => area.id == this.areaId); this.openArea(area || this.areas[0]); - }*/ + } } finally { this.loaded = true; } @@ -88,17 +86,19 @@ export class CoreTagIndexPage implements OnInit { this.areas = []; this.hasUnsupportedAreas = false; - const areasDisplay: (CoreTagAreaDisplay | null)[] = await Promise.all(areas.map(async (area) => { + const areasDisplay: CoreTagAreaDisplay[] = []; + + await Promise.all(areas.map(async (area) => { const items = await CoreTagAreaDelegate.instance.parseContent(area.component, area.itemtype, area.content); if (!items || !items.length) { // Tag area not supported, skip. this.hasUnsupportedAreas = true; - return null; + return; } - return { + areasDisplay.push({ id: area.ta, componentName: area.component, itemType: area.itemtype, @@ -106,10 +106,10 @@ export class CoreTagIndexPage implements OnInit { items, canLoadMore: !!area.nextpageurl, badge: items && items.length ? items.length + (area.nextpageurl ? '+' : '') : '', - }; + }); })); - this.areas = areasDisplay.filter((area) => area != null); + this.areas = areasDisplay; } catch (error) { CoreDomUtils.instance.showErrorModalDefault(error, 'Error loading tag index'); @@ -160,8 +160,11 @@ export class CoreTagIndexPage implements OnInit { canLoadMore: area.canLoadMore, nextPage: 1, }; - // this.splitviewCtrl.push('index-area', params); - CoreNavigator.instance.navigate('../index-area', { params }); + + const splitViewLoaded = CoreNavigator.instance.isCurrentPathInTablet('**/tag/index/index-area'); + const path = (splitViewLoaded ? '../' : '') + 'index-area'; + + CoreNavigator.instance.navigate(path, { params }); } } diff --git a/src/core/features/tag/tag-lazy.module.ts b/src/core/features/tag/tag-lazy.module.ts index 1fbe988b1..dc6ed32c1 100644 --- a/src/core/features/tag/tag-lazy.module.ts +++ b/src/core/features/tag/tag-lazy.module.ts @@ -13,10 +13,16 @@ // limitations under the License. import { Injector, NgModule } from '@angular/core'; -import { RouterModule, ROUTES, Routes } from '@angular/router'; +import { Route, RouterModule, ROUTES, Routes } from '@angular/router'; import { buildTabMainRoutes } from '@features/mainmenu/mainmenu-tab-routing.module'; +export const CoreTagIndexAreaRoute: Route = { + path: 'index-area', + loadChildren: () => + import('@features/tag/pages/index-area/index-area.page.module').then(m => m.CoreTagIndexAreaPageModule), +}; + function buildRoutes(injector: Injector): Routes { return [ { @@ -27,11 +33,7 @@ function buildRoutes(injector: Injector): Routes { path: 'search', loadChildren: () => import('@features/tag//pages/search/search.page.module').then(m => m.CoreTagSearchPageModule), }, - { - path: 'index-area', - loadChildren: () => - import('@features/tag/pages/index-area/index-area.page.module').then(m => m.CoreTagIndexAreaPageModule), - }, + CoreTagIndexAreaRoute, ...buildTabMainRoutes(injector, { redirectTo: 'search', pathMatch: 'full',