MOBILE-3784 calendar: Support opening any month with page params
parent
1a1e03bdd4
commit
ee4e8f6b05
|
@ -257,27 +257,9 @@ export class AddonCalendarCalendarComponent implements OnInit, DoCheck, OnDestro
|
||||||
* Go to current month.
|
* Go to current month.
|
||||||
*/
|
*/
|
||||||
async goToCurrentMonth(): Promise<void> {
|
async goToCurrentMonth(): Promise<void> {
|
||||||
const manager = this.manager;
|
const currentMoment = moment();
|
||||||
const slides = this.slides;
|
|
||||||
if (!manager || !slides) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
const currentMonth = {
|
await this.viewMonth(currentMoment.month() + 1, currentMoment.year());
|
||||||
moment: moment(),
|
|
||||||
};
|
|
||||||
this.loaded = false;
|
|
||||||
|
|
||||||
try {
|
|
||||||
// Make sure the day is loaded.
|
|
||||||
await manager.getSource().loadItem(currentMonth);
|
|
||||||
|
|
||||||
slides.slideToItem(currentMonth);
|
|
||||||
} catch (error) {
|
|
||||||
CoreDomUtils.showErrorModalDefault(error, 'addon.calendar.errorloadevents', true);
|
|
||||||
} finally {
|
|
||||||
this.loaded = true;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -319,6 +301,39 @@ export class AddonCalendarCalendarComponent implements OnInit, DoCheck, OnDestro
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* View a certain month and year.
|
||||||
|
*
|
||||||
|
* @param month Month.
|
||||||
|
* @param year Year.
|
||||||
|
*/
|
||||||
|
async viewMonth(month: number, year: number): Promise<void> {
|
||||||
|
const manager = this.manager;
|
||||||
|
const slides = this.slides;
|
||||||
|
if (!manager || !slides) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.loaded = false;
|
||||||
|
const item = {
|
||||||
|
moment: moment({
|
||||||
|
year,
|
||||||
|
month: month - 1,
|
||||||
|
}),
|
||||||
|
};
|
||||||
|
|
||||||
|
try {
|
||||||
|
// Make sure the day is loaded.
|
||||||
|
await manager.getSource().loadItem(item);
|
||||||
|
|
||||||
|
slides.slideToItem(item);
|
||||||
|
} catch (error) {
|
||||||
|
CoreDomUtils.showErrorModalDefault(error, 'addon.calendar.errorloadevents', true);
|
||||||
|
} finally {
|
||||||
|
this.loaded = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Component destroyed.
|
* Component destroyed.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -173,6 +173,10 @@ export class AddonCalendarIndexPage implements OnInit, OnDestroy {
|
||||||
this.filter.filtered = !!this.filter.courseId;
|
this.filter.filtered = !!this.filter.courseId;
|
||||||
|
|
||||||
this.fetchData(true, false);
|
this.fetchData(true, false);
|
||||||
|
|
||||||
|
if (this.year !== undefined && this.month !== undefined && this.calendarComponent) {
|
||||||
|
this.calendarComponent.viewMonth(this.month, this.year);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
const deepLinkManager = new CoreMainMenuDeepLinkManager();
|
const deepLinkManager = new CoreMainMenuDeepLinkManager();
|
||||||
|
|
|
@ -18,6 +18,7 @@ import {
|
||||||
import { CoreSwipeSlidesItemsManager } from '@classes/items-management/swipe-slides-items-manager';
|
import { CoreSwipeSlidesItemsManager } from '@classes/items-management/swipe-slides-items-manager';
|
||||||
import { IonContent, IonSlides } from '@ionic/angular';
|
import { IonContent, IonSlides } from '@ionic/angular';
|
||||||
import { CoreDomUtils, VerticalPoint } from '@services/utils/dom';
|
import { CoreDomUtils, VerticalPoint } from '@services/utils/dom';
|
||||||
|
import { CoreUtils } from '@services/utils/utils';
|
||||||
import { CoreDom } from '@singletons/dom';
|
import { CoreDom } from '@singletons/dom';
|
||||||
import { CoreEventObserver } from '@singletons/events';
|
import { CoreEventObserver } from '@singletons/events';
|
||||||
import { CoreMath } from '@singletons/math';
|
import { CoreMath } from '@singletons/math';
|
||||||
|
@ -43,6 +44,7 @@ export class CoreSwipeSlidesComponent<Item = unknown> implements OnChanges, OnDe
|
||||||
protected hostElement: HTMLElement;
|
protected hostElement: HTMLElement;
|
||||||
protected unsubscribe?: () => void;
|
protected unsubscribe?: () => void;
|
||||||
protected resizeListener: CoreEventObserver;
|
protected resizeListener: CoreEventObserver;
|
||||||
|
protected updateSlidesPromise?: Promise<void>;
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
elementRef: ElementRef<HTMLElement>,
|
elementRef: ElementRef<HTMLElement>,
|
||||||
|
@ -51,7 +53,7 @@ export class CoreSwipeSlidesComponent<Item = unknown> implements OnChanges, OnDe
|
||||||
this.hostElement = elementRef.nativeElement;
|
this.hostElement = elementRef.nativeElement;
|
||||||
|
|
||||||
this.resizeListener = CoreDom.onWindowResize(() => {
|
this.resizeListener = CoreDom.onWindowResize(() => {
|
||||||
this.slides?.update();
|
this.updateSlidesComponent();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -118,7 +120,22 @@ export class CoreSwipeSlidesComponent<Item = unknown> implements OnChanges, OnDe
|
||||||
* @param speed Animation speed.
|
* @param speed Animation speed.
|
||||||
* @param runCallbacks Whether to run callbacks.
|
* @param runCallbacks Whether to run callbacks.
|
||||||
*/
|
*/
|
||||||
slideToIndex(index: number, speed?: number, runCallbacks?: boolean): void {
|
async slideToIndex(index: number, speed?: number, runCallbacks?: boolean): Promise<void> {
|
||||||
|
// If slides are being updated, wait for the update to finish.
|
||||||
|
await this.updateSlidesPromise;
|
||||||
|
|
||||||
|
const slides = this.slides;
|
||||||
|
if (!slides) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Verify that the number of slides matches the number of items.
|
||||||
|
const slidesLength = await slides.length();
|
||||||
|
if (slidesLength !== this.items.length) {
|
||||||
|
// Number doesn't match, do a new update to try to match them.
|
||||||
|
await this.updateSlidesComponent();
|
||||||
|
}
|
||||||
|
|
||||||
this.slides?.slideTo(index, speed, runCallbacks);
|
this.slides?.slideTo(index, speed, runCallbacks);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -132,7 +149,7 @@ export class CoreSwipeSlidesComponent<Item = unknown> implements OnChanges, OnDe
|
||||||
slideToItem(item: Item, speed?: number, runCallbacks?: boolean): void {
|
slideToItem(item: Item, speed?: number, runCallbacks?: boolean): void {
|
||||||
const index = this.manager?.getSource().getItemIndex(item) ?? -1;
|
const index = this.manager?.getSource().getItemIndex(item) ?? -1;
|
||||||
if (index != -1) {
|
if (index != -1) {
|
||||||
this.slides?.slideTo(index, speed, runCallbacks);
|
this.slideToIndex(index, speed, runCallbacks);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -158,10 +175,14 @@ export class CoreSwipeSlidesComponent<Item = unknown> implements OnChanges, OnDe
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Called when items list has been updated.
|
* Called when items list has been updated.
|
||||||
*
|
|
||||||
* @param items New items.
|
|
||||||
*/
|
*/
|
||||||
protected onItemsUpdated(): void {
|
protected async onItemsUpdated(): Promise<void> {
|
||||||
|
// Wait for slides to be added in DOM.
|
||||||
|
await CoreUtils.nextTick();
|
||||||
|
|
||||||
|
// Update the slides component so the slides list reflects the new items.
|
||||||
|
await this.updateSlidesComponent();
|
||||||
|
|
||||||
const currentItem = this.manager?.getSelectedItem();
|
const currentItem = this.manager?.getSelectedItem();
|
||||||
|
|
||||||
if (!currentItem || !this.manager) {
|
if (!currentItem || !this.manager) {
|
||||||
|
@ -249,6 +270,24 @@ export class CoreSwipeSlidesComponent<Item = unknown> implements OnChanges, OnDe
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Update slides component.
|
||||||
|
*/
|
||||||
|
protected async updateSlidesComponent(): Promise<void> {
|
||||||
|
if (!this.slides) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const promise = this.slides.update();
|
||||||
|
this.updateSlidesPromise = promise;
|
||||||
|
|
||||||
|
await promise;
|
||||||
|
|
||||||
|
if (this.updateSlidesPromise === promise) {
|
||||||
|
delete this.updateSlidesPromise;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @inheritdoc
|
* @inheritdoc
|
||||||
*/
|
*/
|
||||||
|
|
Loading…
Reference in New Issue