ColorPicker: support user input (#6167)

* ColorPicker: support user input

* support alpha

* Update picker-dropdown.vue
pull/6325/head
Dreamacro 2017-08-05 16:58:09 +08:00 committed by 杨奕
parent 5b7a40e951
commit 78e947bcac
2 changed files with 46 additions and 4 deletions

View File

@ -9,7 +9,14 @@
</div> </div>
<alpha-slider v-if="showAlpha" ref="alpha" :color="color"></alpha-slider> <alpha-slider v-if="showAlpha" ref="alpha" :color="color"></alpha-slider>
<div class="el-color-dropdown__btns"> <div class="el-color-dropdown__btns">
<span class="el-color-dropdown__value">{{ currentColor }}</span> <span class="el-color-dropdown__value">
<el-input
v-model="customInput"
@keyup.native.enter="handleConfirm"
@blur="handleConfirm"
size="mini">
</el-input>
</span>
<a href="JavaScript:" class="el-color-dropdown__link-btn" @click="$emit('clear')">{{ t('el.colorpicker.clear') }}</a> <a href="JavaScript:" class="el-color-dropdown__link-btn" @click="$emit('clear')">{{ t('el.colorpicker.clear') }}</a>
<button class="el-color-dropdown__btn" @click="confirmValue">{{ t('el.colorpicker.confirm') }}</button> <button class="el-color-dropdown__btn" @click="confirmValue">{{ t('el.colorpicker.confirm') }}</button>
</div> </div>
@ -23,6 +30,7 @@
import AlphaSlider from './alpha-slider'; import AlphaSlider from './alpha-slider';
import Popper from 'element-ui/src/utils/vue-popper'; import Popper from 'element-ui/src/utils/vue-popper';
import Locale from 'element-ui/src/mixins/locale'; import Locale from 'element-ui/src/mixins/locale';
import ElInput from 'element-ui/packages/input';
export default { export default {
name: 'el-color-picker-dropdown', name: 'el-color-picker-dropdown',
@ -32,7 +40,8 @@
components: { components: {
SvPanel, SvPanel,
HueSlider, HueSlider,
AlphaSlider AlphaSlider,
ElInput
}, },
props: { props: {
@ -42,6 +51,12 @@
showAlpha: Boolean showAlpha: Boolean
}, },
data() {
return {
customInput: ''
};
},
computed: { computed: {
currentColor() { currentColor() {
const parent = this.$parent; const parent = this.$parent;
@ -52,6 +67,29 @@
methods: { methods: {
confirmValue() { confirmValue() {
this.$emit('pick'); this.$emit('pick');
},
handleConfirm() {
const valid = this.showAlpha ? this.validRGBA(this.customInput) : this.validRGBHex(this.customInput);
if (valid) {
this.color.fromString(this.customInput);
} else {
this.customInput = this.currentColor;
}
},
validRGBHex(color) {
return /^#[A-Fa-f0-9]{6}$/.test(color);
},
validRGBA(color) {
const matches = color.match(/^rgba\((\d+), ?(\d+), ?(\d+), ?([.0-9]+)\)$/);
if (!matches) return false;
const list = matches.map(v => parseInt(v, 10)).slice(1);
if (list.some(v => isNaN(v))) return false;
const [r, g, b, a] = list;
if ([r, g, b].some(v => v < 0 || v > 255) || a < 0 || a > 1) return false;
return true;
} }
}, },
@ -70,6 +108,10 @@
alpha && alpha.update(); alpha && alpha.update();
}); });
} }
},
currentColor(val) {
this.customInput = val;
} }
} }
}; };

View File

@ -97,8 +97,8 @@ describe('ColorPicker', () => {
trigger.click(); trigger.click();
setTimeout(() => { setTimeout(() => {
const value = document.querySelector('.el-color-dropdown__value'); const input = document.querySelector('.el-color-dropdown__value input');
expect(value.innerText.trim().toUpperCase()).to.equal('#20A0FF'); expect(input.value.trim().toUpperCase()).to.equal('#20A0FF');
done(); done();
}, ANIMATION_TIME); }, ANIMATION_TIME);
}); });