diff --git a/src/core/siteplugins/components/plugin-content/plugin-content.ts b/src/core/siteplugins/components/plugin-content/plugin-content.ts index aebf88e59..ed5a89c97 100644 --- a/src/core/siteplugins/components/plugin-content/plugin-content.ts +++ b/src/core/siteplugins/components/plugin-content/plugin-content.ts @@ -102,6 +102,7 @@ export class CoreSitePluginsPluginContentComponent implements OnInit, DoCheck { this.jsData = Object.assign(this.data, this.sitePluginsProvider.createDataForJS(this.initResult, result)); // Pass some methods as jsData so they can be called from the template too. + this.jsData.fetchContent = this.fetchContent.bind(this); this.jsData.openContent = this.openContent.bind(this); this.jsData.refreshContent = this.refreshContent.bind(this); this.jsData.updateContent = this.updateContent.bind(this); diff --git a/src/core/siteplugins/providers/siteplugins.ts b/src/core/siteplugins/providers/siteplugins.ts index 7b3b9c03b..b70686dd5 100644 --- a/src/core/siteplugins/providers/siteplugins.ts +++ b/src/core/siteplugins/providers/siteplugins.ts @@ -164,7 +164,7 @@ export class CoreSitePluginsProvider { if (initResult) { // First of all, add the data returned by the init JS (if any). - data = this.utils.clone(initResult.jsResult || {}); + data = Object.assign({}, initResult.jsResult || {}); if (typeof data == 'boolean') { data = {}; } diff --git a/src/providers/sites.ts b/src/providers/sites.ts index 53230e7d2..adcd01681 100644 --- a/src/providers/sites.ts +++ b/src/providers/sites.ts @@ -1628,7 +1628,16 @@ export class CoreSitesProvider { * Register a site schema. */ registerSiteSchema(schema: CoreSiteSchema): void { - this.siteSchemas[schema.name] = schema; + + if (this.currentSite) { + // Site has already been created, it's a schema probably added by site plugins. Add it only to current site. + const schemas: {[name: string]: CoreSiteSchema} = {}; + schemas[schema.name] = schema; + + this.applySiteSchemas(this.currentSite, schemas); + } else { + this.siteSchemas[schema.name] = schema; + } } /** @@ -1638,7 +1647,6 @@ export class CoreSitesProvider { * @return Promise resolved when done. */ migrateSiteSchemas(site: CoreSite): Promise { - const db = site.getDb(); if (this.siteSchemasMigration[site.id]) { return this.siteSchemasMigration[site.id]; @@ -1647,40 +1655,8 @@ export class CoreSitesProvider { this.logger.debug(`Migrating all schemas of ${site.id}`); // First create tables not registerd with name/version. - const promise = db.createTablesFromSchema(this.siteTablesSchemas).then(() => { - // Fetch installed versions of the schema. - return db.getAllRecords(this.SCHEMA_VERSIONS_TABLE).then((records) => { - const versions = {}; - records.forEach((record) => { - versions[record.name] = record.version; - }); - - const promises = []; - for (const name in this.siteSchemas) { - const schema = this.siteSchemas[name]; - const oldVersion = versions[name] || 0; - if (oldVersion >= schema.version) { - continue; - } - - this.logger.debug(`Migrating schema '${name}' of ${site.id} from version ${oldVersion} to ${schema.version}`); - - let promise: Promise = Promise.resolve(); - if (schema.tables) { - promise = promise.then(() => db.createTablesFromSchema(schema.tables)); - } - if (schema.migrate) { - promise = promise.then(() => schema.migrate(db, oldVersion, site.id)); - } - - // Set installed version. - promise = promise.then(() => db.insertRecord(this.SCHEMA_VERSIONS_TABLE, {name, version: schema.version})); - - promises.push(promise); - } - - return Promise.all(promises); - }); + const promise = site.getDb().createTablesFromSchema(this.siteTablesSchemas).then(() => { + return this.applySiteSchemas(site, this.siteSchemas); }); this.siteSchemasMigration[site.id] = promise; @@ -1690,6 +1666,51 @@ export class CoreSitesProvider { }); } + /** + * Install and upgrade the supplied schemas for a certain site. + * + * @param site Site. + * @param schemas Schemas to migrate. + * @return Promise resolved when done. + */ + protected applySiteSchemas(site: CoreSite, schemas: {[name: string]: CoreSiteSchema}): Promise { + const db = site.getDb(); + + // Fetch installed versions of the schema. + return db.getAllRecords(this.SCHEMA_VERSIONS_TABLE).then((records) => { + const versions = {}; + records.forEach((record) => { + versions[record.name] = record.version; + }); + + const promises = []; + for (const name in schemas) { + const schema = schemas[name]; + const oldVersion = versions[name] || 0; + if (oldVersion >= schema.version) { + continue; + } + + this.logger.debug(`Migrating schema '${name}' of ${site.id} from version ${oldVersion} to ${schema.version}`); + + let promise: Promise = Promise.resolve(); + if (schema.tables) { + promise = promise.then(() => db.createTablesFromSchema(schema.tables)); + } + if (schema.migrate) { + promise = promise.then(() => schema.migrate(db, oldVersion, site.id)); + } + + // Set installed version. + promise = promise.then(() => db.insertRecord(this.SCHEMA_VERSIONS_TABLE, {name, version: schema.version})); + + promises.push(promise); + } + + return Promise.all(promises); + }); + } + /** * Check if a URL is the root URL of any of the stored sites. *