Skip to content

Commit 4d71b0b

Browse files
committed
feat: add thumb limits
1 parent 67c0999 commit 4d71b0b

File tree

5 files changed

+27
-1
lines changed

5 files changed

+27
-1
lines changed

README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,7 @@ generic="T = any, U = number | RangeData\<T>"
108108
| addable | boolean | Determines if new data can be added/deleted. You can specify the data to be added by `addData` prop | false |
109109
| addData | (value: number) => RangeData<T, U> | Data to be added. This will only effect while modelValue is RangeData[]. It will return { value } by default | undefined |
110110
| limit | number | the limit can be add | undefined |
111+
| thumbLimits | [number, number] | Global limit for all thumbs' movement range. Individual thumb can override this with its own limits property | undefined |
111112
| smooth | boolean | Determines if the thumb(s) should only be displayed on the stop points or not | false |
112113
| deduplicate | boolean | Determines if the thumb(s) can be duplicated | true |
113114
| rangeHighlight | boolean | Determines if the range between the minimum and maximum values should be highlighted. | false |
@@ -144,6 +145,7 @@ export interface RangeData<T, U = RangeValueType<T>> {
144145
data?: T
145146
disabled?: boolean
146147
unremovable?: boolean
148+
limits?: [number, number] // Min and max limits for this specific thumb
147149
renderTop?: RangeRenderFn<T, U>
148150
renderBottom?: RangeRenderFn<T, U>
149151
}

playground/src/ranges/05Vertical.vue

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import { h, ref } from 'vue'
44
55
const model = ref<RangeData<string>[]>([
66
{ data: 'disabled', value: 2, disabled: true },
7-
{ data: 'random1', value: 4 },
7+
{ data: 'random1', value: 4, limits: [2, 10] },
88
{ data: 'unremovable', value: 8, unremovable: true },
99
])
1010
function handleAddData(value: number) {
@@ -24,6 +24,7 @@ function handleAddData(value: number) {
2424
<span class="tag">vertical</span>
2525
<span class="tag">slot</span>
2626
<span class="tag">limit:5</span>
27+
<span class="tag">thumb-limits:[1,9]</span>
2728
</div>
2829
<Range
2930
v-model="model"
@@ -33,6 +34,7 @@ function handleAddData(value: number) {
3334
vertical
3435
thumb-size="large"
3536
:limit="5"
37+
:thumb-limits="[1, 9]"
3638
:render-bottom="(data) => h('div', data.value)"
3739
:add-data="handleAddData"
3840
>

src/Range.vue

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,13 @@ import RangeThumb from './RangeThumb.vue'
66
import { percentage2value, swap, value2percentage } from './utils'
77
88
const props = withDefaults(defineProps<{
9+
// eslint-disable-next-line vue/no-required-prop-with-default
910
modelValue: RangeValue<T, U>
1011
min?: number
1112
max?: number
1213
step?: number
1314
vertical?: boolean
15+
thumbLimits?: [number, number]
1416
addable?: boolean
1517
addData?: (value: number) => RangeData<T, U>
1618
limit?: number
@@ -175,6 +177,23 @@ function onUpdate(percentage: number) {
175177
return
176178
let index = indexMap.value[current.value]
177179
const oldValue = values[index]
180+
181+
// Apply limits if they exist
182+
const thumbData = modelValue[index]
183+
184+
// Check individual thumb limits first, then global limits
185+
const individualLimits = thumbData.limits
186+
const globalLimits = props.thumbLimits
187+
188+
if (individualLimits) {
189+
if (value < individualLimits[0] || value > individualLimits[1])
190+
return
191+
}
192+
else if (globalLimits) {
193+
if (value < globalLimits[0] || value > globalLimits[1])
194+
return
195+
}
196+
178197
if (oldValue - value > 0 && index > 0) {
179198
for (let i = index; i > 0; i -= 1) {
180199
const prev = values[i - 1]
@@ -311,6 +330,7 @@ provide(RangeTrackRefKey, trackRef)
311330
:render-bottom-on-active="renderBottomOnActive"
312331
:vertical="vertical"
313332
:addable="addable"
333+
:thumb-limits="thumbLimits"
314334
:thumb-type="thumbType || (size === 'large' ? 'rect' : 'circle')"
315335
:thumb-size="thumbSize"
316336
@move-done="current = -1"

src/RangeThumb.vue

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ const props = defineProps<{
1313
unremovable?: boolean
1414
vertical?: boolean
1515
addable?: boolean
16+
thumbLimits?: [number, number]
1617
thumbType?: 'circle' | 'square' | 'rect'
1718
thumbSize?: 'small' | 'medium' | 'large'
1819
renderTop?: RangeRenderFn<T, U>

src/type.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ export interface RangeData<T, U = RangeValueType<T>> {
66
data?: T
77
disabled?: boolean
88
unremovable?: boolean
9+
limits?: [number, number]
910
renderTop?: RangeRenderFn<T, U>
1011
renderBottom?: RangeRenderFn<T, U>
1112
}

0 commit comments

Comments
 (0)