c6faec44
梁灏
init ColorPicker
|
1
|
<template>
|
4109bbc6
梁灏
update ColorPicker
|
2
3
|
<div :class="classes" v-clickoutside="handleClose">
<div ref="reference" @click="toggleVisible" :class="wrapClasses">
|
b6bda1dc
梁灏
update ColorPicker
|
4
5
|
<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">
|
4109bbc6
梁灏
update ColorPicker
|
8
|
<i class="ivu-icon ivu-icon-ios-close-empty"></i>
|
c0fa72ca
梁灏
update ColorPicker
|
9
|
</div>
|
1f61a559
梁灏
update ColorPicker
|
10
|
<div v-show="value || visible" :style="{backgroundColor: displayedColor}"></div>
|
0aefe4aa
梁灏
update ColorPicker
|
11
|
</div>
|
b6bda1dc
梁灏
update ColorPicker
|
12
13
|
</div>
</div>
|
4109bbc6
梁灏
update ColorPicker
|
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
|
<transition :name="transition">
<Drop
v-show="visible"
@click.native="handleTransferClick"
:class="{ [prefixCls + '-transfer']: transfer }"
class-name="ivu-transfer-no-max-height"
:placement="placement"
ref="drop"
:data-transfer="transfer"
v-transfer-dom>
<div :class="[prefixCls + '-picker']">
<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>
|
77950c30
梁灏
update ColorPicker
|
45
|
</div>
|
4109bbc6
梁灏
update ColorPicker
|
46
47
48
|
<div :class="[prefixCls + '-confirm']">
<span :class="[prefixCls + '-confirm-color']">{{ formatColor }}</span>
<Confirm @on-pick-success="handleSuccess" @on-pick-clear="handleClear"></Confirm>
|
77950c30
梁灏
update ColorPicker
|
49
|
</div>
|
59dc2df0
梁灏
update ColorPicker
|
50
|
</div>
|
4109bbc6
梁灏
update ColorPicker
|
51
52
53
|
</Drop>
</transition>
</div>
|
c6faec44
梁灏
init ColorPicker
|
54
55
|
</template>
<script>
|
e7893a68
梁灏
update ColorPicker
|
56
57
|
import tinycolor from 'tinycolor2';
|
4109bbc6
梁灏
update ColorPicker
|
58
59
60
61
|
import clickoutside from '../../directives/clickoutside';
import TransferDom from '../../directives/transfer-dom';
import Drop from '../../components/select/dropdown.vue';
|
9af2f01c
梁灏
update ColorPicker
|
62
63
|
import RecommendColors from './recommend-colors.vue';
import Confirm from '../date-picker/base/confirm.vue';
|
e7893a68
梁灏
update ColorPicker
|
64
65
66
67
|
import Saturation from './saturation.vue';
import Hue from './hue.vue';
import Alpha from './alpha.vue';
|
b6bda1dc
梁灏
update ColorPicker
|
68
69
70
71
72
|
import { oneOf } from '../../utils/assist';
const prefixCls = 'ivu-color-picker';
const inputPrefixCls = 'ivu-input';
|
e7893a68
梁灏
update ColorPicker
|
73
|
function _colorChange (data, oldHue) {
|
59dc2df0
梁灏
update ColorPicker
|
74
|
data = data === '' ? '#2d8cf0' : data;
|
e7893a68
梁灏
update ColorPicker
|
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
112
113
114
115
116
117
118
119
120
121
|
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
|
122
|
export default {
|
b6bda1dc
梁灏
update ColorPicker
|
123
|
name: 'ColorPicker',
|
4109bbc6
梁灏
update ColorPicker
|
124
125
|
components: { Drop, Confirm, RecommendColors, Saturation, Hue, Alpha },
directives: { clickoutside, TransferDom },
|
b6bda1dc
梁灏
update ColorPicker
|
126
127
|
props: {
value: {
|
0aefe4aa
梁灏
update ColorPicker
|
128
|
type: String
|
b6bda1dc
梁灏
update ColorPicker
|
129
130
131
132
133
|
},
alpha: {
type: Boolean,
default: false
},
|
9af2f01c
梁灏
update ColorPicker
|
134
135
136
137
|
recommend: {
type: Boolean,
default: false
},
|
b6bda1dc
梁灏
update ColorPicker
|
138
139
140
141
142
|
format: {
validator (value) {
return oneOf(value, ['hsl', 'hsv', 'hex', 'rgb']);
}
},
|
9af2f01c
梁灏
update ColorPicker
|
143
144
145
146
147
148
|
colors: {
type: Array,
default () {
return [];
}
},
|
b6bda1dc
梁灏
update ColorPicker
|
149
150
151
152
153
154
155
|
disabled: {
type: Boolean,
default: false
},
size: {
validator (value) {
return oneOf(value, ['small', 'large', 'default']);
|
4109bbc6
梁灏
update ColorPicker
|
156
157
|
},
default: 'default'
|
b6bda1dc
梁灏
update ColorPicker
|
158
159
160
161
162
163
164
165
166
167
168
169
|
},
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
|
170
|
data () {
|
b6bda1dc
梁灏
update ColorPicker
|
171
|
return {
|
e7893a68
梁灏
update ColorPicker
|
172
|
val: _colorChange(this.value),
|
b6bda1dc
梁灏
update ColorPicker
|
173
|
prefixCls: prefixCls,
|
0aefe4aa
梁灏
update ColorPicker
|
174
|
visible: false,
|
4109bbc6
梁灏
update ColorPicker
|
175
|
disableCloseUnderTransfer: false, // transfer 模式下,点击Drop也会触发关闭
|
9af2f01c
梁灏
update ColorPicker
|
176
177
178
179
180
181
182
183
184
185
186
187
188
|
recommendedColor: [
'#2d8cf0',
'#19be6b',
'#ff9900',
'#ed3f14',
'#00b5ff',
'#19c919',
'#f9e31c',
'#ea1a1a',
'#9b1dea',
'#00c2b1',
'#ac7a33',
'#1d35ea',
|
59dc2df0
梁灏
update ColorPicker
|
189
|
'#8bc34a',
|
9af2f01c
梁灏
update ColorPicker
|
190
191
192
193
|
'#f16b62',
'#ea4ca3',
'#0d94aa',
'#febd79',
|
59dc2df0
梁灏
update ColorPicker
|
194
195
196
197
198
|
'#5d4037',
'#00bcd4',
'#f06292',
'#cddc39',
'#607d8b',
|
9af2f01c
梁灏
update ColorPicker
|
199
200
201
|
'#000000',
'#ffffff'
]
|
b6bda1dc
梁灏
update ColorPicker
|
202
203
204
|
};
},
computed: {
|
4109bbc6
梁灏
update ColorPicker
|
205
206
207
208
209
210
211
|
transition () {
if (this.placement === 'bottom-start' || this.placement === 'bottom' || this.placement === 'bottom-end') {
return 'slide-up';
} else {
return 'fade';
}
},
|
e7893a68
梁灏
update ColorPicker
|
212
213
214
215
216
217
|
saturationColors: {
get () {
return this.val;
},
set (newVal) {
this.val = newVal;
|
8dab987e
梁灏
update ColorPicker
|
218
|
this.$emit('on-active-change', this.formatColor);
|
e7893a68
梁灏
update ColorPicker
|
219
220
|
}
},
|
8105945f
梁灏
update ColorPicker
|
221
222
223
224
225
226
227
228
|
classes () {
return [
`${prefixCls}`,
{
[`${prefixCls}-transfer`]: this.transfer
}
];
},
|
b6bda1dc
梁灏
update ColorPicker
|
229
230
231
|
wrapClasses () {
return [
`${prefixCls}-rel`,
|
9673dcb0
梁灏
update ColorPicker
|
232
|
`${prefixCls}-${this.size}`,
|
b6bda1dc
梁灏
update ColorPicker
|
233
234
235
236
237
238
239
240
241
242
243
244
245
|
`${inputPrefixCls}-wrapper`,
`${inputPrefixCls}-wrapper-${this.size}`
];
},
inputClasses () {
return [
`${prefixCls}-input`,
`${inputPrefixCls}`,
`${inputPrefixCls}-${this.size}`,
{
[`${inputPrefixCls}-disabled`]: this.disabled
}
];
|
0aefe4aa
梁灏
update ColorPicker
|
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
|
},
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
|
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
|
},
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
|
284
|
}
|
c6faec44
梁灏
init ColorPicker
|
285
|
},
|
e7893a68
梁灏
update ColorPicker
|
286
287
288
|
watch: {
value (newVal) {
this.val = _colorChange(newVal);
|
0aefe4aa
梁灏
update ColorPicker
|
289
|
},
|
4109bbc6
梁灏
update ColorPicker
|
290
|
visible (val) {
|
0aefe4aa
梁灏
update ColorPicker
|
291
|
this.val = _colorChange(this.value);
|
4109bbc6
梁灏
update ColorPicker
|
292
293
294
295
296
|
if (val) {
this.$refs.drop.update();
} else {
this.$refs.drop.destroy();
}
|
e7893a68
梁灏
update ColorPicker
|
297
298
|
}
},
|
b6bda1dc
梁灏
update ColorPicker
|
299
|
methods: {
|
4109bbc6
梁灏
update ColorPicker
|
300
301
302
303
304
305
306
307
308
309
310
311
312
313
|
// 开启 transfer 时,点击 Drop 即会关闭,这里不让其关闭
handleTransferClick () {
if (this.transfer) this.disableCloseUnderTransfer = true;
},
handleClose () {
if (this.disableCloseUnderTransfer) {
this.disableCloseUnderTransfer = false;
return false;
}
this.visible = false;
},
toggleVisible () {
this.visible = !this.visible;
},
|
e7893a68
梁灏
update ColorPicker
|
314
315
316
317
318
319
320
321
322
323
324
325
326
327
|
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
|
328
|
|
e7893a68
梁灏
update ColorPicker
|
329
330
331
332
333
334
335
336
337
338
339
340
341
|
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
|
342
|
},
|
0aefe4aa
梁灏
update ColorPicker
|
343
|
handleSuccess () {
|
59dc2df0
梁灏
update ColorPicker
|
344
345
346
|
const color = this.formatColor;
this.$emit('input', color);
this.$emit('on-change', color);
|
4109bbc6
梁灏
update ColorPicker
|
347
|
this.handleClose();
|
0aefe4aa
梁灏
update ColorPicker
|
348
349
350
|
},
handleClear () {
this.$emit('input', '');
|
8dab987e
梁灏
update ColorPicker
|
351
|
this.$emit('on-change', '');
|
4109bbc6
梁灏
update ColorPicker
|
352
|
this.handleClose();
|
1f61a559
梁灏
update ColorPicker
|
353
354
355
|
},
handleSelectColor (color) {
this.val = _colorChange(color);
|
e7893a68
梁灏
update ColorPicker
|
356
|
}
|
b6bda1dc
梁灏
update ColorPicker
|
357
|
}
|
c6faec44
梁灏
init ColorPicker
|
358
359
|
};
</script>
|