4a9bbe72fb819d3326a6b7db6061db8fc1912549e21b56c2fa610ebc84dbf3dd03a8cdc8e53526797ea825a2c3388d858d54900197096e0347f970cc6b2501 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. <template>
  2. <div
  3. :class="[
  4. 'el-color-picker',
  5. colorDisabled ? 'is-disabled' : '',
  6. colorSize ? `el-color-picker--${ colorSize }` : ''
  7. ]"
  8. v-clickoutside="hide">
  9. <div class="el-color-picker__mask" v-if="colorDisabled"></div>
  10. <div class="el-color-picker__trigger" @click="handleTrigger">
  11. <span class="el-color-picker__color" :class="{ 'is-alpha': showAlpha }">
  12. <span class="el-color-picker__color-inner"
  13. :style="{
  14. backgroundColor: displayedColor
  15. }"></span>
  16. <span class="el-color-picker__empty el-icon-close" v-if="!value && !showPanelColor"></span>
  17. </span>
  18. <span class="el-color-picker__icon el-icon-arrow-down" v-show="value || showPanelColor"></span>
  19. </div>
  20. <picker-dropdown
  21. ref="dropdown"
  22. :class="['el-color-picker__panel', popperClass || '']"
  23. v-model="showPicker"
  24. @pick="confirmValue"
  25. @clear="clearValue"
  26. :color="color"
  27. :show-alpha="showAlpha"
  28. :predefine="predefine">
  29. </picker-dropdown>
  30. </div>
  31. </template>
  32. <script>
  33. import Color from './color';
  34. import PickerDropdown from './components/picker-dropdown.vue';
  35. import Clickoutside from 'element-ui/src/utils/clickoutside';
  36. import Emitter from 'element-ui/src/mixins/emitter';
  37. export default {
  38. name: 'ElColorPicker',
  39. mixins: [Emitter],
  40. props: {
  41. value: String,
  42. showAlpha: Boolean,
  43. colorFormat: String,
  44. disabled: Boolean,
  45. size: String,
  46. popperClass: String,
  47. predefine: Array
  48. },
  49. inject: {
  50. elForm: {
  51. default: ''
  52. },
  53. elFormItem: {
  54. default: ''
  55. }
  56. },
  57. directives: { Clickoutside },
  58. computed: {
  59. displayedColor() {
  60. if (!this.value && !this.showPanelColor) {
  61. return 'transparent';
  62. }
  63. return this.displayedRgb(this.color, this.showAlpha);
  64. },
  65. _elFormItemSize() {
  66. return (this.elFormItem || {}).elFormItemSize;
  67. },
  68. colorSize() {
  69. return this.size || this._elFormItemSize || (this.$ELEMENT || {}).size;
  70. },
  71. colorDisabled() {
  72. return this.disabled || (this.elForm || {}).disabled;
  73. }
  74. },
  75. watch: {
  76. value(val) {
  77. if (!val) {
  78. this.showPanelColor = false;
  79. } else if (val && val !== this.color.value) {
  80. this.color.fromString(val);
  81. }
  82. },
  83. color: {
  84. deep: true,
  85. handler() {
  86. this.showPanelColor = true;
  87. }
  88. },
  89. displayedColor(val) {
  90. if (!this.showPicker) return;
  91. const currentValueColor = new Color({
  92. enableAlpha: this.showAlpha,
  93. format: this.colorFormat
  94. });
  95. currentValueColor.fromString(this.value);
  96. const currentValueColorRgb = this.displayedRgb(currentValueColor, this.showAlpha);
  97. if (val !== currentValueColorRgb) {
  98. this.$emit('active-change', val);
  99. }
  100. }
  101. },
  102. methods: {
  103. handleTrigger() {
  104. if (this.colorDisabled) return;
  105. this.showPicker = !this.showPicker;
  106. },
  107. confirmValue() {
  108. const value = this.color.value;
  109. this.$emit('input', value);
  110. this.$emit('change', value);
  111. this.dispatch('ElFormItem', 'el.form.change', value);
  112. this.showPicker = false;
  113. },
  114. clearValue() {
  115. this.$emit('input', null);
  116. this.$emit('change', null);
  117. if (this.value !== null) {
  118. this.dispatch('ElFormItem', 'el.form.change', null);
  119. }
  120. this.showPanelColor = false;
  121. this.showPicker = false;
  122. this.resetColor();
  123. },
  124. hide() {
  125. this.showPicker = false;
  126. this.resetColor();
  127. },
  128. resetColor() {
  129. this.$nextTick(_ => {
  130. if (this.value) {
  131. this.color.fromString(this.value);
  132. } else {
  133. this.showPanelColor = false;
  134. }
  135. });
  136. },
  137. displayedRgb(color, showAlpha) {
  138. if (!(color instanceof Color)) {
  139. throw Error('color should be instance of Color Class');
  140. }
  141. const { r, g, b } = color.toRgb();
  142. return showAlpha
  143. ? `rgba(${ r }, ${ g }, ${ b }, ${ color.get('alpha') / 100 })`
  144. : `rgb(${ r }, ${ g }, ${ b })`;
  145. }
  146. },
  147. mounted() {
  148. const value = this.value;
  149. if (value) {
  150. this.color.fromString(value);
  151. }
  152. this.popperElm = this.$refs.dropdown.$el;
  153. },
  154. data() {
  155. const color = new Color({
  156. enableAlpha: this.showAlpha,
  157. format: this.colorFormat
  158. });
  159. return {
  160. color,
  161. showPicker: false,
  162. showPanelColor: false
  163. };
  164. },
  165. components: {
  166. PickerDropdown
  167. }
  168. };
  169. </script>