/
githubmirror
/
element
Обзор
Документация
Войти
/
githubmirror
/
element
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
dev
packages/color-picker/src/main.vue
188 строк
5 KB
hetech
ColorPicker: not trigger form validation when dragging (#13299)
05 ноя 2018, 14:21
Не верифицирован
05 ноя 2018, 14:21
9a31f5f
Код
Авторство
О чём код?
<template> <div :class="[ 'el-color-picker', colorDisabled ? 'is-disabled' : '', colorSize ? `el-color-picker--${ colorSize }` : '' ]" v-clickoutside="hide"> <div class="el-color-picker__mask" v-if="colorDisabled"></div> <div class="el-color-picker__trigger" @click="handleTrigger"> <span class="el-color-picker__color" :class="{ 'is-alpha': showAlpha }"> <span class="el-color-picker__color-inner" :style="{ backgroundColor: displayedColor }"></span> <span class="el-color-picker__empty el-icon-close" v-if="!value && !showPanelColor"></span> </span> <span class="el-color-picker__icon el-icon-arrow-down" v-show="value || showPanelColor"></span> </div> <picker-dropdown ref="dropdown" :class="['el-color-picker__panel', popperClass || '']" v-model="showPicker" @pick="confirmValue" @clear="clearValue" :color="color" :show-alpha="showAlpha" :predefine="predefine"> </picker-dropdown> </div> </template> <script> import Color from './color'; import PickerDropdown from './components/picker-dropdown.vue'; import Clickoutside from 'element-ui/src/utils/clickoutside'; import Emitter from 'element-ui/src/mixins/emitter'; export default { name: 'ElColorPicker', mixins: [Emitter], props: { value: String, showAlpha: Boolean, colorFormat: String, disabled: Boolean, size: String, popperClass: String, predefine: Array }, inject: { elForm: { default: '' }, elFormItem: { default: '' } }, directives: { Clickoutside }, computed: { displayedColor() { if (!this.value && !this.showPanelColor) { return 'transparent'; } return this.displayedRgb(this.color, this.showAlpha); }, _elFormItemSize() { return (this.elFormItem || {}).elFormItemSize; }, colorSize() { return this.size || this._elFormItemSize || (this.$ELEMENT || {}).size; }, colorDisabled() { return this.disabled || (this.elForm || {}).disabled; } }, watch: { value(val) { if (!val) { this.showPanelColor = false; } else if (val && val !== this.color.value) { this.color.fromString(val); } }, color: { deep: true, handler() { this.showPanelColor = true; } }, displayedColor(val) { if (!this.showPicker) return; const currentValueColor = new Color({ enableAlpha: this.showAlpha, format: this.colorFormat }); currentValueColor.fromString(this.value); const currentValueColorRgb = this.displayedRgb(currentValueColor, this.showAlpha); if (val !== currentValueColorRgb) { this.$emit('active-change', val); } } }, methods: { handleTrigger() { if (this.colorDisabled) return; this.showPicker = !this.showPicker; }, confirmValue() { const value = this.color.value; this.$emit('input', value); this.$emit('change', value); this.dispatch('ElFormItem', 'el.form.change', value); this.showPicker = false; }, clearValue() { this.$emit('input', null); this.$emit('change', null); if (this.value !== null) { this.dispatch('ElFormItem', 'el.form.change', null); } this.showPanelColor = false; this.showPicker = false; this.resetColor(); }, hide() { this.showPicker = false; this.resetColor(); }, resetColor() { this.$nextTick(_ => { if (this.value) { this.color.fromString(this.value); } else { this.showPanelColor = false; } }); }, displayedRgb(color, showAlpha) { if (!(color instanceof Color)) { throw Error('color should be instance of Color Class'); } const { r, g, b } = color.toRgb(); return showAlpha ? `rgba(${ r }, ${ g }, ${ b }, ${ color.get('alpha') / 100 })` : `rgb(${ r }, ${ g }, ${ b })`; } }, mounted() { const value = this.value; if (value) { this.color.fromString(value); } this.popperElm = this.$refs.dropdown.$el; }, data() { const color = new Color({ enableAlpha: this.showAlpha, format: this.colorFormat }); return { color, showPicker: false, showPanelColor: false }; }, components: { PickerDropdown } }; </script>