ENH: Collection Edit (parity with reading) (#48)
This commit is contained in:
parent
bfae4422f4
commit
cb3bc081a6
19 changed files with 337 additions and 121 deletions
|
@ -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();
|
||||
},
|
||||
});
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue