From e3b1a4b58aad9e834b90237edf4eff2444db2f9e Mon Sep 17 00:00:00 2001 From: Joan Sanchez Date: Thu, 6 Feb 2020 07:41:51 +0100 Subject: [PATCH] 2076 - Item tags refactor --- front/core/components/button/index.js | 3 + .../core/components/crud-model/crud-model.js | 56 +++++++++++++------ loopback/common/models/vn-model.js | 19 +++++-- modules/item/front/tags/index.html | 18 +++--- 4 files changed, 63 insertions(+), 33 deletions(-) diff --git a/front/core/components/button/index.js b/front/core/components/button/index.js index 17710967a..96d68c23b 100644 --- a/front/core/components/button/index.js +++ b/front/core/components/button/index.js @@ -9,6 +9,7 @@ export default class Button extends FormInput { this.initTabIndex(); this.element.addEventListener('keyup', e => this.onKeyup(e)); this.element.addEventListener('click', e => this.onClick(e)); + this.button = this.element.querySelector('button'); } $onInit() { @@ -21,6 +22,8 @@ export default class Button extends FormInput { switch (event.key) { case ' ': case 'Enter': + if (this.button) + return this.button.click(); return this.element.click(); } } diff --git a/front/core/components/crud-model/crud-model.js b/front/core/components/crud-model/crud-model.js index 9a260a690..563444ddf 100644 --- a/front/core/components/crud-model/crud-model.js +++ b/front/core/components/crud-model/crud-model.js @@ -128,31 +128,37 @@ export default class CrudModel extends ModelProxy { } /** - * Returns an object with the unsaved changes made to the model. + * Saves current changes on the server. * - * @return {Object} The current changes + * @return {Promise} The save request promise */ - getChanges() { + save() { if (!this.isChanged) return null; let deletes = []; let updates = []; let creates = []; + let orgDeletes = []; + let orgUpdates = []; + let orgCreates = []; let pk = this.primaryKey; - for (let row of this.removed) + for (let row of this.removed) { deletes.push(row.$orgRow[pk]); + orgDeletes.push(row); + } - for (let row of this._data) { + for (let row of this.data) { if (row.$isNew) { let data = {}; for (let prop in row) { if (prop.charAt(0) !== '$') data[prop] = row[prop]; } - creates.push(data); + creates.push(row); + orgCreates.push(row); } else if (row.$oldData) { let data = {}; for (let prop in row.$oldData) @@ -161,6 +167,7 @@ export default class CrudModel extends ModelProxy { data, where: {[pk]: row.$orgRow[pk]} }); + orgUpdates.push(row); } } @@ -171,23 +178,36 @@ export default class CrudModel extends ModelProxy { changes[prop] = undefined; } - return changes; - } - - /** - * Saves current changes on the server. - * - * @return {Promise} The save request promise - */ - save() { - let changes = this.getChanges(); - if (!changes) return this.$q.resolve(); let url = this.saveUrl ? this.saveUrl : `${this._url}/crud`; return this.$http.post(url, changes) - .then(() => { + .then(res => { + const newData = res.data; + const created = newData.created; + const updated = newData.updated; + + // Apply new data to created instances + for (let i = 0; i < orgCreates.length; i++) { + const row = orgCreates[i]; + row[pk] = created[i][pk]; + + for (let prop in row) { + if (prop.charAt(0) !== '$') + row[prop] = created[i][prop]; + } + } + + // Apply new data to updated instances + for (let i = 0; i < orgUpdates.length; i++) { + const row = orgUpdates[i]; + for (let prop in row) { + if (prop.charAt(0) !== '$') + row[prop] = updated[i][prop]; + } + } + this.applyChanges(); super.save(); }); diff --git a/loopback/common/models/vn-model.js b/loopback/common/models/vn-model.js index c6f535b7a..d535606e0 100644 --- a/loopback/common/models/vn-model.js +++ b/loopback/common/models/vn-model.js @@ -50,7 +50,11 @@ module.exports = function(Self) { description: `Instances to create`, type: ['Object'] } - ] + ], + returns: { + type: ['object'], + root: true + } }); }, @@ -60,27 +64,34 @@ module.exports = function(Self) { try { let options = {transaction: tx}; + let deleted; if (deletes) { let promises = []; for (let id of deletes) promises.push(this.destroyById(id, options)); - await Promise.all(promises); + deleted = await Promise.all(promises); } + + let updated; if (updates) { let promises = []; for (let update of updates) promises.push(this.upsertWithWhere(update.where, update.data, options)); - await Promise.all(promises); + updated = await Promise.all(promises); } + + let created; if (creates && creates.length) { try { - await this.create(creates, options); + created = await this.create(creates, options); } catch (error) { throw error[error.length - 1]; } } await tx.commit(); + + return {deleted, created, updated}; } catch (error) { await tx.rollback(); throw error; diff --git a/modules/item/front/tags/index.html b/modules/item/front/tags/index.html index b7b61107d..834d4c977 100644 --- a/modules/item/front/tags/index.html +++ b/modules/item/front/tags/index.html @@ -22,16 +22,14 @@
- + rule> - + value-field="{{$ctrl.sourceTables[itemTag.id].field}}" + rule> - - +