Commit 30d58ef16e09755b1f5b6d0a0b20ada7a481e06d
1 parent
298b67ed
feat: add sliding switch component && switch with icon component
Showing
7 changed files
with
123 additions
and
28 deletions
src/views/visual/board/components/ControlComponent/SlidingSwitch.vue
renamed from
src/views/visual/board/components/Other/SlidingSwitch.vue
@@ -40,12 +40,9 @@ | @@ -40,12 +40,9 @@ | ||
40 | .slider { | 40 | .slider { |
41 | width: 80px; | 41 | width: 80px; |
42 | height: 40px; | 42 | height: 40px; |
43 | + display: flex; | ||
44 | + align-items: center; | ||
43 | box-sizing: border-box; | 45 | box-sizing: border-box; |
44 | - position: absolute; | ||
45 | - top: 0; | ||
46 | - left: 0; | ||
47 | - right: 0; | ||
48 | - bottom: 0; | ||
49 | border: 2px solid #ecf0f3; | 46 | border: 2px solid #ecf0f3; |
50 | border-radius: 20px; | 47 | border-radius: 20px; |
51 | box-shadow: -2px -2px 8px #fff, -2px -2px 12px hsl(0deg 0% 100% / 50%), | 48 | box-shadow: -2px -2px 8px #fff, -2px -2px 12px hsl(0deg 0% 100% / 50%), |
@@ -57,15 +54,14 @@ | @@ -57,15 +54,14 @@ | ||
57 | } | 54 | } |
58 | 55 | ||
59 | .slider::after { | 56 | .slider::after { |
60 | - position: absolute; | ||
61 | cursor: pointer; | 57 | cursor: pointer; |
62 | display: block; | 58 | display: block; |
63 | content: ''; | 59 | content: ''; |
64 | width: 24px; | 60 | width: 24px; |
65 | height: 24px; | 61 | height: 24px; |
66 | border-radius: 50%; | 62 | border-radius: 50%; |
67 | - top: 6px; | ||
68 | - left: 6px; | 63 | + margin-left: 6px; |
64 | + margin-right: 6px; | ||
69 | background-color: #ecf0f3; | 65 | background-color: #ecf0f3; |
70 | box-shadow: -2px -2px 8px #fff, -2px -2px 12px hsl(0deg 0% 100% / 50%), | 66 | box-shadow: -2px -2px 8px #fff, -2px -2px 12px hsl(0deg 0% 100% / 50%), |
71 | inset 2px 2px 4px hsl(0deg 0% 100% / 10%), 2px 2px 8px rgb(0 0 0 / 30%); | 67 | inset 2px 2px 4px hsl(0deg 0% 100% / 10%), 2px 2px 8px rgb(0 0 0 / 30%); |
@@ -80,13 +76,16 @@ | @@ -80,13 +76,16 @@ | ||
80 | input:checked ~ .slider::after { | 76 | input:checked ~ .slider::after { |
81 | transform: translateX(35px); | 77 | transform: translateX(35px); |
82 | } | 78 | } |
79 | + | ||
83 | input:not(:checked) ~ .on { | 80 | input:not(:checked) ~ .on { |
84 | opacity: 0; | 81 | opacity: 0; |
85 | - transform: translateX(0px); | 82 | + transform: translateX(0); |
86 | } | 83 | } |
87 | 84 | ||
88 | .on, | 85 | .on, |
89 | .off { | 86 | .off { |
87 | + position: absolute; | ||
88 | + top: 0; | ||
90 | display: inline-block; | 89 | display: inline-block; |
91 | margin-left: 3px; | 90 | margin-left: 3px; |
92 | width: 34px; | 91 | width: 34px; |
@@ -97,7 +96,9 @@ | @@ -97,7 +96,9 @@ | ||
97 | .on { | 96 | .on { |
98 | color: #039be5; | 97 | color: #039be5; |
99 | } | 98 | } |
99 | + | ||
100 | .off { | 100 | .off { |
101 | + right: 6px; | ||
101 | color: #999; | 102 | color: #999; |
102 | } | 103 | } |
103 | } | 104 | } |
1 | +<script lang="ts" setup> | ||
2 | + import { Switch } from 'ant-design-vue'; | ||
3 | + import { computed } from 'vue'; | ||
4 | + import { DEFAULT_RADIO_RECORD, fontSize, RadioRecord } from '../../detail/config/util'; | ||
5 | + import SvgIcon from '/@/components/Icon/src/SvgIcon.vue'; | ||
6 | + import { | ||
7 | + ControlComponentDefaultConfig, | ||
8 | + ControlComponentValue, | ||
9 | + ControlComponentLayout, | ||
10 | + } from './control.config'; | ||
11 | + const props = withDefaults( | ||
12 | + defineProps<{ | ||
13 | + layout?: ControlComponentLayout; | ||
14 | + value?: ControlComponentValue; | ||
15 | + radio?: RadioRecord; | ||
16 | + }>(), | ||
17 | + { | ||
18 | + value: () => ControlComponentDefaultConfig, | ||
19 | + } | ||
20 | + ); | ||
21 | + const getRadio = computed(() => { | ||
22 | + return props.radio || DEFAULT_RADIO_RECORD; | ||
23 | + }); | ||
24 | +</script> | ||
25 | + | ||
26 | +<template> | ||
27 | + <div class="flex items-center w-full h-full p-4"> | ||
28 | + <div class="flex-auto flex truncate"> | ||
29 | + <SvgIcon | ||
30 | + :name="props.value?.icon!" | ||
31 | + prefix="iconfont" | ||
32 | + :style="{ | ||
33 | + color: props.value?.iconColor, | ||
34 | + width: fontSize({ radioRecord: getRadio, basic: 30, min: 16 }), | ||
35 | + height: fontSize({ radioRecord: getRadio, basic: 30, min: 16 }), | ||
36 | + }" | ||
37 | + /> | ||
38 | + <span class="flex-auto mx-4 flex items-center truncate inline-block">属性名</span> | ||
39 | + </div> | ||
40 | + <Switch /> | ||
41 | + </div> | ||
42 | +</template> |
src/views/visual/board/components/ControlComponent/control.config.ts
renamed from
src/views/visual/board/components/ControlComponent/toggleSwitch.config.ts
1 | import { DataComponentRecord, DataSource } from '/@/api/dataBoard/model'; | 1 | import { DataComponentRecord, DataSource } from '/@/api/dataBoard/model'; |
2 | 2 | ||
3 | -export interface ToggleSwitchValue { | 3 | +export interface ControlComponentLayout { |
4 | + [key: string]: any; | ||
5 | +} | ||
6 | + | ||
7 | +export interface ControlComponentValue { | ||
4 | value?: boolean; | 8 | value?: boolean; |
9 | + name?: string; | ||
10 | + icon?: string; | ||
11 | + iconColor?: string; | ||
5 | } | 12 | } |
6 | 13 | ||
14 | +export const ControlComponentDefaultConfig: ControlComponentValue = { | ||
15 | + icon: 'shuiwen', | ||
16 | + iconColor: '#367BFF', | ||
17 | +}; | ||
18 | + | ||
7 | export const transformControlConfig = ( | 19 | export const transformControlConfig = ( |
8 | _ComponentConfig: Recordable, | 20 | _ComponentConfig: Recordable, |
9 | _record: DataComponentRecord, | 21 | _record: DataComponentRecord, |
10 | dataSourceRecord: DataSource | 22 | dataSourceRecord: DataSource |
11 | ) => { | 23 | ) => { |
12 | return { | 24 | return { |
13 | - value: dataSourceRecord.componentInfo.value, | 25 | + value: { |
26 | + value: dataSourceRecord.componentInfo.value, | ||
27 | + icon: dataSourceRecord.componentInfo.icon, | ||
28 | + } as ControlComponentValue, | ||
14 | }; | 29 | }; |
15 | }; | 30 | }; |
1 | import { Component } from 'vue'; | 1 | import { Component } from 'vue'; |
2 | -import TextComponent from './TextComponent/TextComponent.vue'; | ||
3 | import { | 2 | import { |
4 | TextComponent1Config, | 3 | TextComponent1Config, |
5 | TextComponent3Config, | 4 | TextComponent3Config, |
@@ -9,8 +8,6 @@ import { | @@ -9,8 +8,6 @@ import { | ||
9 | transformTextComponentConfig, | 8 | transformTextComponentConfig, |
10 | } from './TextComponent/config'; | 9 | } from './TextComponent/config'; |
11 | import { ComponentInfo, DataComponentRecord, DataSource } from '/@/api/dataBoard/model'; | 10 | import { ComponentInfo, DataComponentRecord, DataSource } from '/@/api/dataBoard/model'; |
12 | -import DashBoardComponent from './InstrumentComponent/DashBoardComponent.vue'; | ||
13 | -import PictureComponent from './PictureComponent/PictureComponent.vue'; | ||
14 | import { transformPictureConfig } from './PictureComponent/pictureComponent.config'; | 11 | import { transformPictureConfig } from './PictureComponent/pictureComponent.config'; |
15 | import { | 12 | import { |
16 | DashboardComponentLayout, | 13 | DashboardComponentLayout, |
@@ -20,10 +17,16 @@ import { | @@ -20,10 +17,16 @@ import { | ||
20 | instrumentComponent2, | 17 | instrumentComponent2, |
21 | transformDashboardComponentConfig, | 18 | transformDashboardComponentConfig, |
22 | } from './InstrumentComponent/dashBoardComponent.config'; | 19 | } from './InstrumentComponent/dashBoardComponent.config'; |
23 | -import DigitalDashBoard from './InstrumentComponent/DigitalDashBoard.vue'; | ||
24 | import { DigitalComponentDefaultConfig } from './InstrumentComponent/digitalDashBoard.config'; | 20 | import { DigitalComponentDefaultConfig } from './InstrumentComponent/digitalDashBoard.config'; |
21 | +import { transformControlConfig } from './ControlComponent/control.config'; | ||
22 | + | ||
23 | +import TextComponent from './TextComponent/TextComponent.vue'; | ||
24 | +import DashBoardComponent from './InstrumentComponent/DashBoardComponent.vue'; | ||
25 | +import PictureComponent from './PictureComponent/PictureComponent.vue'; | ||
26 | +import DigitalDashBoard from './InstrumentComponent/DigitalDashBoard.vue'; | ||
25 | import ToggleSwitch from './ControlComponent/ToggleSwitch.vue'; | 27 | import ToggleSwitch from './ControlComponent/ToggleSwitch.vue'; |
26 | -import { transformControlConfig } from './ControlComponent/toggleSwitch.config'; | 28 | +import SlidingSwitch from './ControlComponent/SlidingSwitch.vue'; |
29 | +import SwitchWithIcon from './ControlComponent/SwitchWithIcon.vue'; | ||
27 | 30 | ||
28 | export enum FrontComponentCategory { | 31 | export enum FrontComponentCategory { |
29 | TEXT = 'text', | 32 | TEXT = 'text', |
@@ -52,6 +55,8 @@ export enum FrontComponent { | @@ -52,6 +55,8 @@ export enum FrontComponent { | ||
52 | DIGITAL_DASHBOARD_COMPONENT = 'digital-dashboard-component', | 55 | DIGITAL_DASHBOARD_COMPONENT = 'digital-dashboard-component', |
53 | PICTURE_COMPONENT_1 = 'picture-component-1', | 56 | PICTURE_COMPONENT_1 = 'picture-component-1', |
54 | CONTROL_COMPONENT_TOGGLE_SWITCH = 'control-component-toggle-switch', | 57 | CONTROL_COMPONENT_TOGGLE_SWITCH = 'control-component-toggle-switch', |
58 | + CONTROL_COMPONENT_SWITCH_WITH_ICON = 'control-component-switch-with-icon', | ||
59 | + CONTROL_COMPONENT_SLIDING_SWITCH = 'control-component-sliding-switch', | ||
55 | } | 60 | } |
56 | 61 | ||
57 | export interface ComponentConfig { | 62 | export interface ComponentConfig { |
@@ -138,6 +143,20 @@ frontComponentMap.set(FrontComponent.PICTURE_COMPONENT_1, { | @@ -138,6 +143,20 @@ frontComponentMap.set(FrontComponent.PICTURE_COMPONENT_1, { | ||
138 | transformConfig: transformPictureConfig, | 143 | transformConfig: transformPictureConfig, |
139 | }); | 144 | }); |
140 | 145 | ||
146 | +frontComponentMap.set(FrontComponent.CONTROL_COMPONENT_SWITCH_WITH_ICON, { | ||
147 | + Component: SwitchWithIcon, | ||
148 | + ComponentKey: FrontComponent.CONTROL_COMPONENT_SWITCH_WITH_ICON, | ||
149 | + ComponentCategory: FrontComponentCategory.CONTROL, | ||
150 | + transformConfig: transformControlConfig, | ||
151 | +}); | ||
152 | + | ||
153 | +frontComponentMap.set(FrontComponent.CONTROL_COMPONENT_SLIDING_SWITCH, { | ||
154 | + Component: SlidingSwitch, | ||
155 | + ComponentKey: FrontComponent.CONTROL_COMPONENT_SLIDING_SWITCH, | ||
156 | + ComponentCategory: FrontComponentCategory.CONTROL, | ||
157 | + transformConfig: transformControlConfig, | ||
158 | +}); | ||
159 | + | ||
141 | frontComponentMap.set(FrontComponent.CONTROL_COMPONENT_TOGGLE_SWITCH, { | 160 | frontComponentMap.set(FrontComponent.CONTROL_COMPONENT_TOGGLE_SWITCH, { |
142 | Component: ToggleSwitch, | 161 | Component: ToggleSwitch, |
143 | ComponentKey: FrontComponent.CONTROL_COMPONENT_TOGGLE_SWITCH, | 162 | ComponentKey: FrontComponent.CONTROL_COMPONENT_TOGGLE_SWITCH, |
@@ -2,7 +2,7 @@ | @@ -2,7 +2,7 @@ | ||
2 | import { CopyOutlined, DeleteOutlined, SettingOutlined } from '@ant-design/icons-vue'; | 2 | import { CopyOutlined, DeleteOutlined, SettingOutlined } from '@ant-design/icons-vue'; |
3 | import { Tooltip, Button } from 'ant-design-vue'; | 3 | import { Tooltip, Button } from 'ant-design-vue'; |
4 | import { FormActionType, useForm } from '/@/components/Form'; | 4 | import { FormActionType, useForm } from '/@/components/Form'; |
5 | - import { basicSchema, dataSourceSchema } from '../config/basicConfiguration'; | 5 | + import { basicSchema } from '../config/basicConfiguration'; |
6 | import BasicForm from '/@/components/Form/src/BasicForm.vue'; | 6 | import BasicForm from '/@/components/Form/src/BasicForm.vue'; |
7 | import { ref, shallowReactive, unref, nextTick, watch } from 'vue'; | 7 | import { ref, shallowReactive, unref, nextTick, watch } from 'vue'; |
8 | import VisualOptionsModal from './VisualOptionsModal.vue'; | 8 | import VisualOptionsModal from './VisualOptionsModal.vue'; |
@@ -13,6 +13,7 @@ | @@ -13,6 +13,7 @@ | ||
13 | import { DataBoardLayoutInfo } from '../../types/type'; | 13 | import { DataBoardLayoutInfo } from '../../types/type'; |
14 | import { FrontComponent } from '../../components/help'; | 14 | import { FrontComponent } from '../../components/help'; |
15 | import { computed } from '@vue/reactivity'; | 15 | import { computed } from '@vue/reactivity'; |
16 | + import BasicDataSourceForm from './DataSourceForm/BasicDataSourceForm.vue'; | ||
16 | 17 | ||
17 | type DataSourceFormEL = { [key: string]: Nullable<FormActionType> }; | 18 | type DataSourceFormEL = { [key: string]: Nullable<FormActionType> }; |
18 | 19 | ||
@@ -196,17 +197,7 @@ | @@ -196,17 +197,7 @@ | ||
196 | 选择设备 | 197 | 选择设备 |
197 | </div> | 198 | </div> |
198 | <div class="pl-2 flex-auto"> | 199 | <div class="pl-2 flex-auto"> |
199 | - <BasicForm | ||
200 | - :ref="(el) => setFormEl(el, item.id)" | ||
201 | - :schemas="dataSourceSchema" | ||
202 | - class="w-full flex-1 data-source-form" | ||
203 | - :show-action-button-group="false" | ||
204 | - :row-props="{ | ||
205 | - gutter: 10, | ||
206 | - }" | ||
207 | - layout="inline" | ||
208 | - :label-col="{ span: 0 }" | ||
209 | - /> | 200 | + <BasicDataSourceForm :ref="(el) => setFormEl(el, item.id)" /> |
210 | </div> | 201 | </div> |
211 | <div class="flex justify-center gap-3 w-24"> | 202 | <div class="flex justify-center gap-3 w-24"> |
212 | <Tooltip title="复制"> | 203 | <Tooltip title="复制"> |
1 | +<script lang="ts" setup> | ||
2 | + import { ref } from 'vue'; | ||
3 | + import { dataSourceSchema } from '../../config/basicConfiguration'; | ||
4 | + import { FormActionType } from '/@/components/Form'; | ||
5 | + import BasicForm from '/@/components/Form/src/BasicForm.vue'; | ||
6 | + const formEl = ref<Nullable<FormActionType>>(null); | ||
7 | + | ||
8 | + defineExpose({ formActionType: formEl }); | ||
9 | +</script> | ||
10 | + | ||
11 | +<template> | ||
12 | + <BasicForm | ||
13 | + ref="formEl" | ||
14 | + :schemas="dataSourceSchema" | ||
15 | + class="w-full flex-1 data-source-form" | ||
16 | + :show-action-button-group="false" | ||
17 | + :row-props="{ | ||
18 | + gutter: 10, | ||
19 | + }" | ||
20 | + layout="inline" | ||
21 | + :label-col="{ span: 0 }" | ||
22 | + /> | ||
23 | +</template> |
@@ -185,6 +185,10 @@ | @@ -185,6 +185,10 @@ | ||
185 | openModal(true, { isEdit: false }); | 185 | openModal(true, { isEdit: false }); |
186 | }; | 186 | }; |
187 | 187 | ||
188 | + onMounted(() => { | ||
189 | + handleOpenCreatePanel(); | ||
190 | + }); | ||
191 | + | ||
188 | const getLayoutInfo = () => { | 192 | const getLayoutInfo = () => { |
189 | return unref(dataBoardList).map((item) => { | 193 | return unref(dataBoardList).map((item) => { |
190 | return { | 194 | return { |