[Edit] Undirty objects on refresh

Remove domain objects from the active transaction when they
are refreshed, and use this from the SaveAsAction to prevent
saving unintended changes. Fixes #1046
This commit is contained in:
Victor Woeltjen 2016-06-22 15:32:37 -07:00
parent 5485950130
commit e42b8d22f7
3 changed files with 37 additions and 4 deletions

View File

@ -105,7 +105,8 @@ define(
SaveAsAction.prototype.save = function () {
var self = this,
domainObject = this.domainObject,
copyService = this.copyService;
copyService = this.copyService,
toUndirty = [];
function doWizardSave(parent) {
var wizard = self.createWizard(parent);
@ -127,14 +128,28 @@ define(
}
function allowClone(objectToClone) {
return (objectToClone.getId() === domainObject.getId()) ||
objectToClone.getCapability('location').isOriginal();
var allowed =
(objectToClone.getId() === domainObject.getId()) ||
objectToClone.getCapability('location').isOriginal();
if (allowed) {
toUndirty.push(objectToClone);
}
return allowed;
}
function cloneIntoParent(parent) {
return copyService.perform(domainObject, parent, allowClone);
}
function undirty(domainObject) {
return domainObject.getCapability('persistence').refresh();
}
function undirtyOriginals(object) {
return Promise.all(toUndirty.map(undirty))
.then(resolveWith(object));
}
function commitEditingAfterClone(clonedObject) {
return domainObject.getCapability("editor").save()
.then(resolveWith(clonedObject));
@ -144,6 +159,7 @@ define(
.then(doWizardSave)
.then(getParent)
.then(cloneIntoParent)
.then(undirtyOriginals)
.then(commitEditingAfterClone)
.catch(resolveWith(false));
};

View File

@ -49,6 +49,7 @@ define(
this.domainObject = domainObject;
this.$q = $q;
this.persistPending = false;
this.removeFromTransaction = undefined;
}
/**
@ -75,6 +76,7 @@ define(
});
} else {
self.persistPending = false;
self.removeFromTransaction = undefined;
//Model is undefined in persistence, so return undefined.
return self.$q.when(undefined);
}
@ -82,7 +84,8 @@ define(
if (this.transactionService.isActive()) {
if (!this.persistPending) {
this.transactionService.addToTransaction(onCommit, onCancel);
this.removeFromTransaction = this.transactionService
.addToTransaction(onCommit, onCancel);
this.persistPending = true;
}
//Need to return a promise from this function
@ -93,6 +96,11 @@ define(
};
TransactionalPersistenceCapability.prototype.refresh = function () {
if (this.persistPending) {
this.persistPending = false;
this.removeFromTransaction();
this.removeFromTransaction = undefined;
}
return this.persistenceCapability.refresh();
};

View File

@ -81,6 +81,15 @@ define(
//Log error because this is a programming error if it occurs.
this.$log.error("No transaction in progress");
}
return function () {
this.onCommits = this.onCommits.filter(function (callback) {
return callback !== onCommit;
});
this.onCancels = this.onCancels.filter(function (callback) {
return callback !== onCancel;
});
}.bind(this);
};
/**