From 9fb3790e488606baed7828b0c13b6f1705450de7 Mon Sep 17 00:00:00 2001 From: lijianxiong <1518062161@qq.com> Date: Fri, 10 Oct 2025 20:36:47 +0800 Subject: [PATCH 1/3] =?UTF-8?q?feat=EF=BC=9A=E8=B0=83=E6=95=B4=E5=88=86?= =?UTF-8?q?=E9=A1=B5=E5=AF=BC=E8=88=AA=E9=9D=A2=E6=9D=BF=E7=9A=84=E6=BF=80?= =?UTF-8?q?=E6=B4=BB=E9=A1=B9=E4=B8=BA=E4=B8=BB=E9=A2=98=E6=A0=B7=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/control/tab-exp-panel/tab-exp-panel.scss | 27 +++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/src/control/tab-exp-panel/tab-exp-panel.scss b/src/control/tab-exp-panel/tab-exp-panel.scss index 6869a0b3..57c9b1fb 100644 --- a/src/control/tab-exp-panel/tab-exp-panel.scss +++ b/src/control/tab-exp-panel/tab-exp-panel.scss @@ -7,4 +7,29 @@ text-overflow: ellipsis; white-space: nowrap; background: getCssVar(color, bg, 0); -} \ No newline at end of file +} + +@include b(control-tabexppanel-header) { + &>.van-tabs__wrap { + .van-tab--line.van-tab--active { + .van-tab__text { + position: relative; + line-height: var(--van-tabs-line-height); + color: getCssVar(color, primary); + &::after { + content: ''; + display: block; + width: 100%; + height: rem(2px); + background-color: getCssVar(color, primary); + position: absolute; + bottom: 0; + border-radius: var(--van-tabs-bottom-bar-height); + } + } + } + .van-tabs__line { + display: none; + } + } +} -- Gitee From adadfe68b22e717087b9bca24a85dc0859e4aed2 Mon Sep 17 00:00:00 2001 From: lijianxiong <1518062161@qq.com> Date: Fri, 10 Oct 2025 20:38:33 +0800 Subject: [PATCH 2/3] =?UTF-8?q?feat=EF=BC=9A=E6=96=B0=E5=A2=9E=E5=9C=B0?= =?UTF-8?q?=E5=9B=BE=E9=80=89=E6=8B=A9=E7=BC=96=E8=BE=91=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 8 +- patches/@amap__amap-jsapi-loader@1.0.1.patch | 87 ++++ src/editor/index.ts | 5 + .../ibiz-map-picker/ibiz-map-picker.scss | 199 ++++++++ .../ibiz-map-picker/ibiz-map-picker.tsx | 433 ++++++++++++++++++ src/editor/map-picker/index.ts | 3 + .../map-picker-editor.controller.ts | 10 + .../map-picker/map-picker-editor.provider.ts | 27 ++ src/locale/en/index.ts | 3 + src/locale/zh-CN/index.ts | 3 + 10 files changed, 777 insertions(+), 1 deletion(-) create mode 100644 patches/@amap__amap-jsapi-loader@1.0.1.patch create mode 100644 src/editor/map-picker/ibiz-map-picker/ibiz-map-picker.scss create mode 100644 src/editor/map-picker/ibiz-map-picker/ibiz-map-picker.tsx create mode 100644 src/editor/map-picker/index.ts create mode 100644 src/editor/map-picker/map-picker-editor.controller.ts create mode 100644 src/editor/map-picker/map-picker-editor.provider.ts diff --git a/package.json b/package.json index 78def609..b2a813e1 100644 --- a/package.json +++ b/package.json @@ -25,6 +25,7 @@ "publish:local": "npm run build && npm publish --access public --registry=http://172.16.240.221:8081/repository/local/" }, "dependencies": { + "@amap/amap-jsapi-loader": "^1.0.1", "@floating-ui/dom": "^1.5.3", "@ibiz-template-package/vs-tree-ex": "^0.1.1", "@ibiz-template/core": "0.7.41-alpha.28", @@ -94,5 +95,10 @@ "lint-staged": { "*.ts": "eslint --fix", "*.scss": "stylelint --custom-syntax=postcss-scss" + }, + "pnpm": { + "patchedDependencies": { + "@amap/amap-jsapi-loader@1.0.1": "patches/@amap__amap-jsapi-loader@1.0.1.patch" + } } -} \ No newline at end of file +} diff --git a/patches/@amap__amap-jsapi-loader@1.0.1.patch b/patches/@amap__amap-jsapi-loader@1.0.1.patch new file mode 100644 index 00000000..6de71dcc --- /dev/null +++ b/patches/@amap__amap-jsapi-loader@1.0.1.patch @@ -0,0 +1,87 @@ +diff --git a/dist/index.js b/dist/index.js +index b0daa68948ff30600560db03493d8a41ae3bf5ce..b283faee05ed5d9b6e3c2d241c07be52e8d865d6 100644 +--- a/dist/index.js ++++ b/dist/index.js +@@ -1,11 +1,29 @@ +-'use strict';(function(m,p){"object"===typeof exports&&"undefined"!==typeof module?module.exports=p():"function"===typeof define&&define.amd?define(p):(m=m||self,m.AMapLoader=p())})(this,function(){function m(a){var b=[];a.AMapUI&&b.push(p(a.AMapUI));a.Loca&&b.push(r(a.Loca));return Promise.all(b)}function p(a){return new Promise(function(h,c){var f=[];if(a.plugins)for(var e=0;ef[0]&&d[1] { ++ ++ const src = ++ "https://webapi.amap.com/maps?callback=___onAPILoaded&v=" + ++ config.AMap.version + ++ "&key=" + ++ key + ++ "&plugin=" + ++ config.AMap.plugins.join(","); ++ fetch(src).then(async res => { ++ const text = await res.text(); ++ script.textContent = text.replace('define.amd', 'undefined'); ++ parentNode.appendChild(script); ++ }).catch(e => { + Status.AMap = LoadStatus.failed; + reject(e); +- }; +- parentNode.appendChild(script); ++ }); ++ // script.onerror = (e) => { ++ // Status.AMap = LoadStatus.failed; ++ // reject(e); ++ // }; ++ // parentNode.appendChild(script); + } else if (Status.AMap == LoadStatus.loaded) { + //deal multi load + if (options.key && options.key !== config.key) { diff --git a/src/editor/index.ts b/src/editor/index.ts index 9e482f98..4999e3e2 100644 --- a/src/editor/index.ts +++ b/src/editor/index.ts @@ -48,6 +48,7 @@ import { HtmlEditorProvider } from './html'; import { IBizDropdownList } from './dropdown-list/ibiz-dropdown-list/ibiz-dropdown-list'; import { IBizQrcode, QrcodeEditorProvider } from './qrcode'; import { IBizCheckbox, CheckBoxEditorProvider } from './check-box'; +import { IBizMapPicker, MapPickerEditorProvider } from './map-picker'; export const IBizEditor = { install: (v: App): void => { @@ -83,6 +84,7 @@ export const IBizEditor = { v.component(IBizQrcode.name, IBizQrcode); v.component(IBizImageCropping.name, IBizImageCropping); v.component(IBizCheckbox.name, IBizCheckbox); + v.component(IBizMapPicker.name, IBizMapPicker); v.component( 'IBizMarkDown', @@ -338,6 +340,9 @@ export const IBizEditor = { // 选项框 registerEditorProvider('CHECKBOX', () => new CheckBoxEditorProvider()); + // 地图选择器 + registerEditorProvider('MAPPICKER', () => new MapPickerEditorProvider()); + // 面板预制类型 // 动态图片 registerEditorProvider( diff --git a/src/editor/map-picker/ibiz-map-picker/ibiz-map-picker.scss b/src/editor/map-picker/ibiz-map-picker/ibiz-map-picker.scss new file mode 100644 index 00000000..ba5d2b28 --- /dev/null +++ b/src/editor/map-picker/ibiz-map-picker/ibiz-map-picker.scss @@ -0,0 +1,199 @@ +$popup-content-search: ( + 'input-padding-left': 36px, + 'input-padding-right': 24px, +); +$popup-search-result-container: ( + 'bottom': 24px, + 'placesearch-list-height': 30vh, +); +$popup-wrapper-footer: ( + 'height': 70px, +); +$popup-map-marker-text: ( + 'background-color': #3d93fd, + 'font-size': 12px, + 'padding': 4px 10px, + 'border-radius': 4px, +); + +@include b(map-picker) { + @include m(readonly) { + height: auto; + overflow: auto; + line-height: getCssVar(editor, default, line-height); + color: getCssVar(form-item, readonly-color); + word-break: break-word; + white-space: pre-wrap; + } +} + +@include b(map-picker-popup) { + width: 100%; + height: 100%; + + &.van-popup--bottom.van-popup--round { + border-radius: 0; + } +} + +@include b(map-picker-input) { + .van-field__button { + position: relative; + display: flex; + align-items: center; + justify-content: center; + padding: 0; + + .van-button { + position: relative; + width: getCssVar('width-icon', 'large'); + height: auto; + padding: 0 0 0 getCssVar('spacing', 'loose'); + background-color: transparent; + border: none; + + &::before { + display: none; + } + } + + .van-icon-clear { + position: absolute; + left: 2px; + font-size: getCssVar('width-icon', 'large'); + color: getCssVar(color, text, 3); + } + } +} + +@include b(map-picker-popup-wrapper) { + display: flex; + flex-direction: column; + width: 100%; + height: 100%; +} + +@include b(map-picker-popup-wrapper-content) { + position: relative; + display: flex; + flex-direction: column; + width: 100%; + height: 100%; +} + +@include b(map-picker-popup-content-search) { + @include set-component-css-var(popup-content-search, $popup-content-search); + position: relative; + z-index: 999; + width: 100%; + + .van-search { + padding: getCssVar('spacing', 'tight'); + } + + .van-search__content { + position: relative; + } + + .van-cell, + .van-cell__value { + position: static; + } + + .van-cell__value, + .van-field__control, + .van-field__body { + height: 100%; + } + + input { + position: absolute; + left: 0; + padding-left: getCssVar('popup-content-search', 'input-padding-left'); + padding-right: getCssVar('popup-content-search', 'input-padding-right'); + margin: 0; + } + + .van-field__clear { + position: absolute; + right: getCssVar('spacing', 'extra-tight'); + } +} + +@include b(map-picker-popup-map) { + width: 100%; + height: 100%; +} + +@include b(map-picker-popup-map-content) { + width: 100%; + height: 100%; +} + +@include b(map-picker-popup-map-container) { + width: 100%; + height: 100%; +} + +@include b(map-picker-popup-search-result-container) { + @include set-component-css-var( + popup-search-result-container, + $popup-search-result-container + ); + + position: absolute; + bottom: getCssVar('popup-search-result-container', 'bottom'); + left: 0; + display: block !important; + width: 100%; + padding: 0 getCssVar('spacing', 'tight'); + overflow: hidden; + + .amap_lib_placeSearch { + display: flex; + flex-direction: column; + border: none; + } + + .amap_lib_placeSearch_list { + max-height: getCssVar( + 'popup-search-result-container', + 'placesearch-list-height' + ); + overflow-y: auto; + } + + .amap_lib_placeSearch_page { + display: flex; + overflow-x: auto; + } +} + +@include b(map-picker-popup-wrapper-footer) { + @include set-component-css-var(popup-wrapper-footer, $popup-wrapper-footer); + + display: flex; + gap: getCssVar('spacing', 'base'); + align-items: center; + justify-content: space-between; + height: getCssVar('popup-wrapper-footer', 'height'); + padding: 0 getCssVar('spacing', 'tight'); + + .van-button { + width: 50%; + } +} + +@include b(map-picker-popup-map-marker-text) { + @include set-component-css-var(popup-map-marker-text, $popup-map-marker-text); + + position: absolute; + top: -24px; + padding: getCssVar('popup-map-marker-text', 'padding'); + font-size: getCssVar('popup-map-marker-text', 'font-size'); + color: getCssVar(color, white); + white-space: nowrap; + background-color: getCssVar('popup-map-marker-text', 'background-color'); + border-radius: getCssVar('popup-map-marker-text', 'border-radius'); + transform: translateX(calc(-50% - (25px / 2))); +} diff --git a/src/editor/map-picker/ibiz-map-picker/ibiz-map-picker.tsx b/src/editor/map-picker/ibiz-map-picker/ibiz-map-picker.tsx new file mode 100644 index 00000000..08865018 --- /dev/null +++ b/src/editor/map-picker/ibiz-map-picker/ibiz-map-picker.tsx @@ -0,0 +1,433 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ +import { computed, defineComponent, nextTick, onUnmounted, ref } from 'vue'; +import { + useNamespace, + getEditorEmits, + getMapPickerProps, +} from '@ibiz-template/vue3-util'; +import AMapLoader from '@amap/amap-jsapi-loader'; +import { MapPickerEditorController } from '../map-picker-editor.controller'; +import './ibiz-map-picker.scss'; + +/** + * 地图选择器 + * + * @description 通过高德地图选择具体位置,然后填充名称、经度和纬度。支持编辑器类型包含:`地图选择器` + * @primary + * @editorparams {"name":"readonly","parameterType":"boolean","defaultvalue":false,"description":"设置编辑器是否为只读态"} + * @ignoreprops autoFocus | overflowMode + * @ignoreemits blur | focus | enter | infoTextChange + */ +export const IBizMapPicker: ReturnType = + defineComponent({ + name: 'IBizMapPicker', + props: getMapPickerProps(), + emits: getEditorEmits(), + setup(props, { emit }) { + const ns = useNamespace('map-picker'); + + // 控制器 + const c = props.controller; + + // 值项 + const { editorItems } = c.model; + + // 经度 + let longitudeName = ''; + // 纬度 + let latitudeName = ''; + + if (editorItems) { + const [longitude, latitude] = editorItems; + longitudeName = longitude.id || ''; + latitudeName = latitude.id || ''; + } + + // 输入框组件引用 + const inputRef = ref(); + + // 搜索输入框元素 + const searchRef = ref(); + const searchInputRef = computed(() => { + return searchRef.value?.$el.querySelector?.('input'); + }); + + // 地图容器元素 + const mapContainerRef = ref(); + + // 搜索结果容器元素 + const searchResultContainerRef = ref(); + + // 对话框是否显示 + const dialogVisible = ref(false); + + // 是否正在加载中 + const isLoading = ref(false); + + // 搜索值 + const searchValue = ref(''); + + // 地图对象 + let map: IData | undefined; + + // 标记对象 + let marker: IData | undefined; + + // poi选择器 + let poiPicker: IData | undefined; + + // 地址信息 + const addressInfo: { + address: string; + longitude?: number | null; + latitude?: number | null; + } = { + address: '', + longitude: null, + latitude: null, + }; + + // 清除标记 + const clearMarker = () => { + if (marker) { + marker.setMap(null); + marker = undefined; + } + }; + + // 添加标记 + const addMarker = (lng: number, lat: number) => { + const AMap = (window as IData).AMap; + if (!AMap) { + return; + } + clearMarker(); + marker = new AMap.Marker({ + position: [lng, lat], + }); + }; + + // 获取位置 + const getAddress = (lng: number, lat: number) => { + const AMap = (window as IData).AMap; + if (!AMap) { + return; + } + if (!marker) { + return; + } + const geocoder = new AMap.Geocoder({}); + const currentMarker = marker; + geocoder.getAddress([lng, lat], (status: string, result: IData) => { + if (!marker || marker !== currentMarker) { + return; + } + if ( + status === 'complete' && + result.info === 'OK' && + result.regeocode + ) { + const regeocode = result.regeocode; + const address = regeocode.formattedAddress; + const markerContent = document.createElement('div'); + const markerImg = document.createElement('img'); + markerImg.style.width = '25px'; + markerImg.src = + '//a.amap.com/jsapi_demos/static/demo-center/icons/poi-marker-default.png'; + markerContent.appendChild(markerImg); + const markerText = document.createElement('span'); + markerText.className = ns.b('popup-map-marker-text'); + markerText.textContent = address; + markerContent.appendChild(markerText); + marker.setContent(markerContent); + marker.setMap(map); + addressInfo.address = address; + addressInfo.longitude = lng; + addressInfo.latitude = lat; + searchValue.value = address; + } + }); + }; + + // 加载地图 + const loadMap = async () => { + try { + isLoading.value = true; + (window as IData)._AMapSecurityConfig = { + securityJsCode: ibiz.env.aMapSecurityJsCode, + }; + await AMapLoader.load({ + key: ibiz.env.aMapKey!, + version: '2.0', + plugins: ['AMap.PlaceSearch', 'AMap.Geocoder'], + AMapUI: { + version: '1.1', + plugins: ['misc/PoiPicker'], + }, + }); + } finally { + isLoading.value = false; + } + }; + + // 初始化地图 + const initMap = () => { + const AMap = (window as IData).AMap; + if (!AMap) { + return; + } + if (!mapContainerRef.value) { + return; + } + map = new AMap.Map(mapContainerRef.value, { + viewMode: '3D', + zoom: 11, + }); + map?.on('click', (e: IData) => { + const lnglat = e.lnglat; + const lng = lnglat.lng; + const lat = lnglat.lat; + if (lng != null && lat != null) { + addMarker(lng, lat); + getAddress(lng, lat); + } + }); + const AMapUI = (window as IData).AMapUI; + if (!AMapUI) { + return; + } + if (!searchInputRef.value || !searchResultContainerRef.value) { + return; + } + AMapUI.loadUI(['misc/PoiPicker'], function (PoiPicker: any) { + if ( + !searchInputRef.value || + !searchResultContainerRef.value || + !PoiPicker + ) { + return; + } + poiPicker = new PoiPicker({ + input: searchInputRef.value, + placeSearchOptions: { + map, + }, + searchResultsContainer: searchResultContainerRef.value, + }); + poiPicker?.on('poiPicked', function (poiResult: IData) { + clearMarker(); + const item = poiResult.item; + if (item) { + addressInfo.address = item.name; + addressInfo.longitude = item.location?.lng; + addressInfo.latitude = item.location?.lat; + searchValue.value = item.name; + if (poiResult.source !== 'search') { + poiPicker?.searchByKeyword(item.name); + } + } + }); + }); + }; + + // 处理对话框显示 + const handleShow = () => { + dialogVisible.value = true; + inputRef.value?.blur(); + nextTick(async () => { + if (!(window as IData).AMap) { + await loadMap(); + } + if (!map || !mapContainerRef.value?.children.length) { + map?.destroy(); + initMap(); + } + searchValue.value = props.value || ''; + if (props.data && longitudeName && latitudeName) { + const longitude = props.data[longitudeName]; + const latitude = props.data[latitudeName]; + if (longitude && latitude) { + map?.setCenter([longitude, latitude], true); + addMarker(longitude, latitude); + getAddress(longitude, latitude); + } + } + }); + }; + + // 处理确认按钮点击 + const handleConfirm = () => { + dialogVisible.value = false; + if (longitudeName) { + emit( + 'change', + addressInfo.longitude != null ? addressInfo.longitude : null, + longitudeName, + ); + } + if (latitudeName) { + emit( + 'change', + addressInfo.latitude != null ? addressInfo.latitude : null, + latitudeName, + ); + } + emit('change', addressInfo.address || ''); + // eslint-disable-next-line no-use-before-define + handleClose(); + }; + + // 处理对话框关闭 + const handleClose = () => { + dialogVisible.value = false; + if (poiPicker) { + poiPicker.clearSuggest(); + poiPicker.clearSearchResults(); + } + searchValue.value = ''; + addressInfo.address = ''; + addressInfo.longitude = null; + addressInfo.latitude = null; + clearMarker(); + }; + + // 处理输入框清空按钮点击 + const handleClear = (_e: MouseEvent) => { + _e.stopPropagation(); + if (longitudeName) { + emit('change', null, longitudeName); + } + if (latitudeName) { + emit('change', null, latitudeName); + } + + emit('change', ''); + handleClose(); + }; + + // 处理搜索输入框清空按钮点击 + const handleSearchClear = () => { + searchValue.value = ''; + addressInfo.address = ''; + addressInfo.longitude = null; + addressInfo.latitude = null; + clearMarker(); + }; + + onUnmounted(() => { + map?.destroy(); + }); + + return { + ns, + c, + inputRef, + searchRef, + mapContainerRef, + searchResultContainerRef, + dialogVisible, + isLoading, + searchValue, + handleShow, + handleConfirm, + handleClose, + handleClear, + handleSearchClear, + }; + }, + render() { + let content; + if (this.readonly) { + content = this.value; + } else { + content = [ + + {{ + button: () => { + if (this.readonly || !this.value) return; + return ; + }, + }} + , + + {{ + default: () => { + return ( +
+
+
+ +
+
+
+
+
+
+
+ + {ibiz.i18n.t('editor.common.cancel')} + + + {ibiz.i18n.t('editor.common.confirm')} + +
+
+ ); + }, + }} +
, + ]; + } + + return ( +
+ {content} +
+ ); + }, + }); diff --git a/src/editor/map-picker/index.ts b/src/editor/map-picker/index.ts new file mode 100644 index 00000000..d04930b0 --- /dev/null +++ b/src/editor/map-picker/index.ts @@ -0,0 +1,3 @@ +export { IBizMapPicker } from './ibiz-map-picker/ibiz-map-picker'; +export * from './map-picker-editor.controller'; +export * from './map-picker-editor.provider'; diff --git a/src/editor/map-picker/map-picker-editor.controller.ts b/src/editor/map-picker/map-picker-editor.controller.ts new file mode 100644 index 00000000..d8a97e1a --- /dev/null +++ b/src/editor/map-picker/map-picker-editor.controller.ts @@ -0,0 +1,10 @@ +import { EditorController } from '@ibiz-template/runtime'; +import { IMapPicker } from '@ibiz/model-core'; + +/** + * @description 地图选择器编辑器控制器 + * @export + * @class MapPickerEditorController + * @extends {EditorController} + */ +export class MapPickerEditorController extends EditorController {} diff --git a/src/editor/map-picker/map-picker-editor.provider.ts b/src/editor/map-picker/map-picker-editor.provider.ts new file mode 100644 index 00000000..bf841d1f --- /dev/null +++ b/src/editor/map-picker/map-picker-editor.provider.ts @@ -0,0 +1,27 @@ +import { + IEditorContainerController, + IEditorProvider, +} from '@ibiz-template/runtime'; +import { IMapPicker } from '@ibiz/model-core'; +import { MapPickerEditorController } from './map-picker-editor.controller'; + +/** + * @description 地图选择器编辑器适配器 + * @export + * @class MapPickerEditorProvider + * @implements {IEditorProvider} + */ +export class MapPickerEditorProvider implements IEditorProvider { + formEditor: string = 'IBizMapPicker'; + + gridEditor: string = 'IBizMapPicker'; + + async createController( + editorModel: IMapPicker, + parentController: IEditorContainerController, + ): Promise { + const c = new MapPickerEditorController(editorModel, parentController); + await c.init(); + return c; + } +} diff --git a/src/locale/en/index.ts b/src/locale/en/index.ts index 356bc725..6b5e2daa 100644 --- a/src/locale/en/index.ts +++ b/src/locale/en/index.ts @@ -190,6 +190,9 @@ export default { noSupportTreePicker: 'Drop-down tree selection is not supported', confirm: 'confirm', }, + mapPicker: { + searchPlaceholder: 'Please enter a keyword to select a location', + }, markdown: { uploadJsonFormatErr: 'The configuration of uploadparams did not follow the standard JSON format', diff --git a/src/locale/zh-CN/index.ts b/src/locale/zh-CN/index.ts index a2f1bd1b..cb093b8e 100644 --- a/src/locale/zh-CN/index.ts +++ b/src/locale/zh-CN/index.ts @@ -172,6 +172,9 @@ export default { noSupportTreePicker: '暂未支持树形下拉选择', confirm: '确定', }, + mapPicker: { + searchPlaceholder: '请输入关键字选择地点', + }, markdown: { uploadJsonFormatErr: '配置uploadparams没有按标准JSON格式', exportJsonFormatErr: '配置exportparams没有按标准JSON格式', -- Gitee From 192ae669fcea813e293446f544a3cfdb16f670cc Mon Sep 17 00:00:00 2001 From: lijianxiong <1518062161@qq.com> Date: Fri, 10 Oct 2025 20:39:16 +0800 Subject: [PATCH 3/3] =?UTF-8?q?feat=EF=BC=9A=E6=9B=B4=E6=96=B0CHANGELOG?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 159dd648..2138ac42 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,14 @@ ## [Unreleased] +### Added + +- 新增地图选择编辑器 + +### Change + +- 调整分页导航面板的激活项为主题样式 + ### Fixed - 修复下拉列表框显示代码表项数据,适配代码表配置了数值代码项 -- Gitee