diff --git a/packages/color-picker/src/components/picker-dropdown.vue b/packages/color-picker/src/components/picker-dropdown.vue index e9572b8f5..6dc48abe2 100644 --- a/packages/color-picker/src/components/picker-dropdown.vue +++ b/packages/color-picker/src/components/picker-dropdown.vue @@ -9,7 +9,14 @@
- {{ currentColor }} + + + + {{ t('el.colorpicker.clear') }}
@@ -23,6 +30,7 @@ import AlphaSlider from './alpha-slider'; import Popper from 'element-ui/src/utils/vue-popper'; import Locale from 'element-ui/src/mixins/locale'; + import ElInput from 'element-ui/packages/input'; export default { name: 'el-color-picker-dropdown', @@ -32,7 +40,8 @@ components: { SvPanel, HueSlider, - AlphaSlider + AlphaSlider, + ElInput }, props: { @@ -42,6 +51,12 @@ showAlpha: Boolean }, + data() { + return { + customInput: '' + }; + }, + computed: { currentColor() { const parent = this.$parent; @@ -52,6 +67,29 @@ methods: { confirmValue() { 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(); }); } + }, + + currentColor(val) { + this.customInput = val; } } }; diff --git a/test/unit/specs/color-picker.spec.js b/test/unit/specs/color-picker.spec.js index c2191f286..cd4fd2e4e 100644 --- a/test/unit/specs/color-picker.spec.js +++ b/test/unit/specs/color-picker.spec.js @@ -97,8 +97,8 @@ describe('ColorPicker', () => { trigger.click(); setTimeout(() => { - const value = document.querySelector('.el-color-dropdown__value'); - expect(value.innerText.trim().toUpperCase()).to.equal('#20A0FF'); + const input = document.querySelector('.el-color-dropdown__value input'); + expect(input.value.trim().toUpperCase()).to.equal('#20A0FF'); done(); }, ANIMATION_TIME); });