qwc2 2025.3.31
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +28 -0
- package/README.md +68 -0
- package/actions/display.js +7 -0
- package/actions/editing.js +7 -0
- package/actions/layerinfo.js +7 -0
- package/actions/layers.js +8 -0
- package/actions/localConfig.js +7 -0
- package/actions/locale.js +10 -0
- package/actions/locate.js +8 -0
- package/actions/logging.js +7 -0
- package/actions/map.js +15 -0
- package/actions/measurement.js +8 -0
- package/actions/processNotifications.js +7 -0
- package/actions/redlining.js +7 -0
- package/actions/redliningPick.js +7 -0
- package/actions/serviceinfo.js +7 -0
- package/actions/task.js +9 -0
- package/actions/theme.js +24 -0
- package/actions/windows.js +10 -0
- package/components/AppMenu.js +8 -0
- package/components/AttributeForm.js +34 -0
- package/components/AutoEditForm.js +8 -0
- package/components/CoordinateDisplayer.js +7 -0
- package/components/EditComboField.js +10 -0
- package/components/EditUploadField.js +8 -0
- package/components/FullscreenSwitcher.js +8 -0
- package/components/Icon.js +7 -0
- package/components/IdentifyViewer.js +16 -0
- package/components/ImportLayer.js +25 -0
- package/components/LayerInfoWindow.js +7 -0
- package/components/LinkFeatureForm.js +10 -0
- package/components/MapSelection.js +13 -0
- package/components/NumericInputWindow.js +7 -0
- package/components/PickFeature.js +7 -0
- package/components/PluginsContainer.js +8 -0
- package/components/PrintSelection.js +54 -0
- package/components/QtDesignerForm.js +30 -0
- package/components/ResizeableWindow.js +12 -0
- package/components/SearchBox.js +26 -0
- package/components/ServiceInfoWindow.js +7 -0
- package/components/SideBar.js +9 -0
- package/components/StandardApp.js +35 -0
- package/components/Swipeable.js +1 -0
- package/components/TaskBar.js +7 -0
- package/components/ThemeLayersListWindow.js +9 -0
- package/components/ThemeList.js +12 -0
- package/components/Toolbar.js +7 -0
- package/components/WindowManager.js +7 -0
- package/components/map/OlLayer.js +12 -0
- package/components/map/OlLocate.css +56 -0
- package/components/map/OlLocate.js +17 -0
- package/components/map/OlMap.js +11 -0
- package/components/map/layers/BingLayer.js +8 -0
- package/components/map/layers/GoogleLayer.js +27 -0
- package/components/map/layers/GraticuleLayer.js +8 -0
- package/components/map/layers/ImageLayer.js +8 -0
- package/components/map/layers/MVTLayer.js +7 -0
- package/components/map/layers/OSMLayer.js +8 -0
- package/components/map/layers/OverlayLayer.js +10 -0
- package/components/map/layers/VectorLayer.js +14 -0
- package/components/map/layers/WFSLayer.js +11 -0
- package/components/map/layers/WMSLayer.js +11 -0
- package/components/map/layers/WMTSLayer.js +9 -0
- package/components/map/layers/XYZLayer.js +7 -0
- package/components/map/layers/index.js +8 -0
- package/components/map3d/BottomBar3D.js +7 -0
- package/components/map3d/Compare3D.js +12 -0
- package/components/map3d/Draw3D.js +10 -0
- package/components/map3d/ExportObjects3D.js +17 -0
- package/components/map3d/HeightProfile3D.js +8 -0
- package/components/map3d/HideObjects3D.js +12 -0
- package/components/map3d/Identify3D.js +13 -0
- package/components/map3d/LayerTree3D.js +8 -0
- package/components/map3d/Map3D.js +29 -0
- package/components/map3d/Map3DLight.js +10 -0
- package/components/map3d/MapControls3D.js +20 -0
- package/components/map3d/MapExport3D.js +11 -0
- package/components/map3d/Measure3D.js +23 -0
- package/components/map3d/OverviewMap3D.js +9 -0
- package/components/map3d/SearchField3D.js +16 -0
- package/components/map3d/TopBar3D.js +7 -0
- package/components/map3d/View3DSwitcher.js +7 -0
- package/components/map3d/drawtool/CreateTool3D.js +9 -0
- package/components/map3d/drawtool/EditTool3D.js +9 -0
- package/components/map3d/drawtool/NumericInput3D.js +7 -0
- package/components/map3d/img/viewcone.svg +124 -0
- package/components/map3d/layers/VectorLayer3D.js +7 -0
- package/components/map3d/layers/WFSLayer3D.js +8 -0
- package/components/map3d/layers/WMSLayer3D.js +7 -0
- package/components/map3d/layers/WMTSLayer3D.js +9 -0
- package/components/map3d/layers/index.js +8 -0
- package/components/map3d/models/arrow.glb +0 -0
- package/components/map3d/models/pin.glb +0 -0
- package/components/map3d/slices/map3d.js +1 -0
- package/components/map3d/style/BottomBar3D.css +67 -0
- package/components/map3d/style/Compare3D.css +57 -0
- package/components/map3d/style/Draw3D.css +7 -0
- package/components/map3d/style/HideObjects3D.css +29 -0
- package/components/map3d/style/LayerTree3D.css +126 -0
- package/components/map3d/style/Map3D.css +42 -0
- package/components/map3d/style/Map3DLight.css +72 -0
- package/components/map3d/style/MapControls3D.css +56 -0
- package/components/map3d/style/MapExport3D.css +25 -0
- package/components/map3d/style/OverviewMap3D.css +37 -0
- package/components/map3d/style/SearchField3D.css +7 -0
- package/components/map3d/style/View3DSwitcher.css +27 -0
- package/components/map3d/utils/Tiles3DStyle.js +1 -0
- package/components/share/ShareLink.js +7 -0
- package/components/share/ShareQRCode.js +8 -0
- package/components/share/ShareSocials.js +9 -0
- package/components/share/style/ShareLink.css +13 -0
- package/components/share/style/ShareSocials.css +9 -0
- package/components/style/App.css +229 -0
- package/components/style/AppMenu.css +162 -0
- package/components/style/AttributeForm.css +57 -0
- package/components/style/AutoEditForm.css +64 -0
- package/components/style/DefaultColorScheme.css +60 -0
- package/components/style/EditUploadField.css +103 -0
- package/components/style/FullscreenSwitcher.css +25 -0
- package/components/style/Icon.css +26 -0
- package/components/style/IdentifyViewer.css +249 -0
- package/components/style/ImportLayer.css +28 -0
- package/components/style/LayerInfoWindow.css +46 -0
- package/components/style/LinkFeatureForm.css +48 -0
- package/components/style/NumericInputWindow.css +11 -0
- package/components/style/PickFeature.css +25 -0
- package/components/style/PluginsContainer.css +4 -0
- package/components/style/QtDesignerForm.css +225 -0
- package/components/style/ResizeableWindow.css +178 -0
- package/components/style/SearchBox.css +159 -0
- package/components/style/ServiceInfoWindow.css +34 -0
- package/components/style/SideBar.css +100 -0
- package/components/style/TaskBar.css +35 -0
- package/components/style/ThemeLayersListWindow.css +47 -0
- package/components/style/ThemeList.css +200 -0
- package/components/style/Toolbar.css +20 -0
- package/components/style/WindowManager.css +50 -0
- package/components/timeline/FixedTimeline.js +10 -0
- package/components/timeline/InfiniteTimeline.js +13 -0
- package/components/timeline/TimelineFeaturesSlider.js +10 -0
- package/components/timeline/style/FixedTimeline.css +76 -0
- package/components/timeline/style/InfiniteTimeline.css +94 -0
- package/components/timeline/style/TimelineFeaturesSlider.css +131 -0
- package/components/widgets/AccordeonWidget.js +7 -0
- package/components/widgets/ButtonBar.js +7 -0
- package/components/widgets/ColorButton.js +8 -0
- package/components/widgets/ComboBox.js +7 -0
- package/components/widgets/CopyButton.js +7 -0
- package/components/widgets/DateTimeInput.js +8 -0
- package/components/widgets/EditableSelect.js +8 -0
- package/components/widgets/FileSelector.js +9 -0
- package/components/widgets/Input.js +7 -0
- package/components/widgets/InputContainer.js +7 -0
- package/components/widgets/LayerCatalogWidget.js +3 -0
- package/components/widgets/MenuButton.js +1 -0
- package/components/widgets/ModalDialog.js +7 -0
- package/components/widgets/NavBar.js +7 -0
- package/components/widgets/NumberInput.js +9 -0
- package/components/widgets/PopupMenu.js +1 -0
- package/components/widgets/Primitives.js +7 -0
- package/components/widgets/ReCaptchaWidget.js +1 -0
- package/components/widgets/SearchWidget.js +7 -0
- package/components/widgets/Spinner.js +6 -0
- package/components/widgets/SuggestionInput.js +7 -0
- package/components/widgets/TextInput.js +7 -0
- package/components/widgets/ToggleSwitch.js +7 -0
- package/components/widgets/VectorLayerPicker.js +8 -0
- package/components/widgets/style/AccordeonWidget.css +22 -0
- package/components/widgets/style/ButtonBar.css +88 -0
- package/components/widgets/style/ColorButton.css +88 -0
- package/components/widgets/style/ComboBox.css +83 -0
- package/components/widgets/style/CopyButton.css +21 -0
- package/components/widgets/style/EditableSelect.css +47 -0
- package/components/widgets/style/FileSelector.css +14 -0
- package/components/widgets/style/InputContainer.css +34 -0
- package/components/widgets/style/LayerCatalogWidget.css +59 -0
- package/components/widgets/style/MenuButton.css +122 -0
- package/components/widgets/style/ModalDialog.css +50 -0
- package/components/widgets/style/NavBar.css +12 -0
- package/components/widgets/style/NumberInput.css +76 -0
- package/components/widgets/style/SearchWidget.css +43 -0
- package/components/widgets/style/Spinner.css +32 -0
- package/components/widgets/style/SuggestionInput.css +8 -0
- package/components/widgets/style/TextInput.css +94 -0
- package/components/widgets/style/ToggleSwitch.css +61 -0
- package/components/widgets/style/VectorLayerPicker.css +3 -0
- package/icons/2d.svg +70 -0
- package/icons/3d.svg +70 -0
- package/icons/3d2d.svg +92 -0
- package/icons/after.svg +76 -0
- package/icons/arrow-down.svg +60 -0
- package/icons/arrow-up.svg +60 -0
- package/icons/before.svg +76 -0
- package/icons/bglayer.svg +71 -0
- package/icons/bookmark.svg +170 -0
- package/icons/box.svg +63 -0
- package/icons/buffer.svg +67 -0
- package/icons/camera.svg +118 -0
- package/icons/catalog.svg +62 -0
- package/icons/checked.svg +80 -0
- package/icons/chevron-down.svg +60 -0
- package/icons/chevron-left.svg +59 -0
- package/icons/chevron-right.svg +60 -0
- package/icons/chevron-up.svg +60 -0
- package/icons/circle.svg +70 -0
- package/icons/clear.svg +62 -0
- package/icons/clock.svg +71 -0
- package/icons/cog.svg +60 -0
- package/icons/collapse.svg +73 -0
- package/icons/compare.svg +72 -0
- package/icons/cone.svg +58 -0
- package/icons/confirm.svg +62 -0
- package/icons/copy.svg +60 -0
- package/icons/cuboid.svg +58 -0
- package/icons/cyclomedia.svg +47 -0
- package/icons/cylinder.svg +58 -0
- package/icons/dataimport.svg +116 -0
- package/icons/detach.svg +79 -0
- package/icons/dock.svg +82 -0
- package/icons/dock_bottom.svg +82 -0
- package/icons/dock_left.svg +84 -0
- package/icons/dock_right.svg +84 -0
- package/icons/dock_top.svg +84 -0
- package/icons/draw.svg +78 -0
- package/icons/editdraw.svg +84 -0
- package/icons/edited.svg +78 -0
- package/icons/editing.svg +118 -0
- package/icons/ellipse.svg +72 -0
- package/icons/embed.svg +88 -0
- package/icons/expand.svg +73 -0
- package/icons/export.svg +126 -0
- package/icons/eye.svg +127 -0
- package/icons/featureform.svg +115 -0
- package/icons/fill.svg +62 -0
- package/icons/filter.svg +69 -0
- package/icons/folder-open.svg +60 -0
- package/icons/freehand.svg +82 -0
- package/icons/group.svg +76 -0
- package/icons/home.svg +60 -0
- package/icons/identify_radius.svg +71 -0
- package/icons/identify_region.svg +71 -0
- package/icons/import.svg +62 -0
- package/icons/info-sign.svg +60 -0
- package/icons/info.svg +80 -0
- package/icons/layers.svg +71 -0
- package/icons/light.svg +77 -0
- package/icons/line.svg +61 -0
- package/icons/line_buffer.svg +65 -0
- package/icons/link.svg +75 -0
- package/icons/list-alt.svg +111 -0
- package/icons/lock.svg +54 -0
- package/icons/login.svg +56 -0
- package/icons/logout.svg +56 -0
- package/icons/map3d.svg +51 -0
- package/icons/maximize.svg +84 -0
- package/icons/measure.svg +82 -0
- package/icons/measure_line.svg +87 -0
- package/icons/measure_polygon.svg +88 -0
- package/icons/menu-hamburger.svg +60 -0
- package/icons/minimize.svg +76 -0
- package/icons/minus-sign.svg +60 -0
- package/icons/minus.svg +61 -0
- package/icons/nav-end.svg +74 -0
- package/icons/nav-left.svg +74 -0
- package/icons/nav-right.svg +74 -0
- package/icons/nav-start.svg +73 -0
- package/icons/new.svg +84 -0
- package/icons/nodetool.svg +68 -0
- package/icons/numericinput.svg +86 -0
- package/icons/ok.svg +60 -0
- package/icons/open.svg +79 -0
- package/icons/open_link.svg +74 -0
- package/icons/paint.svg +75 -0
- package/icons/pen.svg +41 -0
- package/icons/person.svg +44 -0
- package/icons/pick.svg +67 -0
- package/icons/pick_point.svg +74 -0
- package/icons/pick_region.svg +71 -0
- package/icons/plus.svg +60 -0
- package/icons/point.svg +67 -0
- package/icons/point_buffer.svg +74 -0
- package/icons/polygon.svg +61 -0
- package/icons/print.svg +60 -0
- package/icons/pyramid.svg +58 -0
- package/icons/radio_checked.svg +78 -0
- package/icons/radio_tristate.svg +75 -0
- package/icons/radio_unchecked.svg +72 -0
- package/icons/rasterexport.svg +124 -0
- package/icons/rect.svg +63 -0
- package/icons/refresh.svg +44 -0
- package/icons/remove.svg +60 -0
- package/icons/report.svg +84 -0
- package/icons/routing-bicycle.svg +40 -0
- package/icons/routing-bus.svg +40 -0
- package/icons/routing-cablecar.svg +40 -0
- package/icons/routing-car.svg +40 -0
- package/icons/routing-ship.svg +40 -0
- package/icons/routing-train.svg +40 -0
- package/icons/routing-tram.svg +40 -0
- package/icons/routing-truck.svg +40 -0
- package/icons/routing-walking.svg +40 -0
- package/icons/routing.svg +68 -0
- package/icons/save.svg +190 -0
- package/icons/scale.svg +62 -0
- package/icons/screenshot.svg +60 -0
- package/icons/search.svg +60 -0
- package/icons/selectbox.svg +79 -0
- package/icons/share.svg +64 -0
- package/icons/snap_edge.svg +79 -0
- package/icons/snap_vertex.svg +79 -0
- package/icons/sphere.svg +58 -0
- package/icons/square.svg +68 -0
- package/icons/sync.svg +72 -0
- package/icons/text.svg +68 -0
- package/icons/themes.svg +81 -0
- package/icons/tilt-down.svg +67 -0
- package/icons/tilt-left.svg +48 -0
- package/icons/tilt-right.svg +48 -0
- package/icons/tilt-up.svg +67 -0
- package/icons/today.svg +45 -0
- package/icons/tools.svg +77 -0
- package/icons/transformtool.svg +74 -0
- package/icons/transparency.svg +132 -0
- package/icons/trash.svg +60 -0
- package/icons/tree_minus.svg +81 -0
- package/icons/tree_plus.svg +81 -0
- package/icons/triangle-down.svg +59 -0
- package/icons/triangle-left.svg +60 -0
- package/icons/triangle-right.svg +60 -0
- package/icons/triangle-up.svg +59 -0
- package/icons/tristate.svg +79 -0
- package/icons/unchecked.svg +74 -0
- package/icons/undock.svg +82 -0
- package/icons/undock_bottom.svg +82 -0
- package/icons/undock_left.svg +82 -0
- package/icons/undock_right.svg +84 -0
- package/icons/undock_top.svg +84 -0
- package/icons/unmaximize.svg +84 -0
- package/icons/unminimize.svg +76 -0
- package/icons/up-down-arrow.svg +66 -0
- package/icons/warning.svg +72 -0
- package/icons/wedge.svg +58 -0
- package/icons/zoom.svg +60 -0
- package/icons/zoomin.svg +71 -0
- package/icons/zoomout.svg +80 -0
- package/libs/openlayers.js +11 -0
- package/package.json +135 -0
- package/plugins/API.js +114 -0
- package/plugins/AttributeTable.js +25 -0
- package/plugins/Authentication.js +13 -0
- package/plugins/BackgroundSwitcher.js +10 -0
- package/plugins/Bookmark.js +13 -0
- package/plugins/BottomBar.js +10 -0
- package/plugins/CookiePopup.js +9 -0
- package/plugins/Cyclomedia.js +11 -0
- package/plugins/Editing.js +21 -0
- package/plugins/FeatureForm.js +21 -0
- package/plugins/FeatureSearch.js +11 -0
- package/plugins/GeometryDigitizer.js +43 -0
- package/plugins/HeightProfile.js +26 -0
- package/plugins/Help.js +11 -0
- package/plugins/HomeButton.js +9 -0
- package/plugins/Identify.js +18 -0
- package/plugins/LayerCatalog.js +45 -0
- package/plugins/LayerTree.js +15 -0
- package/plugins/LocateButton.js +10 -0
- package/plugins/Map.js +22 -0
- package/plugins/MapCompare.js +11 -0
- package/plugins/MapCopyright.js +11 -0
- package/plugins/MapExport.js +23 -0
- package/plugins/MapFilter.js +20 -0
- package/plugins/MapInfoTooltip.js +32 -0
- package/plugins/MapLegend.js +14 -0
- package/plugins/MapTip.js +15 -0
- package/plugins/Measure.js +10 -0
- package/plugins/NewsPopup.js +12 -0
- package/plugins/Panoramax.js +10 -0
- package/plugins/Portal.js +10 -0
- package/plugins/Print.js +22 -0
- package/plugins/ProcessNotifications.js +11 -0
- package/plugins/Redlining.js +12 -0
- package/plugins/Reports.js +15 -0
- package/plugins/Routing.js +23 -0
- package/plugins/ScratchDrawing.js +15 -0
- package/plugins/Settings.js +12 -0
- package/plugins/Share.js +11 -0
- package/plugins/StartupMarker.js +12 -0
- package/plugins/TaskButton.js +9 -0
- package/plugins/ThemeSwitcher.js +10 -0
- package/plugins/TimeManager.js +21 -0
- package/plugins/TopBar.js +13 -0
- package/plugins/ValueTool.js +11 -0
- package/plugins/View3D.js +34 -0
- package/plugins/ZoomButtons.js +11 -0
- package/plugins/map/EditingSupport.js +13 -0
- package/plugins/map/LocateSupport.js +14 -0
- package/plugins/map/MeasurementSupport.js +15 -0
- package/plugins/map/OverviewSupport.js +14 -0
- package/plugins/map/RedliningPickSupport.js +12 -0
- package/plugins/map/RedliningSupport.js +28 -0
- package/plugins/map/ScaleBarSupport.js +10 -0
- package/plugins/map/SnapInteraction.js +1 -0
- package/plugins/map/SnapSupport.js +7 -0
- package/plugins/map/SnappingSupport.js +23 -0
- package/plugins/map/style/OverviewSupport.css +42 -0
- package/plugins/map/style/ScaleBarSupport.css +18 -0
- package/plugins/map/style/SnappingSupport.css +33 -0
- package/plugins/redlining/RedliningBufferSupport.js +8 -0
- package/plugins/style/AttributeTable.css +220 -0
- package/plugins/style/Authentication.css +16 -0
- package/plugins/style/BackgroundSwitcher.css +99 -0
- package/plugins/style/Bookmark.css +62 -0
- package/plugins/style/BottomBar.css +53 -0
- package/plugins/style/Buttons.css +68 -0
- package/plugins/style/CookiePopup.css +24 -0
- package/plugins/style/Cyclomedia.css +66 -0
- package/plugins/style/Editing.css +40 -0
- package/plugins/style/FeatureForm.css +21 -0
- package/plugins/style/FeatureSearch.css +71 -0
- package/plugins/style/GeometryDigitizer.css +28 -0
- package/plugins/style/HeightProfile.css +26 -0
- package/plugins/style/Identify.css +4 -0
- package/plugins/style/LayerCatalog.css +8 -0
- package/plugins/style/LayerTree.css +316 -0
- package/plugins/style/Map.css +43 -0
- package/plugins/style/MapCompare.css +27 -0
- package/plugins/style/MapCopyright.css +17 -0
- package/plugins/style/MapExport.css +55 -0
- package/plugins/style/MapFilter.css +101 -0
- package/plugins/style/MapInfoTooltip.css +78 -0
- package/plugins/style/MapLegend.css +36 -0
- package/plugins/style/MapTip.css +22 -0
- package/plugins/style/Measure.css +23 -0
- package/plugins/style/NewsPopup.css +87 -0
- package/plugins/style/Panoramax.css +15 -0
- package/plugins/style/Portal.css +115 -0
- package/plugins/style/Print.css +116 -0
- package/plugins/style/ProcessNotifications.css +55 -0
- package/plugins/style/Redlining.css +101 -0
- package/plugins/style/Reports.css +11 -0
- package/plugins/style/Routing.css +243 -0
- package/plugins/style/ScratchDrawing.css +8 -0
- package/plugins/style/Settings.css +11 -0
- package/plugins/style/Share.css +59 -0
- package/plugins/style/ThemeSwitcher.css +7 -0
- package/plugins/style/TimeManager.css +91 -0
- package/plugins/style/TopBar.css +50 -0
- package/plugins/style/ValueTool.css +60 -0
- package/reducers/display.js +7 -0
- package/reducers/editing.js +8 -0
- package/reducers/index.js +7 -0
- package/reducers/layerinfo.js +7 -0
- package/reducers/layers.js +14 -0
- package/reducers/localConfig.js +8 -0
- package/reducers/locale.js +8 -0
- package/reducers/locate.js +8 -0
- package/reducers/map.js +11 -0
- package/reducers/measurement.js +8 -0
- package/reducers/processNotifications.js +7 -0
- package/reducers/redlining.js +7 -0
- package/reducers/redliningPick.js +7 -0
- package/reducers/serviceinfo.js +7 -0
- package/reducers/task.js +7 -0
- package/reducers/theme.js +7 -0
- package/reducers/windows.js +7 -0
- package/scripts/dist.sh +16 -0
- package/scripts/gen-plugin-docs.js +9 -0
- package/scripts/makeIconkit.js +7 -0
- package/scripts/package-commands.bat +8 -0
- package/scripts/package-commands.sh +22 -0
- package/scripts/themesConfig.js +48 -0
- package/scripts/themesConfig.py +659 -0
- package/scripts/translateui.sh +51 -0
- package/scripts/updateTranslations.js +17 -0
- package/scripts/wmts_config_generator.py +169 -0
- package/selectors/searchproviders.js +12 -0
- package/static/translations/bg-BG.json +709 -0
- package/static/translations/ca-ES.json +709 -0
- package/static/translations/cs-CZ.json +709 -0
- package/static/translations/de-CH.json +709 -0
- package/static/translations/de-DE.json +709 -0
- package/static/translations/en-US.json +709 -0
- package/static/translations/es-ES.json +709 -0
- package/static/translations/fi-FI.json +709 -0
- package/static/translations/fr-FR.json +709 -0
- package/static/translations/hu-HU.json +709 -0
- package/static/translations/it-IT.json +709 -0
- package/static/translations/ja-JP.json +709 -0
- package/static/translations/nl-NL.json +709 -0
- package/static/translations/no-NO.json +709 -0
- package/static/translations/pl-PL.json +709 -0
- package/static/translations/pt-BR.json +709 -0
- package/static/translations/pt-PT.json +709 -0
- package/static/translations/ro-RO.json +709 -0
- package/static/translations/ru-RU.json +709 -0
- package/static/translations/sv-SE.json +709 -0
- package/static/translations/tr-TR.json +709 -0
- package/static/translations/tsconfig.json +606 -0
- package/stores/StandardStore.js +8 -0
- package/utils/ConfigUtils.js +9 -0
- package/utils/CoordinatesUtils.js +29 -0
- package/utils/DxfUtils.js +10 -0
- package/utils/EditingInterface.js +67 -0
- package/utils/EditingUtils.js +11 -0
- package/utils/FeatureStyles.js +10 -0
- package/utils/IdentifyUtils.js +12 -0
- package/utils/ImageEditor.js +15 -0
- package/utils/LayerUtils.js +57 -0
- package/utils/LocaleUtils.js +9 -0
- package/utils/MapUtils.js +66 -0
- package/utils/MeasureUtils.js +9 -0
- package/utils/MiscUtils.js +15 -0
- package/utils/PermaLinkUtils.js +11 -0
- package/utils/ResourceRegistry.js +7 -0
- package/utils/RoutingInterface.js +12 -0
- package/utils/SearchProviders.js +19 -0
- package/utils/ServiceLayerUtils.js +20 -0
- package/utils/Signal.js +2 -0
- package/utils/ThemeUtils.js +12 -0
- package/utils/VectorLayerUtils.js +20 -0
- package/utils/expr_grammar/README.md +3 -0
- package/utils/expr_grammar/grammar.js +3 -0
- package/utils/expr_grammar/grammar.ne +118 -0
- package/utils/expr_grammar/test.js +13 -0
- package/utils/img/README.markers +1 -0
- package/utils/img/arrowhead.svg +4 -0
- package/utils/img/marker-icon.png +0 -0
- package/utils/img/measurehead.svg +4 -0
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
function _typeof(o){"@babel/helpers - typeof";return _typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(o){return typeof o}:function(o){return o&&"function"==typeof Symbol&&o.constructor===Symbol&&o!==Symbol.prototype?"symbol":typeof o},_typeof(o)}function _slicedToArray(r,e){return _arrayWithHoles(r)||_iterableToArrayLimit(r,e)||_unsupportedIterableToArray(r,e)||_nonIterableRest()}function _nonIterableRest(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function _iterableToArrayLimit(r,l){var t=null==r?null:"undefined"!=typeof Symbol&&r[Symbol.iterator]||r["@@iterator"];if(null!=t){var e,n,i,u,a=[],f=!0,o=!1;try{if(i=(t=t.call(r)).next,0===l){if(Object(t)!==t)return;f=!1}else for(;!(f=(e=i.call(t)).done)&&(a.push(e.value),a.length!==l);f=!0);}catch(r){o=!0,n=r}finally{try{if(!f&&null!=t["return"]&&(u=t["return"](),Object(u)!==u))return}finally{if(o)throw n}}return a}}function _arrayWithHoles(r){if(Array.isArray(r))return r}function _toConsumableArray(r){return _arrayWithoutHoles(r)||_iterableToArray(r)||_unsupportedIterableToArray(r)||_nonIterableSpread()}function _nonIterableSpread(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function _unsupportedIterableToArray(r,a){if(r){if("string"==typeof r)return _arrayLikeToArray(r,a);var t={}.toString.call(r).slice(8,-1);return"Object"===t&&r.constructor&&(t=r.constructor.name),"Map"===t||"Set"===t?Array.from(r):"Arguments"===t||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t)?_arrayLikeToArray(r,a):void 0}}function _iterableToArray(r){if("undefined"!=typeof Symbol&&null!=r[Symbol.iterator]||null!=r["@@iterator"])return Array.from(r)}function _arrayWithoutHoles(r){if(Array.isArray(r))return _arrayLikeToArray(r)}function _arrayLikeToArray(r,a){(null==a||a>r.length)&&(a=r.length);for(var e=0,n=Array(a);e<a;e++)n[e]=r[e];return n}function ownKeys(e,r){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);r&&(o=o.filter(function(r){return Object.getOwnPropertyDescriptor(e,r).enumerable})),t.push.apply(t,o)}return t}function _objectSpread(e){for(var r=1;r<arguments.length;r++){var t=null!=arguments[r]?arguments[r]:{};r%2?ownKeys(Object(t),!0).forEach(function(r){_defineProperty(e,r,t[r])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):ownKeys(Object(t)).forEach(function(r){Object.defineProperty(e,r,Object.getOwnPropertyDescriptor(t,r))})}return e}function _classCallCheck(a,n){if(!(a instanceof n))throw new TypeError("Cannot call a class as a function")}function _defineProperties(e,r){for(var t=0;t<r.length;t++){var o=r[t];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(e,_toPropertyKey(o.key),o)}}function _createClass(e,r,t){return r&&_defineProperties(e.prototype,r),t&&_defineProperties(e,t),Object.defineProperty(e,"prototype",{writable:!1}),e}function _callSuper(t,o,e){return o=_getPrototypeOf(o),_possibleConstructorReturn(t,_isNativeReflectConstruct()?Reflect.construct(o,e||[],_getPrototypeOf(t).constructor):o.apply(t,e))}function _possibleConstructorReturn(t,e){if(e&&("object"==_typeof(e)||"function"==typeof e))return e;if(void 0!==e)throw new TypeError("Derived constructors may only return object or undefined");return _assertThisInitialized(t)}function _assertThisInitialized(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function _isNativeReflectConstruct(){try{var t=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){}))}catch(t){}return(_isNativeReflectConstruct=function _isNativeReflectConstruct(){return!!t})()}function _getPrototypeOf(t){return _getPrototypeOf=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(t){return t.__proto__||Object.getPrototypeOf(t)},_getPrototypeOf(t)}function _inherits(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function");t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,writable:!0,configurable:!0}}),Object.defineProperty(t,"prototype",{writable:!1}),e&&_setPrototypeOf(t,e)}function _setPrototypeOf(t,e){return _setPrototypeOf=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(t,e){return t.__proto__=e,t},_setPrototypeOf(t,e)}function _defineProperty(e,r,t){return(r=_toPropertyKey(r))in e?Object.defineProperty(e,r,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[r]=t,e}function _toPropertyKey(t){var i=_toPrimitive(t,"string");return"symbol"==_typeof(i)?i:i+""}function _toPrimitive(t,r){if("object"!=_typeof(t)||!t)return t;var e=t[Symbol.toPrimitive];if(void 0!==e){var i=e.call(t,r||"default");if("object"!=_typeof(i))return i;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===r?String:Number)(t)}/**
|
|
2
|
+
* Copyright 2017-2024 Sourcepole AG
|
|
3
|
+
* All rights reserved.
|
|
4
|
+
*
|
|
5
|
+
* This source code is licensed under the BSD-style license found in the
|
|
6
|
+
* LICENSE file in the root directory of this source tree.
|
|
7
|
+
*/import React from"react";import{connect}from"react-redux";import FileSaver from"file-saver";import ol from"openlayers";import PropTypes from"prop-types";import{LayerRole,addLayer}from"../actions/layers";import{setSnappingConfig}from"../actions/map";import{changeRedliningState,resetRedliningState}from"../actions/redlining";import Icon from"../components/Icon";import TaskBar from"../components/TaskBar";import ButtonBar from"../components/widgets/ButtonBar";import ColorButton from"../components/widgets/ColorButton";import ComboBox from"../components/widgets/ComboBox";import MenuButton from"../components/widgets/MenuButton";import NumberInput from"../components/widgets/NumberInput";import VectorLayerPicker from"../components/widgets/VectorLayerPicker";import ConfigUtils from"../utils/ConfigUtils";import{END_MARKERS}from"../utils/FeatureStyles";import LocaleUtils from"../utils/LocaleUtils";import MapUtils from"../utils/MapUtils";import VectorLayerUtils from"../utils/VectorLayerUtils";import"./style/Redlining.css";/**
|
|
8
|
+
* Allows drawing figures and text labels on the map.
|
|
9
|
+
*/var Redlining=/*#__PURE__*/function(_React$Component){function Redlining(props){var _this;_classCallCheck(this,Redlining);_this=_callSuper(this,Redlining,[props]);_defineProperty(_this,"state",{selectText:false});_defineProperty(_this,"onShow",function(mode,data){var _data$geomType;_this.props.changeRedliningState(_objectSpread({action:mode!==null&&mode!==void 0?mode:"Pick",geomType:(_data$geomType=data===null||data===void 0?void 0:data.geomType)!==null&&_data$geomType!==void 0?_data$geomType:null},_this.redliningStateDefaults()));_this.props.setSnappingConfig(_this.props.snapping,_this.props.snappingActive);if(data&&data.layerId){var layer=_this.props.layers.find(function(l){return l.id===data.layerId});if(layer){_this.changeRedliningLayer(layer)}}});_defineProperty(_this,"onHide",function(){_this.props.resetRedliningState()});_defineProperty(_this,"redliningStateDefaults",function(){return{style:_objectSpread(_objectSpread({},_this.props.redlining.style),{},{borderColor:_this.props.defaultBorderColor,fillColor:_this.props.defaultFillColor,textOutlineColor:_this.props.defaultTextOutlineColor,textFillColor:_this.props.defaultTextFillColor}),lenUnit:_this.props.defaultLengthUnit,areaUnit:_this.props.defaultAreaUnit}});_defineProperty(_this,"updateRedliningStyle",function(diff){var newStyle=_objectSpread(_objectSpread({},_this.props.redlining.style),diff);_this.props.changeRedliningState({style:newStyle})});_defineProperty(_this,"renderBody",function(){var _this$props$layers$fi;var toolEnabled=function toolEnabled(tool){return!_this.props.hiddenTools.includes(tool)};var activeButton=_this.props.redlining.action==="Draw"?_this.props.redlining.geomType:_this.props.redlining.action;var drawButtons=[{key:"Point",tooltip:LocaleUtils.tr("redlining.point"),icon:"point",data:{action:"Draw",geomType:"Point",text:""}},{key:"LineString",tooltip:LocaleUtils.tr("redlining.line"),icon:"line",data:{action:"Draw",geomType:"LineString",text:""}},{key:"Polygon",tooltip:LocaleUtils.tr("redlining.polygon"),icon:"polygon",data:{action:"Draw",geomType:"Polygon",text:""}},[toolEnabled("Circle")?{key:"Circle",tooltip:LocaleUtils.tr("redlining.circle"),icon:"circle",data:{action:"Draw",geomType:"Circle",text:""}}:null,toolEnabled("Ellipse")?{key:"Ellipse",tooltip:LocaleUtils.tr("redlining.ellipse"),icon:"ellipse",data:{action:"Draw",geomType:"Ellipse",text:""}}:null,toolEnabled("Square")?{key:"Square",tooltip:LocaleUtils.tr("redlining.square"),icon:"box",data:{action:"Draw",geomType:"Square",text:""}}:null,toolEnabled("Box")?{key:"Box",tooltip:LocaleUtils.tr("redlining.rectangle"),icon:"rect",data:{action:"Draw",geomType:"Box",text:""}}:null].filter(Boolean),{key:"Text",tooltip:LocaleUtils.tr("redlining.text"),icon:"text",data:{action:"Draw",geomType:"Text",text:"",measurements:false}}];if(ConfigUtils.isMobile()){drawButtons=[drawButtons.flat()]}var activeFreeHand=_this.props.redlining.freehand?"HandDrawing":null;var freehandButtons=toolEnabled("HandWriting")?[{key:"HandDrawing",tooltip:LocaleUtils.tr("redlining.freehand"),icon:"freehand",data:{action:"Draw",geomType:_this.props.redlining.geomType,text:"",freehand:!_this.props.redlining.freehand},disabled:_this.props.redlining.geomType!=="LineString"&&_this.props.redlining.geomType!=="Polygon"}]:[];var editButtons=[{key:"Pick",tooltip:LocaleUtils.tr("redlining.pick"),icon:"nodetool",data:{action:"Pick",geomType:null,text:""}},toolEnabled("Transform")?{key:"Transform",tooltip:LocaleUtils.tr("redlining.transform"),icon:"transformtool",data:{action:"Transform",geomType:null,text:""}}:null,{key:"Delete",tooltip:LocaleUtils.tr("redlining.delete"),icon:"trash",data:{action:"Delete",geomType:null},disabled:!_this.props.redlining.selectedFeature}].filter(Boolean);var extraButtons=toolEnabled("NumericInput")?[{key:"NumericInput",tooltip:LocaleUtils.tr("redlining.numericinput"),icon:"numericinput"}]:[];for(var _i=0,_Object$values=Object.values(_this.props.plugins||{});_i<_Object$values.length;_i++){var plugin=_Object$values[_i];if(toolEnabled(plugin.cfg.key)){editButtons.push(_objectSpread(_objectSpread({},plugin.cfg),{},{tooltip:plugin.cfg.tooltip?LocaleUtils.tr(plugin.cfg.tooltip):undefined}))}}var vectorLayers=_this.props.layers.filter(function(layer){return layer.type==="vector"&&layer.role===LayerRole.USERLAYER&&!layer.readonly});// Ensure list always contains at least a "Redlining" layer
|
|
10
|
+
if(vectorLayers.length===0){vectorLayers=[{id:"redlining",title:LocaleUtils.tr("redlining.layertitle")}].concat(_toConsumableArray(vectorLayers))}var haveLayer=(((_this$props$layers$fi=_this.props.layers.find(function(l){return l.id===_this.props.redlining.layer}))===null||_this$props$layers$fi===void 0||(_this$props$layers$fi=_this$props$layers$fi.features)===null||_this$props$layers$fi===void 0?void 0:_this$props$layers$fi.length)||0)>0;var activePlugin=Object.values(_this.props.plugins||{}).find(function(plugin){return plugin.cfg.key===_this.props.redlining.action});var controls=activePlugin?/*#__PURE__*/React.createElement(activePlugin.controls,null):_this.renderStandardControls();return/*#__PURE__*/React.createElement("div",null,/*#__PURE__*/React.createElement("div",{className:"redlining-buttongroups"},/*#__PURE__*/React.createElement("div",{className:"redlining-group"},/*#__PURE__*/React.createElement("div",null,LocaleUtils.tr("redlining.layer")),/*#__PURE__*/React.createElement(VectorLayerPicker,{addLayer:_this.props.addLayer,layers:vectorLayers,onChange:_this.changeRedliningLayer,value:_this.props.redlining.layer})),/*#__PURE__*/React.createElement("div",{className:"redlining-group"},/*#__PURE__*/React.createElement("div",null,LocaleUtils.tr("redlining.draw")),/*#__PURE__*/React.createElement("span",null,/*#__PURE__*/React.createElement(ButtonBar,{active:activeButton,buttons:drawButtons,onClick:function onClick(key,data){return _this.actionChanged(data)}}),_this.props.redlining.action==="Draw"&&(_this.props.redlining.geomType==="LineString"||_this.props.redlining.geomType==="Polygon")?/*#__PURE__*/React.createElement(ButtonBar,{active:activeFreeHand,buttons:freehandButtons,onClick:function onClick(key,data){return _this.actionChanged(data)}}):null)),/*#__PURE__*/React.createElement("div",{className:"redlining-group"},/*#__PURE__*/React.createElement("div",null,LocaleUtils.tr("redlining.edit")),/*#__PURE__*/React.createElement(ButtonBar,{active:activeButton,buttons:editButtons,onClick:function onClick(key,data){return _this.actionChanged(data)}})),/*#__PURE__*/React.createElement("div",{className:"redlining-group"},/*#__PURE__*/React.createElement("div",null,"\xA0"),/*#__PURE__*/React.createElement(ButtonBar,{active:_this.props.redlining.numericInput?"NumericInput":null,buttons:extraButtons,onClick:function onClick(){return _this.props.changeRedliningState({numericInput:!_this.props.redlining.numericInput})}})),toolEnabled("Export")?/*#__PURE__*/React.createElement("div",{className:"redlining-group"},/*#__PURE__*/React.createElement("div",null,"\xA0"),/*#__PURE__*/React.createElement(MenuButton,{className:"redlining-export-menu",disabled:!haveLayer,menuIcon:"export",onActivate:_this["export"],tooltip:LocaleUtils.tr("redlining.export")},/*#__PURE__*/React.createElement("div",{className:"redlining-export-menu-entry",key:"GeoJSON",value:"geojson"},"GeoJSON"),/*#__PURE__*/React.createElement("div",{className:"redlining-export-menu-entry",key:"KML",value:"kml"},"KML"))):null),controls)});_defineProperty(_this,"export",function(type){if(type==="geojson"){var layer=_this.props.layers.find(function(l){return l.id===_this.props.redlining.layer});if(!layer){return}var geojson=JSON.stringify({type:"FeatureCollection",features:layer.features.map(function(feature){var newFeature=_objectSpread(_objectSpread({},feature),{},{geometry:VectorLayerUtils.reprojectGeometry(feature.geometry,feature.crs||_this.props.mapCrs,"EPSG:4326")});delete newFeature.crs;return newFeature})},null," ");FileSaver.saveAs(new Blob([geojson],{type:"text/plain;charset=utf-8"}),layer.title+".json")}else if(type==="kml"){var getNativeLayer=MapUtils.getHook(MapUtils.GET_NATIVE_LAYER);var _layer=_this.props.layers.find(function(l){return l.id===_this.props.redlining.layer});var nativeLayer=getNativeLayer(_this.props.redlining.layer);if(!nativeLayer){return}var kmlFormat=new ol.format.KML;var features=nativeLayer.getSource().getFeatures().map(function(feature){// Circle is not supported by kml format
|
|
11
|
+
if(feature.getGeometry()instanceof ol.geom.Circle){feature=feature.clone();feature.setGeometry(ol.geom.polygonFromCircle(feature.getGeometry()))}return feature});var data=kmlFormat.writeFeatures(features,{featureProjection:_this.props.mapCrs});FileSaver.saveAs(new Blob([data],{type:"application/vnd.google-earth.kml+xml"}),_layer.title+".kml")}});_defineProperty(_this,"renderStandardControls",function(){var _this$props$redlining,_this$props$redlining2;var sizeLabel=LocaleUtils.tr("redlining.size");if(_this.props.redlining.geomType==="LineString"){sizeLabel=LocaleUtils.tr("redlining.width")}else if(_this.props.redlining.geomType==="Polygon"){sizeLabel=LocaleUtils.tr("redlining.border")}var labelPlaceholder=LocaleUtils.tr("redlining.label");if(_this.props.redlining.geomType==="Text"){labelPlaceholder=LocaleUtils.tr("redlining.text")}if(_this.props.redlining.action!=="Draw"&&!_this.props.redlining.selectedFeature){return null}return/*#__PURE__*/React.createElement("div",{className:"redlining-controlsbar"},/*#__PURE__*/React.createElement("span",null,/*#__PURE__*/React.createElement(Icon,{className:"redlining-control-icon",icon:"pen",size:"large"}),_this.props.redlining.geomType==="Text"||((_this$props$redlining=_this.props.redlining.selectedFeature)===null||_this$props$redlining===void 0?void 0:_this$props$redlining.shape)==="Text"?/*#__PURE__*/React.createElement(ColorButton,{color:_this.props.redlining.style.textOutlineColor,defaultColors:_this.props.predefinedBorderColors,onColorChanged:function onColorChanged(color){return _this.updateRedliningStyle({textOutlineColor:color})}}):/*#__PURE__*/React.createElement(ColorButton,{color:_this.props.redlining.style.borderColor,defaultColors:_this.props.predefinedBorderColors,onColorChanged:function onColorChanged(color){return _this.updateRedliningStyle({borderColor:color})}})),_this.props.redlining.geomType==="LineString"?null:/*#__PURE__*/React.createElement("span",null,/*#__PURE__*/React.createElement(Icon,{className:"redlining-control-icon",icon:"fill",size:"large"}),_this.props.redlining.geomType==="Text"||((_this$props$redlining2=_this.props.redlining.selectedFeature)===null||_this$props$redlining2===void 0?void 0:_this$props$redlining2.shape)==="Text"?/*#__PURE__*/React.createElement(ColorButton,{color:_this.props.redlining.style.textFillColor,defaultColors:_this.props.predefinedFillColors,onColorChanged:function onColorChanged(color){return _this.updateRedliningStyle({textFillColor:color})}}):/*#__PURE__*/React.createElement(ColorButton,{color:_this.props.redlining.style.fillColor,defaultColors:_this.props.predefinedFillColors,onColorChanged:function onColorChanged(color){return _this.updateRedliningStyle({fillColor:color})}})),/*#__PURE__*/React.createElement("span",null,/*#__PURE__*/React.createElement("span",null,sizeLabel,":\xA0"),/*#__PURE__*/React.createElement(NumberInput,{max:99,min:1,mobile:true,onChange:function onChange(nr){return _this.updateRedliningStyle({size:nr})},value:_this.props.redlining.style.size})),_this.props.redlining.geomType==="LineString"?/*#__PURE__*/React.createElement("span",null,/*#__PURE__*/React.createElement("span",null,LocaleUtils.tr("redlining.markers"),":\xA0"),/*#__PURE__*/React.createElement(ComboBox,{className:"redlining-marker-combo",onChange:function onChange(value){return _this.updateRedliningStyle({headmarker:value})},value:_this.props.redlining.style.headmarker||""},/*#__PURE__*/React.createElement("div",{className:"redlining-marker-combo-entry",value:""}),Object.entries(END_MARKERS).map(function(_ref){var _ref2=_slicedToArray(_ref,2),key=_ref2[0],params=_ref2[1];return/*#__PURE__*/React.createElement("div",{className:"redlining-marker-combo-entry",key:key,value:key},/*#__PURE__*/React.createElement("img",{src:params.src,style:{transform:"rotate("+params.baserotation+"deg)"}}))})),/*#__PURE__*/React.createElement(ComboBox,{className:"redlining-marker-combo",onChange:function onChange(value){return _this.updateRedliningStyle({tailmarker:value})},value:_this.props.redlining.style.tailmarker||""},/*#__PURE__*/React.createElement("div",{className:"redlining-marker-combo-entry",value:""}),Object.entries(END_MARKERS).map(function(_ref3){var _ref4=_slicedToArray(_ref3,2),key=_ref4[0],params=_ref4[1];return/*#__PURE__*/React.createElement("div",{className:"redlining-marker-combo-entry",key:key,value:key},/*#__PURE__*/React.createElement("img",{src:params.src,style:{transform:"rotate("+(180+params.baserotation)+"deg)"}}))}))):null,_this.props.redlining.geomType!=="Text"&&_this.props.allowGeometryLabels?/*#__PURE__*/React.createElement("button",{className:"button"+(_this.props.redlining.measurements?" pressed":""),onClick:function onClick(){return _this.props.changeRedliningState({measurements:!_this.props.redlining.measurements,style:_objectSpread(_objectSpread({},_this.props.redlining.style),{},{text:""})})},title:LocaleUtils.tr("redlining.measurements")},/*#__PURE__*/React.createElement(Icon,{icon:"measure"})):null,(_this.props.redlining.geomType==="Text"||_this.props.allowGeometryLabels)&&!_this.props.redlining.measurements?/*#__PURE__*/React.createElement("input",{className:"redlining-label",onChange:function onChange(ev){return _this.updateRedliningStyle({text:ev.target.value})},placeholder:labelPlaceholder,readOnly:_this.props.redlining.measurements,ref:function ref(el){return _this.setLabelRef(el)},type:"text",value:_this.props.redlining.style.text}):null,_this.props.redlining.measurements&&["LineString","Circle"].includes(_this.props.redlining.geomType)?/*#__PURE__*/React.createElement("select",{className:"redlining-unit",onChange:function onChange(ev){return _this.props.changeRedliningState({lenUnit:ev.target.value})},value:_this.props.redlining.lenUnit},/*#__PURE__*/React.createElement("option",{value:"metric"},LocaleUtils.tr("measureComponent.metric")),/*#__PURE__*/React.createElement("option",{value:"imperial"},LocaleUtils.tr("measureComponent.imperial")),/*#__PURE__*/React.createElement("option",{value:"m"},"m"),/*#__PURE__*/React.createElement("option",{value:"km"},"km"),/*#__PURE__*/React.createElement("option",{value:"ft"},"ft"),/*#__PURE__*/React.createElement("option",{value:"mi"},"mi")):null,_this.props.redlining.measurements&&["Polygon","Ellipse","Square","Box"].includes(_this.props.redlining.geomType)?/*#__PURE__*/React.createElement("select",{className:"redlining-unit",onChange:function onChange(ev){return _this.props.changeRedliningState({areaUnit:ev.target.value})},value:_this.props.redlining.areaUnit},/*#__PURE__*/React.createElement("option",{value:"metric"},LocaleUtils.tr("measureComponent.metric")),/*#__PURE__*/React.createElement("option",{value:"imperial"},LocaleUtils.tr("measureComponent.imperial")),/*#__PURE__*/React.createElement("option",{value:"sqm"},"m\xB2"),/*#__PURE__*/React.createElement("option",{value:"ha"},"ha"),/*#__PURE__*/React.createElement("option",{value:"sqkm"},"km\xB2"),/*#__PURE__*/React.createElement("option",{value:"sqft"},"ft\xB2"),/*#__PURE__*/React.createElement("option",{value:"acre"},"acre"),/*#__PURE__*/React.createElement("option",{value:"sqmi"},"mi\xB2")):null)});_defineProperty(_this,"setLabelRef",function(el){_this.labelInput=el;if(el&&_this.state.selectText){el.focus();el.select();_this.setState({selectText:false})}});_defineProperty(_this,"actionChanged",function(data){if(data.action==="Draw"&&data.geomType==="Text"){data=_objectSpread(_objectSpread({},data),{},{style:{text:LocaleUtils.tr("redlining.text")}})}else if(!_this.props.allowGeometryLabels){data=_objectSpread(_objectSpread({},data),{},{style:{text:""}})}_this.props.changeRedliningState(data)});_defineProperty(_this,"changeRedliningLayer",function(layer){var action=["Draw","Pick","Transform"].includes(_this.props.redlining.action)?_this.props.redlining.action:"Pick";_this.props.changeRedliningState({layer:layer.id,layerTitle:layer.title,action:action})});_this.labelInput=null;return _this}_inherits(Redlining,_React$Component);return _createClass(Redlining,[{key:"componentDidMount",value:function componentDidMount(){this.componentDidUpdate({redlining:{}})}},{key:"componentDidUpdate",value:function componentDidUpdate(prevProps){var _this2=this;if(this.props.defaultBorderColor!==prevProps.defaultBorderColor||this.props.defaultFillColor!==prevProps.defaultFillColor||this.props.defaultLengthUnit!==prevProps.defaultLengthUnit||this.props.defaultAreaUnit!==prevProps.defaultAreaUnit||this.props.defaultTextFillColor!==prevProps.defaultTextFillColor||this.props.defaultTextOutlineColor!==prevProps.defaultTextOutlineColor){this.props.changeRedliningState(this.redliningStateDefaults())}if(prevProps.redlining.geomType!==this.props.redlining.geomType&&this.props.redlining.geomType==="Text"&&!this.state.selectText){this.setState({selectText:true})}if(!this.props.layers.find(function(layer){return layer.id===_this2.props.redlining.layer})){var vectorLayers=this.props.layers.filter(function(layer){return layer.type==="vector"&&layer.role===LayerRole.USERLAYER&&!layer.readonly});if(vectorLayers.length>=1){this.props.changeRedliningState({layer:vectorLayers[0].id,layerTitle:vectorLayers[0].title})}else if(this.props.redlining.layer!=="redlining"){this.props.changeRedliningState({layer:"redlining",layerTitle:LocaleUtils.tr("redlining.layertitle")})}}}},{key:"render",value:function render(){var _this3=this;return/*#__PURE__*/React.createElement(TaskBar,{onHide:this.onHide,onShow:this.onShow,task:"Redlining"},function(){return{body:_this3.renderBody()}})}}])}(React.Component);_defineProperty(Redlining,"propTypes",{addLayer:PropTypes.func,/** Whether to allow labeling geometric figures. */allowGeometryLabels:PropTypes.bool,changeRedliningState:PropTypes.func,/** Default area unit. Options: metric, imperial, sqm, ha, sqkm, sqft, acre, sqmi */defaultAreaUnit:PropTypes.string,/** Default border color. In format [r, g, b, a]. */defaultBorderColor:PropTypes.array,/** Default fill color. In format [r, g, b, a]. */defaultFillColor:PropTypes.array,/** Default length unit. Options: metric, imperial, m, km, ft, mi */defaultLengthUnit:PropTypes.string,/** Default text fill color. In format [r, g, b, a]. */defaultTextFillColor:PropTypes.array,/** Default text outline color. In format [r, g, b, a]. */defaultTextOutlineColor:PropTypes.array,/** Tools to hide. Available tools: Circle, Ellipse, Square, Box, HandDrawing, Transform, NumericInput, Buffer, Export. */hiddenTools:PropTypes.array,layers:PropTypes.array,mapCrs:PropTypes.string,plugins:PropTypes.object,/** Predefined border colors. In format [[r, g, b, a], ...]. */predefinedBorderColors:PropTypes.arrayOf(PropTypes.array),/** Predefined fill colors. In format [[r, g, b, a], ...]. */predefinedFillColors:PropTypes.arrayOf(PropTypes.array),redlining:PropTypes.object,resetRedliningState:PropTypes.func,setCurrentTask:PropTypes.func,setSnappingConfig:PropTypes.func,/** Whether snapping is available when editing. */snapping:PropTypes.bool,/** Whether snapping is enabled by default when editing.
|
|
12
|
+
* Either `false`, `edge`, `vertex` or `true` (i.e. both vertex and edge). */snappingActive:PropTypes.oneOfType([PropTypes.bool,PropTypes.string])});_defineProperty(Redlining,"defaultProps",{allowGeometryLabels:true,hiddenTools:[],snapping:true,snappingActive:true,plugins:[],defaultBorderColor:[255,0,0,1],defaultFillColor:[255,255,255,1],defaultTextFillColor:[0,0,0,1],defaultTextOutlineColor:[255,255,255,1],defaultAreaUnit:"metric",defaultLengthUnit:"metric"});export default(function(plugins){return connect(function(state){return{layers:state.layers.flat,redlining:state.redlining,mapCrs:state.map.projection,plugins:plugins}},{changeRedliningState:changeRedliningState,addLayer:addLayer,resetRedliningState:resetRedliningState,setSnappingConfig:setSnappingConfig})(Redlining)});
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
function _typeof(o){"@babel/helpers - typeof";return _typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(o){return typeof o}:function(o){return o&&"function"==typeof Symbol&&o.constructor===Symbol&&o!==Symbol.prototype?"symbol":typeof o},_typeof(o)}function _toConsumableArray(r){return _arrayWithoutHoles(r)||_iterableToArray(r)||_unsupportedIterableToArray(r)||_nonIterableSpread()}function _nonIterableSpread(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function _iterableToArray(r){if("undefined"!=typeof Symbol&&null!=r[Symbol.iterator]||null!=r["@@iterator"])return Array.from(r)}function _arrayWithoutHoles(r){if(Array.isArray(r))return _arrayLikeToArray(r)}function ownKeys(e,r){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);r&&(o=o.filter(function(r){return Object.getOwnPropertyDescriptor(e,r).enumerable})),t.push.apply(t,o)}return t}function _objectSpread(e){for(var r=1;r<arguments.length;r++){var t=null!=arguments[r]?arguments[r]:{};r%2?ownKeys(Object(t),!0).forEach(function(r){_defineProperty(e,r,t[r])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):ownKeys(Object(t)).forEach(function(r){Object.defineProperty(e,r,Object.getOwnPropertyDescriptor(t,r))})}return e}function _createForOfIteratorHelper(r,e){var t="undefined"!=typeof Symbol&&r[Symbol.iterator]||r["@@iterator"];if(!t){if(Array.isArray(r)||(t=_unsupportedIterableToArray(r))||e&&r&&"number"==typeof r.length){t&&(r=t);var _n=0,F=function F(){};return{s:F,n:function n(){return _n>=r.length?{done:!0}:{done:!1,value:r[_n++]}},e:function e(r){throw r},f:F}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var o,a=!0,u=!1;return{s:function s(){t=t.call(r)},n:function n(){var r=t.next();return a=r.done,r},e:function e(r){u=!0,o=r},f:function f(){try{a||null==t["return"]||t["return"]()}finally{if(u)throw o}}}}function _slicedToArray(r,e){return _arrayWithHoles(r)||_iterableToArrayLimit(r,e)||_unsupportedIterableToArray(r,e)||_nonIterableRest()}function _nonIterableRest(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function _unsupportedIterableToArray(r,a){if(r){if("string"==typeof r)return _arrayLikeToArray(r,a);var t={}.toString.call(r).slice(8,-1);return"Object"===t&&r.constructor&&(t=r.constructor.name),"Map"===t||"Set"===t?Array.from(r):"Arguments"===t||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t)?_arrayLikeToArray(r,a):void 0}}function _arrayLikeToArray(r,a){(null==a||a>r.length)&&(a=r.length);for(var e=0,n=Array(a);e<a;e++)n[e]=r[e];return n}function _iterableToArrayLimit(r,l){var t=null==r?null:"undefined"!=typeof Symbol&&r[Symbol.iterator]||r["@@iterator"];if(null!=t){var e,n,i,u,a=[],f=!0,o=!1;try{if(i=(t=t.call(r)).next,0===l){if(Object(t)!==t)return;f=!1}else for(;!(f=(e=i.call(t)).done)&&(a.push(e.value),a.length!==l);f=!0);}catch(r){o=!0,n=r}finally{try{if(!f&&null!=t["return"]&&(u=t["return"](),Object(u)!==u))return}finally{if(o)throw n}}return a}}function _arrayWithHoles(r){if(Array.isArray(r))return r}function _classCallCheck(a,n){if(!(a instanceof n))throw new TypeError("Cannot call a class as a function")}function _defineProperties(e,r){for(var t=0;t<r.length;t++){var o=r[t];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(e,_toPropertyKey(o.key),o)}}function _createClass(e,r,t){return r&&_defineProperties(e.prototype,r),t&&_defineProperties(e,t),Object.defineProperty(e,"prototype",{writable:!1}),e}function _callSuper(t,o,e){return o=_getPrototypeOf(o),_possibleConstructorReturn(t,_isNativeReflectConstruct()?Reflect.construct(o,e||[],_getPrototypeOf(t).constructor):o.apply(t,e))}function _possibleConstructorReturn(t,e){if(e&&("object"==_typeof(e)||"function"==typeof e))return e;if(void 0!==e)throw new TypeError("Derived constructors may only return object or undefined");return _assertThisInitialized(t)}function _assertThisInitialized(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function _isNativeReflectConstruct(){try{var t=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){}))}catch(t){}return(_isNativeReflectConstruct=function _isNativeReflectConstruct(){return!!t})()}function _getPrototypeOf(t){return _getPrototypeOf=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(t){return t.__proto__||Object.getPrototypeOf(t)},_getPrototypeOf(t)}function _inherits(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function");t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,writable:!0,configurable:!0}}),Object.defineProperty(t,"prototype",{writable:!1}),e&&_setPrototypeOf(t,e)}function _setPrototypeOf(t,e){return _setPrototypeOf=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(t,e){return t.__proto__=e,t},_setPrototypeOf(t,e)}function _defineProperty(e,r,t){return(r=_toPropertyKey(r))in e?Object.defineProperty(e,r,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[r]=t,e}function _toPropertyKey(t){var i=_toPrimitive(t,"string");return"symbol"==_typeof(i)?i:i+""}function _toPrimitive(t,r){if("object"!=_typeof(t)||!t)return t;var e=t[Symbol.toPrimitive];if(void 0!==e){var i=e.call(t,r||"default");if("object"!=_typeof(i))return i;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===r?String:Number)(t)}/**
|
|
2
|
+
* Copyright 2016-2024 Sourcepole AG
|
|
3
|
+
* All rights reserved.
|
|
4
|
+
*
|
|
5
|
+
* This source code is licensed under the BSD-style license found in the
|
|
6
|
+
* LICENSE file in the root directory of this source tree.
|
|
7
|
+
*/import React from"react";import{connect}from"react-redux";import axios from"axios";import FileSaver from"file-saver";import isEmpty from"lodash.isempty";import PropTypes from"prop-types";import{LayerRole,addLayerFeatures,clearLayer,changeLayerProperty}from"../actions/layers";import Icon from"../components/Icon";import MapSelection from"../components/MapSelection";import PickFeature from"../components/PickFeature";import SideBar from"../components/SideBar";import ButtonBar from"../components/widgets/ButtonBar";import ComboBox from"../components/widgets/ComboBox";import Spinner from"../components/widgets/Spinner";import ConfigUtils from"../utils/ConfigUtils";import IdentifyUtils from"../utils/IdentifyUtils";import LayerUtils from"../utils/LayerUtils";import LocaleUtils from"../utils/LocaleUtils";import VectorLayerUtils from"../utils/VectorLayerUtils";import"./style/Reports.css";/**
|
|
8
|
+
* Allow generating reports for selected features.
|
|
9
|
+
*
|
|
10
|
+
* This plugin displays all available reports for the current theme,
|
|
11
|
+
* allows selecting one or more or all features of the layer, and finally generating
|
|
12
|
+
* an aggregated report for all selected features.
|
|
13
|
+
*
|
|
14
|
+
* Requires `documentServiceUrl` in `config.json` to point to a `qwc-document-service`.
|
|
15
|
+
*/var Reports=/*#__PURE__*/function(_React$Component){function Reports(props){var _this;_classCallCheck(this,Reports);_this=_callSuper(this,Reports,[props]);_defineProperty(_this,"renderBody",function(){var pickButtons=[{key:"Pick",icon:"pick",label:LocaleUtils.tr("reports.pick")},{key:"Region",icon:"pick_region",label:LocaleUtils.tr("reports.region")},{key:"All",icon:"ok",label:LocaleUtils.tr("reports.all"),forceLabel:true}];return/*#__PURE__*/React.createElement("div",{className:"reports-body"},/*#__PURE__*/React.createElement("div",null,/*#__PURE__*/React.createElement(ComboBox,{className:"reports-filter-combo",filterable:true,onChange:_this.setReportLayer,placeholder:LocaleUtils.tr("reports.selectlayer"),value:_this.state.selectedReportLayer},Object.entries(_this.state.reports).map(function(_ref){var _ref2=_slicedToArray(_ref,2),layername=_ref2[0],entry=_ref2[1];return/*#__PURE__*/React.createElement("div",{key:layername,title:entry.title,value:layername},entry.title)}))),/*#__PURE__*/React.createElement("div",null,/*#__PURE__*/React.createElement(ButtonBar,{active:_this.state.featureSelectionMode,buttons:pickButtons,disabled:!_this.state.selectedReportLayer,onClick:_this.setPickMode})),/*#__PURE__*/React.createElement("div",null,/*#__PURE__*/React.createElement("button",{className:"button reports-download-button",disabled:_this.state.generatingReport||isEmpty(_this.state.reportFeatures)&&_this.state.featureSelectionMode!=="All",onClick:_this.downloadReport,type:"button"},_this.state.generatingReport?/*#__PURE__*/React.createElement(Spinner,null):/*#__PURE__*/React.createElement(Icon,{icon:"report"}),/*#__PURE__*/React.createElement("span",null,LocaleUtils.tr("reports.download")))))});_defineProperty(_this,"setLayerVisibility",function(selectedLayer,visibility){if(selectedLayer!==null){var path=[];var sublayer=null;var layer=_this.props.layers.find(function(l){return l.role===LayerRole.THEME&&(sublayer=LayerUtils.searchSubLayer(l,"name",selectedLayer,path))});if(layer&&sublayer){var oldvisibility=sublayer.visibility;if(oldvisibility!==visibility&&visibility!==null){var recurseDirection=!oldvisibility?"both":"children";_this.props.changeLayerProperty(layer.uuid,"visibility",visibility,path,recurseDirection)}return oldvisibility}}return null});_defineProperty(_this,"setReportLayer",function(layer){_this.setLayerVisibility(layer,true);_this.setState({selectedReportLayer:layer,reportFeatures:[]})});_defineProperty(_this,"setPickMode",function(mode){_this.setState({featureSelectionMode:mode,reportFeatures:[],featureSelectionPolygon:null})});_defineProperty(_this,"collectFeatureReportTemplates",function(entry){var reports={};if(entry.sublayers){var _iterator=_createForOfIteratorHelper(entry.sublayers),_step;try{for(_iterator.s();!(_step=_iterator.n()).done;){var sublayer=_step.value;reports=_objectSpread(_objectSpread({},reports),_this.collectFeatureReportTemplates(sublayer))}}catch(err){_iterator.e(err)}finally{_iterator.f()}}else if(entry.featureReport){reports[entry.name]={title:entry.title,template:entry.featureReport}}return reports});_defineProperty(_this,"onShow",function(){var reports={};_this.props.layers.filter(function(l){return l.role===LayerRole.THEME}).forEach(function(themeLayer){reports=_objectSpread(_objectSpread({},reports),_this.collectFeatureReportTemplates(themeLayer))});_this.setState({reports:reports,featureSelectionMode:"Pick"})});_defineProperty(_this,"onHide",function(){_this.props.clearLayer("report-pick-selection");_this.setState(_objectSpread({},Reports.defaultState))});_defineProperty(_this,"selectReportFeature",function(layer,feature){if(!feature){return}_this.setState(function(state){var index=state.reportFeatures.findIndex(function(f){return f.id===feature.id});if(index>=0){var newReportFeatures=state.reportFeatures.slice(0);newReportFeatures.splice(index,1);return{reportFeatures:newReportFeatures}}else{return{reportFeatures:[].concat(_toConsumableArray(state.reportFeatures),[feature])}}})});_defineProperty(_this,"setFeatureSelectionPolygon",function(geom){_this.setState({featureSelectionPolygon:geom});var poly=geom.coordinates[0];if(poly.length<3){return}var center=[0,0];poly.forEach(function(point){center[0]+=point[0];center[1]+=point[1]});center[0]/=poly.length;center[1]/=poly.length;var filter=VectorLayerUtils.geoJSONGeomToWkt(geom);var params={feature_count:100};var layer=_this.props.layers.find(function(l){return l.role===LayerRole.THEME});var request=IdentifyUtils.buildFilterRequest(layer,_this.state.selectedReportLayer,filter,_this.props.map,params);IdentifyUtils.sendRequest(request,function(response){if(response){var result=IdentifyUtils.parseResponse(response,layer,request.params.info_format,center,_this.props.map.projection);_this.setState(function(state){return{reportFeatures:result[state.selectedReportLayer]}})}})});_defineProperty(_this,"downloadReport",function(){var serviceUrl=ConfigUtils.getConfigProp("documentServiceUrl").replace(/\/$/,"");var featureIds="";if(_this.state.featureSelectionMode==="All"){featureIds="*"}else{featureIds=_this.state.reportFeatures.map(function(feature){return feature.id}).join(",")}var params={feature:featureIds,crs:_this.props.map.projection};_this.setState({generatingReport:true});var template=_this.state.reports[_this.state.selectedReportLayer].template;var url=serviceUrl+"/"+template+"?"+Object.keys(params).map(function(key){return encodeURIComponent(key)+"="+encodeURIComponent(params[key])}).join("&");axios.get(url,{responseType:"arraybuffer"}).then(function(response){FileSaver.saveAs(new Blob([response.data],{type:"application/pdf"}),_this.state.selectedReportLayer+".pdf");_this.setState({generatingReport:false})})["catch"](function(){/* eslint-disable-next-line */alert(LocaleUtils.tr("identify.reportfail"));_this.setState({generatingReport:false})})});_this.state=_objectSpread({},Reports.defaultState);return _this}_inherits(Reports,_React$Component);return _createClass(Reports,[{key:"componentDidUpdate",value:function componentDidUpdate(prevProps,prevState){if(this.state.reportFeatures!==prevState.reportFeatures){if(!isEmpty(this.state.reportFeatures)){var layer={id:"report-pick-selection",role:LayerRole.SELECTION,skipPrint:true};this.props.addLayerFeatures(layer,this.state.reportFeatures,true)}else if(!isEmpty(prevState.reportFeatures)){this.props.clearLayer("report-pick-selection")}}}},{key:"render",value:function render(){var _this2=this;return[/*#__PURE__*/React.createElement(SideBar,{icon:"report",id:"Reports",key:"Reports",onHide:this.onHide,onShow:this.onShow,side:this.props.side,title:LocaleUtils.tr("appmenu.items.Reports"),width:"20em"},function(){return{body:_this2.renderBody()}}),this.state.featureSelectionMode==="Pick"&&this.state.selectedReportLayer?/*#__PURE__*/React.createElement(PickFeature,{featurePicked:this.selectReportFeature,key:"FeaturePicker",layer:this.state.selectedReportLayer}):null,this.state.featureSelectionMode==="Region"?/*#__PURE__*/React.createElement(MapSelection,{active:true,geomType:"Polygon",geometry:this.state.featureSelectionPolygon,geometryChanged:this.setFeatureSelectionPolygon,hideGeometry:true,key:"MapSelection"}):null]}}])}(React.Component);_defineProperty(Reports,"propTypes",{addLayerFeatures:PropTypes.func,changeLayerProperty:PropTypes.func,clearLayer:PropTypes.func,layers:PropTypes.array,map:PropTypes.object,/** The side of the application on which to display the sidebar. */side:PropTypes.string});_defineProperty(Reports,"defaultState",{reports:{},selectedReportLayer:"",reportFeatures:[],featureSelectionMode:"",featureSelectionPolygon:null,generatingReport:false});export default connect(function(state){return{layers:state.layers.flat,map:state.map}},{addLayerFeatures:addLayerFeatures,changeLayerProperty:changeLayerProperty,clearLayer:clearLayer})(Reports);
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
function _typeof(o){"@babel/helpers - typeof";return _typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(o){return typeof o}:function(o){return o&&"function"==typeof Symbol&&o.constructor===Symbol&&o!==Symbol.prototype?"symbol":typeof o},_typeof(o)}function ownKeys(e,r){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);r&&(o=o.filter(function(r){return Object.getOwnPropertyDescriptor(e,r).enumerable})),t.push.apply(t,o)}return t}function _objectSpread(e){for(var r=1;r<arguments.length;r++){var t=null!=arguments[r]?arguments[r]:{};r%2?ownKeys(Object(t),!0).forEach(function(r){_defineProperty(e,r,t[r])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):ownKeys(Object(t)).forEach(function(r){Object.defineProperty(e,r,Object.getOwnPropertyDescriptor(t,r))})}return e}function _toConsumableArray(r){return _arrayWithoutHoles(r)||_iterableToArray(r)||_unsupportedIterableToArray(r)||_nonIterableSpread()}function _nonIterableSpread(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function _unsupportedIterableToArray(r,a){if(r){if("string"==typeof r)return _arrayLikeToArray(r,a);var t={}.toString.call(r).slice(8,-1);return"Object"===t&&r.constructor&&(t=r.constructor.name),"Map"===t||"Set"===t?Array.from(r):"Arguments"===t||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t)?_arrayLikeToArray(r,a):void 0}}function _iterableToArray(r){if("undefined"!=typeof Symbol&&null!=r[Symbol.iterator]||null!=r["@@iterator"])return Array.from(r)}function _arrayWithoutHoles(r){if(Array.isArray(r))return _arrayLikeToArray(r)}function _arrayLikeToArray(r,a){(null==a||a>r.length)&&(a=r.length);for(var e=0,n=Array(a);e<a;e++)n[e]=r[e];return n}function _classCallCheck(a,n){if(!(a instanceof n))throw new TypeError("Cannot call a class as a function")}function _defineProperties(e,r){for(var t=0;t<r.length;t++){var o=r[t];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(e,_toPropertyKey(o.key),o)}}function _createClass(e,r,t){return r&&_defineProperties(e.prototype,r),t&&_defineProperties(e,t),Object.defineProperty(e,"prototype",{writable:!1}),e}function _callSuper(t,o,e){return o=_getPrototypeOf(o),_possibleConstructorReturn(t,_isNativeReflectConstruct()?Reflect.construct(o,e||[],_getPrototypeOf(t).constructor):o.apply(t,e))}function _possibleConstructorReturn(t,e){if(e&&("object"==_typeof(e)||"function"==typeof e))return e;if(void 0!==e)throw new TypeError("Derived constructors may only return object or undefined");return _assertThisInitialized(t)}function _assertThisInitialized(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function _isNativeReflectConstruct(){try{var t=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){}))}catch(t){}return(_isNativeReflectConstruct=function _isNativeReflectConstruct(){return!!t})()}function _getPrototypeOf(t){return _getPrototypeOf=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(t){return t.__proto__||Object.getPrototypeOf(t)},_getPrototypeOf(t)}function _inherits(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function");t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,writable:!0,configurable:!0}}),Object.defineProperty(t,"prototype",{writable:!1}),e&&_setPrototypeOf(t,e)}function _setPrototypeOf(t,e){return _setPrototypeOf=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(t,e){return t.__proto__=e,t},_setPrototypeOf(t,e)}function _defineProperty(e,r,t){return(r=_toPropertyKey(r))in e?Object.defineProperty(e,r,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[r]=t,e}function _toPropertyKey(t){var i=_toPrimitive(t,"string");return"symbol"==_typeof(i)?i:i+""}function _toPrimitive(t,r){if("object"!=_typeof(t)||!t)return t;var e=t[Symbol.toPrimitive];if(void 0!==e){var i=e.call(t,r||"default");if("object"!=_typeof(i))return i;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===r?String:Number)(t)}/**
|
|
2
|
+
* Copyright 2024 Sourcepole AG
|
|
3
|
+
* All rights reserved.
|
|
4
|
+
*
|
|
5
|
+
* This source code is licensed under the BSD-style license found in the
|
|
6
|
+
* LICENSE file in the root directory of this source tree.
|
|
7
|
+
*/import React from"react";import{connect}from"react-redux";import Sortable from"react-sortablejs";import FileSaver from"file-saver";import PropTypes from"prop-types";import{createSelector}from"reselect";import{LayerRole,addLayerFeatures,removeLayer}from"../actions/layers";import{zoomToExtent}from"../actions/map";import{setCurrentTask}from"../actions/task";import Icon from"../components/Icon";import ResizeableWindow from"../components/ResizeableWindow";import ButtonBar from"../components/widgets/ButtonBar";import DateTimeInput from"../components/widgets/DateTimeInput";import NumberInput from"../components/widgets/NumberInput";import SearchWidget from"../components/widgets/SearchWidget";import Spinner from"../components/widgets/Spinner";import ToggleSwitch from"../components/widgets/ToggleSwitch";import VectorLayerPicker from"../components/widgets/VectorLayerPicker";import searchProvidersSelector from"../selectors/searchproviders";import ConfigUtils from"../utils/ConfigUtils";import CoordinatesUtils from"../utils/CoordinatesUtils";import LocaleUtils from"../utils/LocaleUtils";import MeasureUtils from"../utils/MeasureUtils";import RoutingInterface from"../utils/RoutingInterface";import VectorLayerUtils from"../utils/VectorLayerUtils";import"./style/Routing.css";/**
|
|
8
|
+
* Compute routes and isochrones.
|
|
9
|
+
*
|
|
10
|
+
* Requites `routingServiceUrl` in `config.json` pointing to a Valhalla routing service.
|
|
11
|
+
*/var Routing=/*#__PURE__*/function(_React$Component){function Routing(props){var _this;_classCallCheck(this,Routing);_this=_callSuper(this,Routing,[props]);_defineProperty(_this,"state",{visible:false,currentTab:"Route",mode:"auto",settings:{auto:{method:"fastest",maxSpeed:130,useFerries:true,useHighways:true,useTollways:true},heavyvehicle:{method:"fastest",maxSpeed:100,useFerries:true,useHighways:true,useTollways:true},transit:{timepoint:"now",time:""},bicycle:{method:"fastest",maxSpeed:25,useFerries:true},pedestrian:{method:"fastest",maxSpeed:4,useFerries:true}},settingsPopup:false,routeConfig:{points:[{text:"",pos:null,crs:null},{text:"",pos:null,crs:null}],result:null,roundtrip:false,optimized_route:false,excludeLayer:null},isoConfig:{points:[{text:"",pos:null,crs:null}],mode:"time",intervals:"5, 10",result:null},searchProviders:[],searchParams:{},highlightId:null});_defineProperty(_this,"renderSettings",function(){var settings=_this.state.settings[_this.state.mode];return/*#__PURE__*/React.createElement("div",{className:"routing-settings-menu"},/*#__PURE__*/React.createElement("table",{className:"routing-settings-menu-entries"},/*#__PURE__*/React.createElement("tbody",null,settings.method!==undefined?/*#__PURE__*/React.createElement("tr",null,/*#__PURE__*/React.createElement("td",null,LocaleUtils.tr("routing.method"),":"),/*#__PURE__*/React.createElement("td",null,/*#__PURE__*/React.createElement("select",{onChange:function onChange(ev){return _this.updateSetting(_this.state.mode,{method:ev.target.value})},value:settings.method},/*#__PURE__*/React.createElement("option",{value:"fastest"},LocaleUtils.tr("routing.fastest")),/*#__PURE__*/React.createElement("option",{value:"shortest"},LocaleUtils.tr("routing.shortest"))))):null,settings.maxSpeed!==undefined?/*#__PURE__*/React.createElement("tr",null,/*#__PURE__*/React.createElement("td",null,LocaleUtils.tr("routing.maxspeed"),":"),/*#__PURE__*/React.createElement("td",null,/*#__PURE__*/React.createElement(NumberInput,{max:350,min:1,mobile:true,onChange:function onChange(value){return _this.updateSetting(_this.state.mode,{maxSpeed:value})},suffix:" km/h",value:settings.maxSpeed}))):null,settings.useFerries!==undefined?/*#__PURE__*/React.createElement("tr",null,/*#__PURE__*/React.createElement("td",null,LocaleUtils.tr("routing.useferries"),":"),/*#__PURE__*/React.createElement("td",null,/*#__PURE__*/React.createElement(ToggleSwitch,{active:settings.useFerries,onChange:function onChange(value){return _this.updateSetting(_this.state.mode,{useFerries:value})}}))):null,settings.useHighways!==undefined?/*#__PURE__*/React.createElement("tr",null,/*#__PURE__*/React.createElement("td",null,LocaleUtils.tr("routing.usehighways"),":"),/*#__PURE__*/React.createElement("td",null,/*#__PURE__*/React.createElement(ToggleSwitch,{active:settings.useHighways,onChange:function onChange(value){return _this.updateSetting(_this.state.mode,{useHighways:value})}}))):null,settings.useTollways!==undefined?/*#__PURE__*/React.createElement("tr",null,/*#__PURE__*/React.createElement("td",null,LocaleUtils.tr("routing.usetollways"),":"),/*#__PURE__*/React.createElement("td",null,/*#__PURE__*/React.createElement(ToggleSwitch,{active:settings.useTollways,onChange:function onChange(value){return _this.updateSetting(_this.state.mode,{useTollways:value})}}))):null)))});_defineProperty(_this,"renderRouteWidget",function(){var routeConfig=_this.state.routeConfig;var vectorLayers=_this.props.layers.filter(function(layer){return layer.type==="vector"&&layer.role===LayerRole.USERLAYER&&!layer.readonly});var numpoints=routeConfig.points.length;return/*#__PURE__*/React.createElement("div",{className:"routing-tab-widget"},/*#__PURE__*/React.createElement("div",{className:"routing-input"},/*#__PURE__*/React.createElement("div",{className:"routing-points"},/*#__PURE__*/React.createElement(Sortable,{onChange:_this.onSortChange,options:{ghostClass:"drop-ghost",delay:200}},routeConfig.points.map(function(entry,idx){var placeholder=LocaleUtils.tr("routing.addviapoint");if(idx===0){placeholder=LocaleUtils.tr("routing.fromhere")}else if(idx===routeConfig.points.length-1){placeholder=LocaleUtils.tr("routing.tohere")}return _this.renderSearchField(entry,idx,"routeConfig",idx>0&&idx<numpoints-1,placeholder)})),/*#__PURE__*/React.createElement("div",null,/*#__PURE__*/React.createElement(Icon,{icon:"up-down-arrow",onClick:_this.reverseRoutePts}))),/*#__PURE__*/React.createElement("div",{className:"routing-points-commands"},/*#__PURE__*/React.createElement("a",{href:"#",onClick:function onClick(){return _this.addPoint("routeConfig",-1)}},/*#__PURE__*/React.createElement(Icon,{icon:"plus"})," ",LocaleUtils.tr("routing.add")),/*#__PURE__*/React.createElement("span",{className:"routing-points-commands-spacer"}),_this.renderImportButton("routeConfig"),/*#__PURE__*/React.createElement("span",{className:"routing-points-commands-spacer"}),/*#__PURE__*/React.createElement("a",{href:"#",onClick:function onClick(){return _this.clearConfig("routeConfig")}},/*#__PURE__*/React.createElement(Icon,{icon:"clear"})," ",LocaleUtils.tr("routing.clear"))),_this.state.mode==="transit"?/*#__PURE__*/React.createElement("div",{className:"routing-time-settings"},/*#__PURE__*/React.createElement("select",{onChange:_this.updateTransitTimepoint,value:_this.state.settings.transit.timepoint},/*#__PURE__*/React.createElement("option",{value:"now"},LocaleUtils.tr("routing.leavenow")),/*#__PURE__*/React.createElement("option",{value:"leaveat"},LocaleUtils.tr("routing.leaveat")),/*#__PURE__*/React.createElement("option",{value:"arriveat"},LocaleUtils.tr("routing.arriveat"))),_this.state.settings.transit.timepoint!=="now"?/*#__PURE__*/React.createElement(DateTimeInput,{onChange:function onChange(value){return _this.updateSetting("transit",{time:value})},value:_this.state.settings.transit.time}):null):null,/*#__PURE__*/React.createElement("div",{className:"routing-points-commands"},/*#__PURE__*/React.createElement("label",null,/*#__PURE__*/React.createElement("input",{onChange:function onChange(ev){return _this.updateRouteConfig({roundtrip:ev.target.checked})},type:"checkbox",value:routeConfig.roundtrip})," ",LocaleUtils.tr("routing.roundtrip"))),_this.state.mode!=="transit"?/*#__PURE__*/React.createElement("div",{className:"routing-points-commands"},/*#__PURE__*/React.createElement("label",null,/*#__PURE__*/React.createElement("input",{onChange:function onChange(ev){return _this.updateRouteConfig({optimized_route:ev.target.checked})},type:"checkbox",value:routeConfig.optimized_route})," ",LocaleUtils.tr("routing.optimized_route"))):null,ConfigUtils.havePlugin("Redlining")?/*#__PURE__*/React.createElement("div",{className:"routing-points-commands controlgroup"},/*#__PURE__*/React.createElement("span",null,LocaleUtils.tr("routing.excludepolygons"),":\xA0"),/*#__PURE__*/React.createElement(VectorLayerPicker,{layers:vectorLayers,onChange:function onChange(layer){return _this.updateRouteConfig({excludeLayer:(layer||{}).id})},showNone:true,value:routeConfig.excludeLayer||""}),/*#__PURE__*/React.createElement("button",{className:"button",onClick:_this.setRedliningTool},/*#__PURE__*/React.createElement(Icon,{icon:"draw"}))):null),routeConfig.busy?/*#__PURE__*/React.createElement("div",{className:"routing-busy"},/*#__PURE__*/React.createElement(Spinner,null)," ",LocaleUtils.tr("routing.computing")):null,routeConfig.result?_this.renderRouteResult(routeConfig):null)});_defineProperty(_this,"updateTransitTimepoint",function(ev){var diff={timepoint:ev.target.value};if(ev.target.value!=="now"&&_this.state.settings.transit.timepoint==="now"){var tzoffset=new Date().getTimezoneOffset()*60000;diff.time=new Date(Date.now()-tzoffset).toISOString().slice(0,-1)}_this.updateSetting("transit",diff)});_defineProperty(_this,"setRedliningTool",function(){_this.props.setCurrentTask("Redlining",null,null,{layerId:_this.state.routeConfig.excludeLayer})});_defineProperty(_this,"renderRouteResult",function(routeConfig){if(routeConfig.result.success===false){return/*#__PURE__*/React.createElement("div",{className:"routing-status-failure"},routeConfig.result.data.errorMsgId?LocaleUtils.tr(routeConfig.result.data.errorMsgId):routeConfig.result.data.error)}else{return/*#__PURE__*/React.createElement("div",{className:"routing-result"},/*#__PURE__*/React.createElement("div",{className:"routing-result-summary"},/*#__PURE__*/React.createElement("span",null,/*#__PURE__*/React.createElement(Icon,{icon:"clock"})," ",MeasureUtils.formatDuration(routeConfig.result.data.summary.time)),/*#__PURE__*/React.createElement("span",{className:"routing-result-spacer"}),/*#__PURE__*/React.createElement("span",null,/*#__PURE__*/React.createElement(Icon,{icon:"measure"})," ",MeasureUtils.formatMeasurement(routeConfig.result.data.summary.length,false)),/*#__PURE__*/React.createElement("span",{className:"routing-result-spacer"}),/*#__PURE__*/React.createElement("span",null,/*#__PURE__*/React.createElement(Icon,{icon:"export"})," ",/*#__PURE__*/React.createElement("a",{href:"#",onClick:_this.exportRoute},LocaleUtils.tr("routing.export")))),/*#__PURE__*/React.createElement("div",{className:"routing-result-instructions"},routeConfig.result.data.legs.map(function(leg,lidx){return leg.maneuvers.map(function(entry,eidx){return/*#__PURE__*/React.createElement("div",{className:"routing-result-instruction",key:"instr"+lidx+":"+eidx,onMouseEnter:function onMouseEnter(){return _this.highlightRouteSection(lidx+":"+eidx,entry,leg)},onMouseLeave:function onMouseLeave(){return _this.clearRouteSectionHighlight(lidx+":"+eidx)}},/*#__PURE__*/React.createElement("div",null,/*#__PURE__*/React.createElement(Icon,{icon:entry.icon}),/*#__PURE__*/React.createElement("b",null,entry.instruction)),/*#__PURE__*/React.createElement("div",{className:"routing-result-instruction-summary"},/*#__PURE__*/React.createElement("span",null,/*#__PURE__*/React.createElement(Icon,{icon:"clock"})," ",MeasureUtils.formatDuration(entry.time)),/*#__PURE__*/React.createElement("span",{className:"routing-result-spacer"}),/*#__PURE__*/React.createElement("span",null,/*#__PURE__*/React.createElement(Icon,{icon:"measure"})," ",MeasureUtils.formatMeasurement(entry.length,false))))})})))}});_defineProperty(_this,"highlightRouteSection",function(id,entry,leg){_this.setState({highlightId:id});var feature={type:"Feature",crs:"EPSG:4326",geometry:{type:"LineString",coordinates:leg.coordinates.slice(entry.geom_indices[0],entry.geom_indices[1]+1)}};var sellayer={id:"routingselection",role:LayerRole.SELECTION,styleOptions:{strokeWidth:3,strokeColor:[255,255,0,1],strokeDash:[]}};_this.props.addLayerFeatures(sellayer,[feature],true)});_defineProperty(_this,"clearRouteSectionHighlight",function(id){if(_this.state.highlightId===id){_this.setState({highlightId:null});_this.props.removeLayer("routingselection")}});_defineProperty(_this,"renderIsochroneWidget",function(){var isoConfig=_this.state.isoConfig;var intervalValid=!!isoConfig.intervals.match(/^\d+(,\s*\d+)*$/);return/*#__PURE__*/React.createElement("div",{className:"routing-tab-widget"},/*#__PURE__*/React.createElement("div",{className:"routing-input"},/*#__PURE__*/React.createElement("div",null,isoConfig.points.map(function(entry,idx){return _this.renderSearchField(entry,idx,"isoConfig",idx>0)})),/*#__PURE__*/React.createElement("table",{className:"routing-iso-settings"},/*#__PURE__*/React.createElement("tbody",null,/*#__PURE__*/React.createElement("tr",null,/*#__PURE__*/React.createElement("td",null,LocaleUtils.tr("routing.iso_mode"),": "),/*#__PURE__*/React.createElement("td",{colSpan:"2"},/*#__PURE__*/React.createElement("select",{onChange:function onChange(ev){return _this.updateIsoConfig({mode:ev.target.value})},value:isoConfig.mode},/*#__PURE__*/React.createElement("option",{value:"time"},LocaleUtils.tr("routing.iso_mode_time")),/*#__PURE__*/React.createElement("option",{value:"distance"},LocaleUtils.tr("routing.iso_mode_distance"))))),/*#__PURE__*/React.createElement("tr",null,/*#__PURE__*/React.createElement("td",null,LocaleUtils.tr("routing.iso_intervals"),": "),/*#__PURE__*/React.createElement("td",null,/*#__PURE__*/React.createElement("input",{className:isoConfig.intervals&&!intervalValid?"routing-input-invalid":"",onChange:function onChange(ev){return _this.updateIsoConfig({intervals:ev.target.value})},placeholder:"5, 10, 15",type:"text",value:isoConfig.intervals})),/*#__PURE__*/React.createElement("td",null,isoConfig.mode==="time"?"min":"km")))),/*#__PURE__*/React.createElement("div",{className:"routing-points-commands"},/*#__PURE__*/React.createElement("a",{href:"#",onClick:function onClick(){return _this.addPoint("isoConfig",isoConfig.points.length)}},/*#__PURE__*/React.createElement(Icon,{icon:"plus"})," ",LocaleUtils.tr("routing.add")),/*#__PURE__*/React.createElement("span",{className:"routing-points-commands-spacer"}),_this.renderImportButton("isoConfig"),/*#__PURE__*/React.createElement("span",{className:"routing-points-commands-spacer"}),/*#__PURE__*/React.createElement("a",{href:"#",onClick:function onClick(){return _this.clearConfig("isoConfig")}},/*#__PURE__*/React.createElement(Icon,{icon:"clear"})," ",LocaleUtils.tr("routing.clear")))),isoConfig.busy?/*#__PURE__*/React.createElement("div",{className:"routing-busy"},/*#__PURE__*/React.createElement(Spinner,null)," ",LocaleUtils.tr("routing.computing")):null,isoConfig.result?_this.renderIsochroneResult(isoConfig):null)});_defineProperty(_this,"renderIsochroneResult",function(isoConfig){if(isoConfig.result.success===false){return/*#__PURE__*/React.createElement("div",{className:"routing-status-failure"},isoConfig.result.data.errorMsgId?LocaleUtils.tr(isoConfig.result.data.errorMsgId):isoConfig.result.data.error)}else{return/*#__PURE__*/React.createElement("div",{className:"routing-result"},/*#__PURE__*/React.createElement("div",{className:"routing-result-summary"},/*#__PURE__*/React.createElement(Icon,{icon:"export"})," ",/*#__PURE__*/React.createElement("a",{href:"#",onClick:_this.exportIsochrone},LocaleUtils.tr("routing.export"))))}});_defineProperty(_this,"renderSearchField",function(entry,idx,config,removeable){var placeholder=arguments.length>4&&arguments[4]!==undefined?arguments[4]:null;return/*#__PURE__*/React.createElement("div",{className:"routing-search-field controlgroup",key:"field"+idx},/*#__PURE__*/React.createElement(SearchWidget,{placeholder:placeholder,resultSelected:function resultSelected(result){return _this.searchResultSelected(config,idx,result)},role:"input",searchParams:_this.state.searchParams,searchProviders:_this.state.searchProviders,value:entry.text}),idx===0?/*#__PURE__*/React.createElement("button",{className:"button",disabled:!_this.props.locatePos,onClick:function onClick(){return _this.updatePoint(config,0,_this.locatePos())},role:"suffix"},/*#__PURE__*/React.createElement(Icon,{icon:"screenshot"})):null,removeable?/*#__PURE__*/React.createElement("button",{className:"button",onClick:function onClick(){return _this.removePoint(config,idx)},role:"suffix"},/*#__PURE__*/React.createElement(Icon,{icon:"remove"})):null)});_defineProperty(_this,"renderImportButton",function(config){return/*#__PURE__*/React.createElement("label",{className:"routing-import-button",title:LocaleUtils.tr("routing.importhint")},/*#__PURE__*/React.createElement(Icon,{icon:"import"})," ",LocaleUtils.tr("routing.importpoints"),/*#__PURE__*/React.createElement("input",{onChange:function onChange(ev){return _this.importPoints(ev,config)},type:"file"}))});_defineProperty(_this,"locatePos",function(){return{pos:_toConsumableArray(_this.props.locatePos),text:_this.props.locatePos.map(function(x){return x.toFixed(4)}).join(", "),crs:"EPSG:4326"}});_defineProperty(_this,"updateSetting",function(mode,diff){_this.setState(function(state){return{settings:_objectSpread(_objectSpread({},state.settings),{},_defineProperty({},mode,_objectSpread(_objectSpread({},state.settings[mode]),diff)))}});_this.recomputeIfNeeded()});_defineProperty(_this,"addPoint",function(config){var index=arguments.length>1&&arguments[1]!==undefined?arguments[1]:-1;var entry=arguments.length>2&&arguments[2]!==undefined?arguments[2]:{text:"",pos:null};_this.setState(function(state){return _defineProperty({},config,_objectSpread(_objectSpread({},state[config]),{},{points:[].concat(_toConsumableArray(state[config].points.slice(0,index)),[entry],_toConsumableArray(state[config].points.slice(index)))}))});if(entry.pos){_this.recomputeIfNeeded()}});_defineProperty(_this,"updatePoint",function(config,idx,diff){_this.setState(function(state){return _defineProperty({},config,_objectSpread(_objectSpread({},state[config]),{},{points:[].concat(_toConsumableArray(state[config].points.slice(0,idx)),[_objectSpread(_objectSpread({},state[config].points[idx]),diff)],_toConsumableArray(state[config].points.slice(idx+1)))}))});_this.recomputeIfNeeded()});_defineProperty(_this,"importPoints",function(ev,config){var reader=new FileReader;reader.onload=function(loadev){try{var obj=JSON.parse(loadev.target.result);var crs="EPSG:4326";if(obj.crs&&obj.crs.properties){crs=CoordinatesUtils.fromOgcUrnCrs(obj.crs.properties.name)}var prec=CoordinatesUtils.getPrecision(crs);_this.setState(function(state){return _defineProperty({},config,_objectSpread(_objectSpread({},state[config]),{},{points:obj.features.map(function(feature){var coordinates=feature.geometry.coordinates;return{text:coordinates.map(function(x){return x.toFixed(prec)}).join(", ")+" ("+crs+")",pos:coordinates,crs:crs}})}))});_this.recomputeIfNeeded()}catch(e){// eslint-disable-next-line
|
|
12
|
+
alert(LocaleUtils.tr("routing.importerror"))}};reader.readAsText(ev.target.files[0])});_defineProperty(_this,"removePoint",function(config,idx){_this.setState(function(state){return _defineProperty({},config,_objectSpread(_objectSpread({},state[config]),{},{points:[].concat(_toConsumableArray(state[config].points.slice(0,idx)),_toConsumableArray(state[config].points.slice(idx+1)))}))});_this.recomputeIfNeeded()});_defineProperty(_this,"clearConfig",function(config){var newPoints=config==="routeConfig"?[{text:"",pos:null,crs:null},{text:"",pos:null,crs:null}]:[{text:"",pos:null,crs:null}];_this.setState(function(state){return _defineProperty({},config,_objectSpread(_objectSpread({},state[config]),{},{points:newPoints,result:null}))});_this.props.removeLayer("routinggeometries");_this.props.removeLayer("routingmarkers");_this.recomputeIfNeeded()});_defineProperty(_this,"reverseRoutePts",function(){_this.setState(function(state){return{routeConfig:_objectSpread(_objectSpread({},state.routeConfig),{},{points:state.routeConfig.points.reverse()})}});_this.recomputeIfNeeded()});_defineProperty(_this,"updateRouteConfig",function(diff){var recompute=arguments.length>1&&arguments[1]!==undefined?arguments[1]:true;_this.setState(function(state){return{routeConfig:_objectSpread(_objectSpread({},state.routeConfig),diff)}});if(recompute){_this.recomputeIfNeeded()}});_defineProperty(_this,"updateIsoConfig",function(diff){var recompute=arguments.length>1&&arguments[1]!==undefined?arguments[1]:true;_this.setState(function(state){return{isoConfig:_objectSpread(_objectSpread({},state.isoConfig),diff)}});if(recompute){_this.recomputeIfNeeded()}});_defineProperty(_this,"searchResultSelected",function(config,idx,result){if(result){_this.updatePoint(config,idx,{text:result.text,pos:[result.x,result.y],crs:result.crs})}else{_this.updatePoint(config,idx,{text:"",pos:null,crs:null})}});_defineProperty(_this,"updateRoutingMarkers",function(){var points=[];if(_this.state.currentTab==="Route"){points=_this.state.routeConfig.points}else{points=_this.state.isoConfig.points}var layer={id:"routingmarkers",role:LayerRole.MARKER,styleName:"marker"};var features=points.filter(function(point){return point.pos}).map(function(point,idx){return{type:"Feature",crs:point.crs,geometry:{type:"Point",coordinates:point.pos},properties:{label:_this.props.showPinLabels&&_this.state.routeConfig.result?String(idx+1):null}}});_this.props.addLayerFeatures(layer,features,true)});_defineProperty(_this,"computeRoute",function(){var locations=_this.state.routeConfig.points.filter(function(entry){return entry.pos}).map(function(entry){return CoordinatesUtils.reproject(entry.pos,entry.crs,"EPSG:4326")});_this.props.removeLayer("routinggeometries");_this.updateRouteConfig({busy:locations.length>=2,result:null},false);if(locations.length<2){return}if(_this.state.routeConfig.roundtrip){locations.push(locations[0])}var settings=_objectSpread({},_this.state.settings[_this.state.mode]);if(_this.state.routeConfig.excludeLayer){var layer=_this.props.layers.find(function(l){return l.id===_this.state.routeConfig.excludeLayer});if(layer){settings.exclude_polygons=layer.features.filter(function(feature){return feature.geometry.type==="Polygon"}).map(function(feature){return VectorLayerUtils.reprojectGeometry(feature.geometry,_this.props.mapCrs,"EPSG:4326").coordinates[0]})}}settings.optimized_route=_this.state.routeConfig.optimized_route;RoutingInterface.computeRoute(_this.state.mode,locations,settings,function(success,result){if(success){// Add routing leg geometries
|
|
13
|
+
var _layer={id:"routinggeometries",role:LayerRole.SELECTION,styleName:"default",styleOptions:{strokeColor:[10,10,255,1],strokeWidth:4,strokeDash:[]}};var features=[];result.legs.forEach(function(leg){leg.maneuvers.forEach(function(man){features.push({type:"Feature",crs:"EPSG:4326",styleOptions:{strokeColor:man.color},geometry:{type:"LineString",coordinates:leg.coordinates.slice(man.geom_indices[0],man.geom_indices[1]+1)}})})});_this.props.addLayerFeatures(_layer,features,true);// Reorder locations based on routing result, keeping null entries
|
|
14
|
+
var _this$state$routeConf=_this.state.routeConfig.points.reduce(function(res,point,idx){return point.pos?_objectSpread(_objectSpread({},res),{},{points:[].concat(_toConsumableArray(res.points),[point])}):_objectSpread(_objectSpread({},res),{},{nullPoints:[].concat(_toConsumableArray(res.nullPoints),[{point:point,idx:idx}])})},{points:[],nullPoints:[]}),points=_this$state$routeConf.points,nullPoints=_this$state$routeConf.nullPoints;var reorderedPoints=result.locations.map(function(location){return points[location.orig_idx]}).filter(Boolean);nullPoints.forEach(function(entry){reorderedPoints.splice(entry.idx,0,entry.point)});_this.updateRouteConfig({points:reorderedPoints,result:{success:success,data:result},busy:false},false);if(_this.props.zoomAuto){_this.props.zoomToExtent(result.summary.bounds,"EPSG:4326",-1)}}else{_this.updateRouteConfig({result:{success:success,data:result},busy:false},false)}})});_defineProperty(_this,"computeIsochrone",function(){var intervalValid=!!_this.state.isoConfig.intervals.match(/^\d+(,\s*\d+)*$/);if(!intervalValid){return}var locations=_this.state.isoConfig.points.filter(function(entry){return entry.pos}).map(function(entry){return CoordinatesUtils.reproject(entry.pos,entry.crs,"EPSG:4326")});_this.props.removeLayer("routinggeometries");_this.updateIsoConfig({busy:true,result:null},false);var contourOptions={mode:_this.state.isoConfig.mode,intervals:_this.state.isoConfig.intervals.split(",").map(function(entry){return parseInt(entry.trim(),10)}).sort()};RoutingInterface.computeIsochrone(_this.state.mode,locations,contourOptions,_this.state.settings[_this.state.mode],function(success,result){if(success){var layer={id:"routinggeometries",role:LayerRole.SELECTION,styleOptions:{strokeColor:[10,10,255,1],fillColor:[10,10,255,0.5],strokeWidth:4,strokeDash:[]}};var features=result.areas.map(function(area){return{type:"Feature",crs:"EPSG:4326",geometry:{type:"Polygon",coordinates:[area]}}});_this.props.addLayerFeatures(layer,features,true);if(_this.props.zoomAuto){_this.props.zoomToExtent(result.bounds,"EPSG:4326",-0.5)}}_this.updateIsoConfig({result:{success:success,data:result},busy:false},false)})});_defineProperty(_this,"recomputeIfNeeded",function(){clearTimeout(_this.recomputeTimeout);_this.recomputeTimeout=setTimeout(function(){if(_this.state.currentTab==="Route"&&_this.state.routeConfig.points.filter(function(entry){return entry.pos}).length>=2){_this.computeRoute()}else if(_this.state.currentTab==="Reachability"&&_this.state.isoConfig.points.filter(function(entry){return entry.pos}).length>0){_this.computeIsochrone()}_this.recomputeTimeout=null},750)});_defineProperty(_this,"exportRoute",function(){var data=JSON.stringify({type:"FeatureCollection",features:_this.state.routeConfig.result.data.legs.map(function(leg){return{type:"Feature",properties:{time:leg.time,length:leg.length},geometry:{type:"LineString",coordinates:leg.coordinates}}})});FileSaver.saveAs(new Blob([data],{type:"text/plain;charset=utf-8"}),"route.json")});_defineProperty(_this,"exportIsochrone",function(){var data=JSON.stringify({type:"FeatureCollection",features:_this.state.isoConfig.result.data.areas.map(function(area){return{type:"Feature",geometry:{type:"Polygon",coordinates:[area]}}})});FileSaver.saveAs(new Blob([data],{type:"text/plain;charset=utf-8"}),"isochrone.json")});_defineProperty(_this,"onSortChange",function(order,sortable,ev){var newpoints=_this.state.routeConfig.points.slice(0);var moved=newpoints.splice(ev.oldIndex,1)[0];newpoints.splice(ev.newIndex,0,moved);_this.updateRouteConfig({points:newpoints})});_this.recomputeTimeout=null;_this.state.mode=_this.props.enabledModes[0];return _this}_inherits(Routing,_React$Component);return _createClass(Routing,[{key:"componentDidUpdate",value:function componentDidUpdate(prevProps,prevState){var _this2=this;// Recollect search providers
|
|
15
|
+
if(this.props.searchProviders!==prevProps.searchProviders){this.setState({searchProviders:this.props.enabledProviders.map(function(key){return _this2.props.searchProviders[key]}).filter(Boolean),searchParams:{mapcrs:this.props.mapCrs,displaycrs:this.props.displayCrs}})}// Activated / message
|
|
16
|
+
if(this.props.task.id==="Routing"){this.props.setCurrentTask(null);if(!this.state.visible){this.setState({visible:true})}var taskData=this.props.task.data||{};if(taskData.from){this.setState({currentTab:"Route"});this.updatePoint("routeConfig",0,taskData.from)}if(taskData.to){this.setState({currentTab:"Route"});this.updatePoint("routeConfig",this.state.routeConfig.points.length-1,taskData.to)}if(taskData.via){this.setState({currentTab:"Route"});this.addPoint("routeConfig",-1,taskData.via)}if(taskData.isocenter){this.setState({currentTab:"Reachability"});this.updateIsoConfig({points:[taskData.isocenter]})}if(taskData.isoextracenter){this.setState({currentTab:"Reachability"});this.updateIsoConfig({points:[].concat(_toConsumableArray(this.state.isoConfig.points),[taskData.isoextracenter])})}}// Window closed
|
|
17
|
+
if(!this.state.visible&&prevState.visible){this.props.removeLayer("routinggeometries");this.props.removeLayer("routingmarkers");this.updateRouteConfig({points:[{text:"",pos:null,crs:null},{text:"",pos:null,crs:null}],result:null},false);this.updateIsoConfig({point:{text:"",pos:null,crs:null},result:null},false)}// No further processing beyond here if not visible
|
|
18
|
+
if(!this.state.visible){return}// Tab changed
|
|
19
|
+
if(this.state.currentTab!==prevState.currentTab){this.props.removeLayer("routinggeometries");this.props.removeLayer("routingmarkers");this.recomputeIfNeeded()}// Mode changed
|
|
20
|
+
if(this.state.mode!==prevState.mode){this.recomputeIfNeeded()}// Routing markers
|
|
21
|
+
if(this.state.currentTab!==prevState.currentTab||this.state.routeConfig.points!==prevState.routeConfig.points||this.state.isoConfig.points!==prevState.isoConfig.points){this.updateRoutingMarkers()}// Theme changed
|
|
22
|
+
if(this.props.theme!==prevProps.theme){this.setState({visible:false})}// Recompute when exclude layer changes
|
|
23
|
+
if(this.state.currentTab==="Route"&&this.state.routeConfig.excludeLayer&&this.props.layers!==prevProps.layers){var newlayer=this.props.layers.find(function(layer){return layer.id===_this2.state.routeConfig.excludeLayer});var prevLayer=prevProps.layers.find(function(layer){return layer.id===_this2.state.routeConfig.excludeLayer});if(newlayer!==prevLayer){this.recomputeIfNeeded()}}}},{key:"render",value:function render(){var _this3=this;if(!this.state.visible){return null}var tabButtons=[{key:"Route",label:LocaleUtils.tr("routing.route")},{key:"Reachability",label:LocaleUtils.tr("routing.reachability")}];var tabRenderers={Route:this.renderRouteWidget,Reachability:this.renderIsochroneWidget};var buttons=[{key:"auto",icon:"routing-car",tooltip:LocaleUtils.tr("routing.mode_auto")},{key:"heavyvehicle",icon:"routing-truck",tooltip:LocaleUtils.tr("routing.mode_heavyvehicle")},{key:"transit",icon:"routing-train",tooltip:LocaleUtils.tr("routing.mode_transit")},{key:"bicycle",icon:"routing-bicycle",tooltip:LocaleUtils.tr("routing.mode_bicycle")},{key:"pedestrian",icon:"routing-walking",tooltip:LocaleUtils.tr("routing.mode_walking")}];var enabledButtons=this.props.enabledModes.map(function(entry){return buttons.find(function(button){return button.key===entry})});return/*#__PURE__*/React.createElement(ResizeableWindow,{dockable:this.props.geometry.side,icon:"routing",initialHeight:this.props.geometry.initialHeight,initialWidth:this.props.geometry.initialWidth,initialX:this.props.geometry.initialX,initialY:this.props.geometry.initialY,initiallyDocked:this.props.geometry.initiallyDocked,onClose:function onClose(){return _this3.setState({visible:false})},title:LocaleUtils.tr("routing.windowtitle")},/*#__PURE__*/React.createElement("div",{className:"routing-body",role:"body"},/*#__PURE__*/React.createElement(ButtonBar,{active:this.state.currentTab,buttons:tabButtons,className:"routing-buttonbar",onClick:function onClick(key){return _this3.setState({currentTab:key})}}),/*#__PURE__*/React.createElement("div",{className:"routing-frame"},/*#__PURE__*/React.createElement("div",{className:"routing-buttons controlgroup"},/*#__PURE__*/React.createElement(ButtonBar,{active:this.state.mode,buttons:enabledButtons,onClick:function onClick(key){return _this3.setState({mode:key})}}),/*#__PURE__*/React.createElement("button",{className:"button"+(this.state.settingsPopup?" pressed":""),onClick:function onClick(){return _this3.setState(function(state){return{settingsPopup:!state.settingsPopup}})}},/*#__PURE__*/React.createElement(Icon,{icon:"cog"})),this.state.settingsPopup?this.renderSettings():null),tabRenderers[this.state.currentTab]())))}}])}(React.Component);_defineProperty(Routing,"propTypes",{addLayerFeatures:PropTypes.func,displayCrs:PropTypes.string,/** List of enabled routing modes. */enabledModes:PropTypes.arrayOf(PropTypes.string),/** List of search providers to use for routing location search. */enabledProviders:PropTypes.arrayOf(PropTypes.string),/** Default window geometry with size, position and docking status. Positive position values (including '0') are related to top (InitialY) and left (InitialX), negative values (including '-0') to bottom (InitialY) and right (InitialX). */geometry:PropTypes.shape({initialWidth:PropTypes.number,initialHeight:PropTypes.number,initialX:PropTypes.number,initialY:PropTypes.number,initiallyDocked:PropTypes.bool,side:PropTypes.string}),layers:PropTypes.array,locatePos:PropTypes.array,mapCrs:PropTypes.string,removeLayer:PropTypes.func,searchProviders:PropTypes.object,setCurrentTask:PropTypes.func,/** Whether to label the routing waypoint pins with the route point number. */showPinLabels:PropTypes.bool,task:PropTypes.object,theme:PropTypes.object,/** Automatically zoom to the extent of the route */zoomAuto:PropTypes.bool,zoomToExtent:PropTypes.func});_defineProperty(Routing,"defaultProps",{enabledModes:["auto","heavyvehicle","transit","bicycle","pedestrian"],enabledProviders:["coordinates","nominatim"],geometry:{initialWidth:320,initialHeight:640,initialX:0,initialY:0,initiallyDocked:true,side:"left"},showPinLabels:true,zoomAuto:true});export default connect(createSelector([function(state){return state},searchProvidersSelector],function(state,searchProviders){return{displayCrs:state.map.displayCrs,layers:state.layers.flat,locatePos:state.locate.position,mapCrs:state.map.projection,searchProviders:searchProviders,task:state.task,theme:state.theme.current}}),{addLayerFeatures:addLayerFeatures,removeLayer:removeLayer,setCurrentTask:setCurrentTask,zoomToExtent:zoomToExtent})(Routing);
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
function _typeof(o){"@babel/helpers - typeof";return _typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(o){return typeof o}:function(o){return o&&"function"==typeof Symbol&&o.constructor===Symbol&&o!==Symbol.prototype?"symbol":typeof o},_typeof(o)}function ownKeys(e,r){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);r&&(o=o.filter(function(r){return Object.getOwnPropertyDescriptor(e,r).enumerable})),t.push.apply(t,o)}return t}function _objectSpread(e){for(var r=1;r<arguments.length;r++){var t=null!=arguments[r]?arguments[r]:{};r%2?ownKeys(Object(t),!0).forEach(function(r){_defineProperty(e,r,t[r])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):ownKeys(Object(t)).forEach(function(r){Object.defineProperty(e,r,Object.getOwnPropertyDescriptor(t,r))})}return e}function _classCallCheck(a,n){if(!(a instanceof n))throw new TypeError("Cannot call a class as a function")}function _defineProperties(e,r){for(var t=0;t<r.length;t++){var o=r[t];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(e,_toPropertyKey(o.key),o)}}function _createClass(e,r,t){return r&&_defineProperties(e.prototype,r),t&&_defineProperties(e,t),Object.defineProperty(e,"prototype",{writable:!1}),e}function _callSuper(t,o,e){return o=_getPrototypeOf(o),_possibleConstructorReturn(t,_isNativeReflectConstruct()?Reflect.construct(o,e||[],_getPrototypeOf(t).constructor):o.apply(t,e))}function _possibleConstructorReturn(t,e){if(e&&("object"==_typeof(e)||"function"==typeof e))return e;if(void 0!==e)throw new TypeError("Derived constructors may only return object or undefined");return _assertThisInitialized(t)}function _assertThisInitialized(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function _isNativeReflectConstruct(){try{var t=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){}))}catch(t){}return(_isNativeReflectConstruct=function _isNativeReflectConstruct(){return!!t})()}function _getPrototypeOf(t){return _getPrototypeOf=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(t){return t.__proto__||Object.getPrototypeOf(t)},_getPrototypeOf(t)}function _inherits(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function");t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,writable:!0,configurable:!0}}),Object.defineProperty(t,"prototype",{writable:!1}),e&&_setPrototypeOf(t,e)}function _setPrototypeOf(t,e){return _setPrototypeOf=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(t,e){return t.__proto__=e,t},_setPrototypeOf(t,e)}function _defineProperty(e,r,t){return(r=_toPropertyKey(r))in e?Object.defineProperty(e,r,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[r]=t,e}function _toPropertyKey(t){var i=_toPrimitive(t,"string");return"symbol"==_typeof(i)?i:i+""}function _toPrimitive(t,r){if("object"!=_typeof(t)||!t)return t;var e=t[Symbol.toPrimitive];if(void 0!==e){var i=e.call(t,r||"default");if("object"!=_typeof(i))return i;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===r?String:Number)(t)}/**
|
|
2
|
+
* Copyright 2020-2024 Sourcepole AG
|
|
3
|
+
* All rights reserved.
|
|
4
|
+
*
|
|
5
|
+
* This source code is licensed under the BSD-style license found in the
|
|
6
|
+
* LICENSE file in the root directory of this source tree.
|
|
7
|
+
*/import React from"react";import{connect}from"react-redux";import PropTypes from"prop-types";import{v1 as uuidv1}from"uuid";import{LayerRole,addLayerFeatures,removeLayer,clearLayer}from"../actions/layers";import{setSnappingConfig}from"../actions/map";import{changeRedliningState,resetRedliningState}from"../actions/redlining";import{setCurrentTask}from"../actions/task";import TaskBar from"../components/TaskBar";import LocaleUtils from"../utils/LocaleUtils";import"./style/Redlining.css";import"./style/ScratchDrawing.css";/**
|
|
8
|
+
* Task which which can be invoked by other tools to draw a geometry and pass it to a callback.
|
|
9
|
+
*
|
|
10
|
+
* Only useful for third-party code, i.e. over the JavaScript API.
|
|
11
|
+
*
|
|
12
|
+
* Invoke as `setCurrentTask("ScratchDrawing", null, null, {callback: <function(features, crs)>});`
|
|
13
|
+
*/var ScratchDrawing=/*#__PURE__*/function(_React$Component){function ScratchDrawing(props){var _this;_classCallCheck(this,ScratchDrawing);_this=_callSuper(this,ScratchDrawing,[props]);_defineProperty(_this,"createDrawLayer",function(data){var layerId=uuidv1();var features=(data.initialFeatures||[]).map(function(feature){return _objectSpread(_objectSpread({},feature),{},{id:uuidv1(),shape:feature.geometry.type,styleName:"default",styleOptions:_this.styleOptions(_this.drawingStyle(data.style))})});var layer={id:layerId,role:LayerRole.USERLAYER,type:"vector"};_this.props.addLayerFeatures(layer,features,true);return layerId});_defineProperty(_this,"drawingStyle",function(style){return _objectSpread({borderColor:[255,0,0,1],size:2,fillColor:[255,255,255,0.5],text:""},style)});_defineProperty(_this,"styleOptions",function(styleProps){return{strokeColor:styleProps.borderColor,strokeWidth:1+0.5*styleProps.size,fillColor:styleProps.fillColor,circleRadius:5+styleProps.size,strokeDash:[],headmarker:styleProps.headmarker,tailmarker:styleProps.tailmarker}});_defineProperty(_this,"submitGeometry",function(){var _this$props$layers$fi;var features=((_this$props$layers$fi=_this.props.layers.find(function(l){return l.id===_this.props.redlining.layer}))===null||_this$props$layers$fi===void 0?void 0:_this$props$layers$fi.features)||[];_this.submitted=true;_this.props.task.data.callback(features,_this.props.projection);_this.props.setCurrentTask(null)});_this.submitted=false;return _this}_inherits(ScratchDrawing,_React$Component);return _createClass(ScratchDrawing,[{key:"componentDidUpdate",value:function componentDidUpdate(prevProps){// Clear when task changes
|
|
14
|
+
if(this.props.task.id!=="ScratchDrawing"&&prevProps.task.id==="ScratchDrawing"){if(!this.submitted){prevProps.task.data.callback(null,null);this.submitted=true}this.props.removeLayer(prevProps.redlining.layer);this.props.resetRedliningState()}// Setup redlining state
|
|
15
|
+
if(this.props.task!==prevProps.task&&this.props.task.id==="ScratchDrawing"){if(prevProps.task.id==="ScratchDrawing"){this.props.removeLayer(prevProps.redlining.layer);if(!this.submitted){prevProps.task.data.callback(null,null);this.submitted=true}}this.submitted=false;var data=this.props.task.data;var layerId=this.createDrawLayer(data);this.props.setSnappingConfig(data.snapping,data.snappingActive);this.props.changeRedliningState({action:"PickDraw",geomType:data.geomType,layer:layerId,layerTitle:null,drawMultiple:data.drawMultiple,style:this.drawingStyle(data.style)})}}},{key:"render",value:function render(){var _this$props$task$data,_this2=this;return/*#__PURE__*/React.createElement(TaskBar,{task:"ScratchDrawing"},/*#__PURE__*/React.createElement("div",{className:"scratch-drawing-taskbar-body",role:"body"},/*#__PURE__*/React.createElement("span",null,(_this$props$task$data=this.props.task.data)===null||_this$props$task$data===void 0?void 0:_this$props$task$data.message),/*#__PURE__*/React.createElement("button",{className:"button",onClick:function onClick(){return _this2.submitGeometry()}},LocaleUtils.tr("scratchdrawing.finish"))))}}])}(React.Component);_defineProperty(ScratchDrawing,"propTypes",{addLayerFeatures:PropTypes.func,changeRedliningState:PropTypes.func,clearLayer:PropTypes.func,layers:PropTypes.array,projection:PropTypes.string,redlining:PropTypes.object,removeLayer:PropTypes.func,resetRedliningState:PropTypes.func,setCurrentTask:PropTypes.func,setSnappingConfig:PropTypes.func,task:PropTypes.object});export default connect(function(state){return{task:state.task,layers:state.layers.flat,redlining:state.redlining,projection:state.map.projection,theme:state.theme.current}},{changeRedliningState:changeRedliningState,addLayerFeatures:addLayerFeatures,clearLayer:clearLayer,removeLayer:removeLayer,resetRedliningState:resetRedliningState,setCurrentTask:setCurrentTask,setSnappingConfig:setSnappingConfig})(ScratchDrawing);
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
function _typeof(o){"@babel/helpers - typeof";return _typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(o){return typeof o}:function(o){return o&&"function"==typeof Symbol&&o.constructor===Symbol&&o!==Symbol.prototype?"symbol":typeof o},_typeof(o)}function _slicedToArray(r,e){return _arrayWithHoles(r)||_iterableToArrayLimit(r,e)||_unsupportedIterableToArray(r,e)||_nonIterableRest()}function _nonIterableRest(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function _unsupportedIterableToArray(r,a){if(r){if("string"==typeof r)return _arrayLikeToArray(r,a);var t={}.toString.call(r).slice(8,-1);return"Object"===t&&r.constructor&&(t=r.constructor.name),"Map"===t||"Set"===t?Array.from(r):"Arguments"===t||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t)?_arrayLikeToArray(r,a):void 0}}function _arrayLikeToArray(r,a){(null==a||a>r.length)&&(a=r.length);for(var e=0,n=Array(a);e<a;e++)n[e]=r[e];return n}function _iterableToArrayLimit(r,l){var t=null==r?null:"undefined"!=typeof Symbol&&r[Symbol.iterator]||r["@@iterator"];if(null!=t){var e,n,i,u,a=[],f=!0,o=!1;try{if(i=(t=t.call(r)).next,0===l){if(Object(t)!==t)return;f=!1}else for(;!(f=(e=i.call(t)).done)&&(a.push(e.value),a.length!==l);f=!0);}catch(r){o=!0,n=r}finally{try{if(!f&&null!=t["return"]&&(u=t["return"](),Object(u)!==u))return}finally{if(o)throw n}}return a}}function _arrayWithHoles(r){if(Array.isArray(r))return r}function ownKeys(e,r){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);r&&(o=o.filter(function(r){return Object.getOwnPropertyDescriptor(e,r).enumerable})),t.push.apply(t,o)}return t}function _objectSpread(e){for(var r=1;r<arguments.length;r++){var t=null!=arguments[r]?arguments[r]:{};r%2?ownKeys(Object(t),!0).forEach(function(r){_defineProperty(e,r,t[r])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):ownKeys(Object(t)).forEach(function(r){Object.defineProperty(e,r,Object.getOwnPropertyDescriptor(t,r))})}return e}function _classCallCheck(a,n){if(!(a instanceof n))throw new TypeError("Cannot call a class as a function")}function _defineProperties(e,r){for(var t=0;t<r.length;t++){var o=r[t];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(e,_toPropertyKey(o.key),o)}}function _createClass(e,r,t){return r&&_defineProperties(e.prototype,r),t&&_defineProperties(e,t),Object.defineProperty(e,"prototype",{writable:!1}),e}function _callSuper(t,o,e){return o=_getPrototypeOf(o),_possibleConstructorReturn(t,_isNativeReflectConstruct()?Reflect.construct(o,e||[],_getPrototypeOf(t).constructor):o.apply(t,e))}function _possibleConstructorReturn(t,e){if(e&&("object"==_typeof(e)||"function"==typeof e))return e;if(void 0!==e)throw new TypeError("Derived constructors may only return object or undefined");return _assertThisInitialized(t)}function _assertThisInitialized(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function _isNativeReflectConstruct(){try{var t=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){}))}catch(t){}return(_isNativeReflectConstruct=function _isNativeReflectConstruct(){return!!t})()}function _getPrototypeOf(t){return _getPrototypeOf=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(t){return t.__proto__||Object.getPrototypeOf(t)},_getPrototypeOf(t)}function _inherits(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function");t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,writable:!0,configurable:!0}}),Object.defineProperty(t,"prototype",{writable:!1}),e&&_setPrototypeOf(t,e)}function _setPrototypeOf(t,e){return _setPrototypeOf=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(t,e){return t.__proto__=e,t},_setPrototypeOf(t,e)}function _defineProperty(e,r,t){return(r=_toPropertyKey(r))in e?Object.defineProperty(e,r,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[r]=t,e}function _toPropertyKey(t){var i=_toPrimitive(t,"string");return"symbol"==_typeof(i)?i:i+""}function _toPrimitive(t,r){if("object"!=_typeof(t)||!t)return t;var e=t[Symbol.toPrimitive];if(void 0!==e){var i=e.call(t,r||"default");if("object"!=_typeof(i))return i;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===r?String:Number)(t)}/**
|
|
2
|
+
* Copyright 2024 Sourcepole AG
|
|
3
|
+
* All rights reserved.
|
|
4
|
+
*
|
|
5
|
+
* This source code is licensed under the BSD-style license found in the
|
|
6
|
+
* LICENSE file in the root directory of this source tree.
|
|
7
|
+
*/import React from"react";import{connect}from"react-redux";import axios from"axios";import isEmpty from"lodash.isempty";import PropTypes from"prop-types";import url from"url";import{setColorScheme,setUserInfoFields}from"../actions/localConfig";import SideBar from"../components/SideBar";import ConfigUtils from"../utils/ConfigUtils";import LocaleUtils from"../utils/LocaleUtils";import{getUserBookmarks}from"../utils/PermaLinkUtils";import ThemeUtils from"../utils/ThemeUtils";import"./style/Settings.css";/**
|
|
8
|
+
* Settings panel.
|
|
9
|
+
*
|
|
10
|
+
* Allows configuring language and color scheme.
|
|
11
|
+
*/var Settings=/*#__PURE__*/function(_React$Component){function Settings(){var _this;_classCallCheck(this,Settings);for(var _len=arguments.length,args=new Array(_len),_key=0;_key<_len;_key++){args[_key]=arguments[_key]}_this=_callSuper(this,Settings,[].concat(args));_defineProperty(_this,"state",{bookmarks:{}});_defineProperty(_this,"onShow",function(){var username=ConfigUtils.getConfigProp("username");if(_this.props.showDefaultThemeSelector&&username){getUserBookmarks(username,function(bookmarks){var bookmarkKeys=bookmarks.reduce(function(res,entry){return _objectSpread(_objectSpread({},res),{},_defineProperty({},entry.key,entry.description))},{});_this.setState({bookmarks:bookmarkKeys})})}});_defineProperty(_this,"renderBody",function(){return/*#__PURE__*/React.createElement("div",{className:"settings-body"},/*#__PURE__*/React.createElement("table",{className:"settings-table"},/*#__PURE__*/React.createElement("tbody",null,_this.renderLanguageSelector(),_this.renderColorSchemeSelector(),_this.renderDefaultThemeSelector())))});_defineProperty(_this,"renderLanguageSelector",function(){if(isEmpty(_this.props.languages)){return null}var lang=LocaleUtils.lang();return/*#__PURE__*/React.createElement("tr",null,/*#__PURE__*/React.createElement("td",null,LocaleUtils.tr("settings.language"),"\xA0"),/*#__PURE__*/React.createElement("td",null,/*#__PURE__*/React.createElement("select",{onChange:_this.changeLocale,value:lang},/*#__PURE__*/React.createElement("option",{key:"syslang",value:""},LocaleUtils.tr("settings.systemlang")),_this.props.languages.map(function(entry){var _entry$title;return/*#__PURE__*/React.createElement("option",{key:entry.value,value:entry.value},(_entry$title=entry.title)!==null&&_entry$title!==void 0?_entry$title:LocaleUtils.tr(entry.titleMsgId))}))))});_defineProperty(_this,"renderColorSchemeSelector",function(){if(isEmpty(_this.props.colorSchemes)){return null}return/*#__PURE__*/React.createElement("tr",null,/*#__PURE__*/React.createElement("td",null,LocaleUtils.tr("settings.colorscheme")),/*#__PURE__*/React.createElement("td",null,/*#__PURE__*/React.createElement("select",{onChange:_this.changeColorScheme,value:_this.props.colorScheme},_this.props.colorSchemes.map(function(entry){var _entry$title2;return/*#__PURE__*/React.createElement("option",{key:entry.value,value:entry.value},(_entry$title2=entry.title)!==null&&_entry$title2!==void 0?_entry$title2:LocaleUtils.tr(entry.titleMsgId))}))))});_defineProperty(_this,"renderDefaultThemeSelector",function(){if(!_this.props.showDefaultThemeSelector||!ConfigUtils.getConfigProp("username")){return null}var themeNames=ThemeUtils.getThemeNames(_this.props.themes);return/*#__PURE__*/React.createElement("tr",null,/*#__PURE__*/React.createElement("td",null,LocaleUtils.tr("settings.defaulttheme")),/*#__PURE__*/React.createElement("td",null,/*#__PURE__*/React.createElement("select",{onChange:_this.changeDefaultUrlParams,value:_this.props.defaultUrlParams},/*#__PURE__*/React.createElement("option",{value:""},LocaleUtils.tr("settings.default")),/*#__PURE__*/React.createElement("option",{disabled:true},LocaleUtils.tr("settings.themes")),Object.entries(themeNames).map(function(_ref){var _ref2=_slicedToArray(_ref,2),id=_ref2[0],name=_ref2[1];return/*#__PURE__*/React.createElement("option",{key:id,value:"t="+id},name)}),/*#__PURE__*/React.createElement("option",{disabled:true},LocaleUtils.tr("settings.bookmarks")),Object.entries(_this.state.bookmarks).map(function(_ref3){var _ref4=_slicedToArray(_ref3,2),key=_ref4[0],name=_ref4[1];return/*#__PURE__*/React.createElement("option",{key:key,value:"bk="+key},name)}))))});_defineProperty(_this,"changeDefaultUrlParams",function(ev){var params={default_url_params:ev.target.value};var baseurl=location.href.split("?")[0].replace(/\/$/,"");axios.get(baseurl+"/setuserinfo",{params:params}).then(function(response){if(!response.data.success){/* eslint-disable-next-line */alert(LocaleUtils.tr("settings.defaultthemefailed",response.data.error));ev.target.value=_this.props.defaultUrlParams}else{_this.props.setUserInfoFields(response.data.fields)}})["catch"](function(e){/* eslint-disable-next-line */alert(LocaleUtils.tr("settings.defaultthemefailed",String(e)));ev.target.value=_this.props.defaultUrlParams})});_defineProperty(_this,"changeLocale",function(ev){// eslint-disable-next-line
|
|
12
|
+
if(confirm(LocaleUtils.tr("settings.confirmlang"))){var lang=ev.target.value;var urlParts=url.parse(location.href,true);if(!lang){delete urlParts.query.lang}else{urlParts.query=_objectSpread(_objectSpread({},urlParts.query),{},{lang:lang})}delete urlParts.search;location=url.format(urlParts)}});_defineProperty(_this,"changeColorScheme",function(ev){_this.props.setColorScheme(ev.target.value,true)});return _this}_inherits(Settings,_React$Component);return _createClass(Settings,[{key:"render",value:function render(){var _this2=this;return/*#__PURE__*/React.createElement(SideBar,{icon:"cog",id:"Settings",onShow:this.onShow,side:this.props.side,title:LocaleUtils.tr("appmenu.items.Settings"),width:"25em"},function(){return{body:_this2.renderBody()}})}}])}(React.Component);_defineProperty(Settings,"availableIn3D",true);_defineProperty(Settings,"propTypes",{colorScheme:PropTypes.string,/** List of available color schemes. Value is the css class name, title/titleMsgId the display name. */colorSchemes:PropTypes.arrayOf(PropTypes.shape({title:PropTypes.string,titleMsgId:PropTypes.string,value:PropTypes.string})),defaultUrlParams:PropTypes.string,/** List of available languages. Value is the lang code, title/titleMsgId the display name. */languages:PropTypes.arrayOf(PropTypes.shape({title:PropTypes.string,titleMsgId:PropTypes.string,value:PropTypes.string})),setColorScheme:PropTypes.func,setUserInfoFields:PropTypes.func,/** Whether to show a selector to set the default theme/bookmark (of a logged in user). */showDefaultThemeSelector:PropTypes.bool,/** The side of the application on which to display the sidebar. */side:PropTypes.string,themes:PropTypes.object});_defineProperty(Settings,"defaultProps",{colorSchemes:[],languages:[],side:"right",showDefaultThemeSelector:true});export default connect(function(state){var _state$localConfig$us;return{colorScheme:state.localConfig.colorScheme,defaultUrlParams:((_state$localConfig$us=state.localConfig.user_infos)===null||_state$localConfig$us===void 0?void 0:_state$localConfig$us.default_url_params)||"",themes:state.theme.themes}},{setColorScheme:setColorScheme,setUserInfoFields:setUserInfoFields})(Settings);
|
package/plugins/Share.js
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
function _typeof(o){"@babel/helpers - typeof";return _typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(o){return typeof o}:function(o){return o&&"function"==typeof Symbol&&o.constructor===Symbol&&o!==Symbol.prototype?"symbol":typeof o},_typeof(o)}function _classCallCheck(a,n){if(!(a instanceof n))throw new TypeError("Cannot call a class as a function")}function _defineProperties(e,r){for(var t=0;t<r.length;t++){var o=r[t];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(e,_toPropertyKey(o.key),o)}}function _createClass(e,r,t){return r&&_defineProperties(e.prototype,r),t&&_defineProperties(e,t),Object.defineProperty(e,"prototype",{writable:!1}),e}function _callSuper(t,o,e){return o=_getPrototypeOf(o),_possibleConstructorReturn(t,_isNativeReflectConstruct()?Reflect.construct(o,e||[],_getPrototypeOf(t).constructor):o.apply(t,e))}function _possibleConstructorReturn(t,e){if(e&&("object"==_typeof(e)||"function"==typeof e))return e;if(void 0!==e)throw new TypeError("Derived constructors may only return object or undefined");return _assertThisInitialized(t)}function _assertThisInitialized(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function _isNativeReflectConstruct(){try{var t=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){}))}catch(t){}return(_isNativeReflectConstruct=function _isNativeReflectConstruct(){return!!t})()}function _getPrototypeOf(t){return _getPrototypeOf=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(t){return t.__proto__||Object.getPrototypeOf(t)},_getPrototypeOf(t)}function _inherits(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function");t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,writable:!0,configurable:!0}}),Object.defineProperty(t,"prototype",{writable:!1}),e&&_setPrototypeOf(t,e)}function _setPrototypeOf(t,e){return _setPrototypeOf=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(t,e){return t.__proto__=e,t},_setPrototypeOf(t,e)}function _defineProperty(e,r,t){return(r=_toPropertyKey(r))in e?Object.defineProperty(e,r,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[r]=t,e}function _toPropertyKey(t){var i=_toPrimitive(t,"string");return"symbol"==_typeof(i)?i:i+""}function _toPrimitive(t,r){if("object"!=_typeof(t)||!t)return t;var e=t[Symbol.toPrimitive];if(void 0!==e){var i=e.call(t,r||"default");if("object"!=_typeof(i))return i;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===r?String:Number)(t)}/**
|
|
2
|
+
* Copyright 2016-2024 Sourcepole AG
|
|
3
|
+
* All rights reserved.
|
|
4
|
+
*
|
|
5
|
+
* This source code is licensed under the BSD-style license found in the
|
|
6
|
+
* LICENSE file in the root directory of this source tree.
|
|
7
|
+
*/import React from"react";import{connect}from"react-redux";import isEmpty from"lodash.isempty";import PropTypes from"prop-types";import url from"url";import{View3DMode}from"../actions/display";import{addMarker,removeMarker}from"../actions/layers";import SideBar from"../components/SideBar";import ShareLink from"../components/share/ShareLink";import ShareQRCode from"../components/share/ShareQRCode";import ShareSocials from"../components/share/ShareSocials";import ToggleSwitch from"../components/widgets/ToggleSwitch";import ConfigUtils from"../utils/ConfigUtils";import CoordinatesUtils from"../utils/CoordinatesUtils";import LocaleUtils from"../utils/LocaleUtils";import{generatePermaLink}from"../utils/PermaLinkUtils";import"./style/Share.css";/**
|
|
8
|
+
* Share the current map as a URL/permalink.
|
|
9
|
+
*
|
|
10
|
+
* Compact permalinks will be generated if `permalinkServiceUrl` in `config.json` points to a `qwc-permalink-service`.
|
|
11
|
+
*/var Share=/*#__PURE__*/function(_React$Component){function Share(){var _this;_classCallCheck(this,Share);for(var _len=arguments.length,args=new Array(_len),_key=0;_key<_len;_key++){args[_key]=arguments[_key]}_this=_callSuper(this,Share,[].concat(args));_defineProperty(_this,"state",{location:"",expires:null,pin:false,permittedGroup:""});_defineProperty(_this,"renderBody",function(){var shareUrl=_this.state.location||"about:blank";if(_this.state.pin&&_this.state.location){var urlParts=url.parse(shareUrl,true);urlParts.query.hc=1;if(!urlParts.query.c){var posCrs=urlParts.query.crs||_this.props.map.projection;var prec=CoordinatesUtils.getPrecision(posCrs);urlParts.query.c=_this.props.map.center.map(function(x){return x.toFixed(prec)}).join(",")}delete urlParts.search;shareUrl=url.format(urlParts)}var shareSocials=_this.props.showSocials!==false?/*#__PURE__*/React.createElement(ShareSocials,{shareTitle:LocaleUtils.tr("share.shareTitle"),shareUrl:shareUrl,showSocials:_this.props.showSocials}):null;var shareLink=_this.props.showLink?/*#__PURE__*/React.createElement(ShareLink,{shareUrl:shareUrl}):null;var shareQRCode=_this.props.showQRCode?/*#__PURE__*/React.createElement(ShareQRCode,{shareUrl:shareUrl}):null;return/*#__PURE__*/React.createElement("div",null,_this.props.view3dMode!==View3DMode.FULLSCREEN&&ConfigUtils.havePlugin("StartupMarker")?/*#__PURE__*/React.createElement("div",{className:"share-option-pin"},/*#__PURE__*/React.createElement("span",null,LocaleUtils.tr("share.showpin")),/*#__PURE__*/React.createElement(ToggleSwitch,{active:_this.state.pin,onChange:function onChange(active){return _this.setState({pin:active})}})):null,!_this.state.location?/*#__PURE__*/React.createElement("div",{className:"share-reload-overlay"},/*#__PURE__*/React.createElement("div",null,/*#__PURE__*/React.createElement("button",{className:"button",onClick:_this.refreshPermalink},LocaleUtils.tr("share.refresh"))),!isEmpty(_this.props.restrictableGroups)?/*#__PURE__*/React.createElement("div",{className:"share-group-restriction"},/*#__PURE__*/React.createElement("span",null,LocaleUtils.tr("share.restricttogroup"),": "),/*#__PURE__*/React.createElement("select",{onChange:function onChange(ev){return _this.setState({permittedGroup:ev.target.value})},value:_this.state.permittedGroup},/*#__PURE__*/React.createElement("option",{value:""},LocaleUtils.tr("share.norestriction")),_this.props.restrictableGroups.map(function(entry){return/*#__PURE__*/React.createElement("option",{key:entry,value:entry},entry)}))):null):/*#__PURE__*/React.createElement("div",{className:"share-body"},shareSocials,shareLink,shareQRCode,_this.state.expires?/*#__PURE__*/React.createElement("div",{className:"share-validity"},LocaleUtils.tr("share.expires",_this.state.expires)):null))});_defineProperty(_this,"refreshPermalink",function(){generatePermaLink(function(permalink,expires){_this.setState({location:permalink,expires:expires,permittedGroup:""})},false,_this.state.permittedGroup)});return _this}_inherits(Share,_React$Component);return _createClass(Share,[{key:"componentDidUpdate",value:function componentDidUpdate(prevProps,prevState){var isVisible=this.props.currentTask==="Share";var wasVisible=prevProps.currentTask==="Share";if(this.props.map&&isVisible!==wasVisible||this.state.pin!==prevState.pin||this.props.map.center!==prevProps.map.center){if(isVisible&&this.state.pin){this.props.addMarker("sharecenter",this.props.map.center,"",this.props.map.projection)}else if(wasVisible){this.props.removeMarker("sharecenter")}}if(isVisible!==wasVisible||this.props.map.center!==prevProps.map.center){this.setState({location:"",expires:null})}}},{key:"render",value:function render(){var _this2=this;return/*#__PURE__*/React.createElement(SideBar,{icon:"share",id:"Share",onShow:this.onShow,side:this.props.side,title:LocaleUtils.tr("appmenu.items.Share"),width:"20em"},function(){return{body:_this2.renderBody()}})}}])}(React.Component);_defineProperty(Share,"availableIn3D",true);_defineProperty(Share,"propTypes",{addMarker:PropTypes.func,currentTask:PropTypes.string,map:PropTypes.object,removeMarker:PropTypes.func,/** List of groups for which a permalink may optionally be restricted. */restrictableGroups:PropTypes.array,/** Show the map URL. */showLink:PropTypes.bool,/** Show the QR code of the map URL. */showQRCode:PropTypes.bool,/** Show the social buttons. Either `true` or `false`to enable/disable all, or an array of specific buttons to display (possible choices: `email`, `facebook`, `twitter`, `linkedin`, `whatsapp`). */showSocials:PropTypes.oneOfType([PropTypes.bool,PropTypes.arrayOf(PropTypes.string)]),/** The side of the application on which to display the sidebar. */side:PropTypes.string,view3dMode:PropTypes.number});_defineProperty(Share,"defaultProps",{showSocials:true,showLink:true,showQRCode:true,side:"right"});export default connect(function(state){return{currentTask:state.task.id,map:state.map,view3dMode:state.display.view3dMode}},{addMarker:addMarker,removeMarker:removeMarker})(Share);
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
function _typeof(o){"@babel/helpers - typeof";return _typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(o){return typeof o}:function(o){return o&&"function"==typeof Symbol&&o.constructor===Symbol&&o!==Symbol.prototype?"symbol":typeof o},_typeof(o)}function _classCallCheck(a,n){if(!(a instanceof n))throw new TypeError("Cannot call a class as a function")}function _defineProperties(e,r){for(var t=0;t<r.length;t++){var o=r[t];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(e,_toPropertyKey(o.key),o)}}function _createClass(e,r,t){return r&&_defineProperties(e.prototype,r),t&&_defineProperties(e,t),Object.defineProperty(e,"prototype",{writable:!1}),e}function _callSuper(t,o,e){return o=_getPrototypeOf(o),_possibleConstructorReturn(t,_isNativeReflectConstruct()?Reflect.construct(o,e||[],_getPrototypeOf(t).constructor):o.apply(t,e))}function _possibleConstructorReturn(t,e){if(e&&("object"==_typeof(e)||"function"==typeof e))return e;if(void 0!==e)throw new TypeError("Derived constructors may only return object or undefined");return _assertThisInitialized(t)}function _assertThisInitialized(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function _isNativeReflectConstruct(){try{var t=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){}))}catch(t){}return(_isNativeReflectConstruct=function _isNativeReflectConstruct(){return!!t})()}function _getPrototypeOf(t){return _getPrototypeOf=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(t){return t.__proto__||Object.getPrototypeOf(t)},_getPrototypeOf(t)}function _inherits(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function");t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,writable:!0,configurable:!0}}),Object.defineProperty(t,"prototype",{writable:!1}),e&&_setPrototypeOf(t,e)}function _setPrototypeOf(t,e){return _setPrototypeOf=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(t,e){return t.__proto__=e,t},_setPrototypeOf(t,e)}function _defineProperty(e,r,t){return(r=_toPropertyKey(r))in e?Object.defineProperty(e,r,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[r]=t,e}function _toPropertyKey(t){var i=_toPrimitive(t,"string");return"symbol"==_typeof(i)?i:i+""}function _toPrimitive(t,r){if("object"!=_typeof(t)||!t)return t;var e=t[Symbol.toPrimitive];if(void 0!==e){var i=e.call(t,r||"default");if("object"!=_typeof(i))return i;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===r?String:Number)(t)}/**
|
|
2
|
+
* Copyright 2020-2024 Sourcepole AG
|
|
3
|
+
* All rights reserved.
|
|
4
|
+
*
|
|
5
|
+
* This source code is licensed under the BSD-style license found in the
|
|
6
|
+
* LICENSE file in the root directory of this source tree.
|
|
7
|
+
*/import React from"react";import{connect}from"react-redux";import PropTypes from"prop-types";import{addMarker,removeMarker}from"../actions/layers";import{UrlParams}from"../utils/PermaLinkUtils";/**
|
|
8
|
+
* Displays a marker when starting up the viewer.
|
|
9
|
+
*
|
|
10
|
+
* The marked is displayed in the center of the map if `c=<x>,<y>&hc=1` is set in the URL.
|
|
11
|
+
*/var StartupMarker=/*#__PURE__*/function(_React$Component){function StartupMarker(props){var _this;_classCallCheck(this,StartupMarker);_this=_callSuper(this,StartupMarker,[props]);_this.markerSet=false;return _this}_inherits(StartupMarker,_React$Component);return _createClass(StartupMarker,[{key:"componentDidUpdate",value:function componentDidUpdate(prevProps){var highlight=["true","1"].includes(""+(this.props.startupParams&&this.props.startupParams.hc||"").toLowerCase());if(highlight&&this.props.theme&&!prevProps.theme&&this.props.startupParams.c){UrlParams.updateParams({hc:undefined});var point=this.props.startupParams.c.split(/[;,]/g).map(function(x){return parseFloat(x)});prevProps.addMarker("startupposmarker",point,"",this.props.startupParams.crs||this.props.map.projection);this.markerSet=true}else if(this.markerSet){if(this.props.removeMode==="onpan"&&this.props.map.center!==prevProps.map.center&&this.props.map.zoom===prevProps.map.zoom||this.props.removeMode==="onzoom"&&this.props.map.zoom!==prevProps.map.zoom||this.props.removeMode==="onclickonmarker"&&this.props.click&&(this.props.click.features||[]).find(function(feature){return feature.id==="startupposmarker"})){prevProps.removeMarker("startupposmarker");this.markerSet=false}}}},{key:"render",value:function render(){return null}}])}(React.Component);_defineProperty(StartupMarker,"propTypes",{addMarker:PropTypes.func,click:PropTypes.object,map:PropTypes.object,removeMarker:PropTypes.func,/** When to remove the marker. Possible choices: onpan, onzoom, onclickonmarker. */removeMode:PropTypes.string,// onpan, onzoom, onclickonmarker
|
|
12
|
+
startupParams:PropTypes.object,theme:PropTypes.object});_defineProperty(StartupMarker,"defaultProps",{removeMode:"onpan"});export default connect(function(state){return{startupParams:state.localConfig.startupParams,click:state.map.click||{},map:state.map,theme:state.theme.current}},{addMarker:addMarker,removeMarker:removeMarker})(StartupMarker);
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
function _typeof(o){"@babel/helpers - typeof";return _typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(o){return typeof o}:function(o){return o&&"function"==typeof Symbol&&o.constructor===Symbol&&o!==Symbol.prototype?"symbol":typeof o},_typeof(o)}function _classCallCheck(a,n){if(!(a instanceof n))throw new TypeError("Cannot call a class as a function")}function _defineProperties(e,r){for(var t=0;t<r.length;t++){var o=r[t];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(e,_toPropertyKey(o.key),o)}}function _createClass(e,r,t){return r&&_defineProperties(e.prototype,r),t&&_defineProperties(e,t),Object.defineProperty(e,"prototype",{writable:!1}),e}function _callSuper(t,o,e){return o=_getPrototypeOf(o),_possibleConstructorReturn(t,_isNativeReflectConstruct()?Reflect.construct(o,e||[],_getPrototypeOf(t).constructor):o.apply(t,e))}function _possibleConstructorReturn(t,e){if(e&&("object"==_typeof(e)||"function"==typeof e))return e;if(void 0!==e)throw new TypeError("Derived constructors may only return object or undefined");return _assertThisInitialized(t)}function _assertThisInitialized(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function _isNativeReflectConstruct(){try{var t=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){}))}catch(t){}return(_isNativeReflectConstruct=function _isNativeReflectConstruct(){return!!t})()}function _getPrototypeOf(t){return _getPrototypeOf=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(t){return t.__proto__||Object.getPrototypeOf(t)},_getPrototypeOf(t)}function _inherits(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function");t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,writable:!0,configurable:!0}}),Object.defineProperty(t,"prototype",{writable:!1}),e&&_setPrototypeOf(t,e)}function _setPrototypeOf(t,e){return _setPrototypeOf=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(t,e){return t.__proto__=e,t},_setPrototypeOf(t,e)}function _defineProperty(e,r,t){return(r=_toPropertyKey(r))in e?Object.defineProperty(e,r,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[r]=t,e}function _toPropertyKey(t){var i=_toPrimitive(t,"string");return"symbol"==_typeof(i)?i:i+""}function _toPrimitive(t,r){if("object"!=_typeof(t)||!t)return t;var e=t[Symbol.toPrimitive];if(void 0!==e){var i=e.call(t,r||"default");if("object"!=_typeof(i))return i;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===r?String:Number)(t)}/**
|
|
2
|
+
* Copyright 2017-2024 Sourcepole AG
|
|
3
|
+
* All rights reserved.
|
|
4
|
+
*
|
|
5
|
+
* This source code is licensed under the BSD-style license found in the
|
|
6
|
+
* LICENSE file in the root directory of this source tree.
|
|
7
|
+
*/import React from"react";import{connect}from"react-redux";import classnames from"classnames";import PropTypes from"prop-types";import{setCurrentTask}from"../actions/task";import Icon from"../components/Icon";import ConfigUtils from"../utils/ConfigUtils";import LocaleUtils from"../utils/LocaleUtils";import ThemeUtils from"../utils/ThemeUtils";import"./style/Buttons.css";/**
|
|
8
|
+
* Generic map button to launch a task.
|
|
9
|
+
*/var TaskButton=/*#__PURE__*/function(_React$Component){function TaskButton(){var _this;_classCallCheck(this,TaskButton);for(var _len=arguments.length,args=new Array(_len),_key=0;_key<_len;_key++){args[_key]=arguments[_key]}_this=_callSuper(this,TaskButton,[].concat(args));_defineProperty(_this,"buttonClicked",function(){var mapClickAction=ConfigUtils.getPluginConfig(_this.props.task).mapClickAction;_this.props.setCurrentTask(_this.props.currentTask===_this.props.task?null:_this.props.task,_this.props.mode,mapClickAction)});return _this}_inherits(TaskButton,_React$Component);return _createClass(TaskButton,[{key:"render",value:function render(){if(!ThemeUtils.themeFlagsAllowed(this.props.theme,this.props.themeFlagWhitelist,this.props.themeFlagBlacklist)){return null}var right=this.props.mapMargins.right;var bottom=this.props.mapMargins.bottom;var style={right:"calc(1.5em + "+right+"px)",bottom:"calc(var(--bottombar-height) + "+bottom+"px + "+(3+4*this.props.position)+"em)"};var classes=classnames({"map-button":true,"map-button-active":this.props.currentTask===this.props.task});var title=LocaleUtils.tr("appmenu.items."+this.props.task+(this.props.mode||""));return/*#__PURE__*/React.createElement("button",{className:classes,onClick:this.buttonClicked,style:style,title:title},/*#__PURE__*/React.createElement(Icon,{icon:this.props.icon}))}}])}(React.Component);_defineProperty(TaskButton,"propTypes",{currentTask:PropTypes.string,/** The icon name. */icon:PropTypes.string,mapMargins:PropTypes.object,/** The task mode. */mode:PropTypes.string,/** The position slot index of the map button, from the bottom (0: bottom slot). */position:PropTypes.number,setCurrentTask:PropTypes.func,/** The task name. */task:PropTypes.string,theme:PropTypes.object,/** Omit the button in themes matching one of these flags. */themeFlagBlacklist:PropTypes.arrayOf(PropTypes.string),/** Only show the button in themes matching one of these flags. */themeFlagWhitelist:PropTypes.arrayOf(PropTypes.string)});_defineProperty(TaskButton,"defaultProps",{position:1});var selector=function selector(state){return{currentTask:state.task.id,mapMargins:state.windows.mapMargins,theme:state.theme.current}};export default connect(selector,{setCurrentTask:setCurrentTask})(TaskButton);
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
function _typeof(o){"@babel/helpers - typeof";return _typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(o){return typeof o}:function(o){return o&&"function"==typeof Symbol&&o.constructor===Symbol&&o!==Symbol.prototype?"symbol":typeof o},_typeof(o)}function _classCallCheck(a,n){if(!(a instanceof n))throw new TypeError("Cannot call a class as a function")}function _defineProperties(e,r){for(var t=0;t<r.length;t++){var o=r[t];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(e,_toPropertyKey(o.key),o)}}function _createClass(e,r,t){return r&&_defineProperties(e.prototype,r),t&&_defineProperties(e,t),Object.defineProperty(e,"prototype",{writable:!1}),e}function _callSuper(t,o,e){return o=_getPrototypeOf(o),_possibleConstructorReturn(t,_isNativeReflectConstruct()?Reflect.construct(o,e||[],_getPrototypeOf(t).constructor):o.apply(t,e))}function _possibleConstructorReturn(t,e){if(e&&("object"==_typeof(e)||"function"==typeof e))return e;if(void 0!==e)throw new TypeError("Derived constructors may only return object or undefined");return _assertThisInitialized(t)}function _assertThisInitialized(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function _isNativeReflectConstruct(){try{var t=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){}))}catch(t){}return(_isNativeReflectConstruct=function _isNativeReflectConstruct(){return!!t})()}function _getPrototypeOf(t){return _getPrototypeOf=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(t){return t.__proto__||Object.getPrototypeOf(t)},_getPrototypeOf(t)}function _inherits(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function");t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,writable:!0,configurable:!0}}),Object.defineProperty(t,"prototype",{writable:!1}),e&&_setPrototypeOf(t,e)}function _setPrototypeOf(t,e){return _setPrototypeOf=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(t,e){return t.__proto__=e,t},_setPrototypeOf(t,e)}function _defineProperty(e,r,t){return(r=_toPropertyKey(r))in e?Object.defineProperty(e,r,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[r]=t,e}function _toPropertyKey(t){var i=_toPrimitive(t,"string");return"symbol"==_typeof(i)?i:i+""}function _toPrimitive(t,r){if("object"!=_typeof(t)||!t)return t;var e=t[Symbol.toPrimitive];if(void 0!==e){var i=e.call(t,r||"default");if("object"!=_typeof(i))return i;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===r?String:Number)(t)}/**
|
|
2
|
+
* Copyright 2016-2024 Sourcepole AG
|
|
3
|
+
* All rights reserved.
|
|
4
|
+
*
|
|
5
|
+
* This source code is licensed under the BSD-style license found in the
|
|
6
|
+
* LICENSE file in the root directory of this source tree.
|
|
7
|
+
*/import React from"react";import{connect}from"react-redux";import PropTypes from"prop-types";import Icon from"../components/Icon";import SideBar from"../components/SideBar";import ThemeLayersListWindow from"../components/ThemeLayersListWindow";import ThemeList from"../components/ThemeList";import InputContainer from"../components/widgets/InputContainer";import ConfigUtils from"../utils/ConfigUtils";import LocaleUtils from"../utils/LocaleUtils";import"./style/ThemeSwitcher.css";/**
|
|
8
|
+
* Theme switcher panel.
|
|
9
|
+
*/var ThemeSwitcher=/*#__PURE__*/function(_React$Component){function ThemeSwitcher(){var _this;_classCallCheck(this,ThemeSwitcher);for(var _len=arguments.length,args=new Array(_len),_key=0;_key<_len;_key++){args[_key]=arguments[_key]}_this=_callSuper(this,ThemeSwitcher,[].concat(args));_defineProperty(_this,"state",{filter:""});_defineProperty(_this,"focusFilterField",function(el){if(el){// Need to wait until slide in transition is over
|
|
10
|
+
setTimeout(function(){if(_this.props.currentTask&&_this.props.currentTask.id==="ThemeSwitcher"){el.focus()}},500)}});return _this}_inherits(ThemeSwitcher,_React$Component);return _createClass(ThemeSwitcher,[{key:"render",value:function render(){var _this2=this;var allowAddingOtherThemes=ConfigUtils.getConfigProp("allowAddingOtherThemes",this.props.activeTheme)===true;var showAddThemeButton=allowAddingOtherThemes&&!this.props.hideAddThemeButton;var showAddThemeLayersButton=allowAddingOtherThemes&&!this.props.hideAddThemeLayersButton;var themeFilter=this.props.showThemeFilter?/*#__PURE__*/React.createElement(InputContainer,{className:"theme-switcher-filter"},/*#__PURE__*/React.createElement("input",{onChange:function onChange(ev){return _this2.setState({filter:ev.target.value})},placeholder:LocaleUtils.tr("themeswitcher.filter"),ref:this.focusFilterField,role:"input",type:"text",value:this.state.filter}),/*#__PURE__*/React.createElement(Icon,{icon:"remove",onClick:function onClick(){return _this2.setState({filter:""})},role:"suffix"})):null;var extraTitlebarContent=themeFilter;return/*#__PURE__*/React.createElement("div",null,/*#__PURE__*/React.createElement(SideBar,{extraTitlebarContent:extraTitlebarContent,icon:"themes",id:"ThemeSwitcher",minWidth:"16em",side:this.props.side,title:LocaleUtils.tr("appmenu.items.ThemeSwitcher"),width:this.props.width},function(){return{body:/*#__PURE__*/React.createElement(ThemeList,{activeTheme:_this2.props.activeTheme,allowAddingOtherThemeLayers:showAddThemeLayersButton,allowAddingOtherThemes:showAddThemeButton,collapsibleGroups:_this2.props.collapsibleGroups,filter:_this2.state.filter,showDefaultThemeSelector:_this2.props.showDefaultThemeSelector,showLayerAfterChangeTheme:_this2.props.showLayerAfterChangeTheme})}}),showAddThemeLayersButton?/*#__PURE__*/React.createElement(ThemeLayersListWindow,{windowSize:this.props.themeLayersListWindowSize}):null)}}])}(React.Component);_defineProperty(ThemeSwitcher,"availableIn3D",true);_defineProperty(ThemeSwitcher,"propTypes",{activeTheme:PropTypes.object,/** Whether to allow collapsing theme groups. */collapsibleGroups:PropTypes.bool,currentTask:PropTypes.object,/** Whether to hide the add theme button. Note: the button will also be hidden if the global option `allowAddingOtherThemes` is `false`. */hideAddThemeButton:PropTypes.bool,/** Whether to hide the add theme layers button. Note: the button will also be hidden if the global option `allowAddingOtherThemes` is `false`. */hideAddThemeLayersButton:PropTypes.bool,/** Whether to show an icon to select the default theme/bookmark (of a logged in user). */showDefaultThemeSelector:PropTypes.bool,/** Whether to show the LayerTree by default after switching the theme. */showLayerAfterChangeTheme:PropTypes.bool,/** Wether to show the theme filter field in the top bar. */showThemeFilter:PropTypes.bool,/** The side of the application on which to display the sidebar. */side:PropTypes.string,/** The default window size for the theme layers dialog. */themeLayersListWindowSize:PropTypes.shape({width:PropTypes.number,height:PropTypes.number}),/** Default width as a CSS string. */width:PropTypes.string});_defineProperty(ThemeSwitcher,"defaultProps",{width:"50%",showThemeFilter:true,showDefaultThemeSelector:true,showLayerAfterChangeTheme:false,themeLayersListWindowSize:{width:400,height:300},side:"right"});var selector=function selector(state){return{activeTheme:state.theme.current}};export default connect(selector,{})(ThemeSwitcher);
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
function _typeof(o){"@babel/helpers - typeof";return _typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(o){return typeof o}:function(o){return o&&"function"==typeof Symbol&&o.constructor===Symbol&&o!==Symbol.prototype?"symbol":typeof o},_typeof(o)}function _toConsumableArray(r){return _arrayWithoutHoles(r)||_iterableToArray(r)||_unsupportedIterableToArray(r)||_nonIterableSpread()}function _nonIterableSpread(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function _iterableToArray(r){if("undefined"!=typeof Symbol&&null!=r[Symbol.iterator]||null!=r["@@iterator"])return Array.from(r)}function _arrayWithoutHoles(r){if(Array.isArray(r))return _arrayLikeToArray(r)}function ownKeys(e,r){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);r&&(o=o.filter(function(r){return Object.getOwnPropertyDescriptor(e,r).enumerable})),t.push.apply(t,o)}return t}function _objectSpread(e){for(var r=1;r<arguments.length;r++){var t=null!=arguments[r]?arguments[r]:{};r%2?ownKeys(Object(t),!0).forEach(function(r){_defineProperty(e,r,t[r])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):ownKeys(Object(t)).forEach(function(r){Object.defineProperty(e,r,Object.getOwnPropertyDescriptor(t,r))})}return e}function _classCallCheck(a,n){if(!(a instanceof n))throw new TypeError("Cannot call a class as a function")}function _defineProperties(e,r){for(var t=0;t<r.length;t++){var o=r[t];o.enumerable=o.enumerable||!1,o.configurable=!0,"value"in o&&(o.writable=!0),Object.defineProperty(e,_toPropertyKey(o.key),o)}}function _createClass(e,r,t){return r&&_defineProperties(e.prototype,r),t&&_defineProperties(e,t),Object.defineProperty(e,"prototype",{writable:!1}),e}function _callSuper(t,o,e){return o=_getPrototypeOf(o),_possibleConstructorReturn(t,_isNativeReflectConstruct()?Reflect.construct(o,e||[],_getPrototypeOf(t).constructor):o.apply(t,e))}function _possibleConstructorReturn(t,e){if(e&&("object"==_typeof(e)||"function"==typeof e))return e;if(void 0!==e)throw new TypeError("Derived constructors may only return object or undefined");return _assertThisInitialized(t)}function _assertThisInitialized(e){if(void 0===e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return e}function _isNativeReflectConstruct(){try{var t=!Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){}))}catch(t){}return(_isNativeReflectConstruct=function _isNativeReflectConstruct(){return!!t})()}function _getPrototypeOf(t){return _getPrototypeOf=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(t){return t.__proto__||Object.getPrototypeOf(t)},_getPrototypeOf(t)}function _inherits(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function");t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,writable:!0,configurable:!0}}),Object.defineProperty(t,"prototype",{writable:!1}),e&&_setPrototypeOf(t,e)}function _setPrototypeOf(t,e){return _setPrototypeOf=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(t,e){return t.__proto__=e,t},_setPrototypeOf(t,e)}function _defineProperty(e,r,t){return(r=_toPropertyKey(r))in e?Object.defineProperty(e,r,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[r]=t,e}function _toPropertyKey(t){var i=_toPrimitive(t,"string");return"symbol"==_typeof(i)?i:i+""}function _toPrimitive(t,r){if("object"!=_typeof(t)||!t)return t;var e=t[Symbol.toPrimitive];if(void 0!==e){var i=e.call(t,r||"default");if("object"!=_typeof(i))return i;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===r?String:Number)(t)}function _slicedToArray(r,e){return _arrayWithHoles(r)||_iterableToArrayLimit(r,e)||_unsupportedIterableToArray(r,e)||_nonIterableRest()}function _nonIterableRest(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function _unsupportedIterableToArray(r,a){if(r){if("string"==typeof r)return _arrayLikeToArray(r,a);var t={}.toString.call(r).slice(8,-1);return"Object"===t&&r.constructor&&(t=r.constructor.name),"Map"===t||"Set"===t?Array.from(r):"Arguments"===t||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t)?_arrayLikeToArray(r,a):void 0}}function _arrayLikeToArray(r,a){(null==a||a>r.length)&&(a=r.length);for(var e=0,n=Array(a);e<a;e++)n[e]=r[e];return n}function _iterableToArrayLimit(r,l){var t=null==r?null:"undefined"!=typeof Symbol&&r[Symbol.iterator]||r["@@iterator"];if(null!=t){var e,n,i,u,a=[],f=!0,o=!1;try{if(i=(t=t.call(r)).next,0===l){if(Object(t)!==t)return;f=!1}else for(;!(f=(e=i.call(t)).done)&&(a.push(e.value),a.length!==l);f=!0);}catch(r){o=!0,n=r}finally{try{if(!f&&null!=t["return"]&&(u=t["return"](),Object(u)!==u))return}finally{if(o)throw n}}return a}}function _arrayWithHoles(r){if(Array.isArray(r))return r}/**
|
|
2
|
+
* Copyright 2024 Sourcepole AG
|
|
3
|
+
* All rights reserved.
|
|
4
|
+
*
|
|
5
|
+
* This source code is licensed under the BSD-style license found in the
|
|
6
|
+
* LICENSE file in the root directory of this source tree.
|
|
7
|
+
*/import React from"react";import{connect}from"react-redux";import dateParser,{Format}from"any-date-parser";import dayjs from"dayjs";import utc from"dayjs/plugin/utc";import isEmpty from"lodash.isempty";import isEqual from"lodash.isequal";import ol from"openlayers";import PropTypes from"prop-types";import{createSelector}from"reselect";import{v1 as uuidv1}from"uuid";import{setLayerDimensions,addLayerFeatures,refreshLayer,removeLayer,LayerRole}from"../actions/layers";import{setCurrentTask,setCurrentTaskBlocked}from"../actions/task";import Icon from"../components/Icon";import ResizeableWindow from"../components/ResizeableWindow";import FixedTimeline from"../components/timeline/FixedTimeline";import InfiniteTimeline from"../components/timeline/InfiniteTimeline";import TimelineFeaturesSlider from"../components/timeline/TimelineFeaturesSlider";import ButtonBar from"../components/widgets/ButtonBar";import NumberInput from"../components/widgets/NumberInput";import ToggleSwitch from"../components/widgets/ToggleSwitch";import IdentifyUtils from"../utils/IdentifyUtils";import LayerUtils from"../utils/LayerUtils";import LocaleUtils from"../utils/LocaleUtils";import VectorLayerUtils from"../utils/VectorLayerUtils";import markerIcon from"../utils/img/marker-icon.png";import"./style/TimeManager.css";dayjs.extend(utc);var DateUnitLabels={"ms":LocaleUtils.trmsg("timemanager.unit.milliseconds"),"s":LocaleUtils.trmsg("timemanager.unit.seconds"),"m":LocaleUtils.trmsg("timemanager.unit.minutes"),"h":LocaleUtils.trmsg("timemanager.unit.hours"),"d":LocaleUtils.trmsg("timemanager.unit.days"),"M":LocaleUtils.trmsg("timemanager.unit.months"),"y":LocaleUtils.trmsg("timemanager.unit.years"),"10y":LocaleUtils.trmsg("timemanager.unit.decade"),"100y":LocaleUtils.trmsg("timemanager.unit.century")};var qgisDateFormat=new Format({// $dateExpr $hour $minute $second $millisecond $zone $offset
|
|
8
|
+
matcher:/^(.*?)[\s,-]*([01]\d|2[0-3]):([0-5]\d)(?::([0-5]\d|60)(?:[.,](\d{9}|\d{6}|\d{1,3}))?)?[\s,-]*\(?(UTC)?[\s,-]*([+-]0\d?:?(?:[0-5]\d)?)?[\s,-]*\)?$/i,// eslint-disable-next-line
|
|
9
|
+
handler:function handler(_ref){var _ref2=_slicedToArray(_ref,8),match=_ref2[0],dateExpr=_ref2[1],hour=_ref2[2],minute=_ref2[3],second=_ref2[4],millisecond=_ref2[5],zone=_ref2[6],offset=_ref2[7];var result={};if(dateExpr){result=this.parser.attempt(dateExpr);if(result.invalid){return result}}result.hour=hour;result.minute=minute;if(second){result.second=second}if(millisecond&&millisecond.length>3){result.millisecond=millisecond.slice(0,3)}else if(millisecond){result.millisecond=millisecond}if(offset){result.offset=offset}return result}});dateParser.addFormat(qgisDateFormat);// QGIS server does not return any feature that does not have "enddate" set.
|
|
10
|
+
// To workaround this limitation, a placeholder date is used to make features
|
|
11
|
+
// with no "enddate" visible. This variable represents that placeholder date.
|
|
12
|
+
// This information is needed in the QWC2 so that features with no "enddate"
|
|
13
|
+
// are represented correctly. It is also used to differentiate them from features with
|
|
14
|
+
// a valid "enddate".
|
|
15
|
+
var DUMMY_END_DATE=new Date("9999-01-01 00:00:00");/**
|
|
16
|
+
* Allows controling the time dimension of temporal WMS layers.
|
|
17
|
+
*/var TimeManager=/*#__PURE__*/function(_React$Component){function TimeManager(props){var _this;_classCallCheck(this,TimeManager);_this=_callSuper(this,TimeManager,[props]);_defineProperty(_this,"renderBody",function(){var timeButtons=[{key:"rewind",tooltip:LocaleUtils.tr("timemanager.rewind"),icon:"nav-start"},{key:"now",tooltip:LocaleUtils.tr("timemanager.now"),icon:"today"},{key:"prev",tooltip:LocaleUtils.tr("timemanager.stepback"),icon:"nav-left"},{key:"playrev",tooltip:LocaleUtils.tr("timemanager.playrev"),icon:"triangle-left",disabled:_this.state.animationActive},{key:"stop",tooltip:LocaleUtils.tr("timemanager.stop"),icon:"square",disabled:!_this.state.animationActive},{key:"play",tooltip:LocaleUtils.tr("timemanager.play"),icon:"triangle-right",disabled:_this.state.animationActive},{key:"next",tooltip:LocaleUtils.tr("timemanager.stepfwd"),icon:"nav-right"},{key:"loop",tooltip:LocaleUtils.tr("timemanager.loop"),icon:"refresh",pressed:_this.state.animationLoop}];var markerConfiguration=_objectSpread(_objectSpread({},TimeManager.defaultProps.markerConfiguration),_this.props.markerConfiguration);var options=/*#__PURE__*/React.createElement("div",{className:"time-manager-options"},/*#__PURE__*/React.createElement("table",null,/*#__PURE__*/React.createElement("tbody",null,/*#__PURE__*/React.createElement("tr",null,/*#__PURE__*/React.createElement("td",null,LocaleUtils.tr("timemanager.stepsize"),":"),/*#__PURE__*/React.createElement("td",null,/*#__PURE__*/React.createElement(NumberInput,{max:100,min:1,mobile:true,onChange:function onChange(value){return _this.setState({stepSize:value})},value:_this.state.stepSize})),/*#__PURE__*/React.createElement("td",null,/*#__PURE__*/React.createElement("select",{onChange:function onChange(ev){return _this.setState({stepSizeUnit:ev.target.value})},value:_this.state.stepSizeUnit},_this.props.stepUnits.map(function(unit){return/*#__PURE__*/React.createElement("option",{key:unit,value:unit},LocaleUtils.tr(DateUnitLabels[unit]))})))),/*#__PURE__*/React.createElement("tr",null,/*#__PURE__*/React.createElement("td",null,LocaleUtils.tr("timemanager.animationinterval"),":"),/*#__PURE__*/React.createElement("td",null,/*#__PURE__*/React.createElement(NumberInput,{max:10,min:1,mobile:true,onChange:function onChange(value){return _this.setState({animationInterval:value})},value:_this.state.animationInterval})),/*#__PURE__*/React.createElement("td",null,"\xA0",LocaleUtils.tr("timemanager.unit.seconds"))),/*#__PURE__*/React.createElement("tr",null,/*#__PURE__*/React.createElement("td",null,LocaleUtils.tr("timemanager.timeline"),":"),/*#__PURE__*/React.createElement("td",{colSpan:"2"},/*#__PURE__*/React.createElement("select",{onChange:function onChange(ev){return _this.setState({timelineMode:ev.target.value})},value:_this.state.timelineMode},/*#__PURE__*/React.createElement("option",{value:"fixed"},LocaleUtils.tr("timemanager.timeline_fixed")),/*#__PURE__*/React.createElement("option",{value:"infinite"},LocaleUtils.tr("timemanager.timeline_infinite"))))),_this.state.timelineDisplay!=="hidden"?/*#__PURE__*/React.createElement("tr",null,/*#__PURE__*/React.createElement("td",null,LocaleUtils.tr("timemanager.timelinedisplay"),":"),/*#__PURE__*/React.createElement("td",{colSpan:"2"},/*#__PURE__*/React.createElement("select",{onChange:function onChange(ev){return _this.setState({timelineDisplay:ev.target.value})},value:_this.state.timelineDisplay},/*#__PURE__*/React.createElement("option",{value:"minimal"},LocaleUtils.tr("timemanager.displayminimal")),/*#__PURE__*/React.createElement("option",{value:"features"},LocaleUtils.tr("timemanager.displayfeatures")),/*#__PURE__*/React.createElement("option",{value:"layers"},LocaleUtils.tr("timemanager.displaylayers"))))):null)));var timeSpan=_this.state.endTime!==null?_this.state.endTime.diff(_this.state.startTime):dayjs().diff(_this.state.startTime);var Timeline=_this.state.timelineMode==="infinite"?InfiniteTimeline:FixedTimeline;var filterActive=!isEmpty(_this.props.filter.filterParams)||!!_this.props.filter.filterGeom;var startdate=_this.state.timeData.values.length>0?_this.state.timeData.values[0].hour(0).minute(0).second(0):null;var enddate=_this.state.timeData.values.length>0?_this.state.timeData.values[_this.state.timeData.values.length-1].hour(23).minute(59).second(59):null;if(startdate&&_this.props.filter.timeRange&&dayjs(_this.props.filter.timeRange.tstart)>startdate){startdate=dayjs(_this.props.filter.timeRange.tstart)}if(enddate&&_this.props.filter.timeRange&&dayjs(_this.props.filter.timeRange.tend)<enddate){enddate=dayjs(_this.props.filter.timeRange.tend)}return/*#__PURE__*/React.createElement("div",{className:"time-manager-body",role:"body"},/*#__PURE__*/React.createElement("div",{className:"time-manager-toolbar"},/*#__PURE__*/React.createElement("div",{className:"time-manager-toolbar-controls"},/*#__PURE__*/React.createElement("span",{className:"time-manager-toolbar-block"},/*#__PURE__*/React.createElement("span",null,LocaleUtils.tr("timemanager.toggle")),/*#__PURE__*/React.createElement(ToggleSwitch,{active:_this.state.timeEnabled,onChange:_this.toggleTimeEnabled})),/*#__PURE__*/React.createElement(ButtonBar,{buttons:timeButtons,disabled:!_this.state.timeEnabled,onClick:_this.animationButtonClicked}),_this.props.markerConfiguration.markersAvailable?/*#__PURE__*/React.createElement("span",{className:"time-manager-toolbar-block"},/*#__PURE__*/React.createElement("span",null,LocaleUtils.tr("timemanager.markers"),": \xA0"),/*#__PURE__*/React.createElement(ToggleSwitch,{active:_this.state.markersEnabled,onChange:function onChange(value){return _this.setState({markersEnabled:value})},readOnly:!_this.state.markersCanBeEnabled})):null),/*#__PURE__*/React.createElement("div",{className:"time-manager-options-menubutton"},/*#__PURE__*/React.createElement("button",{className:"button"+(_this.state.settingsPopup?" pressed":""),onClick:function onClick(){return _this.setState(function(state){return{settingsPopup:!state.settingsPopup}})}},/*#__PURE__*/React.createElement(Icon,{icon:"cog"})),_this.state.settingsPopup?options:null)),filterActive?/*#__PURE__*/React.createElement("div",{className:"time-manager-filter-warning"},/*#__PURE__*/React.createElement(Icon,{icon:"warning"})," ",LocaleUtils.tr("timemanager.filterwarning")," ",/*#__PURE__*/React.createElement("button",{className:"button",onClick:function onClick(){return _this.props.setCurrentTask("MapFilter")},type:"button"},LocaleUtils.tr("timemanager.edit"))):null,/*#__PURE__*/React.createElement("div",{className:"time-manager-timeline"},/*#__PURE__*/React.createElement(Timeline,{currentTimestamp:_this.state.currentTimestamp,dataEndTime:enddate,dataStartTime:startdate,dateFormat:_this.props.dateFormat,dialogWidth:_this.state.dialogWidth,endTime:_this.state.endTime,setEndTime:_this.setEndTime,setMarkersCanBeEnabled:function setMarkersCanBeEnabled(value){return _this.setState({markersCanBeEnabled:value,markersEnabled:false})},setStartTime:_this.setStartTime,startTime:_this.state.startTime,timeSpan:timeSpan},function(computePixelFromTime,computeTimeFromPixel){return/*#__PURE__*/React.createElement(TimelineFeaturesSlider,{computePixelFromTime:computePixelFromTime,computeTimeFromPixel:computeTimeFromPixel,currentTimestamp:_this.state.currentTimestamp,cursorFormat:_this.props.cursorFormat,dateFormat:_this.props.dateFormat,displayMode:_this.state.timelineDisplay,endTime:_this.state.endTime,markerConfiguration:markerConfiguration,markersEnabled:_this.state.markersEnabled,startTime:_this.state.startTime,stepSizeUnit:_this.state.stepSizeUnit,timeEnabled:_this.state.timeEnabled,timeFeatures:_this.state.timeFeatures,timestampChanged:function timestampChanged(timestamp){return _this.setState({currentTimestamp:timestamp})}})})))});_defineProperty(_this,"dialogGeomChanged",function(geom){_this.setState({dialogWidth:geom.docked?document.body.offsetWidth:geom.width})});_defineProperty(_this,"toggleTimeEnabled",function(enabled){clearInterval(_this.animationTimer);clearTimeout(_this.updateMapMarkersTimeout);_this.animationTimer=null;_this.updateMapMarkersTimeout=null;_this.setState(function(state){return{timeEnabled:enabled,currentTimestamp:+state.startTime,animationActive:false,timeMarkers:null}})});_defineProperty(_this,"animationButtonClicked",function(action){_this.stopAnimation();if(action==="rewind"){_this.setState(function(state){return{currentTimestamp:+state.startTime,animationActive:false}})}else if(action==="now"){_this.setState({currentTimestamp:+dayjs(),animationActive:false})}else if(action==="prev"){var newday=_this.step(-1);_this.setState(function(state){return{currentTimestamp:+Math.max(newday,state.startTime)}})}else if(action==="next"){var _newday=_this.step(+1);_this.setState(function(state){return{currentTimestamp:+Math.min(_newday,state.endTime)}})}else if(action==="stop"){/* Already stopped above, pass */}else if(action==="play"){var curday=dayjs(_this.state.currentTimestamp);var lastday=_this.state.endTime;if(curday>=lastday){_this.setState(function(state){return{currentTimestamp:+state.startTime}})}_this.animationTimer=setInterval(function(){_this.advanceAnimation(+1)},1000*_this.state.animationInterval);_this.setState({animationActive:true})}else if(action==="playrev"){var _curday=dayjs(_this.state.currentTimestamp);var firstday=_this.state.startTime;if(_curday<=firstday){_this.setState(function(state){return{currentTimestamp:+state.endTime}})}_this.animationTimer=setInterval(function(){_this.advanceAnimation(-1)},1000*_this.state.animationInterval);_this.setState({animationActive:true})}else if(action==="loop"){_this.setState(function(state){return{animationLoop:!state.animationLoop}})}});_defineProperty(_this,"advanceAnimation",function(stepdir){var newday=_this.step(stepdir);var firstday=_this.state.startTime;var lastday=_this.state.endTime;if(newday>lastday){if(stepdir>0&&_this.state.animationLoop){_this.setState(function(state){return{currentTimestamp:+state.startTime}})}else{_this.setState({currentTimestamp:+lastday,animationActive:false});clearInterval(_this.animationTimer);_this.animationTimer=null}}else if(newday<firstday){if(stepdir<0&&_this.state.animationLoop){_this.setState(function(state){return{currentTimestamp:+state.endTime}})}else{_this.setState({currentTimestamp:+firstday,animationActive:false});clearInterval(_this.animationTimer);_this.animationTimer=null}}else{_this.setState({currentTimestamp:+newday})}});_defineProperty(_this,"stopAnimation",function(){if(_this.state.animationActive){clearInterval(_this.animationTimer);_this.animationTimer=null;_this.setState({animationActive:false})}});_defineProperty(_this,"onClose",function(){_this.toggleTimeEnabled(false);_this.setState({visible:false});_this.props.removeLayer("timemarkers")});_defineProperty(_this,"step",function(direction){var day=dayjs(_this.state.currentTimestamp);var num=parseInt(_this.state.stepSizeUnit.slice(0,-1),10)||1;var newday=day.add(direction*_this.state.stepSize*num,_this.state.stepSizeUnit.slice(-1));if(_this.state.stepSizeUnit.endsWith("m")){return newday.second(0)}else if(_this.state.stepSizeUnit.endsWith("h")){return newday.second(0).minute(0)}else if(_this.state.stepSizeUnit.endsWith("d")){return newday.second(0).minute(0).hour(0)}else if(_this.state.stepSizeUnit.endsWith("M")){return newday.second(0).minute(0).hour(0).date(1)}else if(_this.state.stepSizeUnit.endsWith("y")){return newday.second(0).minute(0).hour(0).date(1).month(0)}return newday});_defineProperty(_this,"updateLayerTimeDimensions",function(timeData,currentTimestamp){var currentTime=_this.state.timeEnabled?new Date(currentTimestamp).toISOString():undefined;timeData.layers.forEach(function(layer){var dimensions=timeData.layerDimensions[layer.uuid].reduce(function(res,dimension){res[dimension.toUpperCase()]=currentTime;return res},_objectSpread({},layer.dimensionValues||{}));_this.props.setLayerDimensions(layer.id,dimensions)})});_defineProperty(_this,"setStartTime",function(value){var date=(value?dayjs.utc(value):_this.state.timeData.values[0]).hour(0).minute(0).second(0);if(_this.props.filter.timeRange&&_this.props.filter.timeRange.tstart>date){date=_this.props.filter.timeRange.tstart}if(date<_this.state.endTime){_this.setState({startTime:date})}if(dayjs(_this.state.currentTimestamp)<date){_this.setState({currentTimestamp:+date})}});_defineProperty(_this,"setEndTime",function(value){var date=(value?dayjs.utc(value):_this.state.timeData.values[_this.state.timeData.values.length-1]).hour(23).minute(59).second(59);if(_this.props.filter.timeRange&&_this.props.filter.timeRange.tend<date){date=_this.props.filter.timeRange.tstart}if(date>_this.state.startTime){_this.setState({endTime:date});if(dayjs(_this.state.currentTimestamp)>date){_this.setState({currentTimestamp:+date})}}});_defineProperty(_this,"updateTimeFeatures",function(timeData){// Query all features in extent
|
|
18
|
+
var xmin=_this.props.map.bbox.bounds[0];var ymin=_this.props.map.bbox.bounds[1];var xmax=_this.props.map.bbox.bounds[2];var ymax=_this.props.map.bbox.bounds[3];var filterGeom=VectorLayerUtils.geoJSONGeomToWkt({type:"Polygon",coordinates:[[[xmin,ymin],[xmax,ymin],[xmax,ymax],[xmin,ymax],[xmin,ymin]]]});var pending=0;var reqUUID=uuidv1();timeData.layers.forEach(function(layer){var sublayerattrs=timeData.attributes[layer.uuid];var queryLayers=Object.keys(sublayerattrs).join(",");var options={GEOMCENTROID:true,with_htmlcontent:false,feature_count:_this.state.featureCount};var request=IdentifyUtils.buildFilterRequest(layer,queryLayers,filterGeom,_this.props.map,options);IdentifyUtils.sendRequest(request,function(response){if(_this.state.timeFeatures&&_this.state.timeFeatures.reqUUID===reqUUID&&response){var layerFeatures=IdentifyUtils.parseXmlResponse(response,_this.props.map.projection);_this.setState(function(state){return{timeFeatures:{features:_objectSpread(_objectSpread({},state.timeFeatures.features),Object.entries(layerFeatures).reduce(function(res,_ref3){var _ref4=_slicedToArray(_ref3,2),layername=_ref4[0],features=_ref4[1];return _objectSpread(_objectSpread({},res),{},_defineProperty({},layername,features.map(function(feature){var startdate=dateParser.fromString(feature.properties[sublayerattrs[feature.layername][0]]);var enddate=dateParser.fromString(feature.properties[sublayerattrs[feature.layername][1]]);if(enddate&&!enddate.invalid&&enddate.getFullYear()===DUMMY_END_DATE.getFullYear()){enddate=null}return _objectSpread(_objectSpread({},feature),{},{id:feature.layername+"::"+feature.id,properties:_objectSpread(_objectSpread({},feature.properties),{},{__startdate:dayjs.utc(startdate),__enddate:dayjs.utc(enddate)})})})))},{})),attributes:_objectSpread(_objectSpread({},state.timeFeatures.attributes),Object.entries(layerFeatures).reduce(function(res,_ref5){var _ref6=_slicedToArray(_ref5,2),layername=_ref6[0],features=_ref6[1];return _objectSpread(_objectSpread({},res),{},_defineProperty({},layername,Object.keys((features[0]||{properties:{}}).properties)))},{})),pendingRequests:state.timeFeatures.pendingRequests-1}}})}else{_this.setState(function(state){return{timeFeatures:_objectSpread(_objectSpread({},state.timeFeatures),{},{pendingRequests:state.timeFeatures.pendingRequests-1})}})}});++pending});_this.setState({timeFeatures:{features:{},attributes:{},pendingRequests:pending,reqUUID:reqUUID}})});_defineProperty(_this,"markerStyle",function(feature){var style=[];var currentTime=dayjs(_this.state.currentTimestamp);var featprops=feature.getProperties();if(_this.state.timeEnabled&&(featprops.__startdate>currentTime||featprops.__enddate<currentTime)){return style}var offset=_this.props.markerConfiguration.markerOffset;if(_this.props.markerConfiguration.markerPins){style.push(new ol.style.Style({image:new ol.style.Icon({anchor:[0.5,1],anchorXUnits:"fraction",anchorYUnits:"fraction",displacement:offset,src:markerIcon})}))}if(featprops.__startdate.isValid()&&featprops.__enddate.isValid()){var deltaT=_this.state.endTime.diff(_this.state.startTime);var markerStartTime=dayjs(Math.max(_this.state.startTime,featprops.__startdate));var markerEndTime=dayjs(Math.min(_this.state.endTime,featprops.__enddate));var markerMidTime=0.5*(markerStartTime+markerEndTime);var gradBarMaxWidth=192;var gradBarHeight=16;var gradBarWidth=gradBarMaxWidth*markerEndTime.diff(markerStartTime)/deltaT;var canvas=document.createElement("canvas");var context=canvas.getContext("2d");var gradient=context.createLinearGradient(-gradBarWidth*(markerMidTime-_this.state.startTime)/(markerMidTime-markerStartTime),0,gradBarWidth*(_this.state.endTime-markerMidTime)/(markerEndTime-markerMidTime),0);var nStops=_this.props.markerConfiguration.gradient.length;_this.props.markerConfiguration.gradient.forEach(function(stop,idx){gradient.addColorStop(idx/(nStops-1),stop)});style.push(new ol.style.Style({image:new ol.style.RegularShape({fill:new ol.style.Fill({color:gradient}),stroke:new ol.style.Stroke({color:"black",width:1}),points:4,radius:gradBarWidth/Math.SQRT2,radius2:gradBarWidth,angle:0,scale:[1,1/gradBarWidth*gradBarHeight],displacement:[offset[0],offset[1]*gradBarHeight/gradBarWidth-gradBarHeight]})}))}return style});_this.animationTimer=null;_this.updateMapMarkersTimeout=null;TimeManager.defaultState.stepSize=props.defaultStepSize;TimeManager.defaultState.stepSizeUnit=props.defaultStepUnit;TimeManager.defaultState.timelineDisplay=props.defaultTimelineDisplay;TimeManager.defaultState.timeEnabled=props.defaultEnabled;if(!props.stepUnits.includes(TimeManager.defaultState.stepSizeUnit)){TimeManager.defaultState.stepSizeUnit=props.stepUnits[0]}TimeManager.defaultState.animationInterval=props.defaultAnimationInterval;TimeManager.defaultState.featureCount=props.defaultFeatureCount;TimeManager.defaultState.timelineMode=props.defaultTimelineMode;TimeManager.defaultState.timelineDisplay=props.defaultTimelineDisplay;_this.state=_objectSpread(_objectSpread({},_this.state),TimeManager.defaultState);return _this}_inherits(TimeManager,_React$Component);return _createClass(TimeManager,[{key:"componentDidUpdate",value:function componentDidUpdate(prevProps,prevState){var _this2=this;var activated=!prevProps.active&&this.props.active;if(activated){this.setState({visible:true});// Clear task immediately after showing, visibility is controlled by internal state
|
|
19
|
+
this.props.setCurrentTask(null)}if(!this.state.visible&&prevState.visible){this.updateLayerTimeDimensions(this.state.timeData,this.state.currentTimestamp);this.setState(TimeManager.defaultState);return}if(!activated&&!this.state.visible){return}if(this.props.theme!==prevProps.theme){this.setState({currentTimestamp:null})}if(activated||!isEqual(this.props.layerVisibilities,prevProps.layerVisibilities)){this.stopAnimation();var timeData={layerDimensions:{},values:new Set,attributes:{},layers:[]};this.props.layers.forEach(function(layer){if(layer.type==="wms"){var layertimeData=LayerUtils.getTimeDimensionValues(layer);if(layertimeData.names.size>0){timeData.layerDimensions[layer.uuid]=_toConsumableArray(layertimeData.names);layertimeData.values.forEach(function(x){return timeData.values.add(x)});timeData.attributes[layer.uuid]=_objectSpread(_objectSpread({},timeData.attributes[layer.uuid]),layertimeData.attributes);// Filter time dimension from layer - object cache in updateTimeFeatures below should query all objects regardless of time
|
|
20
|
+
var layerNoTimeDims=_objectSpread({},layer);var layerDimsUC=timeData.layerDimensions[layer.uuid].map(function(name){return name.toUpperCase()});layerNoTimeDims.dimensionValues=Object.entries(layerNoTimeDims.dimensionValues||{}).reduce(function(res,_ref7){var _ref8=_slicedToArray(_ref7,2),key=_ref8[0],value=_ref8[1];if(layerDimsUC.includes(key)){return res}else{return _objectSpread(_objectSpread({},res),{},_defineProperty({},key,value))}},{});timeData.layers.push(layerNoTimeDims)}}});timeData.values=_toConsumableArray(timeData.values).sort().map(function(d){return dayjs.utc(d)});var startdate=timeData.values.length>0?timeData.values[0].hour(0).minute(0).second(0):null;var enddate=timeData.values.length>0?timeData.values[timeData.values.length-1].hour(23).minute(59).second(59):null;if(startdate&&this.props.filter.timeRange&&dayjs(this.props.filter.timeRange.tstart)>startdate){startdate=dayjs(this.props.filter.timeRange.tstart)}if(enddate&&this.props.filter.timeRange&&dayjs(this.props.filter.timeRange.tend)<enddate){enddate=dayjs(this.props.filter.timeRange.tend)}this.setState(function(state){var _state$currentTimesta;return{timeData:timeData,currentTimestamp:(_state$currentTimesta=state.currentTimestamp)!==null&&_state$currentTimesta!==void 0?_state$currentTimesta:timeData.values.length>0?+timeData.values[0]:null,startTime:startdate,endTime:enddate&&enddate.year()!==DUMMY_END_DATE.getFullYear()?enddate:null}});this.updateTimeFeatures(timeData)}else{if(this.state.currentTimestamp!==prevState.currentTimestamp||this.state.timeEnabled!==prevState.timeEnabled){this.updateLayerTimeDimensions(this.state.timeData,this.state.currentTimestamp)}if(this.state.visible&&this.props.map.bbox!==prevProps.map.bbox){this.updateTimeFeatures(this.state.timeData)}}if(this.props.filter.timeRange!==prevProps.filter.timeRange){this.setState(function(state){var startdate=state.timeData.values.length>0?state.timeData.values[0].hour(0).minute(0).second(0):null;var enddate=state.timeData.values.length>0?state.timeData.values[state.timeData.values.length-1].hour(23).minute(59).second(59):null;if(startdate&&_this2.props.filter.timeRange&&dayjs(_this2.props.filter.timeRange.tstart)>startdate){startdate=dayjs(_this2.props.filter.timeRange.tstart)}if(enddate&&_this2.props.filter.timeRange&&dayjs(_this2.props.filter.timeRange.tend)<enddate){enddate=dayjs(_this2.props.filter.timeRange.tend)}return{startTime:startdate,endTime:enddate&&enddate.year()!==DUMMY_END_DATE.getFullYear()?enddate:null}})}if(this.state.animationActive&&this.state.animationInterval!==prevState.animationInterval){this.stopAnimation()}if(!this.state.markersEnabled&&prevState.markersEnabled){this.props.removeLayer("timemarkers")}else if(this.state.markersEnabled&&this.state.timeFeatures){if(this.state.markersEnabled!==prevState.markersEnabled||this.state.timeFeatures!==prevState.timeFeatures){var layer={id:"timemarkers",role:LayerRole.MARKER,styleFunction:this.markerStyle,rev:+new Date};var features=Object.values(this.state.timeFeatures.features).flat();this.props.addLayerFeatures(layer,features,true)}else if(this.state.currentTimestamp!==prevState.currentTimestamp||this.state.timeEnabled!==prevState.timeEnabled){this.props.refreshLayer(function(layer){return layer.id==="timemarkers"})}}}},{key:"render",value:function render(){if(!this.state.visible){return null}var timeValues=this.state.timeData.values;var body=null;if(timeValues.length<2){body=/*#__PURE__*/React.createElement("div",{role:"body"},/*#__PURE__*/React.createElement("div",{className:"time-manager-notemporaldata"},LocaleUtils.tr("timemanager.notemporaldata")))}else{body=this.renderBody(timeValues)}return/*#__PURE__*/React.createElement(ResizeableWindow,{dockable:"bottom",icon:"clock",initialHeight:this.props.geometry.initialHeight,initialWidth:this.props.geometry.initialWidth,initialX:this.props.geometry.initialX,initialY:this.props.geometry.initialY,initiallyDocked:this.props.geometry.initiallyDocked,onClose:this.onClose,onGeometryChanged:this.dialogGeomChanged,scrollable:true,splitScreenWhenDocked:true,title:LocaleUtils.tr("timemanager.title")},body)}}])}(React.Component);_defineProperty(TimeManager,"propTypes",{active:PropTypes.bool,addLayerFeatures:PropTypes.func,/** The format of the time cursor label. Either `date`, `time` or `datetime`. */cursorFormat:PropTypes.string,/** The date format in the time controls, i.e. YYYY-MM-DD. */dateFormat:PropTypes.string,/** The default interval for the temporal animation, in seconds. */defaultAnimationInterval:PropTypes.number,/** Default for TimeManager enabled when loading application. `true` or `false` */defaultEnabled:PropTypes.bool,/** The default number of features that will be requested. */defaultFeatureCount:PropTypes.number,/** The default step size for the temporal animation, in step units. */defaultStepSize:PropTypes.number,/** The default step unit for the temporal animation, one of `ms`, `s`, `m`, `d`, `M`, `y`, `10y`, `100y` */defaultStepUnit:PropTypes.string,/** The default timeline display mode. One of `hidden`, `minimal`, `features`, `layers`. */defaultTimelineDisplay:PropTypes.string,/** The default timeline mode. One of `fixed`, `infinite`. */defaultTimelineMode:PropTypes.string,filter:PropTypes.object,/** Default window geometry with size, position and docking status. Positive position values (including '0') are related to top (InitialY) and left (InitialX), negative values (including '-0') to bottom (InitialY) and right (InitialX). */geometry:PropTypes.shape({initialWidth:PropTypes.number,initialHeight:PropTypes.number,initialX:PropTypes.number,initialY:PropTypes.number,initiallyDocked:PropTypes.bool}),layerVisibilities:PropTypes.object,layers:PropTypes.array,map:PropTypes.object,/** The feature marker configuration. */markerConfiguration:PropTypes.shape({markersAvailable:PropTypes.bool,gradient:PropTypes.arrayOf(PropTypes.string),markerOffset:PropTypes.array,markerPins:PropTypes.bool}),refreshLayer:PropTypes.func,removeLayer:PropTypes.func,setCurrentTask:PropTypes.func,setLayerDimensions:PropTypes.func,/** The available temporal animation step units. */stepUnits:PropTypes.arrayOf(PropTypes.string),theme:PropTypes.object});_defineProperty(TimeManager,"defaultProps",{cursorFormat:"datetime",dateFormat:"YYYY-MM-DD[\n]HH:mm:ss",defaultAnimationInterval:1,defaultEnabled:false,defaultStepSize:1,defaultStepUnit:"d",defaultFeatureCount:100,defaultTimelineMode:"fixed",markerConfiguration:{markersAvailable:true,gradient:["#f7af7d","#eacc6e","#fef89a","#c5e09b","#a3d29c","#7cc096","#79c8c5","#34afce"],markerOffset:[0,0],markerPins:true},featureTimelineAvailable:true,stepUnits:["s","m","h","d","M","y"],geometry:{initialWidth:800,initialHeight:320,initiallyDocked:true}});_defineProperty(TimeManager,"defaultState",{timeEnabled:false,startTime:null,endTime:null,currentTimestamp:null,animationActive:false,animationLoop:false,animationInterval:1,stepSize:1,stepSizeUnit:"d",// 1 day
|
|
21
|
+
dialogWidth:0,markersEnabled:false,markersCanBeEnabled:true,timelineDisplay:"layers",featureCount:100,timelineMode:"continuous",timeData:{layerDimensions:{},values:[],attributes:{},layers:[]},timeFeatures:null,settingsPopup:false,visible:false,geometry:{initialWidth:900,initialHeight:320,initialX:null,initialY:null,initiallyDocked:false}});var layerVisiblitiesSelector=createSelector([function(state){return state.layers.flat}],function(layers){return layers.filter(function(layer){return layer.type==="wms"}).reduce(function(res,layer){return _objectSpread(_objectSpread({},res),{},_defineProperty({},layer.uuid,LayerUtils.computeLayerVisibility(layer)))},{})});var selector=createSelector([function(state){return state},layerVisiblitiesSelector],function(state,layerVisibilities){return{active:state.task.id==="TimeManager",layers:state.layers.flat,filter:state.layers.filter,layerVisibilities:layerVisibilities,map:state.map,theme:state.theme.current}});export default connect(selector,{addLayerFeatures:addLayerFeatures,refreshLayer:refreshLayer,removeLayer:removeLayer,setLayerDimensions:setLayerDimensions,setCurrentTask:setCurrentTask,setCurrentTaskBlocked:setCurrentTaskBlocked})(TimeManager);
|