Compare commits

...

2 Commits

Author SHA1 Message Date
Henry
f5c194a854 [New Edit Mode] Fixed adding activities to timelines 2016-01-18 18:18:10 -08:00
Henry
76aecf148f Refactoring to fix timelines 2016-01-14 14:18:40 -08:00
6 changed files with 71 additions and 80 deletions

View File

@@ -99,7 +99,11 @@ define(
model.location = parentObject.getId();
});
if (countEditableViews(editableObject) > 0 && editableObject.hasCapability('composition')) {
/* Navigate immediately to new object if it has an editable
view and is not a sub-object of the currently editing object */
if (countEditableViews(editableObject) > 0
&& editableObject.hasCapability('composition')
&& !parentObject.getCapability('status').get('editing')) {
this.navigationService.setNavigation(editableObject);
} else {
return editableObject.getCapability('action').perform('save');

View File

@@ -34,10 +34,11 @@ define(
* @memberof platform/commonUI/browse
* @constructor
*/
function CreateWizard(type, parent, policyService, initialModel) {
this.type = type;
this.model = initialModel || type.getInitialModel();
this.properties = type.getProperties();
function CreateWizard(parent, policyService, domainObject) {
this.type = domainObject.getCapability('type');
this.model = domainObject.getModel();
this.domainObject = domainObject;
this.properties = this.type.getProperties();
this.parent = parent;
this.policyService = policyService;
}
@@ -117,6 +118,27 @@ define(
return formValue;
};
/**
* Given a form with values to populate in a model, populate the
* model in wrapped domain object and return it.
* @param formValue the form model (returned from the
* {@link DialogService})
* @returns {DomainObject}
*/
CreateWizard.prototype.buildObjectFromInput = function(formValue) {
var parent = this.getLocation(formValue),
formModel = this.createModel(formValue);
formModel.location = parent.getId();
//Replace domain object model with model collected
// from user form.
this.domainObject.useCapability("mutation", function(){
//Replace object model with the model from the form
return formModel;
});
return this.domainObject;
}
/**
* Based on a populated form, get the domain object which
* should be used as a parent for the newly-created object.

View File

@@ -72,9 +72,8 @@
"implementation": "actions/SaveAction.js",
"name": "Save",
"description": "Save changes made to these objects.",
"depends": [ "$q", "$location", "$injector", "urlService",
"navigationService", "policyService", "dialogService",
"creationService" ],
"depends": [ "$q", "$injector", "navigationService",
"policyService", "dialogService" ],
"priority": "mandatory"
},
{

View File

@@ -23,7 +23,9 @@
define(
['../../../browse/src/creation/CreateWizard'],
[
'../../../browse/src/creation/CreateWizard'
],
function (CreateWizard) {
'use strict';
@@ -35,17 +37,14 @@ define(
* @implements {Action}
* @memberof platform/commonUI/edit
*/
function SaveAction($q, $location, $injector, urlService, navigationService, policyService, dialogService, creationService, context) {
function SaveAction($q, $injector, navigationService, policyService, dialogService, context) {
this.domainObject = (context || {}).domainObject;
this.$location = $location;
this.injectObjectService = function(){
this.objectService = $injector.get("objectService");
};
this.urlService = urlService;
this.navigationService = navigationService;
this.policyService = policyService;
this.dialogService = dialogService;
this.creationService = creationService;
this.$q = $q;
}
@@ -66,8 +65,7 @@ define(
*/
SaveAction.prototype.perform = function () {
var domainObject = this.domainObject,
$location = this.$location,
urlService = this.urlService,
isNewObject = !(domainObject.getModel().persisted),
self = this;
function resolveWith(object){
@@ -78,65 +76,23 @@ define(
function doWizardSave(parent) {
var context = domainObject.getCapability("context"),
wizard = new CreateWizard(domainObject.useCapability('type'), parent, self.policyService, domainObject.getModel());
wizard = new CreateWizard(parent, self.policyService, domainObject);
function mergeObjects(fromObject, toObject){
Object.keys(fromObject).forEach(function(key) {
toObject[key] = fromObject[key];
});
}
// Create and persist the new object, based on user
// input.
function buildObjectFromInput(formValue) {
var parent = wizard.getLocation(formValue),
formModel = wizard.createModel(formValue);
formModel.location = parent.getId();
//Replace domain object model with model collected
// from user form.
domainObject.useCapability("mutation", function(){
//Replace object model with the model from the form
return formModel;
});
return domainObject;
}
function getAllComposees(domainObject){
return domainObject.useCapability('composition');
}
function addComposeesToObject(object){
return function(composees){
return self.$q.all(composees.map(function (composee) {
return object.getCapability('composition').add(composee);
})).then(resolveWith(object));
};
}
/**
* Add the composees of the 'virtual' object to the
* persisted object
* @param object
* @returns {*}
*/
function composeNewObject(object){
if (self.$q.when(object.hasCapability('composition') && domainObject.hasCapability('composition'))) {
return getAllComposees(domainObject)
.then(addComposeesToObject(object));
}
}
return self.dialogService
.getUserInput(wizard.getFormStructure(), wizard.getInitialFormValue())
.then(buildObjectFromInput);
.then(function(formValue) {
return wizard.buildObjectFromInput(formValue);
});
}
function persistObject(object){
return ((object.hasCapability('editor') && object.getCapability('editor').save(true)) ||
object.getCapability('persistence').persist())
.then(resolveWith(object));
if (object.hasCapability('editor')) {
return object.getCapability('editor').save(true);
} else {
return object.getCapability('persistence').persist();
}
}
function fetchObject(objectId){
@@ -146,11 +102,19 @@ define(
}
function getParent(object){
return fetchObject(object.getModel().location);
//Skip lookup if parent is the navigated object
if (object.getModel().location === self.navigationService.getNavigation().getId()){
return self.$q.when(self.navigationService.getNavigation());
} else {
return fetchObject(object.getModel().location);
}
}
function locateObjectInParent(parent){
parent.getCapability('composition').add(domainObject.getId());
if (!parent.getCapability('status').get('editing')){
persistObject(parent);
}
return parent;
}
@@ -164,21 +128,14 @@ define(
// used to insulate underlying objects from changes made
// during editing.
function doSave() {
//WARNING: HACK
//This is a new 'virtual object' that has not been persisted
// yet.
if (!domainObject.getModel().persisted){
if (isNewObject){
return getParent(domainObject)
.then(doWizardSave)
.then(persistObject)
.then(getParent)//Parent may have changed based
// on user selection
.then(locateObjectInParent)
.then(persistObject)
.then(function(){
return fetchObject(domainObject.getId());
})
.catch(doNothing)
.catch(doNothing)
} else {
return domainObject.getCapability("editor").save()
.then(resolveWith(domainObject.getOriginalObject()));
@@ -188,8 +145,11 @@ define(
// Discard the current root view (which will be the editing
// UI, which will have been pushed atop the Browse UI.)
function returnToBrowse(object) {
if (object) {
self.navigationService.setNavigation(object);
//Navigate to non-editable version of object. But first
// check if parent is being edited (ie. this was a
// sub-object creation)
if (object && !object.getCapability('status').get('editing')) {
self.navigationService.setNavigation(object.hasCapability('editor') ? object.getOriginalObject() : object);
}
return object;
}

View File

@@ -98,9 +98,12 @@ define(
editableObject.getCapability("status").set("editing", false);
return nonrecursive ?
return (nonrecursive ?
resolvePromise(doMutate()).then(doPersist).then(function(){self.cancel();}) :
resolvePromise(cache.saveAll());
resolvePromise(cache.saveAll()))
.then(function(){
return domainObject;
});
};
/**

View File

@@ -101,6 +101,9 @@ define(
// Recalculate swimlane state on changes
$scope.$watch("domainObject", swimlanePopulator.populate);
$scope.$watchCollection("domainObject.model.composition", function(){
swimlanePopulator.populate($scope.domainObject);
});
// Also recalculate whenever anything in view is modified
$scope.$watch(modificationSum, repopulateSwimlanes);