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 { |