MOBILE-1874 sitehome: Check if Main Menu block is visible

main
dpalou 2018-10-16 10:15:04 +02:00
parent 17f707ed86
commit aa600f2d92
3 changed files with 116 additions and 25 deletions

View File

@ -85,11 +85,22 @@ export class CoreCourseProvider {
this.sitesProvider.createTableFromSchema(this.courseStatusTableSchema); this.sitesProvider.createTableFromSchema(this.courseStatusTableSchema);
} }
/**
* Check if the get course blocks WS is available in current site.
*
* @return {boolean} Whether it's available.
* @since 3.3
*/
canGetCourseBlocks(): boolean {
return this.sitesProvider.wsAvailableInCurrentSite('core_block_get_course_blocks');
}
/** /**
* Check whether the site supports requesting stealth modules. * Check whether the site supports requesting stealth modules.
* *
* @param {CoreSite} [site] Site. If not defined, current site. * @param {CoreSite} [site] Site. If not defined, current site.
* @return {boolean} Whether the site supports requesting stealth modules. * @return {boolean} Whether the site supports requesting stealth modules.
* @since 3.4.6, 3.5.3, 3.6
*/ */
canRequestStealthModules(site?: CoreSite): boolean { canRequestStealthModules(site?: CoreSite): boolean {
site = site || this.sitesProvider.getCurrentSite(); site = site || this.sitesProvider.getCurrentSite();
@ -208,6 +219,39 @@ export class CoreCourseProvider {
return this.ROOT_CACHE_KEY + 'activitiescompletion:' + courseId + ':' + userId; return this.ROOT_CACHE_KEY + 'activitiescompletion:' + courseId + ':' + userId;
} }
/**
* Get course blocks.
*
* @param {number} courseId Course ID.
* @param {string} [siteId] Site ID. If not defined, current site.
* @return {Promise<any[]>} Promise resolved with the list of blocks.
* @since 3.3
*/
getCourseBlocks(courseId: number, siteId?: string): Promise<any[]> {
return this.sitesProvider.getSite(siteId).then((site) => {
const params = {
courseid: courseId
},
preSets: CoreSiteWSPreSets = {
cacheKey: this.getCourseBlocksCacheKey(courseId)
};
return site.read('core_block_get_course_blocks', params, preSets).then((result) => {
return result.blocks || [];
});
});
}
/**
* Get cache key for course blocks WS calls.
*
* @param {number} courseId Course ID.
* @return {string} Cache key.
*/
protected getCourseBlocksCacheKey(courseId: number): string {
return this.ROOT_CACHE_KEY + 'courseblocks:' + courseId;
}
/** /**
* Get the data stored for a course. * Get the data stored for a course.
* *
@ -608,6 +652,19 @@ export class CoreCourseProvider {
return modules; return modules;
} }
/**
* Invalidates course blocks WS call.
*
* @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.
*/
invalidateCourseBlocks(courseId: number, siteId?: string): Promise<any> {
return this.sitesProvider.getSite(siteId).then((site) => {
return site.invalidateWsCacheForKey(this.getCourseBlocksCacheKey(courseId));
});
}
/** /**
* Invalidates module WS call. * Invalidates module WS call.
* *

View File

@ -22,14 +22,14 @@
</ng-container> </ng-container>
</ng-container> </ng-container>
<!-- Site home block. --> <!-- Main menu block. -->
<ng-container *ngIf="block && block.hasContent"> <ng-container *ngIf="mainMenuBlock && mainMenuBlock.hasContent">
<ion-item-divider color="light" *ngIf="(section && section.hasContent) || items.length > 0"></ion-item-divider> <ion-item-divider color="light" *ngIf="(section && section.hasContent) || items.length > 0"></ion-item-divider>
<ion-item text-wrap *ngIf="block.summary"> <ion-item text-wrap *ngIf="mainMenuBlock.summary">
<core-format-text [text]="block.summary"></core-format-text> <core-format-text [text]="mainMenuBlock.summary"></core-format-text>
</ion-item> </ion-item>
<core-course-module *ngFor="let module of block.modules" [module]="module" [courseId]="siteHomeId" [downloadEnabled]="true" [section]="block"></core-course-module> <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>

View File

@ -30,7 +30,7 @@ import { CoreSiteHomeProvider } from '../../providers/sitehome';
export class CoreSiteHomeIndexComponent implements OnInit { export class CoreSiteHomeIndexComponent implements OnInit {
dataLoaded = false; dataLoaded = false;
section: any; section: any;
block: any; mainMenuBlock: any;
hasContent: boolean; hasContent: boolean;
items: any[] = []; items: any[] = [];
siteHomeId: number; siteHomeId: number;
@ -75,6 +75,10 @@ export class CoreSiteHomeIndexComponent implements OnInit {
promises.push(this.prefetchDelegate.invalidateModules(modules, this.siteHomeId)); promises.push(this.prefetchDelegate.invalidateModules(modules, this.siteHomeId));
} }
if (this.courseProvider.canGetCourseBlocks()) {
promises.push(this.courseProvider.invalidateCourseBlocks(this.siteHomeId));
}
Promise.all(promises).finally(() => { Promise.all(promises).finally(() => {
this.loadContent().finally(() => { this.loadContent().finally(() => {
refresher.complete(); refresher.complete();
@ -126,40 +130,70 @@ export class CoreSiteHomeIndexComponent implements OnInit {
} }
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); 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.length > 0 ? sections.pop() : 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.block = sections.length > 0 ? sections.pop() : false; const mainMenuBlock = sections.length > 0 ? sections.pop() : false;
if (this.block) { this.mainMenuBlock = false;
this.block.hasContent = this.courseHelper.sectionHasContent(this.block);
}
this.hasContent = this.courseHelper.addHandlerDataForModules(this.sectionsLoaded, this.siteHomeId) || this.hasContent; if (mainMenuBlock) {
// Check if the block can be viewed.
let promise;
// Add log in Moodle. if (this.courseProvider.canGetCourseBlocks()) {
this.courseProvider.logView(this.siteHomeId); 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);
}
if (hasNewsItem && this.block && this.block.modules) { promises.push(promise.then((canView) => {
// Remove forum activity (news one only) to prevent duplicates. if (canView) {
return this.siteHomeProvider.getNewsForum(this.siteHomeId).then((forum) => { // User can view the block, display it and calculate its data.
// Search the module that belongs to site news. this.mainMenuBlock = mainMenuBlock;
for (let i = 0; i < this.block.modules.length; i++) { this.mainMenuBlock.hasContent = this.courseHelper.sectionHasContent(this.mainMenuBlock);
const module = this.block.modules[i]; this.hasContent = this.courseHelper.addHandlerDataForModules([mainMenuBlock], this.siteHomeId) ||
this.hasContent;
if (module.modname == 'forum' && module.instance == forum.id) { if (hasNewsItem && this.mainMenuBlock.modules) {
this.block.modules.splice(i, 1); // Remove forum activity (news one only) from the main menu block to prevent duplicates.
break; 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.
});
} }
} }
}).catch(() => { }));
// Ignore errors.
});
} }
// Add log in Moodle.
this.courseProvider.logView(this.siteHomeId).catch(() => {
// Ignore errors.
});
return Promise.all(promises);
}).catch((error) => { }).catch((error) => {
this.domUtils.showErrorModalDefault(error, 'core.course.couldnotloadsectioncontent', true); this.domUtils.showErrorModalDefault(error, 'core.course.couldnotloadsectioncontent', true);
}); });