@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.
Files changed (397) hide show
  1. package/lib/commands/BaseCommandIDs.d.ts +6 -0
  2. package/lib/commands/BaseCommandIDs.js +6 -0
  3. package/lib/commands/index.js +245 -55
  4. package/lib/commands/operationCommands.js +2 -2
  5. package/lib/constants.js +6 -1
  6. package/lib/{panelview/annotationPanel.js → features/annotations/AnnotationsPanel.js} +1 -1
  7. package/lib/{annotations → features/annotations}/index.d.ts +1 -0
  8. package/lib/{annotations → features/annotations}/index.js +1 -0
  9. package/lib/{console → features/console}/consoleview.js +1 -1
  10. package/lib/{panelview/filter-panel → features/filter}/Filter.js +4 -4
  11. package/lib/{panelview/filter-panel → features/filter}/FilterRow.d.ts +3 -2
  12. package/lib/{panelview/filter-panel → features/filter}/FilterRow.js +2 -1
  13. package/lib/{panelview/identify-panel → features/identify}/IdentifyPanel.d.ts +2 -0
  14. package/lib/features/identify/IdentifyPanel.js +102 -0
  15. package/lib/features/identify/components/FeatureCard.d.ts +17 -0
  16. package/lib/features/identify/components/FeatureCard.js +26 -0
  17. package/lib/features/identify/components/FeatureCardHeader.d.ts +11 -0
  18. package/lib/features/identify/components/FeatureCardHeader.js +30 -0
  19. package/lib/features/identify/components/FeatureFloater.d.ts +7 -0
  20. package/lib/features/identify/components/FeatureFloater.js +19 -0
  21. package/lib/features/identify/components/FeaturePropertyList.d.ts +11 -0
  22. package/lib/features/identify/components/FeaturePropertyList.js +18 -0
  23. package/lib/features/identify/components/FeatureRow.d.ts +13 -0
  24. package/lib/features/identify/components/FeatureRow.js +25 -0
  25. package/lib/features/identify/components/PropertyEditors.d.ts +44 -0
  26. package/lib/features/identify/components/PropertyEditors.js +56 -0
  27. package/lib/features/identify/hooks/useIdentifyPropertyEditor.d.ts +11 -0
  28. package/lib/features/identify/hooks/useIdentifyPropertyEditor.js +132 -0
  29. package/lib/features/identify/types/editorTypes.d.ts +21 -0
  30. package/lib/features/identify/utils/getFeatureIdentifier.d.ts +5 -0
  31. package/lib/features/identify/utils/getFeatureIdentifier.js +14 -0
  32. package/lib/features/identify/utils/highlightLayer.d.ts +11 -0
  33. package/lib/features/identify/utils/highlightLayer.js +57 -0
  34. package/lib/features/identify/utils/highlightStyle.d.ts +7 -0
  35. package/lib/features/identify/utils/highlightStyle.js +40 -0
  36. package/lib/{dialogs/layerBrowserDialog.js → features/layer-browser/index.js} +2 -2
  37. package/lib/features/layers/forms/layer/geoTiffLayerForm.d.ts +3 -0
  38. package/lib/{formbuilder/objectform/layer/webGlLayerForm.js → features/layers/forms/layer/geoTiffLayerForm.js} +5 -5
  39. package/lib/{formbuilder/objectform → features/layers/forms}/layer/heatmapLayerForm.js +4 -4
  40. package/lib/{formbuilder/objectform → features/layers/forms}/layer/hillshadeLayerForm.js +4 -4
  41. package/lib/{formbuilder/objectform → features/layers/forms}/layer/index.d.ts +1 -1
  42. package/lib/{formbuilder/objectform → features/layers/forms}/layer/index.js +1 -1
  43. package/lib/{formbuilder/objectform → features/layers/forms}/layer/layerform.d.ts +1 -1
  44. package/lib/{formbuilder/objectform → features/layers/forms}/layer/layerform.js +4 -4
  45. package/lib/features/layers/forms/layer/storySegmentLayerForm.js +150 -0
  46. package/lib/{formbuilder/objectform → features/layers/forms}/layer/vectorlayerform.js +4 -4
  47. package/lib/{formbuilder/objectform → features/layers/forms}/source/geojsonsource.js +5 -5
  48. package/lib/features/layers/forms/source/geopackagesource.d.ts +3 -0
  49. package/lib/features/layers/forms/source/geopackagesource.js +93 -0
  50. package/lib/{formbuilder/objectform → features/layers/forms}/source/geotiffsource.js +5 -5
  51. package/lib/{formbuilder/objectform → features/layers/forms}/source/index.d.ts +2 -0
  52. package/lib/{formbuilder/objectform → features/layers/forms}/source/index.js +2 -0
  53. package/lib/{formbuilder/objectform → features/layers/forms}/source/pathbasedsource.js +5 -5
  54. package/lib/{formbuilder/objectform → features/layers/forms}/source/sourceform.d.ts +1 -1
  55. package/lib/{formbuilder/objectform → features/layers/forms}/source/sourceform.js +4 -4
  56. package/lib/{formbuilder/objectform → features/layers/forms}/source/tilesourceform.js +4 -4
  57. package/lib/features/layers/forms/source/wmsTileSource.d.ts +4 -0
  58. package/lib/features/layers/forms/source/wmsTileSource.js +78 -0
  59. package/lib/{dialogs → features/layers}/layerCreationFormDialog.d.ts +1 -1
  60. package/lib/{dialogs → features/layers}/layerCreationFormDialog.js +1 -1
  61. package/lib/features/layers/symbology/Grammar.d.ts +11 -0
  62. package/lib/features/layers/symbology/Grammar.js +235 -0
  63. package/lib/{dialogs/symbology/vector_layer/types → features/layers/symbology}/Heatmap.d.ts +1 -1
  64. package/lib/{dialogs/symbology/vector_layer/types → features/layers/symbology}/Heatmap.js +30 -10
  65. package/lib/{dialogs → features/layers}/symbology/classificationModes.d.ts +6 -6
  66. package/lib/{dialogs → features/layers}/symbology/classificationModes.js +57 -57
  67. package/lib/features/layers/symbology/colorRampUtils.d.ts +65 -0
  68. package/lib/features/layers/symbology/colorRampUtils.js +242 -0
  69. package/lib/features/layers/symbology/components/MappingRow.d.ts +40 -0
  70. package/lib/features/layers/symbology/components/MappingRow.js +516 -0
  71. package/lib/features/layers/symbology/components/NumericInput.d.ts +20 -0
  72. package/lib/features/layers/symbology/components/NumericInput.js +44 -0
  73. package/lib/features/layers/symbology/components/ScaleEditor.d.ts +33 -0
  74. package/lib/features/layers/symbology/components/ScaleEditor.js +221 -0
  75. package/lib/{dialogs → features/layers}/symbology/components/color_ramp/ColorRampControls.d.ts +1 -1
  76. package/lib/{dialogs → features/layers}/symbology/components/color_ramp/ColorRampControls.js +3 -2
  77. package/lib/{dialogs → features/layers}/symbology/components/color_ramp/ColorRampSelector.d.ts +2 -1
  78. package/lib/{dialogs → features/layers}/symbology/components/color_ramp/ColorRampSelector.js +12 -15
  79. package/lib/{dialogs → features/layers}/symbology/components/color_ramp/ColorRampSelectorEntry.d.ts +2 -2
  80. package/lib/{dialogs → features/layers}/symbology/components/color_ramp/ColorRampSelectorEntry.js +3 -11
  81. package/lib/{dialogs → features/layers}/symbology/components/color_ramp/ModeSelectRow.d.ts +1 -1
  82. package/lib/features/layers/symbology/components/color_ramp/RgbaColorPicker.d.ts +13 -0
  83. package/lib/features/layers/symbology/components/color_ramp/RgbaColorPicker.js +128 -0
  84. package/lib/{dialogs → features/layers}/symbology/components/color_stops/StopContainer.js +3 -1
  85. package/lib/{dialogs → features/layers}/symbology/components/color_stops/StopRow.d.ts +2 -2
  86. package/lib/{dialogs → features/layers}/symbology/components/color_stops/StopRow.js +12 -7
  87. package/lib/features/layers/symbology/grammarToOLLayer.d.ts +27 -0
  88. package/lib/features/layers/symbology/grammarToOLLayer.js +145 -0
  89. package/lib/features/layers/symbology/grammarToOLStyle.d.ts +32 -0
  90. package/lib/features/layers/symbology/grammarToOLStyle.js +467 -0
  91. package/lib/{dialogs → features/layers}/symbology/hooks/useGetBandInfo.d.ts +1 -1
  92. package/lib/{dialogs → features/layers}/symbology/hooks/useGetBandInfo.js +1 -1
  93. package/lib/{dialogs → features/layers}/symbology/hooks/useGetProperties.js +1 -1
  94. package/lib/{dialogs → features/layers}/symbology/hooks/useGetSymbology.js +4 -2
  95. package/lib/features/layers/symbology/styleBuilder.d.ts +21 -0
  96. package/lib/features/layers/symbology/styleBuilder.js +145 -0
  97. package/lib/{dialogs → features/layers}/symbology/symbologyDialog.d.ts +3 -2
  98. package/lib/{dialogs → features/layers}/symbology/symbologyDialog.js +12 -12
  99. package/lib/features/layers/symbology/symbologyUtils.d.ts +41 -0
  100. package/lib/features/layers/symbology/symbologyUtils.js +114 -0
  101. package/lib/{panelview/objectproperties.d.ts → features/objectproperties/index.d.ts} +1 -1
  102. package/lib/{panelview/objectproperties.js → features/objectproperties/index.js} +5 -10
  103. package/lib/{dialogs → features/processing}/ProcessingFormDialog.d.ts +1 -1
  104. package/lib/{dialogs → features/processing}/ProcessingFormDialog.js +28 -14
  105. package/lib/features/processing/forms/MapExtentToggle.d.ts +13 -0
  106. package/lib/features/processing/forms/MapExtentToggle.js +20 -0
  107. package/lib/features/processing/forms/clipRasterByExtentForm.d.ts +10 -0
  108. package/lib/features/processing/forms/clipRasterByExtentForm.js +99 -0
  109. package/lib/{formbuilder/objectform/process → features/processing/forms}/dissolveProcessForm.js +5 -5
  110. package/lib/{formbuilder/objectform → features/processing/forms}/processingForm.d.ts +1 -1
  111. package/lib/{formbuilder/objectform → features/processing/forms}/processingForm.js +6 -6
  112. package/lib/features/processing/forms/rasterizeForm.d.ts +10 -0
  113. package/lib/features/processing/forms/rasterizeForm.js +75 -0
  114. package/lib/features/processing/forms/useMapExtent.d.ts +22 -0
  115. package/lib/features/processing/forms/useMapExtent.js +57 -0
  116. package/lib/{processing → features/processing}/index.d.ts +19 -2
  117. package/lib/features/processing/index.js +1246 -0
  118. package/lib/{processing → features/processing}/processingCommands.d.ts +1 -1
  119. package/lib/features/processing/processingCommands.js +168 -0
  120. package/lib/features/processing/serverProcessing.d.ts +51 -0
  121. package/lib/features/processing/serverProcessing.js +99 -0
  122. package/lib/{stacBrowser → features/stac-browser}/components/StacPanel.js +2 -2
  123. package/lib/{stacBrowser → features/stac-browser}/components/filter-extension/QueryableComboBox.js +64 -21
  124. package/lib/{stacBrowser → features/stac-browser}/components/filter-extension/QueryableRow.js +1 -1
  125. package/lib/{stacBrowser → features/stac-browser}/components/filter-extension/StacFilterExtensionPanel.js +2 -2
  126. package/lib/{stacBrowser → features/stac-browser}/components/filter-extension/StacQueryableFilters.js +1 -1
  127. package/lib/{stacBrowser → features/stac-browser}/components/geodes/StacFilterSection.js +3 -3
  128. package/lib/{stacBrowser → features/stac-browser}/components/shared/StacPanelResults.js +3 -3
  129. package/lib/{stacBrowser → features/stac-browser}/components/shared/StacSpatialExtent.js +1 -1
  130. package/lib/{stacBrowser → features/stac-browser}/components/shared/StacTemporalExtent.js +1 -1
  131. package/lib/{stacBrowser → features/stac-browser}/context/StacResultsContext.js +2 -2
  132. package/lib/{stacBrowser → features/stac-browser}/hooks/useGeodesSearch.js +2 -2
  133. package/lib/{stacBrowser → features/stac-browser}/hooks/useStacFilterExtension.d.ts +1 -1
  134. package/lib/{stacBrowser → features/stac-browser}/hooks/useStacFilterExtension.js +198 -114
  135. package/lib/{stacBrowser → features/stac-browser}/hooks/useStacSearch.d.ts +1 -0
  136. package/lib/{stacBrowser → features/stac-browser}/hooks/useStacSearch.js +19 -11
  137. package/lib/features/stac-browser/types/types.js +1 -0
  138. package/lib/{panelview/story-maps → features/story}/SpectaPanel.d.ts +4 -1
  139. package/lib/{panelview/story-maps → features/story}/SpectaPanel.js +3 -4
  140. package/lib/{panelview/story-maps → features/story}/StoryEditorPanel.js +1 -1
  141. package/lib/{panelview/story-maps → features/story}/StoryViewerPanel.d.ts +12 -11
  142. package/lib/features/story/StoryViewerPanel.js +64 -0
  143. package/lib/features/story/__tests__/fixtures/listStoryTestItems.d.ts +9 -0
  144. package/lib/features/story/__tests__/fixtures/listStoryTestItems.js +21 -0
  145. package/lib/features/story/components/ListStoryMapOverlayPanel.d.ts +10 -0
  146. package/lib/features/story/components/ListStoryMapOverlayPanel.js +11 -0
  147. package/lib/features/story/components/ListStoryMarkdownMeasurePane.d.ts +11 -0
  148. package/lib/features/story/components/ListStoryMarkdownMeasurePane.js +55 -0
  149. package/lib/features/story/components/ListStoryOverlayMarkdown.d.ts +15 -0
  150. package/lib/features/story/components/ListStoryOverlayMarkdown.js +93 -0
  151. package/lib/features/story/components/ListStoryStageOverlay.d.ts +12 -0
  152. package/lib/features/story/components/ListStoryStageOverlay.js +132 -0
  153. package/lib/features/story/components/ListStoryVirtualScrollTrack.d.ts +6 -0
  154. package/lib/features/story/components/ListStoryVirtualScrollTrack.js +7 -0
  155. package/lib/{panelview/story-maps → features/story}/components/SpectaDesktopView.d.ts +4 -2
  156. package/lib/features/story/components/SpectaDesktopView.js +67 -0
  157. package/lib/{panelview/story-maps → features/story}/components/SpectaMobileView.d.ts +2 -4
  158. package/lib/{panelview/story-maps → features/story}/components/SpectaMobileView.js +3 -3
  159. package/lib/features/story/components/SpectaSingleModeContent.d.ts +18 -0
  160. package/lib/features/story/components/SpectaSingleModeContent.js +8 -0
  161. package/lib/features/story/context/ListStoryScrollTrackContext.d.ts +15 -0
  162. package/lib/features/story/context/ListStoryScrollTrackContext.js +142 -0
  163. package/lib/features/story/hooks/useCurrentSegmentIndex.d.ts +3 -0
  164. package/lib/features/story/hooks/useCurrentSegmentIndex.js +17 -0
  165. package/lib/features/story/hooks/useListStoryScroll.d.ts +15 -0
  166. package/lib/features/story/hooks/useListStoryScroll.js +107 -0
  167. package/lib/features/story/hooks/useQueuedMarkdownHeightMeasure.d.ts +19 -0
  168. package/lib/features/story/hooks/useQueuedMarkdownHeightMeasure.js +56 -0
  169. package/lib/features/story/hooks/useStoryImagePreload.d.ts +1 -0
  170. package/lib/features/story/hooks/useStoryImagePreload.js +24 -0
  171. package/lib/{panelview/story-maps → features/story}/hooks/useStoryMap.d.ts +2 -7
  172. package/lib/{panelview/story-maps → features/story}/hooks/useStoryMap.js +20 -44
  173. package/lib/features/story/hooks/useStoryScrollState.d.ts +21 -0
  174. package/lib/features/story/hooks/useStoryScrollState.js +39 -0
  175. package/lib/features/story/hooks/useStorySegmentSync.d.ts +8 -0
  176. package/lib/features/story/hooks/useStorySegmentSync.js +51 -0
  177. package/lib/features/story/types/types.d.ts +38 -0
  178. package/lib/features/story/types/types.js +1 -0
  179. package/lib/features/story/utils/computeListStoryScrollState.d.ts +12 -0
  180. package/lib/features/story/utils/computeListStoryScrollState.js +70 -0
  181. package/lib/features/story/utils/listStoryMeasureQueue.d.ts +11 -0
  182. package/lib/features/story/utils/listStoryMeasureQueue.js +14 -0
  183. package/lib/features/story/utils/listStoryScrollTrack.d.ts +17 -0
  184. package/lib/features/story/utils/listStoryScrollTrack.js +72 -0
  185. package/lib/features/story/utils/spectaPresentation.d.ts +9 -0
  186. package/lib/features/story/utils/spectaPresentation.js +37 -0
  187. package/lib/features/story/utils/storySegmentViewItems.d.ts +5 -0
  188. package/lib/features/story/utils/storySegmentViewItems.js +30 -0
  189. package/lib/index.d.ts +11 -9
  190. package/lib/index.js +11 -9
  191. package/lib/keybindings.json +5 -0
  192. package/lib/mainview/OpenEOTileLayer.d.ts +49 -0
  193. package/lib/mainview/OpenEOTileLayer.js +179 -0
  194. package/lib/mainview/TemporalSlider.js +11 -9
  195. package/lib/mainview/geoJsonFeaturePatch.d.ts +9 -0
  196. package/lib/mainview/geoJsonFeaturePatch.js +43 -0
  197. package/lib/mainview/mainView.d.ts +93 -8
  198. package/lib/mainview/mainView.js +1286 -529
  199. package/lib/mainview/mainviewwidget.d.ts +5 -1
  200. package/lib/mainview/mainviewwidget.js +4 -2
  201. package/lib/shared/components/Button.d.ts +1 -1
  202. package/lib/shared/components/DropdownMenu.d.ts +1 -0
  203. package/lib/shared/components/DropdownMenu.js +3 -2
  204. package/lib/shared/components/NativeSelect.d.ts +8 -0
  205. package/lib/shared/components/NativeSelect.js +29 -0
  206. package/lib/shared/components/Tabs.d.ts +3 -3
  207. package/lib/shared/components/Tabs.js +5 -5
  208. package/lib/{formbuilder → shared/formbuilder}/creationform.js +71 -4
  209. package/lib/{formbuilder → shared/formbuilder}/editform.js +1 -1
  210. package/lib/{formbuilder → shared/formbuilder}/formselectors.d.ts +2 -2
  211. package/lib/{formbuilder → shared/formbuilder}/formselectors.js +13 -4
  212. package/lib/shared/formbuilder/index.d.ts +4 -0
  213. package/lib/shared/formbuilder/index.js +4 -0
  214. package/lib/{formbuilder → shared/formbuilder}/objectform/SchemaForm.d.ts +1 -1
  215. package/lib/{formbuilder → shared/formbuilder}/objectform/StoryEditorForm.d.ts +1 -1
  216. package/lib/{formbuilder → shared/formbuilder}/objectform/StoryEditorForm.js +1 -1
  217. package/lib/{formbuilder → shared/formbuilder}/objectform/components/LayerSelect.js +1 -1
  218. package/lib/{formbuilder → shared/formbuilder}/objectform/components/SegmentFormSymbology.js +4 -4
  219. package/lib/{formbuilder → shared/formbuilder}/objectform/components/SourcePropertiesField.js +1 -1
  220. package/lib/{formbuilder → shared/formbuilder}/objectform/components/StorySegmentReset.js +1 -1
  221. package/lib/shared/formbuilder/objectform/components/WmsTileSourceUrlInput.d.ts +3 -0
  222. package/lib/shared/formbuilder/objectform/components/WmsTileSourceUrlInput.js +84 -0
  223. package/lib/{formbuilder → shared/formbuilder}/objectform/fileselectorwidget.js +8 -1
  224. package/lib/{formbuilder → shared/formbuilder}/objectform/schemaUtils.d.ts +3 -1
  225. package/lib/{formbuilder → shared/formbuilder}/objectform/schemaUtils.js +11 -0
  226. package/lib/{formbuilder → shared/formbuilder}/objectform/useSchemaFormState.d.ts +2 -2
  227. package/lib/{formbuilder → shared/formbuilder}/objectform/useSchemaFormState.js +1 -1
  228. package/lib/{icons.d.ts → shared/icons.d.ts} +2 -0
  229. package/lib/{icons.js → shared/icons.js} +28 -18
  230. package/lib/tools.d.ts +3 -1
  231. package/lib/tools.js +140 -6
  232. package/lib/types.d.ts +12 -1
  233. package/lib/types.js +6 -1
  234. package/lib/{menus.js → workspace/menus.js} +14 -2
  235. package/lib/workspace/panels/components/TabbedPanel.d.ts +17 -0
  236. package/lib/workspace/panels/components/TabbedPanel.js +19 -0
  237. package/lib/{panelview → workspace/panels}/components/layers.js +82 -20
  238. package/lib/workspace/panels/components/legendItem.js +680 -0
  239. package/lib/workspace/panels/hooks/useLayerTree.d.ts +19 -0
  240. package/lib/workspace/panels/hooks/useLayerTree.js +103 -0
  241. package/lib/workspace/panels/hooks/useRightPanelOptions.d.ts +27 -0
  242. package/lib/workspace/panels/hooks/useRightPanelOptions.js +72 -0
  243. package/lib/workspace/panels/hooks/useUIState.d.ts +2 -0
  244. package/lib/workspace/panels/hooks/useUIState.js +25 -0
  245. package/lib/{panelview → workspace/panels}/index.d.ts +1 -1
  246. package/lib/{panelview → workspace/panels}/index.js +1 -1
  247. package/lib/{panelview → workspace/panels}/leftpanel.d.ts +1 -1
  248. package/lib/workspace/panels/leftpanel.js +70 -0
  249. package/lib/{panelview/rightpanel.d.ts → workspace/panels/mergedpanel.d.ts} +6 -5
  250. package/lib/workspace/panels/mergedpanel.js +166 -0
  251. package/lib/workspace/panels/rightpanel.d.ts +25 -0
  252. package/lib/{panelview → workspace/panels}/rightpanel.js +53 -63
  253. package/lib/{statusbar → workspace/statusbar}/StatusBar.js +5 -4
  254. package/lib/{toolbar → workspace/toolbar}/widget.d.ts +2 -0
  255. package/lib/{toolbar → workspace/toolbar}/widget.js +33 -5
  256. package/lib/{widget.d.ts → workspace/widget.d.ts} +7 -5
  257. package/lib/{widget.js → workspace/widget.js} +16 -7
  258. package/package.json +19 -4
  259. package/style/base.css +109 -1
  260. package/style/icons/geopackage.svg +95 -0
  261. package/style/icons/pencil_solid.svg +7 -0
  262. package/style/identify.css +95 -0
  263. package/style/layerBrowser.css +28 -0
  264. package/style/leftPanel.css +25 -0
  265. package/style/shared/button.css +12 -0
  266. package/style/shared/dropdownMenu.css +9 -0
  267. package/style/shared/nativeSelect.css +75 -0
  268. package/style/shared/tabs.css +3 -3
  269. package/style/spectaProgressBar.css +0 -1
  270. package/style/storyPanel.css +142 -9
  271. package/style/storySpectaArticleOverlay.css +129 -0
  272. package/style/symbologyDialog.css +330 -28
  273. package/lib/dialogs/symbology/colorRampUtils.d.ts +0 -20
  274. package/lib/dialogs/symbology/colorRampUtils.js +0 -132
  275. package/lib/dialogs/symbology/symbologyUtils.d.ts +0 -33
  276. package/lib/dialogs/symbology/symbologyUtils.js +0 -180
  277. package/lib/dialogs/symbology/tiff_layer/TiffRendering.d.ts +0 -4
  278. package/lib/dialogs/symbology/tiff_layer/TiffRendering.js +0 -42
  279. package/lib/dialogs/symbology/tiff_layer/components/BandRow.d.ts +0 -23
  280. package/lib/dialogs/symbology/tiff_layer/components/BandRow.js +0 -59
  281. package/lib/dialogs/symbology/tiff_layer/types/MultibandColor.d.ts +0 -4
  282. package/lib/dialogs/symbology/tiff_layer/types/MultibandColor.js +0 -92
  283. package/lib/dialogs/symbology/tiff_layer/types/SingleBandPseudoColor.d.ts +0 -5
  284. package/lib/dialogs/symbology/tiff_layer/types/SingleBandPseudoColor.js +0 -301
  285. package/lib/dialogs/symbology/vector_layer/VectorRendering.d.ts +0 -4
  286. package/lib/dialogs/symbology/vector_layer/VectorRendering.js +0 -112
  287. package/lib/dialogs/symbology/vector_layer/components/ValueSelect.d.ts +0 -8
  288. package/lib/dialogs/symbology/vector_layer/components/ValueSelect.js +0 -9
  289. package/lib/dialogs/symbology/vector_layer/types/Canonical.d.ts +0 -4
  290. package/lib/dialogs/symbology/vector_layer/types/Canonical.js +0 -65
  291. package/lib/dialogs/symbology/vector_layer/types/Categorized.d.ts +0 -4
  292. package/lib/dialogs/symbology/vector_layer/types/Categorized.js +0 -196
  293. package/lib/dialogs/symbology/vector_layer/types/Graduated.d.ts +0 -4
  294. package/lib/dialogs/symbology/vector_layer/types/Graduated.js +0 -250
  295. package/lib/dialogs/symbology/vector_layer/types/SimpleSymbol.d.ts +0 -4
  296. package/lib/dialogs/symbology/vector_layer/types/SimpleSymbol.js +0 -105
  297. package/lib/formbuilder/index.d.ts +0 -4
  298. package/lib/formbuilder/index.js +0 -4
  299. package/lib/formbuilder/objectform/layer/storySegmentLayerForm.js +0 -95
  300. package/lib/formbuilder/objectform/layer/webGlLayerForm.d.ts +0 -3
  301. package/lib/formbuilder/objectform/process/index.d.ts +0 -1
  302. package/lib/formbuilder/objectform/process/index.js +0 -1
  303. package/lib/panelview/components/legendItem.js +0 -200
  304. package/lib/panelview/identify-panel/IdentifyPanel.js +0 -102
  305. package/lib/panelview/leftpanel.js +0 -139
  306. package/lib/panelview/story-maps/StoryViewerPanel.js +0 -116
  307. package/lib/panelview/story-maps/components/SpectaDesktopView.js +0 -49
  308. package/lib/processing/index.js +0 -200
  309. package/lib/processing/processingCommands.js +0 -67
  310. /package/lib/{panelview/annotationPanel.d.ts → features/annotations/AnnotationsPanel.d.ts} +0 -0
  311. /package/lib/{annotations → features/annotations}/components/Annotation.d.ts +0 -0
  312. /package/lib/{annotations → features/annotations}/components/Annotation.js +0 -0
  313. /package/lib/{annotations → features/annotations}/components/AnnotationFloater.d.ts +0 -0
  314. /package/lib/{annotations → features/annotations}/components/AnnotationFloater.js +0 -0
  315. /package/lib/{annotations → features/annotations}/components/Message.d.ts +0 -0
  316. /package/lib/{annotations → features/annotations}/components/Message.js +0 -0
  317. /package/lib/{annotations → features/annotations}/model.d.ts +0 -0
  318. /package/lib/{annotations → features/annotations}/model.js +0 -0
  319. /package/lib/{console → features/console}/consoleview.d.ts +0 -0
  320. /package/lib/{console → features/console}/index.d.ts +0 -0
  321. /package/lib/{console → features/console}/index.js +0 -0
  322. /package/lib/{panelview/filter-panel → features/filter}/Filter.d.ts +0 -0
  323. /package/lib/{stacBrowser/types/types.js → features/identify/types/editorTypes.js} +0 -0
  324. /package/lib/{dialogs/layerBrowserDialog.d.ts → features/layer-browser/index.d.ts} +0 -0
  325. /package/lib/{formbuilder/objectform → features/layers/forms}/layer/heatmapLayerForm.d.ts +0 -0
  326. /package/lib/{formbuilder/objectform → features/layers/forms}/layer/hillshadeLayerForm.d.ts +0 -0
  327. /package/lib/{formbuilder/objectform → features/layers/forms}/layer/storySegmentLayerForm.d.ts +0 -0
  328. /package/lib/{formbuilder/objectform → features/layers/forms}/layer/vectorlayerform.d.ts +0 -0
  329. /package/lib/{formbuilder/objectform → features/layers/forms}/source/geojsonsource.d.ts +0 -0
  330. /package/lib/{formbuilder/objectform → features/layers/forms}/source/geotiffsource.d.ts +0 -0
  331. /package/lib/{formbuilder/objectform → features/layers/forms}/source/pathbasedsource.d.ts +0 -0
  332. /package/lib/{formbuilder/objectform → features/layers/forms}/source/tilesourceform.d.ts +0 -0
  333. /package/lib/{dialogs → features/layers}/symbology/components/color_ramp/ModeSelectRow.js +0 -0
  334. /package/lib/{dialogs → features/layers}/symbology/components/color_ramp/cmocean.json +0 -0
  335. /package/lib/{dialogs → features/layers}/symbology/components/color_stops/StopContainer.d.ts +0 -0
  336. /package/lib/{dialogs → features/layers}/symbology/hooks/useEffectiveSymbologyParams.d.ts +0 -0
  337. /package/lib/{dialogs → features/layers}/symbology/hooks/useEffectiveSymbologyParams.js +0 -0
  338. /package/lib/{dialogs → features/layers}/symbology/hooks/useGetProperties.d.ts +0 -0
  339. /package/lib/{dialogs → features/layers}/symbology/hooks/useGetSymbology.d.ts +0 -0
  340. /package/lib/{dialogs → features/layers}/symbology/hooks/useOkSignal.d.ts +0 -0
  341. /package/lib/{dialogs → features/layers}/symbology/hooks/useOkSignal.js +0 -0
  342. /package/lib/{formbuilder/objectform/process → features/processing/forms}/dissolveProcessForm.d.ts +0 -0
  343. /package/lib/{processing → features/processing}/processingFormToParam.d.ts +0 -0
  344. /package/lib/{processing → features/processing}/processingFormToParam.js +0 -0
  345. /package/lib/{stacBrowser → features/stac-browser}/components/StacPanel.d.ts +0 -0
  346. /package/lib/{stacBrowser → features/stac-browser}/components/filter-extension/QueryableComboBox.d.ts +0 -0
  347. /package/lib/{stacBrowser → features/stac-browser}/components/filter-extension/QueryableRow.d.ts +0 -0
  348. /package/lib/{stacBrowser → features/stac-browser}/components/filter-extension/StacFilterExtensionPanel.d.ts +0 -0
  349. /package/lib/{stacBrowser → features/stac-browser}/components/filter-extension/StacQueryableFilters.d.ts +0 -0
  350. /package/lib/{stacBrowser → features/stac-browser}/components/geodes/StacFilterSection.d.ts +0 -0
  351. /package/lib/{stacBrowser → features/stac-browser}/components/geodes/StacGeodesFilterPanel.d.ts +0 -0
  352. /package/lib/{stacBrowser → features/stac-browser}/components/geodes/StacGeodesFilterPanel.js +0 -0
  353. /package/lib/{stacBrowser → features/stac-browser}/components/shared/StacPanelResults.d.ts +0 -0
  354. /package/lib/{stacBrowser → features/stac-browser}/components/shared/StacSpatialExtent.d.ts +0 -0
  355. /package/lib/{stacBrowser → features/stac-browser}/components/shared/StacTemporalExtent.d.ts +0 -0
  356. /package/lib/{stacBrowser → features/stac-browser}/constants.d.ts +0 -0
  357. /package/lib/{stacBrowser → features/stac-browser}/constants.js +0 -0
  358. /package/lib/{stacBrowser → features/stac-browser}/context/StacResultsContext.d.ts +0 -0
  359. /package/lib/{stacBrowser → features/stac-browser}/hooks/useGeodesSearch.d.ts +0 -0
  360. /package/lib/{stacBrowser → features/stac-browser}/index.d.ts +0 -0
  361. /package/lib/{stacBrowser → features/stac-browser}/index.js +0 -0
  362. /package/lib/{stacBrowser → features/stac-browser}/types/types.d.ts +0 -0
  363. /package/lib/{panelview/story-maps → features/story}/StoryEditorPanel.d.ts +0 -0
  364. /package/lib/{panelview/story-maps → features/story}/components/PreviewModeSwitch.d.ts +0 -0
  365. /package/lib/{panelview/story-maps → features/story}/components/PreviewModeSwitch.js +0 -0
  366. /package/lib/{panelview/story-maps → features/story}/components/StoryContentSection.d.ts +0 -0
  367. /package/lib/{panelview/story-maps → features/story}/components/StoryContentSection.js +0 -0
  368. /package/lib/{panelview/story-maps → features/story}/components/StoryImageSection.d.ts +0 -0
  369. /package/lib/{panelview/story-maps → features/story}/components/StoryImageSection.js +0 -0
  370. /package/lib/{panelview/story-maps → features/story}/components/StoryNavBar.d.ts +0 -0
  371. /package/lib/{panelview/story-maps → features/story}/components/StoryNavBar.js +0 -0
  372. /package/lib/{panelview/story-maps → features/story}/components/StorySubtitleSection.d.ts +0 -0
  373. /package/lib/{panelview/story-maps → features/story}/components/StorySubtitleSection.js +0 -0
  374. /package/lib/{panelview/story-maps → features/story}/components/StoryTitleSection.d.ts +0 -0
  375. /package/lib/{panelview/story-maps → features/story}/components/StoryTitleSection.js +0 -0
  376. /package/lib/{formbuilder → shared/formbuilder}/creationform.d.ts +0 -0
  377. /package/lib/{formbuilder → shared/formbuilder}/editform.d.ts +0 -0
  378. /package/lib/{formbuilder → shared/formbuilder}/objectform/SchemaForm.js +0 -0
  379. /package/lib/{formbuilder → shared/formbuilder}/objectform/components/LayerSelect.d.ts +0 -0
  380. /package/lib/{formbuilder → shared/formbuilder}/objectform/components/OpacitySlider.d.ts +0 -0
  381. /package/lib/{formbuilder → shared/formbuilder}/objectform/components/OpacitySlider.js +0 -0
  382. /package/lib/{formbuilder → shared/formbuilder}/objectform/components/SegmentFormSymbology.d.ts +0 -0
  383. /package/lib/{formbuilder → shared/formbuilder}/objectform/components/SourcePropertiesField.d.ts +0 -0
  384. /package/lib/{formbuilder → shared/formbuilder}/objectform/components/StorySegmentReset.d.ts +0 -0
  385. /package/lib/{formbuilder → shared/formbuilder}/objectform/fileselectorwidget.d.ts +0 -0
  386. /package/lib/{store.d.ts → shared/store.d.ts} +0 -0
  387. /package/lib/{store.js → shared/store.js} +0 -0
  388. /package/lib/{menus.d.ts → workspace/menus.d.ts} +0 -0
  389. /package/lib/{panelview → workspace/panels}/components/layers.d.ts +0 -0
  390. /package/lib/{panelview → workspace/panels}/components/legendItem.d.ts +0 -0
  391. /package/lib/{panelview → workspace/panels}/header.d.ts +0 -0
  392. /package/lib/{panelview → workspace/panels}/header.js +0 -0
  393. /package/lib/{statusbar → workspace/statusbar}/SpectaPresentationProgressBar.d.ts +0 -0
  394. /package/lib/{statusbar → workspace/statusbar}/SpectaPresentationProgressBar.js +0 -0
  395. /package/lib/{statusbar → workspace/statusbar}/StatusBar.d.ts +0 -0
  396. /package/lib/{toolbar → workspace/toolbar}/index.d.ts +0 -0
  397. /package/lib/{toolbar → workspace/toolbar}/index.js +0 -0
@@ -4,24 +4,26 @@
4
4
  */
5
5
  // This file is based on iconimports.ts in @jupyterlab/ui-components, but is manually generated.
6
6
  import { LabIcon } from '@jupyterlab/ui-components';
7
- import bookOpenSvgStr from '../style/icons/book_open.svg';
8
- import clockSvgStr from '../style/icons/clock-solid.svg';
9
- import geoJsonSvgStr from '../style/icons/geojson.svg';
10
- import geolocationSvgStr from '../style/icons/geolocation.svg';
11
- import infoSvgStr from '../style/icons/info-solid.svg';
12
- import logoSvgStr from '../style/icons/logo.svg';
13
- import logoMiniSvgStr from '../style/icons/logo_mini.svg';
14
- import logoMiniAlternativeSvgStr from '../style/icons/logo_mini_alternative.svg';
15
- import logoMiniQGZ from '../style/icons/logo_mini_qgz.svg';
16
- import markerSvgStr from '../style/icons/marker.svg';
17
- import moundSvgStr from '../style/icons/mound.svg';
18
- import nonVisibilitySvgStr from '../style/icons/nonvisibility.svg';
19
- import rasterSvgStr from '../style/icons/raster.svg';
20
- import targetWithCenterSvgStr from '../style/icons/target_with_center.svg';
21
- import targetWithoutCenterSvgStr from '../style/icons/target_without_center.svg';
22
- import terminalToolbarSvgStr from '../style/icons/terminal_toolbar.svg';
23
- import vectorSquareSvgStr from '../style/icons/vector_square.svg';
24
- import visibilitySvgStr from '../style/icons/visibility.svg';
7
+ import bookOpenSvgStr from '../../style/icons/book_open.svg';
8
+ import clockSvgStr from '../../style/icons/clock-solid.svg';
9
+ import geoJsonSvgStr from '../../style/icons/geojson.svg';
10
+ import geolocationSvgStr from '../../style/icons/geolocation.svg';
11
+ import geoPackageSvgStr from '../../style/icons/geopackage.svg';
12
+ import infoSvgStr from '../../style/icons/info-solid.svg';
13
+ import logoSvgStr from '../../style/icons/logo.svg';
14
+ import logoMiniSvgStr from '../../style/icons/logo_mini.svg';
15
+ import logoMiniAlternativeSvgStr from '../../style/icons/logo_mini_alternative.svg';
16
+ import logoMiniQGZ from '../../style/icons/logo_mini_qgz.svg';
17
+ import markerSvgStr from '../../style/icons/marker.svg';
18
+ import moundSvgStr from '../../style/icons/mound.svg';
19
+ import nonVisibilitySvgStr from '../../style/icons/nonvisibility.svg';
20
+ import pencilSolidSvgStr from '../../style/icons/pencil_solid.svg';
21
+ import rasterSvgStr from '../../style/icons/raster.svg';
22
+ import targetWithCenterSvgStr from '../../style/icons/target_with_center.svg';
23
+ import targetWithoutCenterSvgStr from '../../style/icons/target_without_center.svg';
24
+ import terminalToolbarSvgStr from '../../style/icons/terminal_toolbar.svg';
25
+ import vectorSquareSvgStr from '../../style/icons/vector_square.svg';
26
+ import visibilitySvgStr from '../../style/icons/visibility.svg';
25
27
  export const logoIcon = new LabIcon({
26
28
  name: 'jupytergis::logo',
27
29
  svgstr: logoSvgStr,
@@ -90,7 +92,15 @@ export const targetWithCenterIcon = new LabIcon({
90
92
  name: 'jupytergis::targetWithoutCenter',
91
93
  svgstr: targetWithoutCenterSvgStr,
92
94
  });
95
+ export const geoPackageIcon = new LabIcon({
96
+ name: 'jupytergis::geoPackage',
97
+ svgstr: geoPackageSvgStr,
98
+ });
93
99
  export const markerIcon = new LabIcon({
94
100
  name: 'jupytergis::marker',
95
101
  svgstr: markerSvgStr,
96
102
  });
103
+ export const pencilSolidIcon = new LabIcon({
104
+ name: 'jupytergis::pencilSolid',
105
+ svgstr: pencilSolidSvgStr,
106
+ });
package/lib/tools.d.ts CHANGED
@@ -27,7 +27,7 @@ export declare function getLayerTileInfo(tileUrl: string, mapOptions: Pick<IJGIS
27
27
  export interface IParsedStyle {
28
28
  fillColor: string;
29
29
  strokeColor: string;
30
- strokeWidth: number;
30
+ strokeWidth: string;
31
31
  joinStyle: string;
32
32
  capStyle: string;
33
33
  radius?: number;
@@ -78,6 +78,7 @@ export declare const loadGeoTiff: (sourceInfo: {
78
78
  sourceUrl: string;
79
79
  metadata?: undefined;
80
80
  } | null>;
81
+ export declare function getGeoPackageTableNames(filepath: string, type: 'GeoPackageVectorSource' | 'GeoPackageRasterSource'): Promise<string[]>;
81
82
  /**
82
83
  * Generalized file reader for different source types.
83
84
  *
@@ -100,6 +101,7 @@ export declare const base64ToBlob: (base64: string, mimeType: string) => Promise
100
101
  /**
101
102
  * A mapping of file extensions to their corresponding MIME types.
102
103
  */
104
+ export declare const INTERNAL_PROXY_BASE = "/jupytergis_core/proxy";
103
105
  export declare const MIME_TYPES: {
104
106
  [ext: string]: string;
105
107
  };
package/lib/tools.js CHANGED
@@ -2,10 +2,14 @@ import { showErrorMessage } from '@jupyterlab/apputils';
2
2
  import { PathExt, URLExt } from '@jupyterlab/coreutils';
3
3
  import { ServerConnection } from '@jupyterlab/services';
4
4
  import { VectorTile } from '@mapbox/vector-tile';
5
+ import { GeoPackageAPI, GeoPackageTileRetriever } from '@ngageoint/geopackage';
5
6
  import { compressors } from 'hyparquet-compressors';
7
+ import loadGpkg from 'ol-load-geopackage';
6
8
  import Protobuf from 'pbf';
7
9
  import shp from 'shpjs';
8
- import LAYER_GALLERY from "../layer_gallery.json";
10
+ import LAYER_GALLERY from "../_generated/layer_gallery.json";
11
+ import { DEFAULT_STROKE_WIDTH } from "./features/layers/symbology/colorRampUtils";
12
+ import { getGdal } from './gdal';
9
13
  export const debounce = (func, timeout = 100) => {
10
14
  let timeoutId;
11
15
  return (...args) => {
@@ -122,7 +126,7 @@ export function createDefaultLayerRegistry(layerBrowserRegistry) {
122
126
  LAYER_THUMBNAILS[imageName] = r(key);
123
127
  });
124
128
  };
125
- const context = require.context('../layer_gallery', false, /\.(png|jpe?g|gif|svg)$/);
129
+ const context = require.context('../layer_gallery_thumbnails', false, /\.(png|jpe?g|gif|svg)$/);
126
130
  importAll(context);
127
131
  for (const entry of Object.keys(LAYER_GALLERY)) {
128
132
  const layerProvider = LAYER_GALLERY[entry];
@@ -219,7 +223,7 @@ export function parseColor(style) {
219
223
  radius: (_a = style['circle-radius']) !== null && _a !== void 0 ? _a : 5,
220
224
  fillColor: (_c = (_b = style['circle-fill-color']) !== null && _b !== void 0 ? _b : style['fill-color']) !== null && _c !== void 0 ? _c : '#3399CC',
221
225
  strokeColor: (_e = (_d = style['circle-stroke-color']) !== null && _d !== void 0 ? _d : style['stroke-color']) !== null && _e !== void 0 ? _e : '#3399CC',
222
- strokeWidth: (_g = (_f = style['circle-stroke-width']) !== null && _f !== void 0 ? _f : style['stroke-width']) !== null && _g !== void 0 ? _g : 1.25,
226
+ strokeWidth: String((_g = (_f = style['circle-stroke-width']) !== null && _f !== void 0 ? _f : style['stroke-width']) !== null && _g !== void 0 ? _g : DEFAULT_STROKE_WIDTH),
223
227
  joinStyle: (_j = (_h = style['circle-stroke-line-join']) !== null && _h !== void 0 ? _h : style['stroke-line-join']) !== null && _j !== void 0 ? _j : 'round',
224
228
  capStyle: (_l = (_k = style['circle-stroke-line-cap']) !== null && _k !== void 0 ? _k : style['stroke-line-cap']) !== null && _l !== void 0 ? _l : 'round',
225
229
  };
@@ -293,7 +297,7 @@ export const fetchWithProxies = async (url, model, parseResponse, options, strat
293
297
  const proxyUrl = settings && settings.proxyUrl ? settings.proxyUrl : 'https://corsproxy.io';
294
298
  const strategies = {
295
299
  direct: url => url,
296
- internal: url => `/jupytergis_core/proxy?url=${encodeURIComponent(url)}`,
300
+ internal: url => `${INTERNAL_PROXY_BASE}?url=${encodeURIComponent(url)}`,
297
301
  external: url => `${proxyUrl}/?url=${encodeURIComponent(url)}`,
298
302
  };
299
303
  const defaultOrder = ['direct', 'internal', 'external'];
@@ -353,6 +357,106 @@ export const loadGeoTiff = async (sourceInfo, model, file) => {
353
357
  sourceUrl: url,
354
358
  };
355
359
  };
360
+ const geoPackageCache = new Map();
361
+ /**
362
+ * Convert curved geometries to linear geometries for a given GeoPackage vector file, and reproject the data
363
+ *
364
+ * @param fileBlob GeoPackage file as a blob
365
+ * @returns Blob URL created from converted file
366
+ */
367
+ async function linearizeReprojectGpkg(fileBlob, projection) {
368
+ const gdal = await getGdal();
369
+ const file = new File([fileBlob], 'input.gpkg', {
370
+ type: 'application/geopackage+sqlite3',
371
+ });
372
+ const ds = await gdal.open(file);
373
+ await gdal.ogr2ogr(ds.datasets[0], ['-f', 'GPKG', '-nlt', 'CONVERT_TO_LINEAR', '-t_srs', projection], 'output');
374
+ const bytes = await gdal.getFileBytes('/output/output.gpkg');
375
+ const blob = new Blob([new Uint8Array(bytes)], {
376
+ type: 'application/geopackage+sqlite3',
377
+ });
378
+ const url = URL.createObjectURL(blob);
379
+ return url;
380
+ }
381
+ function loadGeoPackageVectorFile(fileBlob, projection, cacheFilename) {
382
+ if (geoPackageCache.has(cacheFilename)) {
383
+ return geoPackageCache.get(cacheFilename);
384
+ }
385
+ const loader = (async () => {
386
+ try {
387
+ const url = await linearizeReprojectGpkg(fileBlob, projection);
388
+ const [tables, slds] = await loadGpkg(url, projection);
389
+ const tableMap = {};
390
+ for (const name of Object.keys(tables)) {
391
+ tableMap[name] = {
392
+ source: tables[name],
393
+ sld: slds[name],
394
+ };
395
+ }
396
+ return tableMap;
397
+ }
398
+ catch (e) {
399
+ showErrorMessage('Failed to load GeoPackage file', e);
400
+ throw e;
401
+ }
402
+ })();
403
+ geoPackageCache.set(cacheFilename, loader);
404
+ return loader;
405
+ }
406
+ async function loadGeoPackageRasterFile(filepath, cacheFilename, model, file_content) {
407
+ if (geoPackageCache.has(cacheFilename)) {
408
+ return geoPackageCache.get(cacheFilename);
409
+ }
410
+ const loader = (async () => {
411
+ try {
412
+ let bytes;
413
+ if (filepath.startsWith('http://') || filepath.startsWith('https://')) {
414
+ bytes = await loadGkpgFromUrl(filepath, model);
415
+ }
416
+ else {
417
+ const arrayBuffer = await stringToArrayBuffer(file_content);
418
+ bytes = new Uint8Array(arrayBuffer);
419
+ }
420
+ const geoPackage = await GeoPackageAPI.open(bytes);
421
+ const tileTables = await geoPackage.getTileTables();
422
+ const tableMap = {};
423
+ tileTables.forEach(tableName => {
424
+ const tileDao = geoPackage.getTileDao(tableName);
425
+ const tileWidth = tileDao.tileMatrices[0].tile_width;
426
+ const tileHeight = tileDao.tileMatrices[0].tile_height;
427
+ tableMap[tableName] = {
428
+ gpr: new GeoPackageTileRetriever(tileDao, tileWidth, tileHeight),
429
+ tileDao,
430
+ };
431
+ });
432
+ return tableMap;
433
+ }
434
+ catch (error) {
435
+ showErrorMessage(`Failed to load GeoPackage file: ${cacheFilename}`, error);
436
+ throw error;
437
+ }
438
+ })();
439
+ geoPackageCache.set(cacheFilename, loader);
440
+ return loader;
441
+ }
442
+ async function loadGkpgFromUrl(filepath, model) {
443
+ const response = await fetchWithProxies(filepath, model, async (response) => {
444
+ const arrayBuffer = await response.arrayBuffer();
445
+ return new Uint8Array(arrayBuffer);
446
+ });
447
+ if (!response) {
448
+ throw new Error(`Failed to fetch GeoPackage from URL: ${filepath}`);
449
+ }
450
+ return response;
451
+ }
452
+ export async function getGeoPackageTableNames(filepath, type) {
453
+ const cacheKey = filepath + (type === 'GeoPackageRasterSource' ? 'Raster' : 'Vector');
454
+ const tableMap = await geoPackageCache.get(cacheKey);
455
+ if (!tableMap) {
456
+ return [];
457
+ }
458
+ return Object.keys(tableMap);
459
+ }
356
460
  /**
357
461
  * Generalized file reader for different source types.
358
462
  *
@@ -361,6 +465,9 @@ export const loadGeoTiff = async (sourceInfo, model, file) => {
361
465
  */
362
466
  export const loadFile = async (fileInfo) => {
363
467
  const { filepath, type, model } = fileInfo;
468
+ if (!filepath) {
469
+ return;
470
+ }
364
471
  if (filepath.startsWith('http://') || filepath.startsWith('https://')) {
365
472
  switch (type) {
366
473
  case 'ImageSource': {
@@ -411,6 +518,21 @@ export const loadFile = async (fileInfo) => {
411
518
  showErrorMessage('Network error', `Failed to fetch ${filepath}`);
412
519
  throw new Error(`Failed to fetch ${filepath}`);
413
520
  }
521
+ case 'GeoPackageVectorSource': {
522
+ const projection = model.sharedModel.options.projection;
523
+ if (!projection) {
524
+ throw new Error(`Projection is not specified for ${filepath}`);
525
+ }
526
+ const fileBlob = await fetchWithProxies(filepath, model, async (response) => response.blob());
527
+ if (!fileBlob) {
528
+ showErrorMessage('Network error', `Failed to fetch ${filepath}`);
529
+ throw new Error(`Failed to fetch ${filepath}`);
530
+ }
531
+ return loadGeoPackageVectorFile(fileBlob, projection, filepath + 'Vector');
532
+ }
533
+ case 'GeoPackageRasterSource': {
534
+ return loadGeoPackageRasterFile(filepath, filepath + 'Raster', model);
535
+ }
414
536
  case 'GeoParquetSource': {
415
537
  const cached = await getFromIndexedDB(filepath);
416
538
  if (cached) {
@@ -505,6 +627,17 @@ export const loadFile = async (fileInfo) => {
505
627
  throw new Error('Invalid file format for tiff content.');
506
628
  }
507
629
  }
630
+ case 'GeoPackageVectorSource': {
631
+ const projection = model.sharedModel.options.projection;
632
+ if (!projection) {
633
+ throw new Error(`Projection is not specified for ${filepath}`);
634
+ }
635
+ const blob = await base64ToBlob(file.content, getMimeType(filepath));
636
+ return loadGeoPackageVectorFile(blob, projection, filepath + 'Vector');
637
+ }
638
+ case 'GeoPackageRasterSource': {
639
+ return loadGeoPackageRasterFile(filepath, filepath + 'Raster', undefined, file.content);
640
+ }
508
641
  case 'GeoParquetSource': {
509
642
  let buffer;
510
643
  switch (file.format) {
@@ -562,6 +695,7 @@ export const base64ToBlob = async (base64, mimeType) => {
562
695
  /**
563
696
  * A mapping of file extensions to their corresponding MIME types.
564
697
  */
698
+ export const INTERNAL_PROXY_BASE = '/jupytergis_core/proxy';
565
699
  export const MIME_TYPES = {
566
700
  // from https://github.com/python/cpython/blob/3.9/Lib/mimetypes.py
567
701
  '.a': 'application/octet-stream',
@@ -590,6 +724,7 @@ export const MIME_TYPES = {
590
724
  '.etx': 'text/x-setext',
591
725
  '.exe': 'application/octet-stream',
592
726
  '.gif': 'image/gif',
727
+ '.gpkg': 'application/geopackage+vnd.sqlite3',
593
728
  '.gtar': 'application/x-gtar',
594
729
  '.h': 'text/plain',
595
730
  '.hdf': 'application/x-hdf',
@@ -767,8 +902,7 @@ export const getNumericFeatureAttributes = (featureProperties) => {
767
902
  */
768
903
  export const getColorCodeFeatureAttributes = (featureProperties) => {
769
904
  return getFeatureAttributes(featureProperties, (_, value) => {
770
- const regex = new RegExp('^#[0-9a-f]{6}$');
771
- return typeof value === 'string' && regex.test(value);
905
+ return typeof value === 'string' && /^#[0-9a-fA-F]{6}$/.test(value);
772
906
  });
773
907
  };
774
908
  export function downloadFile(content, fileName, mimeType) {
package/lib/types.d.ts CHANGED
@@ -13,7 +13,7 @@ type InternalRgbArray = number[];
13
13
  export type ColorValue = RgbColorValue | HexColorValue;
14
14
  export type SizeValue = number;
15
15
  export type SymbologyValue = SizeValue | ColorValue | InternalRgbArray;
16
- export type VectorRenderType = 'Single Symbol' | 'Canonical' | 'Graduated' | 'Categorized' | 'Heatmap';
16
+ export type VectorRenderType = 'Heatmap' | 'Grammar';
17
17
  /**
18
18
  * Add jupytergisMaps object to the global variables.
19
19
  */
@@ -30,10 +30,21 @@ declare global {
30
30
  declare const classificationModes: readonly ["quantile", "equal interval", "jenks", "pretty", "logarithmic", "continuous"];
31
31
  export type ClassificationMode = (typeof classificationModes)[number];
32
32
  export declare const SYMBOLOGY_VALID_LAYER_TYPES: string[];
33
+ export declare const STORY_TYPE: {
34
+ readonly guided: "guided";
35
+ readonly unguided: "unguided";
36
+ readonly verticalScroll: "Vertical Scroll";
37
+ };
38
+ export interface IWmsLayerInfo {
39
+ name: string;
40
+ title: string;
41
+ }
33
42
  /** Form context passed to SchemaForm and custom fields. */
34
43
  export interface IJupyterGISFormContext<TFormData = IDict | undefined> {
35
44
  model: IJupyterGISModel;
36
45
  formData: TFormData;
46
+ wmsAvailableLayers?: IWmsLayerInfo[];
47
+ setWmsAvailableLayers?: (layers: IWmsLayerInfo[]) => void;
37
48
  formSchemaRegistry?: IJGISFormSchemaRegistry;
38
49
  }
39
50
  /** Optional form state (schema, extraErrors). */
package/lib/types.js CHANGED
@@ -9,6 +9,11 @@ const classificationModes = [
9
9
  export const SYMBOLOGY_VALID_LAYER_TYPES = [
10
10
  'VectorLayer',
11
11
  'VectorTileLayer',
12
- 'WebGlLayer',
12
+ 'GeoTiffLayer',
13
13
  'HeatmapLayer',
14
14
  ];
15
+ export const STORY_TYPE = {
16
+ guided: 'guided',
17
+ unguided: 'unguided',
18
+ verticalScroll: 'Vertical Scroll',
19
+ };
@@ -1,6 +1,6 @@
1
1
  import { Menu } from '@lumino/widgets';
2
- import { CommandIDs } from './constants';
3
- import { rasterIcon } from './icons';
2
+ import { CommandIDs } from '../constants';
3
+ import { rasterIcon } from '../shared/icons';
4
4
  export const vectorSubMenu = (commands) => {
5
5
  const subMenu = new Menu({ commands });
6
6
  subMenu.title.label = 'Add Vector Layer';
@@ -22,6 +22,10 @@ export const vectorSubMenu = (commands) => {
22
22
  type: 'command',
23
23
  command: CommandIDs.openNewGeoParquetDialog,
24
24
  });
25
+ subMenu.addItem({
26
+ type: 'command',
27
+ command: CommandIDs.newGeoPackageVectorEntry,
28
+ });
25
29
  return subMenu;
26
30
  };
27
31
  export const rasterSubMenu = (commands) => {
@@ -33,6 +37,10 @@ export const rasterSubMenu = (commands) => {
33
37
  type: 'command',
34
38
  command: CommandIDs.openNewRasterDialog,
35
39
  });
40
+ subMenu.addItem({
41
+ type: 'command',
42
+ command: CommandIDs.openNewWmsDialog,
43
+ });
36
44
  subMenu.addItem({
37
45
  type: 'command',
38
46
  command: CommandIDs.openNewHillshadeDialog,
@@ -45,5 +53,9 @@ export const rasterSubMenu = (commands) => {
45
53
  type: 'command',
46
54
  command: CommandIDs.openNewGeoTiffDialog,
47
55
  });
56
+ subMenu.addItem({
57
+ type: 'command',
58
+ command: CommandIDs.newGeoPackageRasterEntry,
59
+ });
48
60
  return subMenu;
49
61
  };
@@ -0,0 +1,17 @@
1
+ import * as React from 'react';
2
+ export interface ITabConfig {
3
+ name: string;
4
+ title: string;
5
+ enabled: boolean;
6
+ contentClassName?: string;
7
+ content: React.ReactNode;
8
+ }
9
+ interface ITabbedPanelProps {
10
+ tabs: ITabConfig[];
11
+ curTab: string;
12
+ onTabClick: (name: string) => void;
13
+ onTabListMouseDown?: React.MouseEventHandler<HTMLDivElement>;
14
+ onTabListTouchStart?: React.TouchEventHandler<HTMLDivElement>;
15
+ }
16
+ export declare const TabbedPanel: React.FC<ITabbedPanelProps>;
17
+ export {};
@@ -0,0 +1,19 @@
1
+ import * as React from 'react';
2
+ import { TabsRoot, TabsContent, TabsList, TabsTrigger, } from '../../../shared/components/Tabs';
3
+ import { cn } from '../../../shared/components/utils';
4
+ export const TabbedPanel = ({ tabs, curTab, onTabClick, onTabListMouseDown, onTabListTouchStart, }) => {
5
+ const enabledTabs = tabs.filter(tab => tab.enabled);
6
+ const tabsListRef = React.useRef(null);
7
+ React.useEffect(() => {
8
+ const list = tabsListRef.current;
9
+ const active = list === null || list === void 0 ? void 0 : list.querySelector('[data-state="active"]');
10
+ if (list && active) {
11
+ const listCenter = list.offsetWidth / 2;
12
+ const triggerCenter = active.offsetLeft + active.offsetWidth / 2;
13
+ list.scrollLeft = triggerCenter - listCenter;
14
+ }
15
+ }, [curTab]);
16
+ return (React.createElement(TabsRoot, { className: "jgis-panel-tabs", curTab: curTab },
17
+ React.createElement(TabsList, { ref: tabsListRef, onMouseDown: onTabListMouseDown, onTouchStart: onTabListTouchStart }, enabledTabs.map(tab => (React.createElement(TabsTrigger, { className: "jGIS-layer-browser-category", key: tab.name, value: tab.name, onClick: () => onTabClick(tab.name) }, tab.title)))),
18
+ enabledTabs.map(tab => (React.createElement(TabsContent, { key: tab.name, value: tab.name, className: cn('jgis-panel-tab-content', tab.contentClassName) }, tab.content)))));
19
+ };
@@ -1,9 +1,22 @@
1
+ var __rest = (this && this.__rest) || function (s, e) {
2
+ var t = {};
3
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
4
+ t[p] = s[p];
5
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
6
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
7
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
8
+ t[p[i]] = s[p[i]];
9
+ }
10
+ return t;
11
+ };
12
+ import { faEllipsisVertical } from '@fortawesome/free-solid-svg-icons';
13
+ import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
1
14
  import { DOMUtils } from '@jupyterlab/apputils';
2
15
  import { Button, LabIcon, caretDownIcon, caretRightIcon, } from '@jupyterlab/ui-components';
3
16
  import React, { useEffect, useState, } from 'react';
4
- import { CommandIDs, icons } from "../../constants";
5
- import { useGetSymbology } from "../../dialogs/symbology/hooks/useGetSymbology";
6
- import { nonVisibilityIcon, targetWithCenterIcon, visibilityIcon, } from "../../icons";
17
+ import { CommandIDs, icons } from "../../../constants";
18
+ import { useGetSymbology } from "../../../features/layers/symbology/hooks/useGetSymbology";
19
+ import { nonVisibilityIcon, targetWithCenterIcon, visibilityIcon, } from "../../../shared/icons";
7
20
  import { LegendItem } from './legendItem';
8
21
  const LAYER_GROUP_CLASS = 'jp-gis-layerGroup';
9
22
  const LAYER_GROUP_HEADER_CLASS = 'jp-gis-layerGroupHeader';
@@ -21,6 +34,7 @@ export const LayersBodyComponent = props => {
21
34
  // Notify commands that need updating
22
35
  props.commands.notifyCommandChanged(CommandIDs.identify);
23
36
  props.commands.notifyCommandChanged(CommandIDs.temporalController);
37
+ props.commands.notifyCommandChanged(CommandIDs.toggleDrawFeatures);
24
38
  };
25
39
  const _onDragOver = (e) => {
26
40
  e.stopPropagation();
@@ -104,8 +118,14 @@ export const LayersBodyComponent = props => {
104
118
  };
105
119
  }
106
120
  else {
107
- // If types are the same add the selection - multi-selection
108
- newSelection = Object.assign(Object.assign({}, selectedValue), { [item]: { type } });
121
+ // If types are the same modify the selection (either add or remove to multi-selection)
122
+ if (item in selectedValue) {
123
+ const _a = selectedValue, _b = item, _ = _a[_b], rest = __rest(_a, [typeof _b === "symbol" ? _b : _b + ""]);
124
+ newSelection = rest;
125
+ }
126
+ else {
127
+ newSelection = Object.assign(Object.assign({}, selectedValue), { [item]: { type } });
128
+ }
109
129
  }
110
130
  }
111
131
  // Set the selection
@@ -157,13 +177,14 @@ const LayerGroupComponent = props => {
157
177
  * Listen to the changes on the current layer.
158
178
  */
159
179
  useEffect(() => {
160
- const onClientSharedStateChanged = () => {
180
+ const handleSelectedChanged = () => {
161
181
  // TODO Support follow mode and remoteUser state
162
182
  setSelected(isSelected(group.name, gisModel));
163
183
  };
164
- gisModel === null || gisModel === void 0 ? void 0 : gisModel.clientStateChanged.connect(onClientSharedStateChanged);
184
+ gisModel === null || gisModel === void 0 ? void 0 : gisModel.selectedChanged.connect(handleSelectedChanged);
185
+ handleSelectedChanged();
165
186
  return () => {
166
- gisModel === null || gisModel === void 0 ? void 0 : gisModel.clientStateChanged.disconnect(onClientSharedStateChanged);
187
+ gisModel === null || gisModel === void 0 ? void 0 : gisModel.selectedChanged.disconnect(handleSelectedChanged);
167
188
  };
168
189
  }, [gisModel, group.name]);
169
190
  /**
@@ -193,6 +214,21 @@ const LayerGroupComponent = props => {
193
214
  const handleRightClick = (event) => {
194
215
  onClick({ type: 'group', item: name, event });
195
216
  };
217
+ const handleGroupMoreClick = (e) => {
218
+ e.stopPropagation();
219
+ onClick({
220
+ type: 'group',
221
+ item: name,
222
+ event: e,
223
+ });
224
+ const rect = e.currentTarget.getBoundingClientRect();
225
+ e.currentTarget.dispatchEvent(new MouseEvent('contextmenu', {
226
+ bubbles: true,
227
+ cancelable: true,
228
+ clientX: rect.left,
229
+ clientY: rect.bottom,
230
+ }));
231
+ };
196
232
  const handleExpand = async () => {
197
233
  state.save(`jupytergis:${group.name}`, { expanded: !open });
198
234
  setOpen(!open);
@@ -228,7 +264,9 @@ const LayerGroupComponent = props => {
228
264
  padding: '2px 4px',
229
265
  fontSize: 'inherit',
230
266
  fontFamily: 'inherit',
231
- }, autoFocus: true })) : (React.createElement("span", { id: id, className: LAYER_TEXT_CLASS, tabIndex: -2 }, name))),
267
+ }, autoFocus: true })) : (React.createElement("span", { id: id, className: LAYER_TEXT_CLASS, tabIndex: -2 }, name)),
268
+ React.createElement(Button, { className: "jp-gis-layer-more-btn", minimal: true, onClick: handleGroupMoreClick, title: "More options" },
269
+ React.createElement(FontAwesomeIcon, { icon: faEllipsisVertical }))),
232
270
  open && (React.createElement("div", null, layers
233
271
  .slice()
234
272
  .reverse()
@@ -253,7 +291,7 @@ const LayerComponent = props => {
253
291
  const [selected, setSelected] = useState(
254
292
  // TODO Support multi-selection as `model?.jGISModel?.localState?.selected.value` does
255
293
  isSelected(layerId, gisModel));
256
- const [expanded, setExpanded] = useState(false);
294
+ const [expanded, setExpanded] = useState(true);
257
295
  const [isEditing, setIsEditing] = useState(false);
258
296
  const [editValue, setEditValue] = useState('');
259
297
  const { symbology } = useGetSymbology({
@@ -270,13 +308,14 @@ const LayerComponent = props => {
270
308
  * Listen to the changes on the current layer.
271
309
  */
272
310
  useEffect(() => {
273
- const onClientSharedStateChanged = (sender, clients) => {
311
+ const handleSelectedChanged = () => {
274
312
  // TODO Support follow mode and remoteUser state
275
313
  setSelected(isSelected(layerId, gisModel));
276
314
  };
277
- gisModel === null || gisModel === void 0 ? void 0 : gisModel.clientStateChanged.connect(onClientSharedStateChanged);
315
+ gisModel === null || gisModel === void 0 ? void 0 : gisModel.selectedChanged.connect(handleSelectedChanged);
316
+ handleSelectedChanged();
278
317
  return () => {
279
- gisModel === null || gisModel === void 0 ? void 0 : gisModel.clientStateChanged.disconnect(onClientSharedStateChanged);
318
+ gisModel === null || gisModel === void 0 ? void 0 : gisModel.selectedChanged.disconnect(handleSelectedChanged);
280
319
  };
281
320
  }, [gisModel, layerId]);
282
321
  /**
@@ -318,6 +357,21 @@ const LayerComponent = props => {
318
357
  event,
319
358
  });
320
359
  };
360
+ const handleLayerMoreClick = (e) => {
361
+ e.stopPropagation();
362
+ onClick({
363
+ type: 'layer',
364
+ item: layerId,
365
+ event: e,
366
+ });
367
+ const rect = e.currentTarget.getBoundingClientRect();
368
+ e.currentTarget.dispatchEvent(new MouseEvent('contextmenu', {
369
+ bubbles: true,
370
+ cancelable: true,
371
+ clientX: rect.left,
372
+ clientY: rect.bottom,
373
+ }));
374
+ };
321
375
  const handleRenameSave = () => {
322
376
  const newName = editValue.trim();
323
377
  if (newName && newName !== name && gisModel) {
@@ -366,11 +420,17 @@ const LayerComponent = props => {
366
420
  ${isStorySegmentLayer ? 'jp-gis-storySegmentLayer' : ''}
367
421
  ${selected ? ' jp-mod-selected' : ''}`, draggable: true, onDragStart: Private.onDragStart, onDragOver: Private.onDragOver, onDragEnd: Private.onDragEnd, "data-id": layerId, style: { display: 'flex', flexDirection: 'column' } },
368
422
  React.createElement("div", { className: LAYER_TITLE_CLASS, onClick: setSelection, onContextMenu: setSelection, style: { display: 'flex' } },
369
- hasSupportedSymbology && (React.createElement(Button, { minimal: true, onClick: e => {
370
- e.stopPropagation();
371
- setExpanded(v => !v);
372
- }, title: expanded ? 'Hide legend' : 'Show legend' },
373
- React.createElement(LabIcon.resolveReact, { icon: expanded ? caretDownIcon : caretRightIcon, tag: "span" }))),
423
+ React.createElement(Button, { minimal: true, onClick: hasSupportedSymbology
424
+ ? e => {
425
+ e.stopPropagation();
426
+ setExpanded(v => !v);
427
+ }
428
+ : undefined, title: hasSupportedSymbology
429
+ ? expanded
430
+ ? 'Hide legend'
431
+ : 'Show legend'
432
+ : undefined, style: { visibility: hasSupportedSymbology ? 'visible' : 'hidden' } },
433
+ React.createElement(LabIcon.resolveReact, { icon: expanded ? caretDownIcon : caretRightIcon, tag: "span" })),
374
434
  isStorySegmentLayer ? (React.createElement("span", { className: LAYER_SLIDE_NUMBER_CLASS, title: "Slide number" }, getSlideNumber())) : (React.createElement(Button, { title: layer.visible ? 'Hide layer' : 'Show layer', onClick: toggleVisibility, minimal: true },
375
435
  React.createElement(LabIcon.resolveReact, { icon: layer.visible ? visibilityIcon : nonVisibilityIcon, className: `${LAYER_ICON_CLASS}${layer.visible ? '' : ' jp-gis-mod-hidden'}`, tag: "span" }))),
376
436
  icons.has(layer.type) && (React.createElement(LabIcon.resolveReact, Object.assign({}, icons.get(layer.type), { className: LAYER_ICON_CLASS }))),
@@ -383,8 +443,10 @@ const LayerComponent = props => {
383
443
  fontFamily: 'inherit',
384
444
  }, autoFocus: true })) : (React.createElement("span", { id: id, className: LAYER_TEXT_CLASS, tabIndex: -2, onDoubleClick: handleDoubleClick, title: "Double-click to zoom to layer" }, name)),
385
445
  React.createElement(Button, { title: 'Move map to the extent of the layer', onClick: moveToExtent, minimal: true },
386
- React.createElement(LabIcon.resolveReact, { icon: targetWithCenterIcon, className: LAYER_ICON_CLASS, tag: "span" }))),
387
- expanded && gisModel && hasSupportedSymbology && (React.createElement("div", { style: { marginTop: 6, width: '100%' } },
446
+ React.createElement(LabIcon.resolveReact, { icon: targetWithCenterIcon, className: LAYER_ICON_CLASS, tag: "span" })),
447
+ React.createElement(Button, { className: "jp-gis-layer-more-btn", minimal: true, onClick: handleLayerMoreClick, title: "More options" },
448
+ React.createElement(FontAwesomeIcon, { icon: faEllipsisVertical }))),
449
+ expanded && gisModel && hasSupportedSymbology && (React.createElement("div", { style: { marginTop: 6, width: '100%' }, onClick: setSelection },
388
450
  React.createElement(LegendItem, { layerId: layerId, model: gisModel })))));
389
451
  };
390
452
  var Private;