diff --git a/src/addons/mod/forum/forum.module.ts b/src/addons/mod/forum/forum.module.ts index 4c7d58def..4fbe6e626 100644 --- a/src/addons/mod/forum/forum.module.ts +++ b/src/addons/mod/forum/forum.module.ts @@ -29,6 +29,11 @@ import { CoreCourseModulePrefetchDelegate } from '@features/course/services/modu import { AddonModForumPrefetchHandler } from './services/handlers/prefetch'; import { CoreCronDelegate } from '@services/cron'; import { AddonModForumSyncCronHandler } from './services/handlers/sync-cron'; +import { CoreContentLinksDelegate } from '@features/contentlinks/services/contentlinks-delegate'; +import { AddonModForumDiscussionLinkHandler } from './services/handlers/discussion-link'; +import { AddonModForumIndexLinkHandler } from './services/handlers/index-link'; +import { AddonModForumListLinkHandler } from './services/handlers/list-link'; +import { AddonModForumPostLinkHandler } from './services/handlers/post-link'; const mainMenuRoutes: Routes = [ { @@ -85,6 +90,10 @@ const courseContentsRoutes: Routes = conditionalRoutes( CoreCourseModuleDelegate.instance.registerHandler(AddonModForumModuleHandler.instance); CoreCourseModulePrefetchDelegate.instance.registerHandler(AddonModForumPrefetchHandler.instance); CoreCronDelegate.instance.register(AddonModForumSyncCronHandler.instance); + CoreContentLinksDelegate.instance.registerHandler(AddonModForumDiscussionLinkHandler.instance); + CoreContentLinksDelegate.instance.registerHandler(AddonModForumIndexLinkHandler.instance); + CoreContentLinksDelegate.instance.registerHandler(AddonModForumListLinkHandler.instance); + CoreContentLinksDelegate.instance.registerHandler(AddonModForumPostLinkHandler.instance); }, }, ], diff --git a/src/addons/mod/forum/services/handlers/discussion-link.ts b/src/addons/mod/forum/services/handlers/discussion-link.ts new file mode 100644 index 000000000..ee3c1682d --- /dev/null +++ b/src/addons/mod/forum/services/handlers/discussion-link.ts @@ -0,0 +1,95 @@ +// (C) Copyright 2015 Moodle Pty Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import { Injectable } from '@angular/core'; +import { Params } from '@angular/router'; +import { CoreContentLinksHandlerBase } from '@features/contentlinks/classes/base-handler'; +import { CoreContentLinksAction } from '@features/contentlinks/services/contentlinks-delegate'; +import { CoreNavigator } from '@services/navigator'; +import { makeSingleton } from '@singletons'; +import { AddonModForumModuleHandlerService } from './module'; + +/** + * Handler to treat links to forum review. + */ +@Injectable({ providedIn: 'root' }) +export class AddonModForumDiscussionLinkHandlerService extends CoreContentLinksHandlerBase { + + name = 'AddonModForumDiscussionLinkHandler'; + featureName = 'CoreCourseModuleDelegate_AddonModForum'; + pattern = /\/mod\/forum\/discuss\.php.*([&?]d=\d+)/; + + /** + * Get the list of actions for a link (url). + * + * @param siteIds List of sites the URL belongs to. + * @param url The URL to treat. + * @param params The params of the URL. E.g. 'mysite.com?id=1' -> {id: 1} + * @param courseId Course ID related to the URL. Optional but recommended. + * @param data Extra data to handle the URL. + * @return List of (or promise resolved with list of) actions. + */ + getActions( + siteIds: string[], + url: string, + params: Params, + courseId?: number, + data?: any, + ): CoreContentLinksAction[] | Promise { + data = data || {}; + + // On 3.6 downwards, it will open the discussion but without knowing the lock status of the discussion. + // However canreply will be false. + + return [{ + action: (siteId): void => { + const cmId = data.cmid && parseInt(data.cmid, 10); + const discussionId = parseInt(params.d, 10); + const pageParams: Params = { forumId: data.instance && parseInt(data.instance, 10) }; + + courseId = courseId || parseInt(params.courseid, 10) || parseInt(params.cid, 10); + + if (data.postid || params.urlHash) { + pageParams.postId = parseInt(data.postid || params.urlHash.replace('p', '')); + } + + if (params.parent) { + pageParams.parent = parseInt(params.parent); + } + + CoreNavigator.instance.navigateToSitePath( + `${AddonModForumModuleHandlerService.PAGE_NAME}/${courseId}/${cmId}/${discussionId}`, + { siteId, params: pageParams }, + ); + }, + }]; + } + + /** + * Check if the handler is enabled for a certain site (site + user) and a URL. + * If not defined, defaults to true. + * + * @param siteId The site ID. + * @param url The URL to treat. + * @param params The params of the URL. E.g. 'mysite.com?id=1' -> {id: 1} + * @param courseId Course ID related to the URL. Optional but recommended. + * @return Whether the handler is enabled for the URL and site. + */ + async isEnabled(): Promise { + return true; + } + +} + +export class AddonModForumDiscussionLinkHandler extends makeSingleton(AddonModForumDiscussionLinkHandlerService) {} diff --git a/src/addons/mod/forum/services/handlers/index-link.ts b/src/addons/mod/forum/services/handlers/index-link.ts new file mode 100644 index 000000000..b15d728bb --- /dev/null +++ b/src/addons/mod/forum/services/handlers/index-link.ts @@ -0,0 +1,33 @@ +// (C) Copyright 2015 Moodle Pty Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import { Injectable } from '@angular/core'; +import { CoreContentLinksModuleIndexHandler } from '@features/contentlinks/classes/module-index-handler'; +import { makeSingleton } from '@singletons'; + +/** + * Handler to treat links to forum index. + */ +@Injectable({ providedIn: 'root' }) +export class AddonModForumIndexLinkHandlerService extends CoreContentLinksModuleIndexHandler { + + name = 'AddonModForumIndexLinkHandler'; + + constructor() { + super('AddonModForum', 'forum', 'f'); + } + +} + +export class AddonModForumIndexLinkHandler extends makeSingleton(AddonModForumIndexLinkHandlerService) {} diff --git a/src/addons/mod/forum/services/handlers/list-link.ts b/src/addons/mod/forum/services/handlers/list-link.ts new file mode 100644 index 000000000..6338c88e0 --- /dev/null +++ b/src/addons/mod/forum/services/handlers/list-link.ts @@ -0,0 +1,33 @@ +// (C) Copyright 2015 Moodle Pty Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import { Injectable } from '@angular/core'; +import { CoreContentLinksModuleListHandler } from '@features/contentlinks/classes/module-list-handler'; +import { makeSingleton } from '@singletons'; + +/** + * Handler to treat links to forum list page. + */ +@Injectable({ providedIn: 'root' }) +export class AddonModForumListLinkHandlerService extends CoreContentLinksModuleListHandler { + + name = 'AddonModForumListLinkHandler'; + + constructor() { + super('AddonModForum', 'forum'); + } + +} + +export class AddonModForumListLinkHandler extends makeSingleton(AddonModForumListLinkHandlerService) {} diff --git a/src/addons/mod/forum/services/handlers/post-link.ts b/src/addons/mod/forum/services/handlers/post-link.ts new file mode 100644 index 000000000..4a4e9bf61 --- /dev/null +++ b/src/addons/mod/forum/services/handlers/post-link.ts @@ -0,0 +1,86 @@ +// (C) Copyright 2015 Moodle Pty Ltd. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +import { Injectable } from '@angular/core'; +import { Params } from '@angular/router'; +import { CoreContentLinksHandlerBase } from '@features/contentlinks/classes/base-handler'; +import { CoreContentLinksAction } from '@features/contentlinks/services/contentlinks-delegate'; +import { CoreCourse } from '@features/course/services/course'; +import { CoreNavigator } from '@services/navigator'; +import { CoreDomUtils } from '@services/utils/dom'; +import { makeSingleton } from '@singletons'; +import { AddonModForumModuleHandlerService } from './module'; + +/** + * Content links handler for forum new discussion. + * Match mod/forum/post.php?forum=6 with a valid data. + */ +@Injectable({ providedIn: 'root' }) +export class AddonModForumPostLinkHandlerService extends CoreContentLinksHandlerBase { + + name = 'AddonModForumPostLinkHandler'; + featureName = 'CoreCourseModuleDelegate_AddonModForum'; + pattern = /\/mod\/forum\/post\.php.*([?&](forum)=\d+)/; + + /** + * Get the list of actions for a link (url). + * + * @param siteIds List of sites the URL belongs to. + * @param url The URL to treat. + * @param params The params of the URL. E.g. 'mysite.com?id=1' -> {id: 1} + * @param courseId Course ID related to the URL. Optional but recommended. + * @return List of (or promise resolved with list of) actions. + */ + getActions( + siteIds: string[], + url: string, + params: Params, + ): CoreContentLinksAction[] | Promise { + return [{ + action: async (siteId): Promise => { + const modal = await CoreDomUtils.instance.showModalLoading(); + const forumId = parseInt(params.forum, 10); + + try { + const module = await CoreCourse.instance.getModuleBasicInfoByInstance(forumId, 'forum', siteId); + + await CoreNavigator.instance.navigateToSitePath( + `${AddonModForumModuleHandlerService.PAGE_NAME}/${module.course}/${module.id}/new/0`, + { siteId, params: { forumId: module.instance } }, + ); + } finally { + // Just in case. In fact we need to dismiss the modal before showing a toast or error message. + modal.dismiss(); + } + }, + }]; + } + + /** + * Check if the handler is enabled for a certain site (site + user) and a URL. + * If not defined, defaults to true. + * + * @param siteId The site ID. + * @param url The URL to treat. + * @param params The params of the URL. E.g. 'mysite.com?id=1' -> {id: 1} + * @param courseId Course ID related to the URL. Optional but recommended. + * @return Whether the handler is enabled for the URL and site. + */ + async isEnabled(siteId: string, url: string, params: Params): Promise { + return typeof params.forum != 'undefined'; + } + +} + +export class AddonModForumPostLinkHandler extends makeSingleton(AddonModForumPostLinkHandlerService) {}