Commit 0f4fd10441ed95b7bdda89cf7af57134fac6e525

Authored by xp.Huang
2 parents fdac1076 303d9e5d

Merge branch 'dev_byft' into 'main_dev'

fix(src/views/chart):修复当历史数据折线图开启动画效果时,数据显示为10条数据,但是只执行动效到第七条又返回从第一条开始执行了

See merge request yunteng/thingskit-view!182
Showing 31 changed files with 884 additions and 977 deletions
src/components/external/Common/TKDialog/components/Circle.vue renamed from src/packages/components/external/Decorates/Mores/PickIcon/components/Circle.vue
  1 +export interface PopupConfigInterface {
  2 + borderWidth: number
  3 + borderHeight: number
  4 + borderColor: string
  5 + boxShadowColor: string
  6 + linearLeftColor: string
  7 + linearRightColor: string
  8 + arrowColor: string
  9 + lineColor: string
  10 + fontColor: string
  11 + fontSize: number
  12 + fontWeight: number
  13 + fontContent: string
  14 + labelColor: string
  15 + valueColor: string
  16 + placement: string
  17 +}
  18 +export interface PopupConfigData {
  19 + label: string
  20 + value: string
  21 +}
  1 +import TKDialog from './index.vue';
  2 +
  3 +export { TKDialog };
  1 +<template>
  2 + <n-popover
  3 + :disabled="disabled"
  4 + :placement="popupConfig.placement"
  5 + trigger="click"
  6 + raw
  7 + @update:show="handleUpdateShow"
  8 + >
  9 + <template #trigger>
  10 + <slot />
  11 + </template>
  12 + <div
  13 + style="transform-origin: inherit"
  14 + :style="`width:${popupConfig.borderWidth}px;
  15 + height: ${popupConfig.borderHeight}px;
  16 + box-shadow: 0 0 10px 10px ${popupConfig.boxShadowColor};
  17 + background:linear-gradient(to right, ${popupConfig.linearLeftColor} , ${popupConfig.linearRightColor});
  18 + `"
  19 + >
  20 + <div class="popup-body">
  21 + <div class="popup-arrow-right" :style="`border-color:${popupConfig.arrowColor}`"></div>
  22 + <div class="popup-header-content">
  23 + <p
  24 + class="header-title"
  25 + :style="`color:${popupConfig.fontColor};font-size:${popupConfig.fontSize}px;font-weight:${popupConfig.fontWeight}`"
  26 + >
  27 + {{ popupConfig.fontContent }}
  28 + </p>
  29 + <div class="header-content-graphical">
  30 + <div class="graphical-circle-left"><Circle /></div>
  31 + <div class="graphical-line">
  32 + <div class="line-left" :style="`background-color:${popupConfig.lineColor}`"></div>
  33 + <div class="line-center" :style="`background-color:${popupConfig.lineColor}`"></div>
  34 + <div class="line-right" :style="`background-color:${popupConfig.lineColor}`"></div>
  35 + </div>
  36 + <div class="graphical-circle-right"><Circle /></div>
  37 + </div>
  38 + </div>
  39 + </div>
  40 + <div class="content-body">
  41 + <div class="body" v-for="(item, index) in popupConfigData" :key="index">
  42 + <span :style="`color:${popupConfig.labelColor};`">{{ item.label }}</span>
  43 + <span :style="`color:${popupConfig.valueColor};`">{{ item.value }}</span>
  44 + </div>
  45 + </div>
  46 + </div>
  47 + </n-popover>
  48 +</template>
  49 +
  50 +<script lang="ts" setup name="TKDialog">
  51 +import { PropType } from 'vue'
  52 +import { PopupConfigInterface, PopupConfigData } from './index.d'
  53 +import Circle from './components/Circle.vue'
  54 +
  55 +defineProps({
  56 + popupConfig: {
  57 + type: Object as PropType<PopupConfigInterface>,
  58 + required: true
  59 + },
  60 + popupConfigData: {
  61 + type: Array as PropType<PopupConfigData[]>
  62 + },
  63 + w: Number,
  64 + h: Number,
  65 + disabled: {
  66 + type: Boolean,
  67 + default: false
  68 + }
  69 +})
  70 +
  71 +const emits = defineEmits(['updateShow'])
  72 +
  73 +const handleUpdateShow = (show: boolean) => {
  74 + console.log(show)
  75 + emits('updateShow', show)
  76 +}
  77 +</script>
  78 +
  79 +<style lang="scss" scoped>
  80 +@mixin base-text-ellipsis() {
  81 + overflow: hidden;
  82 + white-space: nowrap;
  83 + text-overflow: ellipsis;
  84 + -o-text-overflow: ellipsis;
  85 +}
  86 +.popup-body {
  87 + display: flex;
  88 + justify-content: center;
  89 + flex-direction: column;
  90 + .popup-arrow-right {
  91 + position: absolute;
  92 + top: 15px;
  93 + left: 10px;
  94 + border-right: 1px solid;
  95 + border-bottom: 1px solid;
  96 + width: 7px;
  97 + height: 7px;
  98 + transform: rotate(-45deg);
  99 + -o-transform: rotate(-45deg);
  100 + -webkit-transform: rotate(-45deg);
  101 + -moz-transform: rotate(-45deg);
  102 + -ms-transform: rotate(-45deg);
  103 + }
  104 + .popup-header-content {
  105 + margin: 23px;
  106 + display: flex;
  107 + justify-content: center;
  108 + flex-direction: column;
  109 + .header-title {
  110 + @include base-text-ellipsis;
  111 + }
  112 + .header-content-graphical {
  113 + display: flex;
  114 + align-items: center;
  115 + .graphical-circle-left {
  116 + position: relative;
  117 + left: -2px;
  118 + }
  119 + .graphical-line {
  120 + display: flex;
  121 + position: relative;
  122 + .line-left {
  123 + width: 115px;
  124 + height: 2px;
  125 + position: relative;
  126 + }
  127 + .line-center {
  128 + width: 35px;
  129 + height: 2px;
  130 + transform: rotateZ(145deg);
  131 + position: absolute;
  132 + top: -10px;
  133 + left: 112px;
  134 + }
  135 + .line-right {
  136 + width: 50px;
  137 + height: 2px;
  138 + position: absolute;
  139 + top: -20px;
  140 + left: 143px;
  141 + }
  142 + }
  143 + .graphical-circle-right {
  144 + position: absolute;
  145 + top: 29px;
  146 + left: 231px;
  147 + }
  148 + }
  149 + }
  150 +}
  151 +.content-body {
  152 + display: flex;
  153 + flex-direction: column;
  154 + gap: 4px;
  155 + width: v-bind('w+"px"');
  156 + margin: 0 15px;
  157 + height: v-bind('h+"px"');
  158 +}
  159 +</style>
1 -import { toRefs } from 'vue'  
2 import { CreateComponentType } from '@/packages/index.d' 1 import { CreateComponentType } from '@/packages/index.d'
3 import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore' 2 import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore'
4 import { PageChartEditStoreType } from '@/store/modules/chartEditStore/chartEditStore.d' 3 import { PageChartEditStoreType } from '@/store/modules/chartEditStore/chartEditStore.d'
@@ -10,5 +10,5 @@ export const InputsInputConfig: ConfigType = { @@ -10,5 +10,5 @@ export const InputsInputConfig: ConfigType = {
10 categoryName: ChatCategoryEnumName.INPUTS, 10 categoryName: ChatCategoryEnumName.INPUTS,
11 package: PackagesCategoryEnum.INFORMATIONS, 11 package: PackagesCategoryEnum.INFORMATIONS,
12 chartFrame: ChartFrameEnum.STATIC, 12 chartFrame: ChartFrameEnum.STATIC,
13 - image: 'inputs_select.png' 13 + image: 'inputs_input.png'
14 } 14 }
@@ -8,15 +8,19 @@ export const option = { @@ -8,15 +8,19 @@ export const option = {
8 header: ['列1', '列2', '列3'], 8 header: ['列1', '列2', '列3'],
9 dataset: dataJson, 9 dataset: dataJson,
10 index: true, 10 index: true,
11 - columnWidth: [30, 100, 100],  
12 - align: ['center', 'right', 'right', 'right'], 11 + columnWidth: [100, 300, 300, 300],
  12 + align: ['center', 'center', 'center', 'center'],
13 rowNum: 5, 13 rowNum: 5,
14 waitTime: 2, 14 waitTime: 2,
15 headerHeight: 35, 15 headerHeight: 35,
16 carousel: 'single', 16 carousel: 'single',
17 headerBGC: '#00BAFF', 17 headerBGC: '#00BAFF',
18 oddRowBGC: '#003B51', 18 oddRowBGC: '#003B51',
19 - evenRowBGC: '#0A2732' 19 + evenRowBGC: '#0A2732',
  20 + ceilSpanColor: '#FFFFFF',
  21 + ceilSpanFontSize: 16,
  22 + headerSpanColor: '#FFFFFF',
  23 + headerSpanFontSize: 16
20 } 24 }
21 25
22 export default class Config extends PublicConfigClass implements CreateComponentType { 26 export default class Config extends PublicConfigClass implements CreateComponentType {
@@ -45,12 +45,37 @@ @@ -45,12 +45,37 @@
45 v-model:value="optionData.carousel" 45 v-model:value="optionData.carousel"
46 :options="[ 46 :options="[
47 { label: '单条轮播', value: 'single' }, 47 { label: '单条轮播', value: 'single' },
48 - { label: '整页轮播', value: 'page' }, 48 + { label: '整页轮播', value: 'page' }
49 ]" 49 ]"
50 /> 50 />
51 </SettingItem> 51 </SettingItem>
52 </SettingItemBox> 52 </SettingItemBox>
53 - 53 + <SettingItemBox name="表头字体">
  54 + <SettingItem name="颜色">
  55 + <n-color-picker size="small" :modes="['hex']" v-model:value="optionData.headerSpanColor"></n-color-picker>
  56 + </SettingItem>
  57 + <SettingItem name="大小">
  58 + <n-input-number
  59 + v-model:value="optionData.headerSpanFontSize"
  60 + :min="1"
  61 + size="small"
  62 + placeholder="请输入"
  63 + ></n-input-number>
  64 + </SettingItem>
  65 + </SettingItemBox>
  66 + <SettingItemBox name="内容字体">
  67 + <SettingItem name="颜色">
  68 + <n-color-picker size="small" :modes="['hex']" v-model:value="optionData.ceilSpanColor"></n-color-picker>
  69 + </SettingItem>
  70 + <SettingItem name="大小">
  71 + <n-input-number
  72 + v-model:value="optionData.ceilSpanFontSize"
  73 + :min="1"
  74 + size="small"
  75 + placeholder="请输入"
  76 + ></n-input-number>
  77 + </SettingItem>
  78 + </SettingItemBox>
54 <SettingItemBox name="样式"> 79 <SettingItemBox name="样式">
55 <SettingItem name="表头背景色"> 80 <SettingItem name="表头背景色">
56 <n-color-picker size="small" :modes="['hex']" v-model:value="optionData.headerBGC"></n-color-picker> 81 <n-color-picker size="small" :modes="['hex']" v-model:value="optionData.headerBGC"></n-color-picker>
@@ -6,13 +6,15 @@ @@ -6,13 +6,15 @@
6 :style="`background-color: ${status.mergedConfig.headerBGC};`" 6 :style="`background-color: ${status.mergedConfig.headerBGC};`"
7 > 7 >
8 <div 8 <div
9 - class="header-item" 9 + class="header-item singe-line"
10 v-for="(headerItem, i) in status.header" 10 v-for="(headerItem, i) in status.header"
11 :key="`${headerItem}${i}`" 11 :key="`${headerItem}${i}`"
12 :style="` 12 :style="`
13 height: ${status.mergedConfig.headerHeight}px; 13 height: ${status.mergedConfig.headerHeight}px;
14 line-height: ${status.mergedConfig.headerHeight}px; 14 line-height: ${status.mergedConfig.headerHeight}px;
15 width: ${status.widths[i]}px; 15 width: ${status.widths[i]}px;
  16 + color:${headerSpanColor};
  17 + font-size:${headerSpanFontSize}px;
16 `" 18 `"
17 :align="status.aligns[i]" 19 :align="status.aligns[i]"
18 v-html="headerItem" 20 v-html="headerItem"
@@ -24,30 +26,32 @@ @@ -24,30 +26,32 @@
24 class="rows" 26 class="rows"
25 :style="`height: ${h - (status.header.length ? status.mergedConfig.headerHeight : 0)}px;`" 27 :style="`height: ${h - (status.header.length ? status.mergedConfig.headerHeight : 0)}px;`"
26 > 28 >
27 - <div v-if="status.rows.length">  
28 - <div  
29 - class="row-item"  
30 - v-for="(row, ri) in status.rows"  
31 - :key="`${row.toString()}${row.scroll}`"  
32 - :style="` 29 + <div v-if="status.rows.length">
  30 + <div
  31 + class="row-item"
  32 + v-for="(row, ri) in status.rows"
  33 + :key="`${row.toString()}${row.scroll}`"
  34 + :style="`
33 height: ${status.heights[ri]}px; 35 height: ${status.heights[ri]}px;
34 line-height: ${status.heights[ri]}px; 36 line-height: ${status.heights[ri]}px;
35 background-color: ${status.mergedConfig[row.rowIndex % 2 === 0 ? 'evenRowBGC' : 'oddRowBGC']}; 37 background-color: ${status.mergedConfig[row.rowIndex % 2 === 0 ? 'evenRowBGC' : 'oddRowBGC']};
36 `" 38 `"
37 - >  
38 - <div  
39 - class="ceil"  
40 - v-for="(ceil, ci) in row.ceils"  
41 - :key="`${ceil}${ri}${ci}`"  
42 - :style="`width: ${status.widths[ci]}px;`"  
43 - :align="status.aligns[ci]"  
44 - v-html="ceil"  
45 - /> 39 + >
  40 + <div
  41 + class="ceil singe-line"
  42 + v-for="(ceil, ci) in row.ceils"
  43 + :key="`${ceil}${ri}${ci}`"
  44 + :style="`
  45 + width: ${status.widths[ci]}px;
  46 + color:${ceilSpanColor};
  47 + font-size:${ceilSpanFontSize}px;
  48 + `"
  49 + :align="status.aligns[ci]"
  50 + v-html="ceil"
  51 + />
  52 + </div>
46 </div> 53 </div>
47 - </div>  
48 - <div v-else class="nullData">  
49 - 暂无数据  
50 - </div> 54 + <div v-else class="nullData">暂无数据</div>
51 </div> 55 </div>
52 </div> 56 </div>
53 </template> 57 </template>
@@ -70,7 +74,7 @@ const props = defineProps({ @@ -70,7 +74,7 @@ const props = defineProps({
70 // 这里能拿到图表宽高等 74 // 这里能拿到图表宽高等
71 const { w, h } = toRefs(props.chartConfig.attr) 75 const { w, h } = toRefs(props.chartConfig.attr)
72 // 这里能拿到上面 config.ts 里的 option 数据 76 // 这里能拿到上面 config.ts 里的 option 数据
73 -// const { rowNum, headerHeight, index, backgroundColor } = toRefs(props.chartConfig.option) 77 +const { ceilSpanColor, ceilSpanFontSize, headerSpanColor, headerSpanFontSize } = toRefs(props.chartConfig.option)
74 78
75 const status = reactive({ 79 const status = reactive({
76 defaultConfig: { 80 defaultConfig: {
@@ -355,6 +359,12 @@ onUnmounted(() => { @@ -355,6 +359,12 @@ onUnmounted(() => {
355 </script> 359 </script>
356 360
357 <style lang="scss" scoped> 361 <style lang="scss" scoped>
  362 +.singe-line {
  363 + text-overflow: ellipsis;
  364 + overflow: hidden;
  365 + word-break: break-all;
  366 + white-space: nowrap;
  367 +}
358 .dv-scroll-board { 368 .dv-scroll-board {
359 position: relative; 369 position: relative;
360 width: 100%; 370 width: 100%;
@@ -389,11 +399,11 @@ onUnmounted(() => { @@ -389,11 +399,11 @@ onUnmounted(() => {
389 overflow: hidden; 399 overflow: hidden;
390 } 400 }
391 } 401 }
392 - .nullData{ 402 + .nullData {
393 display: flex; 403 display: flex;
394 justify-content: center; 404 justify-content: center;
395 align-items: center; 405 align-items: center;
396 - color:white; 406 + color: white;
397 height: 100%; 407 height: 100%;
398 width: 100%; 408 width: 100%;
399 background: #356b80; 409 background: #356b80;
@@ -254,6 +254,7 @@ const { vChartRef } = useChartDataFetch(props.chartConfig, useChartEditStore, (n @@ -254,6 +254,7 @@ const { vChartRef } = useChartDataFetch(props.chartConfig, useChartEditStore, (n
254 } 254 }
255 }) 255 })
256 // 256 //
  257 + addPieInterval(newData)
257 updateVChart(newData) 258 updateVChart(newData)
258 }) 259 })
259 260
@@ -273,6 +273,7 @@ const { vChartRef } = useChartDataFetch(props.chartConfig, useChartEditStore, ne @@ -273,6 +273,7 @@ const { vChartRef } = useChartDataFetch(props.chartConfig, useChartEditStore, ne
273 } 273 }
274 }) 274 })
275 // 275 //
  276 + addPieInterval(newData)
276 updateVChart(newData) 277 updateVChart(newData)
277 }) 278 })
278 279
@@ -71,6 +71,27 @@ export const regionMapParentArea = { @@ -71,6 +71,27 @@ export const regionMapParentArea = {
71 71
72 export const includes = [] 72 export const includes = []
73 73
  74 +// 特殊处理安徽省的下钻
  75 +export const specialTreatmentAnhui = [
  76 + '合肥市',
  77 + '马鞍山市',
  78 + '淮北市',
  79 + '宿州市',
  80 + '阜阳市',
  81 + '蚌埠市',
  82 + '淮南市',
  83 + '滁州市',
  84 + '六安市',
  85 + '巢湖市',
  86 + '芜湖市',
  87 + '亳州市',
  88 + '安庆市',
  89 + '池州市',
  90 + '铜陵市',
  91 + '宣城市',
  92 + '黄山市'
  93 +]
  94 +
74 export const option = { 95 export const option = {
75 iconColor: 'black', 96 iconColor: 'black',
76 showIcon: false, 97 showIcon: false,
@@ -158,7 +179,7 @@ export const option = { @@ -158,7 +179,7 @@ export const option = {
158 bevelSize: 0, 179 bevelSize: 0,
159 minHeight: 12, 180 minHeight: 12,
160 shading: 'lambert', 181 shading: 'lambert',
161 - barSize: 2, 182 + barSize: 1,
162 itemStyle: { 183 itemStyle: {
163 color: '#4482B1FF' 184 color: '#4482B1FF'
164 }, 185 },
@@ -41,7 +41,7 @@ @@ -41,7 +41,7 @@
41 :drillingIn="optionData.drillingIn" 41 :drillingIn="optionData.drillingIn"
42 @submit="onHandleSelectValues" 42 @submit="onHandleSelectValues"
43 /> 43 />
44 - <div style="height:30px"></div> 44 + <div style="height: 30px"></div>
45 <n-tag type="primary">若配置无响应,请在预览页面查看效果</n-tag> 45 <n-tag type="primary">若配置无响应,请在预览页面查看效果</n-tag>
46 <SettingItemBox name="区块配置"> 46 <SettingItemBox name="区块配置">
47 <SettingItem name="区域颜色"> 47 <SettingItem name="区域颜色">
@@ -170,11 +170,14 @@ @@ -170,11 +170,14 @@
170 ></n-input-number> 170 ></n-input-number>
171 </SettingItem> 171 </SettingItem>
172 </SettingItemBox> 172 </SettingItemBox>
173 - <!-- <SettingItemBox name="区块配置"> 173 + <SettingItemBox name="区块配置">
174 <template v-for="(item, map3DIndex) in optionData.dataset.map3D" :key="map3DIndex"> 174 <template v-for="(item, map3DIndex) in optionData.dataset.map3D" :key="map3DIndex">
175 <setting-item name="地区名称"> 175 <setting-item name="地区名称">
176 <n-input v-model:value="item.name"> </n-input> 176 <n-input v-model:value="item.name"> </n-input>
177 </setting-item> 177 </setting-item>
  178 + <setting-item name="地区代码">
  179 + <n-input v-model:value="item.adcode"> </n-input>
  180 + </setting-item>
178 <setting-item name="离地高度"> 181 <setting-item name="离地高度">
179 <n-input-number v-model:value="item.height"> </n-input-number> 182 <n-input-number v-model:value="item.height"> </n-input-number>
180 </setting-item> 183 </setting-item>
@@ -195,14 +198,14 @@ @@ -195,14 +198,14 @@
195 > 198 >
196 + 199 +
197 </n-button> 200 </n-button>
198 - </SettingItemBox> --> 201 + </SettingItemBox>
199 <SettingItemBox name="散点配置"> 202 <SettingItemBox name="散点配置">
200 <template v-for="(item, scatterIndex) in optionData.dataset.scatter3D" :key="scatterIndex"> 203 <template v-for="(item, scatterIndex) in optionData.dataset.scatter3D" :key="scatterIndex">
201 <setting-item name="地区名称"> 204 <setting-item name="地区名称">
202 <n-input v-model:value="item.name"> </n-input> 205 <n-input v-model:value="item.name"> </n-input>
203 </setting-item> 206 </setting-item>
204 <setting-item name="地区代码"> 207 <setting-item name="地区代码">
205 - <n-input-number v-model:value="item.adcode"> </n-input-number> 208 + <n-input v-model:value="item.adcode"> </n-input>
206 </setting-item> 209 </setting-item>
207 <setting-item name="离地高度"> 210 <setting-item name="离地高度">
208 <n-input-number v-model:value="item.height"> </n-input-number> 211 <n-input-number v-model:value="item.height"> </n-input-number>
@@ -238,7 +241,7 @@ @@ -238,7 +241,7 @@
238 <n-input v-model:value="item.name"> </n-input> 241 <n-input v-model:value="item.name"> </n-input>
239 </setting-item> 242 </setting-item>
240 <setting-item name="地区代码"> 243 <setting-item name="地区代码">
241 - <n-input-number v-model:value="item.adcode"> </n-input-number> 244 + <n-input v-model:value="item.adcode"> </n-input>
242 </setting-item> 245 </setting-item>
243 <setting-item name="离地高度"> 246 <setting-item name="离地高度">
244 <n-input-number v-model:value="item.height"> </n-input-number> 247 <n-input-number v-model:value="item.height"> </n-input-number>
@@ -3,6 +3,18 @@ @@ -3,6 +3,18 @@
3 { 3 {
4 "name": "四川省", 4 "name": "四川省",
5 "height": 5, 5 "height": 5,
  6 + "adcode": "510000",
  7 + "itemStyle": {
  8 + "color": "#4482B1FF",
  9 + "opacity": 1,
  10 + "borderWidth": 0.4,
  11 + "borderColor": "#5F9EA0"
  12 + }
  13 + },
  14 + {
  15 + "name": "山西省",
  16 + "height": 6,
  17 + "adcode": "140000",
6 "itemStyle": { 18 "itemStyle": {
7 "color": "#4482B1FF", 19 "color": "#4482B1FF",
8 "opacity": 1, 20 "opacity": 1,
@@ -19,7 +31,7 @@ @@ -19,7 +31,7 @@
19 23.1301964, 31 23.1301964,
20 20000 32 20000
21 ], 33 ],
22 - "adcode": 440000, 34 + "adcode": "440000",
23 "height": 5, 35 "height": 5,
24 "itemStyle": { 36 "itemStyle": {
25 "color": "#4482B1FF", 37 "color": "#4482B1FF",
@@ -33,11 +45,11 @@ @@ -33,11 +45,11 @@
33 { 45 {
34 "name": "安徽省", 46 "name": "安徽省",
35 "value": [ 47 "value": [
36 - 114.878463,  
37 - 29.395191, 48 + 117.283042,
  49 + 31.86119,
38 20000 50 20000
39 ], 51 ],
40 - "adcode": 340000, 52 + "adcode": "340000",
41 "height": 5, 53 "height": 5,
42 "itemStyle": { 54 "itemStyle": {
43 "color": "#4482B1FF", 55 "color": "#4482B1FF",
@@ -19,7 +19,8 @@ import config, { @@ -19,7 +19,8 @@ import config, {
19 historyParentType, 19 historyParentType,
20 backMapLevel, 20 backMapLevel,
21 levelFunc, 21 levelFunc,
22 - regionMapParentArea 22 + regionMapParentArea,
  23 + specialTreatmentAnhui
23 } from './config' 24 } from './config'
24 import { getGeoJsonMap } from '@/api/external/common' 25 import { getGeoJsonMap } from '@/api/external/common'
25 import { ThreeMapEnum } from '@/enums/external/mapEnum' 26 import { ThreeMapEnum } from '@/enums/external/mapEnum'
@@ -151,7 +152,9 @@ const handleMap3DClick = async (params: Recordable) => { @@ -151,7 +152,9 @@ const handleMap3DClick = async (params: Recordable) => {
151 saveClickRegion.value.level = level 152 saveClickRegion.value.level = level
152 saveLevelStr.level = level 153 saveLevelStr.level = level
153 saveHistoryParent.value.push({ 154 saveHistoryParent.value.push({
154 - adcode: item.properties.parent.adcode, 155 + adcode: specialTreatmentAnhui.includes(item.properties.name)
  156 + ? JSON.parse(item.properties.parent)?.adcode
  157 + : item.properties.parent.adcode,
155 level: (regionMapParentArea as Recordable)[level] 158 level: (regionMapParentArea as Recordable)[level]
156 }) 159 })
157 } 160 }
@@ -186,7 +189,7 @@ const getGeojson = (regionId: number | string) => { @@ -186,7 +189,7 @@ const getGeojson = (regionId: number | string) => {
186 const nameChina = name === '中国' ? 'china' : name //为中国的话,registerMap第一个必须是china,否则显示不出来 189 const nameChina = name === '中国' ? 'china' : name //为中国的话,registerMap第一个必须是china,否则显示不出来
187 /** 190 /**
188 * 主要注意的点,registerMap中的第一个参数需要和series中的map匹配,否则渲染不出地图, 191 * 主要注意的点,registerMap中的第一个参数需要和series中的map匹配,否则渲染不出地图,
189 - * 比如map: 'beijing' echarts.registerMap('beijing', beijingGeoJSON); 192 + * 比如map: '北京市' echarts.registerMap('北京市', beijingGeoJSON);
190 */ 193 */
191 registerMap(level === areaEnum.COUNTRY ? nameChina : code, { geoJSON: geoJsonFile, specialAreas: {} }) //注册geoJSON 194 registerMap(level === areaEnum.COUNTRY ? nameChina : code, { geoJSON: geoJsonFile, specialAreas: {} }) //注册geoJSON
192 resolve(true) 195 resolve(true)
@@ -221,7 +224,7 @@ const initMap3D = async () => { @@ -221,7 +224,7 @@ const initMap3D = async () => {
221 await nextTick() 224 await nextTick()
222 await getGeojson(mapRegion.value.adcode) 225 await getGeojson(mapRegion.value.adcode)
223 await nextTick().then(() => { 226 await nextTick().then(() => {
224 - handleRegisterMapNameAndData(mapRegion.value.adcode, dataset.value, true) 227 + handleRegisterMapNameAndData(mapRegion.value.adcode, dataset.value)
225 }) 228 })
226 chartInstance.value?.on('click', (e: Recordable) => { 229 chartInstance.value?.on('click', (e: Recordable) => {
227 if (!e) return 230 if (!e) return
@@ -232,14 +235,12 @@ const initMap3D = async () => { @@ -232,14 +235,12 @@ const initMap3D = async () => {
232 onMounted(() => initMap3D()) 235 onMounted(() => initMap3D())
233 236
234 // 动态注册 series中的map必须和registerMap的第一个参数匹配,否则渲染不出 237 // 动态注册 series中的map必须和registerMap的第一个参数匹配,否则渲染不出
235 -const handleRegisterMapNameAndData = (adcode: string | number, data: Recordable, includeMap3D: boolean) => { 238 +const handleRegisterMapNameAndData = (adcode: string | number, data: Recordable) => {
236 geo3D.value.map = adcode // coordinateSystem使用了geo3D,不能删除这一行 239 geo3D.value.map = adcode // coordinateSystem使用了geo3D,不能删除这一行
237 series.value.forEach((item: Recordable) => { 240 series.value.forEach((item: Recordable) => {
238 - if (includeMap3D) {  
239 - if (item.type === ThreeMapEnum.MAP3D) {  
240 - item.map = adcode  
241 - // item.data = data[ThreeMapEnum.MAP3D]  
242 - } 241 + if (item.type === ThreeMapEnum.MAP3D) {
  242 + item.map = adcode
  243 + item.data = data[ThreeMapEnum.MAP3D]
243 } 244 }
244 if (item.type === ThreeMapEnum.SCATTER3D) { 245 if (item.type === ThreeMapEnum.SCATTER3D) {
245 item.data = data[ThreeMapEnum.SCATTER3D] 246 item.data = data[ThreeMapEnum.SCATTER3D]
@@ -254,8 +255,8 @@ const handleRegisterMapNameAndData = (adcode: string | number, data: Recordable, @@ -254,8 +255,8 @@ const handleRegisterMapNameAndData = (adcode: string | number, data: Recordable,
254 const handleSetOption = (instance: EChartsType, option: Recordable) => { 255 const handleSetOption = (instance: EChartsType, option: Recordable) => {
255 if (!instance) return 256 if (!instance) return
256 try { 257 try {
257 - instance.clear()  
258 - instance.setOption(option) 258 + instance && instance.clear()
  259 + instance && instance.setOption(option)
259 } catch (error) { 260 } catch (error) {
260 console.error('动态触发渲染出错,出错原因->', error) 261 console.error('动态触发渲染出错,出错原因->', error)
261 } 262 }
@@ -275,14 +276,19 @@ watch( @@ -275,14 +276,19 @@ watch(
275 //处理数据标点 276 //处理数据标点
276 const handleDataPoint = (newData: string | number) => { 277 const handleDataPoint = (newData: string | number) => {
277 if (newData === 'china') { 278 if (newData === 'china') {
278 - handleRegisterMapNameAndData(newData, dataset.value, true) 279 + // 全国则展示所有的标点
  280 + handleRegisterMapNameAndData(newData, dataset.value)
279 } else { 281 } else {
  282 + // 展示对应区域的标点
280 series.value.forEach((item: Recordable) => { 283 series.value.forEach((item: Recordable) => {
  284 + if (item.type === ThreeMapEnum.MAP3D) {
  285 + item.data = [] //置空,否则鼠标移上去点击不了,不知道原因!
  286 + }
281 if (item.type === ThreeMapEnum.SCATTER3D) { 287 if (item.type === ThreeMapEnum.SCATTER3D) {
282 - item.data = dataset.value[ThreeMapEnum.SCATTER3D].filter((item: dataPointI) => item.adcode === newData) 288 + item.data = dataset.value[ThreeMapEnum.SCATTER3D].filter((dataItem: dataPointI) => dataItem.adcode === newData)
283 } 289 }
284 if (item.type === ThreeMapEnum.BAR3D) { 290 if (item.type === ThreeMapEnum.BAR3D) {
285 - item.data = dataset.value[ThreeMapEnum.BAR3D].filter((item: dataPointI) => item.adcode === newData) 291 + item.data = dataset.value[ThreeMapEnum.BAR3D].filter((dataItem: dataPointI) => dataItem.adcode === newData)
286 } 292 }
287 }) 293 })
288 } 294 }
@@ -294,9 +300,9 @@ watch( @@ -294,9 +300,9 @@ watch(
294 async (newData: string | number) => { 300 async (newData: string | number) => {
295 try { 301 try {
296 await getGeojson(newData) 302 await getGeojson(newData)
297 - handleRegisterMapNameAndData(newData, dataset.value, true)  
298 - handleSetOption(chartInstance.value!, props.chartConfig.option) 303 + handleRegisterMapNameAndData(newData, dataset.value)
299 handleDataPoint(newData) 304 handleDataPoint(newData)
  305 + handleSetOption(chartInstance.value!, props.chartConfig.option)
300 } catch (error) { 306 } catch (error) {
301 console.error('展示区域发生变化出错,出错原因->', error) 307 console.error('展示区域发生变化出错,出错原因->', error)
302 } 308 }
1 -<template>  
2 - <!-- 原生方式,没有使用vue-echarts -->  
3 - <n-space vertical>  
4 - <n-spin :show="show">  
5 - <div :style="`width:${w}px;height:${h}px;`" ref="map3DRef"></div>  
6 - </n-spin>  
7 - </n-space>  
8 -</template>  
9 -  
10 -<script setup lang="ts">  
11 -import { onMounted, ref, nextTick, PropType, toRefs, watch, reactive } from 'vue'  
12 -import * as echarts from 'echarts'  
13 -import { registerMap } from 'echarts/core'  
14 -import 'echarts-gl'  
15 -import config, { areaEnum, dataPointI, optionType, historyParentType, backMapLevel } from './config'  
16 -import { getGeoJsonMap } from '@/api/external/common'  
17 -  
18 -const props = defineProps({  
19 - chartConfig: {  
20 - type: Object as PropType<config>,  
21 - required: true  
22 - }  
23 -})  
24 -  
25 -const backIcon =  
26 - 'path://M853.333333 245.333333H245.333333l93.866667-93.866666c12.8-12.8 12.8-34.133333 0-46.933334-12.8-12.8-34.133333-12.8-46.933333 0l-145.066667 145.066667c-12.8 12.8-12.8 34.133333 0 46.933333l145.066667 145.066667c6.4 6.4 14.933333 10.666667 23.466666 10.666667s17.066667-4.266667 23.466667-10.666667c12.8-12.8 12.8-34.133333 0-46.933333L256 311.466667h597.333333c6.4 0 10.666667 4.266667 10.666667 10.666666v426.666667c0 6.4-4.266667 10.666667-10.666667 10.666667H170.666667c-17.066667 0-32 14.933333-32 32s14.933333 32 32 32h682.666666c40.533333 0 74.666667-34.133333 74.666667-74.666667V320c0-40.533333-34.133333-74.666667-74.666667-74.666667z'  
27 -  
28 -const { w, h } = toRefs(props.chartConfig.attr)  
29 -  
30 -const map3DRef = ref()  
31 -  
32 -const show = ref(true)  
33 -  
34 -const chartInstance = ref()  
35 -  
36 -const toolBoxOption = ref({  
37 - show: true,  
38 - right: 110,  
39 - top: 20,  
40 - feature: {  
41 - myFullButton: {  
42 - show: false,  
43 - title: '返回',  
44 - icon: backIcon,  
45 - iconStyle: {  
46 - color: ''  
47 - },  
48 - onclick: () => handleBack()  
49 - }  
50 - }  
51 -})  
52 -  
53 -const excludeCountryLevels = ['PROVINCE', 'CITY'] //如果从右侧配置选择全中国  
54 -  
55 -const includeCityLevels = ['CITY'] //如果从右侧配置选择省份  
56 -  
57 -//元组 优化if elseif else分支 隐藏返回图标  
58 -const backIconMappingLevels: any[][] = [  
59 - [  
60 - (levelStr: string) => levelStr === areaEnum.COUNTRY,  
61 - (level: string) => excludeCountryLevels.includes(level),  
62 - () => (toolBoxOption.value.feature.myFullButton.show = true),  
63 - () => (toolBoxOption.value.feature.myFullButton.show = false)  
64 - ],  
65 - [  
66 - (levelStr: string) => levelStr === areaEnum.PROVINCE,  
67 - (level: string) => includeCityLevels.includes(level),  
68 - () => (toolBoxOption.value.feature.myFullButton.show = true),  
69 - () => (toolBoxOption.value.feature.myFullButton.show = false)  
70 - ]  
71 -]  
72 -  
73 -watch(  
74 - () => props.chartConfig.option,  
75 - (newData: optionType) => {  
76 - const { iconColor, iconDistanceRight, iconDistanceTop, mapRegion } = newData  
77 - const { saveSelect } = mapRegion  
78 - const { levelStr } = saveSelect  
79 - const findBackLevel = backIconMappingLevels.find((backLevelItem: backMapLevel[]) =>  
80 - backLevelItem[0](levelStr)  
81 - ) as backMapLevel[]  
82 - if (findBackLevel) {  
83 - if (findBackLevel[0]) {  
84 - const findLevel = findBackLevel[1](saveLevelStr.level)  
85 - if (findLevel) findBackLevel[2]()  
86 - else findBackLevel[3]()  
87 - }  
88 - }  
89 - toolBoxOption.value.feature.myFullButton.iconStyle.color = iconColor //返回图标颜色  
90 - toolBoxOption.value.right = iconDistanceRight  
91 - toolBoxOption.value.top = iconDistanceTop  
92 - },  
93 - {  
94 - deep: true  
95 - }  
96 -)  
97 -  
98 -//追加echarts右上角自带toolbox  
99 -props.chartConfig.option = {  
100 - ...props.chartConfig.option,  
101 - ...{ toolbox: toolBoxOption.value }  
102 -}  
103 -  
104 -//地图点击返回  
105 -const handleBack = async () => {  
106 - stopWatch()  
107 - if (props.chartConfig.option.drillingIn) {  
108 - //如果是从右边配置里设置的,比如点击四川省,然后点击返回  
109 - const savePopParent = saveHistoryParent.value.pop()  
110 - let saveAdcode = savePopParent?.adcode as string | number  
111 - saveLevelStr.level = savePopParent?.level as string  
112 - if (!savePopParent) {  
113 - saveAdcode = getParentAdcode(props.chartConfig.option.mapRegion.adcode)  
114 - saveLevelStr.level = (regionMapParentArea as Recordable)[props.chartConfig.option.mapRegion.saveSelect.levelStr]  
115 - }  
116 - if (saveAdcode === 0) {  
117 - saveAdcode = 'china'  
118 - saveLevelStr.level = areaEnum.COUNTRY  
119 - }  
120 - const exist = await getGeojson(saveAdcode)  
121 - const adcode = saveAdcode === 100000 ? 'china' : saveAdcode  
122 - props.chartConfig.option.saveClickRegion.level = saveLevelStr.level  
123 - if (exist) {  
124 - //fix解决点击下钻返回后页面为空问题  
125 - props.chartConfig.option.mapRegion.adcode = adcode  
126 - }  
127 - }  
128 -}  
129 -  
130 -//地区上级对应配置  
131 -const regionMapParentArea = {  
132 - PROVINCE: areaEnum.COUNTRY, //省份的上一级 中国  
133 - CITY: areaEnum.PROVINCE, //城市的上一级 省份  
134 - COUNTY: areaEnum.CITY, //县或者区的上一级 城市  
135 - TOWN: areaEnum.COUNTY //镇的上一级 县或者区  
136 -}  
137 -  
138 -//地图点击  
139 -const handleMap3DClick = async (params: Recordable) => {  
140 - if (props.chartConfig.option.drillingIn) {  
141 - const { name } = params  
142 - saveGeojson.value?.features.forEach((item: Recordable) => {  
143 - if (item.properties.name === name) {  
144 - const level = item.properties.level.toUpperCase()  
145 - const adcode = item.properties.adcode  
146 - if (level === 'DISTRICT') return //下钻暂且不支持地区  
147 - if (String(adcode).startsWith('15') && level === areaEnum.CITY) return //特殊处理地区码15开头的  
148 - props.chartConfig.option.mapRegion.adcode = adcode  
149 - props.chartConfig.option.saveClickRegion.level = level  
150 - saveLevelStr.level = level  
151 - handleDataPoint(adcode)  
152 - saveHistoryParent.value.push({  
153 - adcode: item.properties.parent.adcode,  
154 - level: (regionMapParentArea as Recordable)[level]  
155 - })  
156 - }  
157 - })  
158 - }  
159 -}  
160 -  
161 -const saveGeojson: Recordable = ref({}) // 保存geojson  
162 -  
163 -const chinaDefaultRegionId = ref(100000) //如果是china则adcode为100000  
164 -  
165 -const saveLevelStr = reactive<{ level: historyParentType['level'] }>({  
166 - // 地区级别  
167 - level: ''  
168 -})  
169 -  
170 -const saveHistoryParent = ref<historyParentType[]>([])  
171 -  
172 -//动态注册地图  
173 -const getGeojson = (regionId: number | string) => {  
174 - try {  
175 - return new Promise<boolean>(resolve => {  
176 - const { levelStr } = props.chartConfig.option.mapRegion.saveSelect //右侧配置项获取的行政级别  
177 - getGeoJsonMap(  
178 - regionId === 'china' ? chinaDefaultRegionId.value : regionId,  
179 - !saveLevelStr.level ? levelStr : saveLevelStr.level //没有则获取右侧配置的行政级别  
180 - ).then(res => {  
181 - const { geoJson, name, code, level } = res.data  
182 - const geoJsonFile = JSON.parse(geoJson)  
183 - if (!geoJsonFile) return  
184 - saveGeojson.value = geoJsonFile //保存一份服务端返回的geojson  
185 - const nameChina = name === '中国' ? 'china' : name  
186 - registerMap(level === areaEnum.COUNTRY ? nameChina : code, { geoJSON: geoJsonFile, specialAreas: {} })  
187 - show.value = false  
188 - resolve(true)  
189 - })  
190 - })  
191 - } catch (error) {  
192 - show.value = false  
193 - console.error('注册地图出错', error)  
194 - //注册出错则注册空的,不然在选择正确的adcode,则视图无法更新  
195 - registerMap(props.chartConfig.option.mapRegion.adcode, { geoJSON: {} as any, specialAreas: {} })  
196 - }  
197 -}  
198 -  
199 -//异步时先注册空的 保证初始化不报错  
200 -registerMap(props.chartConfig.option.mapRegion.adcode, { geoJSON: {} as any, specialAreas: {} })  
201 -  
202 -//传adcode 获取上级  
203 -const getParentAdcode = (adcode: number) => {  
204 - let adcodeNum = 100000  
205 - saveGeojson.value?.features.forEach((item: Recordable) => {  
206 - if (item.properties.adcode === adcode) {  
207 - adcodeNum = item.properties.parent.adcode  
208 - }  
209 - })  
210 - return adcodeNum  
211 -}  
212 -  
213 -const initMap = async () => {  
214 - chartInstance.value = echarts.init(map3DRef.value)  
215 - await nextTick()  
216 - await getGeojson(props.chartConfig.option.mapRegion.adcode)  
217 - await nextTick().then(() => {  
218 - handleSetOption(chartInstance.value, props.chartConfig.option)  
219 - })  
220 - chartInstance.value.on('click', (e: Recordable) => {  
221 - handleMap3DClick(e)  
222 - })  
223 -}  
224 -  
225 -// 手动触发渲染  
226 -const handleSetOption = (instance: any, option: Recordable) => {  
227 - if (!instance) return  
228 - try {  
229 - instance.clear()  
230 - instance.setOption(option)  
231 - } catch (error) {  
232 - console.error('触发渲染出错', error)  
233 - }  
234 -}  
235 -  
236 -onMounted(() => {  
237 - initMap()  
238 -})  
239 -  
240 -watch(  
241 - () => [w.value, h.value],  
242 - async (newValue: number[]) => {  
243 - await nextTick()  
244 - chartInstance.value.resize({  
245 - width: newValue.at(-2) + 'px',  
246 - height: newValue.at(-1) + 'px'  
247 - })  
248 - }  
249 -)  
250 -  
251 -//处理数据标点  
252 -const handleDataPoint = (newData: string | number) => {  
253 - if (newData === 'china') {  
254 - props.chartConfig.option.dataset = props.chartConfig.option.dataConfig  
255 - props.chartConfig.option.series.forEach((item: Recordable) => {  
256 - if (item.type === 'scatter3D') {  
257 - item.data = props.chartConfig.option.dataConfig['scatter3D']  
258 - }  
259 - if (item.type === 'bar3D') {  
260 - item.data = props.chartConfig.option.dataConfig['bar3D']  
261 - }  
262 - })  
263 - } else {  
264 - props.chartConfig.option.dataset = props.chartConfig.option.dataConfig['map3D'].filter(  
265 - (item: dataPointI) => item.adcode === newData  
266 - )  
267 - props.chartConfig.option.series.forEach((item: Recordable) => {  
268 - if (item.type === 'scatter3D') {  
269 - item.data = props.chartConfig.option.dataConfig['scatter3D'].filter(  
270 - (item: dataPointI) => item.adcode === newData  
271 - )  
272 - }  
273 - if (item.type === 'bar3D') {  
274 - item.data = props.chartConfig.option.dataConfig['bar3D'].filter((item: dataPointI) => item.adcode === newData)  
275 - }  
276 - })  
277 - }  
278 -}  
279 -  
280 -//监听地图展示区域发生变化  
281 -watch(  
282 - () => `${props.chartConfig.option.mapRegion.adcode}`,  
283 - async (newData: string | number) => {  
284 - try {  
285 - await getGeojson(newData)  
286 - props.chartConfig.option.geo3D.map = newData  
287 - props.chartConfig.option.series.forEach((item: Recordable) => {  
288 - if (item.type === 'map3D') {  
289 - item.map = newData  
290 - item.data = props.chartConfig.option.dataset['map3D']  
291 - }  
292 - })  
293 - handleSetOption(chartInstance.value, props.chartConfig.option)  
294 - handleDataPoint(newData)  
295 - } catch (error) {  
296 - console.log('展示区域发生变化出错', error)  
297 - }  
298 - },  
299 - {  
300 - immediate: true  
301 - }  
302 -)  
303 -  
304 -// 监听地图右侧配置项变化  
305 -const stopWatch = watch(  
306 - props.chartConfig.option,  
307 - async newData => {  
308 - try {  
309 - handleSetOption(chartInstance.value, newData)  
310 - } catch (error) {  
311 - console.log(error)  
312 - }  
313 - },  
314 - {  
315 - deep: true  
316 - }  
317 -)  
318 -  
319 -// 监听地图dataset配置项变化  
320 -watch(  
321 - () => props.chartConfig.option.dataset,  
322 - newData => {  
323 - try {  
324 - props.chartConfig.option.series.forEach((item: Recordable) => {  
325 - if (item.type === 'map3D') {  
326 - item.data = newData['map3D']  
327 - }  
328 - })  
329 - handleSetOption(chartInstance.value, props.chartConfig.option)  
330 - } catch (error) {  
331 - console.log(error)  
332 - }  
333 - },  
334 - {  
335 - deep: true  
336 - }  
337 -)  
338 -</script>  
@@ -59,10 +59,10 @@ export const option: IconOptions = { @@ -59,10 +59,10 @@ export const option: IconOptions = {
59 { label: '设备:', value: 'xxxxxxxxx设备' }, 59 { label: '设备:', value: 'xxxxxxxxx设备' },
60 { label: '产品:', value: 'xxxxxxxxx产品' }, 60 { label: '产品:', value: 'xxxxxxxxx产品' },
61 { label: '位置:', value: 'xxxxxxxxx位置' }, 61 { label: '位置:', value: 'xxxxxxxxx位置' },
62 - { label: '创建时间:', value: '2024-01-01' } 62 + { label: '创建时间:', value: '2024-01-12 11:27:44' }
63 ], 63 ],
64 popupConfig: { 64 popupConfig: {
65 - borderWidth: 380, 65 + borderWidth: 300,
66 borderHeight: 200, 66 borderHeight: 200,
67 borderColor: 'red', 67 borderColor: 'red',
68 boxShadowColor: '#356A82FF', 68 boxShadowColor: '#356A82FF',
@@ -88,9 +88,6 @@ @@ -88,9 +88,6 @@
88 <SettingItem name="线条颜色"> 88 <SettingItem name="线条颜色">
89 <NColorPicker size="small" v-model:value="optionData.popupConfig.lineColor"> </NColorPicker> 89 <NColorPicker size="small" v-model:value="optionData.popupConfig.lineColor"> </NColorPicker>
90 </SettingItem> 90 </SettingItem>
91 - <SettingItem name="标题内容">  
92 - <NInput v-model:value="optionData.popupConfig.fontContent"> </NInput>  
93 - </SettingItem>  
94 <SettingItem name="标题颜色"> 91 <SettingItem name="标题颜色">
95 <NColorPicker size="small" v-model:value="optionData.popupConfig.fontColor"> </NColorPicker> 92 <NColorPicker size="small" v-model:value="optionData.popupConfig.fontColor"> </NColorPicker>
96 </SettingItem> 93 </SettingItem>
@@ -102,6 +99,9 @@ @@ -102,6 +99,9 @@
102 :min="0" 99 :min="0"
103 ></NInputNumber> 100 ></NInputNumber>
104 </SettingItem> 101 </SettingItem>
  102 + <SettingItem name="标题内容">
  103 + <NInput v-model:value="optionData.popupConfig.fontContent"> </NInput>
  104 + </SettingItem>
105 <SettingItem name="内容键文本颜色"> 105 <SettingItem name="内容键文本颜色">
106 <NColorPicker size="small" v-model:value="optionData.popupConfig.labelColor"> </NColorPicker> 106 <NColorPicker size="small" v-model:value="optionData.popupConfig.labelColor"> </NColorPicker>
107 </SettingItem> 107 </SettingItem>
@@ -137,9 +137,16 @@ @@ -137,9 +137,16 @@
137 import { computed, PropType } from 'vue' 137 import { computed, PropType } from 'vue'
138 import { CollapseItem, SettingItemBox, SettingItem } from '@/components/Pages/ChartItemSetting' 138 import { CollapseItem, SettingItemBox, SettingItem } from '@/components/Pages/ChartItemSetting'
139 import { option } from './config' 139 import { option } from './config'
140 -import { NColorPicker, NInputNumber, NSelect, SelectOption } from 'naive-ui';  
141 -import { IconBorderStyleEnum, IconBorderStyleNameEnum, IconBorderEnum, IconBorderNameEnum, IconDynamicEffectNameEnum, IconDynamicEffectEnum } from '../../../types';  
142 -import IconPicker from '@/components/external/Icon/src/IconPicker.vue'; 140 +import { NColorPicker, NInputNumber, NSelect, SelectOption } from 'naive-ui'
  141 +import {
  142 + IconBorderStyleEnum,
  143 + IconBorderStyleNameEnum,
  144 + IconBorderEnum,
  145 + IconBorderNameEnum,
  146 + IconDynamicEffectNameEnum,
  147 + IconDynamicEffectEnum
  148 +} from '../../../types'
  149 +import IconPicker from '@/components/external/Icon/src/IconPicker.vue'
143 150
144 const props = defineProps({ 151 const props = defineProps({
145 optionData: { 152 optionData: {
@@ -153,7 +160,7 @@ const getBorderStyleOptions: SelectOption[] = [ @@ -153,7 +160,7 @@ const getBorderStyleOptions: SelectOption[] = [
153 { label: IconBorderStyleNameEnum.DASHED, value: IconBorderStyleEnum.DASHED }, 160 { label: IconBorderStyleNameEnum.DASHED, value: IconBorderStyleEnum.DASHED },
154 { label: IconBorderStyleNameEnum.DOTTED, value: IconBorderStyleEnum.DOTTED }, 161 { label: IconBorderStyleNameEnum.DOTTED, value: IconBorderStyleEnum.DOTTED },
155 { label: IconBorderStyleNameEnum.DOUBLE, value: IconBorderStyleEnum.DOUBLE }, 162 { label: IconBorderStyleNameEnum.DOUBLE, value: IconBorderStyleEnum.DOUBLE },
156 - { label: IconBorderStyleNameEnum.NONE, value: IconBorderStyleEnum.NONE }, 163 + { label: IconBorderStyleNameEnum.NONE, value: IconBorderStyleEnum.NONE }
157 ] 164 ]
158 165
159 const getBorderTypeOptions: SelectOption[] = [ 166 const getBorderTypeOptions: SelectOption[] = [
@@ -163,10 +170,17 @@ const getBorderTypeOptions: SelectOption[] = [ @@ -163,10 +170,17 @@ const getBorderTypeOptions: SelectOption[] = [
163 170
164 const getDynamicEffectOptions = computed<SelectOption[]>(() => { 171 const getDynamicEffectOptions = computed<SelectOption[]>(() => {
165 return [ 172 return [
166 - { label: IconDynamicEffectNameEnum.JUMP, value: IconDynamicEffectEnum.JUMP, disabled: props.optionData.dynamicEffect?.includes(IconDynamicEffectEnum.SPIN) },  
167 - { label: IconDynamicEffectNameEnum.SPIN, value: IconDynamicEffectEnum.SPIN, disabled: props.optionData.dynamicEffect?.includes(IconDynamicEffectEnum.JUMP) }, 173 + {
  174 + label: IconDynamicEffectNameEnum.JUMP,
  175 + value: IconDynamicEffectEnum.JUMP,
  176 + disabled: props.optionData.dynamicEffect?.includes(IconDynamicEffectEnum.SPIN)
  177 + },
  178 + {
  179 + label: IconDynamicEffectNameEnum.SPIN,
  180 + value: IconDynamicEffectEnum.SPIN,
  181 + disabled: props.optionData.dynamicEffect?.includes(IconDynamicEffectEnum.JUMP)
  182 + }
168 ] 183 ]
169 -  
170 }) 184 })
171 185
172 //native-ui 组件popover内置弹窗位置,不需要通过枚举方式 186 //native-ui 组件popover内置弹窗位置,不需要通过枚举方式
@@ -2,8 +2,9 @@ @@ -2,8 +2,9 @@
2 import { computed, PropType, toRefs } from 'vue' 2 import { computed, PropType, toRefs } from 'vue'
3 import { CreateComponentType } from '@/packages/index.d' 3 import { CreateComponentType } from '@/packages/index.d'
4 import { option } from './config' 4 import { option } from './config'
5 -import SvgBorder from './SvgBorder.vue';  
6 -import SvgIcon from '@/components/external/Icon/src/SvgIcon.vue'; 5 +import SvgBorder from './SvgBorder.vue'
  6 +import SvgIcon from '@/components/external/Icon/src/SvgIcon.vue'
  7 +import { TKDialog } from '@/components/external/Common/TKDialog'
7 8
8 const props = defineProps({ 9 const props = defineProps({
9 chartConfig: { 10 chartConfig: {
@@ -17,144 +18,22 @@ const size = computed(() => { @@ -17,144 +18,22 @@ const size = computed(() => {
17 return Math.min(w, h) / 2 18 return Math.min(w, h) / 2
18 }) 19 })
19 20
  21 +const { w, h } = toRefs(props.chartConfig.attr)
  22 +
20 const { popupConfig, dataset } = toRefs(props.chartConfig.option) 23 const { popupConfig, dataset } = toRefs(props.chartConfig.option)
21 </script> 24 </script>
22 25
23 <template> 26 <template>
24 - <section>  
25 - <n-popover :placement="popupConfig.placement" trigger="click" raw>  
26 - <template #trigger>  
27 - <SvgBorder :option="chartConfig.option">  
28 - <SvgIcon  
29 - :style="{ color: chartConfig.option.iconColor }"  
30 - :size="size"  
31 - :name="chartConfig.option.icon!"  
32 - prefix="iconfont"  
33 - />  
34 - </SvgBorder>  
35 - </template>  
36 - <div  
37 - style="transform-origin: inherit"  
38 - :style="`width:${popupConfig.borderWidth}px;  
39 - height: ${popupConfig.borderHeight}px;  
40 - box-shadow: 0 0 10px 10px ${popupConfig.boxShadowColor};  
41 - background:linear-gradient(to right, ${popupConfig.linearLeftColor} , ${popupConfig.linearRightColor});  
42 - `"  
43 - >  
44 - <div class="popup-body">  
45 - <div class="popup-arrow-right" :style="`border-color:${popupConfig.arrowColor}`"></div>  
46 - <div class="popup-header-content">  
47 - <p  
48 - class="header-title"  
49 - :style="`color:${popupConfig.fontColor};font-size:${popupConfig.fontSize}px;font-weight:${popupConfig.fontWeight}`"  
50 - >  
51 - {{ popupConfig.fontContent }}  
52 - </p>  
53 - <div class="header-content-graphical">  
54 - <div class="graphical-circle-left"><Circle /></div>  
55 - <div class="graphical-line">  
56 - <div class="line-left" :style="`background-color:${popupConfig.lineColor}`"></div>  
57 - <div class="line-center" :style="`background-color:${popupConfig.lineColor}`"></div>  
58 - <div class="line-right" :style="`background-color:${popupConfig.lineColor}`"></div>  
59 - </div>  
60 - <div class="graphical-circle-right"><Circle /></div>  
61 - </div>  
62 - </div>  
63 - </div>  
64 - <div class="content-body">  
65 - <div class="body" v-for="(item, index) in dataset" :key="index">  
66 - <span :style="`color:${popupConfig.labelColor};`">{{ item.label }}</span>  
67 - <span :style="`color:${popupConfig.valueColor};`">{{ item.value }}</span>  
68 - </div>  
69 - </div>  
70 - </div>  
71 - </n-popover> 27 + <section>
  28 + <TKDialog :popupConfig="popupConfig" :popupConfigData="dataset" :w="w" :h="h">
  29 + <SvgBorder :option="chartConfig.option">
  30 + <SvgIcon
  31 + :style="{ color: chartConfig.option.iconColor }"
  32 + :size="size"
  33 + :name="chartConfig.option.icon!"
  34 + prefix="iconfont"
  35 + />
  36 + </SvgBorder>
  37 + </TKDialog>
72 </section> 38 </section>
73 </template> 39 </template>
74 -  
75 -<style lang="scss" scoped>  
76 -@mixin base-text-ellipsis() {  
77 - overflow: hidden;  
78 - white-space: nowrap;  
79 - text-overflow: ellipsis;  
80 - -o-text-overflow: ellipsis;  
81 -}  
82 -.popup-body {  
83 - display: flex;  
84 - justify-content: center;  
85 - flex-direction: column;  
86 - .popup-arrow-right {  
87 - position: absolute;  
88 - top: 15px;  
89 - left: 10px;  
90 - border-right: 1px solid;  
91 - border-bottom: 1px solid;  
92 - width: 7px;  
93 - height: 7px;  
94 - transform: rotate(-45deg);  
95 - -o-transform: rotate(-45deg);  
96 - -webkit-transform: rotate(-45deg);  
97 - -moz-transform: rotate(-45deg);  
98 - -ms-transform: rotate(-45deg);  
99 - }  
100 - .popup-header-content {  
101 - margin: 23px;  
102 - display: flex;  
103 - justify-content: center;  
104 - flex-direction: column;  
105 - .header-title {  
106 - @include base-text-ellipsis;  
107 - }  
108 - .header-content-graphical {  
109 - display: flex;  
110 - align-items: center;  
111 - .graphical-circle-left {  
112 - position: relative;  
113 - left: -2px;  
114 - }  
115 - .graphical-line {  
116 - display: flex;  
117 - .line-left {  
118 - width: 115px;  
119 - height: 2px;  
120 - position: relative;  
121 - }  
122 - .line-center {  
123 - width: 35px;  
124 - height: 2px;  
125 - transform: rotateZ(145deg);  
126 - position: absolute;  
127 - top: 44px;  
128 - left: 146px;  
129 - }  
130 - .line-right {  
131 - width: 50px;  
132 - height: 2px;  
133 - position: absolute;  
134 - top: 34px;  
135 - left: 178px;  
136 - }  
137 - }  
138 - .graphical-circle-right {  
139 - position: absolute;  
140 - top: 29px;  
141 - left: 231px;  
142 - }  
143 - }  
144 - }  
145 -}  
146 -.content-body {  
147 - display: flex;  
148 - align-items: center;  
149 - flex-wrap: wrap;  
150 - margin: -10px 0;  
151 - .body {  
152 - display: flex;  
153 - align-items: center;  
154 - justify-content: flex-start;  
155 - gap: 27px;  
156 - margin-left: 15px;  
157 - margin-top: 1px;  
158 - }  
159 -}  
160 -</style>  
@@ -8,7 +8,7 @@ export const ButtonConfig: ConfigType = { @@ -8,7 +8,7 @@ export const ButtonConfig: ConfigType = {
8 key, 8 key,
9 chartKey, 9 chartKey,
10 conKey, 10 conKey,
11 - title: '切换菜单按钮', 11 + title: '同一页面切换按钮',
12 category: ChatCategoryEnum.INPUTS, 12 category: ChatCategoryEnum.INPUTS,
13 categoryName: ChatCategoryEnumName.INPUTS, 13 categoryName: ChatCategoryEnumName.INPUTS,
14 package: PackagesCategoryEnum.INFORMATIONS, 14 package: PackagesCategoryEnum.INFORMATIONS,
@@ -6,26 +6,50 @@ import { COMPONENT_INTERACT_EVENT_KET } from '@/enums/eventEnum' @@ -6,26 +6,50 @@ import { COMPONENT_INTERACT_EVENT_KET } from '@/enums/eventEnum'
6 import { interactActions, ComponentInteractEventEnum } from './interact' 6 import { interactActions, ComponentInteractEventEnum } from './interact'
7 import { DecorateButton1Config } from './index' 7 import { DecorateButton1Config } from './index'
8 8
9 -  
10 export const option = { 9 export const option = {
11 // 时间组件展示类型,必须和 interactActions 中定义的数据一致 10 // 时间组件展示类型,必须和 interactActions 中定义的数据一致
12 [COMPONENT_INTERACT_EVENT_KET]: ComponentInteractEventEnum.DATA, 11 [COMPONENT_INTERACT_EVENT_KET]: ComponentInteractEventEnum.DATA,
13 // 暴露配置内容给用户 12 // 暴露配置内容给用户
14 - dataset: '第1页',  
15 - buttonType: 'primary',  
16 - buttonGhost: false,  
17 - buttonDashed: false,  
18 - buttonColor: '',  
19 - buttonTextColor: 'white',  
20 - buttonTextSize: '16',  
21 - buttonTextBold: 500,  
22 - selectTargetItems: [],  
23 - quaternary: false 13 + svgTitle: '装饰按钮',
  14 + disabled: false,
  15 + fontConfig: {
  16 + x1: 33,
  17 + y1: 34.952,
  18 + datasetTspanFill: '#FFFFFF',
  19 + datasetTspanFontSize: 32
  20 + },
  21 + colorConfig: {
  22 + notActiveColor: '#001735',
  23 + activeColor: '#001E29'
  24 + },
  25 + dataset: [
  26 + { label: '设备:', value: 'xxxxxxxxx设备' },
  27 + { label: '产品:', value: 'xxxxxxxxx产品' },
  28 + { label: '位置:', value: 'xxxxxxxxx位置' },
  29 + { label: '创建时间:', value: '2024-01-12 11:27:44' }
  30 + ],
  31 + popupConfig: {
  32 + borderWidth: 300,
  33 + borderHeight: 200,
  34 + borderColor: 'red',
  35 + boxShadowColor: '#356A82FF',
  36 + linearLeftColor: '#385391FF',
  37 + linearRightColor: '#385391FF',
  38 + arrowColor: '#427FB4',
  39 + lineColor: '#427FB4',
  40 + fontColor: '#ffffff',
  41 + fontSize: 16,
  42 + fontWeight: 500,
  43 + fontContent: '我是标题',
  44 + labelColor: '#3d6e9d',
  45 + valueColor: '#ffffff',
  46 + placement: 'top'
  47 + }
24 } 48 }
25 49
26 export default class Config extends PublicConfigClass implements CreateComponentType { 50 export default class Config extends PublicConfigClass implements CreateComponentType {
27 public key = DecorateButton1Config.key 51 public key = DecorateButton1Config.key
28 - public attr = { ...chartInitConfig, w: 90, h: 40, zIndex: -1 } 52 + public attr = { ...chartInitConfig, w: 262, h: 73, zIndex: -1 }
29 public chartConfig = cloneDeep(DecorateButton1Config) 53 public chartConfig = cloneDeep(DecorateButton1Config)
30 public interactActions = interactActions 54 public interactActions = interactActions
31 public option = cloneDeep(option) 55 public option = cloneDeep(option)
1 <template> 1 <template>
2 - <collapse-item name="按钮配置" :expanded="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="虚线">  
7 - <setting-item name="是否开启">  
8 - <n-switch v-model:value="optionData.buttonDashed" />  
9 - </setting-item>  
10 - </setting-item-box>  
11 - <setting-item-box name="透明">  
12 - <setting-item name="是否开启">  
13 - <n-switch v-model:value="optionData.buttonGhost" />  
14 - </setting-item>  
15 - </setting-item-box>  
16 - <setting-item-box name="边框">  
17 - <setting-item name="是否开启">  
18 - <n-switch v-model:value="optionData.quaternary" />  
19 - </setting-item>  
20 - </setting-item-box>  
21 - <setting-item-box name="颜色">  
22 - <setting-item name="">  
23 - <n-color-picker size="small" :modes="['hex']" v-model:value="optionData.buttonColor"></n-color-picker>  
24 - </setting-item>  
25 - <setting-item>  
26 - <n-button size="small" @click="optionData.buttonColor=''">  
27 - 恢复默认  
28 - </n-button>  
29 - </setting-item>  
30 - </setting-item-box>  
31 - <setting-item-box name="文字颜色">  
32 - <setting-item name="">  
33 - <n-color-picker size="small" :modes="['hex']" v-model:value="optionData.buttonTextColor"></n-color-picker>  
34 - </setting-item>  
35 - <setting-item>  
36 - <n-button size="small" @click="optionData.buttonTextColor='white'">  
37 - 恢复默认  
38 - </n-button>  
39 - </setting-item>  
40 - </setting-item-box>  
41 - <setting-item-box name="文字大小">  
42 - <setting-item name="">  
43 - <n-input-number v-model:value="optionData.buttonTextSize" />  
44 - </setting-item>  
45 - <setting-item>  
46 - <n-button size="small" @click="optionData.buttonTextSize='16'">  
47 - 恢复默认  
48 - </n-button>  
49 - </setting-item>  
50 - </setting-item-box>  
51 - <setting-item-box name="文字加粗">  
52 - <setting-item name="">  
53 - <n-input-number :step="200" v-model:value="optionData.buttonTextBold" />  
54 - </setting-item>  
55 - <setting-item>  
56 - <n-button size="small" @click="optionData.buttonTextBold=100">  
57 - 恢复默认  
58 - </n-button>  
59 - </setting-item>  
60 - </setting-item-box>  
61 - <setting-item-box :alone="true">  
62 - <setting-item name="按钮文字" :alone="true">  
63 - <n-input v-model:value="optionData.dataset" size="small" placeholder="按钮文字"></n-input>  
64 - </setting-item>  
65 - </setting-item-box> 2 + <collapse-item name="装饰按钮配置" :expanded="true">
  3 + <SettingItemBox :name="`数据源字体`">
  4 + <SettingItem name="内容">
  5 + <n-input v-model:value="optionData.svgTitle"></n-input>
  6 + </SettingItem>
  7 + <SettingItem name="x">
  8 + <n-input-number v-model:value="optionData.fontConfig.x1"></n-input-number>
  9 + </SettingItem>
  10 + <SettingItem name="y">
  11 + <n-input-number v-model:value="optionData.fontConfig.y1"></n-input-number>
  12 + </SettingItem>
  13 + <SettingItem name="大小">
  14 + <n-input-number :min="0" v-model:value="optionData.fontConfig.datasetTspanFontSize"></n-input-number>
  15 + </SettingItem>
  16 + <SettingItem name="颜色">
  17 + <n-color-picker
  18 + size="small"
  19 + :modes="['hex']"
  20 + v-model:value="optionData.fontConfig.datasetTspanFill"
  21 + ></n-color-picker>
  22 + </SettingItem>
  23 + </SettingItemBox>
  24 + <SettingItemBox :name="`按钮背景`">
  25 + <SettingItem name="未激活背景">
  26 + <n-color-picker
  27 + size="small"
  28 + :modes="['hex']"
  29 + v-model:value="optionData.colorConfig.notActiveColor"
  30 + ></n-color-picker>
  31 + </SettingItem>
  32 + <SettingItem>
  33 + <n-button size="small" @click="optionData.colorConfig.notActiveColor = '#001735'"> 恢复默认 </n-button>
  34 + </SettingItem>
  35 + <SettingItem name="激活背景">
  36 + <n-color-picker
  37 + size="small"
  38 + :modes="['hex']"
  39 + v-model:value="optionData.colorConfig.activeColor"
  40 + ></n-color-picker>
  41 + </SettingItem>
  42 + <SettingItem>
  43 + <n-button size="small" @click="optionData.colorConfig.activeColor = '#001E29'"> 恢复默认 </n-button>
  44 + </SettingItem>
  45 + </SettingItemBox>
  46 + <CollapseItem name="弹窗配置" expanded>
  47 + <SettingItemBox name="开启弹窗">
  48 + <SettingItem>
  49 + <n-switch v-model:value="optionData.disabled"></n-switch>
  50 + </SettingItem>
  51 + </SettingItemBox>
  52 + <SettingItemBox name="宽高">
  53 + <SettingItem name="宽">
  54 + <NInputNumber
  55 + v-model:value="optionData.popupConfig.borderWidth"
  56 + size="small"
  57 + :step="10"
  58 + :min="0"
  59 + ></NInputNumber>
  60 + </SettingItem>
  61 + <SettingItem name="高">
  62 + <NInputNumber
  63 + v-model:value="optionData.popupConfig.borderHeight"
  64 + size="small"
  65 + :step="10"
  66 + :min="0"
  67 + ></NInputNumber>
  68 + </SettingItem>
  69 + </SettingItemBox>
  70 + <SettingItemBox name="位置">
  71 + <SettingItem name="">
  72 + <NSelect v-model:value="optionData.popupConfig.placement" size="small" :options="placementOptions"> </NSelect>
  73 + </SettingItem>
  74 + </SettingItemBox>
  75 + <SettingItemBox name="颜色">
  76 + <SettingItem name="边框阴影">
  77 + <NColorPicker
  78 + size="small"
  79 + :modes="['hex']"
  80 + :actions="['clear']"
  81 + v-model:value="optionData.popupConfig.boxShadowColor"
  82 + >
  83 + </NColorPicker>
  84 + </SettingItem>
  85 + <SettingItem name="背景线性渐变左">
  86 + <NColorPicker size="small" v-model:value="optionData.popupConfig.linearLeftColor"> </NColorPicker>
  87 + </SettingItem>
  88 + <SettingItem name="背景线性渐变右">
  89 + <NColorPicker size="small" v-model:value="optionData.popupConfig.linearRightColor"> </NColorPicker>
  90 + </SettingItem>
  91 + <SettingItem name="箭头颜色">
  92 + <NColorPicker size="small" v-model:value="optionData.popupConfig.arrowColor"> </NColorPicker>
  93 + </SettingItem>
  94 + <SettingItem name="线条颜色">
  95 + <NColorPicker size="small" v-model:value="optionData.popupConfig.lineColor"> </NColorPicker>
  96 + </SettingItem>
  97 + <SettingItem name="标题颜色">
  98 + <NColorPicker size="small" v-model:value="optionData.popupConfig.fontColor"> </NColorPicker>
  99 + </SettingItem>
  100 + <SettingItem name="标题加粗">
  101 + <NInputNumber
  102 + v-model:value="optionData.popupConfig.fontWeight"
  103 + size="small"
  104 + :step="100"
  105 + :min="0"
  106 + ></NInputNumber>
  107 + </SettingItem>
  108 + <SettingItem name="标题内容">
  109 + <NInput v-model:value="optionData.popupConfig.fontContent"> </NInput>
  110 + </SettingItem>
  111 + <SettingItem name="内容键文本颜色">
  112 + <NColorPicker size="small" v-model:value="optionData.popupConfig.labelColor"> </NColorPicker>
  113 + </SettingItem>
  114 + <SettingItem name="内容值文本颜色">
  115 + <NColorPicker size="small" v-model:value="optionData.popupConfig.valueColor"> </NColorPicker>
  116 + </SettingItem>
  117 + </SettingItemBox>
  118 + <template v-for="(item, index) in optionData.dataset" :key="index">
  119 + <setting-item-box name="内容键" :alone="true">
  120 + <setting-item>
  121 + <NInput v-model:value="item.label"> </NInput>
  122 + </setting-item>
  123 + </setting-item-box>
  124 + <setting-item-box name="内容值" :alone="true">
  125 + <setting-item>
  126 + <NInput v-model:value="item.value"> </NInput>
  127 + </setting-item>
  128 + </setting-item-box>
  129 + <n-button size="small" @click="optionData.dataset.splice(index, 1)"> - </n-button>
  130 + </template>
  131 + <n-button
  132 + style="margin-left: 10px"
  133 + v-if="optionData.dataset.length < 8"
  134 + size="small"
  135 + @click="optionData.dataset.push({ label: '', value: '' })"
  136 + >
  137 + +
  138 + </n-button>
  139 + </CollapseItem>
66 </collapse-item> 140 </collapse-item>
67 </template> 141 </template>
68 142
69 <script lang="ts" setup> 143 <script lang="ts" setup>
70 -import { PropType, ref, onMounted } from 'vue'  
71 -import { CollapseItem, SettingItemBox ,SettingItem} from '@/components/Pages/ChartItemSetting' 144 +import { PropType } from 'vue'
  145 +import { CollapseItem, SettingItemBox, SettingItem } from '@/components/Pages/ChartItemSetting'
72 import { option } from './config' 146 import { option } from './config'
73 -import { icon } from '@/plugins'  
74 -import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore' 147 +import { SelectOption } from 'naive-ui'
75 148
76 defineProps({ 149 defineProps({
77 optionData: { 150 optionData: {
@@ -80,58 +153,24 @@ defineProps({ @@ -80,58 +153,24 @@ defineProps({
80 } 153 }
81 }) 154 })
82 155
83 -const chartEditStore = useChartEditStore()  
84 -  
85 -const { HelpOutlineIcon } = icon.ionicons5  
86 -  
87 -const targetHelpMessgae = ref(`勾选目标项,支持多个`)  
88 -  
89 -const buttonTypeOptions = [  
90 - {  
91 - label: 'default',  
92 - value: 'default'  
93 - },  
94 - {  
95 - label: 'primary',  
96 - value: 'primary'  
97 - },  
98 - {  
99 - label: 'tertiary',  
100 - value: 'tertiary'  
101 - }, 156 +//native-ui 组件popover内置弹窗位置,不需要通过枚举方式
  157 +const placementOptions: SelectOption[] = [
102 { 158 {
103 - label: 'info',  
104 - value: 'info' 159 + label: '顶部',
  160 + value: 'top'
105 }, 161 },
106 { 162 {
107 - label: 'success',  
108 - value: 'success' 163 + label: '右边',
  164 + value: 'right'
109 }, 165 },
110 { 166 {
111 - label: 'warning',  
112 - value: 'warning' 167 + label: '左边',
  168 + value: 'left'
113 }, 169 },
114 { 170 {
115 - label: 'error',  
116 - value: 'error' 171 + label: '底部',
  172 + value: 'bottom'
117 } 173 }
118 ] 174 ]
119 -  
120 -const selectTargetItemOptions = ref<{ label: string; value: string }[]>([])  
121 -  
122 -onMounted(() => {  
123 - const componentList = chartEditStore.getComponentList?.map(item => ({  
124 - label: item.chartConfig?.title,  
125 - value: item.id  
126 - }))  
127 - selectTargetItemOptions.value = componentList  
128 -})  
129 </script> 175 </script>
130 -<style lang="scss" scoped>  
131 -.help-span {  
132 - display: flex;  
133 - flex-wrap: wrap;  
134 - width: 8vw;  
135 - color: white;  
136 -}  
137 -</style> 176 +<style lang="scss" scoped></style>
@@ -13,5 +13,5 @@ export const DecorateButton1Config: ConfigType = { @@ -13,5 +13,5 @@ export const DecorateButton1Config: ConfigType = {
13 categoryName: ChatCategoryEnumName.INPUTS, 13 categoryName: ChatCategoryEnumName.INPUTS,
14 package: PackagesCategoryEnum.INFORMATIONS, 14 package: PackagesCategoryEnum.INFORMATIONS,
15 chartFrame: ChartFrameEnum.COMMON, 15 chartFrame: ChartFrameEnum.COMMON,
16 - image: 'page_button.png' 16 + image: 'decorate_button1.png'
17 } 17 }
1 <template> 1 <template>
2 - <div class="decorate-button" @mouseup="handleSvgMouseUpClick" @mousedown="handleSvgMouseDownClick">  
3 - <svg :width="w" :height="h" viewBox="0 0 723 100" fill="none">  
4 - <g opacity="1" transform="translate(0 0)">  
5 - <g v-if="isActivate" opacity="1" transform="translate(0 0)">  
6 - <path id="矩形 1" fill-rule="evenodd" style="fill: #cccccc" opacity="0" d="M0 100L342 100L342 0L0 0L0 100Z" />  
7 - <path  
8 - fill-rule="evenodd"  
9 - id="矩形 1"  
10 - style="fill: #044e92; opacity: 1"  
11 - d="M342 100L0 100L0 0L342 0L342 100ZM341 1L1 1L1 99L341 99L341 1Z"  
12 - />  
13 - <path  
14 - id="并集"  
15 - fill-rule="evenodd"  
16 - style="fill: #29a2ff"  
17 - opacity="1"  
18 - d="M2 16L0 16L0 0L16 0L16 2L2 2L2 16Z"  
19 - />  
20 - <path  
21 - id="并集"  
22 - fill-rule="evenodd"  
23 - style="fill: #29a2ff"  
24 - opacity="1"  
25 - d="M326 2L326 0L342 0L342 16L340 16L340 2L326 2Z"  
26 - />  
27 - <path  
28 - id="并集"  
29 - fill-rule="evenodd"  
30 - style="fill: #29a2ff"  
31 - opacity="1"  
32 - d="M2 100L0 100L0 84L2 84L2 98L16 98L16 100L2 100Z"  
33 - />  
34 - <path  
35 - id="并集"  
36 - fill-rule="evenodd"  
37 - style="fill: #29a2ff"  
38 - opacity="1"  
39 - d="M342 98L342 100L326 100L326 98L340 98L340 84L342 84L342 98Z"  
40 - />  
41 - <path id="路径" fill-rule="evenodd" style="fill: #00ff7e" opacity="1" d="M8 16L17 7L8 7L8 16Z" />  
42 - <path id="路径" fill-rule="evenodd" style="fill: #00ff7e" opacity="1" d="M335 84L326 93L335 93L335 84Z" />  
43 - <g filter="url(#filter_9)"> 2 + <section class="decorate1-button">
  3 + <TKDialog
  4 + :disabled="!disabled"
  5 + :popupConfig="popupConfig"
  6 + :popupConfigData="dataset"
  7 + :w="w"
  8 + :h="h"
  9 + @updateShow="handleUpdateShow"
  10 + >
  11 + <svg
  12 + @click="handleSvgClick(useChartEditStore().getPageConfig)"
  13 + style="outline: none"
  14 + :width="w"
  15 + :height="h"
  16 + viewBox="0 0 473 100"
  17 + fill="none"
  18 + >
  19 + <g opacity="1" transform="translate(68 0)">
  20 + <g v-if="!isActivate" opacity="1" transform="translate(0 0)">
44 <path 21 <path
45 - id="路径" 22 + id="矩形 1"
46 fill-rule="evenodd" 23 fill-rule="evenodd"
47 - style="fill: #001735"  
48 - opacity="1"  
49 - d="M9 92L318 92L335 74.5L335 8L24.5 8L9 22.5L9 92Z" 24 + style="fill: #cccccc"
  25 + opacity="0"
  26 + d="M0 100L342 100L342 0L0 0L0 100Z"
50 /> 27 />
51 <path 28 <path
52 - id="路径" 29 + fill-rule="evenodd"
  30 + id="矩形 1"
53 style="fill: #044e92; opacity: 1" 31 style="fill: #044e92; opacity: 1"
54 - d="M9 91.5L318 91.5L318 92L317.641 91.6516L334.641 74.1516L335 74.5L334.5 74.5L334.5 8L335 8L335 8.5L24.5 8.5L24.5 8L24.8416 8.36514L9.34158 22.8651L9 22.5L9.5 22.5L9.5 92L9 92L9 91.5ZM8.5 92.5L8.5 22.2831L24.3026 7.5L335.5 7.5L335.5 74.7029L318.211 92.5L9 92.5L8.5 92.5Z" 32 + d="M342 100L0 100L0 0L342 0L342 100ZM341 1L1 1L1 99L341 99L341 1Z"
55 /> 33 />
56 - </g>  
57 - <path  
58 - id="矩形 2"  
59 - fill-rule="evenodd"  
60 - style="fill: #29a2ff"  
61 - opacity="1"  
62 - d="M128.5 10L213.5 10L213.5 6L128.5 6L128.5 10Z"  
63 - />  
64 - <path  
65 - id="矩形 2"  
66 - fill-rule="evenodd"  
67 - style="fill: #29a2ff"  
68 - opacity="1"  
69 - d="M128.5 94L213.5 94L213.5 90L128.5 90L128.5 94Z"  
70 - />  
71 - <g opacity="1" transform="translate(108 28.5)">  
72 - <text>  
73 - <tspan  
74 - x="0"  
75 - y="34.952"  
76 - font-size="32"  
77 - line-height="42"  
78 - fill="#FFFFFF" 34 + <path
  35 + id="并集"
  36 + fill-rule="evenodd"
  37 + style="fill: #29a2ff"
  38 + opacity="1"
  39 + d="M2 16L0 16L0 0L16 0L16 2L2 2L2 16Z"
  40 + />
  41 + <path
  42 + id="并集"
  43 + fill-rule="evenodd"
  44 + style="fill: #29a2ff"
  45 + opacity="1"
  46 + d="M326 2L326 0L342 0L342 16L340 16L340 2L326 2Z"
  47 + />
  48 + <path
  49 + id="并集"
  50 + fill-rule="evenodd"
  51 + style="fill: #29a2ff"
  52 + opacity="1"
  53 + d="M2 100L0 100L0 84L2 84L2 98L16 98L16 100L2 100Z"
  54 + />
  55 + <path
  56 + id="并集"
  57 + fill-rule="evenodd"
  58 + style="fill: #29a2ff"
  59 + opacity="1"
  60 + d="M342 98L342 100L326 100L326 98L340 98L340 84L342 84L342 98Z"
  61 + />
  62 + <path id="路径" fill-rule="evenodd" style="fill: #00ff7e" opacity="1" d="M8 16L17 7L8 7L8 16Z" />
  63 + <path id="路径" fill-rule="evenodd" style="fill: #00ff7e" opacity="1" d="M335 84L326 93L335 93L335 84Z" />
  64 + <g filter="url(#filter_9)">
  65 + <path
  66 + id="路径"
  67 + fill-rule="evenodd"
  68 + :style="{ fill: colorConfig.notActiveColor }"
79 opacity="1" 69 opacity="1"
80 - font-family="SourceHanSansCN-Regular"  
81 - font-weight="Regular"  
82 - letter-spacing="0"  
83 - >  
84 - 正常按钮  
85 - </tspan>  
86 - </text>  
87 - </g>  
88 - </g>  
89 - <g v-else opacity="1" transform="translate(0 0)">  
90 - <path id="矩形 1" fill-rule="evenodd" style="fill: #cccccc" opacity="0" d="M0 100L342 100L342 0L0 0L0 100Z" />  
91 - <path  
92 - fill-rule="evenodd"  
93 - id="矩形 1"  
94 - style="fill: #044e92; opacity: 1"  
95 - d="M342 100L0 100L0 0L342 0L342 100ZM341 1L1 1L1 99L341 99L341 1Z"  
96 - />  
97 - <path  
98 - id="并集"  
99 - fill-rule="evenodd"  
100 - style="fill: #29a2ff"  
101 - opacity="1"  
102 - d="M2 16L0 16L0 0L16 0L16 2L2 2L2 16Z"  
103 - />  
104 - <path  
105 - id="并集"  
106 - fill-rule="evenodd"  
107 - style="fill: #29a2ff"  
108 - opacity="1"  
109 - d="M326 2L326 0L342 0L342 16L340 16L340 2L326 2Z"  
110 - />  
111 - <path  
112 - id="并集"  
113 - fill-rule="evenodd"  
114 - style="fill: #29a2ff"  
115 - opacity="1"  
116 - d="M2 100L0 100L0 84L2 84L2 98L16 98L16 100L2 100Z"  
117 - />  
118 - <path  
119 - id="并集"  
120 - fill-rule="evenodd"  
121 - style="fill: #29a2ff"  
122 - opacity="1"  
123 - d="M342 98L342 100L326 100L326 98L340 98L340 84L342 84L342 98Z"  
124 - />  
125 - <path id="路径" fill-rule="evenodd" style="fill: #00ff7e" opacity="1" d="M8 16L17 7L8 7L8 16Z" />  
126 - <path id="路径" fill-rule="evenodd" style="fill: #00ff7e" opacity="1" d="M335 84L326 93L335 93L335 84Z" />  
127 - <g filter="url(#filter_21)"> 70 + d="M9 92L318 92L335 74.5L335 8L24.5 8L9 22.5L9 92Z"
  71 + />
  72 + <path
  73 + id="路径"
  74 + style="fill: #044e92; opacity: 1"
  75 + d="M9 91.5L318 91.5L318 92L317.641 91.6516L334.641 74.1516L335 74.5L334.5 74.5L334.5 8L335 8L335 8.5L24.5 8.5L24.5 8L24.8416 8.36514L9.34158 22.8651L9 22.5L9.5 22.5L9.5 92L9 92L9 91.5ZM8.5 92.5L8.5 22.2831L24.3026 7.5L335.5 7.5L335.5 74.7029L318.211 92.5L9 92.5L8.5 92.5Z"
  76 + />
  77 + </g>
128 <path 78 <path
129 - id="路径" 79 + id="矩形 2"
130 fill-rule="evenodd" 80 fill-rule="evenodd"
131 - style="fill: #001e29" 81 + style="fill: #29a2ff"
132 opacity="1" 82 opacity="1"
133 - d="M9 92L318 92L335 74.5L335 8L24.5 8L9 22.5L9 92Z" 83 + d="M128.5 10L213.5 10L213.5 6L128.5 6L128.5 10Z"
134 /> 84 />
135 <path 85 <path
136 - id="路径"  
137 - style="fill: #00c9e8; opacity: 1"  
138 - d="M9 91.5L318 91.5L318 92L317.641 91.6516L334.641 74.1516L335 74.5L334.5 74.5L334.5 8L335 8L335 8.5L24.5 8.5L24.5 8L24.8416 8.36514L9.34158 22.8651L9 22.5L9.5 22.5L9.5 92L9 92L9 91.5ZM8.5 92.5L8.5 22.2831L24.3026 7.5L335.5 7.5L335.5 74.7029L318.211 92.5L9 92.5L8.5 92.5Z" 86 + id="矩形 2"
  87 + fill-rule="evenodd"
  88 + style="fill: #29a2ff"
  89 + opacity="1"
  90 + d="M128.5 94L213.5 94L213.5 90L128.5 90L128.5 94Z"
139 /> 91 />
140 - </g>  
141 - <path  
142 - id="矩形 2"  
143 - fill-rule="evenodd"  
144 - style="fill: #17ece9"  
145 - opacity="1"  
146 - d="M128.5 10L213.5 10L213.5 6L128.5 6L128.5 10Z"  
147 - />  
148 - <path  
149 - id="矩形 2"  
150 - fill-rule="evenodd"  
151 - style="fill: #17ece9"  
152 - opacity="1"  
153 - d="M128.5 94L213.5 94L213.5 90L128.5 90L128.5 94Z"  
154 - />  
155 - <g id="激活按钮" filter="url(#filter_25)">  
156 <g opacity="1" transform="translate(108 28.5)"> 92 <g opacity="1" transform="translate(108 28.5)">
157 <text> 93 <text>
158 <tspan 94 <tspan
159 - x="0"  
160 - y="34.952"  
161 - font-size="32" 95 + :x="fontConfig.x1"
  96 + :y="fontConfig.y1"
  97 + :font-size="fontConfig.datasetTspanFontSize"
162 line-height="42" 98 line-height="42"
163 - fill="#00DEFF" 99 + :fill="fontConfig.datasetTspanFill"
164 opacity="1" 100 opacity="1"
165 font-family="SourceHanSansCN-Regular" 101 font-family="SourceHanSansCN-Regular"
166 font-weight="Regular" 102 font-weight="Regular"
167 letter-spacing="0" 103 letter-spacing="0"
168 > 104 >
169 - 激活按钮 105 + {{ svgTitle }}
170 </tspan> 106 </tspan>
171 </text> 107 </text>
172 </g> 108 </g>
173 </g> 109 </g>
174 - <g opacity="1" transform="translate(108 28.5)">  
175 - <text>  
176 - <tspan  
177 - x="0"  
178 - y="34.952"  
179 - font-size="32"  
180 - line-height="42"  
181 - fill="#FFFFFF" 110 + <g v-else opacity="1" transform="translate(0 0)">
  111 + <path
  112 + id="矩形 1"
  113 + fill-rule="evenodd"
  114 + style="fill: #cccccc"
  115 + opacity="0"
  116 + d="M0 100L342 100L342 0L0 0L0 100Z"
  117 + />
  118 + <path
  119 + fill-rule="evenodd"
  120 + id="矩形 1"
  121 + style="fill: #044e92; opacity: 1"
  122 + d="M342 100L0 100L0 0L342 0L342 100ZM341 1L1 1L1 99L341 99L341 1Z"
  123 + />
  124 + <path
  125 + id="并集"
  126 + fill-rule="evenodd"
  127 + style="fill: #29a2ff"
  128 + opacity="1"
  129 + d="M2 16L0 16L0 0L16 0L16 2L2 2L2 16Z"
  130 + />
  131 + <path
  132 + id="并集"
  133 + fill-rule="evenodd"
  134 + style="fill: #29a2ff"
  135 + opacity="1"
  136 + d="M326 2L326 0L342 0L342 16L340 16L340 2L326 2Z"
  137 + />
  138 + <path
  139 + id="并集"
  140 + fill-rule="evenodd"
  141 + style="fill: #29a2ff"
  142 + opacity="1"
  143 + d="M2 100L0 100L0 84L2 84L2 98L16 98L16 100L2 100Z"
  144 + />
  145 + <path
  146 + id="并集"
  147 + fill-rule="evenodd"
  148 + style="fill: #29a2ff"
  149 + opacity="1"
  150 + d="M342 98L342 100L326 100L326 98L340 98L340 84L342 84L342 98Z"
  151 + />
  152 + <path id="路径" fill-rule="evenodd" style="fill: #00ff7e" opacity="1" d="M8 16L17 7L8 7L8 16Z" />
  153 + <path id="路径" fill-rule="evenodd" style="fill: #00ff7e" opacity="1" d="M335 84L326 93L335 93L335 84Z" />
  154 + <g filter="url(#filter_21)">
  155 + <path
  156 + id="路径"
  157 + fill-rule="evenodd"
  158 + :style="{ fill: colorConfig.activeColor }"
182 opacity="1" 159 opacity="1"
183 - font-family="SourceHanSansCN-Regular"  
184 - font-weight="Regular"  
185 - letter-spacing="0"  
186 - >  
187 - 激活按钮  
188 - </tspan>  
189 - </text> 160 + d="M9 92L318 92L335 74.5L335 8L24.5 8L9 22.5L9 92Z"
  161 + />
  162 + <path
  163 + id="路径"
  164 + style="fill: #00c9e8; opacity: 1"
  165 + d="M9 91.5L318 91.5L318 92L317.641 91.6516L334.641 74.1516L335 74.5L334.5 74.5L334.5 8L335 8L335 8.5L24.5 8.5L24.5 8L24.8416 8.36514L9.34158 22.8651L9 22.5L9.5 22.5L9.5 92L9 92L9 91.5ZM8.5 92.5L8.5 22.2831L24.3026 7.5L335.5 7.5L335.5 74.7029L318.211 92.5L9 92.5L8.5 92.5Z"
  166 + />
  167 + </g>
  168 + <path
  169 + id="矩形 2"
  170 + fill-rule="evenodd"
  171 + style="fill: #17ece9"
  172 + opacity="1"
  173 + d="M128.5 10L213.5 10L213.5 6L128.5 6L128.5 10Z"
  174 + />
  175 + <path
  176 + id="矩形 2"
  177 + fill-rule="evenodd"
  178 + style="fill: #17ece9"
  179 + opacity="1"
  180 + d="M128.5 94L213.5 94L213.5 90L128.5 90L128.5 94Z"
  181 + />
  182 + <g id="激活按钮" filter="url(#filter_25)">
  183 + <g opacity="1" transform="translate(108 28.5)">
  184 + <text>
  185 + <tspan
  186 + :x="fontConfig.x1"
  187 + :y="fontConfig.y1"
  188 + :font-size="fontConfig.datasetTspanFontSize"
  189 + line-height="42"
  190 + :fill="fontConfig.datasetTspanFill"
  191 + opacity="1"
  192 + font-family="SourceHanSansCN-Regular"
  193 + font-weight="Regular"
  194 + letter-spacing="0"
  195 + >
  196 + {{ svgTitle }}
  197 + </tspan>
  198 + </text>
  199 + </g>
  200 + </g>
  201 + <g opacity="1" transform="translate(108 28.5)">
  202 + <text>
  203 + <tspan
  204 + :x="fontConfig.x1"
  205 + :y="fontConfig.y1"
  206 + :font-size="fontConfig.datasetTspanFontSize"
  207 + line-height="42"
  208 + :fill="fontConfig.datasetTspanFill"
  209 + opacity="1"
  210 + font-family="SourceHanSansCN-Regular"
  211 + font-weight="Regular"
  212 + letter-spacing="0"
  213 + >
  214 + {{ svgTitle }}
  215 + </tspan>
  216 + </text>
  217 + </g>
190 </g> 218 </g>
191 </g> 219 </g>
192 - </g>  
193 -  
194 - <defs>  
195 - <filter  
196 - id="filter_9"  
197 - x="0"  
198 - y="0"  
199 - width="336"  
200 - height="93"  
201 - filterUnits="userSpaceOnUse"  
202 - color-interpolation-filters="sRGB"  
203 - >  
204 - <feFlood flood-opacity="0" result="feFloodId" />  
205 - <feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />  
206 - <feColorMatrix  
207 - in="SourceAlpha"  
208 - type="matrix"  
209 - values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0"  
210 - result="hardAlpha"  
211 - /> 220 + <defs>
  221 + <filter
  222 + id="filter_9"
  223 + x="0"
  224 + y="0"
  225 + width="336"
  226 + height="93"
  227 + filterUnits="userSpaceOnUse"
  228 + color-interpolation-filters="sRGB"
  229 + >
  230 + <feFlood flood-opacity="0" result="feFloodId" />
  231 + <feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
  232 + <feColorMatrix
  233 + in="SourceAlpha"
  234 + type="matrix"
  235 + values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0"
  236 + result="hardAlpha"
  237 + />
212 238
213 - <feOffset dx="0" dy="0" />  
214 - <feGaussianBlur stdDeviation="10" />  
215 - <feComposite in2="hardAlpha" operator="arithmetic" k2="-1" k3="1" />  
216 - <feColorMatrix  
217 - type="matrix"  
218 - values="0 0 0 0 0.01568627450980392 0 0 0 0 0.4 0 0 0 0 0.8392156862745098 0 0 0 0.64 0"  
219 - />  
220 - <feBlend mode="normal" in2="shape" result="innerShadow_0" />  
221 - </filter>  
222 - <filter  
223 - id="filter_21"  
224 - x="0"  
225 - y="0"  
226 - width="336"  
227 - height="93"  
228 - filterUnits="userSpaceOnUse"  
229 - color-interpolation-filters="sRGB"  
230 - >  
231 - <feFlood flood-opacity="0" result="feFloodId" />  
232 - <feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />  
233 - <feColorMatrix  
234 - in="SourceAlpha"  
235 - type="matrix"  
236 - values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0"  
237 - result="hardAlpha"  
238 - /> 239 + <feOffset dx="0" dy="0" />
  240 + <feGaussianBlur stdDeviation="10" />
  241 + <feComposite in2="hardAlpha" operator="arithmetic" k2="-1" k3="1" />
  242 + <feColorMatrix
  243 + type="matrix"
  244 + values="0 0 0 0 0.01568627450980392 0 0 0 0 0.4 0 0 0 0 0.8392156862745098 0 0 0 0.64 0"
  245 + />
  246 + <feBlend mode="normal" in2="shape" result="innerShadow_0" />
  247 + </filter>
  248 + <filter
  249 + id="filter_21"
  250 + x="0"
  251 + y="0"
  252 + width="336"
  253 + height="93"
  254 + filterUnits="userSpaceOnUse"
  255 + color-interpolation-filters="sRGB"
  256 + >
  257 + <feFlood flood-opacity="0" result="feFloodId" />
  258 + <feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
  259 + <feColorMatrix
  260 + in="SourceAlpha"
  261 + type="matrix"
  262 + values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0"
  263 + result="hardAlpha"
  264 + />
239 265
240 - <feOffset dx="0" dy="0" />  
241 - <feGaussianBlur stdDeviation="10" />  
242 - <feComposite in2="hardAlpha" operator="arithmetic" k2="-1" k3="1" />  
243 - <feColorMatrix  
244 - type="matrix"  
245 - values="0 0 0 0 0.027450980392156862 0 0 0 0 0.5568627450980392 0 0 0 0 0.6392156862745098 0 0 0 1 0"  
246 - />  
247 - <feBlend mode="normal" in2="shape" result="innerShadow_0" />  
248 - </filter>  
249 - <filter  
250 - id="filter_25"  
251 - x="-6"  
252 - y="-6"  
253 - width="140"  
254 - height="55"  
255 - filterUnits="userSpaceOnUse"  
256 - color-interpolation-filters="sRGB"  
257 - >  
258 - <feFlood flood-opacity="0" result="BackgroundImageFix" />  
259 - <feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />  
260 - <feGaussianBlur stdDeviation="3" result="effect1_foregroundBlur" />  
261 - </filter>  
262 - </defs>  
263 - </svg>  
264 - </div> 266 + <feOffset dx="0" dy="0" />
  267 + <feGaussianBlur stdDeviation="10" />
  268 + <feComposite in2="hardAlpha" operator="arithmetic" k2="-1" k3="1" />
  269 + <feColorMatrix
  270 + type="matrix"
  271 + values="0 0 0 0 0.027450980392156862 0 0 0 0 0.5568627450980392 0 0 0 0 0.6392156862745098 0 0 0 1 0"
  272 + />
  273 + <feBlend mode="normal" in2="shape" result="innerShadow_0" />
  274 + </filter>
  275 + <filter
  276 + id="filter_25"
  277 + x="-6"
  278 + y="-6"
  279 + width="140"
  280 + height="55"
  281 + filterUnits="userSpaceOnUse"
  282 + color-interpolation-filters="sRGB"
  283 + >
  284 + <feFlood flood-opacity="0" result="BackgroundImageFix" />
  285 + <feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape" />
  286 + <feGaussianBlur stdDeviation="3" result="effect1_foregroundBlur" />
  287 + </filter>
  288 + </defs>
  289 + </svg>
  290 + </TKDialog>
  291 + </section>
265 </template> 292 </template>
266 293
267 <script setup lang="ts"> 294 <script setup lang="ts">
268 -import { PropType, toRefs, shallowReactive, watch, onMounted, ref } from 'vue'  
269 -import cloneDeep from 'lodash/cloneDeep' 295 +import { PropType, toRefs, ref, nextTick, watch } from 'vue'
  296 +import type { option as rewriteOption } from './config'
270 import { CreateComponentType } from '@/packages/index.d' 297 import { CreateComponentType } from '@/packages/index.d'
271 import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore' 298 import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore'
272 import { useChartInteract } from '@/hooks/external/useButtonPageChangeInteract.hook' 299 import { useChartInteract } from '@/hooks/external/useButtonPageChangeInteract.hook'
273 import { InteractEventOn } from '@/enums/eventEnum' 300 import { InteractEventOn } from '@/enums/eventEnum'
274 import { ComponentInteractParamsEnum } from './interact' 301 import { ComponentInteractParamsEnum } from './interact'
  302 +import { PageChartListItem } from '@/store/modules/chartEditStore/chartEditStore.d'
  303 +import { TKDialog } from '@/components/external/Common/TKDialog'
275 304
276 const props = defineProps({ 305 const props = defineProps({
277 chartConfig: { 306 chartConfig: {
@@ -282,35 +311,13 @@ const props = defineProps({ @@ -282,35 +311,13 @@ const props = defineProps({
282 311
283 const { w, h } = toRefs(props.chartConfig.attr) 312 const { w, h } = toRefs(props.chartConfig.attr)
284 313
285 -const {  
286 - buttonType,  
287 - buttonDashed,  
288 - buttonGhost,  
289 - buttonColor,  
290 - buttonTextColor,  
291 - buttonTextSize,  
292 - dataset,  
293 - buttonTextBold,  
294 - quaternary  
295 -} = toRefs(props.chartConfig.option)  
296 -  
297 -const option = shallowReactive({  
298 - value: cloneDeep(props.chartConfig.option)  
299 -})  
300 -  
301 -const interactPageId = ref('') 314 +const { dataset, fontConfig, colorConfig, popupConfig, svgTitle, disabled } = toRefs(
  315 + props.chartConfig.option as typeof rewriteOption
  316 +)
302 317
303 -const isActivate = ref(true) 318 +const isActivate = ref(false)
304 319
305 -const onClick = (v: any) => {  
306 - // useChartInteract(  
307 - // props.chartConfig,  
308 - // useChartEditStore,  
309 - // { [ComponentInteractParamsEnum.DATA]: v },  
310 - // InteractEventOn.CHANGE,  
311 - // status  
312 - // )  
313 - interactPageId.value = v 320 +const useInteract = (v: PageChartListItem) => {
314 useChartInteract( 321 useChartInteract(
315 props.chartConfig, 322 props.chartConfig,
316 useChartEditStore, 323 useChartEditStore,
@@ -319,54 +326,29 @@ const onClick = (v: any) => { @@ -319,54 +326,29 @@ const onClick = (v: any) => {
319 ) 326 )
320 } 327 }
321 328
322 -const handleSvgMouseUpClick = () => {  
323 - isActivate.value = true 329 +const handleSvgClick = (v: PageChartListItem) => {
  330 + if (disabled.value) return
  331 + useInteract(v)
324 } 332 }
325 333
326 -const handleSvgMouseDownClick = () => {  
327 - isActivate.value = false 334 +const handleUpdateShow = async (show: boolean) => {
  335 + await nextTick()
  336 + isActivate.value = show
328 } 337 }
329 338
330 -onMounted(() => {  
331 - // onClick(option.value.selectTargetItems)  
332 - // onClick(useChartEditStore().getPageConfig)  
333 -})  
334 -  
335 -// 手动更新  
336 watch( 339 watch(
337 - () => props.chartConfig.option,  
338 - (newData: any) => {  
339 - option.value = newData  
340 - // onClick(newData.tabValue) 340 + () => disabled.value,
  341 + (newValue: boolean) => {
  342 + disabled.value = newValue
341 }, 343 },
342 { 344 {
343 - immediate: true,  
344 - deep: true  
345 - }  
346 -)  
347 -  
348 -watch(  
349 - () => interactPageId.value,  
350 - (newValue: Recordable) => {  
351 - useChartInteract(  
352 - props.chartConfig,  
353 - useChartEditStore,  
354 - { [ComponentInteractParamsEnum.DATA]: newValue },  
355 - InteractEventOn.PAGE_CHANGE  
356 - )  
357 - },  
358 - {  
359 - deep: true 345 + immediate: true
360 } 346 }
361 ) 347 )
362 </script> 348 </script>
363 349
364 <style lang="scss" scoped> 350 <style lang="scss" scoped>
365 -.button-text-color {  
366 - color: v-bind('buttonTextColor');  
367 - font-size: v-bind('`${buttonTextSize}px`');  
368 -}  
369 -.decorate-button { 351 +.decorate1-button {
370 cursor: pointer; 352 cursor: pointer;
371 } 353 }
372 </style> 354 </style>
@@ -8,7 +8,7 @@ export const PageButtonConfig: ConfigType = { @@ -8,7 +8,7 @@ export const PageButtonConfig: ConfigType = {
8 key, 8 key,
9 chartKey, 9 chartKey,
10 conKey, 10 conKey,
11 - title: '页面切换按钮', 11 + title: '切换多页按钮',
12 category: ChatCategoryEnum.INPUTS, 12 category: ChatCategoryEnum.INPUTS,
13 categoryName: ChatCategoryEnumName.INPUTS, 13 categoryName: ChatCategoryEnumName.INPUTS,
14 package: PackagesCategoryEnum.INFORMATIONS, 14 package: PackagesCategoryEnum.INFORMATIONS,
@@ -8,15 +8,19 @@ export const option = { @@ -8,15 +8,19 @@ export const option = {
8 header: ['列1', '列2', '列3'], 8 header: ['列1', '列2', '列3'],
9 dataset: dataJson, 9 dataset: dataJson,
10 index: true, 10 index: true,
11 - columnWidth: [30, 100, 100],  
12 - align: ['center', 'right', 'right', 'right'], 11 + columnWidth: [100, 300, 300, 300],
  12 + align: ['center', 'center', 'center', 'center'],
13 rowNum: 5, 13 rowNum: 5,
14 waitTime: 2, 14 waitTime: 2,
15 headerHeight: 35, 15 headerHeight: 35,
16 carousel: 'single', 16 carousel: 'single',
17 headerBGC: '#00BAFF', 17 headerBGC: '#00BAFF',
18 oddRowBGC: '#003B51', 18 oddRowBGC: '#003B51',
19 - evenRowBGC: '#0A2732' 19 + evenRowBGC: '#0A2732',
  20 + ceilSpanColor: '#FFFFFF',
  21 + ceilSpanFontSize: 16,
  22 + headerSpanColor: '#FFFFFF',
  23 + headerSpanFontSize: 16
20 } 24 }
21 25
22 export default class Config extends PublicConfigClass implements CreateComponentType { 26 export default class Config extends PublicConfigClass implements CreateComponentType {
@@ -50,7 +50,32 @@ @@ -50,7 +50,32 @@
50 /> 50 />
51 </SettingItem> 51 </SettingItem>
52 </SettingItemBox> 52 </SettingItemBox>
53 - 53 + <SettingItemBox name="表头字体">
  54 + <SettingItem name="颜色">
  55 + <n-color-picker size="small" :modes="['hex']" v-model:value="optionData.headerSpanColor"></n-color-picker>
  56 + </SettingItem>
  57 + <SettingItem name="大小">
  58 + <n-input-number
  59 + v-model:value="optionData.headerSpanFontSize"
  60 + :min="1"
  61 + size="small"
  62 + placeholder="请输入"
  63 + ></n-input-number>
  64 + </SettingItem>
  65 + </SettingItemBox>
  66 + <SettingItemBox name="内容字体">
  67 + <SettingItem name="颜色">
  68 + <n-color-picker size="small" :modes="['hex']" v-model:value="optionData.ceilSpanColor"></n-color-picker>
  69 + </SettingItem>
  70 + <SettingItem name="大小">
  71 + <n-input-number
  72 + v-model:value="optionData.ceilSpanFontSize"
  73 + :min="1"
  74 + size="small"
  75 + placeholder="请输入"
  76 + ></n-input-number>
  77 + </SettingItem>
  78 + </SettingItemBox>
54 <SettingItemBox name="样式"> 79 <SettingItemBox name="样式">
55 <SettingItem name="表头背景色"> 80 <SettingItem name="表头背景色">
56 <n-color-picker size="small" :modes="['hex']" v-model:value="optionData.headerBGC"></n-color-picker> 81 <n-color-picker size="small" :modes="['hex']" v-model:value="optionData.headerBGC"></n-color-picker>
@@ -6,13 +6,15 @@ @@ -6,13 +6,15 @@
6 :style="`background-color: ${status.mergedConfig.headerBGC};`" 6 :style="`background-color: ${status.mergedConfig.headerBGC};`"
7 > 7 >
8 <div 8 <div
9 - class="header-item" 9 + class="header-item singe-line"
10 v-for="(headerItem, i) in status.header" 10 v-for="(headerItem, i) in status.header"
11 :key="`${headerItem}${i}`" 11 :key="`${headerItem}${i}`"
12 :style="` 12 :style="`
13 height: ${status.mergedConfig.headerHeight}px; 13 height: ${status.mergedConfig.headerHeight}px;
14 line-height: ${status.mergedConfig.headerHeight}px; 14 line-height: ${status.mergedConfig.headerHeight}px;
15 width: ${status.widths[i]}px; 15 width: ${status.widths[i]}px;
  16 + color:${headerSpanColor};
  17 + font-size:${headerSpanFontSize}px;
16 `" 18 `"
17 :align="status.aligns[i]" 19 :align="status.aligns[i]"
18 v-html="headerItem" 20 v-html="headerItem"
@@ -35,10 +37,14 @@ @@ -35,10 +37,14 @@
35 `" 37 `"
36 > 38 >
37 <div 39 <div
38 - class="ceil" 40 + class="ceil singe-line"
39 v-for="(ceil, ci) in row.ceils" 41 v-for="(ceil, ci) in row.ceils"
40 :key="`${ceil}${ri}${ci}`" 42 :key="`${ceil}${ri}${ci}`"
41 - :style="`width: ${status.widths[ci]}px;`" 43 + :style="`
  44 + width: ${status.widths[ci]}px;
  45 + color:${ceilSpanColor};
  46 + font-size:${ceilSpanFontSize}px;
  47 + `"
42 :align="status.aligns[ci]" 48 :align="status.aligns[ci]"
43 v-html="ceil" 49 v-html="ceil"
44 /> 50 />
@@ -66,7 +72,7 @@ const props = defineProps({ @@ -66,7 +72,7 @@ const props = defineProps({
66 // 这里能拿到图表宽高等 72 // 这里能拿到图表宽高等
67 const { w, h } = toRefs(props.chartConfig.attr) 73 const { w, h } = toRefs(props.chartConfig.attr)
68 // 这里能拿到上面 config.ts 里的 option 数据 74 // 这里能拿到上面 config.ts 里的 option 数据
69 -// const { rowNum, headerHeight, index, backgroundColor } = toRefs(props.chartConfig.option) 75 +const { ceilSpanColor, ceilSpanFontSize, headerSpanColor, headerSpanFontSize } = toRefs(props.chartConfig.option)
70 76
71 const status = reactive({ 77 const status = reactive({
72 defaultConfig: { 78 defaultConfig: {
@@ -391,6 +397,12 @@ const handleDataFormat = (deviceDetail: any, attributes: any) => { @@ -391,6 +397,12 @@ const handleDataFormat = (deviceDetail: any, attributes: any) => {
391 </script> 397 </script>
392 398
393 <style lang="scss" scoped> 399 <style lang="scss" scoped>
  400 +.singe-line {
  401 + text-overflow: ellipsis;
  402 + overflow: hidden;
  403 + word-break: break-all;
  404 + white-space: nowrap;
  405 +}
394 .dv-scroll-board { 406 .dv-scroll-board {
395 position: relative; 407 position: relative;
396 width: 100%; 408 width: 100%;
@@ -1139,4 +1139,5 @@ export const useChartEditStore = defineStore({ @@ -1139,4 +1139,5 @@ export const useChartEditStore = defineStore({
1139 } 1139 }
1140 } 1140 }
1141 }) 1141 })
  1142 +
1142 // 1143 //