c6faec44
梁灏
init ColorPicker
|
1
|
<template>
|
77950c30
梁灏
update ColorPicker
|
2
|
<Dropdown :class="[prefixCls]" ref="picker" trigger="click" :transfer="transfer" :placement="placement" @on-visible-change="handleToggleVisible">
|
b6bda1dc
梁灏
update ColorPicker
|
3
4
5
|
<div :class="wrapClasses">
<i class="ivu-icon ivu-icon-arrow-down-b ivu-input-icon ivu-input-icon-normal"></i>
<div :class="inputClasses">
|
0aefe4aa
梁灏
update ColorPicker
|
6
|
<div :class="[prefixCls + '-color']">
|
1f61a559
梁灏
update ColorPicker
|
7
|
<div :class="[prefixCls + '-color-empty']" v-show="value === '' && !visible">
|
c0fa72ca
梁灏
update ColorPicker
|
8
9
|
<Icon type="ios-close-empty"></Icon>
</div>
|
1f61a559
梁灏
update ColorPicker
|
10
|
<div v-show="value || visible" :style="{backgroundColor: displayedColor}"></div>
|
0aefe4aa
梁灏
update ColorPicker
|
11
|
</div>
|
b6bda1dc
梁灏
update ColorPicker
|
12
13
14
|
</div>
</div>
<Dropdown-menu slot="list">
|
9af2f01c
梁灏
update ColorPicker
|
15
|
<div :class="[prefixCls + '-picker']">
|
77950c30
梁灏
update ColorPicker
|
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
<div :class="[prefixCls + '-picker-wrapper']">
<div :class="[prefixCls + '-picker-panel']">
<Saturation v-model="saturationColors" @change="childChange"></Saturation>
</div>
<div :class="[prefixCls + '-picker-hue-slider']">
<Hue v-model="saturationColors" @change="childChange"></Hue>
</div>
<div v-if="alpha" :class="[prefixCls + '-picker-alpha-slider']">
<Alpha v-model="saturationColors" @change="childChange"></Alpha>
</div>
<recommend-colors
v-if="colors.length"
:list="colors"
:class="[prefixCls + '-picker-colors']"
@picker-color="handleSelectColor"></recommend-colors>
<recommend-colors
v-if="!colors.length && recommend"
:list="recommendedColor"
:class="[prefixCls + '-picker-colors']"
@picker-color="handleSelectColor"></recommend-colors>
|
9af2f01c
梁灏
update ColorPicker
|
36
|
</div>
|
59dc2df0
梁灏
update ColorPicker
|
37
38
39
40
|
<div :class="[prefixCls + '-confirm']">
<span :class="[prefixCls + '-confirm-color']">{{ formatColor }}</span>
<Confirm @on-pick-success="handleSuccess" @on-pick-clear="handleClear"></Confirm>
</div>
|
b6bda1dc
梁灏
update ColorPicker
|
41
42
43
|
</div>
</Dropdown-menu>
</Dropdown>
|
c6faec44
梁灏
init ColorPicker
|
44
45
|
</template>
<script>
|
e7893a68
梁灏
update ColorPicker
|
46
47
|
import tinycolor from 'tinycolor2';
|
c0fa72ca
梁灏
update ColorPicker
|
48
|
import Icon from '../icon/icon.vue';
|
b6bda1dc
梁灏
update ColorPicker
|
49
50
|
import Dropdown from '../dropdown/dropdown.vue';
import DropdownMenu from '../dropdown/dropdown-menu.vue';
|
9af2f01c
梁灏
update ColorPicker
|
51
52
|
import RecommendColors from './recommend-colors.vue';
import Confirm from '../date-picker/base/confirm.vue';
|
e7893a68
梁灏
update ColorPicker
|
53
54
55
56
57
|
import Saturation from './saturation.vue';
import Hue from './hue.vue';
import Alpha from './alpha.vue';
|
b6bda1dc
梁灏
update ColorPicker
|
58
59
60
61
62
|
import { oneOf } from '../../utils/assist';
const prefixCls = 'ivu-color-picker';
const inputPrefixCls = 'ivu-input';
|
e7893a68
梁灏
update ColorPicker
|
63
|
function _colorChange (data, oldHue) {
|
59dc2df0
梁灏
update ColorPicker
|
64
|
data = data === '' ? '#2d8cf0' : data;
|
e7893a68
梁灏
update ColorPicker
|
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
99
100
101
102
103
104
105
106
107
108
109
110
111
|
const alpha = data && data.a;
let color;
// hsl is better than hex between conversions
if (data && data.hsl) {
color = tinycolor(data.hsl);
} else if (data && data.hex && data.hex.length > 0) {
color = tinycolor(data.hex);
} else {
color = tinycolor(data);
}
if (color && (color._a === undefined || color._a === null)) {
color.setAlpha(alpha || 1);
}
const hsl = color.toHsl();
const hsv = color.toHsv();
if (hsl.s === 0) {
hsv.h = hsl.h = data.h || (data.hsl && data.hsl.h) || oldHue || 0;
}
// when the hsv.v is less than 0.0164 (base on test)
// because of possible loss of precision
// the result of hue and saturation would be miscalculated
if (hsv.v < 0.0164) {
hsv.h = data.h || (data.hsv && data.hsv.h) || 0;
hsv.s = data.s || (data.hsv && data.hsv.s) || 0;
}
if (hsl.l < 0.01) {
hsl.h = data.h || (data.hsl && data.hsl.h) || 0;
hsl.s = data.s || (data.hsl && data.hsl.s) || 0;
}
return {
hsl: hsl,
hex: color.toHexString().toUpperCase(),
rgba: color.toRgb(),
hsv: hsv,
oldHue: data.h || oldHue || hsl.h,
source: data.source,
a: data.a || color.getAlpha()
};
}
|
c6faec44
梁灏
init ColorPicker
|
112
|
export default {
|
b6bda1dc
梁灏
update ColorPicker
|
113
|
name: 'ColorPicker',
|
c0fa72ca
梁灏
update ColorPicker
|
114
|
components: { Icon, Dropdown, DropdownMenu, Confirm, RecommendColors, Saturation, Hue, Alpha },
|
b6bda1dc
梁灏
update ColorPicker
|
115
116
|
props: {
value: {
|
0aefe4aa
梁灏
update ColorPicker
|
117
|
type: String
|
b6bda1dc
梁灏
update ColorPicker
|
118
119
120
121
122
|
},
alpha: {
type: Boolean,
default: false
},
|
9af2f01c
梁灏
update ColorPicker
|
123
124
125
126
|
recommend: {
type: Boolean,
default: false
},
|
b6bda1dc
梁灏
update ColorPicker
|
127
128
129
130
131
|
format: {
validator (value) {
return oneOf(value, ['hsl', 'hsv', 'hex', 'rgb']);
}
},
|
9af2f01c
梁灏
update ColorPicker
|
132
133
134
135
136
137
|
colors: {
type: Array,
default () {
return [];
}
},
|
b6bda1dc
梁灏
update ColorPicker
|
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
|
disabled: {
type: Boolean,
default: false
},
size: {
validator (value) {
return oneOf(value, ['small', 'large', 'default']);
}
},
placement: {
validator (value) {
return oneOf(value, ['top', 'top-start', 'top-end', 'bottom', 'bottom-start', 'bottom-end', 'left', 'left-start', 'left-end', 'right', 'right-start', 'right-end']);
},
default: 'bottom'
},
transfer: {
type: Boolean,
default: false
}
},
|
c6faec44
梁灏
init ColorPicker
|
158
|
data () {
|
b6bda1dc
梁灏
update ColorPicker
|
159
|
return {
|
e7893a68
梁灏
update ColorPicker
|
160
|
val: _colorChange(this.value),
|
b6bda1dc
梁灏
update ColorPicker
|
161
|
prefixCls: prefixCls,
|
0aefe4aa
梁灏
update ColorPicker
|
162
|
visible: false,
|
9af2f01c
梁灏
update ColorPicker
|
163
164
165
166
167
168
169
170
171
172
173
174
175
|
recommendedColor: [
'#2d8cf0',
'#19be6b',
'#ff9900',
'#ed3f14',
'#00b5ff',
'#19c919',
'#f9e31c',
'#ea1a1a',
'#9b1dea',
'#00c2b1',
'#ac7a33',
'#1d35ea',
|
59dc2df0
梁灏
update ColorPicker
|
176
|
'#8bc34a',
|
9af2f01c
梁灏
update ColorPicker
|
177
178
179
180
|
'#f16b62',
'#ea4ca3',
'#0d94aa',
'#febd79',
|
59dc2df0
梁灏
update ColorPicker
|
181
182
183
184
185
|
'#5d4037',
'#00bcd4',
'#f06292',
'#cddc39',
'#607d8b',
|
9af2f01c
梁灏
update ColorPicker
|
186
187
188
|
'#000000',
'#ffffff'
]
|
b6bda1dc
梁灏
update ColorPicker
|
189
190
191
|
};
},
computed: {
|
e7893a68
梁灏
update ColorPicker
|
192
193
194
195
196
197
|
saturationColors: {
get () {
return this.val;
},
set (newVal) {
this.val = newVal;
|
e7893a68
梁灏
update ColorPicker
|
198
199
|
}
},
|
b6bda1dc
梁灏
update ColorPicker
|
200
201
202
|
wrapClasses () {
return [
`${prefixCls}-rel`,
|
9673dcb0
梁灏
update ColorPicker
|
203
|
`${prefixCls}-${this.size}`,
|
b6bda1dc
梁灏
update ColorPicker
|
204
205
206
207
208
209
210
211
212
213
214
215
216
|
`${inputPrefixCls}-wrapper`,
`${inputPrefixCls}-wrapper-${this.size}`
];
},
inputClasses () {
return [
`${prefixCls}-input`,
`${inputPrefixCls}`,
`${inputPrefixCls}-${this.size}`,
{
[`${inputPrefixCls}-disabled`]: this.disabled
}
];
|
0aefe4aa
梁灏
update ColorPicker
|
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
|
},
displayedColor () {
let color;
if (this.visible) {
const rgba = this.saturationColors.rgba;
color = {
r: rgba.r,
g: rgba.g,
b: rgba.b,
a: rgba.a
};
} else {
color = tinycolor(this.value).toRgb();
}
return `rgba(${color.r}, ${color.g}, ${color.b}, ${color.a})`;
|
59dc2df0
梁灏
update ColorPicker
|
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
|
},
formatColor () {
const value = this.saturationColors;
const format = this.format;
let color;
const rgba = `rgba(${value.rgba.r}, ${value.rgba.g}, ${value.rgba.b}, ${value.rgba.a})`;
if (format) {
if (format === 'hsl') {
color = tinycolor(value.hsl).toHslString();
} else if (format === 'hsv') {
color = tinycolor(value.hsv).toHsvString();
} else if (format === 'hex') {
color = value.hex;
} else if (format === 'rgb') {
color = rgba;
}
} else if (this.alpha) {
color = rgba;
} else {
color = value.hex;
}
return color;
|
b6bda1dc
梁灏
update ColorPicker
|
255
|
}
|
c6faec44
梁灏
init ColorPicker
|
256
|
},
|
e7893a68
梁灏
update ColorPicker
|
257
258
259
|
watch: {
value (newVal) {
this.val = _colorChange(newVal);
|
0aefe4aa
梁灏
update ColorPicker
|
260
261
262
|
},
visible () {
this.val = _colorChange(this.value);
|
e7893a68
梁灏
update ColorPicker
|
263
264
|
}
},
|
b6bda1dc
梁灏
update ColorPicker
|
265
|
methods: {
|
e7893a68
梁灏
update ColorPicker
|
266
267
268
269
270
271
272
273
274
275
276
277
278
279
|
childChange (data) {
this.colorChange(data);
},
colorChange (data, oldHue) {
this.oldHue = this.saturationColors.hsl.h;
this.saturationColors = _colorChange(data, oldHue || this.oldHue);
},
isValidHex (hex) {
return tinycolor(hex).isValid();
},
simpleCheckForValidColor (data) {
const keysToCheck = ['r', 'g', 'b', 'a', 'h', 's', 'l', 'v'];
let checked = 0;
let passed = 0;
|
b6bda1dc
梁灏
update ColorPicker
|
280
|
|
e7893a68
梁灏
update ColorPicker
|
281
282
283
284
285
286
287
288
289
290
291
292
293
|
for (let i = 0; i < keysToCheck.length; i++) {
const letter = keysToCheck[i];
if (data[letter]) {
checked++;
if (!isNaN(data[letter])) {
passed++;
}
}
}
if (checked === passed) {
return data;
}
|
0aefe4aa
梁灏
update ColorPicker
|
294
295
296
297
|
},
handleToggleVisible (visible) {
this.visible = visible;
},
|
0aefe4aa
梁灏
update ColorPicker
|
298
|
handleSuccess () {
|
59dc2df0
梁灏
update ColorPicker
|
299
300
301
|
const color = this.formatColor;
this.$emit('input', color);
this.$emit('on-change', color);
|
93a5f34f
梁灏
update ColorPicker
|
302
|
this.$refs.picker.handleClose();
|
0aefe4aa
梁灏
update ColorPicker
|
303
304
305
|
},
handleClear () {
this.$emit('input', '');
|
93a5f34f
梁灏
update ColorPicker
|
306
|
this.$refs.picker.handleClose();
|
1f61a559
梁灏
update ColorPicker
|
307
308
309
|
},
handleSelectColor (color) {
this.val = _colorChange(color);
|
e7893a68
梁灏
update ColorPicker
|
310
|
}
|
b6bda1dc
梁灏
update ColorPicker
|
311
|
}
|
c6faec44
梁灏
init ColorPicker
|
312
313
|
};
</script>
|