Showing
13 changed files
with
165 additions
and
346 deletions
1 | -<script lang="ts" setup> | |
1 | +<script lang="ts" setup name="WeatherContent"> | |
2 | 2 | import { toRefs } from 'vue' |
3 | 3 | import SelectCity from './SelectCity.vue' |
4 | -import { weatherTextMapImg } from '../config' | |
4 | +import { useUtils } from '../hooks/useUtils' | |
5 | 5 | |
6 | 6 | const props = defineProps({ |
7 | 7 | data: { |
... | ... | @@ -11,19 +11,13 @@ const props = defineProps({ |
11 | 11 | |
12 | 12 | const emits = defineEmits(['submit']) |
13 | 13 | |
14 | +const { loadWeatherImg, loadWeatherLevel } = useUtils() | |
15 | + | |
14 | 16 | const { casts } = toRefs(props.data[0]) |
15 | 17 | |
16 | 18 | const onHandleSelectValues = (values: any) => { |
17 | 19 | emits('submit', values) |
18 | 20 | } |
19 | - | |
20 | -//根据返回的文字加载不同天气图片 | |
21 | -const loadWeatherImg = (text: string) => { | |
22 | - return ( | |
23 | - weatherTextMapImg.find((item: any) => item.text === text)?.img || | |
24 | - '/large-designer/src/assets/external/weather/clearDay.png' | |
25 | - ) | |
26 | -} | |
27 | 21 | </script> |
28 | 22 | |
29 | 23 | <template> |
... | ... | @@ -59,16 +53,18 @@ const loadWeatherImg = (text: string) => { |
59 | 53 | <div class="content-weather-air"> |
60 | 54 | <div>{{ casts[0]?.dayweather }}</div> |
61 | 55 | <div>{{ casts[0]?.daywind }}</div> |
56 | + <div>{{ loadWeatherLevel(casts[0]?.daypower) }}</div> | |
62 | 57 | </div> |
63 | 58 | </div> |
64 | 59 | <template #footer> |
65 | - <div v-for="(item, index) in casts?.slice(0, 3)" :key="index" class="footer-content"> | |
66 | - <div>{{ index === 0 ? '今天' : index === 1 ? '明天' : '后天' }}</div> | |
60 | + <div v-for="(item, index) in casts" :key="index" class="footer-content"> | |
61 | + <div>{{ index === 0 ? '今天' : index === 1 ? '明天' : index === 2 ? '后天' : '外天' }}</div> | |
67 | 62 | <div> |
68 | 63 | <img :src="loadWeatherImg(item?.dayweather)" /> |
69 | 64 | </div> |
70 | 65 | <div>{{ item?.daytemp }}/{{ item?.nighttemp }}</div> |
71 | 66 | <div>{{ item?.daywind }}</div> |
67 | + <div>{{ loadWeatherLevel(item?.daypower) }}</div> | |
72 | 68 | </div> |
73 | 69 | </template> |
74 | 70 | </n-card> |
... | ... | @@ -92,7 +88,6 @@ const loadWeatherImg = (text: string) => { |
92 | 88 | } |
93 | 89 | } |
94 | 90 | .card-content { |
95 | - width: 100%; | |
96 | 91 | @extend %flex-style; |
97 | 92 | .content-weather { |
98 | 93 | @extend %flex-style; |
... | ... | @@ -108,12 +103,12 @@ const loadWeatherImg = (text: string) => { |
108 | 103 | } |
109 | 104 | } |
110 | 105 | .footer-content { |
111 | - width: 100%; | |
112 | 106 | @extend %flex-style; |
113 | - gap: 30px; | |
114 | - margin-left: 5px; | |
107 | + gap: 10px; | |
108 | + margin-left: 10px; | |
115 | 109 | div { |
116 | 110 | flex: 1; |
111 | + text-align: left; | |
117 | 112 | img { |
118 | 113 | width: 24px; |
119 | 114 | height: 24px; | ... | ... |
... | ... | @@ -4,9 +4,13 @@ import { WeatherConfig } from './index' |
4 | 4 | import cloneDeep from 'lodash/cloneDeep' |
5 | 5 | import { chartInitConfig } from '@/settings/designSetting' |
6 | 6 | |
7 | -//第三方 高德天气接口key值和api配置 | |
8 | -export const thirdPartyWeatherKey = `0551a87b45e0363ae6c7a2242e8ac944` | |
9 | -export const thirdPartyWeatherApi = `https://restapi.amap.com/v3/weather/weatherInfo` | |
7 | +//第三方 天气接口key值和api配置(高德) | |
8 | +export class ThirdPartyWeather { | |
9 | + static ak = '0551a87b45e0363ae6c7a2242e8ac944' | |
10 | + static api = 'https://restapi.amap.com/v3/weather/weatherInfo' | |
11 | + // ((all,预报天气),(base,实况天气)) | |
12 | + static extensions = 'all' | |
13 | +} | |
10 | 14 | |
11 | 15 | //省市区枚举 |
12 | 16 | export const enum areaEnum { |
... | ... | @@ -35,6 +39,62 @@ export const weatherTextMapImg = [ |
35 | 39 | } |
36 | 40 | ] |
37 | 41 | |
42 | +//风力等级文字映射 | |
43 | +export const weatherSpeedMapText = [ | |
44 | + { | |
45 | + level: (value: number) => value >= 0.0 && value <= 0.2, | |
46 | + text: '无风' | |
47 | + }, | |
48 | + { | |
49 | + level: (value: number) => value >= 0.3 && value <= 1.5, | |
50 | + text: '软风' | |
51 | + }, | |
52 | + { | |
53 | + level: (value: number) => value >= 1.6 && value <= 3.3, | |
54 | + text: '轻风' | |
55 | + }, | |
56 | + { | |
57 | + level: (value: number) => value >= 3.4 && value <= 5.4, | |
58 | + text: '微风' | |
59 | + }, | |
60 | + { | |
61 | + level: (value: number) => value >= 5.5 && value <= 7.9, | |
62 | + text: '和风' | |
63 | + }, | |
64 | + { | |
65 | + level: (value: number) => value >= 8.0 && value <= 10.7, | |
66 | + text: '劲风' | |
67 | + }, | |
68 | + { | |
69 | + level: (value: number) => value >= 10.8 && value <= 13.8, | |
70 | + text: '强风' | |
71 | + }, | |
72 | + { | |
73 | + level: (value: number) => value >= 13.9 || value <= 17.1, | |
74 | + text: '疾风' | |
75 | + }, | |
76 | + { | |
77 | + level: (value: number) => value >= 17.2 && value <= 20.7, | |
78 | + text: '大风' | |
79 | + }, | |
80 | + { | |
81 | + level: (value: number) => value >= 20.8 && value <= 24.4, | |
82 | + text: '烈风' | |
83 | + }, | |
84 | + { | |
85 | + level: (value: number) => value >= 24.5 && value <= 28.4, | |
86 | + text: '狂风' | |
87 | + }, | |
88 | + { | |
89 | + level: (value: number) => value >= 28.5 && value <= 32.6, | |
90 | + text: '暴风' | |
91 | + }, | |
92 | + { | |
93 | + level: (value: number) => value >= 32.7 && value <= 36.9, | |
94 | + text: '飓风' | |
95 | + } | |
96 | +] | |
97 | + | |
38 | 98 | export const option = { |
39 | 99 | dataset: { |
40 | 100 | provinceValue: null, |
... | ... | @@ -50,6 +110,8 @@ export const option = { |
50 | 110 | weatherIconSizeHeight: '24', |
51 | 111 | airSpeedTextSize: '16', |
52 | 112 | airSpeedTextColor: '#000000', |
113 | + airSpeedLevelTextSize: '16', | |
114 | + airSpeedLevelTextColor: '#000000', | |
53 | 115 | backgroundColor: 'transparent', |
54 | 116 | borderRadius: '5' |
55 | 117 | } |
... | ... | @@ -57,7 +119,7 @@ export const option = { |
57 | 119 | |
58 | 120 | export default class Config extends PublicConfigClass implements CreateComponentType { |
59 | 121 | public key = WeatherConfig.key |
60 | - public attr = { ...chartInitConfig, zIndex: 1, w: 181, h: 44 } | |
122 | + public attr = { ...chartInitConfig, zIndex: 1, w: 300, h: 60 } | |
61 | 123 | public chartConfig = cloneDeep(WeatherConfig) |
62 | 124 | public option = cloneDeep(option) |
63 | 125 | } | ... | ... |
1 | 1 | <template> |
2 | 2 | <CollapseItem name="天气配置" :expanded="true"> |
3 | - <SettingItemBox name="区域选择"> | |
4 | - <SelectCity @submit="onHandleSelectValues" /> | |
5 | - </SettingItemBox> | |
3 | + <SettingItemBox name="区域选择"> </SettingItemBox> | |
4 | + <SelectCity @submit="onHandleSelectValues" /> | |
6 | 5 | <SettingItemBox name="背景"> |
7 | 6 | <SettingItem name="颜色"> |
8 | 7 | <n-color-picker v-model:value="optionData.weatherCss.backgroundColor" /> |
... | ... | @@ -55,6 +54,19 @@ |
55 | 54 | <n-button size="small" @click="optionData.weatherCss.airSpeedTextColor = '#000000'"> 恢复默认颜色 </n-button> |
56 | 55 | </SettingItem> |
57 | 56 | </SettingItemBox> |
57 | + <SettingItemBox name="风速等级"> | |
58 | + <SettingItem name="大小"> | |
59 | + <n-input v-model:value="optionData.weatherCss.airSpeedLevelTextSize" /> | |
60 | + </SettingItem> | |
61 | + <SettingItem name="颜色"> | |
62 | + <n-color-picker v-model:value="optionData.weatherCss.airSpeedLevelTextColor" /> | |
63 | + </SettingItem> | |
64 | + <SettingItem> | |
65 | + <n-button size="small" @click="optionData.weatherCss.airSpeedLevelTextColor = '#000000'"> | |
66 | + 恢复默认颜色 | |
67 | + </n-button> | |
68 | + </SettingItem> | |
69 | + </SettingItemBox> | |
58 | 70 | </CollapseItem> |
59 | 71 | </template> |
60 | 72 | ... | ... |
1 | +import { weatherSpeedMapText, weatherTextMapImg } from '../config' | |
2 | + | |
3 | +export const useUtils = () => { | |
4 | + const loadWeatherImg = (text: string) => { | |
5 | + return ( | |
6 | + weatherTextMapImg.find((item: any) => item.text === text)?.img || | |
7 | + '/large-designer/src/assets/external/weather/clearDay.png' | |
8 | + ) | |
9 | + } | |
10 | + | |
11 | + //风力等级 ≤3 3 | |
12 | + const loadWeatherLevel = (speed: string) => { | |
13 | + let handleSpeed = '' | |
14 | + if (speed?.startsWith('≤')) { | |
15 | + handleSpeed = speed.slice(1) | |
16 | + } else { | |
17 | + handleSpeed = speed | |
18 | + } | |
19 | + return weatherSpeedMapText.find((item: any) => item.level(Number(handleSpeed)))?.text | |
20 | + } | |
21 | + return { | |
22 | + loadWeatherImg, | |
23 | + loadWeatherLevel | |
24 | + } | |
25 | +} | ... | ... |
1 | -<script lang="ts" setup> | |
1 | +<script lang="ts" setup name="Weather"> | |
2 | 2 | import { PropType, toRefs, onMounted, reactive, watch } from 'vue' |
3 | 3 | import { CreateComponentType } from '@/packages/index.d' |
4 | -import { option, thirdPartyWeatherKey, thirdPartyWeatherApi, weatherTextMapImg } from './config' | |
4 | +import { option, ThirdPartyWeather } from './config' | |
5 | 5 | import axios from 'axios' |
6 | 6 | import WeatherContent from './componnets/WeatherContent.vue' |
7 | +import { useUtils } from './hooks/useUtils' | |
7 | 8 | |
8 | 9 | const props = defineProps({ |
9 | 10 | chartConfig: { |
... | ... | @@ -12,6 +13,8 @@ const props = defineProps({ |
12 | 13 | } |
13 | 14 | }) |
14 | 15 | |
16 | +const { loadWeatherImg, loadWeatherLevel } = useUtils() | |
17 | + | |
15 | 18 | const { w, h } = toRefs(props.chartConfig.attr) |
16 | 19 | |
17 | 20 | const { |
... | ... | @@ -23,6 +26,8 @@ const { |
23 | 26 | weatherIconSizeHeight, |
24 | 27 | airSpeedTextSize, |
25 | 28 | airSpeedTextColor, |
29 | + airSpeedLevelTextSize, | |
30 | + airSpeedLevelTextColor, | |
26 | 31 | backgroundColor, |
27 | 32 | borderRadius |
28 | 33 | } = toRefs(props.chartConfig.option.weatherCss) |
... | ... | @@ -31,17 +36,16 @@ const weatherInfoValues: any = reactive({ |
31 | 36 | weatherInfo: [] |
32 | 37 | }) |
33 | 38 | |
34 | -//获取第三方服务(高德天气) | |
35 | -const getWeatherInfos = async (cityObj: any, extensions = 'all') => { | |
39 | +const getWeatherInfos = async (cityObj: any) => { | |
36 | 40 | const { cityValue, countyValue } = cityObj || props.chartConfig.option.dataset |
37 | 41 | const params = { |
38 | - key: thirdPartyWeatherKey, | |
42 | + key: ThirdPartyWeather.ak, | |
39 | 43 | city: !countyValue ? cityValue : countyValue, |
40 | - extensions | |
44 | + extensions: ThirdPartyWeather.extensions | |
41 | 45 | } as any |
42 | 46 | const { |
43 | 47 | data: { forecasts } |
44 | - } = await axios.get(thirdPartyWeatherApi, { params }) | |
48 | + } = await axios.get(ThirdPartyWeather.api, { params }) | |
45 | 49 | if (!forecasts) return |
46 | 50 | weatherInfoValues.weatherInfo = forecasts |
47 | 51 | } |
... | ... | @@ -64,45 +68,23 @@ watch( |
64 | 68 | const onHandleSelectValues = (values: any) => { |
65 | 69 | getWeatherInfos(values) |
66 | 70 | } |
67 | - | |
68 | -//根据返回的文字加载不同天气图片 | |
69 | -const loadWeatherImg = (text: string) => { | |
70 | - return ( | |
71 | - weatherTextMapImg.find((item: any) => item.text === text)?.img || | |
72 | - '/large-designer/src/assets/external/weather/clearDay.png' | |
73 | - ) | |
74 | -} | |
75 | 71 | </script> |
76 | 72 | |
77 | 73 | <template> |
78 | 74 | <div> |
79 | 75 | <n-popover placement="bottom" trigger="hover" raw :show-arrow="false"> |
80 | 76 | <template #trigger> |
81 | - <n-card | |
82 | - class="card" | |
83 | - :bordered="false" | |
84 | - :style="`background-color:${backgroundColor};border-radius:${borderRadius}px;`" | |
85 | - > | |
77 | + <n-card class="card" :bordered="false"> | |
86 | 78 | <div class="card-content" v-for="(item, index) in weatherInfoValues.weatherInfo" :key="index"> |
87 | - <div :style="`font-size:${temperatureTextSize}px;color:${temperatureTextColor};`"> | |
88 | - {{ item?.casts[0]?.daytemp }}°C | |
89 | - </div> | |
90 | - <div class="card-content-city-text" :style="`font-size:${cityTextSize}px;color:${cityTextColor};`"> | |
91 | - {{ item?.city }} | |
92 | - </div> | |
93 | - <div> | |
94 | - <img | |
95 | - :style="`width:${weatherIconSizeWidth}px;height:${weatherIconSizeHeight}px;`" | |
96 | - :src="loadWeatherImg(item?.casts[0]?.dayweather)" | |
97 | - /> | |
98 | - </div> | |
99 | - <div :style="`font-size:${airSpeedTextSize}px;color:${airSpeedTextColor};`"> | |
100 | - {{ item?.casts[0]?.daywind }} | |
101 | - </div> | |
79 | + <div class="weather-temp">{{ item?.casts[0]?.daytemp }}°C</div> | |
80 | + <div class="weather-city">{{ item?.city }}</div> | |
81 | + <div><img class="weather-img" :src="loadWeatherImg(item?.casts[0]?.dayweather)" /></div> | |
82 | + <div class="weather-speed">{{ item?.casts[0]?.daywind }}</div> | |
83 | + <div class="weather-speed-level">{{ loadWeatherLevel(item?.casts[0]?.daypower) }}</div> | |
102 | 84 | </div> |
103 | 85 | </n-card> |
104 | 86 | </template> |
105 | - <div :style="`width:${300}px;height:${300}px;`"> | |
87 | + <div class="popup-content"> | |
106 | 88 | <WeatherContent :data="weatherInfoValues.weatherInfo" @submit="onHandleSelectValues" /> |
107 | 89 | </div> |
108 | 90 | </n-popover> |
... | ... | @@ -110,22 +92,45 @@ const loadWeatherImg = (text: string) => { |
110 | 92 | </template> |
111 | 93 | |
112 | 94 | <style lang="scss" scoped> |
95 | +.popup-content { | |
96 | + width: 300px; | |
97 | + height: 300px; | |
98 | +} | |
113 | 99 | .card { |
114 | 100 | width: v-bind('w+"px"'); |
115 | 101 | height: v-bind('h+"px"'); |
102 | + background-color: v-bind('backgroundColor'); | |
103 | + border-radius: v-bind('`${borderRadius}px`'); | |
116 | 104 | .card-content { |
117 | - width: 100%; | |
118 | 105 | display: flex; |
119 | 106 | justify-content: space-between; |
120 | - img { | |
121 | - width: 24px; | |
122 | - height: 24px; | |
107 | + .weather-temp { | |
108 | + font-size: v-bind('`${temperatureTextSize}px`'); | |
109 | + color: v-bind('temperatureTextColor'); | |
123 | 110 | } |
124 | - .card-content-city-text { | |
111 | + .weather-city { | |
125 | 112 | text-overflow: ellipsis; |
126 | 113 | overflow: hidden; |
127 | 114 | word-break: break-all; |
128 | 115 | white-space: nowrap; |
116 | + font-size: v-bind('`${cityTextSize}px`'); | |
117 | + color: v-bind('cityTextColor'); | |
118 | + } | |
119 | + .weather-img { | |
120 | + width: v-bind('`${weatherIconSizeWidth}px`'); | |
121 | + height: v-bind('`${weatherIconSizeHeight}px`'); | |
122 | + } | |
123 | + .weather-speed { | |
124 | + font-size: v-bind('`${airSpeedTextSize}px`'); | |
125 | + color: v-bind('airSpeedTextColor'); | |
126 | + } | |
127 | + .weather-speed-level { | |
128 | + font-size: v-bind('`${airSpeedLevelTextSize}px`'); | |
129 | + color: v-bind('airSpeedLevelTextColor'); | |
130 | + } | |
131 | + img { | |
132 | + width: 24px; | |
133 | + height: 24px; | |
129 | 134 | } |
130 | 135 | } |
131 | 136 | } | ... | ... |
1 | -import cloneDeep from 'lodash/cloneDeep' | |
2 | -import { PublicConfigClass } from '@/packages/public' | |
3 | -import { CreateComponentType } from '@/packages/index.d' | |
4 | -import { chartInitConfig } from '@/settings/designSetting' | |
5 | -import { COMPONENT_INTERACT_EVENT_KET } from '@/enums/eventEnum' | |
6 | -import { interactActions, ComponentInteractEventEnum } from './interact' | |
7 | -import { OverrideInputsTabConfig } from './index' | |
8 | - | |
9 | -export const option = { | |
10 | - // 时间组件展示类型,必须和 interactActions 中定义的数据一致 | |
11 | - [COMPONENT_INTERACT_EVENT_KET]: ComponentInteractEventEnum.DATA, | |
12 | - // 默认值 | |
13 | - tabLabel: '选项1', | |
14 | - // 样式 | |
15 | - tabType: 'segment', | |
16 | - // 暴露配置内容给用户 | |
17 | - dataset: [ | |
18 | - { | |
19 | - label: '选项1', | |
20 | - value: '1' | |
21 | - }, | |
22 | - { | |
23 | - label: '选项2', | |
24 | - value: '2' | |
25 | - }, | |
26 | - { | |
27 | - label: '选项3', | |
28 | - value: '3' | |
29 | - } | |
30 | - ], | |
31 | - customTabCss: { | |
32 | - labelTextSize: '16', | |
33 | - labelDefaultColor: 'black', | |
34 | - labelActiveColor: 'green', | |
35 | - tabBottomBarColor: 'green', | |
36 | - segmentationBgColor: 'white', | |
37 | - segmentationActiveBgColor: '#C0C0C0' | |
38 | - } | |
39 | -} | |
40 | - | |
41 | -export default class Config extends PublicConfigClass implements CreateComponentType { | |
42 | - public key = OverrideInputsTabConfig.key | |
43 | - public attr = { ...chartInitConfig, w: 460, h: 32, zIndex: -1 } | |
44 | - public chartConfig = cloneDeep(OverrideInputsTabConfig) | |
45 | - public interactActions = interactActions | |
46 | - public option = cloneDeep(option) | |
47 | -} |
1 | -<template> | |
2 | - <collapse-item name="标签页配置" :expanded="true"> | |
3 | - <setting-item-box name="默认值" :alone="true"> | |
4 | - <n-select size="small" v-model:value="optionData.tabType" :options="tabTypeOptions" @change="onHandleSelect" /> | |
5 | - </setting-item-box> | |
6 | - <setting-item-box name="默认文字" :alone="true"> | |
7 | - <SettingItem name="大小"> | |
8 | - <n-input v-model:value="optionData.customTabCss.labelTextSize" /> | |
9 | - </SettingItem> | |
10 | - <SettingItem name="颜色"> | |
11 | - <n-color-picker | |
12 | - size="small" | |
13 | - :modes="['hex']" | |
14 | - v-model:value="optionData.customTabCss.labelDefaultColor" | |
15 | - ></n-color-picker> | |
16 | - </SettingItem> | |
17 | - <SettingItem> | |
18 | - <n-button size="small" @click="optionData.customTabCss.labelDefaultColor = 'black'"> 恢复默认 </n-button> | |
19 | - </SettingItem> | |
20 | - </setting-item-box> | |
21 | - <setting-item-box name="激活文字" :alone="true"> | |
22 | - <SettingItem name="颜色"> | |
23 | - <n-color-picker | |
24 | - size="small" | |
25 | - :modes="['hex']" | |
26 | - v-model:value="optionData.customTabCss.labelActiveColor" | |
27 | - ></n-color-picker> | |
28 | - </SettingItem> | |
29 | - <SettingItem> | |
30 | - <n-button size="small" @click="optionData.customTabCss.labelActiveColor = 'green'"> 恢复默认 </n-button> | |
31 | - </SettingItem> | |
32 | - </setting-item-box> | |
33 | - <setting-item-box name="底部条颜色" :alone="true"> | |
34 | - <SettingItem name="颜色"> | |
35 | - <n-color-picker | |
36 | - size="small" | |
37 | - :modes="['hex']" | |
38 | - v-model:value="optionData.customTabCss.tabBottomBarColor" | |
39 | - ></n-color-picker> | |
40 | - </SettingItem> | |
41 | - <SettingItem> | |
42 | - <n-button size="small" @click="optionData.customTabCss.tabBottomBarColor = 'green'"> 恢复默认 </n-button> | |
43 | - </SettingItem> | |
44 | - </setting-item-box> | |
45 | - <setting-item-box v-if="optionData.tabType === 'segment'" name="分段背景色" :alone="true"> | |
46 | - <SettingItem name="颜色"> | |
47 | - <n-color-picker | |
48 | - size="small" | |
49 | - :modes="['hex']" | |
50 | - v-model:value="optionData.customTabCss.segmentationBgColor" | |
51 | - ></n-color-picker> | |
52 | - </SettingItem> | |
53 | - <SettingItem> | |
54 | - <n-button size="small" @click="optionData.customTabCss.segmentationBgColor = 'white'"> 恢复默认 </n-button> | |
55 | - </SettingItem> | |
56 | - </setting-item-box> | |
57 | - <setting-item-box v-if="optionData.tabType === 'segment'" name="分段激活色" :alone="true"> | |
58 | - <SettingItem name="颜色"> | |
59 | - <n-color-picker | |
60 | - size="small" | |
61 | - :modes="['hex']" | |
62 | - v-model:value="optionData.customTabCss.segmentationActiveBgColor" | |
63 | - ></n-color-picker> | |
64 | - </SettingItem> | |
65 | - <SettingItem> | |
66 | - <n-button size="small" @click="optionData.customTabCss.segmentationActiveBgColor = '#C0C0C0'"> | |
67 | - 恢复默认 | |
68 | - </n-button> | |
69 | - </SettingItem> | |
70 | - </setting-item-box> | |
71 | - </collapse-item> | |
72 | -</template> | |
73 | - | |
74 | -<script lang="ts" setup> | |
75 | -import { PropType } from 'vue' | |
76 | -import { CollapseItem, SettingItemBox, SettingItem } from '@/components/Pages/ChartItemSetting' | |
77 | -import { option } from './config' | |
78 | - | |
79 | -const props = defineProps({ | |
80 | - optionData: { | |
81 | - type: Object as PropType<typeof option>, | |
82 | - required: true | |
83 | - } | |
84 | -}) | |
85 | - | |
86 | -const tabTypeOptions = [ | |
87 | - { | |
88 | - label: '线条', | |
89 | - value: 'bar' | |
90 | - }, | |
91 | - { | |
92 | - label: '分段', | |
93 | - value: 'segment' | |
94 | - } | |
95 | -] | |
96 | -const onHandleSelect = (value: string) => { | |
97 | - if (value === 'bar') { | |
98 | - props.optionData.customTabCss.segmentationBgColor = '' | |
99 | - props.optionData.customTabCss.segmentationActiveBgColor = '' | |
100 | - | |
101 | - } | |
102 | -} | |
103 | -</script> |
1 | - | |
2 | - | |
3 | -import { ConfigType, PackagesCategoryEnum, ChartFrameEnum } from '@/packages/index.d' | |
4 | -import { ChatCategoryEnum, ChatCategoryEnumName } from '@/packages/components/Informations/index.d' | |
5 | -import { useWidgetKey } from '@/packages/external/useWidgetKey' | |
6 | - | |
7 | -const { key, conKey, chartKey } = useWidgetKey('OverrideInputsTab', true) | |
8 | - | |
9 | -export const OverrideInputsTabConfig: ConfigType = { | |
10 | - key, | |
11 | - chartKey, | |
12 | - conKey, | |
13 | - title: '自定义标签选择器', | |
14 | - category: ChatCategoryEnum.MORE, | |
15 | - categoryName: ChatCategoryEnumName.MORE, | |
16 | - package: PackagesCategoryEnum.INFORMATIONS, | |
17 | - chartFrame: ChartFrameEnum.COMMON, | |
18 | - image: 'inputs_tab.png' | |
19 | -} |
1 | -<template> | |
2 | - <n-tabs class="override-n-tabs" :type="option.value.tabType" @update:value="onChange"> | |
3 | - <n-tab v-for="(item, index) in option.value.dataset" :name="item.label" :key="index"> {{ item.label }} </n-tab> | |
4 | - </n-tabs> | |
5 | -</template> | |
6 | - | |
7 | -<script setup lang="ts"> | |
8 | -import { PropType, toRefs, shallowReactive, watch } from 'vue' | |
9 | -import cloneDeep from 'lodash/cloneDeep' | |
10 | -import { CreateComponentType } from '@/packages/index.d' | |
11 | -import { useChartEditStore } from '@/store/modules/chartEditStore/chartEditStore' | |
12 | -import { useChartInteract } from '@/hooks' | |
13 | -import { InteractEventOn } from '@/enums/eventEnum' | |
14 | -import { ComponentInteractParamsEnum } from './interact' | |
15 | - | |
16 | -const props = defineProps({ | |
17 | - chartConfig: { | |
18 | - type: Object as PropType<CreateComponentType>, | |
19 | - required: true | |
20 | - } | |
21 | -}) | |
22 | - | |
23 | -const { w, h } = toRefs(props.chartConfig.attr) | |
24 | - | |
25 | -const { | |
26 | - labelTextSize, | |
27 | - labelDefaultColor, | |
28 | - labelActiveColor, | |
29 | - tabBottomBarColor, | |
30 | - segmentationBgColor, | |
31 | - segmentationActiveBgColor | |
32 | -} = toRefs(props.chartConfig.option.customTabCss) | |
33 | - | |
34 | -const option = shallowReactive({ | |
35 | - value: cloneDeep(props.chartConfig.option) | |
36 | -}) | |
37 | - | |
38 | -// 监听事件改变 | |
39 | -const onChange = (v: string) => { | |
40 | - if (v === undefined) return | |
41 | - const selectItem = option.value.dataset.find((item: { label: string; value: any }) => item.label === v) | |
42 | - // 存储到联动数据 | |
43 | - useChartInteract( | |
44 | - props.chartConfig, | |
45 | - useChartEditStore, | |
46 | - { [ComponentInteractParamsEnum.DATA]: selectItem.value }, | |
47 | - InteractEventOn.CHANGE | |
48 | - ) | |
49 | -} | |
50 | - | |
51 | -// 手动更新 | |
52 | -watch( | |
53 | - () => props.chartConfig.option, | |
54 | - (newData: any) => { | |
55 | - option.value = newData | |
56 | - onChange(newData.tabValue) | |
57 | - }, | |
58 | - { | |
59 | - immediate: true, | |
60 | - deep: true | |
61 | - } | |
62 | -) | |
63 | -</script> | |
64 | - | |
65 | -<style lang="scss" scoped> | |
66 | -@include deep() { | |
67 | - .n-tabs-tab { | |
68 | - font-size: v-bind('labelTextSize+"px"') !important; | |
69 | - color: v-bind('labelDefaultColor') !important; | |
70 | - } | |
71 | - .n-tabs-tab--active { | |
72 | - color: v-bind('labelActiveColor') !important; | |
73 | - background-color: v-bind('segmentationActiveBgColor') !important; | |
74 | - } | |
75 | - .n-tabs-bar { | |
76 | - background-color: v-bind('tabBottomBarColor') !important; | |
77 | - } | |
78 | - .n-tabs-rail { | |
79 | - background-color: v-bind('segmentationBgColor') !important; | |
80 | - } | |
81 | -} | |
82 | -</style> |
src/packages/components/external/Informations/Mores/OverrideInputsTab/interact.ts
deleted
100644 → 0
1 | -import { InteractEventOn, InteractActionsType } from '@/enums/eventEnum' | |
2 | - | |
3 | -// 时间组件类型 | |
4 | -export enum ComponentInteractEventEnum { | |
5 | - DATA = 'data' | |
6 | -} | |
7 | - | |
8 | -// 联动参数 | |
9 | -export enum ComponentInteractParamsEnum { | |
10 | - DATA = 'data' | |
11 | -} | |
12 | - | |
13 | -// 定义组件触发回调事件 | |
14 | -export const interactActions: InteractActionsType[] = [ | |
15 | - { | |
16 | - interactType: InteractEventOn.CHANGE, | |
17 | - interactName: '选择完成', | |
18 | - componentEmitEvents: { | |
19 | - [ComponentInteractEventEnum.DATA]: [ | |
20 | - { | |
21 | - value: ComponentInteractParamsEnum.DATA, | |
22 | - label: '选择项' | |
23 | - } | |
24 | - ] | |
25 | - } | |
26 | - } | |
27 | -] |
... | ... | @@ -86,7 +86,7 @@ |
86 | 86 | |
87 | 87 | <script lang="ts" setup> |
88 | 88 | import { PropType } from 'vue' |
89 | -import { CollapseItem, SettingItemBox } from '@/components/Pages/ChartItemSetting' | |
89 | +import { CollapseItem, SettingItemBox, SettingItem } from '@/components/Pages/ChartItemSetting' | |
90 | 90 | import { option } from './config' |
91 | 91 | |
92 | 92 | defineProps({ | ... | ... |
... | ... | @@ -7,7 +7,6 @@ import { OverrideImageConfig } from '@/packages/components/external/Informations |
7 | 7 | import { OverrideCarouselConfig } from '@/packages/components/external/Informations/Mores/OverrideCarousel' |
8 | 8 | import { OverrideSelectConfig } from '@/packages/components/external/Informations/Mores/OverrideSelect' |
9 | 9 | import { OverrideInputsDateConfig } from '@/packages/components/external/Informations/Mores/OverrideInputsDate' |
10 | -import { OverrideInputsTabConfig } from '@/packages/components/external/Informations/Mores/OverrideInputsTab' | |
11 | 10 | |
12 | 11 | export function useInjectLib(packagesList: EPackagesType) { |
13 | 12 | |
... | ... | @@ -19,7 +18,6 @@ export function useInjectLib(packagesList: EPackagesType) { |
19 | 18 | addWidgetToCategoryByCategoryName(packagesList, PackagesCategoryEnum.INFORMATIONS, OverrideCarouselConfig) |
20 | 19 | addWidgetToCategoryByCategoryName(packagesList, PackagesCategoryEnum.INFORMATIONS, OverrideSelectConfig) |
21 | 20 | addWidgetToCategoryByCategoryName(packagesList, PackagesCategoryEnum.INFORMATIONS, OverrideInputsDateConfig) |
22 | - addWidgetToCategoryByCategoryName(packagesList, PackagesCategoryEnum.INFORMATIONS, OverrideInputsTabConfig) | |
23 | 21 | } |
24 | 22 | |
25 | 23 | /** | ... | ... |