forked from EVOgeek/Vmeda.Online
		
	Merge pull request #1275 from crazyserver/MOBILE-2352
MOBILE-2352 url: Implement url activity
This commit is contained in:
		
						commit
						e7f55cfca2
					
				
							
								
								
									
										45
									
								
								src/addon/mod/url/components/components.module.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										45
									
								
								src/addon/mod/url/components/components.module.ts
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,45 @@ | ||||
| // (C) Copyright 2015 Martin Dougiamas
 | ||||
| //
 | ||||
| // 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 { NgModule } from '@angular/core'; | ||||
| import { CommonModule } from '@angular/common'; | ||||
| import { IonicModule } from 'ionic-angular'; | ||||
| import { TranslateModule } from '@ngx-translate/core'; | ||||
| import { CoreComponentsModule } from '@components/components.module'; | ||||
| import { CoreDirectivesModule } from '@directives/directives.module'; | ||||
| import { CoreCourseComponentsModule } from '@core/course/components/components.module'; | ||||
| import { AddonModUrlIndexComponent } from './index/index'; | ||||
| 
 | ||||
| @NgModule({ | ||||
|     declarations: [ | ||||
|         AddonModUrlIndexComponent | ||||
|     ], | ||||
|     imports: [ | ||||
|         CommonModule, | ||||
|         IonicModule, | ||||
|         TranslateModule.forChild(), | ||||
|         CoreComponentsModule, | ||||
|         CoreDirectivesModule, | ||||
|         CoreCourseComponentsModule | ||||
|     ], | ||||
|     providers: [ | ||||
|     ], | ||||
|     exports: [ | ||||
|         AddonModUrlIndexComponent | ||||
|     ], | ||||
|     entryComponents: [ | ||||
|         AddonModUrlIndexComponent | ||||
|     ] | ||||
| }) | ||||
| export class AddonModUrlComponentsModule {} | ||||
							
								
								
									
										25
									
								
								src/addon/mod/url/components/index/index.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								src/addon/mod/url/components/index/index.html
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,25 @@ | ||||
| <!-- Buttons to add to the header. --> | ||||
| <core-navbar-buttons end> | ||||
|     <core-context-menu> | ||||
|         <core-context-menu-item *ngIf="externalUrl" [priority]="900" [content]="'core.openinbrowser' | translate" [href]="externalUrl" [iconAction]="'open'"></core-context-menu-item> | ||||
|         <core-context-menu-item *ngIf="description" [priority]="800" [content]="'core.moduleintro' | translate" (action)="expandDescription()" [iconAction]="'arrow-forward'"></core-context-menu-item> | ||||
|         <core-context-menu-item [priority]="700" [content]="'core.refresh' | translate" (action)="doRefresh(null, $event)" [iconAction]="refreshIcon" [closeOnClick]="false"></core-context-menu-item> | ||||
|     </core-context-menu> | ||||
| </core-navbar-buttons> | ||||
| 
 | ||||
| <!-- Content. --> | ||||
| <core-loading [hideUntil]="loaded" class="core-loading-center"> | ||||
| 
 | ||||
|     <core-course-module-description *ngIf="mode != 'iframe'" [description]="description" [component]="component" [componentId]="componentId"></core-course-module-description> | ||||
| 
 | ||||
|     <ion-item text-wrap> | ||||
|         <h2>{{ 'addon.mod_url.pointingtourl' | translate }}</h2> | ||||
|         <p>{{ url }}</p> | ||||
|     </ion-item> | ||||
|     <div padding> | ||||
|         <a ion-button block (click)="go()" icon-start> | ||||
|             <ion-icon name="link" start></ion-icon> | ||||
|             {{ 'addon.mod_url.accessurl' | translate }} | ||||
|         </a> | ||||
|     </div> | ||||
| </core-loading> | ||||
							
								
								
									
										112
									
								
								src/addon/mod/url/components/index/index.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										112
									
								
								src/addon/mod/url/components/index/index.ts
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,112 @@ | ||||
| // (C) Copyright 2015 Martin Dougiamas
 | ||||
| //
 | ||||
| // 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 { Component } from '@angular/core'; | ||||
| import { TranslateService } from '@ngx-translate/core'; | ||||
| import { CoreDomUtilsProvider } from '@providers/utils/dom'; | ||||
| import { CoreTextUtilsProvider } from '@providers/utils/text'; | ||||
| import { CoreCourseProvider } from '@core/course/providers/course'; | ||||
| import { CoreCourseModuleMainResourceComponent } from '@core/course/classes/main-resource-component'; | ||||
| import { AddonModUrlProvider } from '../../providers/url'; | ||||
| import { AddonModUrlHelperProvider } from '../../providers/helper'; | ||||
| import { CoreCourseHelperProvider } from '@core/course/providers/helper'; | ||||
| 
 | ||||
| /** | ||||
|  * Component that displays a url. | ||||
|  */ | ||||
| @Component({ | ||||
|     selector: 'addon-mod-url-index', | ||||
|     templateUrl: 'index.html', | ||||
| }) | ||||
| export class AddonModUrlIndexComponent extends CoreCourseModuleMainResourceComponent { | ||||
|     component = AddonModUrlProvider.COMPONENT; | ||||
| 
 | ||||
|     canGetUrl: boolean; | ||||
|     url: string; | ||||
| 
 | ||||
|     constructor(private urlProvider: AddonModUrlProvider, private courseProvider: CoreCourseProvider, | ||||
|             protected domUtils: CoreDomUtilsProvider, protected textUtils: CoreTextUtilsProvider, | ||||
|             protected translate: TranslateService, private urlHelper: AddonModUrlHelperProvider, | ||||
|             protected courseHelper: CoreCourseHelperProvider) { | ||||
|         super(textUtils, courseHelper, translate, domUtils); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Component being initialized. | ||||
|      */ | ||||
|     ngOnInit(): void { | ||||
|         super.ngOnInit(); | ||||
| 
 | ||||
|         this.canGetUrl = this.urlProvider.isGetUrlWSAvailable(); | ||||
| 
 | ||||
|         this.loadContent(); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Perform the invalidate content function. | ||||
|      * | ||||
|      * @return {Promise<any>} Resolved when done. | ||||
|      */ | ||||
|     protected invalidateContent(): Promise<any> { | ||||
|         return this.urlProvider.invalidateContent(this.module.id, this.courseId); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Download url contents. | ||||
|      * | ||||
|      * @param {boolean} [refresh] Whether we're refreshing data. | ||||
|      * @return {Promise<any>} Promise resolved when done. | ||||
|      */ | ||||
|     protected fetchContent(refresh?: boolean): Promise<any> { | ||||
|         let canGetUrl = this.canGetUrl; | ||||
| 
 | ||||
|         // Fetch the module data.
 | ||||
|         let promise; | ||||
|         if (canGetUrl) { | ||||
|             promise = this.urlProvider.getUrl(this.courseId, this.module.id); | ||||
|         } else { | ||||
|             promise = Promise.reject(null); | ||||
|         } | ||||
| 
 | ||||
|         return promise.catch(() => { | ||||
|             canGetUrl = false; | ||||
| 
 | ||||
|             // Fallback in case is not prefetch or not avalaible.
 | ||||
|             return this.courseProvider.getModule(this.module.id, this.courseId); | ||||
|         }).then((url) => { | ||||
|             if (!canGetUrl) { | ||||
|                 if (!url.contents.length) { | ||||
|                     // If the data was cached maybe we don't have contents. Reject.
 | ||||
|                     return Promise.reject(null); | ||||
|                 } | ||||
|             } | ||||
| 
 | ||||
|             this.description = url.intro || url.description; | ||||
|             this.dataRetrieved.emit(url); | ||||
| 
 | ||||
|             this.url = canGetUrl ? url.externalurl : | ||||
|                             ((url.contents[0] && url.contents[0].fileurl) ? url.contents[0].fileurl : undefined); | ||||
|         }); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Opens a file. | ||||
|      */ | ||||
|     go(): void { | ||||
|         this.urlProvider.logView(this.module.instance).then(() => { | ||||
|             this.courseProvider.checkModuleCompletion(this.courseId, this.module.completionstatus); | ||||
|         }); | ||||
|         this.urlHelper.open(this.url); | ||||
|     } | ||||
| } | ||||
							
								
								
									
										4
									
								
								src/addon/mod/url/lang/en.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								src/addon/mod/url/lang/en.json
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,4 @@ | ||||
| { | ||||
|     "accessurl": "Access the URL", | ||||
|     "pointingtourl": "URL that the resource points to." | ||||
| } | ||||
							
								
								
									
										16
									
								
								src/addon/mod/url/pages/index/index.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								src/addon/mod/url/pages/index/index.html
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,16 @@ | ||||
| <ion-header> | ||||
|     <ion-navbar> | ||||
|         <ion-title><core-format-text [text]="title"></core-format-text></ion-title> | ||||
| 
 | ||||
|         <ion-buttons end> | ||||
|             <!-- The buttons defined by the component will be added in here. --> | ||||
|         </ion-buttons> | ||||
|     </ion-navbar> | ||||
| </ion-header> | ||||
| <ion-content> | ||||
|     <ion-refresher [enabled]="urlComponent.loaded" (ionRefresh)="urlComponent.doRefresh($event)"> | ||||
|         <ion-refresher-content pullingText="{{ 'core.pulltorefresh' | translate }}"></ion-refresher-content> | ||||
|     </ion-refresher> | ||||
| 
 | ||||
|     <addon-mod-url-index [module]="module" [courseId]="courseId" (dataRetrieved)="updateData($event)"></addon-mod-url-index> | ||||
| </ion-content> | ||||
							
								
								
									
										33
									
								
								src/addon/mod/url/pages/index/index.module.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								src/addon/mod/url/pages/index/index.module.ts
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,33 @@ | ||||
| // (C) Copyright 2015 Martin Dougiamas
 | ||||
| //
 | ||||
| // 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 { NgModule } from '@angular/core'; | ||||
| import { IonicPageModule } from 'ionic-angular'; | ||||
| import { TranslateModule } from '@ngx-translate/core'; | ||||
| import { CoreDirectivesModule } from '@directives/directives.module'; | ||||
| import { AddonModUrlComponentsModule } from '../../components/components.module'; | ||||
| import { AddonModUrlIndexPage } from './index'; | ||||
| 
 | ||||
| @NgModule({ | ||||
|     declarations: [ | ||||
|         AddonModUrlIndexPage, | ||||
|     ], | ||||
|     imports: [ | ||||
|         CoreDirectivesModule, | ||||
|         AddonModUrlComponentsModule, | ||||
|         IonicPageModule.forChild(AddonModUrlIndexPage), | ||||
|         TranslateModule.forChild() | ||||
|     ], | ||||
| }) | ||||
| export class AddonModUrlIndexPageModule {} | ||||
							
								
								
									
										48
									
								
								src/addon/mod/url/pages/index/index.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										48
									
								
								src/addon/mod/url/pages/index/index.ts
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,48 @@ | ||||
| // (C) Copyright 2015 Martin Dougiamas
 | ||||
| //
 | ||||
| // 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 { Component, ViewChild } from '@angular/core'; | ||||
| import { IonicPage, NavParams } from 'ionic-angular'; | ||||
| import { AddonModUrlIndexComponent } from '../../components/index/index'; | ||||
| 
 | ||||
| /** | ||||
|  * Page that displays a url. | ||||
|  */ | ||||
| @IonicPage({ segment: 'addon-mod-url-index' }) | ||||
| @Component({ | ||||
|     selector: 'page-addon-mod-url-index', | ||||
|     templateUrl: 'index.html', | ||||
| }) | ||||
| export class AddonModUrlIndexPage { | ||||
|     @ViewChild(AddonModUrlIndexComponent) urlComponent: AddonModUrlIndexComponent; | ||||
| 
 | ||||
|     title: string; | ||||
|     module: any; | ||||
|     courseId: number; | ||||
| 
 | ||||
|     constructor(navParams: NavParams) { | ||||
|         this.module = navParams.get('module') || {}; | ||||
|         this.courseId = navParams.get('courseId'); | ||||
|         this.title = this.module.name; | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Update some data based on the url instance. | ||||
|      * | ||||
|      * @param {any} url Url instance. | ||||
|      */ | ||||
|     updateData(url: any): void { | ||||
|         this.title = url.name || this.title; | ||||
|     } | ||||
| } | ||||
							
								
								
									
										44
									
								
								src/addon/mod/url/providers/helper.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										44
									
								
								src/addon/mod/url/providers/helper.ts
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,44 @@ | ||||
| // (C) Copyright 2015 Martin Dougiamas
 | ||||
| //
 | ||||
| // 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 { CoreSitesProvider } from '@providers/sites'; | ||||
| import { CoreDomUtilsProvider } from '@providers/utils/dom'; | ||||
| import { CoreContentLinksHelperProvider } from '@core/contentlinks/providers/helper'; | ||||
| 
 | ||||
| /** | ||||
|  * Service that provides helper functions for urls. | ||||
|  */ | ||||
| @Injectable() | ||||
| export class AddonModUrlHelperProvider { | ||||
| 
 | ||||
|     constructor(private sitesProvider: CoreSitesProvider, private domUtils: CoreDomUtilsProvider, | ||||
|         private contentLinksHelper: CoreContentLinksHelperProvider) { } | ||||
| 
 | ||||
|     /** | ||||
|      * Opens a URL. | ||||
|      * | ||||
|      * @param {string} url The URL to go to. | ||||
|      */ | ||||
|     open(url: string): void { | ||||
|         const modal = this.domUtils.showModalLoading(); | ||||
|         this.contentLinksHelper.handleLink(url).then((treated) => { | ||||
|             if (!treated) { | ||||
|                 return this.sitesProvider.getCurrentSite().openInBrowserWithAutoLoginIfSameSite(url); | ||||
|             } | ||||
|         }).finally(() => { | ||||
|             modal.dismiss(); | ||||
|         }); | ||||
|     } | ||||
| } | ||||
							
								
								
									
										30
									
								
								src/addon/mod/url/providers/link-handler.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								src/addon/mod/url/providers/link-handler.ts
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,30 @@ | ||||
| // (C) Copyright 2015 Martin Dougiamas
 | ||||
| //
 | ||||
| // 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 '@core/contentlinks/classes/module-index-handler'; | ||||
| import { CoreCourseHelperProvider } from '@core/course/providers/helper'; | ||||
| import { AddonModUrlProvider } from './url'; | ||||
| 
 | ||||
| /** | ||||
|  * Handler to treat links to url. | ||||
|  */ | ||||
| @Injectable() | ||||
| export class AddonModUrlLinkHandler extends CoreContentLinksModuleIndexHandler { | ||||
|     name = 'AddonModUrlLinkHandler'; | ||||
| 
 | ||||
|     constructor(courseHelper: CoreCourseHelperProvider) { | ||||
|         super(courseHelper, AddonModUrlProvider.COMPONENT, 'url'); | ||||
|     } | ||||
| } | ||||
							
								
								
									
										107
									
								
								src/addon/mod/url/providers/module-handler.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										107
									
								
								src/addon/mod/url/providers/module-handler.ts
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,107 @@ | ||||
| // (C) Copyright 2015 Martin Dougiamas
 | ||||
| //
 | ||||
| // 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 { NavController, NavOptions } from 'ionic-angular'; | ||||
| import { AddonModUrlIndexComponent } from '../components/index/index'; | ||||
| import { CoreCourseModuleHandler, CoreCourseModuleHandlerData } from '@core/course/providers/module-delegate'; | ||||
| import { CoreCourseProvider } from '@core/course/providers/course'; | ||||
| import { AddonModUrlProvider } from './url'; | ||||
| import { AddonModUrlHelperProvider } from './helper'; | ||||
| 
 | ||||
| /** | ||||
|  * Handler to support url modules. | ||||
|  */ | ||||
| @Injectable() | ||||
| export class AddonModUrlModuleHandler implements CoreCourseModuleHandler { | ||||
|     name = 'url'; | ||||
| 
 | ||||
|     constructor(private courseProvider: CoreCourseProvider, private urlProvider: AddonModUrlProvider, | ||||
|         private urlHelper: AddonModUrlHelperProvider) { } | ||||
| 
 | ||||
|     /** | ||||
|      * Check if the handler is enabled on a site level. | ||||
|      * | ||||
|      * @return {boolean} Whether or not the handler is enabled on a site level. | ||||
|      */ | ||||
|     isEnabled(): boolean { | ||||
|         return true; | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Get the data required to display the module in the course contents view. | ||||
|      * | ||||
|      * @param {any} module The module object. | ||||
|      * @param {number} courseId The course ID. | ||||
|      * @param {number} sectionId The section ID. | ||||
|      * @return {CoreCourseModuleHandlerData} Data to render the module. | ||||
|      */ | ||||
|     getData(module: any, courseId: number, sectionId: number): CoreCourseModuleHandlerData { | ||||
|         const handlerData = { | ||||
|             icon: this.courseProvider.getModuleIconSrc('url'), | ||||
|             title: module.name, | ||||
|             class: 'addon-mod_url-handler', | ||||
|             showDownloadButton: false, | ||||
|             action(event: Event, navCtrl: NavController, module: any, courseId: number, options: NavOptions): void { | ||||
|                 navCtrl.push('AddonModUrlIndexPage', {module: module, courseId: courseId}, options); | ||||
|             }, | ||||
|             buttons: [ { | ||||
|                 hidden: !(module.contents && module.contents[0] && module.contents[0].fileurl), | ||||
|                 icon: 'link', | ||||
|                 label: 'core.openinbrowser', | ||||
|                 action: (event: Event, navCtrl: NavController, module: any, courseId: number): void => { | ||||
|                     this.hideLinkButton(module, courseId).then((hide) => { | ||||
|                         if (!hide) { | ||||
|                             this.urlProvider.logView(module.instance).then(() => { | ||||
|                                 this.courseProvider.checkModuleCompletion(courseId, module.completionstatus); | ||||
|                             }); | ||||
|                             this.urlHelper.open(module.contents[0].fileurl); | ||||
|                         } | ||||
|                     }); | ||||
|                 } | ||||
|             } ] | ||||
|         }; | ||||
| 
 | ||||
|         this.hideLinkButton(module, courseId).then((hideButton) => { | ||||
|             handlerData.buttons[0].hidden = hideButton; | ||||
|         }); | ||||
| 
 | ||||
|         return handlerData; | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Returns if contents are loaded to show link button. | ||||
|      * | ||||
|      * @param {any} module The module object. | ||||
|      * @param {number} courseId The course ID. | ||||
|      * @return {Promise<boolean>} Resolved when done. | ||||
|      */ | ||||
|     protected hideLinkButton(module: any, courseId: number): Promise<boolean> { | ||||
|         return this.courseProvider.loadModuleContents(module, courseId).then(() => { | ||||
|             return !(module.contents && module.contents[0] && module.contents[0].fileurl); | ||||
|         }); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Get the component to render the module. This is needed to support singleactivity course format. | ||||
|      * The component returned must implement CoreCourseModuleMainComponent. | ||||
|      * | ||||
|      * @param {any} course The course object. | ||||
|      * @param {any} module The module object. | ||||
|      * @return {any} The component to use, undefined if not found. | ||||
|      */ | ||||
|     getMainComponent(course: any, module: any): any { | ||||
|         return AddonModUrlIndexComponent; | ||||
|     } | ||||
| } | ||||
							
								
								
									
										146
									
								
								src/addon/mod/url/providers/url.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										146
									
								
								src/addon/mod/url/providers/url.ts
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,146 @@ | ||||
| // (C) Copyright 2015 Martin Dougiamas
 | ||||
| //
 | ||||
| // 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 { CoreLoggerProvider } from '@providers/logger'; | ||||
| import { CoreSitesProvider } from '@providers/sites'; | ||||
| import { CoreUtilsProvider } from '@providers/utils/utils'; | ||||
| import { CoreCourseProvider } from '@core/course/providers/course'; | ||||
| 
 | ||||
| /** | ||||
|  * Service that provides some features for urls. | ||||
|  */ | ||||
| @Injectable() | ||||
| export class AddonModUrlProvider { | ||||
|     static COMPONENT = 'mmaModUrl'; | ||||
| 
 | ||||
|     protected ROOT_CACHE_KEY = 'mmaModUrl:'; | ||||
|     protected logger; | ||||
| 
 | ||||
|     constructor(logger: CoreLoggerProvider, private sitesProvider: CoreSitesProvider, private courseProvider: CoreCourseProvider, | ||||
|             private utils: CoreUtilsProvider) { | ||||
|         this.logger = logger.getInstance('AddonModUrlProvider'); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Get cache key for url data WS calls. | ||||
|      * | ||||
|      * @param {number} courseId Course ID. | ||||
|      * @return {string}         Cache key. | ||||
|      */ | ||||
|     protected getUrlCacheKey(courseId: number): string { | ||||
|         return this.ROOT_CACHE_KEY + 'url:' + courseId; | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Get a url data. | ||||
|      * | ||||
|      * @param {number} courseId Course ID. | ||||
|      * @param {string} key     Name of the property to check. | ||||
|      * @param {any}  value   Value to search. | ||||
|      * @param {string} [siteId] Site ID. If not defined, current site. | ||||
|      * @return {Promise<any>}  Promise resolved when the url is retrieved. | ||||
|      */ | ||||
|     protected getUrlDataByKey(courseId: number, key: string, value: any, siteId?: string): Promise<any> { | ||||
|         return this.sitesProvider.getSite(siteId).then((site) => { | ||||
|             const params = { | ||||
|                     courseids: [courseId] | ||||
|                 }, | ||||
|                 preSets = { | ||||
|                     cacheKey: this.getUrlCacheKey(courseId) | ||||
|                 }; | ||||
| 
 | ||||
|             return site.read('mod_url_get_urls_by_courses', params, preSets).then((response) => { | ||||
|                 if (response && response.urls) { | ||||
|                     const currentUrl = response.urls.find((url) => { | ||||
|                         return url[key] == value; | ||||
|                     }); | ||||
|                     if (currentUrl) { | ||||
|                         return currentUrl; | ||||
|                     } | ||||
|                 } | ||||
| 
 | ||||
|                 return Promise.reject(null); | ||||
|             }); | ||||
|         }); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Get a url by course module ID. | ||||
|      * | ||||
|      * @param {number} courseId Course ID. | ||||
|      * @param {number} cmId     Course module ID. | ||||
|      * @param {string} [siteId] Site ID. If not defined, current site. | ||||
|      * @return {Promise<any>}   Promise resolved when the url is retrieved. | ||||
|      */ | ||||
|     getUrl(courseId: number, cmId: number, siteId?: string): Promise<any> { | ||||
|         return this.getUrlDataByKey(courseId, 'coursemodule', cmId, siteId); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Invalidate the prefetched content. | ||||
|      * | ||||
|      * @param  {number} moduleId The module ID. | ||||
|      * @param  {number} courseId Course ID of the module. | ||||
|      * @param  {string} [siteId] Site ID. If not defined, current site. | ||||
|      * @return {Promise<any>}    Promise resolved when the data is invalidated. | ||||
|      */ | ||||
|     invalidateContent(moduleId: number, courseId: number, siteId?: string): Promise<any> { | ||||
|         siteId = siteId || this.sitesProvider.getCurrentSiteId(); | ||||
| 
 | ||||
|         const promises = []; | ||||
| 
 | ||||
|         promises.push(this.invalidateUrlData(courseId, siteId)); | ||||
|         promises.push(this.courseProvider.invalidateModule(moduleId, siteId)); | ||||
| 
 | ||||
|         return this.utils.allPromises(promises); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Invalidates url data. | ||||
|      * | ||||
|      * @param {number} courseid Course ID. | ||||
|      * @param {string} [siteId] Site ID. If not defined, current site. | ||||
|      * @return {Promise<any>}   Promise resolved when the data is invalidated. | ||||
|      */ | ||||
|     invalidateUrlData(courseId: number, siteId?: string): Promise<any> { | ||||
|         return this.sitesProvider.getSite(siteId).then((site) => { | ||||
|             return site.invalidateWsCacheForKey(this.getUrlCacheKey(courseId)); | ||||
|         }); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Returns whether or not getUrl WS available or not. | ||||
|      * | ||||
|      * @return {boolean} If WS is abalaible. | ||||
|      * @since 3.3 | ||||
|      */ | ||||
|     isGetUrlWSAvailable(): boolean { | ||||
|         return this.sitesProvider.wsAvailableInCurrentSite('mod_url_get_urls_by_courses'); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|      * Report the url as being viewed. | ||||
|      * | ||||
|      * @param {number} id Module ID. | ||||
|      * @return {Promise<any>}  Promise resolved when the WS call is successful. | ||||
|      */ | ||||
|     logView(id: number): Promise<any> { | ||||
|         const params = { | ||||
|             urlid: id | ||||
|         }; | ||||
| 
 | ||||
|         return this.sitesProvider.getCurrentSite().write('mod_url_view_url', params); | ||||
|     } | ||||
| } | ||||
							
								
								
									
										43
									
								
								src/addon/mod/url/url.module.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										43
									
								
								src/addon/mod/url/url.module.ts
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,43 @@ | ||||
| // (C) Copyright 2015 Martin Dougiamas
 | ||||
| //
 | ||||
| // 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 { NgModule } from '@angular/core'; | ||||
| import { AddonModUrlComponentsModule } from './components/components.module'; | ||||
| import { AddonModUrlModuleHandler } from './providers/module-handler'; | ||||
| import { AddonModUrlProvider } from './providers/url'; | ||||
| import { AddonModUrlLinkHandler } from './providers/link-handler'; | ||||
| import { AddonModUrlHelperProvider } from './providers/helper'; | ||||
| import { CoreContentLinksDelegate } from '@core/contentlinks/providers/delegate'; | ||||
| import { CoreCourseModuleDelegate } from '@core/course/providers/module-delegate'; | ||||
| 
 | ||||
| @NgModule({ | ||||
|     declarations: [ | ||||
|     ], | ||||
|     imports: [ | ||||
|         AddonModUrlComponentsModule | ||||
|     ], | ||||
|     providers: [ | ||||
|         AddonModUrlProvider, | ||||
|         AddonModUrlModuleHandler, | ||||
|         AddonModUrlHelperProvider, | ||||
|         AddonModUrlLinkHandler | ||||
|     ] | ||||
| }) | ||||
| export class AddonModUrlModule { | ||||
|     constructor(moduleDelegate: CoreCourseModuleDelegate, moduleHandler: AddonModUrlModuleHandler, | ||||
|             contentLinksDelegate: CoreContentLinksDelegate, linkHandler: AddonModUrlLinkHandler) { | ||||
|         moduleDelegate.registerHandler(moduleHandler); | ||||
|         contentLinksDelegate.registerHandler(linkHandler); | ||||
|     } | ||||
| } | ||||
| @ -79,6 +79,7 @@ import { AddonModLabelModule } from '@addon/mod/label/label.module'; | ||||
| import { AddonModResourceModule } from '@addon/mod/resource/resource.module'; | ||||
| import { AddonModFolderModule } from '@addon/mod/folder/folder.module'; | ||||
| import { AddonModPageModule } from '@addon/mod/page/page.module'; | ||||
| import { AddonModUrlModule } from '@addon/mod/url/url.module'; | ||||
| import { AddonMessagesModule } from '@addon/messages/messages.module'; | ||||
| import { AddonPushNotificationsModule } from '@addon/pushnotifications/pushnotifications.module'; | ||||
| import { AddonRemoteThemesModule } from '@addon/remotethemes/remotethemes.module'; | ||||
| @ -162,6 +163,7 @@ export const CORE_PROVIDERS: any[] = [ | ||||
|         AddonModResourceModule, | ||||
|         AddonModFolderModule, | ||||
|         AddonModPageModule, | ||||
|         AddonModUrlModule, | ||||
|         AddonMessagesModule, | ||||
|         AddonPushNotificationsModule, | ||||
|         AddonRemoteThemesModule | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user