forked from EVOgeek/Vmeda.Online
		
	MOBILE-1874 sitehome: Move site main menu to a block
This commit is contained in:
		
							parent
							
								
									2e8424d3a2
								
							
						
					
					
						commit
						0b357db3b5
					
				| @ -20,6 +20,7 @@ | |||||||
|   "addon.block_myoverview.nocoursespast": "block_myoverview", |   "addon.block_myoverview.nocoursespast": "block_myoverview", | ||||||
|   "addon.block_myoverview.past": "block_myoverview", |   "addon.block_myoverview.past": "block_myoverview", | ||||||
|   "addon.block_myoverview.title": "block_myoverview", |   "addon.block_myoverview.title": "block_myoverview", | ||||||
|  |   "addon.block_sitemainmenu.pluginname": "block_site_main_menu", | ||||||
|   "addon.block_timeline.duedate": "block_timeline", |   "addon.block_timeline.duedate": "block_timeline", | ||||||
|   "addon.block_timeline.next30days": "block_timeline", |   "addon.block_timeline.next30days": "block_timeline", | ||||||
|   "addon.block_timeline.next3months": "block_timeline", |   "addon.block_timeline.next3months": "block_timeline", | ||||||
|  | |||||||
							
								
								
									
										45
									
								
								src/addon/block/sitemainmenu/components/components.module.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										45
									
								
								src/addon/block/sitemainmenu/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 { AddonBlockSiteMainMenuComponent } from './sitemainmenu/sitemainmenu'; | ||||||
|  | import { CoreComponentsModule } from '@components/components.module'; | ||||||
|  | import { CoreDirectivesModule } from '@directives/directives.module'; | ||||||
|  | import { CoreCourseComponentsModule } from '@core/course/components/components.module'; | ||||||
|  | 
 | ||||||
|  | @NgModule({ | ||||||
|  |     declarations: [ | ||||||
|  |         AddonBlockSiteMainMenuComponent | ||||||
|  |     ], | ||||||
|  |     imports: [ | ||||||
|  |         CommonModule, | ||||||
|  |         IonicModule, | ||||||
|  |         TranslateModule.forChild(), | ||||||
|  |         CoreComponentsModule, | ||||||
|  |         CoreDirectivesModule, | ||||||
|  |         CoreCourseComponentsModule | ||||||
|  |     ], | ||||||
|  |     providers: [ | ||||||
|  |     ], | ||||||
|  |     exports: [ | ||||||
|  |         AddonBlockSiteMainMenuComponent | ||||||
|  |     ], | ||||||
|  |     entryComponents: [ | ||||||
|  |         AddonBlockSiteMainMenuComponent | ||||||
|  |     ] | ||||||
|  | }) | ||||||
|  | export class AddonBlockSiteMainMenuComponentsModule {} | ||||||
| @ -0,0 +1,7 @@ | |||||||
|  | <core-loading [hideUntil]="loaded" class="core-loading-center"> | ||||||
|  |     <ion-item text-wrap *ngIf="block.summary"> | ||||||
|  |         <core-format-text [text]="block.summary"></core-format-text> | ||||||
|  |     </ion-item> | ||||||
|  | 
 | ||||||
|  |     <core-course-module *ngFor="let module of block.modules" [module]="module" [courseId]="siteHomeId" [downloadEnabled]="true" [section]="block"></core-course-module> | ||||||
|  | </core-loading> | ||||||
| @ -0,0 +1,114 @@ | |||||||
|  | // (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, OnInit, Injector } from '@angular/core'; | ||||||
|  | import { CoreSitesProvider } from '@providers/sites'; | ||||||
|  | import { CoreCourseProvider } from '@core/course/providers/course'; | ||||||
|  | import { CoreCourseHelperProvider } from '@core/course/providers/helper'; | ||||||
|  | import { CoreSiteHomeProvider } from '@core/sitehome/providers/sitehome'; | ||||||
|  | import { CoreCourseModulePrefetchDelegate } from '@core/course/providers/module-prefetch-delegate'; | ||||||
|  | import { CoreBlockBaseComponent } from '@core/block/classes/base-block-component'; | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * Component to render a site main menu block. | ||||||
|  |  */ | ||||||
|  | @Component({ | ||||||
|  |     selector: 'addon-block-sitemainmenu', | ||||||
|  |     templateUrl: 'addon-block-sitemainmenu.html' | ||||||
|  | }) | ||||||
|  | export class AddonBlockSiteMainMenuComponent extends CoreBlockBaseComponent implements OnInit { | ||||||
|  |     block: any; | ||||||
|  |     siteHomeId: number; | ||||||
|  | 
 | ||||||
|  |     protected fetchContentDefaultError = 'Error getting main menu data.'; | ||||||
|  | 
 | ||||||
|  |     constructor(injector: Injector, protected sitesProvider: CoreSitesProvider, protected courseProvider: CoreCourseProvider, | ||||||
|  |             protected courseHelper: CoreCourseHelperProvider, protected siteHomeProvider: CoreSiteHomeProvider, | ||||||
|  |             protected prefetchDelegate: CoreCourseModulePrefetchDelegate) { | ||||||
|  | 
 | ||||||
|  |         super(injector, 'AddonBlockSiteMainMenuComponent'); | ||||||
|  | 
 | ||||||
|  |         this.siteHomeId = sitesProvider.getCurrentSite().getSiteHomeId(); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * Component being initialized. | ||||||
|  |      */ | ||||||
|  |     ngOnInit(): void { | ||||||
|  |         super.ngOnInit(); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * Perform the invalidate content function. | ||||||
|  |      * | ||||||
|  |      * @return {Promise<any>} Resolved when done. | ||||||
|  |      */ | ||||||
|  |     protected invalidateContent(): Promise<any> { | ||||||
|  |         const promises = []; | ||||||
|  | 
 | ||||||
|  |         promises.push(this.courseProvider.invalidateSections(this.siteHomeId)); | ||||||
|  |         promises.push(this.siteHomeProvider.invalidateNewsForum(this.siteHomeId)); | ||||||
|  | 
 | ||||||
|  |         if (this.block && this.block.modules) { | ||||||
|  |             // Invalidate modules prefetch data.
 | ||||||
|  |             promises.push(this.prefetchDelegate.invalidateModules(this.block.modules, this.siteHomeId)); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         return Promise.all(promises); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * Fetch the data to render the block. | ||||||
|  |      * | ||||||
|  |      * @return {Promise<any>} Promise resolved when done. | ||||||
|  |      */ | ||||||
|  |     protected fetchContent(): Promise<any> { | ||||||
|  |         return this.courseProvider.getSections(this.siteHomeId, false, true).then((sections) => { | ||||||
|  |             this.block = sections[0]; | ||||||
|  | 
 | ||||||
|  |             if (this.block) { | ||||||
|  |                 this.block.hasContent = this.courseHelper.sectionHasContent(this.block); | ||||||
|  |                 this.courseHelper.addHandlerDataForModules([this.block], this.siteHomeId); | ||||||
|  | 
 | ||||||
|  |                 // Check if Site Home displays announcements. If so, remove it from the main menu block.
 | ||||||
|  |                 const currentSite = this.sitesProvider.getCurrentSite(), | ||||||
|  |                     config = currentSite ? currentSite.getStoredConfig() || {} : {}; | ||||||
|  |                 let hasNewsItem = false; | ||||||
|  | 
 | ||||||
|  |                 if (config.frontpageloggedin) { | ||||||
|  |                     const items = config.frontpageloggedin.split(','); | ||||||
|  | 
 | ||||||
|  |                     hasNewsItem = items.find((item) => { return item == '0'; }); | ||||||
|  |                 } | ||||||
|  | 
 | ||||||
|  |                 if (hasNewsItem && this.block.modules) { | ||||||
|  |                     // Remove forum activity (news one only) from the main menu block to prevent duplicates.
 | ||||||
|  |                     return this.siteHomeProvider.getNewsForum(this.siteHomeId).then((forum) => { | ||||||
|  |                         // Search the module that belongs to site news.
 | ||||||
|  |                         for (let i = 0; i < this.block.modules.length; i++) { | ||||||
|  |                             const module = this.block.modules[i]; | ||||||
|  | 
 | ||||||
|  |                             if (module.modname == 'forum' && module.instance == forum.id) { | ||||||
|  |                                 this.block.modules.splice(i, 1); | ||||||
|  |                                 break; | ||||||
|  |                             } | ||||||
|  |                         } | ||||||
|  |                     }).catch(() => { | ||||||
|  |                         // Ignore errors.
 | ||||||
|  |                     }); | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         }); | ||||||
|  |     } | ||||||
|  | } | ||||||
							
								
								
									
										3
									
								
								src/addon/block/sitemainmenu/lang/en.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								src/addon/block/sitemainmenu/lang/en.json
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,3 @@ | |||||||
|  | { | ||||||
|  |     "pluginname": "Main menu" | ||||||
|  | } | ||||||
							
								
								
									
										58
									
								
								src/addon/block/sitemainmenu/providers/block-handler.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										58
									
								
								src/addon/block/sitemainmenu/providers/block-handler.ts
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,58 @@ | |||||||
|  | // (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, Injector } from '@angular/core'; | ||||||
|  | import { CoreBlockHandler, CoreBlockHandlerData } from '@core/block/providers/delegate'; | ||||||
|  | import { AddonBlockSiteMainMenuComponent } from '../components/sitemainmenu/sitemainmenu'; | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * Course nav handler. | ||||||
|  |  */ | ||||||
|  | @Injectable() | ||||||
|  | export class AddonBlockSiteMainMenuHandler implements CoreBlockHandler { | ||||||
|  |     name = 'AddonBlockSiteMainMenuHandler'; | ||||||
|  |     blockName = 'site_main_menu'; | ||||||
|  | 
 | ||||||
|  |     constructor() { | ||||||
|  |         // Nothing to do.
 | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * 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 | Promise<boolean> { | ||||||
|  |         return true; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * Returns the data needed to render the block. | ||||||
|  |      * | ||||||
|  |      * @param {Injector} injector Injector. | ||||||
|  |      * @param {any} block The block to render. | ||||||
|  |      * @param {string} contextLevel The context where the block will be used. | ||||||
|  |      * @param {number} instanceId The instance ID associated with the context level. | ||||||
|  |      * @return {CoreBlockHandlerData|Promise<CoreBlockHandlerData>} Data or promise resolved with the data. | ||||||
|  |      */ | ||||||
|  |     getDisplayData?(injector: Injector, block: any, contextLevel: string, instanceId: number) | ||||||
|  |             : CoreBlockHandlerData | Promise<CoreBlockHandlerData> { | ||||||
|  | 
 | ||||||
|  |         return { | ||||||
|  |             title: 'addon.block_sitemainmenu.pluginname', | ||||||
|  |             class: 'addon-block-sitemainmenu', | ||||||
|  |             component: AddonBlockSiteMainMenuComponent | ||||||
|  |         }; | ||||||
|  |     } | ||||||
|  | } | ||||||
							
								
								
									
										44
									
								
								src/addon/block/sitemainmenu/sitemainmenu.module.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										44
									
								
								src/addon/block/sitemainmenu/sitemainmenu.module.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 { NgModule } from '@angular/core'; | ||||||
|  | import { IonicModule } from 'ionic-angular'; | ||||||
|  | import { TranslateModule } from '@ngx-translate/core'; | ||||||
|  | import { CoreComponentsModule } from '@components/components.module'; | ||||||
|  | import { CoreDirectivesModule } from '@directives/directives.module'; | ||||||
|  | import { AddonBlockSiteMainMenuComponentsModule } from './components/components.module'; | ||||||
|  | import { CoreBlockDelegate } from '@core/block/providers/delegate'; | ||||||
|  | import { AddonBlockSiteMainMenuHandler } from './providers/block-handler'; | ||||||
|  | 
 | ||||||
|  | @NgModule({ | ||||||
|  |     declarations: [ | ||||||
|  |     ], | ||||||
|  |     imports: [ | ||||||
|  |         IonicModule, | ||||||
|  |         CoreComponentsModule, | ||||||
|  |         CoreDirectivesModule, | ||||||
|  |         AddonBlockSiteMainMenuComponentsModule, | ||||||
|  |         TranslateModule.forChild() | ||||||
|  |     ], | ||||||
|  |     exports: [ | ||||||
|  |     ], | ||||||
|  |     providers: [ | ||||||
|  |         AddonBlockSiteMainMenuHandler | ||||||
|  |     ] | ||||||
|  | }) | ||||||
|  | export class AddonBlockSiteMainMenuModule { | ||||||
|  |     constructor(blockDelegate: CoreBlockDelegate, blockHandler: AddonBlockSiteMainMenuHandler) { | ||||||
|  |         blockDelegate.registerHandler(blockHandler); | ||||||
|  |     } | ||||||
|  | } | ||||||
| @ -85,6 +85,7 @@ import { AddonCourseCompletionModule } from '@addon/coursecompletion/coursecompl | |||||||
| import { AddonUserProfileFieldModule } from '@addon/userprofilefield/userprofilefield.module'; | import { AddonUserProfileFieldModule } from '@addon/userprofilefield/userprofilefield.module'; | ||||||
| import { AddonFilesModule } from '@addon/files/files.module'; | import { AddonFilesModule } from '@addon/files/files.module'; | ||||||
| import { AddonBlockMyOverviewModule } from '@addon/block/myoverview/myoverview.module'; | import { AddonBlockMyOverviewModule } from '@addon/block/myoverview/myoverview.module'; | ||||||
|  | import { AddonBlockSiteMainMenuModule } from '@addon/block/sitemainmenu/sitemainmenu.module'; | ||||||
| import { AddonBlockTimelineModule } from '@addon/block/timeline/timeline.module'; | import { AddonBlockTimelineModule } from '@addon/block/timeline/timeline.module'; | ||||||
| import { AddonModAssignModule } from '@addon/mod/assign/assign.module'; | import { AddonModAssignModule } from '@addon/mod/assign/assign.module'; | ||||||
| import { AddonModBookModule } from '@addon/mod/book/book.module'; | import { AddonModBookModule } from '@addon/mod/book/book.module'; | ||||||
| @ -197,6 +198,7 @@ export const CORE_PROVIDERS: any[] = [ | |||||||
|         AddonUserProfileFieldModule, |         AddonUserProfileFieldModule, | ||||||
|         AddonFilesModule, |         AddonFilesModule, | ||||||
|         AddonBlockMyOverviewModule, |         AddonBlockMyOverviewModule, | ||||||
|  |         AddonBlockSiteMainMenuModule, | ||||||
|         AddonBlockTimelineModule, |         AddonBlockTimelineModule, | ||||||
|         AddonModAssignModule, |         AddonModAssignModule, | ||||||
|         AddonModBookModule, |         AddonModBookModule, | ||||||
|  | |||||||
| @ -49,14 +49,10 @@ export class CoreBlockBaseComponent implements OnInit { | |||||||
|      */ |      */ | ||||||
|     doRefresh(refresher?: any, done?: () => void, showErrors: boolean = false): Promise<any> { |     doRefresh(refresher?: any, done?: () => void, showErrors: boolean = false): Promise<any> { | ||||||
|         if (this.loaded) { |         if (this.loaded) { | ||||||
|             return this.invalidateContent().catch(() => { |  | ||||||
|                 // Ignore errors.
 |  | ||||||
|             }).then(() => { |  | ||||||
|             return this.refreshContent(showErrors).finally(() => { |             return this.refreshContent(showErrors).finally(() => { | ||||||
|                 refresher && refresher.complete(); |                 refresher && refresher.complete(); | ||||||
|                 done && done(); |                 done && done(); | ||||||
|             }); |             }); | ||||||
|             }); |  | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         return Promise.resolve(); |         return Promise.resolve(); | ||||||
|  | |||||||
| @ -12,8 +12,9 @@ | |||||||
| // 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 { Component, Input, OnInit, Injector } from '@angular/core'; | import { Component, Input, OnInit, Injector, ViewChild } from '@angular/core'; | ||||||
| import { CoreBlockDelegate } from '../../providers/delegate'; | import { CoreBlockDelegate } from '../../providers/delegate'; | ||||||
|  | import { CoreDynamicComponent } from '@components/dynamic-component/dynamic-component'; | ||||||
| 
 | 
 | ||||||
| /** | /** | ||||||
|  * Component to render a block. |  * Component to render a block. | ||||||
| @ -23,6 +24,8 @@ import { CoreBlockDelegate } from '../../providers/delegate'; | |||||||
|     templateUrl: 'core-block.html' |     templateUrl: 'core-block.html' | ||||||
| }) | }) | ||||||
| export class CoreBlockComponent implements OnInit { | export class CoreBlockComponent implements OnInit { | ||||||
|  |     @ViewChild(CoreDynamicComponent) dynamicComponent: CoreDynamicComponent; | ||||||
|  | 
 | ||||||
|     @Input() block: any; // The block to render.
 |     @Input() block: any; // The block to render.
 | ||||||
|     @Input() contextLevel: string; // The context where the block will be used.
 |     @Input() contextLevel: string; // The context where the block will be used.
 | ||||||
|     @Input() instanceId: number; // The instance ID associated with the context level.
 |     @Input() instanceId: number; // The instance ID associated with the context level.
 | ||||||
| @ -69,4 +72,33 @@ export class CoreBlockComponent implements OnInit { | |||||||
|             this.loaded = true; |             this.loaded = true; | ||||||
|         }); |         }); | ||||||
|     } |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * Refresh the data. | ||||||
|  |      * | ||||||
|  |      * @param {any} [refresher] Refresher. Please pass this only if the refresher should finish when this function finishes. | ||||||
|  |      * @param {Function} [done] Function to call when done. | ||||||
|  |      * @param {boolean} [showErrors=false] If show errors to the user of hide them. | ||||||
|  |      * @return {Promise<any>} Promise resolved when done. | ||||||
|  |      */ | ||||||
|  |     doRefresh(refresher?: any, done?: () => void, showErrors: boolean = false): Promise<any> { | ||||||
|  |         if (this.dynamicComponent) { | ||||||
|  |             return Promise.resolve(this.dynamicComponent.callComponentFunction('doRefresh', [refresher, done, showErrors])); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         return Promise.resolve(); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * Invalidate some data. | ||||||
|  |      * | ||||||
|  |      * @return {Promise<any>} Promise resolved when done. | ||||||
|  |      */ | ||||||
|  |     invalidate(): Promise<any> { | ||||||
|  |         if (this.dynamicComponent) { | ||||||
|  |             return Promise.resolve(this.dynamicComponent.callComponentFunction('invalidateContent')); | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |         return Promise.resolve(); | ||||||
|  |     } | ||||||
| } | } | ||||||
|  | |||||||
| @ -19,6 +19,7 @@ import { TranslateModule } from '@ngx-translate/core'; | |||||||
| import { CoreComponentsModule } from '@components/components.module'; | import { CoreComponentsModule } from '@components/components.module'; | ||||||
| import { CoreDirectivesModule } from '@directives/directives.module'; | import { CoreDirectivesModule } from '@directives/directives.module'; | ||||||
| import { CoreCourseComponentsModule } from '@core/course/components/components.module'; | import { CoreCourseComponentsModule } from '@core/course/components/components.module'; | ||||||
|  | import { CoreBlockComponentsModule } from '@core/block/components/components.module'; | ||||||
| import { CoreSiteHomeIndexComponent } from './index/index'; | import { CoreSiteHomeIndexComponent } from './index/index'; | ||||||
| import { CoreSiteHomeAllCourseListComponent } from './all-course-list/all-course-list'; | import { CoreSiteHomeAllCourseListComponent } from './all-course-list/all-course-list'; | ||||||
| import { CoreSiteHomeCategoriesComponent } from './categories/categories'; | import { CoreSiteHomeCategoriesComponent } from './categories/categories'; | ||||||
| @ -41,7 +42,8 @@ import { CoreSiteHomeNewsComponent } from './news/news'; | |||||||
|         TranslateModule.forChild(), |         TranslateModule.forChild(), | ||||||
|         CoreComponentsModule, |         CoreComponentsModule, | ||||||
|         CoreDirectivesModule, |         CoreDirectivesModule, | ||||||
|         CoreCourseComponentsModule |         CoreCourseComponentsModule, | ||||||
|  |         CoreBlockComponentsModule | ||||||
|     ], |     ], | ||||||
|     exports: [ |     exports: [ | ||||||
|         CoreSiteHomeIndexComponent, |         CoreSiteHomeIndexComponent, | ||||||
|  | |||||||
| @ -22,16 +22,11 @@ | |||||||
|             </ng-container> |             </ng-container> | ||||||
|         </ng-container> |         </ng-container> | ||||||
| 
 | 
 | ||||||
|         <!-- Main menu block. --> |         <!-- Site home blocks. --> | ||||||
|         <ng-container *ngIf="mainMenuBlock && mainMenuBlock.hasContent"> |         <ng-container *ngFor="let block of blocks"> | ||||||
|             <ion-item-divider color="light" *ngIf="(section && section.hasContent) || items.length > 0"></ion-item-divider> |             <core-block [block]="block" contextLevel="course" [instanceId]="siteHomeId"></core-block> | ||||||
|             <ion-item text-wrap *ngIf="mainMenuBlock.summary"> |  | ||||||
|                 <core-format-text [text]="mainMenuBlock.summary"></core-format-text> |  | ||||||
|             </ion-item> |  | ||||||
| 
 |  | ||||||
|             <core-course-module *ngFor="let module of mainMenuBlock.modules" [module]="module" [courseId]="siteHomeId" [downloadEnabled]="true" [section]="mainMenuBlock"></core-course-module> |  | ||||||
|         </ng-container> |         </ng-container> | ||||||
|     </ion-list> |     </ion-list> | ||||||
| 
 | 
 | ||||||
|     <core-empty-box *ngIf="!hasContent" icon="qr-scanner" [message]="'core.course.nocontentavailable' | translate"></core-empty-box> |     <core-empty-box *ngIf="!hasContent && !hasSupportedBlock" icon="qr-scanner" [message]="'core.course.nocontentavailable' | translate"></core-empty-box> | ||||||
| </core-loading> | </core-loading> | ||||||
|  | |||||||
| @ -12,13 +12,14 @@ | |||||||
| // 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 { Component, OnInit } from '@angular/core'; | import { Component, OnInit, ViewChildren, QueryList } from '@angular/core'; | ||||||
| import { CoreSitesProvider } from '@providers/sites'; | import { CoreSitesProvider } from '@providers/sites'; | ||||||
| import { CoreDomUtilsProvider } from '@providers/utils/dom'; | import { CoreDomUtilsProvider } from '@providers/utils/dom'; | ||||||
| import { CoreCourseProvider } from '@core/course/providers/course'; | import { CoreCourseProvider } from '@core/course/providers/course'; | ||||||
| import { CoreCourseHelperProvider } from '@core/course/providers/helper'; | import { CoreCourseHelperProvider } from '@core/course/providers/helper'; | ||||||
| import { CoreCourseModulePrefetchDelegate } from '@core/course/providers/module-prefetch-delegate'; | import { CoreCourseModulePrefetchDelegate } from '@core/course/providers/module-prefetch-delegate'; | ||||||
| import { CoreSiteHomeProvider } from '../../providers/sitehome'; | import { CoreBlockDelegate } from '@core/block/providers/delegate'; | ||||||
|  | import { CoreBlockComponent } from '@core/block/components/block/block'; | ||||||
| 
 | 
 | ||||||
| /** | /** | ||||||
|  * Component that displays site home index. |  * Component that displays site home index. | ||||||
| @ -28,18 +29,19 @@ import { CoreSiteHomeProvider } from '../../providers/sitehome'; | |||||||
|     templateUrl: 'core-sitehome-index.html', |     templateUrl: 'core-sitehome-index.html', | ||||||
| }) | }) | ||||||
| export class CoreSiteHomeIndexComponent implements OnInit { | export class CoreSiteHomeIndexComponent implements OnInit { | ||||||
|  |     @ViewChildren(CoreBlockComponent) blocksComponents: QueryList<CoreBlockComponent>; | ||||||
|  | 
 | ||||||
|     dataLoaded = false; |     dataLoaded = false; | ||||||
|     section: any; |     section: any; | ||||||
|     mainMenuBlock: any; |  | ||||||
|     hasContent: boolean; |     hasContent: boolean; | ||||||
|  |     hasSupportedBlock: boolean; | ||||||
|     items: any[] = []; |     items: any[] = []; | ||||||
|     siteHomeId: number; |     siteHomeId: number; | ||||||
| 
 |     blocks: any[]; | ||||||
|     protected sectionsLoaded: any[]; |  | ||||||
| 
 | 
 | ||||||
|     constructor(private domUtils: CoreDomUtilsProvider, private sitesProvider: CoreSitesProvider, |     constructor(private domUtils: CoreDomUtilsProvider, private sitesProvider: CoreSitesProvider, | ||||||
|             private courseProvider: CoreCourseProvider, private courseHelper: CoreCourseHelperProvider, |             private courseProvider: CoreCourseProvider, private courseHelper: CoreCourseHelperProvider, | ||||||
|             private prefetchDelegate: CoreCourseModulePrefetchDelegate, private siteHomeProvider: CoreSiteHomeProvider) { |             private prefetchDelegate: CoreCourseModulePrefetchDelegate, private blockDelegate: CoreBlockDelegate) { | ||||||
|         this.siteHomeId = sitesProvider.getCurrentSite().getSiteHomeId(); |         this.siteHomeId = sitesProvider.getCurrentSite().getSiteHomeId(); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
| @ -69,16 +71,22 @@ export class CoreSiteHomeIndexComponent implements OnInit { | |||||||
|             }); |             }); | ||||||
|         })); |         })); | ||||||
| 
 | 
 | ||||||
|         if (this.sectionsLoaded) { |         if (this.section && this.section.modules) { | ||||||
|             // Invalidate modules prefetch data.
 |             // Invalidate modules prefetch data.
 | ||||||
|             const modules = this.courseProvider.getSectionsModules(this.sectionsLoaded); |             promises.push(this.prefetchDelegate.invalidateModules(this.section.modules, this.siteHomeId)); | ||||||
|             promises.push(this.prefetchDelegate.invalidateModules(modules, this.siteHomeId)); |  | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         if (this.courseProvider.canGetCourseBlocks()) { |         if (this.courseProvider.canGetCourseBlocks()) { | ||||||
|             promises.push(this.courseProvider.invalidateCourseBlocks(this.siteHomeId)); |             promises.push(this.courseProvider.invalidateCourseBlocks(this.siteHomeId)); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|  |         // Invalidate the blocks.
 | ||||||
|  |         this.blocksComponents.forEach((blockComponent) => { | ||||||
|  |             promises.push(blockComponent.invalidate().catch(() => { | ||||||
|  |                 // Ignore errors.
 | ||||||
|  |             })); | ||||||
|  |         }); | ||||||
|  | 
 | ||||||
|         Promise.all(promises).finally(() => { |         Promise.all(promises).finally(() => { | ||||||
|             this.loadContent().finally(() => { |             this.loadContent().finally(() => { | ||||||
|                 refresher.complete(); |                 refresher.complete(); | ||||||
| @ -92,7 +100,6 @@ export class CoreSiteHomeIndexComponent implements OnInit { | |||||||
|      * @return {Promise<any>} Promise resolved when done. |      * @return {Promise<any>} Promise resolved when done. | ||||||
|      */ |      */ | ||||||
|     protected loadContent(): Promise<any> { |     protected loadContent(): Promise<any> { | ||||||
|         let hasNewsItem = false; |  | ||||||
|         this.hasContent = false; |         this.hasContent = false; | ||||||
| 
 | 
 | ||||||
|         const config = this.sitesProvider.getCurrentSite().getStoredConfig() || { numsections: 1 }; |         const config = this.sitesProvider.getCurrentSite().getStoredConfig() || { numsections: 1 }; | ||||||
| @ -120,80 +127,49 @@ export class CoreSiteHomeIndexComponent implements OnInit { | |||||||
|                     return; |                     return; | ||||||
|                 } |                 } | ||||||
| 
 | 
 | ||||||
|                 if (item == 'news') { |  | ||||||
|                     hasNewsItem = true; |  | ||||||
|                 } |  | ||||||
| 
 |  | ||||||
|                 this.hasContent = true; |                 this.hasContent = true; | ||||||
|                 this.items.push(item); |                 this.items.push(item); | ||||||
|             }); |             }); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         return this.courseProvider.getSections(this.siteHomeId, false, true).then((sections) => { |         return this.courseProvider.getSections(this.siteHomeId, false, true).then((sections) => { | ||||||
|             const promises = []; |  | ||||||
| 
 |  | ||||||
|             this.sectionsLoaded = Array.from(sections); |  | ||||||
| 
 | 
 | ||||||
|             // Check "Include a topic section" setting from numsections.
 |             // Check "Include a topic section" setting from numsections.
 | ||||||
|             this.section = config.numsections && sections.length > 0 ? sections.pop() : false; |             this.section = config.numsections ? sections[1] : false; | ||||||
|             if (this.section) { |             if (this.section) { | ||||||
|                 this.section.hasContent = this.courseHelper.sectionHasContent(this.section); |                 this.section.hasContent = this.courseHelper.sectionHasContent(this.section); | ||||||
|                 this.hasContent = this.courseHelper.addHandlerDataForModules([this.section], this.siteHomeId) || this.hasContent; |                 this.hasContent = this.courseHelper.addHandlerDataForModules([this.section], this.siteHomeId) || this.hasContent; | ||||||
|             } |             } | ||||||
| 
 | 
 | ||||||
|             const mainMenuBlock = sections.length > 0 ? sections.pop() : false; |  | ||||||
|             this.mainMenuBlock = false; |  | ||||||
| 
 |  | ||||||
|             if (mainMenuBlock) { |  | ||||||
|                 // Check if the block can be viewed.
 |  | ||||||
|                 let promise; |  | ||||||
| 
 |  | ||||||
|                 if (this.courseProvider.canGetCourseBlocks()) { |  | ||||||
|                     promise = this.courseProvider.getCourseBlocks(this.siteHomeId).then((blocks) => { |  | ||||||
|                         // Search if the main menu block is enabled.
 |  | ||||||
|                         return !!blocks.find((block) => { return block.name == 'site_main_menu'; }); |  | ||||||
|                     }).catch(() => { |  | ||||||
|                         return true; |  | ||||||
|                     }); |  | ||||||
|                 } else { |  | ||||||
|                     // We don't know if it can be viewed, so always display it.
 |  | ||||||
|                     promise = Promise.resolve(true); |  | ||||||
|                 } |  | ||||||
| 
 |  | ||||||
|                 promises.push(promise.then((canView) => { |  | ||||||
|                     if (canView) { |  | ||||||
|                         // User can view the block, display it and calculate its data.
 |  | ||||||
|                         this.mainMenuBlock = mainMenuBlock; |  | ||||||
|                         this.mainMenuBlock.hasContent = this.courseHelper.sectionHasContent(this.mainMenuBlock); |  | ||||||
|                         this.hasContent = this.courseHelper.addHandlerDataForModules([mainMenuBlock], this.siteHomeId) || |  | ||||||
|                                 this.hasContent; |  | ||||||
| 
 |  | ||||||
|                         if (hasNewsItem && this.mainMenuBlock.modules) { |  | ||||||
|                             // Remove forum activity (news one only) from the main menu block to prevent duplicates.
 |  | ||||||
|                             return this.siteHomeProvider.getNewsForum(this.siteHomeId).then((forum) => { |  | ||||||
|                                 // Search the module that belongs to site news.
 |  | ||||||
|                                 for (let i = 0; i < this.mainMenuBlock.modules.length; i++) { |  | ||||||
|                                     const module = this.mainMenuBlock.modules[i]; |  | ||||||
| 
 |  | ||||||
|                                     if (module.modname == 'forum' && module.instance == forum.id) { |  | ||||||
|                                         this.mainMenuBlock.modules.splice(i, 1); |  | ||||||
|                                         break; |  | ||||||
|                                     } |  | ||||||
|                                 } |  | ||||||
|                             }).catch(() => { |  | ||||||
|                                 // Ignore errors.
 |  | ||||||
|                             }); |  | ||||||
|                         } |  | ||||||
|                     } |  | ||||||
|                 })); |  | ||||||
|             } |  | ||||||
| 
 |  | ||||||
|             // Add log in Moodle.
 |             // Add log in Moodle.
 | ||||||
|             this.courseProvider.logView(this.siteHomeId).catch(() => { |             this.courseProvider.logView(this.siteHomeId).catch(() => { | ||||||
|                 // Ignore errors.
 |                 // Ignore errors.
 | ||||||
|             }); |             }); | ||||||
| 
 | 
 | ||||||
|             return Promise.all(promises); |             // Get site home blocks.
 | ||||||
|  |             const canGetBlocks = this.courseProvider.canGetCourseBlocks(), | ||||||
|  |                 promise = canGetBlocks ? this.courseProvider.getCourseBlocks(this.siteHomeId) : Promise.reject(null); | ||||||
|  | 
 | ||||||
|  |             return promise.then((blocks) => { | ||||||
|  |                 this.blocks = blocks; | ||||||
|  |                 this.hasSupportedBlock = this.blockDelegate.hasSupportedBlock(blocks); | ||||||
|  | 
 | ||||||
|  |             }).catch((error) => { | ||||||
|  |                 if (canGetBlocks) { | ||||||
|  |                     this.domUtils.showErrorModal(error); | ||||||
|  |                 } | ||||||
|  | 
 | ||||||
|  |                 // Cannot get the blocks, just show site main menu if needed.
 | ||||||
|  |                 if (sections[0] && this.courseHelper.sectionHasContent(sections[0])) { | ||||||
|  |                     this.blocks.push({ | ||||||
|  |                         name: 'site_main_menu' | ||||||
|  |                     }); | ||||||
|  |                     this.hasSupportedBlock = true; | ||||||
|  |                 } else { | ||||||
|  |                     this.blocks = []; | ||||||
|  |                     this.hasSupportedBlock = false; | ||||||
|  |                 } | ||||||
|  |             }); | ||||||
|         }).catch((error) => { |         }).catch((error) => { | ||||||
|             this.domUtils.showErrorModalDefault(error, 'core.course.couldnotloadsectioncontent', true); |             this.domUtils.showErrorModalDefault(error, 'core.course.couldnotloadsectioncontent', true); | ||||||
|         }); |         }); | ||||||
|  | |||||||
| @ -49,6 +49,16 @@ export class CoreSiteHomeProvider { | |||||||
|         }); |         }); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |     /** | ||||||
|  |      * Invalidate the WS call to get the news forum for the Site Home. | ||||||
|  |      * | ||||||
|  |      * @param {number} siteHomeId Site Home ID. | ||||||
|  |      * @return {Promise<any>} Promise resolved when invalidated. | ||||||
|  |      */ | ||||||
|  |     invalidateNewsForum(siteHomeId: number): Promise<any> { | ||||||
|  |         return this.forumProvider.invalidateForumData(siteHomeId); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|     /** |     /** | ||||||
|      * Returns whether or not the frontpage is available for the current site. |      * Returns whether or not the frontpage is available for the current site. | ||||||
|      * |      * | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user