vxe-pc-ui
Version:
A vue based PC component library
1 lines • 14.6 kB
JavaScript
Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=void 0;var _vue=require("vue"),_comp=require("../../ui/src/comp"),_xeUtils=_interopRequireDefault(require("xe-utils")),_ui=require("../../ui"),_dom=require("../../ui/src/dom"),_utils=require("../../ui/src/utils"),_util=require("./util"),_button=_interopRequireDefault(require("../../button/src/button")),_input=_interopRequireDefault(require("../../input/src/input")),_numberInput=_interopRequireDefault(require("../../number-input/src/number-input"));function _interopRequireDefault(e){return e&&e.__esModule?e:{default:e}}var _default=exports.default=(0,_comp.defineVxeComponent)({name:"VxeColorPicker",props:{modelValue:String,placeholder:String,clearable:{type:Boolean,default:()=>(0,_ui.getConfig)().colorPicker.clearable},type:{type:String,default:()=>(0,_ui.getConfig)().colorPicker.type},size:{type:String,default:()=>(0,_ui.getConfig)().colorPicker.size||(0,_ui.getConfig)().size},className:[String,Function],popupClassName:[String,Function],colors:{type:Array,default:()=>_xeUtils.default.clone((0,_ui.getConfig)().colorPicker.colors,!0)||[]},showAlpha:{type:Boolean,default:()=>(0,_ui.getConfig)().colorPicker.showAlpha},showEyeDropper:{type:Boolean,default:()=>(0,_ui.getConfig)().colorPicker.showEyeDropper},showColorExtractor:{type:Boolean,default:()=>(0,_ui.getConfig)().colorPicker.showColorExtractor},showQuick:{type:Boolean,default:()=>(0,_ui.getConfig)().colorPicker.showQuick},readonly:{type:Boolean,default:null},disabled:{type:Boolean,default:null},clickToCopy:{type:Boolean,default:()=>(0,_ui.getConfig)().colorPicker.clickToCopy},placement:String,transfer:{type:Boolean,default:null},popupConfig:Object},emits:["update:modelValue","change","clear","click"],setup(_,e){let t=e.emit,D=(0,_vue.inject)("$xeModal",null),O=(0,_vue.inject)("$xeDrawer",null),M=(0,_vue.inject)("$xeTable",null),o=(0,_vue.inject)("$xeForm",null),i=(0,_vue.inject)("xeFormItemInfo",null),h="undefined"!=typeof window?window.EyeDropper:null;var l=_xeUtils.default.uniqueId();let S=(0,_ui.useSize)(_).computeSize,v=(0,_vue.ref)(),p=(0,_vue.ref)(),d=(0,_vue.ref)(),m=(0,_vue.ref)(),g=(0,_vue.ref)(),x=(0,_vue.ref)(),f=(0,_vue.ref)(),b=(0,_vue.ref)(),k=(0,_vue.ref)(),C=(0,_vue.reactive)({initialized:!1,selectTyle:"hex",selectColor:""+(_.modelValue||""),showTypePopup:!1,panelColor:"",hexValue:"",rValue:0,gValue:0,bValue:0,aValue:0,panelIndex:0,panelStyle:{},panelPlacement:null,visiblePanel:!1,isAniVisible:!1,isActivated:!1}),y=[{label:"HEX",value:"hex"},{label:"RGB",value:"rgb"}],a={},L=(0,_vue.computed)(()=>{var e=_.readonly;return null===e?!!o&&o.props.readonly:e}),V=(0,_vue.computed)(()=>{var e=_.disabled;return null===e?!!o&&o.props.disabled:e}),w=(0,_vue.computed)(()=>{var e=_.transfer;if(null===e){var l=(0,_ui.getConfig)().colorPicker.transfer;if(_xeUtils.default.isBoolean(l))return l;if(M||D||O||o)return!0}return e}),N=(0,_vue.computed)(()=>{var e=_.colors;return e?e.map(e=>_xeUtils.default.isString(e)?{label:e,value:e}:{label:_xeUtils.default.eqNull(e.label)?e.value:e.label,value:e.value}):[]}),j=(0,_vue.computed)(()=>Object.assign({},(0,_ui.getConfig)().colorPicker.popupConfig,_.popupConfig)),P=(0,_vue.computed)(()=>{var e=C.selectTyle;return"rgb"===e}),H=(0,_vue.computed)(()=>{let l=C.selectTyle;return y.find(e=>e.value===l)}),$={refElem:v},F={},E={xID:l,props:_,context:e,reactData:C,getRefMaps:()=>$,getComputeMaps:()=>F},W=e=>{t("update:modelValue",e)},u=()=>{var e=_.modelValue;C.selectColor=_xeUtils.default.toValueString(e),T()},r=()=>{var e=_.type;let l="rgb"!==e&&"rgba"!==e?"hex":"rgb";C.selectTyle=l,u()},T=()=>{var e,{selectColor:l,isAniVisible:o}=C,t=P.value,i=m.value,a=x.value,l=(0,_util.parseColor)(l);C.hexValue=l.hex,C.rValue=l.r,C.gValue=l.g,C.bValue=l.b,C.aValue=l.a,l.value&&(t?"hex"===l.type&&(t=(0,_util.hexToRgb)(l.hex))&&(C.rValue=t.r,C.gValue=t.g,C.bValue=t.b,C.aValue=t.a):"hex"!==l.type&&(C.hexValue=(0,_util.rgbToHex)(l))),o&&(t="hex"===l.type?(0,_util.hexToHsv)(l.hex):(0,_util.rgbToHsv)(l),o=b.value,t&&(o&&(e=o.clientHeight*(1-t.v),o=o.clientWidth*t.s,ne(o,e)),i)&&R(_xeUtils.default.ceil((1-t.h/360)*i.clientWidth)),a)&&B(a.clientWidth*l.a)},Y=()=>{C.panelIndex<(0,_utils.getLastZIndex)()&&(C.panelIndex=(0,_utils.nextZIndex)())},n=()=>{let o=_.placement,t=C.panelIndex,i=v.value,a=d.value,u=w.value,r=j.value;var e=()=>{var e=(0,_dom.updatePanelPlacement)(i,a,{placement:r.placement||o,defaultPlacement:r.defaultPlacement,teleportTo:u}),l=Object.assign(e.style,{zIndex:t});C.panelStyle=l,C.panelPlacement=e.placement};return e(),(0,_vue.nextTick)().then(e)},c=()=>{var e=a.hpTimeout;V.value||(e&&(clearTimeout(e),a.hpTimeout=void 0),C.initialized||(C.initialized=!0),C.isActivated=!0,C.isAniVisible=!0,setTimeout(()=>{T(),C.visiblePanel=!0},10),Y(),n())},s=()=>{C.visiblePanel=!1,a.hpTimeout=setTimeout(()=>{C.isAniVisible=!1},350)},I=(e,l)=>{(C.selectColor=l)!==_.modelValue&&(W(l),q("change",{value:l},e),o)&&i&&o.triggerItemEvent(e,i.itemConfig.field,l)},X=(e,l)=>{I(e,l),q("clear",{value:l},e)},G=()=>{V.value||C.visiblePanel||c()},K=()=>{C.isActivated=!1},Q=e=>{X(e,null),s()},Z=e=>{var l=C.selectColor;I(e,l),s()},J=e=>{e.preventDefault(),(C.visiblePanel?s:c)()},ee=e=>{J(e),q("click",{},e)},le=()=>{C.showTypePopup=!1},oe=e=>{e.stopPropagation(),C.showTypePopup=!C.showTypePopup},te=e=>{var l=C.selectTyle;e!==l&&(C.selectTyle=e,T()),C.showTypePopup=!1},R=t=>{var i=m.value,a=g.value;if(i&&a){t<0&&(t=0);var i=_xeUtils.default.toInteger(i.clientWidth),u=255,i=_xeUtils.default.ceil(1530/i*t),r=i%u;let e=0,l=0,o=0;switch(Math.ceil(i/u)){case 1:e=u,o=r;break;case 2:e=u-r,o=u;break;case 3:l=r,o=u;break;case 4:l=u,o=u-r;break;case 5:e=r,l=u;break;case 6:e=u,l=u-r}C.panelColor=(0,_util.toRgb)(e,l,o),a.style.left=(0,_dom.toCssUnit)(t)}},U=e=>{var l=m.value,o=g.value;l&&o&&(o=l.getBoundingClientRect(),l=_xeUtils.default.toInteger(l.clientWidth),l=_xeUtils.default.ceil(Math.min(l-1,Math.max(1,e.clientX-o.x))),R(l))},ie=e=>{e.preventDefault(),document.onmousemove=e=>{e.preventDefault(),U(e)},document.onmouseup=e=>{document.onmousemove=null,document.onmouseup=null,U(e)}},B=e=>{var l=C.selectColor,o=x.value,t=f.value;o&&t&&(o=o.getBoundingClientRect().width,o=_xeUtils.default.ceil(100/o*(e=o<(e=e<0?0:e)?o:e)/100,2),C.aValue=o,t.style.left=(0,_dom.toCssUnit)(e),C.selectColor=(0,_util.updateColorAlpha)(l,o))},z=e=>{var l=x.value,o=f.value;l&&o&&(l=(o=l.getBoundingClientRect()).width,l=Math.min(l,Math.max(0,e.clientX-o.x)),B(l),T())},ae=e=>{e.preventDefault(),document.onmousemove=e=>{e.preventDefault(),z(e)},document.onmouseup=e=>{document.onmousemove=null,document.onmouseup=null,z(e)}},A=()=>{var{rValue:e,gValue:l,bValue:o,aValue:t}=C;C.selectColor=(0,_util.toRgb)(e,l,o,t),T()},ue=()=>{var e=C.aValue,l=x.value,o=f.value;l&&o&&(o=l.getBoundingClientRect().width*e,B(o))},re=(e,l)=>{l=l.value;C.selectColor=l,T()},ne=(e,l)=>{var o=k.value;o&&(o.style.top=(0,_dom.toCssUnit)(l),o.style.left=(0,_dom.toCssUnit)(e))},ce=()=>{if(h)try{(new h).open().then(e=>{e&&e.sRGBHex&&(C.selectColor=e.sRGBHex,T())}).catch(()=>{})}catch(e){}},se=(e,l)=>{var o,t=_.showAlpha,{panelColor:i,aValue:a}=C,u=b.value,r=k.value;u&&r&&({clientWidth:r,clientHeight:o}=u,u=u.getBoundingClientRect(),l=Math.min(o,Math.max(0,l-u.y)),e=Math.min(r,Math.max(0,e-u.x)),(u=(0,_util.parseColor)(i))&&(i="hex"===u.type?(0,_util.hexToHsv)(u.hex):(0,_util.rgbToHsv)(u))&&(u=(0,_util.hsvToRgb)(i.h,e/r,1-l/o),C.selectColor=(0,_util.toRgb)(u.r,u.g,u.b,t?a:null),T()),ne(e,l))},ve=e=>{e.stopPropagation(),e.preventDefault(),se(e.clientX,e.clientY),document.onmousemove=e=>{se(e.clientX,e.clientY)},document.onmouseup=()=>{document.onmousemove=null,document.onmouseup=null}},pe=()=>{var e=C.selectColor;e&&_ui.VxeUI.clipboard.copy(e)&&_ui.VxeUI.modal&&_ui.VxeUI.modal.message({content:(0,_ui.getI18n)("vxe.colorPicker.copySuccess",[e]),status:"success"})},de=e=>{var l=C.visiblePanel;V.value||l&&(l=d.value,((0,_dom.getEventTargetNode)(e,l).flag?n:s)())},_e=e=>{var l,o,t=C.visiblePanel;V.value||(l=v.value,o=d.value,C.isActivated=(0,_dom.getEventTargetNode)(e,l).flag||(0,_dom.getEventTargetNode)(e,o).flag,t&&!C.isActivated&&s())},he=()=>{var{visiblePanel:e,isActivated:l}=C;e&&s(),l&&(C.isActivated=!1),(e||l)&&(e=p.value)&&e.blur()},me=()=>{var e=C.visiblePanel;e&&n()},q=(e,l,o)=>{t(e,(0,_ui.createEvent)(o,{$colorPicker:E},l))};l={dispatchEvent:q};Object.assign(E,l,{});return(0,_vue.watch)(()=>_.modelValue,()=>{u()}),(0,_vue.watch)(()=>_.type,()=>{r()}),(0,_vue.onMounted)(()=>{_ui.globalEvents.on(E,"mousewheel",de),_ui.globalEvents.on(E,"mousedown",_e),_ui.globalEvents.on(E,"blur",he),_ui.globalEvents.on(E,"resize",me)}),(0,_vue.onUnmounted)(()=>{_ui.globalEvents.off(E,"mousewheel"),_ui.globalEvents.off(E,"mousedown"),_ui.globalEvents.off(E,"blur"),_ui.globalEvents.off(E,"resize")}),r(),(0,_vue.provide)("$xeColorPicker",E),E.renderVN=()=>{var{className:e,popupClassName:l,clearable:o,modelValue:t}=_,{initialized:i,isActivated:a,isAniVisible:u,visiblePanel:r}=C,n=S.value,c=V.value,s=w.value;return L.value?(0,_vue.h)("div",{ref:v,class:["vxe-color-picker--readonly",e]},[(0,_vue.h)("div",{class:"vxe-color-picker--readonly-color",style:{backgroundColor:t}})]):(0,_vue.h)("div",{ref:v,class:["vxe-color-picker",e?_xeUtils.default.isFunction(e)?e({$colorPicker:E}):e:"",{["size--"+n]:n,"is--selected":!!t,"is--visible":r,"is--disabled":c,"is--active":a}]},[(0,_vue.h)("input",{ref:p,class:"vxe-color-picker--input",onFocus:G,onBlur:K}),(0,_vue.h)("div",{class:"vxe-color-picker--inner",onClick:ee},[(0,_vue.h)("div",{class:"vxe-color-picker--inner-color",style:{backgroundColor:t}})]),(0,_vue.h)(_vue.Teleport,{to:"body",disabled:!s||!i},[(0,_vue.h)("div",{ref:d,class:["vxe-table--ignore-clear vxe-color-picker--panel",l?_xeUtils.default.isFunction(l)?l({$colorPicker:E}):l:"",{["size--"+n]:n,"is--transfer":s,"ani--leave":u,"ani--enter":r}],placement:C.panelPlacement,style:C.panelStyle},[i&&(r||u)?(0,_vue.h)("div",{class:"vxe-color-picker--panel-wrapper",onClick:le},[(e=_.showColorExtractor,c=C.panelColor,e?(0,_vue.h)("div",{ref:b,class:"vxe-color-picker--color-wrapper",onMousedown:ve},[(0,_vue.h)("div",{class:"vxe-color-picker--color-bg",style:{backgroundColor:c}}),(0,_vue.h)("div",{class:"vxe-color-picker--white-bg"}),(0,_vue.h)("div",{class:"vxe-color-picker--black-bg"}),(0,_vue.h)("div",{ref:k,class:"vxe-color-picker--color-active"})]):(0,_ui.renderEmptyElement)(E)),(()=>{var{showAlpha:e,clickToCopy:l,showEyeDropper:o}=_,{selectTyle:t,showTypePopup:i,hexValue:a,rValue:u,gValue:r,bValue:n,aValue:c,selectColor:s,panelColor:v}=C,p=P.value,d=H.value;return(0,_vue.h)("div",{class:"vxe-color-picker--bar-wrapper"},[(0,_vue.h)("div",{class:"vxe-color-picker--slider-wrapper"},[o&&h?(0,_vue.h)("div",{class:"vxe-color-picker--color-dropper"},[(0,_vue.h)("span",{class:"vxe-color-picker--color-dropper-btn",onClick:ce},[(0,_vue.h)("i",{class:(0,_ui.getIcon)().COLOR_PICKER_EYE_DROPPER})])]):(0,_ui.renderEmptyElement)(E),(0,_vue.h)("div",{class:"vxe-color-picker--slider-preview"},[(0,_vue.h)("div",{class:"vxe-color-picker--preview-btn"},[(0,_vue.h)("div",{class:"vxe-color-picker--preview-color",style:{backgroundColor:s}},l?[(0,_vue.h)("span",{class:"vxe-color-picker--preview-copy-btn",onClick:pe},[(0,_vue.h)("i",{class:(0,_ui.getIcon)().COLOR_PICKER_COLOR_COPY})])]:[])])]),(0,_vue.h)("div",{class:"vxe-color-picker--slider-handle"},[(0,_vue.h)("div",{ref:m,class:"vxe-color-picker--bar-hue-slider",onClick:U},[(0,_vue.h)("div",{ref:g,class:"vxe-color-picker--bar-hue-btn",onMousedown:ie})]),e?(0,_vue.h)("div",{ref:x,class:"vxe-color-picker--bar-alpha-slider",onClick:z},[(0,_vue.h)("div",{class:"vxe-color-picker--bar-alpha-bg",style:{background:`linear-gradient(to right, rgba(0, 0, 0, 0), ${v})`}}),(0,_vue.h)("div",{ref:f,class:"vxe-color-picker--bar-alpha-btn",onMousedown:ae})]):(0,_ui.renderEmptyElement)(E)])]),(0,_vue.h)("div",{class:"vxe-color-picker--custom-wrapper"},[(0,_vue.h)("div",{class:"vxe-color-picker--type-switch"},[(0,_vue.h)("div",{class:"vxe-color-picker--type-label",onClick:oe},[(0,_vue.h)("span",""+(d?d.label:t)),(0,_vue.h)("span",{class:"vxe-color-picker--type-icon"},[(0,_vue.h)("i",{class:i?(0,_ui.getIcon)().COLOR_PICKER_TPTY_OPEN:(0,_ui.getIcon)().COLOR_PICKER_TPTY_CLOSE})])]),(0,_vue.h)("div",{class:["vxe-color-picker--type-popup",{"is--visible":i}]},y.map(l=>(0,_vue.h)("div",{class:"vxe-color-picker--type-item",onClick(e){e.stopPropagation(),te(l.value)}},l.label)))]),(0,_vue.h)("div",{class:`vxe-color-picker--${t}-wrapper`},p?[(0,_vue.h)("div",{class:"vxe-color-picker--input-wrapper"},[(0,_vue.h)(_numberInput.default,{type:"integer",size:"mini",align:"center",min:0,max:255,maxLength:3,placeholder:"",modelValue:u,controlConfig:{showButton:!1},"onUpdate:modelValue"(e){C.rValue=e},onChange:A}),(0,_vue.h)(_numberInput.default,{type:"integer",size:"mini",align:"center",min:0,max:255,maxLength:3,placeholder:"",modelValue:r,controlConfig:{showButton:!1},"onUpdate:modelValue"(e){C.gValue=e},onChange:A}),(0,_vue.h)(_numberInput.default,{type:"integer",size:"mini",align:"center",min:0,max:255,maxLength:3,placeholder:"",modelValue:n,controlConfig:{showButton:!1},"onUpdate:modelValue"(e){C.bValue=e},onChange:A}),(0,_vue.h)(_numberInput.default,{type:"number",size:"mini",align:"center",min:0,max:1,step:.01,maxLength:4,placeholder:"",modelValue:c,controlConfig:{showButton:!1},"onUpdate:modelValue"(e){C.aValue=e},onChange:ue})]),(0,_vue.h)("div",{class:"vxe-color-picker--input-title"},[(0,_vue.h)("span","R"),(0,_vue.h)("span","G"),(0,_vue.h)("span","B"),(0,_vue.h)("span","A")])]:[(0,_vue.h)("div",{class:"vxe-color-picker--input-wrapper"},[(0,_vue.h)(_input.default,{type:"text",size:"mini",align:"center",maxLength:9,placeholder:"",modelValue:a,"onUpdate:modelValue"(e){C.hexValue=e},onChange(){var e=(0,_util.parseColor)(C.hexValue);e&&e.value&&(C.selectColor=e.value,T())}})]),(0,_vue.h)("div",{class:"vxe-color-picker--input-title"},(0,_ui.getI18n)("vxe.colorPicker.hex"))])])])})(),(a=_.showQuick,t=N.value,a&&t.length?(0,_vue.h)("div",{class:"vxe-color-picker--quick-wrapper"},t.map((l,e)=>(0,_vue.h)("div",{key:e,class:"vxe-color-picker--quick-item",title:l.label||"",style:{backgroundColor:l.value},onClick(e){re(e,l)}}))):(0,_ui.renderEmptyElement)(E)),(0,_vue.h)("div",{class:"vxe-color-picker--footer-wrapper"},[o?(0,_vue.h)(_button.default,{content:(0,_ui.getI18n)("vxe.colorPicker.clear"),size:"mini",onClick:Q}):(0,_ui.renderEmptyElement)(E),(0,_vue.h)(_button.default,{content:(0,_ui.getI18n)("vxe.colorPicker.confirm"),size:"mini",status:"primary",onClick:Z})])]):(0,_ui.renderEmptyElement)(E)])])])},E},render(){return this.renderVN()}});