diff --git a/CHANGELOG.md b/CHANGELOG.md index d1ad7e994325be4b56a73514554826db445a52f7..60773bcc49162c8a28e73d0ef4c1cb4b7c262416 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,8 @@ - 新增甘特图滑块的链接线绘制,新增部件参数linkdatasourcetype(链接数据获取模式)、linkappdataentityname(链接数据集应用实体名称)、linkappdedatasetname(链接应用实体结果集名称)、linknodedataname(链接节点数据属性名称)、fromdataitemname(链接起始数据项属性名称)、todataitemname(链接结束数据项属性名称) - 新增树节点数据拖拽状态属性 - 异步导出下载识别文件名属性 +- 地图支持下钻、返回、项样式、行政等级、激活模式 +- 地图内置导航区域导航添加行政编码与行政等级参数 ### Changed diff --git a/src/common/control-navigation/provider/map-navigation.provider.ts b/src/common/control-navigation/provider/map-navigation.provider.ts index 2387a1c59577f7ce1d9258c70c02e28ebcfaf826..58319ba1439632cd244568753607dab24f8b242b 100644 --- a/src/common/control-navigation/provider/map-navigation.provider.ts +++ b/src/common/control-navigation/provider/map-navigation.provider.ts @@ -1,4 +1,9 @@ -import { IMapData, INavViewMsg, MapController } from '@ibiz-template/runtime'; +import { + IMapData, + IMapEvent, + INavViewMsg, + MapController, +} from '@ibiz-template/runtime'; import { ISysMap } from '@ibiz/model-core'; import { NavgationBaseProvider } from './navigation-base.provider'; @@ -16,6 +21,20 @@ export class MapNavigationProvider extends NavgationBaseProvider { declare model: ISysMap; + /** + * @description 导航数据变化 + * @param {IMapEvent['onNavDataChange']['event']} event + * @memberof MapNavigationProvider + */ + onNavDataChange(event: IMapEvent['onNavDataChange']['event']): void { + const { navData } = event; + // 数据变更才重新导航 + if (this.navViewMsg.value?.key !== navData._id) { + this.navStack.unshift(navData[this.keyName]); + this.navViewMsg.value = this.getNavViewMsg(navData as IMapData); + } + } + onNavDataByStack(): void { const { items } = this.controller.state; const navData = @@ -30,16 +49,22 @@ export class MapNavigationProvider extends NavgationBaseProvider { } } - getNavViewMsg(item: IMapData): INavViewMsg { + getNavViewMsg(item: IData): INavViewMsg { const { sysMapItems } = this.model; + const { areaCode, areaLevel } = item; const itemModel = sysMapItems?.find(_item => _item.id === item._mapItemId); if (itemModel) { const { context, params } = this.prepareParams( itemModel, - item._deData, + { ...item._deData, areaCode, areaLevel }, this.controller.context, this.controller.params, ); + // 区域导航视图添加行政编码与行政等级 + if (itemModel.itemStyle?.startsWith('REGION')) { + params.srfareacode = areaCode; + params.srfarealevel = areaLevel; + } return { params, context, diff --git a/src/common/map-chart-user/map-chart-user.scss b/src/common/map-chart-user/map-chart-user.scss index 04a3d4108e70e6f4d7e9996425b5bd05f31fd7cc..f99339e0b746db22d9f8bb3961e94f7386cfafe7 100644 --- a/src/common/map-chart-user/map-chart-user.scss +++ b/src/common/map-chart-user/map-chart-user.scss @@ -21,7 +21,14 @@ cursor: pointer; } + @include e(fullscreen) { + position: absolute; + top: getCssVar(spacing, tight); + right: getCssVar(spacing, tight); + z-index: 9; + } + @include e(popper) { - padding: getCssVar(spacing, base); + padding: getCssVar(spacing, tight); } } \ No newline at end of file diff --git a/src/common/map-chart-user/map-chart-user.tsx b/src/common/map-chart-user/map-chart-user.tsx index 4145a57511a29777ab6427f73e2c1e94138cbdc5..1296c1e408793507adf51931fc1c81131456215d 100644 --- a/src/common/map-chart-user/map-chart-user.tsx +++ b/src/common/map-chart-user/map-chart-user.tsx @@ -1,8 +1,17 @@ /* eslint-disable eqeqeq */ -import { defineComponent, onMounted, PropType, computed } from 'vue'; +import { + defineComponent, + onMounted, + PropType, + computed, + ref, + onBeforeUnmount, +} from 'vue'; import { isNil, mergeDeepLeft, mergeDeepWithKey } from 'ramda'; import { useNamespace } from '@ibiz-template/vue3-util'; import { IMapData, MapController } from '@ibiz-template/runtime'; +import { listenJSEvent, NOOP } from '@ibiz-template/core'; +import { toNumber } from 'lodash-es'; import { defaultOpts, getAreaOption, @@ -38,6 +47,8 @@ export const IBizMapChartUser = defineComponent({ const ns = useNamespace('map-chart-user'); const c = props.controller; let option: IData = defaultOpts; + const mapRef = ref(); + const isFull = ref(false); if (c.controlParams.defaultopts) { const data = JSON.parse(c.controlParams.defaultopts); option = mergeDeepLeft(data, option); @@ -53,57 +64,148 @@ export const IBizMapChartUser = defineComponent({ ); }); - const { chartRef, historyNames, changeMap, getCityInfo, goBack } = - useMapManager(props.controller, options, mapName => { - const areaData = props.areaData || []; - const pointData = props.pointData || []; + let cleanup = NOOP; - const tooltip = getTooltip(); - const visualMap = getVisualMap(options.value); - const cityInfo = getCityInfo(); - const pointOption = { - ...getPointStaticOption(options.value), - ...getPointOption(pointData, areaData), - }; - const areaOption = { - ...getAreaStaticOption(options.value), - ...getAreaOption(mapName, pointData, areaData, cityInfo), - }; + const { + chartRef, + historyNames, + processing, + areaLevelMap, + changeMap, + getCityInfo, + goBack, + } = useMapManager(props.controller, options, mapName => { + const areaData = props.areaData || []; + const pointData = props.pointData || []; - const result: IData = { - geo: { - map: mapName, - }, - tooltip, - visualMap, - series: [ - // 地图区块序列 - areaOption, - // 地图散点序列 - pointOption, - ], - }; - return result; - }); + const tooltip = getTooltip(); + const visualMap = getVisualMap(options.value); + const cityInfo = getCityInfo(); + const pointOption = { + ...getPointStaticOption(options.value), + ...getPointOption(pointData, areaData), + }; + const { top, bottom } = options.value; + const areaOption = { + top, + bottom, + ...getAreaStaticOption(options.value), + ...getAreaOption(mapName, pointData, areaData, cityInfo), + }; + + const result: IData = { + geo: { + map: mapName, + top, + bottom, + }, + tooltip, + visualMap, + series: [ + // 地图区块序列 + areaOption, + // 地图散点序列 + pointOption, + ], + }; + return result; + }); onMounted(() => { const name = options.value.defaultAreaCode; const areaCode = c.state.strAreaCode ? `${name}` : Number(name); c.state.areaCode = areaCode; changeMap(name, areaCode, true); + + c.evt.on('onDrillDown', async (args: IData) => { + if (!processing.value) { + const { data } = args; + const code = data.areaCode; + const curAreaCode = c.state.strAreaCode ? `${code}` : Number(code); + const areaLevel = areaLevelMap.get(toNumber(curAreaCode)) || ''; + c.state.areaCode = curAreaCode; + c.state.areaLevel = areaLevel; + await changeMap(code, code); + } + }); + c.evt.on('onBackClick', () => { + if (!processing.value) { + goBack(); + } + }); + + cleanup = listenJSEvent(window, 'resize', () => { + if (isFull.value) { + isFull.value = ibiz.fullscreenUtil.isFullScreen; + } + }); + }); + + // 组件销毁前销毁监听 + onBeforeUnmount(() => { + if (cleanup !== NOOP) { + cleanup(); + } }); - return { ns, chartRef, historyNames, goBack }; + const onBack = async () => { + processing.value = true; + await c.evt.emit('onBackClick', undefined); + goBack(); + processing.value = false; + }; + + /** + * @description 切换全屏 + */ + const toggleFullScreen = () => { + if (mapRef.value) { + if (isFull.value) { + ibiz.fullscreenUtil.closeElementFullscreen(); + } else { + ibiz.fullscreenUtil.openElementFullscreen(mapRef.value); + } + isFull.value = !isFull.value; + } + }; + + return { + ns, + c, + mapRef, + chartRef, + historyNames, + isFull, + onBack, + toggleFullScreen, + }; }, render() { + const { enabledFullScreen } = this.c.state; return ( -