commit
bdbba2885e
|
@ -354,7 +354,8 @@ export class AddonModForumIndexComponent extends CoreCourseModuleMainActivityCom
|
|||
this.page = 0;
|
||||
}
|
||||
|
||||
return this.forumProvider.getDiscussions(this.forum.id, this.selectedSortOrder.value, this.page).then((response) => {
|
||||
return this.forumProvider.getDiscussions(this.forum.id, this.forum.cmid,
|
||||
this.selectedSortOrder.value, this.page).then((response) => {
|
||||
let promise;
|
||||
if (this.usesGroups) {
|
||||
promise = this.forumProvider.formatDiscussionsGroups(this.forum.cmid, response.discussions);
|
||||
|
|
|
@ -323,7 +323,7 @@ export class AddonModForumDiscussionPage implements OnDestroy {
|
|||
let ratingInfo;
|
||||
|
||||
return syncPromise.then(() => {
|
||||
return this.forumProvider.getDiscussionPosts(this.discussionId).then((response) => {
|
||||
return this.forumProvider.getDiscussionPosts(this.discussionId, this.cmId).then((response) => {
|
||||
onlinePosts = response.posts;
|
||||
ratingInfo = response.ratinginfo;
|
||||
}).then(() => {
|
||||
|
@ -412,7 +412,7 @@ export class AddonModForumDiscussionPage implements OnDestroy {
|
|||
|
||||
// The discussion object was not passed as parameter and there is no starting post. Should not happen.
|
||||
if (!this.discussion) {
|
||||
promises.push(this.loadDiscussion(this.forumId, this.discussionId));
|
||||
promises.push(this.loadDiscussion(this.forumId, this.cmId, this.discussionId));
|
||||
}
|
||||
|
||||
return Promise.all(promises);
|
||||
|
@ -479,13 +479,14 @@ export class AddonModForumDiscussionPage implements OnDestroy {
|
|||
* Convenience function to load discussion.
|
||||
*
|
||||
* @param forumId Forum ID.
|
||||
* @param cmId Forum cmid.
|
||||
* @param discussionId Discussion ID.
|
||||
* @return Promise resolved when done.
|
||||
*/
|
||||
protected loadDiscussion(forumId: number, discussionId: number): Promise<void> {
|
||||
protected loadDiscussion(forumId: number, cmId: number, discussionId: number): Promise<void> {
|
||||
// Fetch the discussion if not passed as parameter.
|
||||
if (!this.discussion && forumId) {
|
||||
return this.forumHelper.getDiscussionById(forumId, discussionId).then((discussion) => {
|
||||
return this.forumHelper.getDiscussionById(forumId, cmId, discussionId).then((discussion) => {
|
||||
this.discussion = discussion;
|
||||
this.discussionId = this.discussion.discussion;
|
||||
}).catch(() => {
|
||||
|
|
|
@ -492,15 +492,18 @@ export class AddonModForumProvider {
|
|||
* Get forum discussion posts.
|
||||
*
|
||||
* @param discussionId Discussion ID.
|
||||
* @param cmId Forum cmid.
|
||||
* @param siteId Site ID. If not defined, current site.
|
||||
* @return Promise resolved with forum posts and rating info.
|
||||
*/
|
||||
getDiscussionPosts(discussionId: number, siteId?: string): Promise<{posts: any[], ratinginfo?: CoreRatingInfo}> {
|
||||
getDiscussionPosts(discussionId: number, cmId: number, siteId?: string): Promise<{posts: any[], ratinginfo?: CoreRatingInfo}> {
|
||||
const params = {
|
||||
discussionid: discussionId
|
||||
};
|
||||
const preSets = {
|
||||
cacheKey: this.getDiscussionPostsCacheKey(discussionId)
|
||||
cacheKey: this.getDiscussionPostsCacheKey(discussionId),
|
||||
component: AddonModForumProvider.COMPONENT,
|
||||
componentId: cmId
|
||||
};
|
||||
|
||||
return this.sitesProvider.getSite(siteId).then((site) => {
|
||||
|
@ -592,6 +595,7 @@ export class AddonModForumProvider {
|
|||
* Get forum discussions.
|
||||
*
|
||||
* @param forumId Forum ID.
|
||||
* @param cmId Forum cmid
|
||||
* @param sortOrder Sort order.
|
||||
* @param page Page.
|
||||
* @param forceCache True to always get the value from cache. false otherwise.
|
||||
|
@ -601,7 +605,8 @@ export class AddonModForumProvider {
|
|||
* discussion ID is discussion.discussion.
|
||||
* - canLoadMore: True if there may be more discussions to load.
|
||||
*/
|
||||
getDiscussions(forumId: number, sortOrder?: number, page: number = 0, forceCache?: boolean, siteId?: string): Promise<any> {
|
||||
getDiscussions(forumId: number, cmId: number, sortOrder?: number, page: number = 0,
|
||||
forceCache?: boolean, siteId?: string): Promise<any> {
|
||||
sortOrder = sortOrder || AddonModForumProvider.SORTORDER_LASTPOST_DESC;
|
||||
|
||||
return this.sitesProvider.getSite(siteId).then((site) => {
|
||||
|
@ -626,7 +631,9 @@ export class AddonModForumProvider {
|
|||
}
|
||||
}
|
||||
const preSets: CoreSiteWSPreSets = {
|
||||
cacheKey: this.getDiscussionsListCacheKey(forumId, sortOrder)
|
||||
cacheKey: this.getDiscussionsListCacheKey(forumId, sortOrder),
|
||||
component: AddonModForumProvider.COMPONENT,
|
||||
componentId: cmId
|
||||
};
|
||||
if (forceCache) {
|
||||
preSets.omitExpires = true;
|
||||
|
@ -673,6 +680,7 @@ export class AddonModForumProvider {
|
|||
* If a page fails, the discussions until that page will be returned along with a flag indicating an error occurred.
|
||||
*
|
||||
* @param forumId Forum ID.
|
||||
* @param cmId Forum cmid.
|
||||
* @param sortOrder Sort order.
|
||||
* @param forceCache True to always get the value from cache, false otherwise.
|
||||
* @param numPages Number of pages to get. If not defined, all pages.
|
||||
|
@ -682,8 +690,8 @@ export class AddonModForumProvider {
|
|||
* - discussions: List of discussions.
|
||||
* - error: True if an error occurred, false otherwise.
|
||||
*/
|
||||
getDiscussionsInPages(forumId: number, sortOrder?: number, forceCache?: boolean, numPages?: number, startPage?: number,
|
||||
siteId?: string): Promise<any> {
|
||||
getDiscussionsInPages(forumId: number, cmId: number, sortOrder?: number, forceCache?: boolean,
|
||||
numPages?: number, startPage?: number, siteId?: string): Promise<any> {
|
||||
if (typeof numPages == 'undefined') {
|
||||
numPages = -1;
|
||||
}
|
||||
|
@ -700,7 +708,7 @@ export class AddonModForumProvider {
|
|||
|
||||
const getPage = (page: number): Promise<any> => {
|
||||
// Get page discussions.
|
||||
return this.getDiscussions(forumId, sortOrder, page, forceCache, siteId).then((response) => {
|
||||
return this.getDiscussions(forumId, cmId, sortOrder, page, forceCache, siteId).then((response) => {
|
||||
result.discussions = result.discussions.concat(response.discussions);
|
||||
numPages--;
|
||||
|
||||
|
@ -753,7 +761,7 @@ export class AddonModForumProvider {
|
|||
|
||||
this.getAvailableSortOrders().forEach((sortOrder) => {
|
||||
// We need to get the list of discussions to be able to invalidate their posts.
|
||||
promises.push(this.getDiscussionsInPages(forum.id, sortOrder.value, true).then((response) => {
|
||||
promises.push(this.getDiscussionsInPages(forum.id, forum.cmid, sortOrder.value, true).then((response) => {
|
||||
// Now invalidate the WS calls.
|
||||
const promises = [];
|
||||
|
||||
|
|
|
@ -270,15 +270,16 @@ export class AddonModForumHelperProvider {
|
|||
* This function is inefficient because it needs to fetch all discussion pages in the worst case.
|
||||
*
|
||||
* @param forumId Forum ID.
|
||||
* @param cmId Forum cmid
|
||||
* @param discussionId Discussion ID.
|
||||
* @param siteId Site ID. If not defined, current site.
|
||||
* @return Promise resolved with the discussion data.
|
||||
*/
|
||||
getDiscussionById(forumId: number, discussionId: number, siteId?: string): Promise<any> {
|
||||
getDiscussionById(forumId: number, cmId: number, discussionId: number, siteId?: string): Promise<any> {
|
||||
siteId = siteId || this.sitesProvider.getCurrentSiteId();
|
||||
|
||||
const findDiscussion = (page: number): Promise<any> => {
|
||||
return this.forumProvider.getDiscussions(forumId, undefined, page, false, siteId).then((response) => {
|
||||
return this.forumProvider.getDiscussions(forumId, cmId, undefined, page, false, siteId).then((response) => {
|
||||
if (response.discussions && response.discussions.length > 0) {
|
||||
// Note that discussion.id is the main post ID but discussion ID is discussion.discussion.
|
||||
const discussion = response.discussions.find((discussion) => discussion.discussion == discussionId);
|
||||
|
|
|
@ -114,7 +114,8 @@ export class AddonModForumPrefetchHandler extends CoreCourseActivityPrefetchHand
|
|||
protected getPostsForPrefetch(forum: any, siteId?: string): Promise<any[]> {
|
||||
const promises = this.forumProvider.getAvailableSortOrders().map((sortOrder) => {
|
||||
// Get discussions in first 2 pages.
|
||||
return this.forumProvider.getDiscussionsInPages(forum.id, sortOrder.value, false, 2, 0, siteId).then((response) => {
|
||||
return this.forumProvider.getDiscussionsInPages(forum.id, forum.cmid,
|
||||
sortOrder.value, false, 2, 0, siteId).then((response) => {
|
||||
if (response.error) {
|
||||
return Promise.reject(null);
|
||||
}
|
||||
|
@ -122,7 +123,7 @@ export class AddonModForumPrefetchHandler extends CoreCourseActivityPrefetchHand
|
|||
const promises = [];
|
||||
|
||||
response.discussions.forEach((discussion) => {
|
||||
promises.push(this.forumProvider.getDiscussionPosts(discussion.discussion, siteId));
|
||||
promises.push(this.forumProvider.getDiscussionPosts(discussion.discussion, forum.cmid, siteId));
|
||||
});
|
||||
|
||||
return Promise.all(promises);
|
||||
|
|
|
@ -20,6 +20,7 @@ import { CoreCourseHelperProvider } from '@core/course/providers/helper';
|
|||
import { CoreDomUtilsProvider } from '@providers/utils/dom';
|
||||
import { TranslateService } from '@ngx-translate/core';
|
||||
import { CoreConstants } from '@core/constants';
|
||||
import { CoreSitesProvider } from '@providers/sites';
|
||||
|
||||
/**
|
||||
* Page that displays the amount of file storage used by each activity on the course, and allows
|
||||
|
@ -39,6 +40,7 @@ export class AddonStorageManagerCourseStoragePage {
|
|||
totalSize: number;
|
||||
|
||||
constructor(navParams: NavParams,
|
||||
private sitesProvider: CoreSitesProvider,
|
||||
private courseProvider: CoreCourseProvider,
|
||||
private prefetchDelegate: CoreCourseModulePrefetchDelegate,
|
||||
private courseHelperProvider: CoreCourseHelperProvider,
|
||||
|
@ -70,7 +72,7 @@ export class AddonStorageManagerCourseStoragePage {
|
|||
// But these aren't necessarily consistent, for example mod_frog vs mmaModFrog.
|
||||
// There is nothing enforcing correct values.
|
||||
// Most modules which have large files are downloadable, so I think this is sufficient.
|
||||
const promise = this.prefetchDelegate.getModuleDownloadedSize(module, this.course.id).
|
||||
const promise = this.prefetchDelegate.getModuleStoredSize(module, this.course.id).
|
||||
then((size) => {
|
||||
// There are some cases where the return from this is not a valid number.
|
||||
if (!isNaN(size)) {
|
||||
|
@ -185,7 +187,13 @@ export class AddonStorageManagerCourseStoragePage {
|
|||
modules.forEach((module) => {
|
||||
// Remove the files.
|
||||
const promise = this.prefetchDelegate.removeModuleFiles(module, this.course.id).then(() => {
|
||||
// When the files are removed, update the size.
|
||||
const handler = this.prefetchDelegate.getPrefetchHandlerFor(module);
|
||||
if (handler) {
|
||||
|
||||
return this.sitesProvider.getCurrentSite().deleteComponentFromCache(handler.component, module.id);
|
||||
}
|
||||
}).then(() => {
|
||||
// When the files and cache are removed, update the size.
|
||||
module.parentSection.totalSize -= module.totalSize;
|
||||
this.totalSize -= module.totalSize;
|
||||
module.totalSize = 0;
|
||||
|
|
|
@ -127,6 +127,17 @@ export interface CoreSiteWSPreSets {
|
|||
* Defaults to CoreSite.FREQUENCY_USUALLY.
|
||||
*/
|
||||
updateFrequency?: number;
|
||||
|
||||
/**
|
||||
* Component name. Optionally included if this request is being made on behalf of a specific
|
||||
* component (e.g. activity).
|
||||
*/
|
||||
component?: string;
|
||||
|
||||
/**
|
||||
* Component id. Optionally included when 'component' is set.
|
||||
*/
|
||||
componentId?: number;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -197,7 +208,7 @@ export class CoreSite {
|
|||
protected wsProvider: CoreWSProvider;
|
||||
|
||||
// Variables for the database.
|
||||
static WS_CACHE_TABLE = 'wscache';
|
||||
static WS_CACHE_TABLE = 'wscache_2';
|
||||
static CONFIG_TABLE = 'core_site_config';
|
||||
|
||||
// Versions of Moodle releases.
|
||||
|
@ -1089,6 +1100,25 @@ export class CoreSite {
|
|||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the size of cached data for a specific component or component instance.
|
||||
*
|
||||
* @param component Component name
|
||||
* @param componentId Optional component id (if not included, returns sum for whole component)
|
||||
* @return Promise resolved when we have calculated the size
|
||||
*/
|
||||
getComponentCacheSize(component: string, componentId?: string): Promise<number> {
|
||||
const params = [component];
|
||||
let extraClause = '';
|
||||
if (componentId) {
|
||||
params.push(componentId);
|
||||
extraClause = ' AND componentId = ?';
|
||||
}
|
||||
|
||||
return this.db.getFieldSql('SELECT SUM(length(data)) FROM ' + CoreSite.WS_CACHE_TABLE +
|
||||
' WHERE component = ?' + extraClause, params);
|
||||
}
|
||||
|
||||
/**
|
||||
* Save a WS response to cache.
|
||||
*
|
||||
|
@ -1128,6 +1158,13 @@ export class CoreSite {
|
|||
entry.key = preSets.cacheKey;
|
||||
}
|
||||
|
||||
if (preSets.component) {
|
||||
entry.component = preSets.component;
|
||||
if (preSets.componentId) {
|
||||
entry.componentId = preSets.componentId;
|
||||
}
|
||||
}
|
||||
|
||||
return this.db.insertRecord(CoreSite.WS_CACHE_TABLE, entry);
|
||||
});
|
||||
}
|
||||
|
@ -1155,6 +1192,33 @@ export class CoreSite {
|
|||
return this.db.deleteRecords(CoreSite.WS_CACHE_TABLE, { id: id });
|
||||
}
|
||||
|
||||
/**
|
||||
* Deletes WS cache entries for all methods relating to a specific component (and
|
||||
* optionally component id).
|
||||
*
|
||||
* @param component Component name.
|
||||
* @param componentId Component id.
|
||||
* @return Promise resolved when the entries are deleted.
|
||||
*/
|
||||
async deleteComponentFromCache(component: string, componentId?: string): Promise<void> {
|
||||
if (!component) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (!this.db) {
|
||||
throw new Error('Site DB not initialized');
|
||||
}
|
||||
|
||||
const params = {
|
||||
component: component
|
||||
} as any;
|
||||
if (componentId) {
|
||||
params.componentId = componentId;
|
||||
}
|
||||
|
||||
return this.db.deleteRecords(CoreSite.WS_CACHE_TABLE, params);
|
||||
}
|
||||
|
||||
/*
|
||||
* Uploads a file using Cordova File API.
|
||||
*
|
||||
|
@ -1324,6 +1388,29 @@ export class CoreSite {
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets an approximation of the cache table usage of the site.
|
||||
*
|
||||
* Currently this is just the total length of the data fields in the cache table.
|
||||
*
|
||||
* @return Promise resolved with the total size of all data in the cache table (bytes)
|
||||
*/
|
||||
getCacheUsage(): Promise<number> {
|
||||
return this.db.getFieldSql('SELECT SUM(length(data)) FROM ' + CoreSite.WS_CACHE_TABLE);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets a total of the file and cache usage.
|
||||
*
|
||||
* @return Promise with the total of getSpaceUsage and getCacheUsage
|
||||
*/
|
||||
async getTotalUsage(): Promise<number> {
|
||||
const space = await this.getSpaceUsage();
|
||||
const cache = await this.getCacheUsage();
|
||||
|
||||
return space + cache;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the URL to the documentation of the app, based on Moodle version and current language.
|
||||
*
|
||||
|
|
|
@ -425,6 +425,11 @@ export class CoreCourseHelperProvider {
|
|||
|
||||
await this.prefetchDelegate.removeModuleFiles(module, courseId);
|
||||
|
||||
const handler = this.prefetchDelegate.getPrefetchHandlerFor(module);
|
||||
if (handler) {
|
||||
await this.sitesProvider.getCurrentSite().deleteComponentFromCache(handler.component, String(module.id));
|
||||
}
|
||||
|
||||
done && done();
|
||||
|
||||
} catch (error) {
|
||||
|
@ -1131,7 +1136,7 @@ export class CoreCourseHelperProvider {
|
|||
this.prefetchDelegate.invalidateModuleStatusCache(module);
|
||||
}
|
||||
|
||||
promises.push(this.prefetchDelegate.getModuleDownloadedSize(module, courseId).then((moduleSize) => {
|
||||
promises.push(this.prefetchDelegate.getModuleStoredSize(module, courseId).then((moduleSize) => {
|
||||
moduleInfo.size = moduleSize;
|
||||
moduleInfo.sizeReadable = this.textUtils.bytesToSize(moduleSize, 2);
|
||||
}));
|
||||
|
|
|
@ -690,6 +690,36 @@ export class CoreCourseModulePrefetchDelegate extends CoreDelegate {
|
|||
return Promise.resolve(0);
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the estimated total size of data stored for a module. This includes
|
||||
* the files downloaded for it (getModuleDownloadedSize) and also the total
|
||||
* size of web service requests stored for it.
|
||||
*
|
||||
* @param module Module to get the size.
|
||||
* @param courseId Course ID the module belongs to.
|
||||
* @return Promise resolved with the total size (0 if unknown)
|
||||
*/
|
||||
getModuleStoredSize(module: any, courseId: number): Promise<number> {
|
||||
return this.getModuleDownloadedSize(module, courseId).then((downloadedSize) => {
|
||||
if (isNaN(downloadedSize)) {
|
||||
downloadedSize = 0;
|
||||
}
|
||||
const handler = this.getPrefetchHandlerFor(module);
|
||||
if (handler) {
|
||||
const site = this.sitesProvider.getCurrentSite();
|
||||
|
||||
return site.getComponentCacheSize(handler.component, module.id).then((cachedSize) => {
|
||||
return cachedSize + downloadedSize;
|
||||
});
|
||||
} else {
|
||||
// If there is no handler then we can't find out the component name.
|
||||
// So we can't work out the cached size, so just return downloaded size.
|
||||
|
||||
return downloadedSize;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Get module files.
|
||||
*
|
||||
|
|
|
@ -33,7 +33,6 @@
|
|||
<ion-item text-wrap *ngIf="spaceUsage">
|
||||
<h2 text-wrap>{{ 'core.settings.spaceusage' | translate }} <ion-icon name="information-circle" color="info" [attr.aria-label]="'core.info' | translate" (click)="showSpaceInfo()"></ion-icon></h2>
|
||||
<p *ngIf="spaceUsage.spaceUsage != null">{{ spaceUsage.spaceUsage | coreBytesToSize }}</p>
|
||||
<p *ngIf="spaceUsage.cacheEntries != null">{{ 'core.settings.entriesincache' | translate: { $a: spaceUsage.cacheEntries } }}</p>
|
||||
<button ion-button icon-only clear color="danger" item-end (click)="deleteSiteStorage()" [hidden]="!spaceUsage.spaceUsage > '0' && !spaceUsage.cacheEntries > '0'" [attr.aria-label]="'core.settings.deletesitefilestitle' | translate">
|
||||
<ion-icon name="trash"></ion-icon>
|
||||
</button>
|
||||
|
|
|
@ -20,7 +20,6 @@
|
|||
<p text-wrap>{{ site.fullName }}</p>
|
||||
<div item-end>
|
||||
<p *ngIf="site.spaceUsage != null" text-end>{{ site.spaceUsage | coreBytesToSize }}</p>
|
||||
<p *ngIf="site.cacheEntries != null" text-end>{{ 'core.settings.entriesincache' | translate: { $a: site.cacheEntries } }}</p>
|
||||
</div>
|
||||
<button ion-button icon-only clear color="danger" item-end (click)="deleteSiteStorage(site)" [hidden]="!site.spaceUsage > '0' && !site.cacheEntries > '0'" [attr.aria-label]="'core.settings.deletesitefilestitle' | translate">
|
||||
<ion-icon name="trash"></ion-icon>
|
||||
|
@ -30,7 +29,6 @@
|
|||
<h2>{{ 'core.settings.total' | translate }}</h2>
|
||||
<div item-end>
|
||||
<p>{{ totals.spaceUsage | coreBytesToSize }}</p>
|
||||
<p>{{ 'core.settings.entriesincache' | translate: { $a: totals.cacheEntries } }}</p>
|
||||
</div>
|
||||
</ion-item-divider>
|
||||
</core-loading>
|
||||
|
|
|
@ -34,7 +34,7 @@ import { TranslateService } from '@ngx-translate/core';
|
|||
*/
|
||||
export interface CoreSiteSpaceUsage {
|
||||
cacheEntries?: number; // Number of cached entries that can be cleared.
|
||||
spaceUsage?: number; // Space used in this site.
|
||||
spaceUsage?: number; // Space used in this site (total files + estimate of cache).
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -154,7 +154,7 @@ export class CoreSettingsHelper {
|
|||
|
||||
await Promise.all([
|
||||
this.calcSiteClearRows(site).then((rows) => siteInfo.cacheEntries = rows),
|
||||
site.getSpaceUsage().then((size) => siteInfo.spaceUsage = size),
|
||||
site.getTotalUsage().then((size) => siteInfo.spaceUsage = size),
|
||||
]);
|
||||
|
||||
return siteInfo;
|
||||
|
|
|
@ -9,4 +9,4 @@
|
|||
</core-context-menu>
|
||||
</core-navbar-buttons>
|
||||
|
||||
<core-site-plugins-plugin-content *ngIf="component && method" [component]="component" [method]="method" [args]="args" [initResult]="initResult" [data]="jsData" [pageTitle]="pageTitle" (onContentLoaded)="contentLoaded($event)" (onLoadingContent)="contentLoading($event)"></core-site-plugins-plugin-content>
|
||||
<core-site-plugins-plugin-content *ngIf="component && method" [component]="component" [method]="method" [args]="args" [initResult]="initResult" [data]="jsData" [pageTitle]="pageTitle" [preSets]="preSets" (onContentLoaded)="contentLoaded($event)" (onLoadingContent)="contentLoading($event)"></core-site-plugins-plugin-content>
|
||||
|
|
|
@ -21,6 +21,7 @@ import { CoreCourseModuleDelegate, CoreCourseModuleMainComponent } from '@core/c
|
|||
import { CoreCourseModulePrefetchDelegate } from '@core/course/providers/module-prefetch-delegate';
|
||||
import { CoreCourseHelperProvider } from '@core/course/providers/helper';
|
||||
import { CoreSitePluginsPluginContentComponent } from '../plugin-content/plugin-content';
|
||||
import { CoreSiteWSPreSets } from '@classes/site';
|
||||
|
||||
/**
|
||||
* Component that displays the index of a module site plugin.
|
||||
|
@ -40,6 +41,7 @@ export class CoreSitePluginsModuleIndexComponent implements OnInit, OnDestroy, C
|
|||
method: string;
|
||||
args: any;
|
||||
initResult: any;
|
||||
preSets: CoreSiteWSPreSets;
|
||||
|
||||
// Data for context menu.
|
||||
externalUrl: string;
|
||||
|
@ -77,6 +79,7 @@ export class CoreSitePluginsModuleIndexComponent implements OnInit, OnDestroy, C
|
|||
|
||||
if (handler) {
|
||||
this.component = handler.plugin.component;
|
||||
this.preSets = {componentId: this.module.id};
|
||||
this.method = handler.handlerSchema.method;
|
||||
this.args = {
|
||||
courseid: this.courseId,
|
||||
|
|
|
@ -92,7 +92,10 @@ export class CoreSitePluginsPluginContentComponent implements OnInit, DoCheck {
|
|||
|
||||
this.forceCompile = false;
|
||||
|
||||
return this.sitePluginsProvider.getContent(this.component, this.method, this.args, this.preSets).then((result) => {
|
||||
const preSets = Object.assign({}, this.preSets);
|
||||
preSets.component = preSets.component || this.component;
|
||||
|
||||
return this.sitePluginsProvider.getContent(this.component, this.method, this.args, preSets).then((result) => {
|
||||
this.content = result.templates.length ? result.templates[0].html : ''; // Load first template.
|
||||
this.javascript = result.javascript;
|
||||
this.otherData = result.otherdata;
|
||||
|
|
|
@ -514,7 +514,14 @@ export class CoreSitePluginsProvider {
|
|||
promises.push(this.callWS(method, params, {cacheKey: cacheKey}));
|
||||
} else {
|
||||
// It's a method to get content.
|
||||
promises.push(this.getContent(component, method, args).then((result) => {
|
||||
const preSets = {
|
||||
component: component,
|
||||
componentId: undefined
|
||||
};
|
||||
if (module) {
|
||||
preSets.componentId = module.id;
|
||||
}
|
||||
promises.push(this.getContent(component, method, args, preSets).then((result) => {
|
||||
const subPromises = [];
|
||||
|
||||
// Prefetch the files in the content.
|
||||
|
|
|
@ -360,7 +360,7 @@ export class CoreSitesProvider {
|
|||
// Site schema for this provider.
|
||||
protected siteSchema: CoreSiteSchema = {
|
||||
name: 'CoreSitesProvider',
|
||||
version: 1,
|
||||
version: 2,
|
||||
canBeCleared: [ CoreSite.WS_CACHE_TABLE ],
|
||||
tables: [
|
||||
{
|
||||
|
@ -382,6 +382,14 @@ export class CoreSitesProvider {
|
|||
{
|
||||
name: 'expirationTime',
|
||||
type: 'INTEGER'
|
||||
},
|
||||
{
|
||||
name: 'component',
|
||||
type: 'TEXT'
|
||||
},
|
||||
{
|
||||
name: 'componentId',
|
||||
type: 'INTEGER'
|
||||
}
|
||||
]
|
||||
},
|
||||
|
@ -399,7 +407,31 @@ export class CoreSitesProvider {
|
|||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
],
|
||||
async migrate (db: SQLiteDB, oldVersion: number, siteId: string): Promise<any> {
|
||||
if (oldVersion && oldVersion < 2) {
|
||||
const newTable = CoreSite.WS_CACHE_TABLE;
|
||||
const oldTable = 'wscache';
|
||||
|
||||
try {
|
||||
await db.tableExists(oldTable);
|
||||
} catch (error) {
|
||||
// Old table does not exist, ignore.
|
||||
return;
|
||||
}
|
||||
// Cannot use insertRecordsFrom because there are extra fields, so manually code INSERT INTO.
|
||||
await db.execute(
|
||||
'INSERT INTO ' + newTable + ' ' +
|
||||
'SELECT id, data, key, expirationTime, NULL as component, NULL as componentId ' +
|
||||
'FROM ' + oldTable);
|
||||
|
||||
try {
|
||||
await db.dropTable(oldTable);
|
||||
} catch (error) {
|
||||
// Error deleting old table, ignore.
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
constructor(logger: CoreLoggerProvider,
|
||||
|
|
Loading…
Reference in New Issue