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 | +} |