mirror of
https://github.com/nasa/openmct.git
synced 2025-06-19 15:43:48 +00:00
[Common UI] Implement mct-scroll-* parent
Implement parent directive for mct-scroll-x, mct-scroll-y. WTD-920.
This commit is contained in:
@ -0,0 +1,57 @@
|
|||||||
|
/*global define*/
|
||||||
|
|
||||||
|
define(
|
||||||
|
[],
|
||||||
|
function () {
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Superclass of mct-scroll-x and mct-scroll-y directives. Listens
|
||||||
|
* for scroll events and publishes their results into scope; watches
|
||||||
|
* scope and updates scroll state to match. This varies for x- and y-
|
||||||
|
* directives only by the attribute name chosen to find the expression,
|
||||||
|
* and the property (scrollLeft or scrollTop) managed within the
|
||||||
|
* element.
|
||||||
|
* @constructor
|
||||||
|
* @param $parse Angular's $parse
|
||||||
|
* @param {string} property property to manage within the HTML element
|
||||||
|
* @param {string} attribute attribute to look at for the assignable
|
||||||
|
* Angular expression
|
||||||
|
*/
|
||||||
|
function MCTScroll($parse, property, attribute) {
|
||||||
|
function link(scope, element, attrs) {
|
||||||
|
var expr = attrs[attribute],
|
||||||
|
parsed = $parse(expr);
|
||||||
|
|
||||||
|
// Set the element's scroll to match the scope's state
|
||||||
|
function updateElement(value) {
|
||||||
|
element[0][property] = value;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Handle event; assign to scroll state to scope
|
||||||
|
function updateScope() {
|
||||||
|
parsed.assign(element[0][property]);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Initialize state in scope
|
||||||
|
updateScope();
|
||||||
|
|
||||||
|
// Update element state when value in scope changes
|
||||||
|
scope.$watch(expr, updateElement);
|
||||||
|
|
||||||
|
// Update state in scope when element is scrolled
|
||||||
|
element.on('scroll', updateScope);
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
// Restrict to attributes
|
||||||
|
restrict: "A",
|
||||||
|
// Use this link function
|
||||||
|
link: link
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
return MCTScroll;
|
||||||
|
|
||||||
|
}
|
||||||
|
);
|
@ -27,7 +27,7 @@ define(
|
|||||||
mockParsed.assign = jasmine.createSpy('assign');
|
mockParsed.assign = jasmine.createSpy('assign');
|
||||||
|
|
||||||
mockScope = jasmine.createSpyObj('$scope', ['$watch']);
|
mockScope = jasmine.createSpyObj('$scope', ['$watch']);
|
||||||
mockElement = [{ scrollLeft: 42 }];
|
mockElement = [{ testProperty: 42 }];
|
||||||
mockElement.on = jasmine.createSpy('on');
|
mockElement.on = jasmine.createSpy('on');
|
||||||
|
|
||||||
mockParse.andReturn(mockParsed);
|
mockParse.andReturn(mockParsed);
|
||||||
@ -57,7 +57,7 @@ define(
|
|||||||
jasmine.any(Function)
|
jasmine.any(Function)
|
||||||
);
|
);
|
||||||
// Should have been only watch (other tests need this to be true)
|
// Should have been only watch (other tests need this to be true)
|
||||||
expect(mockScope.$watch.calls.length).toEqual(0);
|
expect(mockScope.$watch.calls.length).toEqual(1);
|
||||||
});
|
});
|
||||||
|
|
||||||
it("listens for scroll events", function () {
|
it("listens for scroll events", function () {
|
||||||
@ -66,7 +66,7 @@ define(
|
|||||||
jasmine.any(Function)
|
jasmine.any(Function)
|
||||||
);
|
);
|
||||||
// Should have been only listener (other tests need this to be true)
|
// Should have been only listener (other tests need this to be true)
|
||||||
expect(mockElement.on.calls.length).toEqual(0);
|
expect(mockElement.on.calls.length).toEqual(1);
|
||||||
});
|
});
|
||||||
|
|
||||||
it("publishes initial scroll state", function () {
|
it("publishes initial scroll state", function () {
|
||||||
@ -76,12 +76,12 @@ define(
|
|||||||
|
|
||||||
it("updates scroll state when scope changes", function () {
|
it("updates scroll state when scope changes", function () {
|
||||||
mockScope.$watch.mostRecentCall.args[1](64);
|
mockScope.$watch.mostRecentCall.args[1](64);
|
||||||
expect(mockElement[0].scrollLeft).toEqual(64);
|
expect(mockElement[0].testProperty).toEqual(64);
|
||||||
});
|
});
|
||||||
|
|
||||||
it("updates scope when scroll state changes", function () {
|
it("updates scope when scroll state changes", function () {
|
||||||
mockElement[0].scrollLeft = 12321;
|
mockElement[0].testProperty = 12321;
|
||||||
mockElement.on.mostRecentCall.args({ target: mockElement[0] });
|
mockElement.on.mostRecentCall.args[1]({ target: mockElement[0] });
|
||||||
expect(mockParsed.assign).toHaveBeenCalledWith(12321);
|
expect(mockParsed.assign).toHaveBeenCalledWith(12321);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user