diff --git a/client/core/src/components/array-model/array-model.js b/client/core/src/components/array-model/array-model.js index 6c1c1b694..00f7ea9a4 100644 --- a/client/core/src/components/array-model/array-model.js +++ b/client/core/src/components/array-model/array-model.js @@ -133,6 +133,8 @@ export default class ArrayModel extends ModelProxy { if (this.getChanges()) this.orgData = this.data; + super.save(); + return this.$q.resolve(); } @@ -152,7 +154,7 @@ export default class ArrayModel extends ModelProxy { let aType = typeof a; - if (aType === typeof b) { + if (aType === typeof b) switch (aType) { case 'string': return a.localeCompare(b); @@ -164,7 +166,6 @@ export default class ArrayModel extends ModelProxy { if (a instanceof Date && b instanceof Date) return a.getTime() - b.getTime(); } - } if (a === undefined) return -1; @@ -182,12 +183,11 @@ export default class ArrayModel extends ModelProxy { let mergedWhere = []; let wheres = [dst.where, src.where]; - for (let where of wheres) { + for (let where of wheres) if (Array.isArray(where)) mergedWhere = mergedWhere.concat(where); else if (where) mergedWhere.push(where); - } switch (mergedWhere.length) { case 0: @@ -220,6 +220,7 @@ ngModule.component('vnArrayModel', { link: '} A JavaScript array with the model data. */ - get data() {} + get data() { + return null; + } /** * Refresh the model data. @@ -43,11 +45,13 @@ ngModule.component('vnDataModel', { * It internally uses the JavaScript Proxy to track changes * made in model rows. * + * @property {Boolean} autoSave Whether to save data automatically when model is modified * @event dataChange Emitted when data property changes * @event dataUpdate Emitted when data property changes * @event rowInsert Emitted when new row is inserted * @event rowRemove Emitted when row is removed * @event rowChange Emitted when row property is changed + * @event save Emitted when data is saved */ export default class ModelProxy extends DataModel { constructor($element, $scope) { @@ -107,6 +111,8 @@ export default class ModelProxy extends DataModel { this.isChanged = true; this.emit('rowRemove', index); this.emit('dataUpdate'); + if (this.autoSave) + this.save(); } /** @@ -139,16 +145,25 @@ export default class ModelProxy extends DataModel { }); return new Proxy(obj, { set: (obj, prop, value) => { - if (prop.charAt(0) !== '$' && value !== obj[prop] && !obj.$isNew) { + let changed = prop.charAt(0) !== '$' && value !== obj[prop] && !obj.$isNew; + if (changed) { if (!obj.$oldData) obj.$oldData = {}; if (!obj.$oldData[prop]) obj.$oldData[prop] = value; this.isChanged = true; + } + + let ret = Reflect.set(obj, prop, value); + + if (changed) { this.emit('rowChange', {obj, prop, value}); this.emit('dataUpdate'); + if (this.autoSave) + this.save(); } - return Reflect.set(obj, prop, value); + + return ret; } }); } @@ -171,7 +186,7 @@ export default class ModelProxy extends DataModel { let orgData = this.orgData; if (!data) return; - for (let row of data) { + for (let row of data) if (row.$isNew) { let orgRow = {}; for (let prop in row) @@ -183,7 +198,6 @@ export default class ModelProxy extends DataModel { } else if (row.$oldData) for (let prop in row.$oldData) row.$orgRow[prop] = row[prop]; - } let removed = this.removed; @@ -197,6 +211,13 @@ export default class ModelProxy extends DataModel { this.resetChanges(); } + /** + * Should be implemented by child classes. + */ + save() { + this.emit('save'); + } + /** * Undoes all changes made to the model data. */ @@ -290,12 +311,16 @@ export class Paginable { /** * @type {Boolean} Whether the model is loading. */ - get isLoading() {} + get isLoading() { + return false; + } /** * @type {Boolean} Whether the data is paginated and there are more rows to load. */ - get moreRows() {} + get moreRows() { + return false; + } /** * When limit is enabled, loads the next set of rows.