Commit 27a900c7e4573a906e64f89835f1ccec87a64d39
1 parent
444958fc
perf: visual board out of const && types
Showing
11 changed files
with
84 additions
and
79 deletions
... | ... | @@ -4,11 +4,18 @@ |
4 | 4 | }; |
5 | 5 | </script> |
6 | 6 | <script lang="ts" setup> |
7 | - import { ControlComponentValue } from './control.config'; | |
7 | + import { RadioRecord } from '../../detail/config/util'; | |
8 | 8 | |
9 | - const props = defineProps<{ | |
10 | - value?: ControlComponentValue; | |
11 | - }>(); | |
9 | + interface VisualComponentProps<Layout = Recordable, Value = Recordable> { | |
10 | + value?: Value; | |
11 | + layout?: Layout; | |
12 | + radio?: RadioRecord; | |
13 | + random?: boolean; | |
14 | + add?: (key: string, method: Fn) => void; | |
15 | + update?: () => void; | |
16 | + remove?: (key: string) => void; | |
17 | + } | |
18 | + const props = defineProps<VisualComponentProps>(); | |
12 | 19 | |
13 | 20 | const emit = defineEmits(['update:value', 'change']); |
14 | 21 | ... | ... |
1 | 1 | import { EChartsOption } from 'echarts'; |
2 | -import { FrontComponent } from '../help'; | |
2 | +import { FrontComponent } from '../../const/const'; | |
3 | 3 | import { fontSize, RadioRecord } from '../../detail/config/util'; |
4 | 4 | import { Gradient, visualOptionField } from '../../detail/config/visualOptions'; |
5 | 5 | import { | ... | ... |
1 | 1 | <script lang="ts" setup> |
2 | - import { useSlots } from 'vue'; | |
3 | 2 | import { useUpdateCenter } from '../../hook/useUpdateCenter'; |
4 | 3 | import { FrontDataSourceRecord } from '../../types/type'; |
5 | 4 | |
... | ... | @@ -7,10 +6,8 @@ |
7 | 6 | dataSource: FrontDataSourceRecord[]; |
8 | 7 | }>(); |
9 | 8 | |
10 | - const slot = useSlots(); | |
11 | - | |
12 | 9 | const { update, add, remove } = useUpdateCenter(); |
13 | - console.log({ dataSource: props.dataSource }); | |
10 | + | |
14 | 11 | defineExpose({ update }); |
15 | 12 | </script> |
16 | 13 | |
... | ... | @@ -21,15 +18,12 @@ |
21 | 18 | <div class="widget-content"> |
22 | 19 | <div |
23 | 20 | v-for="item in props.dataSource" |
24 | - :key="item.uuid" | |
21 | + :key="item.id" | |
25 | 22 | :style="{ width: `${item.width || 100}%`, height: `${item.height || 100}%` }" |
26 | 23 | class="widget-item" |
27 | 24 | > |
28 | 25 | <div class="widget-box"> |
29 | - <div | |
30 | - class="widget-controls-container" | |
31 | - :style="{ height: slot.footer ? 'calc(100% - 20px)' : '100%' }" | |
32 | - > | |
26 | + <div class="widget-controls-container"> | |
33 | 27 | <slot |
34 | 28 | name="controls" |
35 | 29 | :record="item" |
... | ... | @@ -38,12 +32,6 @@ |
38 | 32 | :update="update" |
39 | 33 | ></slot> |
40 | 34 | </div> |
41 | - <div class="widget-value"> | |
42 | - <slot name="value" :record="item"></slot> | |
43 | - </div> | |
44 | - <div class="widget-label"> | |
45 | - <slot name="label" :record="item"></slot> | |
46 | - </div> | |
47 | 35 | </div> |
48 | 36 | </div> |
49 | 37 | </div> |
... | ... | @@ -92,7 +80,7 @@ |
92 | 80 | .widget-controls-container { |
93 | 81 | flex: 1 1 auto; |
94 | 82 | width: 100%; |
95 | - height: calc(100% - 20px); | |
83 | + height: 100%; | |
96 | 84 | display: flex; |
97 | 85 | align-items: center; |
98 | 86 | justify-content: center; | ... | ... |
1 | -import { Component } from 'vue'; | |
2 | 1 | import { |
3 | 2 | TextComponent1Config, |
4 | 3 | TextComponent3Config, |
... | ... | @@ -7,7 +6,7 @@ import { |
7 | 6 | TextComponentDefaultConfig, |
8 | 7 | transformTextComponentConfig, |
9 | 8 | } from './TextComponent/config'; |
10 | -import { ComponentInfo, DataComponentRecord, DataSource } from '/@/api/dataBoard/model'; | |
9 | +import { ComponentInfo } from '/@/api/dataBoard/model'; | |
11 | 10 | import { transformPictureConfig } from './PictureComponent/pictureComponent.config'; |
12 | 11 | import { |
13 | 12 | DashboardComponentLayout, |
... | ... | @@ -29,50 +28,8 @@ import SlidingSwitch from './ControlComponent/SlidingSwitch.vue'; |
29 | 28 | import SwitchWithIcon from './ControlComponent/SwitchWithIcon.vue'; |
30 | 29 | import MapComponent from './MapComponent/MapComponent.vue'; |
31 | 30 | import { transfromMapComponentConfig } from './MapComponent/map.config'; |
32 | - | |
33 | -export enum FrontComponentCategory { | |
34 | - TEXT = 'text', | |
35 | - PICTURE = 'picture', | |
36 | - INSTRUMENT = 'instrument', | |
37 | - CONTROL = 'control', | |
38 | - MAP = 'map', | |
39 | -} | |
40 | - | |
41 | -export const FrontComponentCategoryName = { | |
42 | - [FrontComponentCategory.TEXT]: '文本组件', | |
43 | - [FrontComponentCategory.INSTRUMENT]: '仪表组件', | |
44 | - [FrontComponentCategory.CONTROL]: '控制组件', | |
45 | - [FrontComponentCategory.PICTURE]: '图片组件', | |
46 | - [FrontComponentCategory.MAP]: '地图组件', | |
47 | -}; | |
48 | - | |
49 | -export enum FrontComponent { | |
50 | - TEXT_COMPONENT_1 = 'text-component-1', | |
51 | - TEXT_COMPONENT_2 = 'text-component-2', | |
52 | - TEXT_COMPONENT_3 = 'text-component-3', | |
53 | - TEXT_COMPONENT_4 = 'text-component-4', | |
54 | - TEXT_COMPONENT_5 = 'text-component-5', | |
55 | - INSTRUMENT_COMPONENT_1 = 'instrument-component-1', | |
56 | - INSTRUMENT_COMPONENT_2 = 'instrument-component-2', | |
57 | - DIGITAL_DASHBOARD_COMPONENT = 'digital-dashboard-component', | |
58 | - PICTURE_COMPONENT_1 = 'picture-component-1', | |
59 | - CONTROL_COMPONENT_TOGGLE_SWITCH = 'control-component-toggle-switch', | |
60 | - CONTROL_COMPONENT_SWITCH_WITH_ICON = 'control-component-switch-with-icon', | |
61 | - CONTROL_COMPONENT_SLIDING_SWITCH = 'control-component-sliding-switch', | |
62 | - MAP_COMPONENT_TRACK = 'map-component-track', | |
63 | -} | |
64 | - | |
65 | -export interface ComponentConfig { | |
66 | - Component: Component; | |
67 | - ComponentKey: FrontComponent; | |
68 | - ComponentConfig?: Recordable; | |
69 | - ComponentCategory: FrontComponentCategory; | |
70 | - transformConfig: ( | |
71 | - componentConfig: Recordable, | |
72 | - record: DataComponentRecord, | |
73 | - dataSourceRecord: DataSource | |
74 | - ) => Recordable; | |
75 | -} | |
31 | +import { ComponentConfig } from '../types/type'; | |
32 | +import { FrontComponent, FrontComponentCategory } from '../const/const'; | |
76 | 33 | |
77 | 34 | export const frontComponentDefaultConfigMap = new Map<FrontComponent, Partial<ComponentInfo>>(); |
78 | 35 | ... | ... |
src/views/visual/board/const/const.ts
0 → 100644
1 | +export enum FrontComponentCategory { | |
2 | + TEXT = 'text', | |
3 | + PICTURE = 'picture', | |
4 | + INSTRUMENT = 'instrument', | |
5 | + CONTROL = 'control', | |
6 | + MAP = 'map', | |
7 | +} | |
8 | + | |
9 | +export const FrontComponentCategoryName = { | |
10 | + [FrontComponentCategory.TEXT]: '文本组件', | |
11 | + [FrontComponentCategory.INSTRUMENT]: '仪表组件', | |
12 | + [FrontComponentCategory.CONTROL]: '控制组件', | |
13 | + [FrontComponentCategory.PICTURE]: '图片组件', | |
14 | + [FrontComponentCategory.MAP]: '地图组件', | |
15 | +}; | |
16 | + | |
17 | +export enum FrontComponent { | |
18 | + TEXT_COMPONENT_1 = 'text-component-1', | |
19 | + TEXT_COMPONENT_2 = 'text-component-2', | |
20 | + TEXT_COMPONENT_3 = 'text-component-3', | |
21 | + TEXT_COMPONENT_4 = 'text-component-4', | |
22 | + TEXT_COMPONENT_5 = 'text-component-5', | |
23 | + INSTRUMENT_COMPONENT_1 = 'instrument-component-1', | |
24 | + INSTRUMENT_COMPONENT_2 = 'instrument-component-2', | |
25 | + DIGITAL_DASHBOARD_COMPONENT = 'digital-dashboard-component', | |
26 | + PICTURE_COMPONENT_1 = 'picture-component-1', | |
27 | + CONTROL_COMPONENT_TOGGLE_SWITCH = 'control-component-toggle-switch', | |
28 | + CONTROL_COMPONENT_SWITCH_WITH_ICON = 'control-component-switch-with-icon', | |
29 | + CONTROL_COMPONENT_SLIDING_SWITCH = 'control-component-sliding-switch', | |
30 | + MAP_COMPONENT_TRACK = 'map-component-track', | |
31 | +} | ... | ... |
... | ... | @@ -11,8 +11,8 @@ |
11 | 11 | import type { ComponentInfo, DataSource } from '/@/api/dataBoard/model'; |
12 | 12 | import { useMessage } from '/@/hooks/web/useMessage'; |
13 | 13 | import { DataBoardLayoutInfo } from '../../types/type'; |
14 | - import { FrontComponent } from '../../components/help'; | |
15 | 14 | import { getDataSourceComponent } from './DataSourceForm/help'; |
15 | + import { FrontComponent } from '../../const/const'; | |
16 | 16 | |
17 | 17 | type DataSourceFormEL = { [key: string]: Nullable<FormActionType> }; |
18 | 18 | ... | ... |
... | ... | @@ -12,7 +12,7 @@ |
12 | 12 | import { decode } from '../../config/config'; |
13 | 13 | import { ComponentInfo } from '/@/api/dataBoard/model'; |
14 | 14 | import { useCalcGridLayout } from '../../hook/useCalcGridLayout'; |
15 | - import { FrontComponent } from '../../components/help'; | |
15 | + import { FrontComponent } from '../../const/const'; | |
16 | 16 | |
17 | 17 | interface DataComponentRouteParams extends RouteParams { |
18 | 18 | id: string; |
... | ... | @@ -23,8 +23,6 @@ |
23 | 23 | }>(); |
24 | 24 | |
25 | 25 | const emit = defineEmits(['update', 'create', 'register']); |
26 | - const activeKey = ref('basicConfig'); | |
27 | - | |
28 | 26 | const ROUTE = useRoute(); |
29 | 27 | |
30 | 28 | const { createMessage } = useMessage(); |
... | ... | @@ -70,7 +68,6 @@ |
70 | 68 | unref(isEdit) ? handleUpdateComponent(value) : handleAddComponent(value); |
71 | 69 | resetForm(); |
72 | 70 | } catch (error: unknown) { |
73 | - if (unref(activeKey) !== 'basicConfig') activeKey.value = 'basicConfig'; | |
74 | 71 | window.console.error(error); |
75 | 72 | } |
76 | 73 | }; |
... | ... | @@ -138,7 +135,7 @@ |
138 | 135 | @cancel="resetForm" |
139 | 136 | > |
140 | 137 | <section> |
141 | - <Tabs v-model:activeKey="activeKey" type="card"> | |
138 | + <Tabs type="card"> | |
142 | 139 | <Tabs.TabPane key="basicConfig" tab="基础配置"> |
143 | 140 | <BasicConfiguration |
144 | 141 | ref="basicConfigurationEl" | ... | ... |
1 | 1 | import { Component } from 'vue'; |
2 | -import { FrontComponent } from '../../../components/help'; | |
2 | +import { FrontComponent } from '../../../const/const'; | |
3 | 3 | import BasicDataSourceForm from './BasicDataSourceForm.vue'; |
4 | 4 | import ControlDataSourceForm from './ControlDataSourceForm.vue'; |
5 | 5 | ... | ... |
1 | 1 | <script lang="ts" setup> |
2 | 2 | import { Tabs, List } from 'ant-design-vue'; |
3 | 3 | import VisualWidgetSelect from './VisualWidgetSelect.vue'; |
4 | + import { getComponentDefaultConfig } from '../../components/help'; | |
5 | + import { frontComponentMap } from '../../components/help'; | |
6 | + import { computed } from 'vue'; | |
4 | 7 | import { |
5 | 8 | FrontComponent, |
6 | 9 | FrontComponentCategory, |
7 | 10 | FrontComponentCategoryName, |
8 | - getComponentDefaultConfig, | |
9 | - } from '../../components/help'; | |
10 | - import { frontComponentMap } from '../../components/help'; | |
11 | - import { computed } from 'vue'; | |
11 | + } from '../../const/const'; | |
12 | 12 | |
13 | 13 | interface DataSource { |
14 | 14 | category: string; | ... | ... |
... | ... | @@ -44,7 +44,7 @@ |
44 | 44 | import trendIcon from '/@/assets/svg/trend.svg'; |
45 | 45 | import backIcon from '/@/assets/images/back.png'; |
46 | 46 | import { useCalcGridLayout } from '../hook/useCalcGridLayout'; |
47 | - import { FrontComponent } from '../components/help'; | |
47 | + import { FrontComponent } from '../const/const'; | |
48 | 48 | |
49 | 49 | const ROUTE = useRoute(); |
50 | 50 | ... | ... |
1 | +import { Component } from 'vue'; | |
1 | 2 | import { Layout } from 'vue3-grid-layout'; |
3 | +import { FrontComponent, FrontComponentCategory } from '../const/const'; | |
4 | +import { RadioRecord } from '../detail/config/util'; | |
2 | 5 | import { DataComponentRecord, DataSource } from '/@/api/dataBoard/model'; |
3 | 6 | |
4 | 7 | export type FrontDataSourceRecord = DataSource; |
... | ... | @@ -8,3 +11,25 @@ export type DataBoardLayoutInfo = Layout & { |
8 | 11 | width?: number; |
9 | 12 | height?: number; |
10 | 13 | }; |
14 | + | |
15 | +export interface ComponentConfig { | |
16 | + Component: Component; | |
17 | + ComponentKey: FrontComponent; | |
18 | + ComponentConfig?: Recordable; | |
19 | + ComponentCategory: FrontComponentCategory; | |
20 | + transformConfig: ( | |
21 | + componentConfig: Recordable, | |
22 | + record: DataComponentRecord, | |
23 | + dataSourceRecord: DataSource | |
24 | + ) => Recordable; | |
25 | +} | |
26 | + | |
27 | +export interface VisualComponentProps<Layout = Recordable, Value = Recordable> { | |
28 | + value?: Value; | |
29 | + layout?: Layout; | |
30 | + radio?: RadioRecord; | |
31 | + random?: boolean; | |
32 | + add?: (key: string, method: Fn) => void; | |
33 | + update?: () => void; | |
34 | + remove?: (key: string) => void; | |
35 | +} | ... | ... |