ENH: Collection Edit (parity with reading) (#48)

This commit is contained in:
Matthew Ryan Dillon 2017-11-30 15:51:16 -07:00 committed by GitHub
parent bfae4422f4
commit cb3bc081a6
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
19 changed files with 337 additions and 121 deletions

View file

@ -1,30 +1,70 @@
import Ember from 'ember';
const { Mixin, get } = Ember;
const { Mixin, get, RSVP } = Ember;
const { keys } = Object;
const { isArray } = Array;
export default Mixin.create({
validationSave(changeset, schema, postSave) {
return changeset
.cast(keys(schema))
.validate()
.then(() => {
if (changeset.get('isValid')) {
return changeset.save().then(postSave);
validationSave(changesets, postSave) {
let promises = [], changes = [], saves = [], isValid = true;
let modelChangeset = changesets['model'];
// first, delete anything that needs to be removed
for (const model of changesets['delete']) {
promises.push(model.destroyRecord());
}
// second, handle changes on parent model (this is important if new)
modelChangeset.validate().then(() => {
if (modelChangeset.get('isValid')) {
return modelChangeset.save();
}
}).then(() => {
for (const hasMany of keys(changesets['hasMany'])) {
for (const { changeset } of changesets['hasMany'][hasMany]) {
promises.push(changeset.validate());
changes.push(changeset);
}
})
.catch((error) => {
/* eslint-disable no-console */
console.log(error);
/* eslint-enable no-console */
get(this, 'model.errors').forEach(({ attribute, message }) => {
changeset.pushErrors(attribute, message);
});
});
}
return RSVP.all(promises);
}).then(() => { // don't need the promises, just that they are done.
for (let changeset of changes) {
if (get(changeset, 'isValid')) {
let saver = changeset.save().catch((error) => {
/* eslint-disable no-console */
console.log(error);
/* eslint-enable no-console */
// TODO: do something with server-side non-attr errors
});
saves.push(saver);
} else {
isValid = false;
}
}
return RSVP.all(saves);
}).then(() => {
if (isValid) { return postSave(); }
});
},
validationCancel(changeset, postCancel) {
changeset.rollback();
return postCancel();
validationCancel(changesets, postCancel) {
delete changesets['delete'];
for (const key of keys(changesets)) {
if (key === 'new') {
for (const model of changesets[key]) {
model.destroyRecord();
}
} else if (isArray(changesets[key])) { // hasMany
for (const { changeset } of changesets[key]) {
changeset.rollback();
}
} else { // single
const changeset = changesets[key];
changeset.rollback();
}
}
return postCancel();
},
});