From 40180cbf818a0eeea15f5f49f88885f1669a2b46 Mon Sep 17 00:00:00 2001 From: Cmen <1176967590@qq.com> Date: Sun, 6 Mar 2022 19:52:32 +0800 Subject: [PATCH] =?UTF-8?q?=E6=94=AF=E6=8C=81=E8=AE=BE=E7=BD=AE=E8=A6=86?= =?UTF-8?q?=E7=9B=96=E7=89=A9=E5=B1=9E=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/editor/Property/index.less | 3 ++ src/editor/Property/index.tsx | 73 ++++++++++++++++++++++++++++++-- src/map/type.ts | 11 ++++- src/store/actions/StoreAction.ts | 7 +++ src/store/actions/index.ts | 3 +- src/store/index.ts | 2 + src/store/reducers/index.ts | 11 +++++ 7 files changed, 103 insertions(+), 7 deletions(-) diff --git a/src/editor/Property/index.less b/src/editor/Property/index.less index e69de29..0789f7b 100644 --- a/src/editor/Property/index.less +++ b/src/editor/Property/index.less @@ -0,0 +1,3 @@ +.property-area{ + padding: 8px; +} \ No newline at end of file diff --git a/src/editor/Property/index.tsx b/src/editor/Property/index.tsx index 2600cb3..dfb96ce 100644 --- a/src/editor/Property/index.tsx +++ b/src/editor/Property/index.tsx @@ -1,10 +1,75 @@ -import { useSelector } from "react-redux"; -import { selectedIdsSelector, mapOptionsSelector } from "@store"; +import { useDispatch, useSelector } from "react-redux"; +import { Form, Input, Select } from "antd"; +import { selectedIdsSelector, mapOptionsSelector, StoreAction } from "@store"; +import { OverlayCategory, IOverlay } from "@map"; + +import "./index.less"; +import { OverlayTypes } from "@types"; + +type CategoryItem = { + title: string; + value: OverlayCategory; +}; + +const { Option } = Select; const Property = () => { const selectedIds = useSelector(selectedIdsSelector); - // const { } = useSelector(mapOptionsSelector); - return

属性区域

; + const { overlays } = useSelector(mapOptionsSelector); + const dispatch = useDispatch(); + if (!selectedIds?.length) return <>; + const [id] = selectedIds; + const overlay = overlays.find((overlay) => overlay.id === id)!; + + const updateOverlayProps = (props: Partial) => { + dispatch(StoreAction.updateOverlayProps(props)); + }; + + const categorys: CategoryItem[] = []; + if (overlay.type === OverlayTypes.Polyline) { + categorys.push({ title: "道路", value: OverlayCategory.Road }); + } else { + categorys.push( + { title: "建筑", value: OverlayCategory.Building }, + { title: "河流", value: OverlayCategory.Water }, + { title: "草地", value: OverlayCategory.Grass } + ); + } + + return ( +
+
+ + + updateOverlayProps({ + id: overlay.id, + name: e.target.value, + }) + } + /> + + + + +
+
+ ); }; export default Property; diff --git a/src/map/type.ts b/src/map/type.ts index 65029b7..7d55525 100644 --- a/src/map/type.ts +++ b/src/map/type.ts @@ -13,6 +13,13 @@ export interface IMapEditor { getZoom(): number; } +export enum OverlayCategory { + Building = "building", + Water = "water", + Road = "road", + Grass = "grass", +} + export interface IOverlay { id: string; name: string; @@ -21,8 +28,8 @@ export interface IOverlay { path?: GeoJSON.Position[]; radius?: number; backgroundImage?: string; - category?: string; - height?: string; + category?: OverlayCategory; + height?: number; } export interface IMapOptions { overlays: IOverlay[]; diff --git a/src/store/actions/StoreAction.ts b/src/store/actions/StoreAction.ts index bb2e13d..ad5a6ed 100644 --- a/src/store/actions/StoreAction.ts +++ b/src/store/actions/StoreAction.ts @@ -8,6 +8,7 @@ export enum ActionTypes { DeleteOverlays = "deleteOverlays", ReplaceState = "replaceState", ClearOverlays = "clearOverlays", + UpdateOverlayProps = "updateOverlayProps", } type ActionCreator = (payload?: any) => { @@ -51,4 +52,10 @@ export const StoreAction: Record = { type: ActionTypes.ClearOverlays, }; }, + updateOverlayProps(payload: Partial) { + return { + type: ActionTypes.UpdateOverlayProps, + payload, + }; + }, }; diff --git a/src/store/actions/index.ts b/src/store/actions/index.ts index 9c14b71..dc4b56b 100644 --- a/src/store/actions/index.ts +++ b/src/store/actions/index.ts @@ -10,7 +10,7 @@ import { StoreAction } from "./StoreAction"; import { IStore } from "../type"; import { initState } from "../initState"; -export { ActionTypes } from "./StoreAction"; +export { ActionTypes, StoreAction } from "./StoreAction"; export class EditorAction { mapEditor: IMapEditor | null = null; @@ -58,6 +58,7 @@ export class EditorAction { zoom: this.mapEditor?.getZoom(), }) ); + console.log("saved!"); }, 10000); } // ---------- public methods ------------- diff --git a/src/store/index.ts b/src/store/index.ts index fb3005c..3bd1e91 100644 --- a/src/store/index.ts +++ b/src/store/index.ts @@ -10,6 +10,8 @@ export * from "./type"; export * from "./selectors"; export * from "./constants"; +export { StoreAction } from "./actions"; + // export { EditorAction }; declare global { diff --git a/src/store/reducers/index.ts b/src/store/reducers/index.ts index 491655e..091fdfc 100644 --- a/src/store/reducers/index.ts +++ b/src/store/reducers/index.ts @@ -9,6 +9,8 @@ import { clearOverlays, } from "./map"; +import { IOverlay } from "@map"; + export type Action = { type: ActionTypes; payload?: any; @@ -23,8 +25,17 @@ const actionReducers: Record = { [ActionTypes.DeleteOverlays]: deleteOverlays, [ActionTypes.ReplaceState]: replaceState, [ActionTypes.ClearOverlays]: clearOverlays, + [ActionTypes.UpdateOverlayProps]: updateOverlayProps, }; +function updateOverlayProps(state = initState, payload: Partial) { + return produce(state, (draft) => { + const { id, ...rest } = payload; + const overlay = draft.map.overlays.find((overlay) => overlay.id === id); + Object.assign(overlay, rest); + }); +} + function replaceState(state = initState, payload: IEditorState) { return payload; }