Skip to content

Commit 30a53cf

Browse files
authored
feat: added tooltip format for Slider Component (#395)
* feat: added tooltip format for Slider * docs: added format attr docs for Slider * test: added KSlider's format attr unit test * chore: format default value is String(value) * feat: added slider format attr * test: added format attr unit test for Slider * docs: added format attr docs for Slider
1 parent 52f240a commit 30a53cf

File tree

5 files changed

+63
-13
lines changed

5 files changed

+63
-13
lines changed

components/Slider/__test__/slider.spec.ts

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,31 @@ describe('Test: KSlider', () => {
4646
expect(host.innerHTML).matchSnapshot();
4747
});
4848

49+
test('props: format', async () => {
50+
const instance = new KSlider({
51+
target: host,
52+
props: {
53+
value: 10,
54+
format: (value) => {
55+
return 'Ikun' + value;
56+
}
57+
}
58+
});
59+
expect(instance).toBeTruthy();
60+
await tick();
61+
const sliderButtonWrapperElm = host.querySelector('.k-slider--button-wrapper') as HTMLElement;
62+
const triggerElm = sliderButtonWrapperElm.children[0];
63+
triggerElm.dispatchEvent(
64+
new MouseEvent('mouseenter', {
65+
cancelable: true
66+
})
67+
);
68+
vi.runAllTimers();
69+
await tick();
70+
expect(host.innerHTML.includes('data-popper-arrow-bottom')).toBeTruthy();
71+
expect(host.innerHTML.includes('Ikun10')).toBeTruthy();
72+
});
73+
4974
test('props: vertical', async () => {
5075
const instance = new KSlider({
5176
target: host,

components/Slider/src/index.svelte

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
export let attrs: KSliderProps['attrs'] = {};
1717
export let cls: KSliderProps['cls'] = undefined;
1818
export let showTooltip: KSliderProps['showTooltip'] = true;
19+
export let format: KSliderProps['format'];
1920
2021
/*********************** KForm logic start ************************/
2122
let disabledFrom = false;
@@ -52,6 +53,19 @@
5253
}
5354
/*********************** KForm logic end ************************/
5455
56+
function handleFormat(value: number) {
57+
if (format) {
58+
const formattedValue = format(value);
59+
if (typeof formattedValue === 'number' || typeof formattedValue === 'string') {
60+
return formattedValue;
61+
} else {
62+
return value;
63+
}
64+
} else {
65+
return value;
66+
}
67+
}
68+
5569
// current value
5670
let isDragging: boolean = false;
5771
let startX: number = 0;
@@ -67,6 +81,7 @@
6781
$: percentage = `${((value - min) / (max - min)) * 100}%`;
6882
$: barStyle = vertical ? `height: ${percentage}; bottom: 0%` : `width: ${percentage}; left: 0%`;
6983
$: btnStyle = vertical ? `bottom: ${percentage}` : `left: ${percentage}`;
84+
$: formatContent = String(handleFormat(value));
7085
7186
// element
7287
let runwayRef: null | HTMLElement = null;
@@ -194,13 +209,13 @@
194209
style={btnStyle}
195210
>
196211
{#if $$slots.buttonRender}
197-
<KTooltip disabled={!showTooltip} placement="top" content={String(value)}>
212+
<KTooltip disabled={!showTooltip} placement="top" content={formatContent}>
198213
<div slot="triggerEl" class={buttonCls}>
199214
<slot name="buttonRender" />
200215
</div>
201216
</KTooltip>
202217
{:else}
203-
<KTooltip disabled={!showTooltip} placement="top" content={String(value)}>
218+
<KTooltip disabled={!showTooltip} placement="top" content={formatContent}>
204219
<div slot="triggerEl" class={buttonCls}></div>
205220
</KTooltip>
206221
{/if}

components/Slider/src/types.d.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ export type KSliderProps = {
1111
disabled: boolean;
1212
vertical: boolean;
1313
showTooltip: boolean;
14+
format: (value: number) => number | string;
1415
cls: ClassValue;
1516
attrs: Record<string, string>;
1617
};

docs/components/KSlider.md

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -61,17 +61,18 @@ Add `size` attribute to change the size of Slider. It supports `sm`, `md` and `l
6161

6262
## Slider Props
6363

64-
| Name | Type | Default | Description |
65-
| -------- | ------------------------ | ------- | -------------------------- |
66-
| value | `number` | `0` | Binding value |
67-
| vertical | `boolean` | `false` | Vertical mode |
68-
| min | `number` | `0` | Minimum value |
69-
| max | `number` | `100` | Maximum value |
70-
| step | `number` | `1` | Step size |
71-
| disabled | `boolean` | `false` | Whether Slider is disabled |
72-
| size | `sm \| md \| lg` | `md` | Size of `slider`. |
73-
| cls | `string` | `-` | Additional class |
74-
| attrs | `Record<string, string>` | `{}` | Additional attributes |
64+
| Name | Type | Default | Description |
65+
| -------- | ------------------------------------- | -------------------------- | -------------------------- |
66+
| value | `number` | `0` | Binding value |
67+
| vertical | `boolean` | `false` | Vertical mode |
68+
| format | `(value: number) => number \| string` | `(value: number) => value` | Tooltip format value |
69+
| min | `number` | `0` | Minimum value |
70+
| max | `number` | `100` | Maximum value |
71+
| step | `number` | `1` | Step size |
72+
| disabled | `boolean` | `false` | Whether Slider is disabled |
73+
| size | `sm \| md \| lg` | `md` | Size of `slider`. |
74+
| cls | `string` | `-` | Additional class |
75+
| attrs | `Record<string, string>` | `{}` | Additional attributes |
7576

7677
## Slider Events
7778

docs/example/slider/basic.svelte

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@
44
let step = 10;
55
let value1 = 0;
66
let value2 = 0;
7+
let format = (value) => {
8+
return 'Ikun' + value;
9+
};
710
const handleInput1 = (event) => {
811
value1 = event.detail;
912
};
@@ -17,6 +20,11 @@
1720
<p class="px-2">value: {value1}</p>
1821
</div>
1922

23+
<div>
24+
<KSlider {step} on:input={handleInput2} {format} value={value2}></KSlider>
25+
<p class="px-2">format: {"(value) => {return 'Ikun'+value}"}</p>
26+
</div>
27+
2028
<div>
2129
<KSlider {step} on:input={handleInput2} value={value2}></KSlider>
2230
<p class="px-2">value: {value2}</p>

0 commit comments

Comments
 (0)