36febc3c
梁灏
add Slider
|
1
2
|
<template>
<div :class="classes">
|
69576f47
梁灏
add Slider component
|
3
4
5
6
7
|
<Input-number
v-if="!range && showInput"
:min="min"
:max="max"
:step="step"
|
1c803cdf
梁灏
support Slider
|
8
|
:value="currentValue"
|
69576f47
梁灏
add Slider component
|
9
10
|
:disabled="disabled"
@on-change="handleInputChange"></Input-number>
|
1c803cdf
梁灏
support Slider
|
11
|
<div :class="[prefixCls + '-wrap']" ref="slider" @click.self="sliderClick">
|
0460a1e8
梁灏
fixed #812
|
12
|
<input type="hidden" :name="name" :value="currentValue">
|
36febc3c
梁灏
add Slider
|
13
|
<template v-if="showStops">
|
5709f32e
梁灏
Slider support hi...
|
14
|
<div :class="[prefixCls + '-stop']" v-for="item in stops" :style="{ 'left': item + '%' }" @click.self="sliderClick"></div>
|
36febc3c
梁灏
add Slider
|
15
|
</template>
|
5709f32e
梁灏
Slider support hi...
|
16
|
<div :class="[prefixCls + '-bar']" :style="barStyle" @click.self="sliderClick"></div>
|
69576f47
梁灏
add Slider component
|
17
18
19
20
21
|
<template v-if="range">
<div
:class="[prefixCls + '-button-wrap']"
:style="{left: firstPosition + '%'}"
@mousedown="onFirstButtonDown">
|
1c803cdf
梁灏
support Slider
|
22
|
<Tooltip :controlled="firstDragging" placement="top" :content="tipFormat(currentValue[0])" :disabled="tipDisabled" :always="showTip === 'always'" ref="tooltip">
|
69576f47
梁灏
add Slider component
|
23
24
25
26
27
28
29
|
<div :class="button1Classes"></div>
</Tooltip>
</div>
<div
:class="[prefixCls + '-button-wrap']"
:style="{left: secondPosition + '%'}"
@mousedown="onSecondButtonDown">
|
1c803cdf
梁灏
support Slider
|
30
|
<Tooltip :controlled="secondDragging" placement="top" :content="tipFormat(currentValue[1])" :disabled="tipDisabled" :always="showTip === 'always'" ref="tooltip2">
|
69576f47
梁灏
add Slider component
|
31
32
33
34
35
36
37
38
39
|
<div :class="button2Classes"></div>
</Tooltip>
</div>
</template>
<template v-else>
<div
:class="[prefixCls + '-button-wrap']"
:style="{left: singlePosition + '%'}"
@mousedown="onSingleButtonDown">
|
1c803cdf
梁灏
support Slider
|
40
|
<Tooltip :controlled="dragging" placement="top" :content="tipFormat(currentValue)" :disabled="tipDisabled" :always="showTip === 'always'" ref="tooltip">
|
69576f47
梁灏
add Slider component
|
41
42
43
44
|
<div :class="buttonClasses"></div>
</Tooltip>
</div>
</template>
|
36febc3c
梁灏
add Slider
|
45
46
47
48
49
50
|
</div>
</div>
</template>
<script>
import InputNumber from '../../components/input-number/input-number.vue';
import Tooltip from '../../components/tooltip/tooltip.vue';
|
59872199
Rijn
added show-tip to...
|
51
|
import { getStyle, oneOf } from '../../utils/assist';
|
825ed580
梁灏
fixed bug
|
52
|
import { on, off } from '../../utils/dom';
|
cd78c9c4
梁灏
some comps suppor...
|
53
|
import Emitter from '../../mixins/emitter';
|
36febc3c
梁灏
add Slider
|
54
55
56
57
|
const prefixCls = 'ivu-slider';
export default {
|
b1c118d8
梁灏
support Dropdown
|
58
|
name: 'Slider',
|
cd78c9c4
梁灏
some comps suppor...
|
59
|
mixins: [ Emitter ],
|
36febc3c
梁灏
add Slider
|
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
|
components: { InputNumber, Tooltip },
props: {
min: {
type: Number,
default: 0
},
max: {
type: Number,
default: 100
},
step: {
type: Number,
default: 1
},
range: {
type: Boolean,
default: false
},
value: {
type: [Number, Array],
default: 0
},
disabled: {
type: Boolean,
default: false
},
showInput: {
type: Boolean,
default: false
},
showStops: {
type: Boolean,
default: false
},
tipFormat: {
type: Function,
default (val) {
return val;
}
|
59872199
Rijn
added show-tip to...
|
99
100
101
102
103
104
105
|
},
showTip: {
type: String,
default: 'hover',
validator (value) {
return oneOf(value, ['hover', 'always', 'never']);
}
|
0460a1e8
梁灏
fixed #812
|
106
107
108
|
},
name: {
type: String
|
36febc3c
梁灏
add Slider
|
109
110
111
112
|
}
},
data () {
return {
|
69576f47
梁灏
add Slider component
|
113
|
prefixCls: prefixCls,
|
1c803cdf
梁灏
support Slider
|
114
|
currentValue: this.value,
|
69576f47
梁灏
add Slider component
|
115
116
117
118
119
120
121
122
123
124
125
126
127
|
dragging: false,
firstDragging: false,
secondDragging: false,
startX: 0,
currentX: 0,
startPos: 0,
newPos: null,
oldSingleValue: this.value,
oldFirstValue: this.value[0],
oldSecondValue: this.value[1],
singlePosition: (this.value - this.min) / (this.max - this.min) * 100,
firstPosition: (this.value[0] - this.min) / (this.max - this.min) * 100,
secondPosition: (this.value[1] - this.min) / (this.max - this.min) * 100
|
b0893113
jingsam
add eslint
|
128
|
};
|
36febc3c
梁灏
add Slider
|
129
|
},
|
1c803cdf
梁灏
support Slider
|
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
|
watch: {
value (val) {
this.currentValue = val;
},
currentValue (val) {
this.$nextTick(() => {
this.$refs.tooltip.updatePopper();
if (this.range) {
this.$refs.tooltip2.updatePopper();
}
});
this.updateValue(val);
this.$emit('input', val);
this.$emit('on-input', val);
}
},
|
36febc3c
梁灏
add Slider
|
146
147
148
149
150
|
computed: {
classes () {
return [
`${prefixCls}`,
{
|
69576f47
梁灏
add Slider component
|
151
|
[`${prefixCls}-input`]: this.showInput && !this.range,
|
36febc3c
梁灏
add Slider
|
152
153
154
|
[`${prefixCls}-range`]: this.range,
[`${prefixCls}-disabled`]: this.disabled
}
|
b0893113
jingsam
add eslint
|
155
|
];
|
36febc3c
梁灏
add Slider
|
156
|
},
|
69576f47
梁灏
add Slider component
|
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
|
buttonClasses () {
return [
`${prefixCls}-button`,
{
[`${prefixCls}-button-dragging`]: this.dragging
}
];
},
button1Classes () {
return [
`${prefixCls}-button`,
{
[`${prefixCls}-button-dragging`]: this.firstDragging
}
];
},
button2Classes () {
return [
`${prefixCls}-button`,
{
[`${prefixCls}-button-dragging`]: this.secondDragging
}
];
},
|
36febc3c
梁灏
add Slider
|
181
182
183
184
185
|
barStyle () {
let style;
if (this.range) {
style = {
|
1c803cdf
梁灏
support Slider
|
186
187
|
width: (this.currentValue[1] - this.currentValue[0]) / (this.max - this.min) * 100 + '%',
left: (this.currentValue[0] - this.min) / (this.max - this.min) * 100 + '%'
|
b0893113
jingsam
add eslint
|
188
|
};
|
36febc3c
梁灏
add Slider
|
189
190
|
} else {
style = {
|
1c803cdf
梁灏
support Slider
|
191
|
width: (this.currentValue - this.min) / (this.max - this.min) * 100 + '%'
|
b0893113
jingsam
add eslint
|
192
|
};
|
36febc3c
梁灏
add Slider
|
193
194
195
196
197
|
}
return style;
},
stops() {
|
41d90ccf
梁灏
Slider can show s...
|
198
199
200
201
202
203
204
|
let stopCount = (this.max - this.min) / this.step;
let result = [];
let stepWidth = 100 * this.step / (this.max - this.min);
for (let i = 1; i < stopCount; i++) {
result.push(i * stepWidth);
}
return result;
|
69576f47
梁灏
add Slider component
|
205
206
|
},
sliderWidth () {
|
1c803cdf
梁灏
support Slider
|
207
|
return parseInt(getStyle(this.$refs.slider, 'width'), 10);
|
59872199
Rijn
added show-tip to...
|
208
209
|
},
tipDisabled () {
|
1c803cdf
梁灏
support Slider
|
210
|
return this.tipFormat(this.currentValue[0]) === null || this.showTip === 'never';
|
36febc3c
梁灏
add Slider
|
211
212
213
|
}
},
methods: {
|
69576f47
梁灏
add Slider component
|
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
|
updateValue (val, init = false) {
if (this.range) {
let value = [...val];
if (init) {
if (value[0] > value[1]) {
value = [this.min, this.max];
}
} else {
if (value[0] > value[1]) {
value[0] = value[1];
}
}
if (value[0] < this.min) {
value[0] = this.min;
}
if (value[0] > this.max) {
value[0] = this.max;
}
if (value[1] < this.min) {
value[1] = this.min;
}
if (value[1] > this.max) {
value[1] = this.max;
}
|
62a06f56
梁灏
fixed #724
|
238
239
240
241
242
|
if (this.value[0] === value[0] && this.value[1] === value[1]) {
this.setFirstPosition(this.currentValue[0]);
this.setSecondPosition(this.currentValue[1]);
return;
}
|
69576f47
梁灏
add Slider component
|
243
|
|
1c803cdf
梁灏
support Slider
|
244
245
246
|
this.currentValue = value;
this.setFirstPosition(this.currentValue[0]);
this.setSecondPosition(this.currentValue[1]);
|
69576f47
梁灏
add Slider component
|
247
248
|
} else {
if (val < this.min) {
|
1c803cdf
梁灏
support Slider
|
249
|
this.currentValue = this.min;
|
69576f47
梁灏
add Slider component
|
250
251
|
}
if (val > this.max) {
|
1c803cdf
梁灏
support Slider
|
252
|
this.currentValue = this.max;
|
69576f47
梁灏
add Slider component
|
253
|
}
|
1c803cdf
梁灏
support Slider
|
254
|
this.setSinglePosition(this.currentValue);
|
69576f47
梁灏
add Slider component
|
255
256
257
258
259
|
}
},
sliderClick (event) {
if (this.disabled) return;
const currentX = event.clientX;
|
1c803cdf
梁灏
support Slider
|
260
|
const sliderOffsetLeft = this.$refs.slider.getBoundingClientRect().left;
|
69576f47
梁灏
add Slider component
|
261
|
const newPos = (currentX - sliderOffsetLeft) / this.sliderWidth * 100;
|
36febc3c
梁灏
add Slider
|
262
|
|
69576f47
梁灏
add Slider component
|
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
|
if (this.range) {
let type = '';
if (newPos <= this.firstPosition) {
type = 'First';
} else if (newPos >= this.secondPosition) {
type = 'Second';
} else {
if ((newPos - this.firstPosition) <= (this.secondPosition - newPos)) {
type = 'First';
} else {
type = 'Second';
}
}
this[`change${type}Position`](newPos);
} else {
this.changeSinglePosition(newPos);
}
},
// for single use
onSingleButtonDown (event) {
if (this.disabled) return;
|
f2be585e
梁灏
optimize Slider w...
|
284
|
event.preventDefault();
|
69576f47
梁灏
add Slider component
|
285
|
this.onSingleDragStart(event);
|
ce45917b
梁灏
update Slider
|
286
287
288
289
|
// window.addEventListener('mousemove', this.onSingleDragging);
// window.addEventListener('mouseup', this.onSingleDragEnd);
on(window, 'mousemove', this.onSingleDragging);
on(window, 'mouseup', this.onSingleDragEnd);
|
69576f47
梁灏
add Slider component
|
290
291
|
},
onSingleDragStart (event) {
|
ce4c0faa
oustn
修复 Slider 滑动按钮单击时...
|
292
|
this.dragging = false;
|
69576f47
梁灏
add Slider component
|
293
294
295
296
|
this.startX = event.clientX;
this.startPos = parseInt(this.singlePosition, 10);
},
onSingleDragging (event) {
|
ce4c0faa
oustn
修复 Slider 滑动按钮单击时...
|
297
|
this.dragging = true;
|
69576f47
梁灏
add Slider component
|
298
299
300
301
302
303
304
305
306
307
308
309
310
|
if (this.dragging) {
this.$refs.tooltip.visible = true;
this.currentX = event.clientX;
const diff = (this.currentX - this.startX) / this.sliderWidth * 100;
this.newPos = this.startPos + diff;
this.changeSinglePosition(this.newPos);
}
},
onSingleDragEnd () {
if (this.dragging) {
this.dragging = false;
this.$refs.tooltip.visible = false;
this.changeSinglePosition(this.newPos);
|
ce45917b
梁灏
update Slider
|
311
312
|
// window.removeEventListener('mousemove', this.onSingleDragging);
// window.removeEventListener('mouseup', this.onSingleDragEnd);
|
69576f47
梁灏
add Slider component
|
313
|
}
|
ce4c0faa
oustn
修复 Slider 滑动按钮单击时...
|
314
315
|
off(window, 'mousemove', this.onSingleDragging);
off(window, 'mouseup', this.onSingleDragEnd);
|
69576f47
梁灏
add Slider component
|
316
317
|
},
changeSinglePosition (newPos) {
|
a6fc9438
梁灏
fixed #461
|
318
319
320
321
322
323
324
|
if (newPos < 0) {
newPos = 0;
} else if (newPos > 100) {
newPos = 100;
}
const lengthPerStep = 100 / ((this.max - this.min) / this.step);
const steps = Math.round(newPos / lengthPerStep);
|
69576f47
梁灏
add Slider component
|
325
|
|
a6fc9438
梁灏
fixed #461
|
326
327
328
329
330
331
332
|
this.currentValue = Math.round(steps * lengthPerStep * (this.max - this.min) * 0.01 + this.min);
this.setSinglePosition(this.currentValue);
if (!this.dragging) {
if (this.currentValue !== this.oldSingleValue) {
this.$emit('on-change', this.currentValue);
this.dispatch('FormItem', 'on-form-change', this.currentValue);
this.oldSingleValue = this.currentValue;
|
69576f47
梁灏
add Slider component
|
333
334
335
336
337
338
339
|
}
}
},
setSinglePosition (val) {
this.singlePosition = (val - this.min) / (this.max - this.min) * 100;
},
handleInputChange (val) {
|
1c803cdf
梁灏
support Slider
|
340
|
this.currentValue = val;
|
69576f47
梁灏
add Slider component
|
341
|
this.setSinglePosition(val);
|
1c803cdf
梁灏
support Slider
|
342
|
this.$emit('on-change', this.currentValue);
|
cd78c9c4
梁灏
some comps suppor...
|
343
|
this.dispatch('FormItem', 'on-form-change', this.currentValue);
|
69576f47
梁灏
add Slider component
|
344
345
346
347
|
},
// for range use first
onFirstButtonDown (event) {
if (this.disabled) return;
|
f2be585e
梁灏
optimize Slider w...
|
348
|
event.preventDefault();
|
69576f47
梁灏
add Slider component
|
349
|
this.onFirstDragStart(event);
|
ce45917b
梁灏
update Slider
|
350
351
352
353
|
// window.addEventListener('mousemove', this.onFirstDragging);
// window.addEventListener('mouseup', this.onFirstDragEnd);
on(window, 'mousemove', this.onFirstDragging);
on(window, 'mouseup', this.onFirstDragEnd);
|
69576f47
梁灏
add Slider component
|
354
355
|
},
onFirstDragStart (event) {
|
ce4c0faa
oustn
修复 Slider 滑动按钮单击时...
|
356
|
this.firstDragging = false;
|
69576f47
梁灏
add Slider component
|
357
358
359
360
|
this.startX = event.clientX;
this.startPos = parseInt(this.firstPosition, 10);
},
onFirstDragging (event) {
|
ce4c0faa
oustn
修复 Slider 滑动按钮单击时...
|
361
|
this.firstDragging = true;
|
69576f47
梁灏
add Slider component
|
362
363
364
365
366
367
368
369
370
371
372
373
374
|
if (this.firstDragging) {
this.$refs.tooltip.visible = true;
this.currentX = event.clientX;
const diff = (this.currentX - this.startX) / this.sliderWidth * 100;
this.newPos = this.startPos + diff;
this.changeFirstPosition(this.newPos);
}
},
onFirstDragEnd () {
if (this.firstDragging) {
this.firstDragging = false;
this.$refs.tooltip.visible = false;
this.changeFirstPosition(this.newPos);
|
ce45917b
梁灏
update Slider
|
375
376
|
// window.removeEventListener('mousemove', this.onFirstDragging);
// window.removeEventListener('mouseup', this.onFirstDragEnd);
|
69576f47
梁灏
add Slider component
|
377
|
}
|
ce4c0faa
oustn
修复 Slider 滑动按钮单击时...
|
378
379
|
off(window, 'mousemove', this.onFirstDragging);
off(window, 'mouseup', this.onFirstDragEnd);
|
69576f47
梁灏
add Slider component
|
380
381
|
},
changeFirstPosition (newPos) {
|
2f8104a3
梁灏
update Slider
|
382
383
384
385
386
387
388
|
if (newPos < 0) {
newPos = 0;
} else if (newPos > this.secondPosition) {
newPos = this.secondPosition;
}
const lengthPerStep = 100 / ((this.max - this.min) / this.step);
const steps = Math.round(newPos / lengthPerStep);
|
69576f47
梁灏
add Slider component
|
389
|
|
2f8104a3
梁灏
update Slider
|
390
391
392
393
394
395
396
|
this.currentValue = [Math.round(steps * lengthPerStep * (this.max - this.min) * 0.01 + this.min), this.currentValue[1]];
this.setFirstPosition(this.currentValue[0]);
if (!this.firstDragging) {
if (this.currentValue[0] !== this.oldFirstValue) {
this.$emit('on-change', this.currentValue);
this.dispatch('FormItem', 'on-form-change', this.currentValue);
this.oldFirstValue = this.currentValue[0];
|
69576f47
梁灏
add Slider component
|
397
398
399
400
401
402
403
404
405
|
}
}
},
setFirstPosition (val) {
this.firstPosition = (val - this.min) / (this.max - this.min) * 100;
},
// for range use second
onSecondButtonDown (event) {
if (this.disabled) return;
|
f2be585e
梁灏
optimize Slider w...
|
406
|
event.preventDefault();
|
69576f47
梁灏
add Slider component
|
407
|
this.onSecondDragStart(event);
|
ce45917b
梁灏
update Slider
|
408
409
410
411
|
// window.addEventListener('mousemove', this.onSecondDragging);
// window.addEventListener('mouseup', this.onSecondDragEnd);
on(window, 'mousemove', this.onSecondDragging);
on(window, 'mouseup', this.onSecondDragEnd);
|
69576f47
梁灏
add Slider component
|
412
413
|
},
onSecondDragStart (event) {
|
ce4c0faa
oustn
修复 Slider 滑动按钮单击时...
|
414
|
this.secondDragging = false;
|
69576f47
梁灏
add Slider component
|
415
416
417
418
|
this.startX = event.clientX;
this.startPos = parseInt(this.secondPosition, 10);
},
onSecondDragging (event) {
|
ce4c0faa
oustn
修复 Slider 滑动按钮单击时...
|
419
|
this.secondDragging = true;
|
69576f47
梁灏
add Slider component
|
420
421
422
423
424
425
426
427
428
429
430
431
432
|
if (this.secondDragging) {
this.$refs.tooltip2.visible = true;
this.currentX = event.clientX;
const diff = (this.currentX - this.startX) / this.sliderWidth * 100;
this.newPos = this.startPos + diff;
this.changeSecondPosition(this.newPos);
}
},
onSecondDragEnd () {
if (this.secondDragging) {
this.secondDragging = false;
this.$refs.tooltip2.visible = false;
this.changeSecondPosition(this.newPos);
|
ce45917b
梁灏
update Slider
|
433
434
|
// window.removeEventListener('mousemove', this.onSecondDragging);
// window.removeEventListener('mouseup', this.onSecondDragEnd);
|
69576f47
梁灏
add Slider component
|
435
|
}
|
ce4c0faa
oustn
修复 Slider 滑动按钮单击时...
|
436
437
|
off(window, 'mousemove', this.onSecondDragging);
off(window, 'mouseup', this.onSecondDragEnd);
|
69576f47
梁灏
add Slider component
|
438
439
|
},
changeSecondPosition (newPos) {
|
2f8104a3
梁灏
update Slider
|
440
441
442
443
444
445
446
|
if (newPos > 100) {
newPos = 100;
} else if (newPos < this.firstPosition) {
newPos = this.firstPosition;
}
const lengthPerStep = 100 / ((this.max - this.min) / this.step);
const steps = Math.round(newPos / lengthPerStep);
|
69576f47
梁灏
add Slider component
|
447
|
|
2f8104a3
梁灏
update Slider
|
448
449
450
451
452
453
454
|
this.currentValue = [this.currentValue[0], Math.round(steps * lengthPerStep * (this.max - this.min) * 0.01 + this.min)];
this.setSecondPosition(this.currentValue[1]);
if (!this.secondDragging) {
if (this.currentValue[1] !== this.oldSecondValue) {
this.$emit('on-change', this.currentValue);
this.dispatch('FormItem', 'on-form-change', this.currentValue);
this.oldSecondValue = this.currentValue[1];
|
69576f47
梁灏
add Slider component
|
455
456
457
458
459
|
}
}
},
setSecondPosition (val) {
this.secondPosition = (val - this.min) / (this.max - this.min) * 100;
|
36febc3c
梁灏
add Slider
|
460
461
|
}
},
|
1c803cdf
梁灏
support Slider
|
462
|
mounted () {
|
36febc3c
梁灏
add Slider
|
463
|
if (this.range) {
|
1c803cdf
梁灏
support Slider
|
464
465
466
|
const isArray = Array.isArray(this.currentValue);
if (!isArray || (isArray && this.currentValue.length != 2) || (isArray && (isNaN(this.currentValue[0]) || isNaN(this.currentValue[1])))) {
this.currentValue = [this.min, this.max];
|
69576f47
梁灏
add Slider component
|
467
|
} else {
|
1c803cdf
梁灏
support Slider
|
468
|
this.updateValue(this.currentValue, true);
|
69576f47
梁灏
add Slider component
|
469
470
|
}
} else {
|
1c803cdf
梁灏
support Slider
|
471
472
|
if (typeof this.currentValue !== 'number') {
this.currentValue = this.min;
|
36febc3c
梁灏
add Slider
|
473
|
}
|
1c803cdf
梁灏
support Slider
|
474
|
this.updateValue(this.currentValue);
|
36febc3c
梁灏
add Slider
|
475
476
|
}
}
|
b0893113
jingsam
add eslint
|
477
478
|
};
</script>
|