@jupytergis/base 0.2.1 → 0.4.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 (95) hide show
  1. package/lib/annotations/components/Annotation.js +2 -2
  2. package/lib/annotations/model.d.ts +6 -7
  3. package/lib/annotations/model.js +15 -15
  4. package/lib/commands.d.ts +2 -3
  5. package/lib/commands.js +146 -62
  6. package/lib/constants.d.ts +3 -0
  7. package/lib/constants.js +5 -1
  8. package/lib/dialogs/formdialog.d.ts +5 -0
  9. package/lib/dialogs/formdialog.js +2 -2
  10. package/lib/dialogs/layerBrowserDialog.d.ts +4 -5
  11. package/lib/dialogs/layerBrowserDialog.js +9 -9
  12. package/lib/dialogs/symbology/components/color_ramp/ModeSelectRow.js +2 -1
  13. package/lib/dialogs/symbology/hooks/useGetBandInfo.d.ts +26 -0
  14. package/lib/dialogs/symbology/hooks/useGetBandInfo.js +64 -0
  15. package/lib/dialogs/symbology/hooks/useGetProperties.d.ts +1 -1
  16. package/lib/dialogs/symbology/hooks/useGetProperties.js +12 -9
  17. package/lib/dialogs/symbology/symbologyDialog.d.ts +2 -3
  18. package/lib/dialogs/symbology/symbologyDialog.js +10 -9
  19. package/lib/dialogs/symbology/tiff_layer/TiffRendering.d.ts +1 -1
  20. package/lib/dialogs/symbology/tiff_layer/TiffRendering.js +16 -3
  21. package/lib/dialogs/symbology/tiff_layer/components/BandRow.d.ts +16 -3
  22. package/lib/dialogs/symbology/tiff_layer/components/BandRow.js +21 -7
  23. package/lib/dialogs/symbology/tiff_layer/types/MultibandColor.d.ts +4 -0
  24. package/lib/dialogs/symbology/tiff_layer/types/MultibandColor.js +85 -0
  25. package/lib/dialogs/symbology/tiff_layer/types/SingleBandPseudoColor.d.ts +1 -20
  26. package/lib/dialogs/symbology/tiff_layer/types/SingleBandPseudoColor.js +25 -65
  27. package/lib/dialogs/symbology/vector_layer/VectorRendering.d.ts +1 -1
  28. package/lib/dialogs/symbology/vector_layer/VectorRendering.js +18 -13
  29. package/lib/dialogs/symbology/vector_layer/types/Categorized.d.ts +1 -1
  30. package/lib/dialogs/symbology/vector_layer/types/Categorized.js +30 -19
  31. package/lib/dialogs/symbology/vector_layer/types/Graduated.d.ts +1 -1
  32. package/lib/dialogs/symbology/vector_layer/types/Graduated.js +16 -13
  33. package/lib/dialogs/symbology/vector_layer/types/Heatmap.d.ts +4 -0
  34. package/lib/dialogs/symbology/vector_layer/types/Heatmap.js +77 -0
  35. package/lib/dialogs/symbology/vector_layer/types/SimpleSymbol.d.ts +1 -1
  36. package/lib/dialogs/symbology/vector_layer/types/SimpleSymbol.js +4 -3
  37. package/lib/formbuilder/creationform.d.ts +6 -2
  38. package/lib/formbuilder/creationform.js +6 -6
  39. package/lib/formbuilder/editform.d.ts +2 -2
  40. package/lib/formbuilder/editform.js +14 -9
  41. package/lib/formbuilder/formselectors.js +11 -1
  42. package/lib/formbuilder/objectform/baseform.d.ts +12 -3
  43. package/lib/formbuilder/objectform/baseform.js +39 -0
  44. package/lib/formbuilder/objectform/fileselectorwidget.d.ts +2 -0
  45. package/lib/formbuilder/objectform/fileselectorwidget.js +88 -0
  46. package/lib/formbuilder/objectform/geojsonsource.d.ts +5 -7
  47. package/lib/formbuilder/objectform/geojsonsource.js +8 -24
  48. package/lib/formbuilder/objectform/geotiffsource.d.ts +5 -1
  49. package/lib/formbuilder/objectform/geotiffsource.js +64 -18
  50. package/lib/formbuilder/objectform/heatmapLayerForm.d.ts +11 -0
  51. package/lib/formbuilder/objectform/heatmapLayerForm.js +60 -0
  52. package/lib/formbuilder/objectform/layerform.d.ts +2 -0
  53. package/lib/formbuilder/objectform/layerform.js +6 -0
  54. package/lib/formbuilder/objectform/pathbasedsource.d.ts +19 -0
  55. package/lib/formbuilder/objectform/pathbasedsource.js +98 -0
  56. package/lib/formbuilder/objectform/vectorlayerform.d.ts +0 -2
  57. package/lib/formbuilder/objectform/vectorlayerform.js +0 -59
  58. package/lib/icons.d.ts +1 -0
  59. package/lib/icons.js +5 -0
  60. package/lib/keybindings.json +62 -0
  61. package/lib/mainview/TemporalSlider.d.ts +8 -0
  62. package/lib/mainview/TemporalSlider.js +303 -0
  63. package/lib/mainview/mainView.d.ts +46 -8
  64. package/lib/mainview/mainView.js +431 -144
  65. package/lib/mainview/mainviewmodel.d.ts +4 -0
  66. package/lib/mainview/mainviewmodel.js +4 -0
  67. package/lib/mainview/mainviewwidget.d.ts +0 -2
  68. package/lib/mainview/mainviewwidget.js +0 -2
  69. package/lib/panelview/annotationPanel.js +5 -5
  70. package/lib/panelview/components/filter-panel/Filter.js +8 -24
  71. package/lib/panelview/components/identify-panel/IdentifyPanel.js +1 -1
  72. package/lib/panelview/components/layers.js +2 -2
  73. package/lib/panelview/components/sources.js +1 -1
  74. package/lib/panelview/leftpanel.d.ts +3 -0
  75. package/lib/panelview/leftpanel.js +5 -1
  76. package/lib/panelview/model.js +8 -8
  77. package/lib/panelview/objectproperties.js +10 -10
  78. package/lib/panelview/rightpanel.d.ts +1 -1
  79. package/lib/panelview/rightpanel.js +10 -10
  80. package/lib/statusbar/StatusBar.d.ts +13 -0
  81. package/lib/statusbar/StatusBar.js +52 -0
  82. package/lib/toolbar/widget.d.ts +1 -1
  83. package/lib/toolbar/widget.js +44 -37
  84. package/lib/tools.d.ts +50 -7
  85. package/lib/tools.js +394 -12
  86. package/lib/types.d.ts +2 -0
  87. package/lib/widget.d.ts +29 -5
  88. package/lib/widget.js +41 -7
  89. package/package.json +17 -5
  90. package/style/base.css +11 -0
  91. package/style/icons/logo_mini_qgz.svg +31 -0
  92. package/style/leftPanel.css +8 -0
  93. package/style/statusBar.css +16 -0
  94. package/style/symbologyDialog.css +7 -1
  95. package/style/temporalSlider.css +47 -0
package/lib/commands.js CHANGED
@@ -3,6 +3,17 @@ import { CommandIDs, icons } from './constants';
3
3
  import { CreationFormDialog } from './dialogs/formdialog';
4
4
  import { LayerBrowserWidget } from './dialogs/layerBrowserDialog';
5
5
  import { SymbologyWidget } from './dialogs/symbology/symbologyDialog';
6
+ import keybindings from './keybindings.json';
7
+ import { JupyterGISDocumentWidget } from './widget';
8
+ function loadKeybindings(commands, keybindings) {
9
+ keybindings.forEach(binding => {
10
+ commands.addKeyBinding({
11
+ command: binding.command,
12
+ keys: binding.keys,
13
+ selector: binding.selector
14
+ });
15
+ });
16
+ }
6
17
  /**
7
18
  * Add the commands to the application's command registry.
8
19
  */
@@ -12,7 +23,7 @@ export function addCommands(app, tracker, translator, formSchemaRegistry, layerB
12
23
  const { commands } = app;
13
24
  commands.addCommand(CommandIDs.symbology, Object.assign({ label: trans.__('Edit Symbology'), isEnabled: () => {
14
25
  var _a, _b;
15
- const model = (_a = tracker.currentWidget) === null || _a === void 0 ? void 0 : _a.context.model;
26
+ const model = (_a = tracker.currentWidget) === null || _a === void 0 ? void 0 : _a.model;
16
27
  const localState = model === null || model === void 0 ? void 0 : model.sharedModel.awareness.getLocalState();
17
28
  if (!model || !localState || !((_b = localState['selected']) === null || _b === void 0 ? void 0 : _b.value)) {
18
29
  return false;
@@ -30,36 +41,37 @@ export function addCommands(app, tracker, translator, formSchemaRegistry, layerB
30
41
  const isValidLayer = [
31
42
  'VectorLayer',
32
43
  'VectorTileLayer',
33
- 'WebGlLayer'
44
+ 'WebGlLayer',
45
+ 'HeatmapLayer'
34
46
  ].includes(layer.type);
35
47
  return isValidLayer;
36
48
  }, execute: Private.createSymbologyDialog(tracker, state) }, icons.get(CommandIDs.symbology)));
37
49
  commands.addCommand(CommandIDs.redo, Object.assign({ label: trans.__('Redo'), isEnabled: () => {
38
50
  return tracker.currentWidget
39
- ? tracker.currentWidget.context.model.sharedModel.editable
51
+ ? tracker.currentWidget.model.sharedModel.editable
40
52
  : false;
41
53
  }, execute: () => {
42
54
  const current = tracker.currentWidget;
43
55
  if (current) {
44
- return current.context.model.sharedModel.redo();
56
+ return current.model.sharedModel.redo();
45
57
  }
46
58
  } }, (_a = icons.get(CommandIDs.redo)) === null || _a === void 0 ? void 0 : _a.icon));
47
59
  commands.addCommand(CommandIDs.undo, Object.assign({ label: trans.__('Undo'), isEnabled: () => {
48
60
  return tracker.currentWidget
49
- ? tracker.currentWidget.context.model.sharedModel.editable
61
+ ? tracker.currentWidget.model.sharedModel.editable
50
62
  : false;
51
63
  }, execute: () => {
52
64
  const current = tracker.currentWidget;
53
65
  if (current) {
54
- return current.context.model.sharedModel.undo();
66
+ return current.model.sharedModel.undo();
55
67
  }
56
68
  } }, icons.get(CommandIDs.undo)));
57
69
  commands.addCommand(CommandIDs.identify, Object.assign({ label: trans.__('Identify'), isToggled: () => {
58
70
  var _a;
59
- return ((_a = tracker.currentWidget) === null || _a === void 0 ? void 0 : _a.context.model.isIdentifying) || false;
71
+ return ((_a = tracker.currentWidget) === null || _a === void 0 ? void 0 : _a.model.isIdentifying) || false;
60
72
  }, isEnabled: () => {
61
73
  return tracker.currentWidget
62
- ? tracker.currentWidget.context.model.sharedModel.editable
74
+ ? tracker.currentWidget.model.sharedModel.editable
63
75
  : false;
64
76
  }, execute: args => {
65
77
  const current = tracker.currentWidget;
@@ -70,22 +82,58 @@ export function addCommands(app, tracker, translator, formSchemaRegistry, layerB
70
82
  if (luminoEvent) {
71
83
  const keysPressed = luminoEvent.keys;
72
84
  if (keysPressed === null || keysPressed === void 0 ? void 0 : keysPressed.includes('Escape')) {
73
- current.context.model.isIdentifying = false;
85
+ current.model.isIdentifying = false;
74
86
  current.node.classList.remove('jGIS-identify-tool');
75
87
  commands.notifyCommandChanged(CommandIDs.identify);
76
88
  return;
77
89
  }
78
90
  }
79
91
  current.node.classList.toggle('jGIS-identify-tool');
80
- current.context.model.toggleIdentify();
92
+ current.model.toggleIdentify();
81
93
  commands.notifyCommandChanged(CommandIDs.identify);
82
94
  } }, icons.get(CommandIDs.identify)));
95
+ commands.addCommand(CommandIDs.temporalController, Object.assign({ label: trans.__('Temporal Controller'), isToggled: () => {
96
+ var _a;
97
+ return ((_a = tracker.currentWidget) === null || _a === void 0 ? void 0 : _a.model.isTemporalControllerActive) || false;
98
+ }, isEnabled: () => {
99
+ var _a, _b, _c, _d;
100
+ const model = (_a = tracker.currentWidget) === null || _a === void 0 ? void 0 : _a.model;
101
+ if (!model) {
102
+ return false;
103
+ }
104
+ const selectedLayers = (_c = (_b = model.localState) === null || _b === void 0 ? void 0 : _b.selected) === null || _c === void 0 ? void 0 : _c.value;
105
+ if (!selectedLayers) {
106
+ return false;
107
+ }
108
+ const layerId = Object.keys(selectedLayers)[0];
109
+ const layerType = (_d = model.getLayer(layerId)) === null || _d === void 0 ? void 0 : _d.type;
110
+ if (!layerType) {
111
+ return false;
112
+ }
113
+ // Selection should only be one vector or heatmap layer
114
+ const isSelectionValid = Object.keys(selectedLayers).length === 1 &&
115
+ !model.getSource(layerId) &&
116
+ ['VectorLayer', 'HeatmapLayer'].includes(layerType);
117
+ if (!isSelectionValid && model.isTemporalControllerActive) {
118
+ model.toggleTemporalController();
119
+ commands.notifyCommandChanged(CommandIDs.temporalController);
120
+ return false;
121
+ }
122
+ return true;
123
+ }, execute: () => {
124
+ const current = tracker.currentWidget;
125
+ if (!current) {
126
+ return;
127
+ }
128
+ current.model.toggleTemporalController();
129
+ commands.notifyCommandChanged(CommandIDs.temporalController);
130
+ } }, icons.get(CommandIDs.temporalController)));
83
131
  /**
84
132
  * SOURCES and LAYERS creation commands.
85
133
  */
86
134
  commands.addCommand(CommandIDs.openLayerBrowser, Object.assign({ label: trans.__('Open Layer Browser'), isEnabled: () => {
87
135
  return tracker.currentWidget
88
- ? tracker.currentWidget.context.model.sharedModel.editable
136
+ ? tracker.currentWidget.model.sharedModel.editable
89
137
  : false;
90
138
  }, execute: Private.createLayerBrowser(tracker, layerBrowserRegistry, formSchemaRegistry) }, icons.get(CommandIDs.openLayerBrowser)));
91
139
  /**
@@ -93,7 +141,7 @@ export function addCommands(app, tracker, translator, formSchemaRegistry, layerB
93
141
  */
94
142
  commands.addCommand(CommandIDs.newRasterEntry, Object.assign({ label: trans.__('New Raster Layer'), isEnabled: () => {
95
143
  return tracker.currentWidget
96
- ? tracker.currentWidget.context.model.sharedModel.editable
144
+ ? tracker.currentWidget.model.sharedModel.editable
97
145
  : false;
98
146
  }, execute: Private.createEntry({
99
147
  tracker,
@@ -111,7 +159,7 @@ export function addCommands(app, tracker, translator, formSchemaRegistry, layerB
111
159
  }) }, icons.get(CommandIDs.newRasterEntry)));
112
160
  commands.addCommand(CommandIDs.newVectorTileEntry, Object.assign({ label: trans.__('New Vector Tile Layer'), isEnabled: () => {
113
161
  return tracker.currentWidget
114
- ? tracker.currentWidget.context.model.sharedModel.editable
162
+ ? tracker.currentWidget.model.sharedModel.editable
115
163
  : false;
116
164
  }, execute: Private.createEntry({
117
165
  tracker,
@@ -126,7 +174,7 @@ export function addCommands(app, tracker, translator, formSchemaRegistry, layerB
126
174
  }) }, icons.get(CommandIDs.newVectorTileEntry)));
127
175
  commands.addCommand(CommandIDs.newGeoJSONEntry, Object.assign({ label: trans.__('New GeoJSON layer'), isEnabled: () => {
128
176
  return tracker.currentWidget
129
- ? tracker.currentWidget.context.model.sharedModel.editable
177
+ ? tracker.currentWidget.model.sharedModel.editable
130
178
  : false;
131
179
  }, execute: Private.createEntry({
132
180
  tracker,
@@ -140,7 +188,7 @@ export function addCommands(app, tracker, translator, formSchemaRegistry, layerB
140
188
  }) }, icons.get(CommandIDs.newGeoJSONEntry)));
141
189
  commands.addCommand(CommandIDs.newHillshadeEntry, Object.assign({ label: trans.__('New Hillshade layer'), isEnabled: () => {
142
190
  return tracker.currentWidget
143
- ? tracker.currentWidget.context.model.sharedModel.editable
191
+ ? tracker.currentWidget.model.sharedModel.editable
144
192
  : false;
145
193
  }, execute: Private.createEntry({
146
194
  tracker,
@@ -154,7 +202,7 @@ export function addCommands(app, tracker, translator, formSchemaRegistry, layerB
154
202
  }) }, icons.get(CommandIDs.newHillshadeEntry)));
155
203
  commands.addCommand(CommandIDs.newImageEntry, Object.assign({ label: trans.__('New Image layer'), isEnabled: () => {
156
204
  return tracker.currentWidget
157
- ? tracker.currentWidget.context.model.sharedModel.editable
205
+ ? tracker.currentWidget.model.sharedModel.editable
158
206
  : false;
159
207
  }, execute: Private.createEntry({
160
208
  tracker,
@@ -164,7 +212,7 @@ export function addCommands(app, tracker, translator, formSchemaRegistry, layerB
164
212
  createSource: true,
165
213
  sourceData: {
166
214
  name: 'Custom Image Source',
167
- url: 'https://maplibre.org/maplibre-gl-js/docs/assets/radar.gif',
215
+ path: 'https://maplibre.org/maplibre-gl-js/docs/assets/radar.gif',
168
216
  coordinates: [
169
217
  [-80.425, 46.437],
170
218
  [-71.516, 46.437],
@@ -178,7 +226,7 @@ export function addCommands(app, tracker, translator, formSchemaRegistry, layerB
178
226
  }) }, icons.get(CommandIDs.newImageEntry)));
179
227
  commands.addCommand(CommandIDs.newVideoEntry, Object.assign({ label: trans.__('New Video layer'), isEnabled: () => {
180
228
  return tracker.currentWidget
181
- ? tracker.currentWidget.context.model.sharedModel.editable
229
+ ? tracker.currentWidget.model.sharedModel.editable
182
230
  : false;
183
231
  }, execute: Private.createEntry({
184
232
  tracker,
@@ -207,7 +255,7 @@ export function addCommands(app, tracker, translator, formSchemaRegistry, layerB
207
255
  ? trans.__('Shapefile')
208
256
  : trans.__('Add Shapefile Source'), isEnabled: () => {
209
257
  return tracker.currentWidget
210
- ? tracker.currentWidget.context.model.sharedModel.editable
258
+ ? tracker.currentWidget.model.sharedModel.editable
211
259
  : false;
212
260
  }, execute: Private.createEntry({
213
261
  tracker,
@@ -220,7 +268,7 @@ export function addCommands(app, tracker, translator, formSchemaRegistry, layerB
220
268
  }) }, icons.get(CommandIDs.newShapefileSource)));
221
269
  commands.addCommand(CommandIDs.newGeoTiffEntry, Object.assign({ label: trans.__('New GeoTiff layer'), isEnabled: () => {
222
270
  return tracker.currentWidget
223
- ? tracker.currentWidget.context.model.sharedModel.editable
271
+ ? tracker.currentWidget.model.sharedModel.editable
224
272
  : false;
225
273
  }, execute: Private.createEntry({
226
274
  tracker,
@@ -243,7 +291,7 @@ export function addCommands(app, tracker, translator, formSchemaRegistry, layerB
243
291
  ? trans.__('Raster')
244
292
  : trans.__('New Raster Source'), isEnabled: () => {
245
293
  return tracker.currentWidget
246
- ? tracker.currentWidget.context.model.sharedModel.editable
294
+ ? tracker.currentWidget.model.sharedModel.editable
247
295
  : false;
248
296
  }, execute: Private.createEntry({
249
297
  tracker,
@@ -258,7 +306,7 @@ export function addCommands(app, tracker, translator, formSchemaRegistry, layerB
258
306
  ? trans.__('Raster DEM')
259
307
  : trans.__('New Raster DEM Source'), isEnabled: () => {
260
308
  return tracker.currentWidget
261
- ? tracker.currentWidget.context.model.sharedModel.editable
309
+ ? tracker.currentWidget.model.sharedModel.editable
262
310
  : false;
263
311
  }, execute: Private.createEntry({
264
312
  tracker,
@@ -273,7 +321,7 @@ export function addCommands(app, tracker, translator, formSchemaRegistry, layerB
273
321
  ? trans.__('Vector')
274
322
  : trans.__('New Vector Source'), isEnabled: () => {
275
323
  return tracker.currentWidget
276
- ? tracker.currentWidget.context.model.sharedModel.editable
324
+ ? tracker.currentWidget.model.sharedModel.editable
277
325
  : false;
278
326
  }, execute: Private.createEntry({
279
327
  tracker,
@@ -288,7 +336,7 @@ export function addCommands(app, tracker, translator, formSchemaRegistry, layerB
288
336
  ? trans.__('GeoJSON')
289
337
  : trans.__('Add GeoJSON data from file'), isEnabled: () => {
290
338
  return tracker.currentWidget
291
- ? tracker.currentWidget.context.model.sharedModel.editable
339
+ ? tracker.currentWidget.model.sharedModel.editable
292
340
  : false;
293
341
  }, execute: Private.createEntry({
294
342
  tracker,
@@ -303,7 +351,7 @@ export function addCommands(app, tracker, translator, formSchemaRegistry, layerB
303
351
  ? trans.__('Image')
304
352
  : trans.__('Add Image Source'), isEnabled: () => {
305
353
  return tracker.currentWidget
306
- ? tracker.currentWidget.context.model.sharedModel.editable
354
+ ? tracker.currentWidget.model.sharedModel.editable
307
355
  : false;
308
356
  }, execute: Private.createEntry({
309
357
  tracker,
@@ -318,7 +366,7 @@ export function addCommands(app, tracker, translator, formSchemaRegistry, layerB
318
366
  ? trans.__('Video')
319
367
  : trans.__('Add Video Source'), isEnabled: () => {
320
368
  return tracker.currentWidget
321
- ? tracker.currentWidget.context.model.sharedModel.editable
369
+ ? tracker.currentWidget.model.sharedModel.editable
322
370
  : false;
323
371
  }, execute: Private.createEntry({
324
372
  tracker,
@@ -334,7 +382,7 @@ export function addCommands(app, tracker, translator, formSchemaRegistry, layerB
334
382
  ? trans.__('Raster')
335
383
  : trans.__('Add Raster layer'), isEnabled: () => {
336
384
  return tracker.currentWidget
337
- ? tracker.currentWidget.context.model.sharedModel.editable
385
+ ? tracker.currentWidget.model.sharedModel.editable
338
386
  : false;
339
387
  }, execute: Private.createEntry({
340
388
  tracker,
@@ -352,7 +400,7 @@ export function addCommands(app, tracker, translator, formSchemaRegistry, layerB
352
400
  ? trans.__('Vector')
353
401
  : trans.__('Add New Vector layer'), isEnabled: () => {
354
402
  return tracker.currentWidget
355
- ? tracker.currentWidget.context.model.sharedModel.editable
403
+ ? tracker.currentWidget.model.sharedModel.editable
356
404
  : false;
357
405
  }, execute: Private.createEntry({
358
406
  tracker,
@@ -370,7 +418,7 @@ export function addCommands(app, tracker, translator, formSchemaRegistry, layerB
370
418
  ? trans.__('Hillshade')
371
419
  : trans.__('Add Hillshade layer'), isEnabled: () => {
372
420
  return tracker.currentWidget
373
- ? tracker.currentWidget.context.model.sharedModel.editable
421
+ ? tracker.currentWidget.model.sharedModel.editable
374
422
  : false;
375
423
  }, execute: Private.createEntry({
376
424
  tracker,
@@ -388,7 +436,7 @@ export function addCommands(app, tracker, translator, formSchemaRegistry, layerB
388
436
  ? trans.__('Image')
389
437
  : trans.__('Add Image layer'), isEnabled: () => {
390
438
  return tracker.currentWidget
391
- ? tracker.currentWidget.context.model.sharedModel.editable
439
+ ? tracker.currentWidget.model.sharedModel.editable
392
440
  : false;
393
441
  }, execute: Private.createEntry({
394
442
  tracker,
@@ -406,7 +454,7 @@ export function addCommands(app, tracker, translator, formSchemaRegistry, layerB
406
454
  ? trans.__('Video')
407
455
  : trans.__('Add Video layer'), isEnabled: () => {
408
456
  return tracker.currentWidget
409
- ? tracker.currentWidget.context.model.sharedModel.editable
457
+ ? tracker.currentWidget.model.sharedModel.editable
410
458
  : false;
411
459
  }, execute: Private.createEntry({
412
460
  tracker,
@@ -422,7 +470,7 @@ export function addCommands(app, tracker, translator, formSchemaRegistry, layerB
422
470
  }) }, icons.get(CommandIDs.newVideoLayer)));
423
471
  commands.addCommand(CommandIDs.newShapefileLayer, Object.assign({ label: trans.__('New Shapefile Layer'), isEnabled: () => {
424
472
  return tracker.currentWidget
425
- ? tracker.currentWidget.context.model.sharedModel.editable
473
+ ? tracker.currentWidget.model.sharedModel.editable
426
474
  : false;
427
475
  }, execute: Private.createEntry({
428
476
  tracker,
@@ -435,6 +483,22 @@ export function addCommands(app, tracker, translator, formSchemaRegistry, layerB
435
483
  sourceType: 'ShapefileSource',
436
484
  layerType: 'VectorLayer'
437
485
  }) }, icons.get(CommandIDs.newShapefileLayer)));
486
+ commands.addCommand(CommandIDs.newHeatmapLayer, Object.assign({ label: args => args.from === 'contextMenu'
487
+ ? trans.__('Heatmap')
488
+ : trans.__('Add HeatmapLayer'), isEnabled: () => {
489
+ return tracker.currentWidget
490
+ ? tracker.currentWidget.model.sharedModel.editable
491
+ : false;
492
+ }, execute: Private.createEntry({
493
+ tracker,
494
+ formSchemaRegistry,
495
+ title: 'Create Heatmap Layer',
496
+ createLayer: true,
497
+ createSource: false,
498
+ layerData: { name: 'Custom Heatmap Layer' },
499
+ sourceType: 'GeoJSONSource',
500
+ layerType: 'HeatmapLayer'
501
+ }) }, icons.get(CommandIDs.newHeatmapLayer)));
438
502
  /**
439
503
  * LAYERS and LAYER GROUP actions.
440
504
  */
@@ -442,7 +506,7 @@ export function addCommands(app, tracker, translator, formSchemaRegistry, layerB
442
506
  label: trans.__('Rename Layer'),
443
507
  execute: async () => {
444
508
  var _a;
445
- const model = (_a = tracker.currentWidget) === null || _a === void 0 ? void 0 : _a.context.model;
509
+ const model = (_a = tracker.currentWidget) === null || _a === void 0 ? void 0 : _a.model;
446
510
  await Private.renameSelectedItem(model, 'layer', (layerId, newName) => {
447
511
  const layer = model === null || model === void 0 ? void 0 : model.getLayer(layerId);
448
512
  if (layer) {
@@ -456,7 +520,7 @@ export function addCommands(app, tracker, translator, formSchemaRegistry, layerB
456
520
  label: trans.__('Remove Layer'),
457
521
  execute: () => {
458
522
  var _a;
459
- const model = (_a = tracker.currentWidget) === null || _a === void 0 ? void 0 : _a.context.model;
523
+ const model = (_a = tracker.currentWidget) === null || _a === void 0 ? void 0 : _a.model;
460
524
  Private.removeSelectedItems(model, 'layer', selection => {
461
525
  model === null || model === void 0 ? void 0 : model.removeLayer(selection);
462
526
  });
@@ -466,7 +530,7 @@ export function addCommands(app, tracker, translator, formSchemaRegistry, layerB
466
530
  label: trans.__('Rename Group'),
467
531
  execute: async () => {
468
532
  var _a;
469
- const model = (_a = tracker.currentWidget) === null || _a === void 0 ? void 0 : _a.context.model;
533
+ const model = (_a = tracker.currentWidget) === null || _a === void 0 ? void 0 : _a.model;
470
534
  await Private.renameSelectedItem(model, 'group', (groupName, newName) => {
471
535
  model === null || model === void 0 ? void 0 : model.renameLayerGroup(groupName, newName);
472
536
  });
@@ -476,7 +540,7 @@ export function addCommands(app, tracker, translator, formSchemaRegistry, layerB
476
540
  label: trans.__('Remove Group'),
477
541
  execute: async () => {
478
542
  var _a;
479
- const model = (_a = tracker.currentWidget) === null || _a === void 0 ? void 0 : _a.context.model;
543
+ const model = (_a = tracker.currentWidget) === null || _a === void 0 ? void 0 : _a.model;
480
544
  Private.removeSelectedItems(model, 'group', selection => {
481
545
  model === null || model === void 0 ? void 0 : model.removeLayerGroup(selection);
482
546
  });
@@ -486,7 +550,7 @@ export function addCommands(app, tracker, translator, formSchemaRegistry, layerB
486
550
  label: args => args['label'] ? args['label'] : trans.__('Move to Root'),
487
551
  execute: args => {
488
552
  var _a, _b, _c;
489
- const model = (_a = tracker.currentWidget) === null || _a === void 0 ? void 0 : _a.context.model;
553
+ const model = (_a = tracker.currentWidget) === null || _a === void 0 ? void 0 : _a.model;
490
554
  const groupName = args['label'];
491
555
  const selectedLayers = (_c = (_b = model === null || model === void 0 ? void 0 : model.localState) === null || _b === void 0 ? void 0 : _b.selected) === null || _c === void 0 ? void 0 : _c.value;
492
556
  if (!selectedLayers) {
@@ -499,7 +563,7 @@ export function addCommands(app, tracker, translator, formSchemaRegistry, layerB
499
563
  label: trans.__('Move Selected Layers to New Group'),
500
564
  execute: async () => {
501
565
  var _a, _b, _c;
502
- const model = (_a = tracker.currentWidget) === null || _a === void 0 ? void 0 : _a.context.model;
566
+ const model = (_a = tracker.currentWidget) === null || _a === void 0 ? void 0 : _a.model;
503
567
  const selectedLayers = (_c = (_b = model === null || model === void 0 ? void 0 : model.localState) === null || _b === void 0 ? void 0 : _b.selected) === null || _c === void 0 ? void 0 : _c.value;
504
568
  if (!selectedLayers) {
505
569
  return;
@@ -556,7 +620,7 @@ export function addCommands(app, tracker, translator, formSchemaRegistry, layerB
556
620
  label: trans.__('Rename Source'),
557
621
  execute: async () => {
558
622
  var _a;
559
- const model = (_a = tracker.currentWidget) === null || _a === void 0 ? void 0 : _a.context.model;
623
+ const model = (_a = tracker.currentWidget) === null || _a === void 0 ? void 0 : _a.model;
560
624
  await Private.renameSelectedItem(model, 'source', (sourceId, newName) => {
561
625
  const source = model === null || model === void 0 ? void 0 : model.getSource(sourceId);
562
626
  if (source) {
@@ -570,7 +634,7 @@ export function addCommands(app, tracker, translator, formSchemaRegistry, layerB
570
634
  label: trans.__('Remove Source'),
571
635
  execute: () => {
572
636
  var _a;
573
- const model = (_a = tracker.currentWidget) === null || _a === void 0 ? void 0 : _a.context.model;
637
+ const model = (_a = tracker.currentWidget) === null || _a === void 0 ? void 0 : _a.model;
574
638
  Private.removeSelectedItems(model, 'source', selection => {
575
639
  var _a;
576
640
  if (!((_a = model === null || model === void 0 ? void 0 : model.getLayersBySource(selection).length) !== null && _a !== void 0 ? _a : true)) {
@@ -585,37 +649,43 @@ export function addCommands(app, tracker, translator, formSchemaRegistry, layerB
585
649
  // Console commands
586
650
  commands.addCommand(CommandIDs.toggleConsole, {
587
651
  label: trans.__('Toggle console'),
652
+ isVisible: () => tracker.currentWidget instanceof JupyterGISDocumentWidget,
588
653
  isEnabled: () => {
589
654
  return tracker.currentWidget
590
- ? tracker.currentWidget.context.model.sharedModel.editable
655
+ ? tracker.currentWidget.model.sharedModel.editable
591
656
  : false;
592
657
  },
593
658
  execute: async () => await Private.toggleConsole(tracker)
594
659
  });
595
660
  commands.addCommand(CommandIDs.executeConsole, {
596
661
  label: trans.__('Execute console'),
662
+ isVisible: () => tracker.currentWidget instanceof JupyterGISDocumentWidget,
597
663
  isEnabled: () => {
598
664
  return tracker.currentWidget
599
- ? tracker.currentWidget.context.model.sharedModel.editable
665
+ ? tracker.currentWidget.model.sharedModel.editable
600
666
  : false;
601
667
  },
602
668
  execute: () => Private.executeConsole(tracker)
603
669
  });
604
670
  commands.addCommand(CommandIDs.removeConsole, {
605
671
  label: trans.__('Remove console'),
672
+ isVisible: () => tracker.currentWidget instanceof JupyterGISDocumentWidget,
606
673
  isEnabled: () => {
607
674
  return tracker.currentWidget
608
- ? tracker.currentWidget.context.model.sharedModel.editable
675
+ ? tracker.currentWidget.model.sharedModel.editable
609
676
  : false;
610
677
  },
611
678
  execute: () => Private.removeConsole(tracker)
612
679
  });
613
680
  commands.addCommand(CommandIDs.invokeCompleter, {
614
681
  label: trans.__('Display the completion helper.'),
682
+ isVisible: () => tracker.currentWidget instanceof JupyterGISDocumentWidget,
615
683
  execute: () => {
616
684
  var _a;
617
685
  const currentWidget = tracker.currentWidget;
618
- if (!currentWidget || !completionProviderManager) {
686
+ if (!currentWidget ||
687
+ !completionProviderManager ||
688
+ !(currentWidget instanceof JupyterGISDocumentWidget)) {
619
689
  return;
620
690
  }
621
691
  const id = (_a = currentWidget.content.consolePanel) === null || _a === void 0 ? void 0 : _a.id;
@@ -626,10 +696,13 @@ export function addCommands(app, tracker, translator, formSchemaRegistry, layerB
626
696
  });
627
697
  commands.addCommand(CommandIDs.selectCompleter, {
628
698
  label: trans.__('Select the completion suggestion.'),
699
+ isVisible: () => tracker.currentWidget instanceof JupyterGISDocumentWidget,
629
700
  execute: () => {
630
701
  var _a;
631
702
  const currentWidget = tracker.currentWidget;
632
- if (!currentWidget || !completionProviderManager) {
703
+ if (!currentWidget ||
704
+ !completionProviderManager ||
705
+ !(currentWidget instanceof JupyterGISDocumentWidget)) {
633
706
  return;
634
707
  }
635
708
  const id = (_a = currentWidget.content.consolePanel) === null || _a === void 0 ? void 0 : _a.id;
@@ -638,6 +711,25 @@ export function addCommands(app, tracker, translator, formSchemaRegistry, layerB
638
711
  }
639
712
  }
640
713
  });
714
+ commands.addCommand(CommandIDs.zoomToLayer, {
715
+ label: trans.__('Zoom to Layer'),
716
+ execute: () => {
717
+ var _a;
718
+ const currentWidget = tracker.currentWidget;
719
+ if (!currentWidget || !completionProviderManager) {
720
+ return;
721
+ }
722
+ console.log('zooming');
723
+ const model = tracker.currentWidget.model;
724
+ const selectedItems = (_a = model.localState) === null || _a === void 0 ? void 0 : _a.selected.value;
725
+ if (!selectedItems) {
726
+ return;
727
+ }
728
+ const layerId = Object.keys(selectedItems)[0];
729
+ model.centerOnPosition(layerId);
730
+ }
731
+ });
732
+ loadKeybindings(commands, keybindings);
641
733
  }
642
734
  var Private;
643
735
  (function (Private) {
@@ -648,7 +740,7 @@ var Private;
648
740
  return;
649
741
  }
650
742
  const dialog = new LayerBrowserWidget({
651
- context: current.context,
743
+ model: current.model,
652
744
  registry: layerBrowserRegistry.getRegistryLayers(),
653
745
  formSchemaRegistry
654
746
  });
@@ -663,7 +755,7 @@ var Private;
663
755
  return;
664
756
  }
665
757
  const dialog = new SymbologyWidget({
666
- context: current.context,
758
+ model: current.model,
667
759
  state
668
760
  });
669
761
  await dialog.launch();
@@ -677,7 +769,7 @@ var Private;
677
769
  return;
678
770
  }
679
771
  const dialog = new CreationFormDialog({
680
- context: current.context,
772
+ model: current.model,
681
773
  title,
682
774
  createLayer,
683
775
  createSource,
@@ -720,8 +812,8 @@ var Private;
720
812
  }
721
813
  Private.getUserInputForRename = getUserInputForRename;
722
814
  function removeSelectedItems(model, itemTypeToRemove, removeFunction) {
723
- var _a;
724
- const selected = (_a = model === null || model === void 0 ? void 0 : model.localState) === null || _a === void 0 ? void 0 : _a.selected.value;
815
+ var _a, _b;
816
+ const selected = (_b = (_a = model === null || model === void 0 ? void 0 : model.localState) === null || _a === void 0 ? void 0 : _a.selected) === null || _b === void 0 ? void 0 : _b.value;
725
817
  if (!selected) {
726
818
  console.info('Nothing selected');
727
819
  return;
@@ -775,7 +867,7 @@ var Private;
775
867
  Private.renameSelectedItem = renameSelectedItem;
776
868
  function executeConsole(tracker) {
777
869
  const current = tracker.currentWidget;
778
- if (!current) {
870
+ if (!current || !(current instanceof JupyterGISDocumentWidget)) {
779
871
  return;
780
872
  }
781
873
  current.content.executeConsole();
@@ -783,7 +875,7 @@ var Private;
783
875
  Private.executeConsole = executeConsole;
784
876
  function removeConsole(tracker) {
785
877
  const current = tracker.currentWidget;
786
- if (!current) {
878
+ if (!current || !(current instanceof JupyterGISDocumentWidget)) {
787
879
  return;
788
880
  }
789
881
  current.content.removeConsole();
@@ -791,18 +883,10 @@ var Private;
791
883
  Private.removeConsole = removeConsole;
792
884
  async function toggleConsole(tracker) {
793
885
  const current = tracker.currentWidget;
794
- if (!current) {
886
+ if (!current || !(current instanceof JupyterGISDocumentWidget)) {
795
887
  return;
796
888
  }
797
- const currentPath = current.context.path.split(':');
798
- let realPath = '';
799
- if (currentPath.length > 1) {
800
- realPath = currentPath[1];
801
- }
802
- else {
803
- realPath = currentPath[0];
804
- }
805
- await current.content.toggleConsole(realPath);
889
+ await current.content.toggleConsole(current.model.filePath);
806
890
  }
807
891
  Private.toggleConsole = toggleConsole;
808
892
  })(Private || (Private = {}));
@@ -8,6 +8,7 @@ export declare namespace CommandIDs {
8
8
  const undo = "jupytergis:undo";
9
9
  const symbology = "jupytergis:symbology";
10
10
  const identify = "jupytergis:identify";
11
+ const temporalController = "jupytergis:temporalController";
11
12
  const openLayerBrowser = "jupytergis:openLayerBrowser";
12
13
  const newRasterEntry = "jupytergis:newRasterEntry";
13
14
  const newVectorTileEntry = "jupytergis:newVectorTileEntry";
@@ -31,6 +32,7 @@ export declare namespace CommandIDs {
31
32
  const newVideoLayer = "jupytergis:newVideoLayer";
32
33
  const newShapefileLayer = "jupytergis:newShapefileLayer";
33
34
  const newWebGlTileLayer = "jupytergis:newWebGlTileLayer";
35
+ const newHeatmapLayer = "jupytergis:newHeatmapLayer";
34
36
  const renameLayer = "jupytergis:renameLayer";
35
37
  const removeLayer = "jupytergis:removeLayer";
36
38
  const renameGroup = "jupytergis:renameGroup";
@@ -45,6 +47,7 @@ export declare namespace CommandIDs {
45
47
  const executeConsole = "jupytergis:executeConsole";
46
48
  const selectCompleter = "jupytergis:selectConsoleCompleter";
47
49
  const addAnnotation = "jupytergis:addAnnotation";
50
+ const zoomToLayer = "jupytergis:zoomToLayer";
48
51
  }
49
52
  interface IRegisteredIcon {
50
53
  icon?: LabIcon;
package/lib/constants.js CHANGED
@@ -10,6 +10,7 @@ export var CommandIDs;
10
10
  CommandIDs.undo = 'jupytergis:undo';
11
11
  CommandIDs.symbology = 'jupytergis:symbology';
12
12
  CommandIDs.identify = 'jupytergis:identify';
13
+ CommandIDs.temporalController = 'jupytergis:temporalController';
13
14
  // Layers and sources creation commands
14
15
  CommandIDs.openLayerBrowser = 'jupytergis:openLayerBrowser';
15
16
  // Layer and source
@@ -37,6 +38,7 @@ export var CommandIDs;
37
38
  CommandIDs.newVideoLayer = 'jupytergis:newVideoLayer';
38
39
  CommandIDs.newShapefileLayer = 'jupytergis:newShapefileLayer';
39
40
  CommandIDs.newWebGlTileLayer = 'jupytergis:newWebGlTileLayer';
41
+ CommandIDs.newHeatmapLayer = 'jupytergis:newHeatmapLayer';
40
42
  // Layer and group actions
41
43
  CommandIDs.renameLayer = 'jupytergis:renameLayer';
42
44
  CommandIDs.removeLayer = 'jupytergis:removeLayer';
@@ -55,6 +57,7 @@ export var CommandIDs;
55
57
  CommandIDs.selectCompleter = 'jupytergis:selectConsoleCompleter';
56
58
  // Map Commands
57
59
  CommandIDs.addAnnotation = 'jupytergis:addAnnotation';
60
+ CommandIDs.zoomToLayer = 'jupytergis:zoomToLayer';
58
61
  })(CommandIDs || (CommandIDs = {}));
59
62
  const iconObject = {
60
63
  RasterSource: { icon: rasterIcon },
@@ -81,7 +84,8 @@ const iconObject = {
81
84
  [CommandIDs.newShapefileLayer]: { iconClass: 'fa fa-file' },
82
85
  [CommandIDs.newGeoTiffEntry]: { iconClass: 'fa fa-image' },
83
86
  [CommandIDs.symbology]: { iconClass: 'fa fa-brush' },
84
- [CommandIDs.identify]: { iconClass: 'fa fa-info' }
87
+ [CommandIDs.identify]: { iconClass: 'fa fa-info' },
88
+ [CommandIDs.temporalController]: { iconClass: 'fa fa-clock' }
85
89
  };
86
90
  /**
87
91
  * The registered icons
@@ -16,6 +16,11 @@ export interface ICreationFormWrapperProps extends ICreationFormProps {
16
16
  * some extra errors or not.
17
17
  */
18
18
  formErrorSignalPromise?: PromiseDelegate<Signal<Dialog<any>, boolean>>;
19
+ /**
20
+ * Configuration options for the dialog, including settings for layer data, source data,
21
+ * and other form-related parameters.
22
+ */
23
+ dialogOptions?: any;
19
24
  }
20
25
  export interface ICreationFormDialogOptions extends ICreationFormProps {
21
26
  title: string;
@@ -16,7 +16,7 @@ export const CreationFormWrapper = (props) => {
16
16
  formErrorSignal.current = formChanged;
17
17
  setReady(true);
18
18
  });
19
- return (ready && (React.createElement(CreationForm, { context: props.context, formSchemaRegistry: props.formSchemaRegistry, createLayer: props.createLayer, createSource: props.createSource, layerType: props.layerType, sourceType: props.sourceType, sourceData: props.sourceData, layerData: props.layerData, ok: okSignal.current, cancel: props.cancel, formErrorSignal: formErrorSignal.current })));
19
+ return (ready && (React.createElement(CreationForm, { model: props.model, formSchemaRegistry: props.formSchemaRegistry, createLayer: props.createLayer, createSource: props.createSource, layerType: props.layerType, sourceType: props.sourceType, sourceData: props.sourceData, layerData: props.layerData, ok: okSignal.current, cancel: props.cancel, formErrorSignal: formErrorSignal.current, dialogOptions: props.dialogOptions })));
20
20
  };
21
21
  /**
22
22
  * Form for creating a source, a layer or both at the same time
@@ -29,7 +29,7 @@ export class CreationFormDialog extends Dialog {
29
29
  const okSignalPromise = new PromiseDelegate();
30
30
  const formErrorSignalPromise = new PromiseDelegate();
31
31
  const body = (React.createElement("div", { style: { overflow: 'auto' } },
32
- React.createElement(CreationFormWrapper, { context: options.context, formSchemaRegistry: options.formSchemaRegistry, createLayer: options.createLayer, createSource: options.createSource, layerType: options.layerType, sourceType: options.sourceType, sourceData: options.sourceData, layerData: options.layerData, okSignalPromise: okSignalPromise, cancel: cancelCallback, formErrorSignalPromise: formErrorSignalPromise })));
32
+ React.createElement(CreationFormWrapper, { model: options.model, formSchemaRegistry: options.formSchemaRegistry, createLayer: options.createLayer, createSource: options.createSource, layerType: options.layerType, sourceType: options.sourceType, sourceData: options.sourceData, layerData: options.layerData, okSignalPromise: okSignalPromise, cancel: cancelCallback, formErrorSignalPromise: formErrorSignalPromise, dialogOptions: options })));
33
33
  super({
34
34
  title: options.title,
35
35
  body,