angularjs-slider
Version:
AngularJS slider directive with no external dependencies. Mobile friendly!.
308 lines (276 loc) • 7.54 kB
JavaScript
;(function() {
'use strict'
var helperModule = angular.module('test-helper', ['rzSlider', 'appTemplates'])
helperModule.factory('TestHelper', function(
RzSlider,
RzSliderOptions,
$rootScope,
$compile,
$timeout,
$window,
$document
) {
var h = {
element: null,
scope: null,
parent: null,
}
h.createSlider = function(sliderObj) {
var template = ''
var optionsExpression = sliderObj.optionsExpression || 'slider.options'
if (sliderObj.options || sliderObj.optionsExpression)
template =
'<rzslider rz-slider-model="slider.value" rz-slider-options="' +
optionsExpression +
'"></rzslider>'
else template = '<rzslider rz-slider-model="slider.value"></rzslider>'
h.initSlider(sliderObj, template)
}
h.createRangeSlider = function(sliderObj) {
var template = ''
var optionsExpression = sliderObj.optionsExpression || 'slider.options'
if (sliderObj.options || sliderObj.optionsExpression)
template =
'<rzslider rz-slider-model="slider.min" rz-slider-high="slider.max"' +
'rz-slider-options="' +
optionsExpression +
'"></rzslider>'
else
template =
'<rzslider rz-slider-model="slider.min" rz-slider-high="slider.max"></rzslider>'
h.initSlider(sliderObj, template)
}
h.createRangeSliderWithCustomTemplate = function(sliderObj, templateUrl) {
var template = ''
var optionsExpression = sliderObj.optionsExpression || 'slider.options'
if (sliderObj.options || sliderObj.optionsExpression)
template =
'<rzslider rz-slider-model="slider.min"' +
' rz-slider-high="slider.max"' +
' rz-slider-options="' +
optionsExpression +
'" rz-slider-tpl-url="' +
templateUrl +
'"></rzslider>'
else
template =
'<rzslider rz-slider-model="slider.min" rz-slider-high="slider.max"></rzslider>'
h.initSlider(sliderObj, template)
}
h.initSlider = function(sliderObj, template) {
h.scope = $rootScope.$new()
h.scope.slider = sliderObj
h.parent = angular.element(
'<div style="width: 1000px; height:1000px;"></div>'
)
h.element = $compile(template)(h.scope)
h.parent.append(h.element)
angular
.element(document)
.find('body')
.append(h.parent)
h.scope.$digest()
h.slider = h.element.isolateScope().slider
}
h.clean = function() {
//simulate to $destroy event to clean everything
if (h.scope) h.scope.$broadcast('$destroy')
//clean the element we append at each test
if (h.parent) h.parent.remove()
}
h.fireMousedown = function(element, position, vertical) {
var positionProp = vertical ? 'clientY' : 'clientX'
var event = {
type: 'mousedown',
preventDefault: sinon.stub(),
stopPropagation: sinon.stub(),
}
event[positionProp] = position
element.triggerHandler(event)
return event
}
h.fireMousemove = function(position, vertical) {
var positionProp = vertical ? 'clientY' : 'clientX'
var event = {
type: 'mousemove',
}
event[positionProp] = position
$document.triggerHandler(event)
}
h.fireMouseup = function() {
var event = {
type: 'mouseup',
}
$document.triggerHandler(event)
}
h.fireTouchstartWithOriginalEvent = function(
element,
position,
touchIdentifier,
touchesIds,
vertical
) {
var event = {
type: 'touchstart',
originalEvent: this.getTouchEvent(
'touchstart',
position,
vertical,
touchIdentifier,
touchesIds,
sinon.stub()
),
}
element.triggerHandler(event)
return event
}
h.fireTouchstartWithoutOriginalEvent = function(
element,
position,
touchIdentifier,
touchesIds,
vertical
) {
var event = this.getTouchEvent(
'touchstart',
position,
vertical,
touchIdentifier,
touchesIds,
sinon.stub()
)
element.triggerHandler(event)
return event
}
h.fireTouchmoveWithOriginalEvent = function(
position,
touchIdentifier,
touchesIds,
vertical
) {
var event = {
type: 'touchmove',
originalEvent: this.getTouchEvent(
'touchmove',
position,
vertical,
touchIdentifier,
touchesIds
),
}
$document.triggerHandler(event)
return event
}
h.fireTouchmoveWithoutOriginalEvent = function(
position,
touchIdentifier,
touchesIds,
vertical
) {
var event = this.getTouchEvent(
'touchmove',
position,
vertical,
touchIdentifier,
touchesIds
)
$document.triggerHandler(event)
return event
}
h.fireTouchendWithOriginalEvent = function(
touchIdentifier,
touchesIds,
vertical
) {
var event = {
type: 'touchend',
originalEvent: this.getTouchEvent(
'touchend',
0,
vertical,
touchIdentifier,
touchesIds
),
}
$document.triggerHandler(event)
return event
}
h.fireTouchendWithoutOriginalEvent = function(
touchIdentifier,
touchesIds,
vertical
) {
var event = this.getTouchEvent(
'touchend',
0,
vertical,
touchIdentifier,
touchesIds
)
$document.triggerHandler(event)
return event
}
h.getTouchEvent = function(
type,
position,
vertical,
changedTouchId,
touchesIds,
preventDefaultAndStopPropagation
) {
var positionProp = vertical ? 'clientY' : 'clientX'
var changedTouches = [{ identifier: changedTouchId }]
changedTouches[0][positionProp] = position
var touches = []
for (var i = 0; i < touchesIds.length; i++) {
var touch = { identifier: touchesIds[i] }
if (touch.identifier == changedTouchId) {
touch[positionProp] = position
}
touches.push(touch)
}
var originalEvent = {
type: type,
preventDefault: preventDefaultAndStopPropagation,
stopPropagation: preventDefaultAndStopPropagation,
changedTouches: changedTouches,
touches: touches,
}
return originalEvent
}
h.pressKeydown = function(element, key, options) {
options = options || {}
key = key.toUpperCase()
var event = {
type: 'keydown',
}
var keys = {
UP: 38,
DOWN: 40,
LEFT: 37,
RIGHT: 39,
PAGEUP: 33,
PAGEDOWN: 34,
HOME: 36,
END: 35,
SPACE: 32,
}
var keyCode = keys[key]
if (options.oldAPI) event.which = keyCode
else event.keyCode = keyCode
element.triggerHandler(event)
if (options.timeout !== false) $timeout.flush()
}
h.getMousePosition = function(value) {
return (
h.slider.valueToPosition(value) +
h.slider.handleHalfDim +
h.slider.sliderElem.rzsp
)
}
h.moveMouseToValue = function(value) {
h.fireMousemove(h.getMousePosition(value))
}
return h
})
})()