Skip to content

Commit 428cc1f

Browse files
committed
feat(slider): POC labels feature
Closes #3449
1 parent 66dda56 commit 428cc1f

File tree

2 files changed

+138
-26
lines changed

2 files changed

+138
-26
lines changed

projects/igniteui-angular/src/lib/slider/slider.component.html

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
<div class="igx-slider" [class.igx-slider--disabled]="disabled" #slider (panstart)="showThumbsLabels()" (panend)="onPanEnd($event)"
1+
<div class="igx-slider" [class.igx-slider--disabled]="disabled" #slider (panstart)="showThumbsLabels($event)" (panend)="onPanEnd($event)"
22
(pan)="update($event)" (tap)="onTap($event)">
33
<div class="igx-slider__track">
44
<div #track class="igx-slider__track-fill"></div>
@@ -8,13 +8,13 @@
88
<div (keydown)="onKeyDown($event);" (keyup)="hideThumbsLabels()" (blur)="hideThumbLabelsOnBlur()" (focus)="onFocus($event);"
99
*ngIf="isRange" class="igx-slider__thumb-from" tabindex="1" [ngClass]="{ 'igx-slider__thumb-from--active': isActiveLabel }"
1010
#thumbFrom>
11-
<span class="label">{{ lowerValue}}</span>
11+
<span class="label">{{ lowerLabel }}</span>
1212
<span class="dot"></span>
1313
</div>
1414
<div (keydown)="onKeyDown($event);" (keyup)="hideThumbsLabels()" (blur)="hideThumbLabelsOnBlur()" (focus)="onFocus($event);"
1515
class="igx-slider__thumb-to" tabindex="1" [ngClass]="{ 'igx-slider__thumb-to--active': isActiveLabel }" #thumbTo>
16-
<span *ngIf="isRange" class="label">{{ upperValue}}</span>
17-
<span *ngIf="!isRange" class="label">{{ value }}</span>
16+
<span *ngIf="isRange" class="label">{{ upperLabel }}</span>
17+
<span *ngIf="!isRange" class="label">{{ valueLabel }}</span>
1818
<span class="dot"></span>
1919
</div>
2020
</div>

projects/igniteui-angular/src/lib/slider/slider.component.ts

Lines changed: 134 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,8 @@ import { CommonModule } from '@angular/common';
22
import {
33
AfterViewInit, Component, ElementRef, EventEmitter,
44
forwardRef, HostBinding, Input, NgModule, OnInit, Output, Renderer2,
5-
ViewChild
5+
ViewChild,
6+
TemplateRef
67
} from '@angular/core';
78
import { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';
89
import { 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+
3137
export interface ISliderValueChangeEventArgs {
32-
oldValue: number | IRangeSliderValue;
33-
value: number | IRangeSliderValue;
38+
oldValue: number | string | IRangeSliderValue | IRangeSliderValueLabel;
39+
value: number | string | IRangeSliderValue | IRangeSliderValueLabel;
3440
}
3541

3642
const noop = () => {
@@ -65,6 +71,9 @@ let NEXT_ID = 0;
6571
})
6672
export 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

Comments
 (0)