Showing
9 changed files
with
145 additions
and
32 deletions
@@ -5,7 +5,7 @@ | @@ -5,7 +5,7 @@ | ||
5 | </script> | 5 | </script> |
6 | <script lang="ts" setup> | 6 | <script lang="ts" setup> |
7 | import type { ECharts, EChartsOption } from 'echarts'; | 7 | import type { ECharts, EChartsOption } from 'echarts'; |
8 | - import { PropType, watch } from 'vue'; | 8 | + import { watch } from 'vue'; |
9 | import { nextTick, onMounted, onUnmounted, ref, unref, computed } from 'vue'; | 9 | import { nextTick, onMounted, onUnmounted, ref, unref, computed } from 'vue'; |
10 | import { init } from 'echarts'; | 10 | import { init } from 'echarts'; |
11 | import { | 11 | import { |
@@ -26,29 +26,23 @@ | @@ -26,29 +26,23 @@ | ||
26 | import { Tooltip } from 'ant-design-vue'; | 26 | import { Tooltip } from 'ant-design-vue'; |
27 | import { useThrottleFn } from '@vueuse/shared'; | 27 | import { useThrottleFn } from '@vueuse/shared'; |
28 | import { buildUUID } from '/@/utils/uuid'; | 28 | import { buildUUID } from '/@/utils/uuid'; |
29 | - import { FrontComponent } from '../help'; | ||
30 | - | ||
31 | - const props = defineProps({ | ||
32 | - add: { | ||
33 | - type: Function, | ||
34 | - }, | ||
35 | - layout: { | ||
36 | - type: Object as PropType<DashboardComponentLayout>, | ||
37 | - default: () => ({}), | ||
38 | - }, | ||
39 | - value: { | ||
40 | - type: Object as PropType<DashBoardValue>, | ||
41 | - default: () => ({ id: buildUUID() }), | ||
42 | - }, | ||
43 | - radio: { | ||
44 | - type: Object as PropType<RadioRecord>, | ||
45 | - default: () => DEFAULT_RADIO_RECORD, | ||
46 | - }, | ||
47 | - random: { | ||
48 | - type: Boolean, | ||
49 | - default: true, | ||
50 | - }, | ||
51 | - }); | 29 | + import { FrontComponent } from '../../const/const'; |
30 | + | ||
31 | + const props = withDefaults( | ||
32 | + defineProps<{ | ||
33 | + add?: Function; | ||
34 | + layout?: DashboardComponentLayout; | ||
35 | + value?: DashBoardValue; | ||
36 | + radio?: RadioRecord; | ||
37 | + random?: boolean; | ||
38 | + }>(), | ||
39 | + { | ||
40 | + layout: () => ({} as unknown as DashboardComponentLayout), | ||
41 | + value: () => ({ id: buildUUID() }), | ||
42 | + radio: () => DEFAULT_RADIO_RECORD, | ||
43 | + random: true, | ||
44 | + } | ||
45 | + ); | ||
52 | 46 | ||
53 | const getControlsWidgetId = () => `widget-chart-${props.value.id}`; | 47 | const getControlsWidgetId = () => `widget-chart-${props.value.id}`; |
54 | 48 |
@@ -4,9 +4,29 @@ | @@ -4,9 +4,29 @@ | ||
4 | }; | 4 | }; |
5 | </script> | 5 | </script> |
6 | <script lang="ts" setup> | 6 | <script lang="ts" setup> |
7 | - import { nextTick, onMounted, ref, unref } from 'vue'; | 7 | + import { computed, nextTick, onMounted, ref, unref } from 'vue'; |
8 | + import { RadioRecord } from '../../detail/config/util'; | ||
8 | import { useScript } from '/@/hooks/web/useScript'; | 9 | import { useScript } from '/@/hooks/web/useScript'; |
9 | import { BAI_DU_MAP_URL } from '/@/utils/fnUtils'; | 10 | import { BAI_DU_MAP_URL } from '/@/utils/fnUtils'; |
11 | + import { MapComponentLayout, MapComponentValue } from './map.config'; | ||
12 | + import { | ||
13 | + ClockCircleOutlined, | ||
14 | + PlayCircleOutlined, | ||
15 | + PauseCircleOutlined, | ||
16 | + } from '@ant-design/icons-vue'; | ||
17 | + import { Button, Tooltip } from 'ant-design-vue'; | ||
18 | + import { useVisualBoardContext } from '../../hook/useVisualBoardContext'; | ||
19 | + | ||
20 | + const {} = useVisualBoardContext(); | ||
21 | + | ||
22 | + withDefaults( | ||
23 | + defineProps<{ | ||
24 | + value?: MapComponentValue; | ||
25 | + layout?: MapComponentLayout; | ||
26 | + radio?: RadioRecord; | ||
27 | + }>(), | ||
28 | + {} | ||
29 | + ); | ||
10 | 30 | ||
11 | const wrapRef = ref<HTMLDivElement | null>(null); | 31 | const wrapRef = ref<HTMLDivElement | null>(null); |
12 | const { toPromise } = useScript({ src: BAI_DU_MAP_URL }); | 32 | const { toPromise } = useScript({ src: BAI_DU_MAP_URL }); |
@@ -26,10 +46,47 @@ | @@ -26,10 +46,47 @@ | ||
26 | onMounted(() => { | 46 | onMounted(() => { |
27 | initMap(); | 47 | initMap(); |
28 | }); | 48 | }); |
49 | + | ||
50 | + const getTimeRange = computed(() => { | ||
51 | + return ` - 从 ${'2020-10-20 10:10:10'} 到 ${'2020-10-20 10:10:10'}`; | ||
52 | + }); | ||
53 | + | ||
54 | + const handleTrackSwitch = () => {}; | ||
55 | + | ||
56 | + const pauseFlag = ref(true); | ||
57 | + | ||
58 | + const handlePlay = () => { | ||
59 | + pauseFlag.value = false; | ||
60 | + }; | ||
61 | + | ||
62 | + const handlePause = () => { | ||
63 | + pauseFlag.value = true; | ||
64 | + }; | ||
29 | </script> | 65 | </script> |
30 | 66 | ||
31 | <template> | 67 | <template> |
32 | - <div class="w-full h-full flex justify-center items-center"> | 68 | + <div class="w-full h-full flex justify-center items-center flex-col"> |
69 | + <div class="w-[95%] flex"> | ||
70 | + <Button type="text" class="!px-2 flex-auto !text-left truncate" @click="handleTrackSwitch"> | ||
71 | + <div class="w-full truncate text-gray-500 flex items-center"> | ||
72 | + <ClockCircleOutlined /> | ||
73 | + <span class="mx-1">实时</span> | ||
74 | + <Tooltip :title="getTimeRange.replace('-', '')"> | ||
75 | + <span class="truncate"> | ||
76 | + {{ getTimeRange }} | ||
77 | + </span> | ||
78 | + </Tooltip> | ||
79 | + </div> | ||
80 | + </Button> | ||
81 | + <Button v-show="pauseFlag" type="text" class="!px-2 !text-gray-500" @click="handlePlay"> | ||
82 | + <PlayCircleOutlined /> | ||
83 | + <span>播放轨迹</span> | ||
84 | + </Button> | ||
85 | + <Button v-show="!pauseFlag" type="text" class="!px-2 !text-gray-500" @click="handlePause"> | ||
86 | + <PauseCircleOutlined /> | ||
87 | + <span>暂停播放</span> | ||
88 | + </Button> | ||
89 | + </div> | ||
33 | <div ref="wrapRef" class="w-[95%] h-[95%]"></div> | 90 | <div ref="wrapRef" class="w-[95%] h-[95%]"></div> |
34 | </div> | 91 | </div> |
35 | </template> | 92 | </template> |
1 | -import { ComponentConfig } from '../help'; | 1 | +import { FrontComponent } from '../../const/const'; |
2 | +import { ComponentConfig } from '../../types/type'; | ||
3 | + | ||
4 | +export interface MapComponentLayout { | ||
5 | + componentType?: FrontComponent; | ||
6 | +} | ||
7 | + | ||
8 | +export interface MapComponentValue { | ||
9 | + icon?: string; | ||
10 | + track?: Recordable[]; | ||
11 | +} | ||
12 | + | ||
13 | +interface Config { | ||
14 | + layout?: MapComponentLayout; | ||
15 | + value?: MapComponentValue; | ||
16 | +} | ||
17 | + | ||
18 | +export const MaphistoryTrackConfig: Config = { | ||
19 | + layout: { | ||
20 | + componentType: FrontComponent.MAP_COMPONENT_TRACK_HISTORY, | ||
21 | + }, | ||
22 | +}; | ||
23 | + | ||
24 | +export const MapRealTrackConfig: Config = { | ||
25 | + layout: { | ||
26 | + componentType: FrontComponent.MAP_COMPONENT_TRACK_HISTORY, | ||
27 | + }, | ||
28 | +}; | ||
2 | 29 | ||
3 | export const transfromMapComponentConfig: ComponentConfig['transformConfig'] = ( | 30 | export const transfromMapComponentConfig: ComponentConfig['transformConfig'] = ( |
4 | _componentConfig, | 31 | _componentConfig, |
1 | <script lang="ts" setup> | 1 | <script lang="ts" setup> |
2 | import { useUpdateCenter } from '../../hook/useUpdateCenter'; | 2 | import { useUpdateCenter } from '../../hook/useUpdateCenter'; |
3 | import { FrontDataSourceRecord } from '../../types/type'; | 3 | import { FrontDataSourceRecord } from '../../types/type'; |
4 | + import { createVisualBoardContext } from '../../hook/useVisualBoardContext'; | ||
4 | 5 | ||
5 | const props = defineProps<{ | 6 | const props = defineProps<{ |
6 | dataSource: FrontDataSourceRecord[]; | 7 | dataSource: FrontDataSourceRecord[]; |
@@ -8,6 +9,8 @@ | @@ -8,6 +9,8 @@ | ||
8 | 9 | ||
9 | const { update, add, remove } = useUpdateCenter(); | 10 | const { update, add, remove } = useUpdateCenter(); |
10 | 11 | ||
12 | + createVisualBoardContext({ update, add, remove }); | ||
13 | + | ||
11 | defineExpose({ update }); | 14 | defineExpose({ update }); |
12 | </script> | 15 | </script> |
13 | 16 |
@@ -27,7 +27,11 @@ import ToggleSwitch from './ControlComponent/ToggleSwitch.vue'; | @@ -27,7 +27,11 @@ import ToggleSwitch from './ControlComponent/ToggleSwitch.vue'; | ||
27 | import SlidingSwitch from './ControlComponent/SlidingSwitch.vue'; | 27 | import SlidingSwitch from './ControlComponent/SlidingSwitch.vue'; |
28 | import SwitchWithIcon from './ControlComponent/SwitchWithIcon.vue'; | 28 | import SwitchWithIcon from './ControlComponent/SwitchWithIcon.vue'; |
29 | import MapComponent from './MapComponent/MapComponent.vue'; | 29 | import MapComponent from './MapComponent/MapComponent.vue'; |
30 | -import { transfromMapComponentConfig } from './MapComponent/map.config'; | 30 | +import { |
31 | + MaphistoryTrackConfig, | ||
32 | + MapRealTrackConfig, | ||
33 | + transfromMapComponentConfig, | ||
34 | +} from './MapComponent/map.config'; | ||
31 | import { ComponentConfig } from '../types/type'; | 35 | import { ComponentConfig } from '../types/type'; |
32 | import { FrontComponent, FrontComponentCategory } from '../const/const'; | 36 | import { FrontComponent, FrontComponentCategory } from '../const/const'; |
33 | 37 | ||
@@ -135,10 +139,20 @@ frontComponentMap.set(FrontComponent.CONTROL_COMPONENT_TOGGLE_SWITCH, { | @@ -135,10 +139,20 @@ frontComponentMap.set(FrontComponent.CONTROL_COMPONENT_TOGGLE_SWITCH, { | ||
135 | transformConfig: transformControlConfig, | 139 | transformConfig: transformControlConfig, |
136 | }); | 140 | }); |
137 | 141 | ||
138 | -frontComponentMap.set(FrontComponent.MAP_COMPONENT_TRACK, { | 142 | +frontComponentMap.set(FrontComponent.MAP_COMPONENT_TRACK_REAL, { |
139 | Component: MapComponent, | 143 | Component: MapComponent, |
140 | ComponentName: '实时轨迹', | 144 | ComponentName: '实时轨迹', |
141 | - ComponentKey: FrontComponent.MAP_COMPONENT_TRACK, | 145 | + ComponentKey: FrontComponent.MAP_COMPONENT_TRACK_REAL, |
146 | + ComponentConfig: MapRealTrackConfig, | ||
147 | + ComponentCategory: FrontComponentCategory.MAP, | ||
148 | + transformConfig: transfromMapComponentConfig, | ||
149 | +}); | ||
150 | + | ||
151 | +frontComponentMap.set(FrontComponent.MAP_COMPONENT_TRACK_HISTORY, { | ||
152 | + Component: MapComponent, | ||
153 | + ComponentName: '历史轨迹', | ||
154 | + ComponentKey: FrontComponent.MAP_COMPONENT_TRACK_HISTORY, | ||
155 | + ComponentConfig: MaphistoryTrackConfig, | ||
142 | ComponentCategory: FrontComponentCategory.MAP, | 156 | ComponentCategory: FrontComponentCategory.MAP, |
143 | transformConfig: transfromMapComponentConfig, | 157 | transformConfig: transfromMapComponentConfig, |
144 | }); | 158 | }); |
@@ -27,7 +27,8 @@ export enum FrontComponent { | @@ -27,7 +27,8 @@ export enum FrontComponent { | ||
27 | CONTROL_COMPONENT_TOGGLE_SWITCH = 'control-component-toggle-switch', | 27 | CONTROL_COMPONENT_TOGGLE_SWITCH = 'control-component-toggle-switch', |
28 | CONTROL_COMPONENT_SWITCH_WITH_ICON = 'control-component-switch-with-icon', | 28 | CONTROL_COMPONENT_SWITCH_WITH_ICON = 'control-component-switch-with-icon', |
29 | CONTROL_COMPONENT_SLIDING_SWITCH = 'control-component-sliding-switch', | 29 | CONTROL_COMPONENT_SLIDING_SWITCH = 'control-component-sliding-switch', |
30 | - MAP_COMPONENT_TRACK = 'map-component-track', | 30 | + MAP_COMPONENT_TRACK_REAL = 'map-component-track-real', |
31 | + MAP_COMPONENT_TRACK_HISTORY = 'map-component-track-history', | ||
31 | } | 32 | } |
32 | 33 | ||
33 | export enum Gradient { | 34 | export enum Gradient { |
@@ -7,7 +7,8 @@ import MapDataSourceForm from './MapDataSourceForm.vue'; | @@ -7,7 +7,8 @@ import MapDataSourceForm from './MapDataSourceForm.vue'; | ||
7 | const dataSourceComponentMap = new Map<FrontComponent, Component>(); | 7 | const dataSourceComponentMap = new Map<FrontComponent, Component>(); |
8 | 8 | ||
9 | dataSourceComponentMap.set(FrontComponent.CONTROL_COMPONENT_TOGGLE_SWITCH, ControlDataSourceForm); | 9 | dataSourceComponentMap.set(FrontComponent.CONTROL_COMPONENT_TOGGLE_SWITCH, ControlDataSourceForm); |
10 | -dataSourceComponentMap.set(FrontComponent.MAP_COMPONENT_TRACK, MapDataSourceForm); | 10 | +dataSourceComponentMap.set(FrontComponent.MAP_COMPONENT_TRACK_REAL, MapDataSourceForm); |
11 | +dataSourceComponentMap.set(FrontComponent.MAP_COMPONENT_TRACK_HISTORY, MapDataSourceForm); | ||
11 | 12 | ||
12 | export const getDataSourceComponent = (frontId: FrontComponent) => { | 13 | export const getDataSourceComponent = (frontId: FrontComponent) => { |
13 | if (dataSourceComponentMap.has(frontId)) return dataSourceComponentMap.get(frontId)!; | 14 | if (dataSourceComponentMap.has(frontId)) return dataSourceComponentMap.get(frontId)!; |
1 | +import { inject, provide } from 'vue'; | ||
2 | +import { UpdateCenter } from './useUpdateCenter'; | ||
3 | + | ||
4 | +const key = Symbol('visual-board-content'); | ||
5 | + | ||
6 | +type Instance = UpdateCenter; | ||
7 | + | ||
8 | +export function createVisualBoardContext(instance: Instance) { | ||
9 | + provide(key, instance); | ||
10 | +} | ||
11 | + | ||
12 | +export function useVisualBoardContext() { | ||
13 | + return inject(key) as Instance; | ||
14 | +} |