Commit a3559c2fe925d9137e71c7c32268acfdd8a66404
1 parent
d6614521
feat(packages/external): 新增自定义按钮,点击跳转
Showing
4 changed files
with
110 additions
and
9 deletions
src/hooks/external/useButtonInteract.hook.ts
0 → 100644
| 1 | +import { toRefs, ref } from 'vue' | |
| 2 | +import { CreateComponentType } from '@/packages/index.d' | |
| 3 | +import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore' | |
| 4 | + | |
| 5 | +// 获取类型 | |
| 6 | +type ChartEditStoreType = typeof useChartEditStore | |
| 7 | + | |
| 8 | +// Params 参数修改触发 api 更新图表请求 | |
| 9 | +export const useChartInteract = ( | |
| 10 | + chartConfig: CreateComponentType, | |
| 11 | + useChartEditStore: ChartEditStoreType, | |
| 12 | + param: { [T: string]: any }, | |
| 13 | + interactEventOn: string, | |
| 14 | + target: string, | |
| 15 | + status: boolean | |
| 16 | +) => { | |
| 17 | + const chartEditStore = useChartEditStore() | |
| 18 | + const { interactEvents } = chartConfig.events | |
| 19 | + const fnOnEvent = interactEvents.filter(item => { | |
| 20 | + return item.interactOn === interactEventOn | |
| 21 | + }) | |
| 22 | + if (fnOnEvent.length === 0) return | |
| 23 | + fnOnEvent.forEach(item => { | |
| 24 | + const index = chartEditStore.fetchTargetIndex(item.interactComponentId) | |
| 25 | + if (index === -1) return | |
| 26 | + const { Params, Header } = toRefs(chartEditStore.componentList[index].request.requestParams) | |
| 27 | + Object.keys(item.interactFn).forEach(key => { | |
| 28 | + if (Params.value[key]) { | |
| 29 | + Params.value[key] = param[item.interactFn[key]] | |
| 30 | + } | |
| 31 | + if (Header.value[key]) { | |
| 32 | + Header.value[key] = param[item.interactFn[key]] | |
| 33 | + } | |
| 34 | + }) | |
| 35 | + updateIndex(chartConfig) | |
| 36 | + }) | |
| 37 | + | |
| 38 | + function updateIndex(chart: any) { | |
| 39 | + try { | |
| 40 | + const targetId = chart.option.dataset[0].target | |
| 41 | + const currentId = chart.option.dataset[0].current | |
| 42 | + const currentButtonId = chart.option.dataset[0].currentButton | |
| 43 | + const targetButtonId = chart.option.dataset[0].targetButton | |
| 44 | + const targetIndex = chartEditStore.fetchTargetIndex(targetId) | |
| 45 | + const currentIndex = chartEditStore.fetchTargetIndex(currentId) | |
| 46 | + const currentButtonIndex = chartEditStore.fetchTargetIndex(currentButtonId) | |
| 47 | + const targetButtonIndex = chartEditStore.fetchTargetIndex(targetButtonId) | |
| 48 | + chartEditStore.componentList[targetIndex].status.hide = false | |
| 49 | + chartEditStore.componentList[currentIndex].status.hide = true | |
| 50 | + chartEditStore.componentList[currentButtonIndex].status.hide = true | |
| 51 | + chartEditStore.componentList[targetButtonIndex].status.hide = false | |
| 52 | + } catch (e) { | |
| 53 | + console.error(e) | |
| 54 | + } | |
| 55 | + } | |
| 56 | +} | |
| 57 | + | |
| 58 | +// 联动事件触发的 type 变更时,清除当前绑定内容 | |
| 59 | +// eslint-disable-next-line @typescript-eslint/no-empty-function | |
| 60 | +export const clearInteractEvent = (chartConfig: CreateComponentType) => {} | ... | ... |
| 1 | 1 | <template> |
| 2 | 2 | <collapse-item name="按钮配置" :expanded="true"> |
| 3 | - <setting-item-box name="配置项" :alone="true"> | |
| 3 | + <setting-item-box name="默认值" :alone="true"> | |
| 4 | + <n-select size="small" v-model:value="optionData.buttonType" :options="buttonTypeOptions" /> | |
| 5 | + </setting-item-box> | |
| 6 | + <setting-item-box name="跳转配置项" :alone="true"> | |
| 4 | 7 | <setting-item v-for="(item, index) in optionData.dataset" :key="index"> |
| 5 | 8 | <n-input v-model:value="item.label" size="small" placeholder="按钮文字"></n-input> |
| 6 | 9 | <div style="height: 5px"></div> |
| ... | ... | @@ -28,4 +31,35 @@ defineProps({ |
| 28 | 31 | required: true |
| 29 | 32 | } |
| 30 | 33 | }) |
| 34 | + | |
| 35 | +const buttonTypeOptions = [ | |
| 36 | + { | |
| 37 | + label: 'default', | |
| 38 | + value: 'default' | |
| 39 | + }, | |
| 40 | + { | |
| 41 | + label: 'primary', | |
| 42 | + value: 'primary' | |
| 43 | + }, | |
| 44 | + { | |
| 45 | + label: 'tertiary', | |
| 46 | + value: 'tertiary' | |
| 47 | + }, | |
| 48 | + { | |
| 49 | + label: 'info', | |
| 50 | + value: 'info' | |
| 51 | + }, | |
| 52 | + { | |
| 53 | + label: 'success', | |
| 54 | + value: 'success' | |
| 55 | + }, | |
| 56 | + { | |
| 57 | + label: 'warning', | |
| 58 | + value: 'warning' | |
| 59 | + }, | |
| 60 | + { | |
| 61 | + label: 'error', | |
| 62 | + value: 'error' | |
| 63 | + } | |
| 64 | +] | |
| 31 | 65 | </script> | ... | ... |
| 1 | 1 | <template> |
| 2 | - <n-button :style="{ width: `${w}px`, height: `${h}px` }" type="primary" @click="onClick(option.value.dataset[0])">{{ | |
| 3 | - option.value.dataset[0].label | |
| 4 | - }}</n-button> | |
| 2 | + <n-button | |
| 3 | + :style="{ width: `${w}px`, height: `${h}px` }" | |
| 4 | + :type="buttonType" | |
| 5 | + @click="onClick(option.value.dataset[0],true)" | |
| 6 | + >{{ option.value.dataset[0].label }}</n-button | |
| 7 | + > | |
| 5 | 8 | </template> |
| 6 | 9 | |
| 7 | 10 | <script setup lang="ts"> |
| ... | ... | @@ -9,7 +12,7 @@ import { PropType, toRefs, shallowReactive, watch, onMounted } from 'vue' |
| 9 | 12 | import cloneDeep from 'lodash/cloneDeep' |
| 10 | 13 | import { CreateComponentType } from '@/packages/index.d' |
| 11 | 14 | import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore' |
| 12 | -import { useChartInteract } from '@/hooks' | |
| 15 | +import { useChartInteract } from '@/hooks/external/useButtonInteract.hook' | |
| 13 | 16 | import { InteractEventOn } from '@/enums/eventEnum' |
| 14 | 17 | import { ComponentInteractParamsEnum } from './interact' |
| 15 | 18 | |
| ... | ... | @@ -21,21 +24,24 @@ const props = defineProps({ |
| 21 | 24 | }) |
| 22 | 25 | |
| 23 | 26 | const { w, h } = toRefs(props.chartConfig.attr) |
| 27 | +const { buttonType } = toRefs(props.chartConfig.option) | |
| 24 | 28 | const option = shallowReactive({ |
| 25 | 29 | value: cloneDeep(props.chartConfig.option) |
| 26 | 30 | }) |
| 27 | 31 | |
| 28 | -const onClick = (v: any) => { | |
| 32 | +const onClick = (v: any, s: boolean) => { | |
| 29 | 33 | useChartInteract( |
| 30 | 34 | props.chartConfig, |
| 31 | 35 | useChartEditStore, |
| 32 | 36 | { [ComponentInteractParamsEnum.DATA]: v?.current }, |
| 33 | - InteractEventOn.CHANGE | |
| 37 | + InteractEventOn.CHANGE, | |
| 38 | + v?.target, | |
| 39 | + s | |
| 34 | 40 | ) |
| 35 | 41 | } |
| 36 | 42 | |
| 37 | 43 | onMounted(() => { |
| 38 | - // onClick(option.value.dataset[0], false) | |
| 44 | + onClick(option.value.dataset[0], false) | |
| 39 | 45 | }) |
| 40 | 46 | |
| 41 | 47 | // 手动更新 | ... | ... |