mirror of https://github.com/rancher/ui.git
127 lines
2.8 KiB
JavaScript
127 lines
2.8 KiB
JavaScript
import { resolve } from 'rsvp';
|
|
import { alias } from '@ember/object/computed';
|
|
import Mixin from '@ember/object/mixin';
|
|
import Resource from '@rancher/ember-api-store/models/resource';
|
|
import Errors from 'ui/utils/errors';
|
|
import { get, set } from '@ember/object';
|
|
|
|
export default Mixin.create({
|
|
originalModel: null,
|
|
errors: null,
|
|
editing: true,
|
|
primaryResource: alias('model'),
|
|
originalPrimaryResource: alias('originalModel'),
|
|
|
|
tagName: 'form', // This indirectly disables global navigation shortcut keys
|
|
|
|
init() {
|
|
this._super(...arguments);
|
|
|
|
set(this, 'errors', null);
|
|
},
|
|
|
|
validate() {
|
|
var model = get(this, 'primaryResource');
|
|
var errors = model.validationErrors(['appliedSpec']);
|
|
|
|
if ( errors.get('length') ) {
|
|
set(this, 'errors', errors);
|
|
|
|
return false;
|
|
}
|
|
|
|
set(this, 'errors', null);
|
|
|
|
return true;
|
|
},
|
|
|
|
submit(event) {
|
|
event.preventDefault();
|
|
this.send('save');
|
|
},
|
|
|
|
actions: {
|
|
error(err) {
|
|
if (err) {
|
|
var body = Errors.stringify(err);
|
|
|
|
set(this, 'errors', [body]);
|
|
} else {
|
|
set(this, 'errors', null);
|
|
}
|
|
},
|
|
|
|
save(cb) {
|
|
cb = cb || function() {};
|
|
|
|
// Will save can return true/false or a promise
|
|
resolve(this.willSave()).then((ok) => {
|
|
if ( !ok ) {
|
|
// Validation or something else said not to save
|
|
cb(false);
|
|
|
|
return;
|
|
}
|
|
|
|
this.doSave()
|
|
.then(this.didSave.bind(this))
|
|
.then(this.doneSaving.bind(this))
|
|
.then(() => {
|
|
cb(true);
|
|
})
|
|
.catch((err) => {
|
|
if ( this.isDestroyed || this.isDestroying ) {
|
|
return;
|
|
}
|
|
|
|
this.send('error', err);
|
|
this.errorSaving(err);
|
|
cb(false);
|
|
});
|
|
});
|
|
}
|
|
},
|
|
|
|
// willSave happens before save and can stop the save from happening
|
|
willSave() {
|
|
set(this, 'errors', null);
|
|
var ok = this.validate();
|
|
|
|
return ok;
|
|
},
|
|
|
|
doSave(opt) {
|
|
return get(this, 'primaryResource').save(opt).then((newData) => {
|
|
return this.mergeResult(newData);
|
|
});
|
|
},
|
|
|
|
mergeResult(newData) {
|
|
var original = get(this, 'originalPrimaryResource');
|
|
|
|
if ( original ) {
|
|
if ( Resource.detectInstance(original) ) {
|
|
original.merge(newData);
|
|
|
|
return original;
|
|
}
|
|
}
|
|
|
|
return newData;
|
|
},
|
|
|
|
// didSave can be used to do additional saving of dependent resources
|
|
didSave(neu) {
|
|
return neu;
|
|
},
|
|
|
|
// doneSaving happens after didSave
|
|
doneSaving(neu) {
|
|
return neu || get(this, 'originalPrimaryResource') || get(this, 'primaryResource');
|
|
},
|
|
|
|
// errorSaving can be used to do additional cleanup of dependent resources on failure
|
|
errorSaving(/* err*/) {
|
|
},
|
|
});
|