@@ -2,7 +2,8 @@ import { CommonModule } from '@angular/common';
22import {
33 AfterViewInit , Component , ElementRef , EventEmitter ,
44 forwardRef , HostBinding , Input , NgModule , OnInit , Output , Renderer2 ,
5- ViewChild
5+ ViewChild ,
6+ TemplateRef
67} from '@angular/core' ;
78import { ControlValueAccessor , NG_VALUE_ACCESSOR } from '@angular/forms' ;
89import { EditorProvider } from '../core/edit-provider' ;
@@ -28,9 +29,14 @@ export interface IRangeSliderValue {
2829 upper : number ;
2930}
3031
32+ export interface IRangeSliderValueLabel {
33+ left : string ;
34+ right : string ;
35+ }
36+
3137export interface ISliderValueChangeEventArgs {
32- oldValue : number | IRangeSliderValue ;
33- value : number | IRangeSliderValue ;
38+ oldValue : number | string | IRangeSliderValue | IRangeSliderValueLabel ;
39+ value : number | string | IRangeSliderValue | IRangeSliderValueLabel ;
3440}
3541
3642const noop = ( ) => {
@@ -65,6 +71,9 @@ let NEXT_ID = 0;
6571} )
6672export class IgxSliderComponent implements ControlValueAccessor , EditorProvider , OnInit , AfterViewInit {
6773
74+ private _step = 1 ;
75+ private _oldValue ;
76+
6877 /**
6978 * An @Input property that sets the value of the `id` attribute.
7079 * If not provided it will be automatically generated.
@@ -117,6 +126,10 @@ export class IgxSliderComponent implements ControlValueAccessor, EditorProvider,
117126 @Input ( )
118127 public thumbLabelVisibilityDuration = 750 ;
119128
129+
130+ @Input ( )
131+ public stepLabels : [ ] = [ ] ;
132+
120133 /**
121134 * An @Input property that sets the incremental/decremental step of the value when dragging the thumb.
122135 * The default step is 1, and step should not be less or equal than 0.
@@ -125,7 +138,17 @@ export class IgxSliderComponent implements ControlValueAccessor, EditorProvider,
125138 * ```
126139 */
127140 @Input ( )
128- public step = 1 ;
141+ public set step ( step : number ) {
142+ this . _step = step ;
143+ }
144+
145+ public get step ( ) {
146+ if ( this . stepLabels . length > 0 ) {
147+ return 1 ;
148+ }
149+
150+ return this . _step ;
151+ }
129152
130153 /**
131154 * This event is emitted when user has stopped interacting the thumb and value is changed.
@@ -163,7 +186,6 @@ export class IgxSliderComponent implements ControlValueAccessor, EditorProvider,
163186 @ViewChild ( 'thumbTo' )
164187 private thumbTo : ElementRef ;
165188
166-
167189 // Measures & Coordinates
168190 private width = 0 ;
169191 private xOffset = 0 ;
@@ -220,6 +242,10 @@ export class IgxSliderComponent implements ControlValueAccessor, EditorProvider,
220242 * ```
221243 */
222244 public get maxValue ( ) : number {
245+ if ( this . labelsViewEnabled ) {
246+ return this . stepLabels . length - 1 ;
247+ }
248+
223249 return this . _maxValue ;
224250 }
225251
@@ -255,6 +281,10 @@ export class IgxSliderComponent implements ControlValueAccessor, EditorProvider,
255281 *```
256282 */
257283 public get minValue ( ) : number {
284+ if ( this . labelsViewEnabled ) {
285+ return 0 ;
286+ }
287+
258288 return this . _minValue ;
259289 }
260290
@@ -429,7 +459,10 @@ export class IgxSliderComponent implements ControlValueAccessor, EditorProvider,
429459 *}
430460 *```
431461 */
432- public get value ( ) : number | IRangeSliderValue {
462+ public get value ( ) : number | string | IRangeSliderValue | IRangeSliderValueLabel {
463+ // if (this.labelsViewEnabled) {
464+ // return this.getLabelValues(this.lowerValue, this.upperValue);
465+ // }
433466 if ( this . isRange ) {
434467 return {
435468 lower : this . snapValueToStep ( this . lowerValue ) ,
@@ -459,7 +492,11 @@ export class IgxSliderComponent implements ControlValueAccessor, EditorProvider,
459492 * ```
460493 */
461494 @Input ( )
462- public set value ( value : number | IRangeSliderValue ) {
495+ public set value ( value : number | string | IRangeSliderValue | IRangeSliderValueLabel ) {
496+ if ( this . labelsViewEnabled ) {
497+ value = this . getLabelIndexes ( value ) ;
498+ }
499+
463500 if ( ! this . isRange ) {
464501 this . upperValue = this . snapValueToStep ( value as number ) ;
465502 } else {
@@ -476,6 +513,28 @@ export class IgxSliderComponent implements ControlValueAccessor, EditorProvider,
476513 }
477514 }
478515
516+ public get labelsViewEnabled ( ) {
517+ return ! ! this . stepLabels . length ;
518+ }
519+
520+ public get lowerLabel ( ) {
521+ return this . labelsViewEnabled ?
522+ this . stepLabels [ this . lowerValue ] :
523+ this . lowerValue ;
524+ }
525+
526+ public get upperLabel ( ) {
527+ return this . labelsViewEnabled ?
528+ this . stepLabels [ this . upperValue ] :
529+ this . upperValue ;
530+ }
531+
532+ public get valueLabel ( ) {
533+ return this . labelsViewEnabled ?
534+ this . stepLabels [ this . upperValue ] :
535+ this . value ;
536+ }
537+
479538 /**
480539 * @hidden
481540 */
@@ -520,7 +579,7 @@ export class IgxSliderComponent implements ControlValueAccessor, EditorProvider,
520579 public ngAfterViewInit ( ) {
521580 this . hasViewInit = true ;
522581 this . positionHandlesAndUpdateTrack ( ) ;
523- this . setTickInterval ( ) ;
582+ this . setTickInterval ( this . stepLabels . length ) ;
524583 }
525584
526585 /**
@@ -552,7 +611,11 @@ export class IgxSliderComponent implements ControlValueAccessor, EditorProvider,
552611 /**
553612 * @hidden
554613 */
555- public showThumbsLabels ( ) {
614+ public showThumbsLabels ( evt ) {
615+ if ( evt ) {
616+ this . _oldValue = this . value ;
617+ }
618+
556619 if ( this . disabled ) {
557620 return ;
558621 }
@@ -589,7 +652,9 @@ export class IgxSliderComponent implements ControlValueAccessor, EditorProvider,
589652 */
590653 public onPanEnd ( $event ) {
591654 this . hideThumbsLabels ( ) ;
592- this . emitValueChanged ( null ) ;
655+ if ( this . hasValueChanged ( this . _oldValue ) ) {
656+ this . emitValueChanged ( this . _oldValue ) ;
657+ }
593658 }
594659 /**
595660 *
@@ -621,7 +686,8 @@ export class IgxSliderComponent implements ControlValueAccessor, EditorProvider,
621686 return ;
622687 }
623688
624- const value = this . value ;
689+ // const value = this.value;
690+ this . _oldValue = this . value ;
625691
626692 if ( this . isRange ) {
627693 if ( this . activeHandle === SliderHandle . FROM ) {
@@ -653,25 +719,25 @@ export class IgxSliderComponent implements ControlValueAccessor, EditorProvider,
653719 this . value = this . value as number + incrementSign * this . step ;
654720 }
655721
656- if ( this . hasValueChanged ( value ) ) {
657- this . emitValueChanged ( value ) ;
722+ if ( this . hasValueChanged ( this . _oldValue ) ) {
723+ this . emitValueChanged ( this . _oldValue ) ;
658724 }
659725
660- this . showThumbsLabels ( ) ;
726+ this . showThumbsLabels ( null ) ;
661727 }
662728 /**
663729 *
664730 * @hidden
665731 */
666732 public onTap ( $event ) {
667- const value = this . value ;
733+ // const value = this.value;
734+ this . _oldValue = this . value ;
668735 this . update ( $event ) ;
669736
670- if ( this . hasValueChanged ( value ) ) {
671- this . emitValueChanged ( value ) ;
737+ if ( this . hasValueChanged ( this . _oldValue ) ) {
738+ this . emitValueChanged ( this . _oldValue ) ;
672739 }
673740 }
674-
675741 /**
676742 *
677743 * @hidden
@@ -829,12 +895,18 @@ export class IgxSliderComponent implements ControlValueAccessor, EditorProvider,
829895 }
830896 }
831897
832- private setTickInterval ( ) {
898+ private setTickInterval ( stepLabels ) {
833899 if ( this . isContinuous ) {
834900 return ;
835901 }
836902
837- const interval = this . step > 1 ? this . step : null ;
903+ let interval ;
904+ if ( stepLabels ) {
905+ // Calc ticks depending on the labels length;
906+ interval = ( ( 100 / ( stepLabels - 1 ) * 10 ) ) / 10 ;
907+ } else {
908+ interval = this . step > 1 ? this . step : null ;
909+ }
838910 this . renderer . setStyle ( this . ticks . nativeElement , 'background' , this . generateTickMarks ( 'white' , interval ) ) ;
839911 }
840912
@@ -919,6 +991,39 @@ export class IgxSliderComponent implements ControlValueAccessor, EditorProvider,
919991 this . track . nativeElement . style . width = `${ positionGap * 100 } %` ;
920992 }
921993 }
994+
995+ private getLabelIndexes ( value : number | string | IRangeSliderValue | IRangeSliderValueLabel ) {
996+ if ( typeof value === 'string' && ! this . isRange ) {
997+ return this . stepLabels . findIndex ( e => e === value ) ;
998+ }
999+
1000+ const left = ( value as IRangeSliderValueLabel ) . left ;
1001+ const right = ( value as IRangeSliderValueLabel ) . right ;
1002+ if ( left || right ) {
1003+ return {
1004+ lower : left ? this . stepLabels . findIndex ( e => e === left ) : 0 ,
1005+ upper : right ? this . stepLabels . findIndex ( e => e === right ) : this . stepLabels . length - 1
1006+ }
1007+ }
1008+
1009+ return value ;
1010+ }
1011+
1012+ private getLabelValues ( value ) {
1013+ if ( ! value ) {
1014+ return value ;
1015+ }
1016+
1017+ if ( this . isRange ) {
1018+ return {
1019+ left : this . stepLabels [ value . lower ] ,
1020+ right : this . stepLabels [ value . upper ]
1021+ } ;
1022+ }
1023+
1024+ return this . stepLabels [ value ] ;
1025+ }
1026+
9221027 private hasValueChanged ( oldValue ) {
9231028 const isSliderWithDifferentValue : boolean = ! this . isRange && oldValue !== this . value ;
9241029 const isRangeWithOneDifferentValue : boolean = this . isRange &&
@@ -928,8 +1033,15 @@ export class IgxSliderComponent implements ControlValueAccessor, EditorProvider,
9281033 return isSliderWithDifferentValue || isRangeWithOneDifferentValue ;
9291034 }
9301035
931- private emitValueChanged ( oldValue : number | IRangeSliderValue ) {
932- this . onValueChange . emit ( { oldValue, value : this . value } ) ;
1036+ private emitValueChanged ( oldValueRef : number | string | IRangeSliderValue | IRangeSliderValueLabel ) {
1037+ let oldVal = oldValueRef , newVal = this . value ;
1038+
1039+ if ( this . labelsViewEnabled ) {
1040+ oldVal = this . getLabelValues ( oldValueRef ) ;
1041+ newVal = this . getLabelValues ( this . value ) ;
1042+ }
1043+
1044+ this . onValueChange . emit ( { oldValue : oldVal , value : newVal } ) ;
9331045 }
9341046}
9351047
0 commit comments