@@ -8,6 +8,16 @@ angular.module('material.components.slider', [
8
8
. directive ( 'mdSlider' , SliderDirective )
9
9
. directive ( 'mdSliderContainer' , SliderContainerDirective ) ;
10
10
11
+ /**
12
+ * @type {number } the page size used for stepping when page up/down keys are pressed.
13
+ */
14
+ var stepPageSize = 10 ;
15
+ /**
16
+ * @type {number } the multiplier applied to a step when the arrow key is pressed along with
17
+ * alt, meta, or ctrl.
18
+ */
19
+ var modifierMultiplier = 4 ;
20
+
11
21
/**
12
22
* @ngdoc directive
13
23
* @name mdSliderContainer
@@ -78,6 +88,9 @@ function SliderContainerDirective() {
78
88
79
89
var initialMaxWidth ;
80
90
91
+ /**
92
+ * @param {number } length of the input's string value
93
+ */
81
94
ctrl . fitInputWidthToTextLength = function ( length ) {
82
95
var input = element [ 0 ] . querySelector ( 'md-input-container' ) ;
83
96
@@ -109,16 +122,22 @@ function SliderContainerDirective() {
109
122
* the slider is in the accent color by default. The primary color palette may be used with
110
123
* the `md-primary` class.
111
124
*
112
- * It has two modes:
125
+ * The slider has two modes:
113
126
* - "normal" mode where the user slides between a wide range of values
114
127
* - "discrete" mode where the user slides between only a few select values
115
128
*
116
129
* To enable discrete mode, add the `md-discrete` attribute to a slider
117
130
* and use the `step` attribute to change the distance between
118
131
* values the user is allowed to pick.
119
132
*
120
- * When using the keyboard, holding the Meta, Control, or Alt key while pressing the left
121
- * and right arrow buttons will cause the slider to move 4 steps.
133
+ * When using the keyboard:
134
+ * - pressing the arrow keys will increase or decrease the slider's value by one step
135
+ * - holding the Meta, Control, or Alt key while pressing the arrow keys will
136
+ * move the slider four steps at a time
137
+ * - pressing the Home key will move the slider to the first allowed value
138
+ * - pressing the End key will move the slider to the last allowed value
139
+ * - pressing the Page Up key will increase the slider value by ten
140
+ * - pressing the Page Down key will decrease the slider value by ten
122
141
*
123
142
* @usage
124
143
* <h4>Normal Mode</h4>
@@ -382,29 +401,63 @@ function SliderDirective($$rAF, $window, $mdAria, $mdUtil, $mdConstant, $mdThemi
382
401
383
402
/**
384
403
* left/right/up/down arrow listener
404
+ * @param {!KeyboardEvent } ev
385
405
*/
386
406
function keydownListener ( ev ) {
387
407
if ( isDisabled ( ) ) return ;
408
+ var keyCodes = $mdConstant . KEY_CODE ;
388
409
389
410
var changeAmount ;
390
- if ( vertical ? ev . keyCode === $mdConstant . KEY_CODE . DOWN_ARROW : ev . keyCode === $mdConstant . KEY_CODE . LEFT_ARROW ) {
391
- changeAmount = - step ;
392
- } else if ( vertical ? ev . keyCode === $mdConstant . KEY_CODE . UP_ARROW : ev . keyCode === $mdConstant . KEY_CODE . RIGHT_ARROW ) {
393
- changeAmount = step ;
411
+ switch ( ev . keyCode ) {
412
+ case keyCodes . DOWN_ARROW :
413
+ case keyCodes . LEFT_ARROW :
414
+ ev . preventDefault ( ) ;
415
+ changeAmount = - step ;
416
+ break ;
417
+ case keyCodes . UP_ARROW :
418
+ case keyCodes . RIGHT_ARROW :
419
+ ev . preventDefault ( ) ;
420
+ changeAmount = step ;
421
+ break ;
422
+ case keyCodes . PAGE_DOWN :
423
+ ev . preventDefault ( ) ;
424
+ changeAmount = - step * stepPageSize ;
425
+ break ;
426
+ case keyCodes . PAGE_UP :
427
+ ev . preventDefault ( ) ;
428
+ changeAmount = step * stepPageSize ;
429
+ break ;
430
+ case keyCodes . HOME :
431
+ ev . preventDefault ( ) ;
432
+ ev . stopPropagation ( ) ;
433
+ updateValue ( min ) ;
434
+ break ;
435
+ case keyCodes . END :
436
+ ev . preventDefault ( ) ;
437
+ ev . stopPropagation ( ) ;
438
+ updateValue ( max ) ;
439
+ break ;
394
440
}
395
- changeAmount = invert ? - changeAmount : changeAmount ;
396
441
if ( changeAmount ) {
442
+ changeAmount = invert ? - changeAmount : changeAmount ;
397
443
if ( ev . metaKey || ev . ctrlKey || ev . altKey ) {
398
- changeAmount *= 4 ;
444
+ changeAmount *= modifierMultiplier ;
399
445
}
400
446
ev . preventDefault ( ) ;
401
447
ev . stopPropagation ( ) ;
402
- scope . $evalAsync ( function ( ) {
403
- setModelValue ( ngModelCtrl . $viewValue + changeAmount ) ;
404
- } ) ;
448
+ updateValue ( ngModelCtrl . $viewValue + changeAmount ) ;
405
449
}
406
450
}
407
451
452
+ /**
453
+ * @param value new slider value used for setting the model value
454
+ */
455
+ function updateValue ( value ) {
456
+ scope . $evalAsync ( function ( ) {
457
+ setModelValue ( value ) ;
458
+ } ) ;
459
+ }
460
+
408
461
function mouseDownListener ( ) {
409
462
redrawTicks ( ) ;
410
463
@@ -462,7 +515,7 @@ function SliderDirective($$rAF, $window, $mdAria, $mdUtil, $mdConstant, $mdThemi
462
515
var formattedValue = ( Math . round ( ( value - min ) / step ) * step + min ) ;
463
516
formattedValue = ( Math . round ( formattedValue * Math . pow ( 10 , round ) ) / Math . pow ( 10 , round ) ) ;
464
517
465
- if ( containerCtrl && containerCtrl . fitInputWidthToTextLength ) {
518
+ if ( containerCtrl && containerCtrl . fitInputWidthToTextLength ) {
466
519
$mdUtil . debounce ( function ( ) {
467
520
containerCtrl . fitInputWidthToTextLength ( formattedValue . toString ( ) . length ) ;
468
521
} , 100 ) ( ) ;
@@ -473,7 +526,7 @@ function SliderDirective($$rAF, $window, $mdAria, $mdUtil, $mdConstant, $mdThemi
473
526
}
474
527
475
528
/**
476
- * @param percent 0-1
529
+ * @param { number } percent 0-1
477
530
*/
478
531
function setSliderPercent ( percent ) {
479
532
0 commit comments