diff --git a/platform/commonUI/edit/src/actions/SaveAsAction.js b/platform/commonUI/edit/src/actions/SaveAsAction.js index 03022be049..57a055429a 100644 --- a/platform/commonUI/edit/src/actions/SaveAsAction.js +++ b/platform/commonUI/edit/src/actions/SaveAsAction.js @@ -111,7 +111,8 @@ define([ var self = this, domainObject = this.domainObject, copyService = this.copyService, - dialog = new SaveInProgressDialog(this.dialogService); + dialog = new SaveInProgressDialog(this.dialogService), + toUndirty = []; function doWizardSave(parent) { var wizard = self.createWizard(parent); @@ -143,14 +144,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(object) { + return object.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)); @@ -166,6 +181,7 @@ define([ .then(showBlockingDialog) .then(getParent) .then(cloneIntoParent) + .then(undirtyOriginals) .then(commitEditingAfterClone) .then(hideBlockingDialog) .catch(onFailure); diff --git a/platform/commonUI/edit/src/capabilities/TransactionalPersistenceCapability.js b/platform/commonUI/edit/src/capabilities/TransactionalPersistenceCapability.js index a85e177f9e..492cd636b1 100644 --- a/platform/commonUI/edit/src/capabilities/TransactionalPersistenceCapability.js +++ b/platform/commonUI/edit/src/capabilities/TransactionalPersistenceCapability.js @@ -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(); }; diff --git a/platform/commonUI/edit/src/services/TransactionService.js b/platform/commonUI/edit/src/services/TransactionService.js index 0a7f148853..119e314b17 100644 --- a/platform/commonUI/edit/src/services/TransactionService.js +++ b/platform/commonUI/edit/src/services/TransactionService.js @@ -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); }; /** diff --git a/platform/core/src/capabilities/PersistenceCapability.js b/platform/core/src/capabilities/PersistenceCapability.js index e58d569005..275080368b 100644 --- a/platform/core/src/capabilities/PersistenceCapability.js +++ b/platform/core/src/capabilities/PersistenceCapability.js @@ -152,6 +152,10 @@ define( }, modified); } + if (domainObject.getModel().persisted === undefined) { + return this.$q.when(true); + } + return this.persistenceService.readObject( this.getSpace(), this.getKey() diff --git a/platform/core/test/capabilities/PersistenceCapabilitySpec.js b/platform/core/test/capabilities/PersistenceCapabilitySpec.js index 0947a7bef7..5dc8486401 100644 --- a/platform/core/test/capabilities/PersistenceCapabilitySpec.js +++ b/platform/core/test/capabilities/PersistenceCapabilitySpec.js @@ -74,7 +74,7 @@ define( ); mockQ = jasmine.createSpyObj( "$q", - ["reject"] + ["reject", "when"] ); mockNofificationService = jasmine.createSpyObj( "notificationService", @@ -103,6 +103,7 @@ define( mockIdentifierService.parse.andReturn(mockIdentifier); mockIdentifier.getSpace.andReturn(SPACE); mockIdentifier.getKey.andReturn(key); + mockQ.when.andCallFake(asPromise); persistence = new PersistenceCapability( mockCacheService, mockPersistenceService, @@ -156,6 +157,7 @@ define( }); it("refreshes the domain object model from persistence", function () { var refreshModel = {someOtherKey: "some other value"}; + model.persisted = 1; mockPersistenceService.readObject.andReturn(asPromise(refreshModel)); persistence.refresh(); expect(model).toEqual(refreshModel);