@jupytergis/base 0.1.1

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 (108) hide show
  1. package/lib/commands.d.ts +11 -0
  2. package/lib/commands.js +809 -0
  3. package/lib/console/consoleview.d.ts +24 -0
  4. package/lib/console/consoleview.js +55 -0
  5. package/lib/console/index.d.ts +1 -0
  6. package/lib/console/index.js +1 -0
  7. package/lib/constants.d.ts +57 -0
  8. package/lib/constants.js +89 -0
  9. package/lib/dialogs/components/symbology/BandRendering.d.ts +4 -0
  10. package/lib/dialogs/components/symbology/BandRendering.js +29 -0
  11. package/lib/dialogs/components/symbology/BandRow.d.ts +10 -0
  12. package/lib/dialogs/components/symbology/BandRow.js +43 -0
  13. package/lib/dialogs/components/symbology/SingleBandPseudoColor.d.ts +20 -0
  14. package/lib/dialogs/components/symbology/SingleBandPseudoColor.js +281 -0
  15. package/lib/dialogs/components/symbology/StopRow.d.ts +11 -0
  16. package/lib/dialogs/components/symbology/StopRow.js +58 -0
  17. package/lib/dialogs/formdialog.d.ts +31 -0
  18. package/lib/dialogs/formdialog.js +68 -0
  19. package/lib/dialogs/layerBrowserDialog.d.ts +25 -0
  20. package/lib/dialogs/layerBrowserDialog.js +141 -0
  21. package/lib/dialogs/symbologyDialog.d.ts +23 -0
  22. package/lib/dialogs/symbologyDialog.js +68 -0
  23. package/lib/dialogs/terrainDialog.d.ts +21 -0
  24. package/lib/dialogs/terrainDialog.js +60 -0
  25. package/lib/formbuilder/creationform.d.ts +56 -0
  26. package/lib/formbuilder/creationform.js +117 -0
  27. package/lib/formbuilder/editform.d.ts +24 -0
  28. package/lib/formbuilder/editform.js +60 -0
  29. package/lib/formbuilder/formselectors.d.ts +5 -0
  30. package/lib/formbuilder/formselectors.js +38 -0
  31. package/lib/formbuilder/index.d.ts +6 -0
  32. package/lib/formbuilder/index.js +6 -0
  33. package/lib/formbuilder/objectform/baseform.d.ts +79 -0
  34. package/lib/formbuilder/objectform/baseform.js +167 -0
  35. package/lib/formbuilder/objectform/geojsonsource.d.ts +19 -0
  36. package/lib/formbuilder/objectform/geojsonsource.js +80 -0
  37. package/lib/formbuilder/objectform/hillshadeLayerForm.d.ts +8 -0
  38. package/lib/formbuilder/objectform/hillshadeLayerForm.js +12 -0
  39. package/lib/formbuilder/objectform/layerform.d.ts +19 -0
  40. package/lib/formbuilder/objectform/layerform.js +17 -0
  41. package/lib/formbuilder/objectform/tilesourceform.d.ts +7 -0
  42. package/lib/formbuilder/objectform/tilesourceform.js +60 -0
  43. package/lib/formbuilder/objectform/vectorlayerform.d.ts +15 -0
  44. package/lib/formbuilder/objectform/vectorlayerform.js +88 -0
  45. package/lib/formbuilder/objectform/webGlLayerForm.d.ts +8 -0
  46. package/lib/formbuilder/objectform/webGlLayerForm.js +10 -0
  47. package/lib/icons.d.ts +6 -0
  48. package/lib/icons.js +31 -0
  49. package/lib/index.d.ts +10 -0
  50. package/lib/index.js +10 -0
  51. package/lib/mainview/index.d.ts +3 -0
  52. package/lib/mainview/index.js +3 -0
  53. package/lib/mainview/mainView.d.ts +113 -0
  54. package/lib/mainview/mainView.js +743 -0
  55. package/lib/mainview/mainviewmodel.d.ts +24 -0
  56. package/lib/mainview/mainviewmodel.js +34 -0
  57. package/lib/mainview/mainviewwidget.d.ts +14 -0
  58. package/lib/mainview/mainviewwidget.js +18 -0
  59. package/lib/mainview/spinner.d.ts +6 -0
  60. package/lib/mainview/spinner.js +5 -0
  61. package/lib/panelview/components/filter-panel/Filter.d.ts +19 -0
  62. package/lib/panelview/components/filter-panel/Filter.js +223 -0
  63. package/lib/panelview/components/filter-panel/FilterRow.d.ts +9 -0
  64. package/lib/panelview/components/filter-panel/FilterRow.js +61 -0
  65. package/lib/panelview/components/layers.d.ts +13 -0
  66. package/lib/panelview/components/layers.js +275 -0
  67. package/lib/panelview/components/sources.d.ts +10 -0
  68. package/lib/panelview/components/sources.js +147 -0
  69. package/lib/panelview/header.d.ts +11 -0
  70. package/lib/panelview/header.js +20 -0
  71. package/lib/panelview/index.d.ts +5 -0
  72. package/lib/panelview/index.js +5 -0
  73. package/lib/panelview/leftpanel.d.ts +51 -0
  74. package/lib/panelview/leftpanel.js +125 -0
  75. package/lib/panelview/model.d.ts +19 -0
  76. package/lib/panelview/model.js +30 -0
  77. package/lib/panelview/objectproperties.d.ts +17 -0
  78. package/lib/panelview/objectproperties.js +92 -0
  79. package/lib/panelview/rightpanel.d.ts +19 -0
  80. package/lib/panelview/rightpanel.js +45 -0
  81. package/lib/toolbar/index.d.ts +2 -0
  82. package/lib/toolbar/index.js +2 -0
  83. package/lib/toolbar/usertoolbaritem.d.ts +19 -0
  84. package/lib/toolbar/usertoolbaritem.js +57 -0
  85. package/lib/toolbar/widget.d.ts +22 -0
  86. package/lib/toolbar/widget.js +104 -0
  87. package/lib/tools.d.ts +25 -0
  88. package/lib/tools.js +215 -0
  89. package/lib/types.d.ts +11 -0
  90. package/lib/types.js +1 -0
  91. package/lib/widget.d.ts +49 -0
  92. package/lib/widget.js +144 -0
  93. package/package.json +95 -0
  94. package/style/base.css +55 -0
  95. package/style/colorExpression.css +36 -0
  96. package/style/dialog.css +8 -0
  97. package/style/filterPanel.css +70 -0
  98. package/style/icons/geojson.svg +12 -0
  99. package/style/icons/mound.svg +9 -0
  100. package/style/icons/nonvisibility.svg +8 -0
  101. package/style/icons/raster.svg +5 -0
  102. package/style/icons/visibility.svg +7 -0
  103. package/style/index.css +6 -0
  104. package/style/index.js +6 -0
  105. package/style/layerBrowser.css +256 -0
  106. package/style/leftPanel.css +150 -0
  107. package/style/symbologyDialog.css +86 -0
  108. package/style/terrainDialog.css +14 -0
@@ -0,0 +1,809 @@
1
+ import { showErrorMessage } from '@jupyterlab/apputils';
2
+ import { CommandIDs, icons } from './constants';
3
+ import { CreationFormDialog } from './dialogs/formdialog';
4
+ import { LayerBrowserWidget } from './dialogs/layerBrowserDialog';
5
+ import { SymbologyWidget } from './dialogs/symbologyDialog';
6
+ import { TerrainDialogWidget } from './dialogs/terrainDialog';
7
+ /**
8
+ * Add the commands to the application's command registry.
9
+ */
10
+ export function addCommands(app, tracker, translator, formSchemaRegistry, layerBrowserRegistry, state, completionProviderManager) {
11
+ var _a;
12
+ const trans = translator.load('jupyterlab');
13
+ const { commands } = app;
14
+ commands.addCommand(CommandIDs.symbology, Object.assign({ label: trans.__('Edit Symbology'), isEnabled: () => {
15
+ return tracker.currentWidget
16
+ ? tracker.currentWidget.context.model.sharedModel.editable
17
+ : false;
18
+ }, execute: Private.createSymbologyDialog(tracker, state) }, icons.get(CommandIDs.symbology)));
19
+ commands.addCommand(CommandIDs.redo, Object.assign({ label: trans.__('Redo'), isEnabled: () => {
20
+ return tracker.currentWidget
21
+ ? tracker.currentWidget.context.model.sharedModel.editable
22
+ : false;
23
+ }, execute: args => {
24
+ const current = tracker.currentWidget;
25
+ if (current) {
26
+ return current.context.model.sharedModel.redo();
27
+ }
28
+ } }, (_a = icons.get(CommandIDs.redo)) === null || _a === void 0 ? void 0 : _a.icon));
29
+ commands.addCommand(CommandIDs.undo, Object.assign({ label: trans.__('Undo'), isEnabled: () => {
30
+ return tracker.currentWidget
31
+ ? tracker.currentWidget.context.model.sharedModel.editable
32
+ : false;
33
+ }, execute: args => {
34
+ const current = tracker.currentWidget;
35
+ if (current) {
36
+ return current.context.model.sharedModel.undo();
37
+ }
38
+ } }, icons.get(CommandIDs.undo)));
39
+ /**
40
+ * SOURCES and LAYERS creation commands.
41
+ */
42
+ commands.addCommand(CommandIDs.openLayerBrowser, Object.assign({ label: trans.__('Open Layer Browser'), isEnabled: () => {
43
+ return tracker.currentWidget
44
+ ? tracker.currentWidget.context.model.sharedModel.editable
45
+ : false;
46
+ }, execute: Private.createLayerBrowser(tracker, layerBrowserRegistry, formSchemaRegistry) }, icons.get(CommandIDs.openLayerBrowser)));
47
+ /**
48
+ * Source and layers
49
+ */
50
+ commands.addCommand(CommandIDs.newRasterEntry, Object.assign({ label: trans.__('New Raster Layer'), isEnabled: () => {
51
+ return tracker.currentWidget
52
+ ? tracker.currentWidget.context.model.sharedModel.editable
53
+ : false;
54
+ }, execute: Private.createEntry({
55
+ tracker,
56
+ formSchemaRegistry,
57
+ title: 'Create Raster Layer',
58
+ createLayer: true,
59
+ createSource: true,
60
+ sourceData: {
61
+ minZoom: 0,
62
+ maxZoom: 24
63
+ },
64
+ layerData: { name: 'Custom Raster Layer' },
65
+ sourceType: 'RasterSource',
66
+ layerType: 'RasterLayer'
67
+ }) }, icons.get(CommandIDs.newRasterEntry)));
68
+ commands.addCommand(CommandIDs.newVectorTileEntry, Object.assign({ label: trans.__('New Vector Tile Layer'), isEnabled: () => {
69
+ return tracker.currentWidget
70
+ ? tracker.currentWidget.context.model.sharedModel.editable
71
+ : false;
72
+ }, execute: Private.createEntry({
73
+ tracker,
74
+ formSchemaRegistry,
75
+ title: 'Create Vector Tile Layer',
76
+ createLayer: true,
77
+ createSource: true,
78
+ sourceData: { minZoom: 0, maxZoom: 24 },
79
+ layerData: { name: 'Custom Vector Tile Layer' },
80
+ sourceType: 'VectorTileSource',
81
+ layerType: 'VectorTileLayer'
82
+ }) }, icons.get(CommandIDs.newVectorTileEntry)));
83
+ commands.addCommand(CommandIDs.newGeoJSONEntry, Object.assign({ label: trans.__('New GeoJSON layer'), isEnabled: () => {
84
+ return tracker.currentWidget
85
+ ? tracker.currentWidget.context.model.sharedModel.editable
86
+ : false;
87
+ }, execute: Private.createEntry({
88
+ tracker,
89
+ formSchemaRegistry,
90
+ title: 'Create GeoJSON Layer',
91
+ createLayer: true,
92
+ createSource: true,
93
+ layerData: { name: 'Custom GeoJSON Layer' },
94
+ sourceType: 'GeoJSONSource',
95
+ layerType: 'VectorLayer'
96
+ }) }, icons.get(CommandIDs.newGeoJSONEntry)));
97
+ commands.addCommand(CommandIDs.newHillshadeEntry, Object.assign({ label: trans.__('New Hillshade layer'), isEnabled: () => {
98
+ return tracker.currentWidget
99
+ ? tracker.currentWidget.context.model.sharedModel.editable
100
+ : false;
101
+ }, execute: Private.createEntry({
102
+ tracker,
103
+ formSchemaRegistry,
104
+ title: 'Create Hillshade Layer',
105
+ createLayer: true,
106
+ createSource: true,
107
+ layerData: { name: 'Custom Hillshade Layer' },
108
+ sourceType: 'RasterDemSource',
109
+ layerType: 'HillshadeLayer'
110
+ }) }, icons.get(CommandIDs.newHillshadeEntry)));
111
+ commands.addCommand(CommandIDs.newImageEntry, Object.assign({ label: trans.__('New Image layer'), isEnabled: () => {
112
+ return tracker.currentWidget
113
+ ? tracker.currentWidget.context.model.sharedModel.editable
114
+ : false;
115
+ }, execute: Private.createEntry({
116
+ tracker,
117
+ formSchemaRegistry,
118
+ title: 'Create Image Layer',
119
+ createLayer: true,
120
+ createSource: true,
121
+ sourceData: {
122
+ name: 'Custom Image Source',
123
+ url: 'https://maplibre.org/maplibre-gl-js/docs/assets/radar.gif',
124
+ coordinates: [
125
+ [-80.425, 46.437],
126
+ [-71.516, 46.437],
127
+ [-71.516, 37.936],
128
+ [-80.425, 37.936]
129
+ ]
130
+ },
131
+ layerData: { name: 'Custom Image Layer' },
132
+ sourceType: 'ImageSource',
133
+ layerType: 'ImageLayer'
134
+ }) }, icons.get(CommandIDs.newImageEntry)));
135
+ commands.addCommand(CommandIDs.newVideoEntry, Object.assign({ label: trans.__('New Video layer'), isEnabled: () => {
136
+ return tracker.currentWidget
137
+ ? tracker.currentWidget.context.model.sharedModel.editable
138
+ : false;
139
+ }, execute: Private.createEntry({
140
+ tracker,
141
+ formSchemaRegistry,
142
+ title: 'Create Video Layer',
143
+ createLayer: true,
144
+ createSource: true,
145
+ sourceData: {
146
+ name: 'Custom Video Source',
147
+ urls: [
148
+ 'https://static-assets.mapbox.com/mapbox-gl-js/drone.mp4',
149
+ 'https://static-assets.mapbox.com/mapbox-gl-js/drone.webm'
150
+ ],
151
+ coordinates: [
152
+ [-122.51596391201019, 37.56238816766053],
153
+ [-122.51467645168304, 37.56410183312965],
154
+ [-122.51309394836426, 37.563391708549425],
155
+ [-122.51423120498657, 37.56161849366671]
156
+ ]
157
+ },
158
+ layerData: { name: 'Custom Video Layer' },
159
+ sourceType: 'VideoSource',
160
+ layerType: 'RasterLayer'
161
+ }) }, icons.get(CommandIDs.newVideoEntry)));
162
+ commands.addCommand(CommandIDs.newShapefileSource, Object.assign({ label: args => args.from === 'contextMenu'
163
+ ? trans.__('Shapefile')
164
+ : trans.__('Add Shapefile Source'), isEnabled: () => {
165
+ return tracker.currentWidget
166
+ ? tracker.currentWidget.context.model.sharedModel.editable
167
+ : false;
168
+ }, execute: Private.createEntry({
169
+ tracker,
170
+ formSchemaRegistry,
171
+ title: 'Create Shapefile Source',
172
+ createLayer: false,
173
+ createSource: true,
174
+ sourceData: { name: 'Custom Shapefile Source' },
175
+ sourceType: 'ShapefileSource'
176
+ }) }, icons.get(CommandIDs.newShapefileSource)));
177
+ commands.addCommand(CommandIDs.newGeoTiffEntry, Object.assign({ label: trans.__('New GeoTiff layer'), isEnabled: () => {
178
+ return tracker.currentWidget
179
+ ? tracker.currentWidget.context.model.sharedModel.editable
180
+ : false;
181
+ }, execute: Private.createEntry({
182
+ tracker,
183
+ formSchemaRegistry,
184
+ title: 'Create GeoTiff Layer',
185
+ createLayer: true,
186
+ createSource: true,
187
+ sourceData: {
188
+ name: 'Custom GeoTiff Source',
189
+ urls: [
190
+ {
191
+ url: 'https://sentinel-cogs.s3.us-west-2.amazonaws.com/sentinel-s2-l2a-cogs/21/H/UB/2021/9/S2B_21HUB_20210915_0_L2A/B04.tif',
192
+ max: 10000
193
+ },
194
+ {
195
+ url: 'https://sentinel-cogs.s3.us-west-2.amazonaws.com/sentinel-s2-l2a-cogs/21/H/UB/2021/9/S2B_21HUB_20210915_0_L2A/B08.tif',
196
+ max: 10000
197
+ }
198
+ ]
199
+ },
200
+ layerData: { name: 'Custom GeoTiff Layer' },
201
+ sourceType: 'GeoTiffSource',
202
+ layerType: 'WebGlLayer'
203
+ }) }, icons.get(CommandIDs.newGeoTiffEntry)));
204
+ /**
205
+ * SOURCES only commands.
206
+ */
207
+ commands.addCommand(CommandIDs.newRasterSource, Object.assign({ label: args => args.from === 'contextMenu'
208
+ ? trans.__('Raster')
209
+ : trans.__('New Raster Source'), isEnabled: () => {
210
+ return tracker.currentWidget
211
+ ? tracker.currentWidget.context.model.sharedModel.editable
212
+ : false;
213
+ }, execute: Private.createEntry({
214
+ tracker,
215
+ formSchemaRegistry,
216
+ title: 'Create Raster Source',
217
+ createLayer: false,
218
+ createSource: true,
219
+ sourceData: { name: 'Custom Raster Source', minZoom: 0, maxZoom: 24 },
220
+ sourceType: 'RasterSource'
221
+ }) }, icons.get(CommandIDs.newRasterSource)));
222
+ commands.addCommand(CommandIDs.newRasterDemSource, Object.assign({ label: args => args.from === 'contextMenu'
223
+ ? trans.__('Raster DEM')
224
+ : trans.__('New Raster DEM Source'), isEnabled: () => {
225
+ return tracker.currentWidget
226
+ ? tracker.currentWidget.context.model.sharedModel.editable
227
+ : false;
228
+ }, execute: Private.createEntry({
229
+ tracker,
230
+ formSchemaRegistry,
231
+ title: 'Create Raster Dem Source',
232
+ createLayer: false,
233
+ createSource: true,
234
+ sourceData: { name: 'Custom Raster DEM Source' },
235
+ sourceType: 'RasterDemSource'
236
+ }) }, icons.get(CommandIDs.newRasterDemSource)));
237
+ commands.addCommand(CommandIDs.newVectorSource, Object.assign({ label: args => args.from === 'contextMenu'
238
+ ? trans.__('Vector')
239
+ : trans.__('New Vector Source'), isEnabled: () => {
240
+ return tracker.currentWidget
241
+ ? tracker.currentWidget.context.model.sharedModel.editable
242
+ : false;
243
+ }, execute: Private.createEntry({
244
+ tracker,
245
+ formSchemaRegistry,
246
+ title: 'Create Vector Source',
247
+ createLayer: false,
248
+ createSource: true,
249
+ sourceData: { name: 'Custom Vector Source', minZoom: 0, maxZoom: 24 },
250
+ sourceType: 'VectorTileSource'
251
+ }) }, icons.get(CommandIDs.newVectorSource)));
252
+ commands.addCommand(CommandIDs.newGeoJSONSource, Object.assign({ label: args => args.from === 'contextMenu'
253
+ ? trans.__('GeoJSON')
254
+ : trans.__('Add GeoJSON data from file'), isEnabled: () => {
255
+ return tracker.currentWidget
256
+ ? tracker.currentWidget.context.model.sharedModel.editable
257
+ : false;
258
+ }, execute: Private.createEntry({
259
+ tracker,
260
+ formSchemaRegistry,
261
+ title: 'Create GeoJson Source',
262
+ createLayer: false,
263
+ createSource: true,
264
+ sourceData: { name: 'Custom GeoJSON Source' },
265
+ sourceType: 'GeoJSONSource'
266
+ }) }, icons.get(CommandIDs.newGeoJSONSource)));
267
+ commands.addCommand(CommandIDs.newImageSource, Object.assign({ label: args => args.from === 'contextMenu'
268
+ ? trans.__('Image')
269
+ : trans.__('Add Image Source'), isEnabled: () => {
270
+ return tracker.currentWidget
271
+ ? tracker.currentWidget.context.model.sharedModel.editable
272
+ : false;
273
+ }, execute: Private.createEntry({
274
+ tracker,
275
+ formSchemaRegistry,
276
+ title: 'Create Image Source',
277
+ createLayer: false,
278
+ createSource: true,
279
+ sourceData: { name: 'Custom Image Source' },
280
+ sourceType: 'ImageSource'
281
+ }) }, icons.get(CommandIDs.newImageSource)));
282
+ commands.addCommand(CommandIDs.newVideoSource, Object.assign({ label: args => args.from === 'contextMenu'
283
+ ? trans.__('Video')
284
+ : trans.__('Add Video Source'), isEnabled: () => {
285
+ return tracker.currentWidget
286
+ ? tracker.currentWidget.context.model.sharedModel.editable
287
+ : false;
288
+ }, execute: Private.createEntry({
289
+ tracker,
290
+ formSchemaRegistry,
291
+ title: 'Create Video Source',
292
+ createLayer: false,
293
+ createSource: true,
294
+ sourceData: { name: 'Custom Video Source' },
295
+ sourceType: 'VideoSource'
296
+ }) }, icons.get(CommandIDs.newVideoSource)));
297
+ // Layers only
298
+ commands.addCommand(CommandIDs.newRasterLayer, Object.assign({ label: args => args.from === 'contextMenu'
299
+ ? trans.__('Raster')
300
+ : trans.__('Add Raster layer'), isEnabled: () => {
301
+ return tracker.currentWidget
302
+ ? tracker.currentWidget.context.model.sharedModel.editable
303
+ : false;
304
+ }, execute: Private.createEntry({
305
+ tracker,
306
+ formSchemaRegistry,
307
+ title: 'Create Raster Layer',
308
+ createLayer: true,
309
+ createSource: false,
310
+ layerData: {
311
+ name: 'Custom Raster Layer'
312
+ },
313
+ sourceType: 'RasterSource',
314
+ layerType: 'RasterLayer'
315
+ }) }, icons.get(CommandIDs.newVectorLayer)));
316
+ commands.addCommand(CommandIDs.newVectorLayer, Object.assign({ label: args => args.from === 'contextMenu'
317
+ ? trans.__('Vector')
318
+ : trans.__('Add New Vector layer'), isEnabled: () => {
319
+ return tracker.currentWidget
320
+ ? tracker.currentWidget.context.model.sharedModel.editable
321
+ : false;
322
+ }, execute: Private.createEntry({
323
+ tracker,
324
+ formSchemaRegistry,
325
+ title: 'Create Vector Layer',
326
+ createLayer: true,
327
+ createSource: false,
328
+ layerData: {
329
+ name: 'Custom Vector Layer'
330
+ },
331
+ sourceType: 'VectorTileSource',
332
+ layerType: 'VectorTileLayer'
333
+ }) }, icons.get(CommandIDs.newVectorLayer)));
334
+ commands.addCommand(CommandIDs.newHillshadeLayer, Object.assign({ label: args => args.from === 'contextMenu'
335
+ ? trans.__('Hillshade')
336
+ : trans.__('Add Hillshade layer'), isEnabled: () => {
337
+ return tracker.currentWidget
338
+ ? tracker.currentWidget.context.model.sharedModel.editable
339
+ : false;
340
+ }, execute: Private.createEntry({
341
+ tracker,
342
+ formSchemaRegistry,
343
+ title: 'Create Hillshade Layer',
344
+ createLayer: true,
345
+ createSource: false,
346
+ layerData: {
347
+ name: 'Custom Hillshade Layer'
348
+ },
349
+ sourceType: 'RasterDemSource',
350
+ layerType: 'HillshadeLayer'
351
+ }) }, icons.get(CommandIDs.newHillshadeLayer)));
352
+ commands.addCommand(CommandIDs.newImageLayer, Object.assign({ label: args => args.from === 'contextMenu'
353
+ ? trans.__('Image')
354
+ : trans.__('Add Image layer'), isEnabled: () => {
355
+ return tracker.currentWidget
356
+ ? tracker.currentWidget.context.model.sharedModel.editable
357
+ : false;
358
+ }, execute: Private.createEntry({
359
+ tracker,
360
+ formSchemaRegistry,
361
+ title: 'Create Image Layer',
362
+ createLayer: true,
363
+ createSource: false,
364
+ layerData: {
365
+ name: 'Custom Image Layer'
366
+ },
367
+ sourceType: 'ImageSource',
368
+ layerType: 'RasterLayer'
369
+ }) }, icons.get(CommandIDs.newImageLayer)));
370
+ commands.addCommand(CommandIDs.newVideoLayer, Object.assign({ label: args => args.from === 'contextMenu'
371
+ ? trans.__('Video')
372
+ : trans.__('Add Video layer'), isEnabled: () => {
373
+ return tracker.currentWidget
374
+ ? tracker.currentWidget.context.model.sharedModel.editable
375
+ : false;
376
+ }, execute: Private.createEntry({
377
+ tracker,
378
+ formSchemaRegistry,
379
+ title: 'Create Video Layer',
380
+ createLayer: true,
381
+ createSource: false,
382
+ layerData: {
383
+ name: 'Custom Video Layer'
384
+ },
385
+ sourceType: 'VideoSource',
386
+ layerType: 'RasterLayer'
387
+ }) }, icons.get(CommandIDs.newVideoLayer)));
388
+ commands.addCommand(CommandIDs.newShapefileLayer, Object.assign({ label: trans.__('New Shapefile Layer'), isEnabled: () => {
389
+ return tracker.currentWidget
390
+ ? tracker.currentWidget.context.model.sharedModel.editable
391
+ : false;
392
+ }, execute: Private.createEntry({
393
+ tracker,
394
+ formSchemaRegistry,
395
+ title: 'Create Shapefile Layer',
396
+ createLayer: true,
397
+ createSource: true,
398
+ sourceData: { name: 'Custom Shapefile Source' },
399
+ layerData: { name: 'Custom Shapefile Layer' },
400
+ sourceType: 'ShapefileSource',
401
+ layerType: 'VectorLayer'
402
+ }) }, icons.get(CommandIDs.newShapefileLayer)));
403
+ /**
404
+ * LAYERS and LAYER GROUP actions.
405
+ */
406
+ commands.addCommand(CommandIDs.renameLayer, {
407
+ label: trans.__('Rename Layer'),
408
+ execute: async () => {
409
+ var _a;
410
+ const model = (_a = tracker.currentWidget) === null || _a === void 0 ? void 0 : _a.context.model;
411
+ await Private.renameSelectedItem(model, 'layer', (layerId, newName) => {
412
+ const layer = model === null || model === void 0 ? void 0 : model.getLayer(layerId);
413
+ if (layer) {
414
+ layer.name = newName;
415
+ model === null || model === void 0 ? void 0 : model.sharedModel.updateLayer(layerId, layer);
416
+ }
417
+ });
418
+ }
419
+ });
420
+ commands.addCommand(CommandIDs.removeLayer, {
421
+ label: trans.__('Remove Layer'),
422
+ execute: () => {
423
+ var _a;
424
+ const model = (_a = tracker.currentWidget) === null || _a === void 0 ? void 0 : _a.context.model;
425
+ Private.removeSelectedItems(model, 'layer', selection => {
426
+ model === null || model === void 0 ? void 0 : model.removeLayer(selection);
427
+ });
428
+ }
429
+ });
430
+ commands.addCommand(CommandIDs.renameGroup, {
431
+ label: trans.__('Rename Group'),
432
+ execute: async () => {
433
+ var _a;
434
+ const model = (_a = tracker.currentWidget) === null || _a === void 0 ? void 0 : _a.context.model;
435
+ await Private.renameSelectedItem(model, 'group', (groupName, newName) => {
436
+ model === null || model === void 0 ? void 0 : model.renameLayerGroup(groupName, newName);
437
+ });
438
+ }
439
+ });
440
+ commands.addCommand(CommandIDs.removeGroup, {
441
+ label: trans.__('Remove Group'),
442
+ execute: async () => {
443
+ var _a;
444
+ const model = (_a = tracker.currentWidget) === null || _a === void 0 ? void 0 : _a.context.model;
445
+ Private.removeSelectedItems(model, 'group', selection => {
446
+ model === null || model === void 0 ? void 0 : model.removeLayerGroup(selection);
447
+ });
448
+ }
449
+ });
450
+ commands.addCommand(CommandIDs.moveLayersToGroup, {
451
+ label: args => args['label'] ? args['label'] : trans.__('Move to Root'),
452
+ execute: args => {
453
+ var _a, _b, _c;
454
+ const model = (_a = tracker.currentWidget) === null || _a === void 0 ? void 0 : _a.context.model;
455
+ const groupName = args['label'];
456
+ 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;
457
+ if (!selectedLayers) {
458
+ return;
459
+ }
460
+ model.moveItemsToGroup(Object.keys(selectedLayers), groupName);
461
+ }
462
+ });
463
+ commands.addCommand(CommandIDs.moveLayerToNewGroup, {
464
+ label: trans.__('Move Selected Layers to New Group'),
465
+ execute: async () => {
466
+ var _a, _b, _c;
467
+ const model = (_a = tracker.currentWidget) === null || _a === void 0 ? void 0 : _a.context.model;
468
+ 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;
469
+ if (!selectedLayers) {
470
+ return;
471
+ }
472
+ function newGroupName() {
473
+ const input = document.createElement('input');
474
+ input.classList.add('jp-gis-left-panel-input');
475
+ input.style.marginLeft = '26px';
476
+ const panel = document.getElementById('jp-gis-layer-tree');
477
+ if (!panel) {
478
+ return;
479
+ }
480
+ panel.appendChild(input);
481
+ input.focus();
482
+ return new Promise(resolve => {
483
+ input.addEventListener('blur', () => {
484
+ panel.removeChild(input);
485
+ resolve(input.value);
486
+ });
487
+ input.addEventListener('keydown', (event) => {
488
+ if (event.key === 'Enter') {
489
+ event.stopPropagation();
490
+ event.preventDefault();
491
+ input.blur();
492
+ }
493
+ else if (event.key === 'Escape') {
494
+ event.stopPropagation();
495
+ event.preventDefault();
496
+ input.blur();
497
+ }
498
+ });
499
+ });
500
+ }
501
+ const newName = await newGroupName();
502
+ if (!newName) {
503
+ console.warn('New name cannot be empty');
504
+ return;
505
+ }
506
+ const layers = [];
507
+ Object.keys(selectedLayers).forEach(key => {
508
+ layers.push(key);
509
+ });
510
+ const newLayerGroup = {
511
+ name: newName,
512
+ layers: layers
513
+ };
514
+ model.addNewLayerGroup(selectedLayers, newLayerGroup);
515
+ }
516
+ });
517
+ /**
518
+ * Source actions
519
+ */
520
+ commands.addCommand(CommandIDs.renameSource, {
521
+ label: trans.__('Rename Source'),
522
+ execute: async () => {
523
+ var _a;
524
+ const model = (_a = tracker.currentWidget) === null || _a === void 0 ? void 0 : _a.context.model;
525
+ await Private.renameSelectedItem(model, 'source', (sourceId, newName) => {
526
+ const source = model === null || model === void 0 ? void 0 : model.getSource(sourceId);
527
+ if (source) {
528
+ source.name = newName;
529
+ model === null || model === void 0 ? void 0 : model.sharedModel.updateSource(sourceId, source);
530
+ }
531
+ });
532
+ }
533
+ });
534
+ commands.addCommand(CommandIDs.removeSource, {
535
+ label: trans.__('Remove Source'),
536
+ execute: () => {
537
+ var _a;
538
+ const model = (_a = tracker.currentWidget) === null || _a === void 0 ? void 0 : _a.context.model;
539
+ Private.removeSelectedItems(model, 'source', selection => {
540
+ var _a;
541
+ if (!((_a = model === null || model === void 0 ? void 0 : model.getLayersBySource(selection).length) !== null && _a !== void 0 ? _a : true)) {
542
+ model === null || model === void 0 ? void 0 : model.sharedModel.removeSource(selection);
543
+ }
544
+ else {
545
+ showErrorMessage('Remove source error', 'The source is used by a layer.');
546
+ }
547
+ });
548
+ }
549
+ });
550
+ /**
551
+ * Terrain commands
552
+ */
553
+ commands.addCommand(CommandIDs.newTerrain, Object.assign({ label: trans.__('New Terrain'), isEnabled: () => {
554
+ return tracker.currentWidget
555
+ ? tracker.currentWidget.context.model.sharedModel.editable
556
+ : false;
557
+ }, execute: Private.createTerrainDialog(tracker) }, icons.get(CommandIDs.newTerrain)));
558
+ commands.addCommand(CommandIDs.removeTerrain, {
559
+ label: trans.__('Remove Terrain'),
560
+ isEnabled: () => {
561
+ return tracker.currentWidget
562
+ ? tracker.currentWidget.context.model.sharedModel.editable
563
+ : false;
564
+ },
565
+ execute: () => {
566
+ var _a;
567
+ (_a = tracker.currentWidget) === null || _a === void 0 ? void 0 : _a.context.model.setTerrain({
568
+ source: '',
569
+ exaggeration: 0
570
+ });
571
+ }
572
+ });
573
+ // Console commands
574
+ commands.addCommand(CommandIDs.toggleConsole, {
575
+ label: trans.__('Toggle console'),
576
+ isEnabled: () => {
577
+ return tracker.currentWidget
578
+ ? tracker.currentWidget.context.model.sharedModel.editable
579
+ : false;
580
+ },
581
+ execute: async () => await Private.toggleConsole(tracker)
582
+ });
583
+ commands.addCommand(CommandIDs.executeConsole, {
584
+ label: trans.__('Execute console'),
585
+ isEnabled: () => {
586
+ return tracker.currentWidget
587
+ ? tracker.currentWidget.context.model.sharedModel.editable
588
+ : false;
589
+ },
590
+ execute: () => Private.executeConsole(tracker)
591
+ });
592
+ commands.addCommand(CommandIDs.removeConsole, {
593
+ label: trans.__('Remove console'),
594
+ isEnabled: () => {
595
+ return tracker.currentWidget
596
+ ? tracker.currentWidget.context.model.sharedModel.editable
597
+ : false;
598
+ },
599
+ execute: () => Private.removeConsole(tracker)
600
+ });
601
+ commands.addCommand(CommandIDs.invokeCompleter, {
602
+ label: trans.__('Display the completion helper.'),
603
+ execute: () => {
604
+ var _a;
605
+ const currentWidget = tracker.currentWidget;
606
+ if (!currentWidget || !completionProviderManager) {
607
+ return;
608
+ }
609
+ const id = (_a = currentWidget.content.consolePanel) === null || _a === void 0 ? void 0 : _a.id;
610
+ if (id) {
611
+ return completionProviderManager.invoke(id);
612
+ }
613
+ }
614
+ });
615
+ commands.addCommand(CommandIDs.selectCompleter, {
616
+ label: trans.__('Select the completion suggestion.'),
617
+ execute: () => {
618
+ var _a;
619
+ const currentWidget = tracker.currentWidget;
620
+ if (!currentWidget || !completionProviderManager) {
621
+ return;
622
+ }
623
+ const id = (_a = currentWidget.content.consolePanel) === null || _a === void 0 ? void 0 : _a.id;
624
+ if (id) {
625
+ return completionProviderManager.select(id);
626
+ }
627
+ }
628
+ });
629
+ }
630
+ var Private;
631
+ (function (Private) {
632
+ function createLayerBrowser(tracker, layerBrowserRegistry, formSchemaRegistry) {
633
+ return async () => {
634
+ const current = tracker.currentWidget;
635
+ if (!current) {
636
+ return;
637
+ }
638
+ const dialog = new LayerBrowserWidget({
639
+ context: current.context,
640
+ registry: layerBrowserRegistry.getRegistryLayers(),
641
+ formSchemaRegistry
642
+ });
643
+ await dialog.launch();
644
+ };
645
+ }
646
+ Private.createLayerBrowser = createLayerBrowser;
647
+ function createTerrainDialog(tracker) {
648
+ return async () => {
649
+ const current = tracker.currentWidget;
650
+ if (!current) {
651
+ return;
652
+ }
653
+ const dialog = new TerrainDialogWidget({
654
+ context: current.context
655
+ });
656
+ await dialog.launch();
657
+ };
658
+ }
659
+ Private.createTerrainDialog = createTerrainDialog;
660
+ function createSymbologyDialog(tracker, state) {
661
+ return async () => {
662
+ const current = tracker.currentWidget;
663
+ if (!current) {
664
+ return;
665
+ }
666
+ const dialog = new SymbologyWidget({
667
+ context: current.context,
668
+ state
669
+ });
670
+ await dialog.launch();
671
+ };
672
+ }
673
+ Private.createSymbologyDialog = createSymbologyDialog;
674
+ function createEntry({ tracker, formSchemaRegistry, title, createLayer, createSource, sourceData, layerData, sourceType, layerType }) {
675
+ return async () => {
676
+ const current = tracker.currentWidget;
677
+ if (!current) {
678
+ return;
679
+ }
680
+ const dialog = new CreationFormDialog({
681
+ context: current.context,
682
+ title,
683
+ createLayer,
684
+ createSource,
685
+ sourceData,
686
+ sourceType,
687
+ layerData,
688
+ layerType,
689
+ formSchemaRegistry
690
+ });
691
+ await dialog.launch();
692
+ };
693
+ }
694
+ Private.createEntry = createEntry;
695
+ async function getUserInputForRename(text, input, original) {
696
+ const parent = text.parentElement;
697
+ parent.replaceChild(input, text);
698
+ input.value = original;
699
+ input.select();
700
+ input.focus();
701
+ return new Promise(resolve => {
702
+ input.addEventListener('blur', () => {
703
+ parent.replaceChild(text, input);
704
+ resolve(input.value);
705
+ });
706
+ input.addEventListener('keydown', (event) => {
707
+ if (event.key === 'Enter') {
708
+ event.stopPropagation();
709
+ event.preventDefault();
710
+ input.blur();
711
+ }
712
+ else if (event.key === 'Escape') {
713
+ event.stopPropagation();
714
+ event.preventDefault();
715
+ input.value = original;
716
+ input.blur();
717
+ text.focus();
718
+ }
719
+ });
720
+ });
721
+ }
722
+ Private.getUserInputForRename = getUserInputForRename;
723
+ function removeSelectedItems(model, itemTypeToRemove, removeFunction) {
724
+ var _a;
725
+ const selected = (_a = model === null || model === void 0 ? void 0 : model.localState) === null || _a === void 0 ? void 0 : _a.selected.value;
726
+ if (!selected) {
727
+ console.info('Nothing selected');
728
+ return;
729
+ }
730
+ for (const selection in selected) {
731
+ if (selected[selection].type === itemTypeToRemove) {
732
+ removeFunction(selection);
733
+ }
734
+ }
735
+ }
736
+ Private.removeSelectedItems = removeSelectedItems;
737
+ async function renameSelectedItem(model, itemType, callback) {
738
+ var _a;
739
+ const selectedItems = (_a = model === null || model === void 0 ? void 0 : model.localState) === null || _a === void 0 ? void 0 : _a.selected.value;
740
+ if (!selectedItems) {
741
+ console.error(`No ${itemType} selected`);
742
+ return;
743
+ }
744
+ let itemId = '';
745
+ // If more then one item is selected, only rename the first
746
+ for (const id in selectedItems) {
747
+ if (selectedItems[id].type === itemType) {
748
+ itemId = id;
749
+ break;
750
+ }
751
+ }
752
+ if (!itemId) {
753
+ return;
754
+ }
755
+ const nodeId = selectedItems[itemId].selectedNodeId;
756
+ if (!nodeId) {
757
+ return;
758
+ }
759
+ const node = document.getElementById(nodeId);
760
+ if (!node) {
761
+ console.warn(`Node with ID ${nodeId} not found`);
762
+ return;
763
+ }
764
+ const edit = document.createElement('input');
765
+ edit.classList.add('jp-gis-left-panel-input');
766
+ const originalName = node.innerText;
767
+ const newName = await Private.getUserInputForRename(node, edit, originalName);
768
+ if (!newName) {
769
+ console.warn('New name cannot be empty');
770
+ return;
771
+ }
772
+ if (newName !== originalName) {
773
+ callback(itemId, newName);
774
+ }
775
+ }
776
+ Private.renameSelectedItem = renameSelectedItem;
777
+ function executeConsole(tracker) {
778
+ const current = tracker.currentWidget;
779
+ if (!current) {
780
+ return;
781
+ }
782
+ current.content.executeConsole();
783
+ }
784
+ Private.executeConsole = executeConsole;
785
+ function removeConsole(tracker) {
786
+ const current = tracker.currentWidget;
787
+ if (!current) {
788
+ return;
789
+ }
790
+ current.content.removeConsole();
791
+ }
792
+ Private.removeConsole = removeConsole;
793
+ async function toggleConsole(tracker) {
794
+ const current = tracker.currentWidget;
795
+ if (!current) {
796
+ return;
797
+ }
798
+ const currentPath = current.context.path.split(':');
799
+ let realPath = '';
800
+ if (currentPath.length > 1) {
801
+ realPath = currentPath[1];
802
+ }
803
+ else {
804
+ realPath = currentPath[0];
805
+ }
806
+ await current.content.toggleConsole(realPath);
807
+ }
808
+ Private.toggleConsole = toggleConsole;
809
+ })(Private || (Private = {}));