[New Edit Mode] #634 Removed edit concerns from MctRepresentation

This commit is contained in:
Henry
2016-05-12 20:23:33 -07:00
parent d08cdfba49
commit a11dba88b2
4 changed files with 45 additions and 46 deletions

View File

@ -32,7 +32,8 @@ define(
*/ */
function InspectorController($scope, policyService) { function InspectorController($scope, policyService) {
var domainObject = $scope.domainObject, var domainObject = $scope.domainObject,
typeCapability = domainObject.getCapability('type'); typeCapability = domainObject.getCapability('type'),
statusListener;
/** /**
* Filters region parts to only those allowed by region policies * Filters region parts to only those allowed by region policies
@ -50,6 +51,11 @@ define(
$scope.regions = filterRegions(typeCapability.getDefinition().inspector || new InspectorRegion()); $scope.regions = filterRegions(typeCapability.getDefinition().inspector || new InspectorRegion());
} }
statusListener = domainObject.getCapability("status").listen(setRegions);
$scope.$on("$destroy", function () {
statusListener();
});
setRegions(); setRegions();
} }

View File

@ -30,6 +30,8 @@ define(
mockTypeCapability, mockTypeCapability,
mockTypeDefinition, mockTypeDefinition,
mockPolicyService, mockPolicyService,
mockStatusCapability,
capabilities = {},
controller; controller;
beforeEach(function(){ beforeEach(function(){
@ -47,19 +49,29 @@ define(
'getDefinition' 'getDefinition'
]); ]);
mockTypeCapability.getDefinition.andReturn(mockTypeDefinition); mockTypeCapability.getDefinition.andReturn(mockTypeDefinition);
capabilities.type = mockTypeCapability;
mockStatusCapability = jasmine.createSpyObj('statusCapability', [
'listen'
]);
capabilities.status = mockStatusCapability;
mockDomainObject = jasmine.createSpyObj('domainObject', [ mockDomainObject = jasmine.createSpyObj('domainObject', [
'getCapability' 'getCapability'
]); ]);
mockDomainObject.getCapability.andReturn(mockTypeCapability); mockDomainObject.getCapability.andCallFake(function (name) {
return capabilities[name];
});
mockPolicyService = jasmine.createSpyObj('policyService', [ mockPolicyService = jasmine.createSpyObj('policyService', [
'allow' 'allow'
]); ]);
mockScope = { mockScope = jasmine.createSpyObj('$scope',
domainObject: mockDomainObject ['$on']
}; );
mockScope.domainObject = mockDomainObject;
}); });
it("filters out regions disallowed by region policy", function() { it("filters out regions disallowed by region policy", function() {
@ -73,6 +85,25 @@ define(
controller = new InspectorController(mockScope, mockPolicyService); controller = new InspectorController(mockScope, mockPolicyService);
expect(mockScope.regions.length).toBe(2); expect(mockScope.regions.length).toBe(2);
}); });
it("Responds to status changes", function() {
mockPolicyService.allow.andReturn(true);
controller = new InspectorController(mockScope, mockPolicyService);
expect(mockScope.regions.length).toBe(2);
expect(mockStatusCapability.listen).toHaveBeenCalled();
mockPolicyService.allow.andReturn(false);
mockStatusCapability.listen.mostRecentCall.args[0]();
expect(mockScope.regions.length).toBe(0);
});
it("Unregisters status listener", function() {
var mockListener = jasmine.createSpy('listener');
mockStatusCapability.listen.andReturn(mockListener);
controller = new InspectorController(mockScope, mockPolicyService);
expect(mockScope.$on).toHaveBeenCalledWith("$destroy", jasmine.any(Function));
mockScope.$on.mostRecentCall.args[1]();
expect(mockListener).toHaveBeenCalled();
});
}); });
} }
); );

View File

@ -88,7 +88,6 @@ define(
toClear = [], // Properties to clear out of scope on change toClear = [], // Properties to clear out of scope on change
counter = 0, counter = 0,
couldRepresent = false, couldRepresent = false,
couldEdit = false,
lastIdPath = [], lastIdPath = [],
lastKey, lastKey,
statusListener, statusListener,
@ -137,14 +136,13 @@ define(
}); });
} }
function unchanged(canRepresent, canEdit, idPath, key) { function unchanged(canRepresent, idPath, key) {
return (canRepresent === couldRepresent) && return (canRepresent === couldRepresent) &&
(key === lastKey) && (key === lastKey) &&
(idPath.length === lastIdPath.length) && (idPath.length === lastIdPath.length) &&
idPath.every(function (id, i) { idPath.every(function (id, i) {
return id === lastIdPath[i]; return id === lastIdPath[i];
}) && });
(canEdit === couldEdit);
} }
function getIdPath(domainObject) { function getIdPath(domainObject) {
@ -168,11 +166,10 @@ define(
representation = lookup($scope.key, domainObject), representation = lookup($scope.key, domainObject),
uses = ((representation || {}).uses || []), uses = ((representation || {}).uses || []),
canRepresent = !!(representation && domainObject), canRepresent = !!(representation && domainObject),
canEdit = !!(domainObject && domainObject.hasCapability('editor') && domainObject.getCapability('editor').inEditContext()),
idPath = getIdPath(domainObject), idPath = getIdPath(domainObject),
key = $scope.key; key = $scope.key;
if (unchanged(canRepresent, canEdit, idPath, key)) { if (unchanged(canRepresent, idPath, key)) {
return; return;
} }
@ -201,7 +198,6 @@ define(
// To allow simplified change detection next time around // To allow simplified change detection next time around
couldRepresent = canRepresent; couldRepresent = canRepresent;
lastIdPath = idPath; lastIdPath = idPath;
couldEdit = canEdit;
lastKey = key; lastKey = key;
// Populate scope with fields associated with the current // Populate scope with fields associated with the current
@ -240,25 +236,6 @@ define(
// (to a different object) // (to a different object)
$scope.$watch("domainObject", refresh); $scope.$watch("domainObject", refresh);
function listenForStatusChange(object) {
if (statusListener) {
statusListener();
}
statusListener = object.getCapability("status").listen(refresh);
}
/**
* Add a listener to the object for status changes.
*/
$scope.$watch("domainObject", function (domainObject, oldDomainObject) {
if (domainObject !== oldDomainObject){
listenForStatusChange(domainObject);
}
});
if ($scope.domainObject) {
listenForStatusChange($scope.domainObject);
}
// Finally, also update when there is a new version of that // Finally, also update when there is a new version of that
// same domain object; these changes should be tracked in the // same domain object; these changes should be tracked in the
// model's "modified" field, by the mutation capability. // model's "modified" field, by the mutation capability.

View File

@ -253,21 +253,6 @@ define(
expect(mockScope.testCapability).toBeUndefined(); expect(mockScope.testCapability).toBeUndefined();
}); });
it("registers a status change listener", function () {
mockScope.$watch.calls[2].args[1](mockDomainObject);
expect(mockStatusCapability.listen).toHaveBeenCalled();
});
it("unlistens for status change on scope destruction", function () {
var mockUnlistener = jasmine.createSpy("unlisten");
mockStatusCapability.listen.andReturn(mockUnlistener);
mockScope.$watch.calls[2].args[1](mockDomainObject);
expect(mockStatusCapability.listen).toHaveBeenCalled();
mockScope.$on.calls[1].args[1]();
expect(mockUnlistener).toHaveBeenCalled();
});
describe("when a domain object has been observed", function () { describe("when a domain object has been observed", function () {
var mockContext, var mockContext,
mockContext2, mockContext2,