import * as React from "react"; import styled from "styled-components"; import { Icon } from "./icon"; import { ImportModal } from "./import-modal"; import { ExportModal } from "./export-modal"; const Tools = styled.div` position: absolute; display: flex; flex-direction: column; top: 40px; left: 10px; `; export enum modes { DRAW_LINE_STRING = "draw_line_string", DRAW_POLYGON = "draw_polygon", DRAW_POINT = "draw_point", DRAW_RECTANGLE = "draw_rectangle", DRAW_CIRCLE = "draw_circle", SIMPLE_SELECT = "simple_select", DIRECT_SELECT = "direct_select", MEASURE_DISTANCE = "measure_distance", MEASURE_ANGLE = "measure_angle", MEASURE_AREA = "measure_area", STATIC = "static", } const Button = styled.button<{ active?: boolean; kind?: string }>` color: #fff; background: ${({ kind, active }) => kind === "danger" ? "rgb(180, 40, 40)" : active ? "rgb(30, 60, 80)" : "rgb(69, 102, 131)"}; font-size: 1em; font-weight: 400; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; border: 1px solid transparent; border-radius: 0.25em; margin: 0.05em; padding: 0.1em 0.2em; :hover { background: rgb(30, 60, 80); } `; const SubToolsContainer = styled.div` position: relative; `; const SubTools = styled.div` display: flex; flex-direction: row-reverse; position: absolute; top: 0; left: 0; `; export interface ToolboxOptions { viewModeEnabled?: boolean; drawPointModeEnabled?: boolean; drawLineModeEnabled?: boolean; drawPolygonModeEnabled?: boolean; drawRectangleModeEnabled?: boolean; drawCircleModeEnabled?: boolean; measureDistanceModeEnabled?: boolean; measureAngleModeEnabled?: boolean; measureAreaModeEnabled?: boolean; editModeEnabled?: boolean; moveModeEnabled?: boolean; importEnabled?: boolean; exportEnabled?: boolean; settingsModeEnabled?: boolean; // not implemented/tested yet deleteEnabled?: boolean; } export type Props = { mode: modes; modeConfig: any; geoJson: any; onSetMode: (mode: modes) => unknown; onSetModeConfig: (modeConfig: any) => unknown; onSetGeoJson: (geojson: any) => unknown; onImport: (imported: any) => unknown; options?: ToolboxOptions; }; const defaultToolBoxOptions: ToolboxOptions = { viewModeEnabled: true, drawPointModeEnabled: true, drawLineModeEnabled: true, drawPolygonModeEnabled: true, drawRectangleModeEnabled: true, drawCircleModeEnabled: true, measureDistanceModeEnabled: true, measureAngleModeEnabled: true, measureAreaModeEnabled: true, editModeEnabled: true, moveModeEnabled: true, importEnabled: true, exportEnabled: true, settingsModeEnabled: false, deleteEnabled: true, }; const MODE_GROUPS = [ { modes: [ { mode: modes.STATIC, content: , id: "viewMode", title: "Pointer", }, ], }, { modes: [ { mode: modes.DRAW_POINT, content: , id: "drawPointMode", title: "Teken Punt", }, ], }, { modes: [ { mode: modes.DRAW_LINE_STRING, content: , id: "drawLineMode", title: "Teken Lijn", }, ], }, { modes: [ { mode: modes.DRAW_POLYGON, content: , id: "drawPolygonMode", title: "Teken Polygoon", }, { mode: modes.DRAW_RECTANGLE, content: , id: "drawRectangleMode", title: "Teken Rechthoek", }, { mode: modes.DRAW_CIRCLE, content: , id: "drawCircleMode", title: "Teken Cirkel", }, ], }, { modes: [ { mode: modes.MEASURE_DISTANCE, content: , id: "measureDistanceMode", }, { mode: modes.MEASURE_ANGLE, content: , id: "measureAngleMode", }, { mode: modes.MEASURE_AREA, content: , id: "measureAreaMode", }, ], }, { modes: [ { mode: modes.SIMPLE_SELECT, content: , id: "editMode", title: "Bewerk", }, ], }, ]; const isButtonEnabled = (id: string, options: ToolboxOptions) => !!Object.keys(options).find((key) => `${id}Enabled` === key && options[key]); function ModeButton({ buttonConfig, mode, onClick }: any) { return ( ); } function ModeGroupButtons({ modeGroup, mode, onSetMode, options }: any) { const useOptions: ToolboxOptions = options; const [expanded, setExpanded] = React.useState(false); const { modes } = modeGroup; const mayShowMainButton = !!modes.find((m) => isButtonEnabled(m.id, useOptions), ); if (!mayShowMainButton) { return null; } let subTools = null; if (expanded) { subTools = ( {modes.map((buttonConfig, i) => { const mayShowCurrentButton = isButtonEnabled( buttonConfig.id, useOptions, ); if (!mayShowCurrentButton) return true; return ( { onSetMode(() => buttonConfig.mode); setExpanded(false); }} /> ); })} ); } // Get the button config if it is active otherwise, choose the first valid one that can be shown const buttonConfig = modes.find((m) => m.mode === mode) || modes.find((m) => isButtonEnabled(m.id, useOptions)); return ( {subTools} { onSetMode(() => buttonConfig.mode); setExpanded(true); }} /> ); } export function DrawToolbox({ mode, modeConfig, geoJson, onSetMode, onSetModeConfig, onSetGeoJson, onImport, options, }: Props) { const [showConfig, setShowConfig] = React.useState(false); const [showImport, setShowImport] = React.useState(false); const [showExport, setShowExport] = React.useState(false); const [showClearConfirmation, setShowClearConfirmation] = React.useState(false); const useOptions = { ...defaultToolBoxOptions, ...(options || {}) }; const { settingsModeEnabled, importEnabled, exportEnabled, deleteEnabled } = useOptions; return ( <> {MODE_GROUPS.map((modeGroup, i) => ( ))} {/* */} {exportEnabled && ( )} {importEnabled && ( )} {settingsModeEnabled && ( {showConfig && ( {/* */} )} )} {deleteEnabled && ( {showClearConfirmation && ( )} )} {/* zoom in and out */} {showImport && ( { onImport(imported); setShowImport(false); }} onClose={() => setShowImport(false)} /> )} {showExport && ( setShowExport(false)} /> )} ); }