diff --git a/src/editor/slider/ibiz-slider/ibiz-slider.scss b/src/editor/slider/ibiz-slider/ibiz-slider.scss index 588036e6c6445b206ca0fd8df8602c544e65c860..5e91c1e2414926e4ad0c3f5782bd802531479120 100644 --- a/src/editor/slider/ibiz-slider/ibiz-slider.scss +++ b/src/editor/slider/ibiz-slider/ibiz-slider.scss @@ -1,6 +1,14 @@ $editor-slider: ( trigger-width: rem(6px), text-width: rem(38px), + pie-bg:rgba( + var(#{getCssVarName(blue, 4)}), + 1 + ), + pie-percent-bg:rgba( + var(#{getCssVarName(teal, 4)}), + 1 + ), ); @include b('slider') { @@ -48,9 +56,44 @@ $editor-slider: ( } } } + @include e('pie'){ + width: 100%; + } + + @keyframes spin { + to { transform: rotate(.5turn); } + } + + @keyframes bg { + 50% { background: getCssVar('editor-slider', 'pie-percent-bg'); } + } + + @include e('pie-content'){ + background: getCssVar('editor-slider', 'pie-bg'); + background-image:linear-gradient(to right, transparent 50%, getCssVar('editor-slider', 'pie-percent-bg') 0); + border-radius: 50%; + @include when(hundred-percent){ + background: getCssVar('editor-slider', 'pie-percent-bg'); + } + + &::before { + display: block; + height: 100%; + margin-left: 50%; + content: ''; + background-color: inherit; + border-radius: 0 100% 100% 0 / 50%; + transform-origin: left; + animation: spin 50s linear infinite, + bg 100s step-end infinite; + animation-play-state: paused; + animation-delay: inherit; + } + } } + @include b(form-item){ @include b(slider) { diff --git a/src/editor/slider/ibiz-slider/ibiz-slider.tsx b/src/editor/slider/ibiz-slider/ibiz-slider.tsx index 2e9afa2d7da6010e5a2d30e8ddf7e6d096fec4ad..ea70c4773780383b7a12ecf5d4d58e6e2a52e967 100644 --- a/src/editor/slider/ibiz-slider/ibiz-slider.tsx +++ b/src/editor/slider/ibiz-slider/ibiz-slider.tsx @@ -1,3 +1,4 @@ +/* eslint-disable no-use-before-define */ import { computed, defineComponent, ref, watch } from 'vue'; import { getEditorEmits, @@ -25,6 +26,9 @@ export const IBizSlider = defineComponent({ emit, ); + // 饼图样式 + const pieStyle = ref(''); + // 步长 let step = 1; // 设置滑动输入条允许的最大值 @@ -45,6 +49,10 @@ export const IBizSlider = defineComponent({ let type = 'line'; // 文本显示属性 let textItem = ''; + // 饼图背景色 + let pieBg = ''; + // 饼图占比背景色 + let piePercentBg = ''; if (editorModel.editorParams) { if (editorModel.editorParams.stepvalue) { step = toNumber(editorModel.editorParams.stepvalue); @@ -76,6 +84,12 @@ export const IBizSlider = defineComponent({ if (editorModel.editorParams.textItem) { textItem = editorModel.editorParams.textItem; } + if (editorModel.editorParams.pieBg) { + pieBg = editorModel.editorParams.pieBg; + } + if (editorModel.editorParams.piePercentBg) { + piePercentBg = editorModel.editorParams.piePercentBg; + } } // 是否显示表单默认内容 @@ -105,6 +119,8 @@ export const IBizSlider = defineComponent({ return Number(val) * 100; }; + const width = ref(126); + // 处理当前值 const handleCurVal = (val: string | number) => { switch (type) { @@ -112,11 +128,26 @@ export const IBizSlider = defineComponent({ return handleLineVal(val); case 'circle': return handleCircleVal(val); + case 'pie': + return handleCircleVal(val); default: return val; } }; + // 计算饼图行内样式 + const caclPieStyle = () => { + pieStyle.value = ''; + pieStyle.value = `height:${width.value}px;width:${width.value}px;`; + if (pieBg) { + pieStyle.value += `--ibiz-editor-slider-pie-bg:${pieBg};`; + } + if (piePercentBg) { + pieStyle.value += `--ibiz-editor-slider-pie-percent-bg:${piePercentBg};`; + } + pieStyle.value += `animation-delay:-${currentVal.value}s;`; + }; + // 当前值 const currentVal = ref>(); watch( @@ -130,8 +161,14 @@ export const IBizSlider = defineComponent({ } else { currentVal.value = 0; } + if (type === 'pie') { + caclPieStyle(); + } } else { currentVal.value = handleCurVal(newVal); + if (type === 'pie') { + caclPieStyle(); + } } } }, @@ -181,6 +218,8 @@ export const IBizSlider = defineComponent({ showText, textVal, showFormDefaultContent, + width, + pieStyle, }; }, render() { @@ -228,6 +267,18 @@ export const IBizSlider = defineComponent({ ); } + if (this.type === 'pie') { + content = ( +
+ ); + } + return (
void; let blurCacheValue: string | undefined; // 值变更 const handleChange = (val: string | number) => { @@ -135,18 +138,35 @@ export const IBizInput = defineComponent({ blurCacheValue = undefined; }; + const debounceChange = debounce( + (val: string | number) => { + // 拦截掉blur触发后change + if (blurCacheValue !== val) { + onEmit(val, 'input'); + } + blurCacheValue = undefined; + isDebounce = false; + if (awaitSearch) { + awaitSearch(); + } + }, + 300, + { leading: true }, + ); + const handleInput = (val: string | number) => { - // 拦截掉blur触发后change - if (blurCacheValue !== val) { - onEmit(val, 'input'); - } - blurCacheValue = undefined; + isDebounce = true; + debounceChange(val); }; const handleKeyUp = (e: KeyboardEvent) => { if (e && e.code === 'Enter') { emit('enter', e); - editorRef.value.$el.dispatchEvent(e); + if (isDebounce) { + awaitSearch = () => { + editorRef.value.$el.dispatchEvent(e); + }; + } } };