Skip to content

Commit 7c79ab3

Browse files
authored
feat(module:slider): add the ability to use a template (#7505)
1 parent 7ce50b3 commit 7c79ab3

File tree

7 files changed

+73
-8
lines changed

7 files changed

+73
-8
lines changed

components/slider/demo/tip-formatter.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,10 @@ import { Component } from '@angular/core';
55
template: `
66
<nz-slider [nzTipFormatter]="formatter"></nz-slider>
77
<nz-slider [nzTipFormatter]="null"></nz-slider>
8+
<nz-slider [nzTipFormatter]="titleTemplate"></nz-slider>
9+
<ng-template #titleTemplate let-value>
10+
<span>Slider value: {{ value }}</span>
11+
</ng-template>
812
`
913
})
1014
export class NzDemoSliderTipFormatterComponent {

components/slider/doc/index.en-US.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ import { NzSliderModule } from 'ng-zorro-antd/slider';
2929
| `[nzMin]` | The minimum value the slider can slide to. | `number` | `0` |
3030
| `[nzRange]` | dual thumb mode | `boolean` | `false` |
3131
| `[nzStep]` | The granularity the slider can step through values. Must greater than 0, and be divided by (max - min) . When `marks` no null, `step` can be `null`. | `number \| null` | `1` |
32-
| `[nzTipFormatter]` | Slider will pass its value to `tipFormatter`, and display its value in Tooltip, and hide Tooltip when return value is null. | `(value: number) => string` | - |
32+
| `[nzTipFormatter]` | Slider will pass its value to `tipFormatter`, and display its value in Tooltip, and hide Tooltip when return value is null. | `(value: number) => string \| TemplateRef<void>` | - |
3333
| `[ngModel]` | The value of slider. When `range` is `false`, use `number`, otherwise, use `[number, number]` | `number \| number[]` | - |
3434
| `[nzVertical]` | If true, the slider will be vertical. | `boolean` | `false` |
3535
| `[nzReverse]` | Reverse the component | `boolean` | `false` |

components/slider/doc/index.zh-CN.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ import { NzSliderModule } from 'ng-zorro-antd/slider';
3030
| `[nzMin]` | 最小值 | `number` | `0` |
3131
| `[nzRange]` | 双滑块模式 | `boolean` | `false` |
3232
| `[nzStep]` | 步长,取值必须大于 0,并且可被 (max - min) 整除。当 `marks` 不为空对象时,可以设置 `step``null`,此时 Slider 的可选值仅有 marks 标出来的部分。 | `number \| null` | `1` |
33-
| `[nzTipFormatter]` | Slider 会把当前值传给 `nzTipFormatter`,并在 Tooltip 中显示 `nzTipFormatter` 的返回值,若为 null,则隐藏 Tooltip。 | `(value: number) => string` | - |
33+
| `[nzTipFormatter]` | Slider 会把当前值传给 `nzTipFormatter`,并在 Tooltip 中显示 `nzTipFormatter` 的返回值,若为 null,则隐藏 Tooltip。 | `(value: number) => string \| TemplateRef<void>` | - |
3434
| `[ngModel]` | 设置当前取值。当 `range``false` 时,使用 `number`,否则用 `[number, number]` | `number \| number[]` | - |
3535
| `[nzVertical]` | 值为 `true` 时,Slider 为垂直方向 | `boolean` | `false` |
3636
| `[nzReverse]` | 反向坐标轴 | `boolean` | `false` |

components/slider/handle.component.ts

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,12 @@ import {
1212
Input,
1313
OnChanges,
1414
SimpleChanges,
15+
TemplateRef,
1516
ViewChild,
1617
ViewEncapsulation
1718
} from '@angular/core';
1819

19-
import { BooleanInput, NgStyleInterface } from 'ng-zorro-antd/core/types';
20+
import { BooleanInput, NgStyleInterface, NzTSType } from 'ng-zorro-antd/core/types';
2021
import { InputBoolean } from 'ng-zorro-antd/core/util';
2122
import { NzTooltipDirective } from 'ng-zorro-antd/tooltip';
2223

@@ -37,6 +38,7 @@ import { NzSliderShowTooltip } from './typings';
3738
nz-tooltip
3839
[ngStyle]="style"
3940
[nzTooltipTitle]="tooltipFormatter === null || tooltipVisible === 'never' ? null : tooltipTitle"
41+
[nzTooltipTitleContext]="{ $implicit: value }"
4042
[nzTooltipTrigger]="null"
4143
[nzTooltipPlacement]="tooltipPlacement"
4244
></div>
@@ -58,11 +60,11 @@ export class NzSliderHandleComponent implements OnChanges {
5860
@Input() value?: number;
5961
@Input() tooltipVisible: NzSliderShowTooltip = 'default';
6062
@Input() tooltipPlacement?: string;
61-
@Input() tooltipFormatter?: null | ((value: number) => string);
63+
@Input() tooltipFormatter?: null | ((value: number) => string) | TemplateRef<void>;
6264
@Input() @InputBoolean() active = false;
6365
@Input() dir: Direction = 'ltr';
6466

65-
tooltipTitle?: string;
67+
tooltipTitle?: NzTSType;
6668
style: NgStyleInterface = {};
6769

6870
constructor(private sliderService: NzSliderService, private cdr: ChangeDetectorRef) {}
@@ -124,7 +126,12 @@ export class NzSliderHandleComponent implements OnChanges {
124126
}
125127

126128
private updateTooltipTitle(): void {
127-
this.tooltipTitle = this.tooltipFormatter ? this.tooltipFormatter(this.value!) : `${this.value}`;
129+
if (this.tooltipFormatter) {
130+
this.tooltipTitle =
131+
typeof this.tooltipFormatter === 'function' ? this.tooltipFormatter(this.value!) : this.tooltipFormatter;
132+
} else {
133+
this.tooltipTitle = `${this.value}`;
134+
}
128135
}
129136

130137
private updateTooltipPosition(): void {

components/slider/slider.component.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import {
2020
Output,
2121
QueryList,
2222
SimpleChanges,
23+
TemplateRef,
2324
ViewChild,
2425
ViewChildren,
2526
ViewEncapsulation,
@@ -147,7 +148,7 @@ export class NzSliderComponent implements ControlValueAccessor, OnInit, OnChange
147148
@Input() @InputNumber() nzStep = 1;
148149
@Input() nzTooltipVisible: NzSliderShowTooltip = 'default';
149150
@Input() nzTooltipPlacement: string = 'top';
150-
@Input() nzTipFormatter?: null | ((value: number) => string);
151+
@Input() nzTipFormatter?: null | ((value: number) => string) | TemplateRef<void>;
151152

152153
@Output() readonly nzOnAfterChange = new EventEmitter<NzSliderValue>();
153154

components/slider/slider.spec.ts

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -221,6 +221,46 @@ describe('nz-slider', () => {
221221
}));
222222
});
223223

224+
describe('show template tooltip', () => {
225+
let testBed: ComponentBed<SliderShowTemplateTooltipComponent>;
226+
let fixture: ComponentFixture<SliderShowTemplateTooltipComponent>;
227+
let testComponent: SliderShowTemplateTooltipComponent;
228+
229+
beforeEach(() => {
230+
testBed = createComponentBed(SliderShowTemplateTooltipComponent, {
231+
imports: [NzSliderModule, FormsModule, ReactiveFormsModule, NoopAnimationsModule]
232+
});
233+
fixture = testBed.fixture;
234+
fixture.detectChanges();
235+
testComponent = fixture.debugElement.componentInstance;
236+
sliderDebugElement = fixture.debugElement.query(By.directive(NzSliderComponent));
237+
sliderInstance = sliderDebugElement.injector.get<NzSliderComponent>(NzSliderComponent);
238+
sliderNativeElement = sliderInstance.slider.nativeElement;
239+
});
240+
241+
beforeEach(inject([OverlayContainer], (oc: OverlayContainer) => {
242+
overlayContainerElement = oc.getContainerElement();
243+
}));
244+
245+
it('should preview template tooltip', fakeAsync(() => {
246+
testComponent.show = 'always';
247+
fixture.detectChanges();
248+
tick(400);
249+
fixture.detectChanges();
250+
expect(overlayContainerElement.textContent).toContain('Slider value: 0');
251+
252+
dispatchClickEventSequence(sliderNativeElement, 0.13);
253+
fixture.detectChanges();
254+
expect(overlayContainerElement.textContent).toContain('Slider value: 13');
255+
256+
// Always show tooltip even when handle is not hovered.
257+
fixture.detectChanges();
258+
expect(overlayContainerElement.textContent).toContain('Slider value: 13');
259+
260+
tick(400);
261+
}));
262+
});
263+
224264
describe('setting value', () => {
225265
let testBed: ComponentBed<SliderWithValueComponent>;
226266
let fixture: ComponentFixture<SliderWithValueComponent>;
@@ -1191,6 +1231,19 @@ class NzTestSliderKeyboardComponent {
11911231
disabled = false;
11921232
}
11931233

1234+
@Component({
1235+
template: `
1236+
<nz-slider [nzTooltipVisible]="show" [ngModel]="value" [nzTipFormatter]="titleTemplate"></nz-slider>
1237+
<ng-template #titleTemplate let-value>
1238+
<span>Slider value: {{ value }}</span>
1239+
</ng-template>
1240+
`
1241+
})
1242+
class SliderShowTemplateTooltipComponent {
1243+
show: NzSliderShowTooltip = 'default';
1244+
value = 0;
1245+
}
1246+
11941247
/**
11951248
* Dispatches a click event sequence (consisting of moueseenter, click) from an element.
11961249
* Note: The mouse event truncates the position for the click.

components/tooltip/tooltip.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ export class NzTooltipDirective extends NzTooltipBaseDirective {
8080
return {
8181
...super.getProxyPropertyMap(),
8282
nzTooltipColor: ['nzColor', () => this.nzTooltipColor],
83-
nzTooltipTitleContext: ['nzTitleContext', () => this.titleContext]
83+
titleContext: ['nzTitleContext', () => this.titleContext]
8484
};
8585
}
8686
}

0 commit comments

Comments
 (0)