@jupytergis/base 0.14.1 → 0.16.0-alpha.0
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/lib/commands/BaseCommandIDs.d.ts +6 -0
- package/lib/commands/BaseCommandIDs.js +6 -0
- package/lib/commands/index.js +245 -55
- package/lib/commands/operationCommands.js +2 -2
- package/lib/constants.js +6 -1
- package/lib/{panelview/annotationPanel.js → features/annotations/AnnotationsPanel.js} +1 -1
- package/lib/{annotations → features/annotations}/index.d.ts +1 -0
- package/lib/{annotations → features/annotations}/index.js +1 -0
- package/lib/{console → features/console}/consoleview.js +1 -1
- package/lib/{panelview/filter-panel → features/filter}/Filter.js +4 -4
- package/lib/{panelview/filter-panel → features/filter}/FilterRow.d.ts +3 -2
- package/lib/{panelview/filter-panel → features/filter}/FilterRow.js +2 -1
- package/lib/{panelview/identify-panel → features/identify}/IdentifyPanel.d.ts +2 -0
- package/lib/features/identify/IdentifyPanel.js +102 -0
- package/lib/features/identify/components/FeatureCard.d.ts +17 -0
- package/lib/features/identify/components/FeatureCard.js +26 -0
- package/lib/features/identify/components/FeatureCardHeader.d.ts +11 -0
- package/lib/features/identify/components/FeatureCardHeader.js +30 -0
- package/lib/features/identify/components/FeatureFloater.d.ts +7 -0
- package/lib/features/identify/components/FeatureFloater.js +19 -0
- package/lib/features/identify/components/FeaturePropertyList.d.ts +11 -0
- package/lib/features/identify/components/FeaturePropertyList.js +18 -0
- package/lib/features/identify/components/FeatureRow.d.ts +13 -0
- package/lib/features/identify/components/FeatureRow.js +25 -0
- package/lib/features/identify/components/PropertyEditors.d.ts +44 -0
- package/lib/features/identify/components/PropertyEditors.js +56 -0
- package/lib/features/identify/hooks/useIdentifyPropertyEditor.d.ts +11 -0
- package/lib/features/identify/hooks/useIdentifyPropertyEditor.js +132 -0
- package/lib/features/identify/types/editorTypes.d.ts +21 -0
- package/lib/features/identify/utils/getFeatureIdentifier.d.ts +5 -0
- package/lib/features/identify/utils/getFeatureIdentifier.js +14 -0
- package/lib/features/identify/utils/highlightLayer.d.ts +11 -0
- package/lib/features/identify/utils/highlightLayer.js +57 -0
- package/lib/features/identify/utils/highlightStyle.d.ts +7 -0
- package/lib/features/identify/utils/highlightStyle.js +40 -0
- package/lib/{dialogs/layerBrowserDialog.js → features/layer-browser/index.js} +2 -2
- package/lib/features/layers/forms/layer/geoTiffLayerForm.d.ts +3 -0
- package/lib/{formbuilder/objectform/layer/webGlLayerForm.js → features/layers/forms/layer/geoTiffLayerForm.js} +5 -5
- package/lib/{formbuilder/objectform → features/layers/forms}/layer/heatmapLayerForm.js +4 -4
- package/lib/{formbuilder/objectform → features/layers/forms}/layer/hillshadeLayerForm.js +4 -4
- package/lib/{formbuilder/objectform → features/layers/forms}/layer/index.d.ts +1 -1
- package/lib/{formbuilder/objectform → features/layers/forms}/layer/index.js +1 -1
- package/lib/{formbuilder/objectform → features/layers/forms}/layer/layerform.d.ts +1 -1
- package/lib/{formbuilder/objectform → features/layers/forms}/layer/layerform.js +4 -4
- package/lib/features/layers/forms/layer/storySegmentLayerForm.js +150 -0
- package/lib/{formbuilder/objectform → features/layers/forms}/layer/vectorlayerform.js +4 -4
- package/lib/{formbuilder/objectform → features/layers/forms}/source/geojsonsource.js +5 -5
- package/lib/features/layers/forms/source/geopackagesource.d.ts +3 -0
- package/lib/features/layers/forms/source/geopackagesource.js +93 -0
- package/lib/{formbuilder/objectform → features/layers/forms}/source/geotiffsource.js +5 -5
- package/lib/{formbuilder/objectform → features/layers/forms}/source/index.d.ts +2 -0
- package/lib/{formbuilder/objectform → features/layers/forms}/source/index.js +2 -0
- package/lib/{formbuilder/objectform → features/layers/forms}/source/pathbasedsource.js +5 -5
- package/lib/{formbuilder/objectform → features/layers/forms}/source/sourceform.d.ts +1 -1
- package/lib/{formbuilder/objectform → features/layers/forms}/source/sourceform.js +4 -4
- package/lib/{formbuilder/objectform → features/layers/forms}/source/tilesourceform.js +4 -4
- package/lib/features/layers/forms/source/wmsTileSource.d.ts +4 -0
- package/lib/features/layers/forms/source/wmsTileSource.js +78 -0
- package/lib/{dialogs → features/layers}/layerCreationFormDialog.d.ts +1 -1
- package/lib/{dialogs → features/layers}/layerCreationFormDialog.js +1 -1
- package/lib/features/layers/symbology/Grammar.d.ts +11 -0
- package/lib/features/layers/symbology/Grammar.js +235 -0
- package/lib/{dialogs/symbology/vector_layer/types → features/layers/symbology}/Heatmap.d.ts +1 -1
- package/lib/{dialogs/symbology/vector_layer/types → features/layers/symbology}/Heatmap.js +30 -10
- package/lib/{dialogs → features/layers}/symbology/classificationModes.d.ts +6 -6
- package/lib/{dialogs → features/layers}/symbology/classificationModes.js +57 -57
- package/lib/features/layers/symbology/colorRampUtils.d.ts +65 -0
- package/lib/features/layers/symbology/colorRampUtils.js +242 -0
- package/lib/features/layers/symbology/components/MappingRow.d.ts +40 -0
- package/lib/features/layers/symbology/components/MappingRow.js +516 -0
- package/lib/features/layers/symbology/components/NumericInput.d.ts +20 -0
- package/lib/features/layers/symbology/components/NumericInput.js +44 -0
- package/lib/features/layers/symbology/components/ScaleEditor.d.ts +33 -0
- package/lib/features/layers/symbology/components/ScaleEditor.js +221 -0
- package/lib/{dialogs → features/layers}/symbology/components/color_ramp/ColorRampControls.d.ts +1 -1
- package/lib/{dialogs → features/layers}/symbology/components/color_ramp/ColorRampControls.js +3 -2
- package/lib/{dialogs → features/layers}/symbology/components/color_ramp/ColorRampSelector.d.ts +2 -1
- package/lib/{dialogs → features/layers}/symbology/components/color_ramp/ColorRampSelector.js +12 -15
- package/lib/{dialogs → features/layers}/symbology/components/color_ramp/ColorRampSelectorEntry.d.ts +2 -2
- package/lib/{dialogs → features/layers}/symbology/components/color_ramp/ColorRampSelectorEntry.js +3 -11
- package/lib/{dialogs → features/layers}/symbology/components/color_ramp/ModeSelectRow.d.ts +1 -1
- package/lib/features/layers/symbology/components/color_ramp/RgbaColorPicker.d.ts +13 -0
- package/lib/features/layers/symbology/components/color_ramp/RgbaColorPicker.js +128 -0
- package/lib/{dialogs → features/layers}/symbology/components/color_stops/StopContainer.js +3 -1
- package/lib/{dialogs → features/layers}/symbology/components/color_stops/StopRow.d.ts +2 -2
- package/lib/{dialogs → features/layers}/symbology/components/color_stops/StopRow.js +12 -7
- package/lib/features/layers/symbology/grammarToOLLayer.d.ts +27 -0
- package/lib/features/layers/symbology/grammarToOLLayer.js +145 -0
- package/lib/features/layers/symbology/grammarToOLStyle.d.ts +32 -0
- package/lib/features/layers/symbology/grammarToOLStyle.js +467 -0
- package/lib/{dialogs → features/layers}/symbology/hooks/useGetBandInfo.d.ts +1 -1
- package/lib/{dialogs → features/layers}/symbology/hooks/useGetBandInfo.js +1 -1
- package/lib/{dialogs → features/layers}/symbology/hooks/useGetProperties.js +1 -1
- package/lib/{dialogs → features/layers}/symbology/hooks/useGetSymbology.js +4 -2
- package/lib/features/layers/symbology/styleBuilder.d.ts +21 -0
- package/lib/features/layers/symbology/styleBuilder.js +145 -0
- package/lib/{dialogs → features/layers}/symbology/symbologyDialog.d.ts +3 -2
- package/lib/{dialogs → features/layers}/symbology/symbologyDialog.js +12 -12
- package/lib/features/layers/symbology/symbologyUtils.d.ts +41 -0
- package/lib/features/layers/symbology/symbologyUtils.js +114 -0
- package/lib/{panelview/objectproperties.d.ts → features/objectproperties/index.d.ts} +1 -1
- package/lib/{panelview/objectproperties.js → features/objectproperties/index.js} +5 -10
- package/lib/{dialogs → features/processing}/ProcessingFormDialog.d.ts +1 -1
- package/lib/{dialogs → features/processing}/ProcessingFormDialog.js +28 -14
- package/lib/features/processing/forms/MapExtentToggle.d.ts +13 -0
- package/lib/features/processing/forms/MapExtentToggle.js +20 -0
- package/lib/features/processing/forms/clipRasterByExtentForm.d.ts +10 -0
- package/lib/features/processing/forms/clipRasterByExtentForm.js +99 -0
- package/lib/{formbuilder/objectform/process → features/processing/forms}/dissolveProcessForm.js +5 -5
- package/lib/{formbuilder/objectform → features/processing/forms}/processingForm.d.ts +1 -1
- package/lib/{formbuilder/objectform → features/processing/forms}/processingForm.js +6 -6
- package/lib/features/processing/forms/rasterizeForm.d.ts +10 -0
- package/lib/features/processing/forms/rasterizeForm.js +75 -0
- package/lib/features/processing/forms/useMapExtent.d.ts +22 -0
- package/lib/features/processing/forms/useMapExtent.js +57 -0
- package/lib/{processing → features/processing}/index.d.ts +19 -2
- package/lib/features/processing/index.js +1246 -0
- package/lib/{processing → features/processing}/processingCommands.d.ts +1 -1
- package/lib/features/processing/processingCommands.js +168 -0
- package/lib/features/processing/serverProcessing.d.ts +51 -0
- package/lib/features/processing/serverProcessing.js +99 -0
- package/lib/{stacBrowser → features/stac-browser}/components/StacPanel.js +2 -2
- package/lib/{stacBrowser → features/stac-browser}/components/filter-extension/QueryableComboBox.js +64 -21
- package/lib/{stacBrowser → features/stac-browser}/components/filter-extension/QueryableRow.js +1 -1
- package/lib/{stacBrowser → features/stac-browser}/components/filter-extension/StacFilterExtensionPanel.js +2 -2
- package/lib/{stacBrowser → features/stac-browser}/components/filter-extension/StacQueryableFilters.js +1 -1
- package/lib/{stacBrowser → features/stac-browser}/components/geodes/StacFilterSection.js +3 -3
- package/lib/{stacBrowser → features/stac-browser}/components/shared/StacPanelResults.js +3 -3
- package/lib/{stacBrowser → features/stac-browser}/components/shared/StacSpatialExtent.js +1 -1
- package/lib/{stacBrowser → features/stac-browser}/components/shared/StacTemporalExtent.js +1 -1
- package/lib/{stacBrowser → features/stac-browser}/context/StacResultsContext.js +2 -2
- package/lib/{stacBrowser → features/stac-browser}/hooks/useGeodesSearch.js +2 -2
- package/lib/{stacBrowser → features/stac-browser}/hooks/useStacFilterExtension.d.ts +1 -1
- package/lib/{stacBrowser → features/stac-browser}/hooks/useStacFilterExtension.js +198 -114
- package/lib/{stacBrowser → features/stac-browser}/hooks/useStacSearch.d.ts +1 -0
- package/lib/{stacBrowser → features/stac-browser}/hooks/useStacSearch.js +19 -11
- package/lib/features/stac-browser/types/types.js +1 -0
- package/lib/{panelview/story-maps → features/story}/SpectaPanel.d.ts +4 -1
- package/lib/{panelview/story-maps → features/story}/SpectaPanel.js +3 -4
- package/lib/{panelview/story-maps → features/story}/StoryEditorPanel.js +1 -1
- package/lib/{panelview/story-maps → features/story}/StoryViewerPanel.d.ts +12 -11
- package/lib/features/story/StoryViewerPanel.js +64 -0
- package/lib/features/story/__tests__/fixtures/listStoryTestItems.d.ts +9 -0
- package/lib/features/story/__tests__/fixtures/listStoryTestItems.js +21 -0
- package/lib/features/story/components/ListStoryMapOverlayPanel.d.ts +10 -0
- package/lib/features/story/components/ListStoryMapOverlayPanel.js +11 -0
- package/lib/features/story/components/ListStoryMarkdownMeasurePane.d.ts +11 -0
- package/lib/features/story/components/ListStoryMarkdownMeasurePane.js +55 -0
- package/lib/features/story/components/ListStoryOverlayMarkdown.d.ts +15 -0
- package/lib/features/story/components/ListStoryOverlayMarkdown.js +93 -0
- package/lib/features/story/components/ListStoryStageOverlay.d.ts +12 -0
- package/lib/features/story/components/ListStoryStageOverlay.js +132 -0
- package/lib/features/story/components/ListStoryVirtualScrollTrack.d.ts +6 -0
- package/lib/features/story/components/ListStoryVirtualScrollTrack.js +7 -0
- package/lib/{panelview/story-maps → features/story}/components/SpectaDesktopView.d.ts +4 -2
- package/lib/features/story/components/SpectaDesktopView.js +67 -0
- package/lib/{panelview/story-maps → features/story}/components/SpectaMobileView.d.ts +2 -4
- package/lib/{panelview/story-maps → features/story}/components/SpectaMobileView.js +3 -3
- package/lib/features/story/components/SpectaSingleModeContent.d.ts +18 -0
- package/lib/features/story/components/SpectaSingleModeContent.js +8 -0
- package/lib/features/story/context/ListStoryScrollTrackContext.d.ts +15 -0
- package/lib/features/story/context/ListStoryScrollTrackContext.js +142 -0
- package/lib/features/story/hooks/useCurrentSegmentIndex.d.ts +3 -0
- package/lib/features/story/hooks/useCurrentSegmentIndex.js +17 -0
- package/lib/features/story/hooks/useListStoryScroll.d.ts +15 -0
- package/lib/features/story/hooks/useListStoryScroll.js +107 -0
- package/lib/features/story/hooks/useQueuedMarkdownHeightMeasure.d.ts +19 -0
- package/lib/features/story/hooks/useQueuedMarkdownHeightMeasure.js +56 -0
- package/lib/features/story/hooks/useStoryImagePreload.d.ts +1 -0
- package/lib/features/story/hooks/useStoryImagePreload.js +24 -0
- package/lib/{panelview/story-maps → features/story}/hooks/useStoryMap.d.ts +2 -7
- package/lib/{panelview/story-maps → features/story}/hooks/useStoryMap.js +20 -44
- package/lib/features/story/hooks/useStoryScrollState.d.ts +21 -0
- package/lib/features/story/hooks/useStoryScrollState.js +39 -0
- package/lib/features/story/hooks/useStorySegmentSync.d.ts +8 -0
- package/lib/features/story/hooks/useStorySegmentSync.js +51 -0
- package/lib/features/story/types/types.d.ts +38 -0
- package/lib/features/story/types/types.js +1 -0
- package/lib/features/story/utils/computeListStoryScrollState.d.ts +12 -0
- package/lib/features/story/utils/computeListStoryScrollState.js +70 -0
- package/lib/features/story/utils/listStoryMeasureQueue.d.ts +11 -0
- package/lib/features/story/utils/listStoryMeasureQueue.js +14 -0
- package/lib/features/story/utils/listStoryScrollTrack.d.ts +17 -0
- package/lib/features/story/utils/listStoryScrollTrack.js +72 -0
- package/lib/features/story/utils/spectaPresentation.d.ts +9 -0
- package/lib/features/story/utils/spectaPresentation.js +37 -0
- package/lib/features/story/utils/storySegmentViewItems.d.ts +5 -0
- package/lib/features/story/utils/storySegmentViewItems.js +30 -0
- package/lib/index.d.ts +11 -9
- package/lib/index.js +11 -9
- package/lib/keybindings.json +5 -0
- package/lib/mainview/OpenEOTileLayer.d.ts +49 -0
- package/lib/mainview/OpenEOTileLayer.js +179 -0
- package/lib/mainview/TemporalSlider.js +11 -9
- package/lib/mainview/geoJsonFeaturePatch.d.ts +9 -0
- package/lib/mainview/geoJsonFeaturePatch.js +43 -0
- package/lib/mainview/mainView.d.ts +93 -8
- package/lib/mainview/mainView.js +1286 -529
- package/lib/mainview/mainviewwidget.d.ts +5 -1
- package/lib/mainview/mainviewwidget.js +4 -2
- package/lib/shared/components/Button.d.ts +1 -1
- package/lib/shared/components/DropdownMenu.d.ts +1 -0
- package/lib/shared/components/DropdownMenu.js +3 -2
- package/lib/shared/components/NativeSelect.d.ts +8 -0
- package/lib/shared/components/NativeSelect.js +29 -0
- package/lib/shared/components/Tabs.d.ts +3 -3
- package/lib/shared/components/Tabs.js +5 -5
- package/lib/{formbuilder → shared/formbuilder}/creationform.js +71 -4
- package/lib/{formbuilder → shared/formbuilder}/editform.js +1 -1
- package/lib/{formbuilder → shared/formbuilder}/formselectors.d.ts +2 -2
- package/lib/{formbuilder → shared/formbuilder}/formselectors.js +13 -4
- package/lib/shared/formbuilder/index.d.ts +4 -0
- package/lib/shared/formbuilder/index.js +4 -0
- package/lib/{formbuilder → shared/formbuilder}/objectform/SchemaForm.d.ts +1 -1
- package/lib/{formbuilder → shared/formbuilder}/objectform/StoryEditorForm.d.ts +1 -1
- package/lib/{formbuilder → shared/formbuilder}/objectform/StoryEditorForm.js +1 -1
- package/lib/{formbuilder → shared/formbuilder}/objectform/components/LayerSelect.js +1 -1
- package/lib/{formbuilder → shared/formbuilder}/objectform/components/SegmentFormSymbology.js +4 -4
- package/lib/{formbuilder → shared/formbuilder}/objectform/components/SourcePropertiesField.js +1 -1
- package/lib/{formbuilder → shared/formbuilder}/objectform/components/StorySegmentReset.js +1 -1
- package/lib/shared/formbuilder/objectform/components/WmsTileSourceUrlInput.d.ts +3 -0
- package/lib/shared/formbuilder/objectform/components/WmsTileSourceUrlInput.js +84 -0
- package/lib/{formbuilder → shared/formbuilder}/objectform/fileselectorwidget.js +8 -1
- package/lib/{formbuilder → shared/formbuilder}/objectform/schemaUtils.d.ts +3 -1
- package/lib/{formbuilder → shared/formbuilder}/objectform/schemaUtils.js +11 -0
- package/lib/{formbuilder → shared/formbuilder}/objectform/useSchemaFormState.d.ts +2 -2
- package/lib/{formbuilder → shared/formbuilder}/objectform/useSchemaFormState.js +1 -1
- package/lib/{icons.d.ts → shared/icons.d.ts} +2 -0
- package/lib/{icons.js → shared/icons.js} +28 -18
- package/lib/tools.d.ts +3 -1
- package/lib/tools.js +140 -6
- package/lib/types.d.ts +12 -1
- package/lib/types.js +6 -1
- package/lib/{menus.js → workspace/menus.js} +14 -2
- package/lib/workspace/panels/components/TabbedPanel.d.ts +17 -0
- package/lib/workspace/panels/components/TabbedPanel.js +19 -0
- package/lib/{panelview → workspace/panels}/components/layers.js +82 -20
- package/lib/workspace/panels/components/legendItem.js +680 -0
- package/lib/workspace/panels/hooks/useLayerTree.d.ts +19 -0
- package/lib/workspace/panels/hooks/useLayerTree.js +103 -0
- package/lib/workspace/panels/hooks/useRightPanelOptions.d.ts +27 -0
- package/lib/workspace/panels/hooks/useRightPanelOptions.js +72 -0
- package/lib/workspace/panels/hooks/useUIState.d.ts +2 -0
- package/lib/workspace/panels/hooks/useUIState.js +25 -0
- package/lib/{panelview → workspace/panels}/index.d.ts +1 -1
- package/lib/{panelview → workspace/panels}/index.js +1 -1
- package/lib/{panelview → workspace/panels}/leftpanel.d.ts +1 -1
- package/lib/workspace/panels/leftpanel.js +70 -0
- package/lib/{panelview/rightpanel.d.ts → workspace/panels/mergedpanel.d.ts} +6 -5
- package/lib/workspace/panels/mergedpanel.js +166 -0
- package/lib/workspace/panels/rightpanel.d.ts +25 -0
- package/lib/{panelview → workspace/panels}/rightpanel.js +53 -63
- package/lib/{statusbar → workspace/statusbar}/StatusBar.js +5 -4
- package/lib/{toolbar → workspace/toolbar}/widget.d.ts +2 -0
- package/lib/{toolbar → workspace/toolbar}/widget.js +33 -5
- package/lib/{widget.d.ts → workspace/widget.d.ts} +7 -5
- package/lib/{widget.js → workspace/widget.js} +16 -7
- package/package.json +19 -4
- package/style/base.css +109 -1
- package/style/icons/geopackage.svg +95 -0
- package/style/icons/pencil_solid.svg +7 -0
- package/style/identify.css +95 -0
- package/style/layerBrowser.css +28 -0
- package/style/leftPanel.css +25 -0
- package/style/shared/button.css +12 -0
- package/style/shared/dropdownMenu.css +9 -0
- package/style/shared/nativeSelect.css +75 -0
- package/style/shared/tabs.css +3 -3
- package/style/spectaProgressBar.css +0 -1
- package/style/storyPanel.css +142 -9
- package/style/storySpectaArticleOverlay.css +129 -0
- package/style/symbologyDialog.css +330 -28
- package/lib/dialogs/symbology/colorRampUtils.d.ts +0 -20
- package/lib/dialogs/symbology/colorRampUtils.js +0 -132
- package/lib/dialogs/symbology/symbologyUtils.d.ts +0 -33
- package/lib/dialogs/symbology/symbologyUtils.js +0 -180
- package/lib/dialogs/symbology/tiff_layer/TiffRendering.d.ts +0 -4
- package/lib/dialogs/symbology/tiff_layer/TiffRendering.js +0 -42
- package/lib/dialogs/symbology/tiff_layer/components/BandRow.d.ts +0 -23
- package/lib/dialogs/symbology/tiff_layer/components/BandRow.js +0 -59
- package/lib/dialogs/symbology/tiff_layer/types/MultibandColor.d.ts +0 -4
- package/lib/dialogs/symbology/tiff_layer/types/MultibandColor.js +0 -92
- package/lib/dialogs/symbology/tiff_layer/types/SingleBandPseudoColor.d.ts +0 -5
- package/lib/dialogs/symbology/tiff_layer/types/SingleBandPseudoColor.js +0 -301
- package/lib/dialogs/symbology/vector_layer/VectorRendering.d.ts +0 -4
- package/lib/dialogs/symbology/vector_layer/VectorRendering.js +0 -112
- package/lib/dialogs/symbology/vector_layer/components/ValueSelect.d.ts +0 -8
- package/lib/dialogs/symbology/vector_layer/components/ValueSelect.js +0 -9
- package/lib/dialogs/symbology/vector_layer/types/Canonical.d.ts +0 -4
- package/lib/dialogs/symbology/vector_layer/types/Canonical.js +0 -65
- package/lib/dialogs/symbology/vector_layer/types/Categorized.d.ts +0 -4
- package/lib/dialogs/symbology/vector_layer/types/Categorized.js +0 -196
- package/lib/dialogs/symbology/vector_layer/types/Graduated.d.ts +0 -4
- package/lib/dialogs/symbology/vector_layer/types/Graduated.js +0 -250
- package/lib/dialogs/symbology/vector_layer/types/SimpleSymbol.d.ts +0 -4
- package/lib/dialogs/symbology/vector_layer/types/SimpleSymbol.js +0 -105
- package/lib/formbuilder/index.d.ts +0 -4
- package/lib/formbuilder/index.js +0 -4
- package/lib/formbuilder/objectform/layer/storySegmentLayerForm.js +0 -95
- package/lib/formbuilder/objectform/layer/webGlLayerForm.d.ts +0 -3
- package/lib/formbuilder/objectform/process/index.d.ts +0 -1
- package/lib/formbuilder/objectform/process/index.js +0 -1
- package/lib/panelview/components/legendItem.js +0 -200
- package/lib/panelview/identify-panel/IdentifyPanel.js +0 -102
- package/lib/panelview/leftpanel.js +0 -139
- package/lib/panelview/story-maps/StoryViewerPanel.js +0 -116
- package/lib/panelview/story-maps/components/SpectaDesktopView.js +0 -49
- package/lib/processing/index.js +0 -200
- package/lib/processing/processingCommands.js +0 -67
- /package/lib/{panelview/annotationPanel.d.ts → features/annotations/AnnotationsPanel.d.ts} +0 -0
- /package/lib/{annotations → features/annotations}/components/Annotation.d.ts +0 -0
- /package/lib/{annotations → features/annotations}/components/Annotation.js +0 -0
- /package/lib/{annotations → features/annotations}/components/AnnotationFloater.d.ts +0 -0
- /package/lib/{annotations → features/annotations}/components/AnnotationFloater.js +0 -0
- /package/lib/{annotations → features/annotations}/components/Message.d.ts +0 -0
- /package/lib/{annotations → features/annotations}/components/Message.js +0 -0
- /package/lib/{annotations → features/annotations}/model.d.ts +0 -0
- /package/lib/{annotations → features/annotations}/model.js +0 -0
- /package/lib/{console → features/console}/consoleview.d.ts +0 -0
- /package/lib/{console → features/console}/index.d.ts +0 -0
- /package/lib/{console → features/console}/index.js +0 -0
- /package/lib/{panelview/filter-panel → features/filter}/Filter.d.ts +0 -0
- /package/lib/{stacBrowser/types/types.js → features/identify/types/editorTypes.js} +0 -0
- /package/lib/{dialogs/layerBrowserDialog.d.ts → features/layer-browser/index.d.ts} +0 -0
- /package/lib/{formbuilder/objectform → features/layers/forms}/layer/heatmapLayerForm.d.ts +0 -0
- /package/lib/{formbuilder/objectform → features/layers/forms}/layer/hillshadeLayerForm.d.ts +0 -0
- /package/lib/{formbuilder/objectform → features/layers/forms}/layer/storySegmentLayerForm.d.ts +0 -0
- /package/lib/{formbuilder/objectform → features/layers/forms}/layer/vectorlayerform.d.ts +0 -0
- /package/lib/{formbuilder/objectform → features/layers/forms}/source/geojsonsource.d.ts +0 -0
- /package/lib/{formbuilder/objectform → features/layers/forms}/source/geotiffsource.d.ts +0 -0
- /package/lib/{formbuilder/objectform → features/layers/forms}/source/pathbasedsource.d.ts +0 -0
- /package/lib/{formbuilder/objectform → features/layers/forms}/source/tilesourceform.d.ts +0 -0
- /package/lib/{dialogs → features/layers}/symbology/components/color_ramp/ModeSelectRow.js +0 -0
- /package/lib/{dialogs → features/layers}/symbology/components/color_ramp/cmocean.json +0 -0
- /package/lib/{dialogs → features/layers}/symbology/components/color_stops/StopContainer.d.ts +0 -0
- /package/lib/{dialogs → features/layers}/symbology/hooks/useEffectiveSymbologyParams.d.ts +0 -0
- /package/lib/{dialogs → features/layers}/symbology/hooks/useEffectiveSymbologyParams.js +0 -0
- /package/lib/{dialogs → features/layers}/symbology/hooks/useGetProperties.d.ts +0 -0
- /package/lib/{dialogs → features/layers}/symbology/hooks/useGetSymbology.d.ts +0 -0
- /package/lib/{dialogs → features/layers}/symbology/hooks/useOkSignal.d.ts +0 -0
- /package/lib/{dialogs → features/layers}/symbology/hooks/useOkSignal.js +0 -0
- /package/lib/{formbuilder/objectform/process → features/processing/forms}/dissolveProcessForm.d.ts +0 -0
- /package/lib/{processing → features/processing}/processingFormToParam.d.ts +0 -0
- /package/lib/{processing → features/processing}/processingFormToParam.js +0 -0
- /package/lib/{stacBrowser → features/stac-browser}/components/StacPanel.d.ts +0 -0
- /package/lib/{stacBrowser → features/stac-browser}/components/filter-extension/QueryableComboBox.d.ts +0 -0
- /package/lib/{stacBrowser → features/stac-browser}/components/filter-extension/QueryableRow.d.ts +0 -0
- /package/lib/{stacBrowser → features/stac-browser}/components/filter-extension/StacFilterExtensionPanel.d.ts +0 -0
- /package/lib/{stacBrowser → features/stac-browser}/components/filter-extension/StacQueryableFilters.d.ts +0 -0
- /package/lib/{stacBrowser → features/stac-browser}/components/geodes/StacFilterSection.d.ts +0 -0
- /package/lib/{stacBrowser → features/stac-browser}/components/geodes/StacGeodesFilterPanel.d.ts +0 -0
- /package/lib/{stacBrowser → features/stac-browser}/components/geodes/StacGeodesFilterPanel.js +0 -0
- /package/lib/{stacBrowser → features/stac-browser}/components/shared/StacPanelResults.d.ts +0 -0
- /package/lib/{stacBrowser → features/stac-browser}/components/shared/StacSpatialExtent.d.ts +0 -0
- /package/lib/{stacBrowser → features/stac-browser}/components/shared/StacTemporalExtent.d.ts +0 -0
- /package/lib/{stacBrowser → features/stac-browser}/constants.d.ts +0 -0
- /package/lib/{stacBrowser → features/stac-browser}/constants.js +0 -0
- /package/lib/{stacBrowser → features/stac-browser}/context/StacResultsContext.d.ts +0 -0
- /package/lib/{stacBrowser → features/stac-browser}/hooks/useGeodesSearch.d.ts +0 -0
- /package/lib/{stacBrowser → features/stac-browser}/index.d.ts +0 -0
- /package/lib/{stacBrowser → features/stac-browser}/index.js +0 -0
- /package/lib/{stacBrowser → features/stac-browser}/types/types.d.ts +0 -0
- /package/lib/{panelview/story-maps → features/story}/StoryEditorPanel.d.ts +0 -0
- /package/lib/{panelview/story-maps → features/story}/components/PreviewModeSwitch.d.ts +0 -0
- /package/lib/{panelview/story-maps → features/story}/components/PreviewModeSwitch.js +0 -0
- /package/lib/{panelview/story-maps → features/story}/components/StoryContentSection.d.ts +0 -0
- /package/lib/{panelview/story-maps → features/story}/components/StoryContentSection.js +0 -0
- /package/lib/{panelview/story-maps → features/story}/components/StoryImageSection.d.ts +0 -0
- /package/lib/{panelview/story-maps → features/story}/components/StoryImageSection.js +0 -0
- /package/lib/{panelview/story-maps → features/story}/components/StoryNavBar.d.ts +0 -0
- /package/lib/{panelview/story-maps → features/story}/components/StoryNavBar.js +0 -0
- /package/lib/{panelview/story-maps → features/story}/components/StorySubtitleSection.d.ts +0 -0
- /package/lib/{panelview/story-maps → features/story}/components/StorySubtitleSection.js +0 -0
- /package/lib/{panelview/story-maps → features/story}/components/StoryTitleSection.d.ts +0 -0
- /package/lib/{panelview/story-maps → features/story}/components/StoryTitleSection.js +0 -0
- /package/lib/{formbuilder → shared/formbuilder}/creationform.d.ts +0 -0
- /package/lib/{formbuilder → shared/formbuilder}/editform.d.ts +0 -0
- /package/lib/{formbuilder → shared/formbuilder}/objectform/SchemaForm.js +0 -0
- /package/lib/{formbuilder → shared/formbuilder}/objectform/components/LayerSelect.d.ts +0 -0
- /package/lib/{formbuilder → shared/formbuilder}/objectform/components/OpacitySlider.d.ts +0 -0
- /package/lib/{formbuilder → shared/formbuilder}/objectform/components/OpacitySlider.js +0 -0
- /package/lib/{formbuilder → shared/formbuilder}/objectform/components/SegmentFormSymbology.d.ts +0 -0
- /package/lib/{formbuilder → shared/formbuilder}/objectform/components/SourcePropertiesField.d.ts +0 -0
- /package/lib/{formbuilder → shared/formbuilder}/objectform/components/StorySegmentReset.d.ts +0 -0
- /package/lib/{formbuilder → shared/formbuilder}/objectform/fileselectorwidget.d.ts +0 -0
- /package/lib/{store.d.ts → shared/store.d.ts} +0 -0
- /package/lib/{store.js → shared/store.js} +0 -0
- /package/lib/{menus.d.ts → workspace/menus.d.ts} +0 -0
- /package/lib/{panelview → workspace/panels}/components/layers.d.ts +0 -0
- /package/lib/{panelview → workspace/panels}/components/legendItem.d.ts +0 -0
- /package/lib/{panelview → workspace/panels}/header.d.ts +0 -0
- /package/lib/{panelview → workspace/panels}/header.js +0 -0
- /package/lib/{statusbar → workspace/statusbar}/SpectaPresentationProgressBar.d.ts +0 -0
- /package/lib/{statusbar → workspace/statusbar}/SpectaPresentationProgressBar.js +0 -0
- /package/lib/{statusbar → workspace/statusbar}/StatusBar.d.ts +0 -0
- /package/lib/{toolbar → workspace/toolbar}/index.d.ts +0 -0
- /package/lib/{toolbar → workspace/toolbar}/index.js +0 -0
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import React, { useEffect, useMemo, useState } from 'react';
|
|
2
|
+
import { SchemaForm } from "../../../../shared/formbuilder/objectform/SchemaForm";
|
|
3
|
+
import { WmsTileSourceUrlInput } from "../../../../shared/formbuilder/objectform/components/WmsTileSourceUrlInput";
|
|
4
|
+
import { processBaseSchema, removeFormEntry, } from "../../../../shared/formbuilder/objectform/schemaUtils";
|
|
5
|
+
import { useSchemaFormState } from "../../../../shared/formbuilder/objectform/useSchemaFormState";
|
|
6
|
+
import { GlobalStateDbManager } from "../../../../shared/store";
|
|
7
|
+
import { deepCopy } from "../../../../tools";
|
|
8
|
+
export const WMS_AVAILABLE_LAYERS_CACHE = 'jgis:wmsTileSource:availableLayers';
|
|
9
|
+
export function WmsTileSourceForm(props) {
|
|
10
|
+
const { schema: schemaProp, sourceData, syncData, model, filePath, formContext, dialogOptions, cancel, formErrorSignal, } = props;
|
|
11
|
+
const { formData, schema, formContextValue, hasSchema, handleChangeBase, handleSubmitBase, } = useSchemaFormState({
|
|
12
|
+
sourceData,
|
|
13
|
+
schemaProp,
|
|
14
|
+
model,
|
|
15
|
+
syncData,
|
|
16
|
+
cancel,
|
|
17
|
+
onAfterChange: dialogOptions
|
|
18
|
+
? (data) => {
|
|
19
|
+
dialogOptions.sourceData = Object.assign({}, data);
|
|
20
|
+
}
|
|
21
|
+
: undefined,
|
|
22
|
+
});
|
|
23
|
+
const [wmsAvailableLayers, setWmsAvailableLayers] = useState([]);
|
|
24
|
+
const stateDb = GlobalStateDbManager.getInstance().getStateDb();
|
|
25
|
+
// Rehydrate available WMS layers from StateDB to avoid having to refetch on remount.
|
|
26
|
+
useEffect(() => {
|
|
27
|
+
const wmsUrl = formData === null || formData === void 0 ? void 0 : formData.url;
|
|
28
|
+
if (!stateDb || !wmsUrl) {
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
const db = stateDb;
|
|
32
|
+
const cacheKey = `${WMS_AVAILABLE_LAYERS_CACHE}:${wmsUrl}`;
|
|
33
|
+
async function loadLayersFromCache() {
|
|
34
|
+
var _a, _b;
|
|
35
|
+
const cached = (await db.fetch(cacheKey));
|
|
36
|
+
if (cached && cached.length > 0) {
|
|
37
|
+
setWmsAvailableLayers(cached);
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
setWmsAvailableLayers([]);
|
|
41
|
+
handleChangeBase(Object.assign(Object.assign({}, (formData !== null && formData !== void 0 ? formData : {})), { params: Object.assign(Object.assign({}, ((_b = ((_a = formData === null || formData === void 0 ? void 0 : formData.params) !== null && _a !== void 0 ? _a : {})) !== null && _b !== void 0 ? _b : {})), { layers: undefined }) }));
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
void loadLayersFromCache();
|
|
45
|
+
}, [stateDb, formData === null || formData === void 0 ? void 0 : formData.url]);
|
|
46
|
+
const uiSchema = useMemo(() => {
|
|
47
|
+
var _a, _b, _c, _d;
|
|
48
|
+
const builtUiSchema = {};
|
|
49
|
+
const dataCopy = deepCopy(formData);
|
|
50
|
+
processBaseSchema(dataCopy, schema, builtUiSchema, formContext, removeFormEntry);
|
|
51
|
+
const layerNames = wmsAvailableLayers
|
|
52
|
+
.map(layer => layer.name)
|
|
53
|
+
.filter(name => name !== '');
|
|
54
|
+
// Populate schema enum dynamically so RJSF renders a select for params.layers
|
|
55
|
+
const params = ((_b = (_a = schema.properties) === null || _a === void 0 ? void 0 : _a.params) !== null && _b !== void 0 ? _b : {});
|
|
56
|
+
const paramsProperties = ((_c = params.properties) !== null && _c !== void 0 ? _c : {});
|
|
57
|
+
if (paramsProperties.layers) {
|
|
58
|
+
// Keep select options in sync with the cached/available layers list.
|
|
59
|
+
if (layerNames.length > 0) {
|
|
60
|
+
paramsProperties.layers.enum = layerNames;
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
// Avoid invalid schema (`enum` must be a non-empty array).
|
|
64
|
+
delete paramsProperties.layers.enum;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
builtUiSchema.url = {
|
|
68
|
+
'ui:widget': WmsTileSourceUrlInput,
|
|
69
|
+
};
|
|
70
|
+
builtUiSchema.params = Object.assign(Object.assign({}, builtUiSchema.params), { 'ui:title': false, layers: Object.assign(Object.assign({}, (_d = builtUiSchema.params) === null || _d === void 0 ? void 0 : _d.layers), { 'ui:widget': 'select', 'ui:placeholder': 'Select a layer', 'ui:enumNames': wmsAvailableLayers.map(layer => layer.title) }) });
|
|
71
|
+
return builtUiSchema;
|
|
72
|
+
}, [schema, formData, formContext, wmsAvailableLayers]);
|
|
73
|
+
if (!hasSchema) {
|
|
74
|
+
return null;
|
|
75
|
+
}
|
|
76
|
+
return (React.createElement(SchemaForm, { schema: schema, formData: formData, onChange: handleChangeBase, onSubmit: handleSubmitBase, formContext: Object.assign(Object.assign({}, formContextValue), { wmsAvailableLayers,
|
|
77
|
+
setWmsAvailableLayers }), filePath: filePath, uiSchema: uiSchema, formErrorSignal: formErrorSignal }));
|
|
78
|
+
}
|
|
@@ -3,7 +3,7 @@ import { Dialog } from '@jupyterlab/apputils';
|
|
|
3
3
|
import { PromiseDelegate } from '@lumino/coreutils';
|
|
4
4
|
import { Signal } from '@lumino/signaling';
|
|
5
5
|
import * as React from 'react';
|
|
6
|
-
import { ICreationFormProps } from "
|
|
6
|
+
import { ICreationFormProps } from "../../shared/formbuilder";
|
|
7
7
|
export interface ICreationFormWrapperProps extends ICreationFormProps {
|
|
8
8
|
/**
|
|
9
9
|
* A promise resolving when the dialog is ready.
|
|
@@ -2,7 +2,7 @@ import { Dialog } from '@jupyterlab/apputils';
|
|
|
2
2
|
import { PromiseDelegate } from '@lumino/coreutils';
|
|
3
3
|
import { Signal } from '@lumino/signaling';
|
|
4
4
|
import * as React from 'react';
|
|
5
|
-
import { CreationForm } from "
|
|
5
|
+
import { CreationForm } from "../../shared/formbuilder";
|
|
6
6
|
export const CreationFormWrapper = props => {
|
|
7
7
|
var _a;
|
|
8
8
|
const [ready, setReady] = React.useState(false);
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Grammar symbology panel.
|
|
3
|
+
*
|
|
4
|
+
* Shows encoding rules grouped by layer. Each layer has optional render-side
|
|
5
|
+
* transforms (KDE, cluster) followed by (field → scale → channels) mapping rows.
|
|
6
|
+
* Multiple layers allow independent rendering pipelines on the same source.
|
|
7
|
+
*/
|
|
8
|
+
import React from 'react';
|
|
9
|
+
import { ISymbologyDialogProps } from "./symbologyDialog";
|
|
10
|
+
declare const Grammar: React.FC<ISymbologyDialogProps>;
|
|
11
|
+
export default Grammar;
|
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Grammar symbology panel.
|
|
3
|
+
*
|
|
4
|
+
* Shows encoding rules grouped by layer. Each layer has optional render-side
|
|
5
|
+
* transforms (KDE, cluster) followed by (field → scale → channels) mapping rows.
|
|
6
|
+
* Multiple layers allow independent rendering pipelines on the same source.
|
|
7
|
+
*/
|
|
8
|
+
import { faPlus, faTrash, faXmark } from '@fortawesome/free-solid-svg-icons';
|
|
9
|
+
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
|
|
10
|
+
import { UUID } from '@lumino/coreutils';
|
|
11
|
+
import React, { useCallback, useEffect, useState } from 'react';
|
|
12
|
+
import MappingRow, { WhenAddForm, formatPredicate, } from "./components/MappingRow";
|
|
13
|
+
import { NumericInput } from "./components/NumericInput";
|
|
14
|
+
import { useEffectiveSymbologyParams } from "./hooks/useEffectiveSymbologyParams";
|
|
15
|
+
import useGetBandInfo from "./hooks/useGetBandInfo";
|
|
16
|
+
import { useGetProperties } from "./hooks/useGetProperties";
|
|
17
|
+
import { useOkSignal } from "./hooks/useOkSignal";
|
|
18
|
+
import { saveSymbology, } from "./symbologyUtils";
|
|
19
|
+
import { Button } from "../../../shared/components/Button";
|
|
20
|
+
import { NativeSelect, NativeSelectOption, } from "../../../shared/components/NativeSelect";
|
|
21
|
+
const DEFAULT_CHANNELS = ['fill-color', 'circle-fill-color'];
|
|
22
|
+
const DEFAULT_RGBA = [128, 128, 128, 1];
|
|
23
|
+
// ---------------------------------------------------------------------------
|
|
24
|
+
// Canonical → Grammar conversion
|
|
25
|
+
// ---------------------------------------------------------------------------
|
|
26
|
+
// ---------------------------------------------------------------------------
|
|
27
|
+
// Transform row
|
|
28
|
+
// ---------------------------------------------------------------------------
|
|
29
|
+
const TRANSFORM_TYPES = [
|
|
30
|
+
{ value: 'kde', label: 'KDE (heatmap)' },
|
|
31
|
+
{ value: 'cluster', label: 'cluster' },
|
|
32
|
+
];
|
|
33
|
+
function defaultTransform(type) {
|
|
34
|
+
switch (type) {
|
|
35
|
+
case 'kde':
|
|
36
|
+
return { type: 'kde', radius: 10, blur: 15 };
|
|
37
|
+
case 'cluster':
|
|
38
|
+
return { type: 'cluster', radius: 40 };
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
const TransformRow = ({ transform, availableFields, onChange, onDelete, }) => {
|
|
42
|
+
var _a;
|
|
43
|
+
const handleTypeChange = (type) => {
|
|
44
|
+
onChange(defaultTransform(type));
|
|
45
|
+
};
|
|
46
|
+
return (React.createElement("div", { className: "jp-gis-grammar-transform-row" },
|
|
47
|
+
React.createElement(NativeSelect, { value: transform.type, onChange: e => handleTypeChange(e.target.value) }, TRANSFORM_TYPES.map(({ value, label }) => (React.createElement(NativeSelectOption, { key: value, value: value }, label)))),
|
|
48
|
+
transform.type === 'kde' && (React.createElement(React.Fragment, null,
|
|
49
|
+
React.createElement("label", null, "radius"),
|
|
50
|
+
React.createElement(NumericInput, { style: { width: 52 }, value: transform.radius, onChange: v => onChange(Object.assign(Object.assign({}, transform), { radius: v })) }),
|
|
51
|
+
React.createElement("label", null, "blur"),
|
|
52
|
+
React.createElement(NumericInput, { style: { width: 52 }, value: transform.blur, onChange: v => onChange(Object.assign(Object.assign({}, transform), { blur: v })) }),
|
|
53
|
+
React.createElement("label", null, "weight"),
|
|
54
|
+
React.createElement(NativeSelect, { value: (_a = transform.weightField) !== null && _a !== void 0 ? _a : '', onChange: e => onChange(Object.assign(Object.assign({}, transform), { weightField: e.target.value || undefined })) },
|
|
55
|
+
React.createElement(NativeSelectOption, { value: "" }, "(none)"),
|
|
56
|
+
availableFields.map(field => (React.createElement(NativeSelectOption, { key: field, value: field }, field)))))),
|
|
57
|
+
transform.type === 'cluster' && (React.createElement(React.Fragment, null,
|
|
58
|
+
React.createElement("label", null, "radius"),
|
|
59
|
+
React.createElement(NumericInput, { style: { width: 52 }, value: transform.radius, onChange: v => onChange(Object.assign(Object.assign({}, transform), { radius: v })) }))),
|
|
60
|
+
React.createElement(Button, { type: "button", className: "jp-gis-grammar-delete-btn", onClick: onDelete, title: "Remove transform", style: { marginLeft: 'auto' } },
|
|
61
|
+
React.createElement(FontAwesomeIcon, { icon: faTrash }))));
|
|
62
|
+
};
|
|
63
|
+
const LayerSection = ({ layer, layerIndex, totalLayers, availableFields, featureValues, isRasterLayer = false, onChange, onDelete, }) => {
|
|
64
|
+
var _a, _b, _c, _d;
|
|
65
|
+
const [addingLayerWhen, setAddingLayerWhen] = useState(false);
|
|
66
|
+
const addLayerPredicate = useCallback((pred) => {
|
|
67
|
+
var _a;
|
|
68
|
+
onChange(Object.assign(Object.assign({}, layer), { when: [...((_a = layer.when) !== null && _a !== void 0 ? _a : []), pred] }));
|
|
69
|
+
setAddingLayerWhen(false);
|
|
70
|
+
}, [layer, onChange]);
|
|
71
|
+
const removeLayerPredicate = useCallback((index) => {
|
|
72
|
+
var _a;
|
|
73
|
+
const next = ((_a = layer.when) !== null && _a !== void 0 ? _a : []).filter((_, i) => i !== index);
|
|
74
|
+
onChange(Object.assign(Object.assign({}, layer), { when: next.length > 0 ? next : undefined }));
|
|
75
|
+
}, [layer, onChange]);
|
|
76
|
+
const updateTransform = useCallback((index, t) => {
|
|
77
|
+
const next = [...layer.transforms];
|
|
78
|
+
next[index] = t;
|
|
79
|
+
onChange(Object.assign(Object.assign({}, layer), { transforms: next }));
|
|
80
|
+
}, [layer, onChange]);
|
|
81
|
+
const removeTransform = useCallback((index) => {
|
|
82
|
+
onChange(Object.assign(Object.assign({}, layer), { transforms: layer.transforms.filter((_, i) => i !== index) }));
|
|
83
|
+
}, [layer, onChange]);
|
|
84
|
+
const addTransform = useCallback(() => {
|
|
85
|
+
onChange(Object.assign(Object.assign({}, layer), { transforms: [...layer.transforms, defaultTransform('kde')] }));
|
|
86
|
+
}, [layer, onChange]);
|
|
87
|
+
const updateRow = useCallback((index, row) => {
|
|
88
|
+
const next = [...layer.rows];
|
|
89
|
+
next[index] = row;
|
|
90
|
+
onChange(Object.assign(Object.assign({}, layer), { rows: next }));
|
|
91
|
+
}, [layer, onChange]);
|
|
92
|
+
const removeRow = useCallback((index) => {
|
|
93
|
+
onChange(Object.assign(Object.assign({}, layer), { rows: layer.rows.filter((_, i) => i !== index) }));
|
|
94
|
+
}, [layer, onChange]);
|
|
95
|
+
const hasKDE = layer.transforms.some(t => t.type === 'kde');
|
|
96
|
+
const isRaster = isRasterLayer || hasKDE;
|
|
97
|
+
const addRow = useCallback(() => {
|
|
98
|
+
const defaultChannels = isRaster
|
|
99
|
+
? ['pixel-color']
|
|
100
|
+
: DEFAULT_CHANNELS;
|
|
101
|
+
onChange(Object.assign(Object.assign({}, layer), { rows: [
|
|
102
|
+
...layer.rows,
|
|
103
|
+
{
|
|
104
|
+
id: UUID.uuid4(),
|
|
105
|
+
scale: { scheme: 'constant_rgba', params: { value: DEFAULT_RGBA } },
|
|
106
|
+
channels: [...defaultChannels],
|
|
107
|
+
},
|
|
108
|
+
] }));
|
|
109
|
+
}, [layer, onChange, isRaster]);
|
|
110
|
+
// KDE layers expose '$density'; raster layers expose $band-N fields.
|
|
111
|
+
// Both cases suppress the raw feature attribute list.
|
|
112
|
+
const encodingFields = hasKDE ? ['$density'] : availableFields;
|
|
113
|
+
return (React.createElement("div", { className: "jp-gis-grammar-layer-section" },
|
|
114
|
+
React.createElement("div", { className: "jp-gis-grammar-layer-header" },
|
|
115
|
+
React.createElement("span", { className: "jp-gis-grammar-layer-label" },
|
|
116
|
+
"Layer ",
|
|
117
|
+
layerIndex + 1),
|
|
118
|
+
React.createElement(Button, { type: "button", variant: "outline", onClick: addTransform, title: "Add transform" },
|
|
119
|
+
React.createElement(FontAwesomeIcon, { "data-icon": "inline-start", icon: faPlus }),
|
|
120
|
+
"Transform"),
|
|
121
|
+
totalLayers > 1 && (React.createElement(Button, { type: "button", variant: "outline", style: { height: 32, width: 32 }, onClick: onDelete, title: "Remove layer" },
|
|
122
|
+
React.createElement(FontAwesomeIcon, { icon: faTrash })))),
|
|
123
|
+
React.createElement("div", { className: "jp-gis-grammar-when-row" },
|
|
124
|
+
React.createElement("span", { className: "jp-gis-grammar-when-label" }, "when"),
|
|
125
|
+
((_b = (_a = layer.when) === null || _a === void 0 ? void 0 : _a.length) !== null && _b !== void 0 ? _b : 0) > 1 && (React.createElement(Button, { type: "button", className: "jp-gis-grammar-when-op", onClick: () => {
|
|
126
|
+
var _a;
|
|
127
|
+
return onChange(Object.assign(Object.assign({}, layer), { whenOp: ((_a = layer.whenOp) !== null && _a !== void 0 ? _a : 'all') === 'all' ? 'any' : 'all' }));
|
|
128
|
+
} }, (_c = layer.whenOp) !== null && _c !== void 0 ? _c : 'all')), (_d = layer.when) === null || _d === void 0 ? void 0 :
|
|
129
|
+
_d.map((pred, i) => (React.createElement("span", { key: i, className: "jp-gis-grammar-when-chip" },
|
|
130
|
+
formatPredicate(pred),
|
|
131
|
+
React.createElement(Button, { type: "button", onClick: () => removeLayerPredicate(i), title: "Remove condition" },
|
|
132
|
+
React.createElement(FontAwesomeIcon, { icon: faXmark }))))),
|
|
133
|
+
addingLayerWhen ? (React.createElement(WhenAddForm, { availableFields: availableFields, onAdd: addLayerPredicate, onCancel: () => setAddingLayerWhen(false) })) : (React.createElement(Button, { type: "button", className: "jp-gis-grammar-when-add-btn", onClick: () => setAddingLayerWhen(true) },
|
|
134
|
+
React.createElement(FontAwesomeIcon, { icon: faPlus })))),
|
|
135
|
+
layer.transforms.map((t, i) => (React.createElement(TransformRow, { key: i, transform: t, availableFields: availableFields, onChange: updated => updateTransform(i, updated), onDelete: () => removeTransform(i) }))),
|
|
136
|
+
layer.rows.map((row, i) => (React.createElement(MappingRow, { key: row.id, row: row, availableFields: encodingFields, featureValues: featureValues, isRaster: isRaster, onChange: updated => updateRow(i, updated), onDelete: () => removeRow(i) }))),
|
|
137
|
+
React.createElement("div", { className: "jp-gis-symbology-button-container" },
|
|
138
|
+
React.createElement(Button, { className: "jp-Dialog-button jp-mod-accept jp-mod-styled", style: { margin: '0 0 0.5rem 1rem' }, onClick: addRow }, "Add Mapping"))));
|
|
139
|
+
};
|
|
140
|
+
// ---------------------------------------------------------------------------
|
|
141
|
+
// Grammar panel
|
|
142
|
+
// ---------------------------------------------------------------------------
|
|
143
|
+
const Grammar = ({ model, okSignalPromise, layerId, isStorySegmentOverride, segmentId, }) => {
|
|
144
|
+
const layer = layerId !== undefined ? model.getLayer(layerId) : null;
|
|
145
|
+
const isRasterLayer = (layer === null || layer === void 0 ? void 0 : layer.type) === 'GeoTiffLayer';
|
|
146
|
+
const { featureProperties: selectableAttributesAndValues } = useGetProperties({ layerId, model });
|
|
147
|
+
// For raster layers, expose $band-N pseudo-fields derived from band metadata.
|
|
148
|
+
const { bandRows } = useGetBandInfo(model, layer);
|
|
149
|
+
const params = useEffectiveSymbologyParams({
|
|
150
|
+
model,
|
|
151
|
+
layerId,
|
|
152
|
+
layer,
|
|
153
|
+
isStorySegmentOverride,
|
|
154
|
+
segmentId,
|
|
155
|
+
});
|
|
156
|
+
const [layers, setLayers] = useState([
|
|
157
|
+
{ id: UUID.uuid4(), transforms: [], rows: [] },
|
|
158
|
+
]);
|
|
159
|
+
useEffect(() => {
|
|
160
|
+
if (!(params === null || params === void 0 ? void 0 : params.symbologyState)) {
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
163
|
+
const rawState = params.symbologyState;
|
|
164
|
+
if (!Array.isArray(rawState.layers) ||
|
|
165
|
+
!rawState.layers.length) {
|
|
166
|
+
setLayers([{ id: UUID.uuid4(), transforms: [], rows: [] }]);
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
169
|
+
const state = rawState;
|
|
170
|
+
setLayers(state.layers.map(grammarLayer => {
|
|
171
|
+
var _a, _b;
|
|
172
|
+
return (Object.assign(Object.assign(Object.assign({ id: grammarLayer.id, transforms: (_a = grammarLayer.preprocess) !== null && _a !== void 0 ? _a : [] }, (((_b = grammarLayer.when) === null || _b === void 0 ? void 0 : _b.length) ? { when: grammarLayer.when } : {})), (grammarLayer.whenOp ? { whenOp: grammarLayer.whenOp } : {})), { rows: grammarLayer.rules.flatMap(rule => rule.mappings.map((mapping, mi) => {
|
|
173
|
+
var _a;
|
|
174
|
+
return (Object.assign(Object.assign({
|
|
175
|
+
// Preserve the rule's stable id so React keys and story-segment
|
|
176
|
+
// override merging stay consistent across dialog opens.
|
|
177
|
+
// When a rule has multiple mappings, suffix with the mapping index.
|
|
178
|
+
id: rule.mappings.length === 1 ? rule.id : `${rule.id}-${mi}`, fields: ((_a = rule.fields) === null || _a === void 0 ? void 0 : _a.length) ? rule.fields : undefined, scale: mapping.scale, channels: [...mapping.channels] }, (rule.when ? { when: rule.when } : {})), (rule.whenOp ? { whenOp: rule.whenOp } : {})));
|
|
179
|
+
})) }));
|
|
180
|
+
}));
|
|
181
|
+
}, [params]);
|
|
182
|
+
const handleOk = () => {
|
|
183
|
+
if (!layerId || !(layer === null || layer === void 0 ? void 0 : layer.parameters)) {
|
|
184
|
+
return;
|
|
185
|
+
}
|
|
186
|
+
const grammarLayers = layers.map(uiLayer => {
|
|
187
|
+
var _a;
|
|
188
|
+
const rules = uiLayer.rows
|
|
189
|
+
.filter(row => row.channels.length > 0)
|
|
190
|
+
.map(row => {
|
|
191
|
+
var _a, _b;
|
|
192
|
+
return (Object.assign(Object.assign(Object.assign(Object.assign({ id: row.id }, (((_a = row.fields) === null || _a === void 0 ? void 0 : _a.length) ? { fields: row.fields } : {})), (((_b = row.when) === null || _b === void 0 ? void 0 : _b.length) ? { when: row.when } : {})), (row.whenOp ? { whenOp: row.whenOp } : {})), { mappings: [
|
|
193
|
+
{
|
|
194
|
+
scale: row.scale,
|
|
195
|
+
channels: row.channels,
|
|
196
|
+
},
|
|
197
|
+
] }));
|
|
198
|
+
});
|
|
199
|
+
return Object.assign(Object.assign(Object.assign(Object.assign({ id: uiLayer.id }, (uiLayer.transforms.length
|
|
200
|
+
? { preprocess: uiLayer.transforms }
|
|
201
|
+
: {})), (((_a = uiLayer.when) === null || _a === void 0 ? void 0 : _a.length) ? { when: uiLayer.when } : {})), (uiLayer.whenOp ? { whenOp: uiLayer.whenOp } : {})), { rules });
|
|
202
|
+
});
|
|
203
|
+
const symbologyState = {
|
|
204
|
+
layers: grammarLayers,
|
|
205
|
+
};
|
|
206
|
+
saveSymbology({
|
|
207
|
+
model,
|
|
208
|
+
layerId,
|
|
209
|
+
isStorySegmentOverride,
|
|
210
|
+
segmentId,
|
|
211
|
+
payload: { symbologyState },
|
|
212
|
+
mutateLayerBeforeSave: targetLayer => {
|
|
213
|
+
var _a;
|
|
214
|
+
if (((_a = targetLayer.parameters) === null || _a === void 0 ? void 0 : _a.color) !== undefined) {
|
|
215
|
+
delete targetLayer.parameters.color;
|
|
216
|
+
}
|
|
217
|
+
},
|
|
218
|
+
});
|
|
219
|
+
};
|
|
220
|
+
useOkSignal(okSignalPromise, handleOk);
|
|
221
|
+
const addLayer = () => {
|
|
222
|
+
setLayers(prev => [
|
|
223
|
+
...prev,
|
|
224
|
+
{ id: UUID.uuid4(), transforms: [], rows: [] },
|
|
225
|
+
]);
|
|
226
|
+
};
|
|
227
|
+
const availableFields = isRasterLayer
|
|
228
|
+
? bandRows.map(b => `$band-${b.band}`)
|
|
229
|
+
: Object.keys(selectableAttributesAndValues);
|
|
230
|
+
return (React.createElement("div", { className: "jp-gis-layer-symbology-container" },
|
|
231
|
+
layers.map((uiLayer, i) => (React.createElement(LayerSection, { key: uiLayer.id, layer: uiLayer, layerIndex: i, totalLayers: layers.length, availableFields: availableFields, featureValues: selectableAttributesAndValues, isRasterLayer: isRasterLayer, onChange: updated => setLayers(prev => prev.map((l, j) => (j === i ? updated : l))), onDelete: () => setLayers(prev => prev.filter((_, j) => j !== i)) }))),
|
|
232
|
+
React.createElement("div", { className: "jp-gis-symbology-button-container" },
|
|
233
|
+
React.createElement(Button, { className: "jp-Dialog-button jp-mod-accept jp-mod-styled", onClick: addLayer }, "Add Layer"))));
|
|
234
|
+
};
|
|
235
|
+
export default Grammar;
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import colormap from 'colormap';
|
|
2
2
|
import React, { useEffect, useState } from 'react';
|
|
3
|
-
import ColorRampSelector from "
|
|
4
|
-
import { useOkSignal } from "
|
|
5
|
-
import { saveSymbology, } from "
|
|
6
|
-
import { useLatest } from "
|
|
7
|
-
import {
|
|
3
|
+
import ColorRampSelector from "./components/color_ramp/ColorRampSelector";
|
|
4
|
+
import { useOkSignal } from "./hooks/useOkSignal";
|
|
5
|
+
import { saveSymbology, } from "./symbologyUtils";
|
|
6
|
+
import { useLatest } from "../../../shared/hooks/useLatest";
|
|
7
|
+
import { useColorMapList, COLOR_RAMP_DEFAULTS, } from './colorRampUtils';
|
|
8
|
+
import { useEffectiveSymbologyParams } from './hooks/useEffectiveSymbologyParams';
|
|
8
9
|
const Heatmap = ({ model, okSignalPromise, layerId, isStorySegmentOverride, segmentId, }) => {
|
|
9
10
|
if (!layerId) {
|
|
10
11
|
return;
|
|
@@ -26,9 +27,20 @@ const Heatmap = ({ model, okSignalPromise, layerId, isStorySegmentOverride, segm
|
|
|
26
27
|
blur: 15,
|
|
27
28
|
});
|
|
28
29
|
const [reverseRamp, setReverseRamp] = useState(false);
|
|
30
|
+
const [colorMaps, setColorMaps] = useState([]);
|
|
29
31
|
const selectedRampRef = useLatest(selectedRamp);
|
|
30
32
|
const heatmapOptionsRef = useLatest(heatmapOptions);
|
|
31
33
|
const reverseRampRef = useLatest(reverseRamp);
|
|
34
|
+
useColorMapList(setColorMaps);
|
|
35
|
+
// Filter: only continuous colormaps with class requirement <= 9 nshades
|
|
36
|
+
// because heatmap does not support nshades > 9
|
|
37
|
+
const continuousMaps = colorMaps.filter(m => {
|
|
38
|
+
if (m.type !== 'continuous') {
|
|
39
|
+
return false;
|
|
40
|
+
}
|
|
41
|
+
const minShades = COLOR_RAMP_DEFAULTS[m.name];
|
|
42
|
+
return !minShades || minShades <= 9;
|
|
43
|
+
});
|
|
32
44
|
useEffect(() => {
|
|
33
45
|
populateOptions();
|
|
34
46
|
}, []);
|
|
@@ -38,8 +50,8 @@ const Heatmap = ({ model, okSignalPromise, layerId, isStorySegmentOverride, segm
|
|
|
38
50
|
if ((_a = params.symbologyState) === null || _a === void 0 ? void 0 : _a.colorRamp) {
|
|
39
51
|
colorRamp = params.symbologyState.colorRamp;
|
|
40
52
|
}
|
|
41
|
-
if (typeof ((_b = params.symbologyState) === null || _b === void 0 ? void 0 : _b.
|
|
42
|
-
setReverseRamp(params.symbologyState.
|
|
53
|
+
if (typeof ((_b = params.symbologyState) === null || _b === void 0 ? void 0 : _b.reverseRamp) === 'boolean') {
|
|
54
|
+
setReverseRamp(params.symbologyState.reverseRamp);
|
|
43
55
|
}
|
|
44
56
|
setSelectedRamp(colorRamp);
|
|
45
57
|
};
|
|
@@ -52,10 +64,15 @@ const Heatmap = ({ model, okSignalPromise, layerId, isStorySegmentOverride, segm
|
|
|
52
64
|
if (reverseRampRef.current) {
|
|
53
65
|
colorMap = [...colorMap].reverse();
|
|
54
66
|
}
|
|
67
|
+
// The Heatmap dialog converts a vector layer to a heatmap layer via
|
|
68
|
+
// mutateLayerBeforeSave; the symbologyState it writes is structurally
|
|
69
|
+
// a heatmap state (renderType: 'Heatmap', with a gradient array) but
|
|
70
|
+
// needs to be accepted on VectorSymbologyParams here, hence the cast.
|
|
55
71
|
const symbologyState = {
|
|
56
72
|
renderType: 'Heatmap',
|
|
57
73
|
colorRamp: selectedRampRef.current,
|
|
58
|
-
|
|
74
|
+
reverseRamp: reverseRampRef.current,
|
|
75
|
+
gradient: colorMap,
|
|
59
76
|
};
|
|
60
77
|
saveSymbology({
|
|
61
78
|
model,
|
|
@@ -64,12 +81,15 @@ const Heatmap = ({ model, okSignalPromise, layerId, isStorySegmentOverride, segm
|
|
|
64
81
|
segmentId,
|
|
65
82
|
payload: {
|
|
66
83
|
symbologyState,
|
|
67
|
-
color: colorMap,
|
|
68
84
|
},
|
|
69
85
|
mutateLayerBeforeSave: targetLayer => {
|
|
86
|
+
var _a;
|
|
70
87
|
targetLayer.parameters.blur = heatmapOptionsRef.current.blur;
|
|
71
88
|
targetLayer.parameters.radius = heatmapOptionsRef.current.radius;
|
|
72
89
|
targetLayer.type = 'HeatmapLayer';
|
|
90
|
+
if (((_a = targetLayer.parameters) === null || _a === void 0 ? void 0 : _a.color) !== undefined) {
|
|
91
|
+
delete targetLayer.parameters.color;
|
|
92
|
+
}
|
|
73
93
|
},
|
|
74
94
|
});
|
|
75
95
|
};
|
|
@@ -78,7 +98,7 @@ const Heatmap = ({ model, okSignalPromise, layerId, isStorySegmentOverride, segm
|
|
|
78
98
|
React.createElement("p", null, "Represent features based on their density using a heatmap."),
|
|
79
99
|
React.createElement("div", { className: "jp-gis-symbology-row jp-gis-heatmap" },
|
|
80
100
|
React.createElement("label", { htmlFor: "color-ramp-select" }, "Color Ramp:"),
|
|
81
|
-
React.createElement(ColorRampSelector, { selectedRamp: selectedRamp, setSelected: setSelectedRamp, reverse: reverseRamp, setReverse: setReverseRamp })),
|
|
101
|
+
React.createElement(ColorRampSelector, { selectedRamp: selectedRamp, setSelected: setSelectedRamp, reverse: reverseRamp, setReverse: setReverseRamp, colorMaps: continuousMaps })),
|
|
82
102
|
React.createElement("div", { className: "jp-gis-symbology-row" },
|
|
83
103
|
React.createElement("label", { htmlFor: 'vector-value-select' }, "Radius:"),
|
|
84
104
|
React.createElement("input", { type: "number", value: heatmapOptions.radius, className: "jp-mod-styled", onChange: event => setHetamapOptions(prevState => (Object.assign(Object.assign({}, prevState), { radius: +event.target.value }))) })),
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
|
|
1
|
+
export type InterpolationType = 'discrete' | 'linear' | 'exact';
|
|
2
2
|
export declare namespace VectorClassifications {
|
|
3
|
-
const calculateQuantileBreaks: (values: number[],
|
|
4
|
-
const calculateEqualIntervalBreaks: (values: number[],
|
|
5
|
-
const calculateJenksBreaks: (values: number[],
|
|
6
|
-
const calculatePrettyBreaks: (values: number[],
|
|
7
|
-
const calculateLogarithmicBreaks: (values: number[],
|
|
3
|
+
const calculateQuantileBreaks: (values: number[], nStops: number) => number[];
|
|
4
|
+
const calculateEqualIntervalBreaks: (values: number[], nStops: number) => number[];
|
|
5
|
+
const calculateJenksBreaks: (values: number[], nStops: number) => any[];
|
|
6
|
+
const calculatePrettyBreaks: (values: number[], nStops: number) => number[];
|
|
7
|
+
const calculateLogarithmicBreaks: (values: number[], nStops: number) => number[];
|
|
8
8
|
}
|
|
9
9
|
export declare namespace GeoTiffClassifications {
|
|
10
10
|
const classifyQuantileBreaks: (nClasses: number, bandNumber: number, url: string, colorRampType: string) => Promise<number[]>;
|