Commit 376b1b075384b15acc9b166338f0b64193473c2e

Authored by ww
1 parent 8ee7a7c4

fix: visual board dynamic data source can not get fields value

1 <script lang="ts" setup> 1 <script lang="ts" setup>
  2 + import { ControlComponentValue } from './control.config';
  3 +
2 const props = defineProps<{ 4 const props = defineProps<{
3 - value?: boolean; 5 + value?: ControlComponentValue;
4 }>(); 6 }>();
5 7
6 const emit = defineEmits(['update:value', 'change']); 8 const emit = defineEmits(['update:value', 'change']);
@@ -14,7 +16,12 @@ @@ -14,7 +16,12 @@
14 16
15 <template> 17 <template>
16 <label class="sliding-switch"> 18 <label class="sliding-switch">
17 - <input :value="props.value" type="checkbox" :checked="props.value" @change="handleChange" /> 19 + <input
  20 + :value="props.value?.value"
  21 + type="checkbox"
  22 + :checked="props.value?.value"
  23 + @change="handleChange"
  24 + />
18 <span class="slider"></span> 25 <span class="slider"></span>
19 <span class="on">ON</span> 26 <span class="on">ON</span>
20 <span class="off">OFF</span> 27 <span class="off">OFF</span>
@@ -27,10 +27,10 @@ @@ -27,10 +27,10 @@
27 <div class="flex items-center w-full h-full p-4"> 27 <div class="flex items-center w-full h-full p-4">
28 <div class="flex-auto flex truncate"> 28 <div class="flex-auto flex truncate">
29 <SvgIcon 29 <SvgIcon
30 - :name="props.value?.icon!" 30 + :name="props.value?.icon! || ControlComponentDefaultConfig.icon!"
31 prefix="iconfont" 31 prefix="iconfont"
32 :style="{ 32 :style="{
33 - color: props.value?.iconColor, 33 + color: props.value?.iconColor || ControlComponentDefaultConfig.iconColor,
34 width: fontSize({ radioRecord: getRadio, basic: 30, min: 16 }), 34 width: fontSize({ radioRecord: getRadio, basic: 30, min: 16 }),
35 height: fontSize({ radioRecord: getRadio, basic: 30, min: 16 }), 35 height: fontSize({ radioRecord: getRadio, basic: 30, min: 16 }),
36 }" 36 }"
1 <script lang="ts" setup> 1 <script lang="ts" setup>
2 import { computed } from '@vue/reactivity'; 2 import { computed } from '@vue/reactivity';
3 import { DEFAULT_RADIO_RECORD, fontSize, RadioRecord } from '../../detail/config/util'; 3 import { DEFAULT_RADIO_RECORD, fontSize, RadioRecord } from '../../detail/config/util';
  4 + import { ControlComponentValue } from './control.config';
4 5
5 const props = defineProps<{ 6 const props = defineProps<{
6 - value?: boolean; 7 + value?: ControlComponentValue;
7 layout?: Recordable; 8 layout?: Recordable;
8 radio?: RadioRecord; 9 radio?: RadioRecord;
9 }>(); 10 }>();
@@ -30,7 +31,12 @@ @@ -30,7 +31,12 @@
30 }" 31 }"
31 > 32 >
32 <label class="switch"> 33 <label class="switch">
33 - <input :value="props.value" type="checkbox" :checked="props.value" @change="handleChange" /> 34 + <input
  35 + :value="props.value?.value"
  36 + type="checkbox"
  37 + :checked="props.value?.value"
  38 + @change="handleChange"
  39 + />
34 <div class="button"> 40 <div class="button">
35 <div class="light"></div> 41 <div class="light"></div>
36 <div class="dots"></div> 42 <div class="dots"></div>
@@ -4,7 +4,7 @@ @@ -4,7 +4,7 @@
4 import { FormActionType, useForm } from '/@/components/Form'; 4 import { FormActionType, useForm } from '/@/components/Form';
5 import { basicSchema } 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, computed } from 'vue';
8 import VisualOptionsModal from './VisualOptionsModal.vue'; 8 import VisualOptionsModal from './VisualOptionsModal.vue';
9 import { useModal } from '/@/components/Modal'; 9 import { useModal } from '/@/components/Modal';
10 import { buildUUID } from '/@/utils/uuid'; 10 import { buildUUID } from '/@/utils/uuid';
@@ -12,8 +12,7 @@ @@ -12,8 +12,7 @@
12 import { useMessage } from '/@/hooks/web/useMessage'; 12 import { useMessage } from '/@/hooks/web/useMessage';
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';  
16 - import BasicDataSourceForm from './DataSourceForm/BasicDataSourceForm.vue'; 15 + import { getDataSourceComponent } from './DataSourceForm/help';
17 16
18 type DataSourceFormEL = { [key: string]: Nullable<FormActionType> }; 17 type DataSourceFormEL = { [key: string]: Nullable<FormActionType> };
19 18
@@ -21,7 +20,7 @@ @@ -21,7 +20,7 @@
21 20
22 const props = defineProps<{ 21 const props = defineProps<{
23 record: DataBoardLayoutInfo; 22 record: DataBoardLayoutInfo;
24 - frontId?: string; 23 + frontId?: FrontComponent;
25 defaultConfig?: Partial<ComponentInfo>; 24 defaultConfig?: Partial<ComponentInfo>;
26 }>(); 25 }>();
27 26
@@ -40,7 +39,7 @@ @@ -40,7 +39,7 @@
40 const dataSourceEl = shallowReactive<DataSourceFormEL>({} as unknown as DataSourceFormEL); 39 const dataSourceEl = shallowReactive<DataSourceFormEL>({} as unknown as DataSourceFormEL);
41 40
42 const setFormEl = (el: any, id: string) => { 41 const setFormEl = (el: any, id: string) => {
43 - if (!dataSourceEl[id] && el) { 42 + if (id && el) {
44 const { formActionType } = el as unknown as { formActionType: FormActionType }; 43 const { formActionType } = el as unknown as { formActionType: FormActionType };
45 dataSourceEl[id] = formActionType; 44 dataSourceEl[id] = formActionType;
46 } 45 }
@@ -176,6 +175,10 @@ @@ -176,6 +175,10 @@
176 ~index && (unref(dataSource)[index].componentInfo = value); 175 ~index && (unref(dataSource)[index].componentInfo = value);
177 }; 176 };
178 177
  178 + const dataSourceComponent = computed(() => {
  179 + return getDataSourceComponent(props.frontId as FrontComponent);
  180 + });
  181 +
179 defineExpose({ 182 defineExpose({
180 getAllDataSourceFieldValue, 183 getAllDataSourceFieldValue,
181 validate, 184 validate,
@@ -197,7 +200,8 @@ @@ -197,7 +200,8 @@
197 选择设备 200 选择设备
198 </div> 201 </div>
199 <div class="pl-2 flex-auto"> 202 <div class="pl-2 flex-auto">
200 - <BasicDataSourceForm :ref="(el) => setFormEl(el, item.id)" /> 203 + <!-- <BasicDataSourceForm /> -->
  204 + <component :is="dataSourceComponent" :ref="(el) => setFormEl(el, item.id)" />
201 </div> 205 </div>
202 <div class="flex justify-center gap-3 w-24"> 206 <div class="flex justify-center gap-3 w-24">
203 <Tooltip title="复制"> 207 <Tooltip title="复制">
@@ -71,6 +71,7 @@ @@ -71,6 +71,7 @@
71 resetForm(); 71 resetForm();
72 } catch (error: unknown) { 72 } catch (error: unknown) {
73 if (unref(activeKey) !== 'basicConfig') activeKey.value = 'basicConfig'; 73 if (unref(activeKey) !== 'basicConfig') activeKey.value = 'basicConfig';
  74 + throw error;
74 } 75 }
75 }; 76 };
76 77
  1 +<script lang="ts" setup>
  2 + import { ref, unref } from 'vue';
  3 + import { BasicForm, FormActionType } from '/@/components/Form';
  4 + import { controlFormSchema } from '../../config/basicConfiguration';
  5 +
  6 + const formEl = ref<Nullable<FormActionType>>();
  7 +
  8 + const setFormEl = (el: any) => {
  9 + formEl.value = el;
  10 + };
  11 +
  12 + const getFieldsValue = () => {
  13 + return unref(formEl)!.getFieldsValue();
  14 + };
  15 +
  16 + const validate = async () => {
  17 + await unref(formEl)!.validate();
  18 + };
  19 +
  20 + const setFieldsValue = async (record: Recordable) => {
  21 + await unref(formEl)!.setFieldsValue(record);
  22 + };
  23 +
  24 + const clearValidate = async (name?: string | string[]) => {
  25 + await unref(formEl)!.clearValidate(name);
  26 + };
  27 + defineExpose({
  28 + formActionType: { getFieldsValue, validate, setFieldsValue, clearValidate },
  29 + });
  30 +</script>
  31 +
  32 +<template>
  33 + <div class="w-full flex-1">
  34 + <BasicForm
  35 + :ref="(el) => setFormEl(el)"
  36 + :schemas="controlFormSchema"
  37 + class="w-full flex-1 data-source-form"
  38 + :show-action-button-group="false"
  39 + :row-props="{
  40 + gutter: 10,
  41 + }"
  42 + layout="inline"
  43 + :label-col="{ span: 0 }"
  44 + />
  45 + </div>
  46 +</template>
  1 +import { Component } from 'vue';
  2 +import { FrontComponent } from '../../../components/help';
  3 +import BasicDataSourceForm from './BasicDataSourceForm.vue';
  4 +import ControlDataSourceForm from './ControlDataSourceForm.vue';
  5 +
  6 +const dataSourceComponentMap = new Map<FrontComponent, Component>();
  7 +
  8 +dataSourceComponentMap.set(FrontComponent.CONTROL_COMPONENT_TOGGLE_SWITCH, ControlDataSourceForm);
  9 +
  10 +export const getDataSourceComponent = (frontId: FrontComponent) => {
  11 + if (dataSourceComponentMap.has(frontId)) return dataSourceComponentMap.get(frontId)!;
  12 + return BasicDataSourceForm;
  13 +};
@@ -217,3 +217,24 @@ export const dataSourceSchema: FormSchema[] = [ @@ -217,3 +217,24 @@ export const dataSourceSchema: FormSchema[] = [
217 }, 217 },
218 }, 218 },
219 ]; 219 ];
  220 +
  221 +export const controlFormSchema: FormSchema[] = [
  222 + {
  223 + field: DataSourceField.DEVICE_RENAME,
  224 + component: 'Input',
  225 + label: '设备',
  226 + colProps: { span: 8 },
  227 + componentProps: {
  228 + placeholder: '设备重命名',
  229 + },
  230 + },
  231 + {
  232 + field: DataSourceField.ATTRIBUTE_RENAME,
  233 + component: 'Input',
  234 + label: '属性',
  235 + colProps: { span: 8 },
  236 + componentProps: {
  237 + placeholder: '属性重命名',
  238 + },
  239 + },
  240 +];
@@ -185,10 +185,6 @@ @@ -185,10 +185,6 @@
185 openModal(true, { isEdit: false }); 185 openModal(true, { isEdit: false });
186 }; 186 };
187 187
188 - onMounted(() => {  
189 - handleOpenCreatePanel();  
190 - });  
191 -  
192 const getLayoutInfo = () => { 188 const getLayoutInfo = () => {
193 return unref(dataBoardList).map((item) => { 189 return unref(dataBoardList).map((item) => {
194 return { 190 return {