This commit is contained in:
Gerard 2018-10-30 15:05:19 +01:00
parent a2db6201aa
commit 961f4a30cc
2 changed files with 38 additions and 12 deletions

View File

@ -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: '<?',
order: '@?',
limit: '<?',
autoLoad: '<?'
autoLoad: '<?',
autoSave: '<?'
}
});

View File

@ -11,7 +11,9 @@ export class DataModel extends Component {
/**
* @type {Array<Object>} 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.