MOBILE-3926 core: Move item path getters to source
parent
f45f984d8e
commit
e8d0026995
|
@ -12,6 +12,7 @@
|
||||||
// See the License for the specific language governing permissions and
|
// See the License for the specific language governing permissions and
|
||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
|
|
||||||
|
import { Params } from '@angular/router';
|
||||||
import { CoreItemsManagerSource } from '@classes/items-management/items-manager-source';
|
import { CoreItemsManagerSource } from '@classes/items-management/items-manager-source';
|
||||||
import { AddonBadges, AddonBadgesUserBadge } from '../services/badges';
|
import { AddonBadges, AddonBadgesUserBadge } from '../services/badges';
|
||||||
|
|
||||||
|
@ -30,6 +31,23 @@ export class AddonBadgesUserBadgesSource extends CoreItemsManagerSource<AddonBad
|
||||||
this.USER_ID = userId;
|
this.USER_ID = userId;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @inheritdoc
|
||||||
|
*/
|
||||||
|
getItemPath(badge: AddonBadgesUserBadge): string {
|
||||||
|
return badge.uniquehash;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @inheritdoc
|
||||||
|
*/
|
||||||
|
getItemQueryParams(): Params {
|
||||||
|
return {
|
||||||
|
courseId: this.COURSE_ID,
|
||||||
|
userId: this.USER_ID,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @inheritdoc
|
* @inheritdoc
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -22,7 +22,7 @@ import { AddonBadges, AddonBadgesUserBadge } from '../../services/badges';
|
||||||
import { CoreUtils } from '@services/utils/utils';
|
import { CoreUtils } from '@services/utils/utils';
|
||||||
import { CoreCourses, CoreEnrolledCourseData } from '@features/courses/services/courses';
|
import { CoreCourses, CoreEnrolledCourseData } from '@features/courses/services/courses';
|
||||||
import { CoreNavigator } from '@services/navigator';
|
import { CoreNavigator } from '@services/navigator';
|
||||||
import { ActivatedRoute, ActivatedRouteSnapshot, Params } from '@angular/router';
|
import { ActivatedRoute } from '@angular/router';
|
||||||
import { CoreSwipeItemsManager } from '@classes/items-management/swipe-items-manager';
|
import { CoreSwipeItemsManager } from '@classes/items-management/swipe-items-manager';
|
||||||
import { CoreItemsManagerSourcesTracker } from '@classes/items-management/items-manager-sources-tracker';
|
import { CoreItemsManagerSourcesTracker } from '@classes/items-management/items-manager-sources-tracker';
|
||||||
import { AddonBadgesUserBadgesSource } from '@addons/badges/classes/user-badges-source';
|
import { AddonBadgesUserBadgesSource } from '@addons/badges/classes/user-badges-source';
|
||||||
|
@ -43,7 +43,7 @@ export class AddonBadgesIssuedBadgePage implements OnInit {
|
||||||
user?: CoreUserProfile;
|
user?: CoreUserProfile;
|
||||||
course?: CoreEnrolledCourseData;
|
course?: CoreEnrolledCourseData;
|
||||||
badge?: AddonBadgesUserBadge;
|
badge?: AddonBadgesUserBadge;
|
||||||
badges?: AddonBadgesUserBadgesSwipeManager;
|
badges?: CoreSwipeItemsManager;
|
||||||
badgeLoaded = false;
|
badgeLoaded = false;
|
||||||
currentTime = 0;
|
currentTime = 0;
|
||||||
|
|
||||||
|
@ -62,7 +62,7 @@ export class AddonBadgesIssuedBadgePage implements OnInit {
|
||||||
});
|
});
|
||||||
|
|
||||||
const source = CoreItemsManagerSourcesTracker.getOrCreateSource(AddonBadgesUserBadgesSource, [this.courseId, this.userId]);
|
const source = CoreItemsManagerSourcesTracker.getOrCreateSource(AddonBadgesUserBadgesSource, [this.courseId, this.userId]);
|
||||||
this.badges = new AddonBadgesUserBadgesSwipeManager(source);
|
this.badges = new CoreSwipeItemsManager(source);
|
||||||
|
|
||||||
this.badges.start();
|
this.badges.start();
|
||||||
}
|
}
|
||||||
|
@ -117,34 +117,3 @@ export class AddonBadgesIssuedBadgePage implements OnInit {
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Helper to manage swiping within a collection of user badges.
|
|
||||||
*/
|
|
||||||
class AddonBadgesUserBadgesSwipeManager extends CoreSwipeItemsManager<AddonBadgesUserBadge, AddonBadgesUserBadgesSource> {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @inheritdoc
|
|
||||||
*/
|
|
||||||
protected getItemPath(badge: AddonBadgesUserBadge): string {
|
|
||||||
return String(badge.uniquehash);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @inheritdoc
|
|
||||||
*/
|
|
||||||
protected getItemQueryParams(): Params {
|
|
||||||
return {
|
|
||||||
courseId: this.getSource().COURSE_ID,
|
|
||||||
userId: this.getSource().USER_ID,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @inheritdoc
|
|
||||||
*/
|
|
||||||
protected getSelectedItemPathFromRoute(route: ActivatedRouteSnapshot): string | null {
|
|
||||||
return route.params.badgeHash;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
|
@ -19,7 +19,6 @@ import { CoreTimeUtils } from '@services/utils/time';
|
||||||
import { CoreDomUtils } from '@services/utils/dom';
|
import { CoreDomUtils } from '@services/utils/dom';
|
||||||
import { CoreSites } from '@services/sites';
|
import { CoreSites } from '@services/sites';
|
||||||
import { CoreUtils } from '@services/utils/utils';
|
import { CoreUtils } from '@services/utils/utils';
|
||||||
import { Params } from '@angular/router';
|
|
||||||
import { CoreSplitViewComponent } from '@components/split-view/split-view';
|
import { CoreSplitViewComponent } from '@components/split-view/split-view';
|
||||||
import { CoreNavigator } from '@services/navigator';
|
import { CoreNavigator } from '@services/navigator';
|
||||||
import { CoreListItemsManager } from '@classes/items-management/list-items-manager';
|
import { CoreListItemsManager } from '@classes/items-management/list-items-manager';
|
||||||
|
@ -36,7 +35,7 @@ import { CoreItemsManagerSourcesTracker } from '@classes/items-management/items-
|
||||||
export class AddonBadgesUserBadgesPage implements AfterViewInit, OnDestroy {
|
export class AddonBadgesUserBadgesPage implements AfterViewInit, OnDestroy {
|
||||||
|
|
||||||
currentTime = 0;
|
currentTime = 0;
|
||||||
badges: AddonBadgesUserBadgesListManager;
|
badges: CoreListItemsManager<AddonBadgesUserBadge, AddonBadgesUserBadgesSource>;
|
||||||
|
|
||||||
@ViewChild(CoreSplitViewComponent) splitView!: CoreSplitViewComponent;
|
@ViewChild(CoreSplitViewComponent) splitView!: CoreSplitViewComponent;
|
||||||
|
|
||||||
|
@ -49,7 +48,7 @@ export class AddonBadgesUserBadgesPage implements AfterViewInit, OnDestroy {
|
||||||
courseId = 0;
|
courseId = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
this.badges = new AddonBadgesUserBadgesListManager(
|
this.badges = new CoreListItemsManager(
|
||||||
CoreItemsManagerSourcesTracker.getOrCreateSource(AddonBadgesUserBadgesSource, [courseId, userId]),
|
CoreItemsManagerSourcesTracker.getOrCreateSource(AddonBadgesUserBadgesSource, [courseId, userId]),
|
||||||
AddonBadgesUserBadgesPage,
|
AddonBadgesUserBadgesPage,
|
||||||
);
|
);
|
||||||
|
@ -104,27 +103,3 @@ export class AddonBadgesUserBadgesPage implements AfterViewInit, OnDestroy {
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Helper class to manage badges list.
|
|
||||||
*/
|
|
||||||
class AddonBadgesUserBadgesListManager extends CoreListItemsManager<AddonBadgesUserBadge, AddonBadgesUserBadgesSource> {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @inheritdoc
|
|
||||||
*/
|
|
||||||
protected getItemPath(badge: AddonBadgesUserBadge): string {
|
|
||||||
return badge.uniquehash;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @inheritdoc
|
|
||||||
*/
|
|
||||||
protected getItemQueryParams(): Params {
|
|
||||||
return {
|
|
||||||
courseId: this.getSource().COURSE_ID,
|
|
||||||
userId: this.getSource().USER_ID,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
|
@ -12,6 +12,7 @@
|
||||||
// See the License for the specific language governing permissions and
|
// See the License for the specific language governing permissions and
|
||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
|
|
||||||
|
import { Params } from '@angular/router';
|
||||||
import { CoreItemsManagerSource } from '@classes/items-management/items-manager-source';
|
import { CoreItemsManagerSource } from '@classes/items-management/items-manager-source';
|
||||||
import { CoreGroupInfo, CoreGroups } from '@services/groups';
|
import { CoreGroupInfo, CoreGroups } from '@services/groups';
|
||||||
import { CoreSites } from '@services/sites';
|
import { CoreSites } from '@services/sites';
|
||||||
|
@ -68,6 +69,24 @@ export class AddonModAssignSubmissionsSource extends CoreItemsManagerSource<Addo
|
||||||
this.SELECTED_STATUS = selectedStatus;
|
this.SELECTED_STATUS = selectedStatus;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @inheritdoc
|
||||||
|
*/
|
||||||
|
getItemPath(submission: AddonModAssignSubmissionForList): string {
|
||||||
|
return String(submission.submitid);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @inheritdoc
|
||||||
|
*/
|
||||||
|
getItemQueryParams(submission: AddonModAssignSubmissionForList): Params {
|
||||||
|
return {
|
||||||
|
blindId: submission.blindid,
|
||||||
|
groupId: this.groupId,
|
||||||
|
selectedStatus: this.SELECTED_STATUS,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Invalidate assignment cache.
|
* Invalidate assignment cache.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -13,7 +13,6 @@
|
||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
|
|
||||||
import { Component, OnDestroy, AfterViewInit, ViewChild } from '@angular/core';
|
import { Component, OnDestroy, AfterViewInit, ViewChild } from '@angular/core';
|
||||||
import { Params } from '@angular/router';
|
|
||||||
import { CoreItemsManagerSourcesTracker } from '@classes/items-management/items-manager-sources-tracker';
|
import { CoreItemsManagerSourcesTracker } from '@classes/items-management/items-manager-sources-tracker';
|
||||||
import { CoreListItemsManager } from '@classes/items-management/list-items-manager';
|
import { CoreListItemsManager } from '@classes/items-management/list-items-manager';
|
||||||
import { CoreSplitViewComponent } from '@components/split-view/split-view';
|
import { CoreSplitViewComponent } from '@components/split-view/split-view';
|
||||||
|
@ -44,7 +43,7 @@ export class AddonModAssignSubmissionListPage implements AfterViewInit, OnDestro
|
||||||
@ViewChild(CoreSplitViewComponent) splitView!: CoreSplitViewComponent;
|
@ViewChild(CoreSplitViewComponent) splitView!: CoreSplitViewComponent;
|
||||||
|
|
||||||
title = '';
|
title = '';
|
||||||
submissions!: AddonModAssignSubmissionListManager; // List of submissions
|
submissions!: CoreListItemsManager<AddonModAssignSubmissionForList, AddonModAssignSubmissionsSource>; // List of submissions
|
||||||
|
|
||||||
protected gradedObserver: CoreEventObserver; // Observer to refresh data when a grade changes.
|
protected gradedObserver: CoreEventObserver; // Observer to refresh data when a grade changes.
|
||||||
protected syncObserver: CoreEventObserver; // Observer to refresh data when the async is synchronized.
|
protected syncObserver: CoreEventObserver; // Observer to refresh data when the async is synchronized.
|
||||||
|
@ -99,7 +98,7 @@ export class AddonModAssignSubmissionListPage implements AfterViewInit, OnDestro
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
this.submissions = new AddonModAssignSubmissionListManager(
|
this.submissions = new CoreListItemsManager(
|
||||||
submissionsSource,
|
submissionsSource,
|
||||||
AddonModAssignSubmissionListPage,
|
AddonModAssignSubmissionListPage,
|
||||||
);
|
);
|
||||||
|
@ -213,29 +212,3 @@ export class AddonModAssignSubmissionListPage implements AfterViewInit, OnDestro
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Helper class to manage submissions.
|
|
||||||
*/
|
|
||||||
class AddonModAssignSubmissionListManager
|
|
||||||
extends CoreListItemsManager<AddonModAssignSubmissionForList, AddonModAssignSubmissionsSource> {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @inheritdoc
|
|
||||||
*/
|
|
||||||
protected getItemPath(submission: AddonModAssignSubmissionForList): string {
|
|
||||||
return String(submission.submitid);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @inheritdoc
|
|
||||||
*/
|
|
||||||
protected getItemQueryParams(submission: AddonModAssignSubmissionForList): Params {
|
|
||||||
return {
|
|
||||||
blindId: submission.blindid,
|
|
||||||
groupId: this.getSource().groupId,
|
|
||||||
selectedStatus: this.getSource().SELECTED_STATUS,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
|
@ -13,7 +13,7 @@
|
||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
|
|
||||||
import { Component, OnDestroy, OnInit, ViewChild } from '@angular/core';
|
import { Component, OnDestroy, OnInit, ViewChild } from '@angular/core';
|
||||||
import { ActivatedRoute, ActivatedRouteSnapshot, Params } from '@angular/router';
|
import { ActivatedRoute, ActivatedRouteSnapshot } from '@angular/router';
|
||||||
import { CoreItemsManagerSourcesTracker } from '@classes/items-management/items-manager-sources-tracker';
|
import { CoreItemsManagerSourcesTracker } from '@classes/items-management/items-manager-sources-tracker';
|
||||||
import { CoreSwipeItemsManager } from '@classes/items-management/swipe-items-manager';
|
import { CoreSwipeItemsManager } from '@classes/items-management/swipe-items-manager';
|
||||||
import { CoreCourse } from '@features/course/services/course';
|
import { CoreCourse } from '@features/course/services/course';
|
||||||
|
@ -22,7 +22,7 @@ import { IonRefresher } from '@ionic/angular';
|
||||||
import { CoreNavigator } from '@services/navigator';
|
import { CoreNavigator } from '@services/navigator';
|
||||||
import { CoreScreen } from '@services/screen';
|
import { CoreScreen } from '@services/screen';
|
||||||
import { CoreDomUtils } from '@services/utils/dom';
|
import { CoreDomUtils } from '@services/utils/dom';
|
||||||
import { AddonModAssignSubmissionForList, AddonModAssignSubmissionsSource } from '../../classes/submissions-source';
|
import { AddonModAssignSubmissionsSource } from '../../classes/submissions-source';
|
||||||
import { AddonModAssignSubmissionComponent } from '../../components/submission/submission';
|
import { AddonModAssignSubmissionComponent } from '../../components/submission/submission';
|
||||||
import { AddonModAssign, AddonModAssignAssign } from '../../services/assign';
|
import { AddonModAssign, AddonModAssignAssign } from '../../services/assign';
|
||||||
|
|
||||||
|
@ -216,26 +216,7 @@ export class AddonModAssignSubmissionReviewPage implements OnInit, OnDestroy, Ca
|
||||||
/**
|
/**
|
||||||
* Helper to manage swiping within a collection of submissions.
|
* Helper to manage swiping within a collection of submissions.
|
||||||
*/
|
*/
|
||||||
class AddonModAssignSubmissionSwipeItemsManager
|
class AddonModAssignSubmissionSwipeItemsManager extends CoreSwipeItemsManager {
|
||||||
extends CoreSwipeItemsManager<AddonModAssignSubmissionForList, AddonModAssignSubmissionsSource> {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @inheritdoc
|
|
||||||
*/
|
|
||||||
protected getItemPath(submission: AddonModAssignSubmissionForList): string {
|
|
||||||
return String(submission.submitid);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @inheritdoc
|
|
||||||
*/
|
|
||||||
protected getItemQueryParams(submission: AddonModAssignSubmissionForList): Params {
|
|
||||||
return {
|
|
||||||
blindId: submission.blindid,
|
|
||||||
groupId: this.getSource().groupId,
|
|
||||||
selectedStatus: this.getSource().SELECTED_STATUS,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @inheritdoc
|
* @inheritdoc
|
||||||
|
|
|
@ -12,6 +12,8 @@
|
||||||
// See the License for the specific language governing permissions and
|
// See the License for the specific language governing permissions and
|
||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
|
|
||||||
|
import { Params } from '@angular/router';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Updates listener.
|
* Updates listener.
|
||||||
*/
|
*/
|
||||||
|
@ -143,6 +145,25 @@ export abstract class CoreItemsManagerSource<Item = unknown> {
|
||||||
this.setItems((this.items ?? []).concat(items), hasMoreItems ?? false);
|
this.setItems((this.items ?? []).concat(items), hasMoreItems ?? false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the query parameters to use when navigating to an item page.
|
||||||
|
*
|
||||||
|
* @param item Item.
|
||||||
|
* @return Query parameters to use when navigating to the item page.
|
||||||
|
*/
|
||||||
|
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
||||||
|
getItemQueryParams(item: Item): Params {
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the path to use when navigating to an item page.
|
||||||
|
*
|
||||||
|
* @param item Item.
|
||||||
|
* @return Path to use when navigating to the item page.
|
||||||
|
*/
|
||||||
|
abstract getItemPath(item: Item): string;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Load page items.
|
* Load page items.
|
||||||
*
|
*
|
||||||
|
|
|
@ -12,7 +12,7 @@
|
||||||
// See the License for the specific language governing permissions and
|
// See the License for the specific language governing permissions and
|
||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
|
|
||||||
import { ActivatedRoute, ActivatedRouteSnapshot, Params } from '@angular/router';
|
import { ActivatedRoute, ActivatedRouteSnapshot } from '@angular/router';
|
||||||
import { CoreNavigationOptions, CoreNavigator } from '@services/navigator';
|
import { CoreNavigationOptions, CoreNavigator } from '@services/navigator';
|
||||||
|
|
||||||
import { CoreItemsManagerSource } from './items-manager-source';
|
import { CoreItemsManagerSource } from './items-manager-source';
|
||||||
|
@ -93,12 +93,12 @@ export abstract class CoreItemsManager<Item = unknown, Source extends CoreItemsM
|
||||||
protected abstract getCurrentPageRoute(): ActivatedRoute | null;
|
protected abstract getCurrentPageRoute(): ActivatedRoute | null;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the path to use when navigating to an item page.
|
* Get the path of the selected item given the current route.
|
||||||
*
|
*
|
||||||
* @param item Item.
|
* @param route Page route.
|
||||||
* @return Path to use when navigating to the item page.
|
* @return Path of the selected item in the given route.
|
||||||
*/
|
*/
|
||||||
protected abstract getItemPath(item: Item): string;
|
protected abstract getSelectedItemPathFromRoute(route: ActivatedRouteSnapshot): string | null;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the path of the selected item.
|
* Get the path of the selected item.
|
||||||
|
@ -106,17 +106,12 @@ export abstract class CoreItemsManager<Item = unknown, Source extends CoreItemsM
|
||||||
* @param route Page route, if any.
|
* @param route Page route, if any.
|
||||||
* @return Path of the selected item.
|
* @return Path of the selected item.
|
||||||
*/
|
*/
|
||||||
protected abstract getSelectedItemPath(route?: ActivatedRouteSnapshot | null): string | null;
|
protected getSelectedItemPath(route?: ActivatedRouteSnapshot | null): string | null {
|
||||||
|
if (!route) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
return this.getSelectedItemPathFromRoute(route);
|
||||||
* Get the query parameters to use when navigating to an item page.
|
|
||||||
*
|
|
||||||
* @param item Item.
|
|
||||||
* @return Query parameters to use when navigating to the item page.
|
|
||||||
*/
|
|
||||||
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
||||||
protected getItemQueryParams(item: Item): Params {
|
|
||||||
return {};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -152,7 +147,7 @@ export abstract class CoreItemsManager<Item = unknown, Source extends CoreItemsM
|
||||||
}
|
}
|
||||||
|
|
||||||
// If this item is already selected, do nothing.
|
// If this item is already selected, do nothing.
|
||||||
const itemPath = this.getItemPath(item);
|
const itemPath = this.getSource().getItemPath(item);
|
||||||
const selectedItemPath = this.getSelectedItemPath(route.snapshot);
|
const selectedItemPath = this.getSelectedItemPath(route.snapshot);
|
||||||
|
|
||||||
if (selectedItemPath === itemPath) {
|
if (selectedItemPath === itemPath) {
|
||||||
|
@ -160,7 +155,7 @@ export abstract class CoreItemsManager<Item = unknown, Source extends CoreItemsM
|
||||||
}
|
}
|
||||||
|
|
||||||
// Navigate to item.
|
// Navigate to item.
|
||||||
const params = this.getItemQueryParams(item);
|
const params = this.getSource().getItemQueryParams(item);
|
||||||
const pathPrefix = selectedItemPath ? selectedItemPath.split('/').fill('../').join('') : '';
|
const pathPrefix = selectedItemPath ? selectedItemPath.split('/').fill('../').join('') : '';
|
||||||
|
|
||||||
await CoreNavigator.navigate(pathPrefix + itemPath, { params, ...options });
|
await CoreNavigator.navigate(pathPrefix + itemPath, { params, ...options });
|
||||||
|
@ -173,7 +168,7 @@ export abstract class CoreItemsManager<Item = unknown, Source extends CoreItemsM
|
||||||
*/
|
*/
|
||||||
protected onSourceItemsUpdated(items: Item[]): void {
|
protected onSourceItemsUpdated(items: Item[]): void {
|
||||||
this.itemsMap = items.reduce((map, item) => {
|
this.itemsMap = items.reduce((map, item) => {
|
||||||
map[this.getItemPath(item)] = item;
|
map[this.getSource().getItemPath(item)] = item;
|
||||||
|
|
||||||
return map;
|
return map;
|
||||||
}, {});
|
}, {});
|
||||||
|
|
|
@ -26,7 +26,7 @@ import { CoreItemsManagerSource } from './items-manager-source';
|
||||||
/**
|
/**
|
||||||
* Helper class to manage the state and routing of a list of items in a page.
|
* Helper class to manage the state and routing of a list of items in a page.
|
||||||
*/
|
*/
|
||||||
export abstract class CoreListItemsManager<
|
export class CoreListItemsManager<
|
||||||
Item = unknown,
|
Item = unknown,
|
||||||
Source extends CoreItemsManagerSource<Item> = CoreItemsManagerSource<Item>
|
Source extends CoreItemsManagerSource<Item> = CoreItemsManagerSource<Item>
|
||||||
> extends CoreItemsManager<Item, Source> {
|
> extends CoreItemsManager<Item, Source> {
|
||||||
|
@ -206,10 +206,12 @@ export abstract class CoreListItemsManager<
|
||||||
/**
|
/**
|
||||||
* @inheritdoc
|
* @inheritdoc
|
||||||
*/
|
*/
|
||||||
protected getSelectedItemPath(route?: ActivatedRouteSnapshot | null): string | null {
|
protected getSelectedItemPathFromRoute(route: ActivatedRouteSnapshot): string | null {
|
||||||
const segments: UrlSegment[] = [];
|
const segments: UrlSegment[] = [];
|
||||||
|
|
||||||
while ((route = route?.firstChild)) {
|
while (route.firstChild) {
|
||||||
|
route = route.firstChild;
|
||||||
|
|
||||||
segments.push(...route.url);
|
segments.push(...route.url);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -12,7 +12,7 @@
|
||||||
// See the License for the specific language governing permissions and
|
// See the License for the specific language governing permissions and
|
||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
|
|
||||||
import { ActivatedRoute, ActivatedRouteSnapshot } from '@angular/router';
|
import { ActivatedRoute, ActivatedRouteSnapshot, UrlSegment } from '@angular/router';
|
||||||
|
|
||||||
import { CoreNavigator } from '@services/navigator';
|
import { CoreNavigator } from '@services/navigator';
|
||||||
|
|
||||||
|
@ -22,7 +22,7 @@ import { CoreItemsManagerSource } from './items-manager-source';
|
||||||
/**
|
/**
|
||||||
* Helper class to manage the state and routing of a swipeable page.
|
* Helper class to manage the state and routing of a swipeable page.
|
||||||
*/
|
*/
|
||||||
export abstract class CoreSwipeItemsManager<
|
export class CoreSwipeItemsManager<
|
||||||
Item = unknown,
|
Item = unknown,
|
||||||
Source extends CoreItemsManagerSource<Item> = CoreItemsManagerSource<Item>
|
Source extends CoreItemsManagerSource<Item> = CoreItemsManagerSource<Item>
|
||||||
>
|
>
|
||||||
|
@ -49,14 +49,6 @@ export abstract class CoreSwipeItemsManager<
|
||||||
await this.navigateToItemBy(1, 'forward');
|
await this.navigateToItemBy(1, 'forward');
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the path of the selected item given the current route.
|
|
||||||
*
|
|
||||||
* @param route Page route.
|
|
||||||
* @return Path of the selected item in the given route.
|
|
||||||
*/
|
|
||||||
protected abstract getSelectedItemPathFromRoute(route: ActivatedRouteSnapshot): string | null;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @inheritdoc
|
* @inheritdoc
|
||||||
*/
|
*/
|
||||||
|
@ -67,12 +59,20 @@ export abstract class CoreSwipeItemsManager<
|
||||||
/**
|
/**
|
||||||
* @inheritdoc
|
* @inheritdoc
|
||||||
*/
|
*/
|
||||||
protected getSelectedItemPath(route?: ActivatedRouteSnapshot | null): string | null {
|
protected getSelectedItemPathFromRoute(route: ActivatedRouteSnapshot): string | null {
|
||||||
if (!route) {
|
const segments: UrlSegment[] = [];
|
||||||
return null;
|
|
||||||
|
while (route) {
|
||||||
|
segments.push(...route.url);
|
||||||
|
|
||||||
|
if (!route.firstChild) {
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
return this.getSelectedItemPathFromRoute(route);
|
route = route.firstChild;
|
||||||
|
}
|
||||||
|
|
||||||
|
return segments.map(segment => segment.path).join('/').replace(/\/+/, '/').trim() || null;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -12,6 +12,7 @@
|
||||||
// See the License for the specific language governing permissions and
|
// See the License for the specific language governing permissions and
|
||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
|
|
||||||
|
import { Params } from '@angular/router';
|
||||||
import { CoreItemsManagerSource } from '@classes/items-management/items-manager-source';
|
import { CoreItemsManagerSource } from '@classes/items-management/items-manager-source';
|
||||||
|
|
||||||
import { CoreUser, CoreUserData, CoreUserParticipant, CoreUserProvider } from '../services/user';
|
import { CoreUser, CoreUserData, CoreUserParticipant, CoreUserProvider } from '../services/user';
|
||||||
|
@ -40,6 +41,20 @@ export class CoreUserParticipantsSource extends CoreItemsManagerSource<CoreUserP
|
||||||
this.SEARCH_QUERY = searchQuery;
|
this.SEARCH_QUERY = searchQuery;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @inheritdoc
|
||||||
|
*/
|
||||||
|
getItemPath(user: CoreUserParticipant | CoreUserData): string {
|
||||||
|
return user.id.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @inheritdoc
|
||||||
|
*/
|
||||||
|
getItemQueryParams(): Params {
|
||||||
|
return { search: this.SEARCH_QUERY };
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @inheritdoc
|
* @inheritdoc
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -13,7 +13,6 @@
|
||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
|
|
||||||
import { AfterViewInit, Component, OnDestroy, OnInit, ViewChild } from '@angular/core';
|
import { AfterViewInit, Component, OnDestroy, OnInit, ViewChild } from '@angular/core';
|
||||||
import { Params } from '@angular/router';
|
|
||||||
import { IonRefresher } from '@ionic/angular';
|
import { IonRefresher } from '@ionic/angular';
|
||||||
|
|
||||||
import { CoreApp } from '@services/app';
|
import { CoreApp } from '@services/app';
|
||||||
|
@ -50,7 +49,7 @@ export class CoreUserParticipantsPage implements OnInit, AfterViewInit, OnDestro
|
||||||
this.courseId = CoreNavigator.getRequiredRouteNumberParam('courseId');
|
this.courseId = CoreNavigator.getRequiredRouteNumberParam('courseId');
|
||||||
this.participants = new CoreUserParticipantsManager(
|
this.participants = new CoreUserParticipantsManager(
|
||||||
CoreItemsManagerSourcesTracker.getOrCreateSource(CoreUserParticipantsSource, [this.courseId]),
|
CoreItemsManagerSourcesTracker.getOrCreateSource(CoreUserParticipantsSource, [this.courseId]),
|
||||||
this,
|
CoreUserParticipantsPage,
|
||||||
);
|
);
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
CoreDomUtils.showErrorModal(error);
|
CoreDomUtils.showErrorModal(error);
|
||||||
|
@ -196,35 +195,13 @@ export class CoreUserParticipantsPage implements OnInit, AfterViewInit, OnDestro
|
||||||
/**
|
/**
|
||||||
* Helper to manage the list of participants.
|
* Helper to manage the list of participants.
|
||||||
*/
|
*/
|
||||||
class CoreUserParticipantsManager extends CoreListItemsManager<CoreUserParticipant | CoreUserData> {
|
class CoreUserParticipantsManager extends CoreListItemsManager<CoreUserParticipant | CoreUserData, CoreUserParticipantsSource> {
|
||||||
|
|
||||||
page: CoreUserParticipantsPage;
|
|
||||||
|
|
||||||
constructor(source: CoreUserParticipantsSource, page: CoreUserParticipantsPage) {
|
|
||||||
super(source, CoreUserParticipantsPage);
|
|
||||||
|
|
||||||
this.page = page;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @inheritdoc
|
|
||||||
*/
|
|
||||||
protected getItemPath(participant: CoreUserParticipant | CoreUserData): string {
|
|
||||||
return participant.id.toString();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @inheritdoc
|
|
||||||
*/
|
|
||||||
protected getItemQueryParams(): Params {
|
|
||||||
return { search: this.page.searchQuery };
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @inheritdoc
|
* @inheritdoc
|
||||||
*/
|
*/
|
||||||
protected async logActivity(): Promise<void> {
|
protected async logActivity(): Promise<void> {
|
||||||
await CoreUser.logParticipantsView(this.page.courseId);
|
await CoreUser.logParticipantsView(this.getSource().COURSE_ID);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,7 +12,7 @@
|
||||||
// See the License for the specific language governing permissions and
|
// See the License for the specific language governing permissions and
|
||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
|
|
||||||
import { ActivatedRoute, ActivatedRouteSnapshot, Params } from '@angular/router';
|
import { ActivatedRoute, ActivatedRouteSnapshot } from '@angular/router';
|
||||||
import { Component, OnDestroy, OnInit } from '@angular/core';
|
import { Component, OnDestroy, OnInit } from '@angular/core';
|
||||||
import { IonRefresher } from '@ionic/angular';
|
import { IonRefresher } from '@ionic/angular';
|
||||||
import { Subscription } from 'rxjs';
|
import { Subscription } from 'rxjs';
|
||||||
|
@ -21,7 +21,7 @@ import { CoreSite } from '@classes/site';
|
||||||
import { CoreSites } from '@services/sites';
|
import { CoreSites } from '@services/sites';
|
||||||
import { CoreDomUtils } from '@services/utils/dom';
|
import { CoreDomUtils } from '@services/utils/dom';
|
||||||
import { CoreEventObserver, CoreEvents } from '@singletons/events';
|
import { CoreEventObserver, CoreEvents } from '@singletons/events';
|
||||||
import { CoreUser, CoreUserBasicData, CoreUserProfile, CoreUserProvider } from '@features/user/services/user';
|
import { CoreUser, CoreUserProfile, CoreUserProvider } from '@features/user/services/user';
|
||||||
import { CoreUserHelper } from '@features/user/services/user-helper';
|
import { CoreUserHelper } from '@features/user/services/user-helper';
|
||||||
import { CoreUserDelegate, CoreUserDelegateService, CoreUserProfileHandlerData } from '@features/user/services/user-delegate';
|
import { CoreUserDelegate, CoreUserDelegateService, CoreUserProfileHandlerData } from '@features/user/services/user-delegate';
|
||||||
import { CoreUtils } from '@services/utils/utils';
|
import { CoreUtils } from '@services/utils/utils';
|
||||||
|
@ -30,7 +30,6 @@ import { CoreCourses } from '@features/courses/services/courses';
|
||||||
import { CoreSwipeItemsManager } from '@classes/items-management/swipe-items-manager';
|
import { CoreSwipeItemsManager } from '@classes/items-management/swipe-items-manager';
|
||||||
import { CoreUserParticipantsSource } from '@features/user/classes/participants-source';
|
import { CoreUserParticipantsSource } from '@features/user/classes/participants-source';
|
||||||
import { CoreItemsManagerSourcesTracker } from '@classes/items-management/items-manager-sources-tracker';
|
import { CoreItemsManagerSourcesTracker } from '@classes/items-management/items-manager-sources-tracker';
|
||||||
import { CoreItemsManagerSource } from '@classes/items-management/items-manager-source';
|
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector: 'page-core-user-profile',
|
selector: 'page-core-user-profile',
|
||||||
|
@ -57,7 +56,6 @@ export class CoreUserProfilePage implements OnInit, OnDestroy {
|
||||||
communicationHandlers: CoreUserProfileHandlerData[] = [];
|
communicationHandlers: CoreUserProfileHandlerData[] = [];
|
||||||
|
|
||||||
users?: CoreUserSwipeItemsManager;
|
users?: CoreUserSwipeItemsManager;
|
||||||
usersQueryParams: Params = {};
|
|
||||||
|
|
||||||
constructor(private route: ActivatedRoute) {
|
constructor(private route: ActivatedRoute) {
|
||||||
this.obsProfileRefreshed = CoreEvents.on(CoreUserProvider.PROFILE_REFRESHED, (data) => {
|
this.obsProfileRefreshed = CoreEvents.on(CoreUserProvider.PROFILE_REFRESHED, (data) => {
|
||||||
|
@ -93,9 +91,8 @@ export class CoreUserProfilePage implements OnInit, OnDestroy {
|
||||||
if (this.courseId && this.route.snapshot.data.swipeManagerSource === 'participants') {
|
if (this.courseId && this.route.snapshot.data.swipeManagerSource === 'participants') {
|
||||||
const search = CoreNavigator.getRouteParam('search');
|
const search = CoreNavigator.getRouteParam('search');
|
||||||
const source = CoreItemsManagerSourcesTracker.getOrCreateSource(CoreUserParticipantsSource, [this.courseId, search]);
|
const source = CoreItemsManagerSourcesTracker.getOrCreateSource(CoreUserParticipantsSource, [this.courseId, search]);
|
||||||
this.users = new CoreUserSwipeItemsManager(source, this);
|
this.users = new CoreUserSwipeItemsManager(source);
|
||||||
|
|
||||||
this.usersQueryParams.search = search;
|
|
||||||
this.users.start();
|
this.users.start();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -227,29 +224,7 @@ export class CoreUserProfilePage implements OnInit, OnDestroy {
|
||||||
/**
|
/**
|
||||||
* Helper to manage swiping within a collection of users.
|
* Helper to manage swiping within a collection of users.
|
||||||
*/
|
*/
|
||||||
class CoreUserSwipeItemsManager extends CoreSwipeItemsManager<CoreUserBasicData> {
|
class CoreUserSwipeItemsManager extends CoreSwipeItemsManager {
|
||||||
|
|
||||||
page: CoreUserProfilePage;
|
|
||||||
|
|
||||||
constructor(source: CoreItemsManagerSource<CoreUserBasicData>, page: CoreUserProfilePage) {
|
|
||||||
super(source);
|
|
||||||
|
|
||||||
this.page = page;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @inheritdoc
|
|
||||||
*/
|
|
||||||
protected getItemPath(item: CoreUserBasicData): string {
|
|
||||||
return String(item.id);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @inheritdoc
|
|
||||||
*/
|
|
||||||
protected getItemQueryParams(): Params {
|
|
||||||
return this.page.usersQueryParams;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @inheritdoc
|
* @inheritdoc
|
||||||
|
|
Loading…
Reference in New Issue