@disy/cadenza.js 2.2.2 → 2.3.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 (43) hide show
  1. package/CHANGELOG.md +17 -2
  2. package/README.md +1 -322
  3. package/apidoc/assets/highlight.css +0 -7
  4. package/apidoc/assets/main.js +2 -2
  5. package/apidoc/assets/navigation.js +1 -1
  6. package/apidoc/assets/search.js +1 -1
  7. package/apidoc/assets/style.css +46 -15
  8. package/apidoc/classes/AbortError.html +3 -3
  9. package/apidoc/classes/CadenzaClient.html +68 -89
  10. package/apidoc/classes/CadenzaError.html +8 -6
  11. package/apidoc/functions/cadenza.html +6 -5
  12. package/apidoc/index.html +152 -9
  13. package/apidoc/interfaces/CadenzaEvent.html +6 -6
  14. package/apidoc/interfaces/ExternalLinkKey.html +6 -3
  15. package/apidoc/interfaces/Geometry.html +2 -2
  16. package/apidoc/interfaces/PageSource.html +2 -2
  17. package/apidoc/modules.html +14 -2
  18. package/apidoc/types/CadenzaChangeSelectionEvent.html +2 -0
  19. package/apidoc/types/CadenzaDrillThroughEvent.html +7 -0
  20. package/apidoc/types/CadenzaEditGeometryCancelEvent.html +2 -0
  21. package/apidoc/types/CadenzaEditGeometryOkEvent.html +2 -0
  22. package/apidoc/types/CadenzaEditGeometryUpdateEvent.html +2 -0
  23. package/apidoc/types/CadenzaErrorEvent.html +2 -2
  24. package/apidoc/types/CadenzaEventByType.html +1 -0
  25. package/apidoc/types/CadenzaEventType.html +2 -0
  26. package/apidoc/types/CadenzaObjectInfoEvent.html +2 -0
  27. package/apidoc/types/CadenzaSelectObjectsCancelEvent.html +2 -0
  28. package/apidoc/types/CadenzaSelectObjectsOkEvent.html +2 -0
  29. package/apidoc/types/DataType.html +3 -2
  30. package/apidoc/types/EmbeddingTargetId.html +9 -2
  31. package/apidoc/types/Extent.html +1 -1
  32. package/apidoc/types/FilterVariables.html +5 -2
  33. package/apidoc/types/GeometryType.html +1 -1
  34. package/apidoc/types/GlobalId.html +2 -2
  35. package/apidoc/types/OpaqueString.html +6 -0
  36. package/apidoc/types/OperationMode.html +1 -1
  37. package/apidoc/types/TablePart.html +1 -1
  38. package/apidoc/types/UiFeature.html +3 -3
  39. package/apidoc/types/WorkbookLayerPath.html +3 -0
  40. package/cadenza.d.ts +321 -56
  41. package/cadenza.js +349 -71
  42. package/package.json +6 -6
  43. package/sandbox.html +197 -31
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@disy/cadenza.js",
3
- "version": "2.2.2",
3
+ "version": "2.3.0",
4
4
  "license": "Apache-2.0",
5
5
  "repository": "github:DisyInformationssysteme/cadenza.js",
6
6
  "type": "module",
@@ -30,18 +30,18 @@
30
30
  "sandbox": "node ./sandbox.cjs"
31
31
  },
32
32
  "devDependencies": {
33
- "@types/jest": "29.5.8",
33
+ "@types/jest": "29.5.11",
34
34
  "cross-env": "7.0.3",
35
- "gh-pages": "6.0.0",
35
+ "gh-pages": "6.1.1",
36
36
  "http-server": "14.1.1",
37
37
  "jest": "29.7.0",
38
38
  "jest-environment-jsdom": "29.7.0",
39
- "keep-a-changelog": "2.5.2",
39
+ "keep-a-changelog": "2.5.3",
40
40
  "npm-run-all": "4.1.5",
41
41
  "onchange": "7.1.0",
42
- "prettier": "3.1.0",
42
+ "prettier": "3.2.2",
43
43
  "ts-jest": "29.1.1",
44
- "typedoc": "0.25.3"
44
+ "typedoc": "0.25.7"
45
45
  },
46
46
  "volta": {
47
47
  "node": "16.13.1"
package/sandbox.html CHANGED
@@ -7,6 +7,11 @@
7
7
  <title>Cadenza JS Development Sandbox</title>
8
8
 
9
9
  <style>
10
+ :root {
11
+ --bg: #eee;
12
+ --gap: 12px;
13
+ --padding: 16px;
14
+ }
10
15
  * {
11
16
  box-sizing: border-box;
12
17
  }
@@ -14,21 +19,26 @@
14
19
  height: 100%;
15
20
  }
16
21
  body {
17
- display: flex;
22
+ display: grid;
23
+ grid-template-areas:
24
+ 'aside main'
25
+ 'footer footer';
26
+ grid-template-columns: 368px 1fr;
27
+ grid-template-rows: 1fr auto;
18
28
  margin: 0;
19
29
  }
20
- aside, main {
21
- padding: 16px;
22
- }
23
30
  aside {
24
- background: #eee;
31
+ background: var(--bg);
32
+ grid-area: aside;
25
33
  overflow: hidden auto;
26
- width: 368px;
34
+ }
35
+ form {
36
+ padding-inline: var(--padding);
27
37
  }
28
38
  form, fieldset {
29
39
  display: flex;
30
40
  flex-direction: column;
31
- gap: 12px;
41
+ gap: var(--gap);
32
42
  }
33
43
  fieldset > div {
34
44
  display: flex;
@@ -40,12 +50,28 @@
40
50
  flex-direction: column;
41
51
  gap: 4px;
42
52
 
43
- & > * {
53
+ > * {
44
54
  margin-block: 0;
45
55
  }
46
56
  }
57
+ .action-container {
58
+ align-items: end;
59
+ background: var(--bg);
60
+ border-bottom: 2px solid gray;
61
+ display: flex;
62
+ gap: 4px;
63
+ padding-bottom: var(--gap);
64
+ padding-top: var(--padding);
65
+ position: sticky;
66
+ top: 0;
67
+
68
+ > :first-child {
69
+ flex: 1;
70
+ }
71
+ }
47
72
  main {
48
- flex: 1;
73
+ grid-area: main;
74
+ padding: var(--padding);
49
75
  }
50
76
  iframe {
51
77
  border: 4px solid #eee;
@@ -55,10 +81,25 @@
55
81
  label {
56
82
  font-weight: 600;
57
83
  }
84
+ hr:first-child {
85
+ display: none;
86
+ }
58
87
  select, input:is(:not([type]), [type=text], [type=number]), textarea, hr {
59
88
  display: block;
60
89
  width: 100%
61
90
  }
91
+ footer {
92
+ background: var(--bg);
93
+ display: flex;
94
+ font-size: small;
95
+ grid-area: footer;
96
+ justify-content: space-between;
97
+ padding: 4px var(--padding);
98
+
99
+ > * {
100
+ margin: 0;
101
+ }
102
+ }
62
103
  </style>
63
104
 
64
105
  <script type="module">
@@ -96,10 +137,25 @@
96
137
  const actionHandlers = {
97
138
  show: data => cadenzaClient.show(data.embeddingTargetId, getOptions(data)),
98
139
  showPage: data => cadenzaClient.show({ page: data.page }, getOptions(data)),
99
- expandNavigator: data => cadenzaClient.expandNavigator(data.expandNavigator === 'on'),
100
140
  showMap: data => cadenzaClient.showMap(data.embeddingTargetId, getOptions(data)),
141
+ expandNavigator: data => cadenzaClient.expandNavigator(data.expandNavigator === 'on'),
142
+ getData: async data => {
143
+ const dataType = data.dataType;
144
+ const result = await cadenzaClient.getData(dataType);
145
+ if (dataType === 'png') {
146
+ const url = URL.createObjectURL(result);
147
+ iframe.src = url;
148
+ URL.revokeObjectURL(url);
149
+ }
150
+ },
151
+ setFilter: data => cadenzaClient.setFilter(parseFilterVariables(data.filter)),
152
+ setLayerVisibility: data => cadenzaClient.setLayerVisibility(JSON.parse(data.layer), data.visibility === 'on'),
153
+ setSelection: data => cadenzaClient.setSelection(JSON.parse(data.layer), JSON.parse(data.values)),
154
+ addSelection: data => cadenzaClient.addSelection(JSON.parse(data.layer), JSON.parse(data.values)),
155
+ removeSelection: data => cadenzaClient.removeSelection(JSON.parse(data.layer), JSON.parse(data.values)),
101
156
  createGeometry: data => cadenzaClient.createGeometry(data.embeddingTargetId, data.geometryType, getOptions(data)),
102
- editGeometry: data => cadenzaClient.editGeometry(data.embeddingTargetId, JSON.parse(data.geometry), getOptions(data)),
157
+ editGeometry: ({ geometry, ...data }) => cadenzaClient.editGeometry(data.embeddingTargetId, JSON.parse(geometry), getOptions(data)),
158
+ selectObjects: data => cadenzaClient.selectObjects(data.embeddingTargetId, getOptions(data)),
103
159
  fetchData: data => {
104
160
  console.log('Inspect the fetchData() request in the devtools.');
105
161
  cadenzaClient.fetchData(data.embeddingTargetId, data.dataType, getOptions(data));
@@ -146,6 +202,7 @@
146
202
  mapExtent,
147
203
  minScale,
148
204
  parts,
205
+ layers,
149
206
  simplifiedOperationMode,
150
207
  useMapSrs
151
208
  }) {
@@ -161,10 +218,11 @@
161
218
  ...(jasperReportAsPdf === 'on' && { dataType: 'pdf' }),
162
219
  labelSet,
163
220
  locationFinder,
164
- mapExtent: mapExtent && mapExtent.split(','),
165
- minScale,
221
+ mapExtent: mapExtent && mapExtent.split(',').map(Number),
222
+ minScale: minScale && Number(minScale),
166
223
  parts: parts && parts.split(','),
167
224
  ...(simplifiedOperationMode === 'on' && { operationMode: 'simplified' }),
225
+ layers: layers ? JSON.parse(layers) : undefined,
168
226
  useMapSrs: useMapSrs === 'on'
169
227
  };
170
228
  }
@@ -174,7 +232,7 @@
174
232
  if (value === '{{currentDate}}') { // convenience for current date
175
233
  return new Date();
176
234
  }
177
- if (value.match?.(/....-..-..T..:..:..\....Z/)) {
235
+ if (value?.match?.(/....-..-..T..:..:..\....Z/)) {
178
236
  return new Date(value);
179
237
  }
180
238
  return value;
@@ -186,24 +244,40 @@
186
244
 
187
245
  <aside>
188
246
  <form id="form">
189
- <div>
190
- <label for="action">Action</label>
191
- <select name="action" id="action">
192
- <option value="show">Show</option>
193
- <option value="showPage">Show Page</option>
194
- <option value="expandNavigator">Expand Navigator</option>
195
- <option value="showMap">Show Map</option>
196
- <option value="createGeometry">Create Geometry</option>
197
- <option value="editGeometry">Edit Geometry</option>
198
- <option value="downloadData">Download data</option>
199
- <option value="fetchData">Fetch data</option>
200
- </select>
201
- </div>
247
+ <div class="action-container">
248
+ <div>
249
+ <label for="action">Action</label>
250
+ <select name="action" id="action">
251
+ <optgroup label="Show">
252
+ <option value="show">Show</option>
253
+ <option value="showPage">Show Page</option>
254
+ <option value="showMap">Show Map</option>
255
+ </optgroup>
256
+ <optgroup label="Interact With Shown Content">
257
+ <option value="expandNavigator">Expand Navigator</option>
258
+ <!--option value="getData">Get Data (Get Map Image)</option-->
259
+ <!--option value="setFilter">Set Filter</option-->
260
+ <!--option value="setLayerVisibility">Set Layer Visibility</option-->
261
+ <!--option value="setSelection">Set Selection</option-->
262
+ <!--option value="addSelection">Add Selection</option-->
263
+ <!--option value="removeSelection">Remove Selection</option-->
264
+ </optgroup>
265
+ <optgroup label="Map Dialogs">
266
+ <option value="createGeometry">Create Geometry</option>
267
+ <option value="editGeometry">Edit Geometry</option>
268
+ <option value="selectObjects">Select Objects</option>
269
+ </optgroup>
270
+ <optgroup label="Without Iframe">
271
+ <option value="downloadData">Download data</option>
272
+ <option value="fetchData">Fetch data</option>
273
+ </optgroup>
274
+ </select>
275
+ </div>
202
276
 
203
- <fieldset id="settings">
204
- </fieldset>
277
+ <button>Go!</button>
278
+ </div>
205
279
 
206
- <button>Go!</button>
280
+ <fieldset id="settings"></fieldset>
207
281
  </form>
208
282
  </aside>
209
283
 
@@ -211,6 +285,11 @@
211
285
  <iframe id="iframe"></iframe>
212
286
  </main>
213
287
 
288
+ <footer>
289
+ <a href="https://disyinformationssysteme.github.io/cadenza.js/" target="_blank" rel="noreferrer">Cadenza JS Documentation</a>
290
+ <p>Open the browser's devtools (<kbd>F12</kbd>) to see requests and events.</p>
291
+ </footer>
292
+
214
293
  <template id="common-show">
215
294
  <div>
216
295
  <label>
@@ -261,6 +340,7 @@
261
340
  <p>A JSON object with filter variable names and values</p>
262
341
  <p>Dates need to be ISO strings<br>(e.g. <code>"2023-11-17T17:12:06.175Z"</code>).<br>Use <code>"{{currentDate}}"</code> for the current date.</p>
263
342
  <p>Pass multiple values for an <code>IN</code> expression as <code>["a", "b", ...]</code></p>
343
+ <p>Pass <code>null</code> to unset a variable.</p>
264
344
  </small>
265
345
  </div>
266
346
  </template>
@@ -289,12 +369,19 @@
289
369
  <option>csv</option>
290
370
  <option>excel</option>
291
371
  <option>json</option>
292
- <option>pdf</option>
293
372
  </select>
294
373
  </div>
295
374
  <div>
296
375
  <label for="parts">Parts</label>
297
376
  <input name="parts" id="parts" placeholder="columns,values,totals">
377
+ <small>
378
+ A comma-separated list of parts. Supported parts are:
379
+ <ul>
380
+ <li>columns</li>
381
+ <li>values</li>
382
+ <li>totals</li>
383
+ </ul>
384
+ </small>
298
385
  </div>
299
386
  </template>
300
387
 
@@ -345,6 +432,19 @@
345
432
  </div>
346
433
  </template>
347
434
 
435
+ <template data-action="setFilter">
436
+ <div>
437
+ <label for="filter">Filter *</label>
438
+ <textarea name="filter" id="filter" rows="3" required></textarea>
439
+ <small>
440
+ <p>A JSON object with filter variable names and values</p>
441
+ <p>Dates need to be ISO strings<br>(e.g. <code>"2023-11-17T17:12:06.175Z"</code>).<br>Use <code>"{{currentDate}}"</code> for the current date.</p>
442
+ <p>Pass multiple values for an <code>IN</code> expression as <code>["a", "b", ...]</code></p>
443
+ <p>Pass <code>null</code> to unset a variable.</p>
444
+ </small>
445
+ </div>
446
+ </template>
447
+
348
448
  <template data-action="createGeometry" data-common="map">
349
449
  <div>
350
450
  <label for="embeddingTargetId">Embedding target ID of the map view *</label>
@@ -382,6 +482,59 @@
382
482
  </div>
383
483
  </template>
384
484
 
485
+ <template data-action="selectObjects" data-common="map">
486
+ <div>
487
+ <label for="embeddingTargetId">Embedding target ID of the map view *</label>
488
+ <input name="embeddingTargetId" id="embeddingTargetId" required>
489
+ </div>
490
+ <div>
491
+ <label for="layers">Layers</label>
492
+ <input name="layers" id="layers">
493
+ <small>
494
+ <p>
495
+ A JSON value like <code>["{layerPrintName}",...]</code> or
496
+ <code>[["{layerGroupPrintName}","{layerPrintName}"],...]</code>
497
+ </p>
498
+ </small>
499
+ </div>
500
+ </template>
501
+
502
+ <template data-action="setLayerVisibility" data-common="layer">
503
+ <div>
504
+ <label>
505
+ <input type="checkbox" name="visibility">
506
+ Visible
507
+ </label>
508
+ </div>
509
+ </template>
510
+
511
+ <template data-action="setSelection" data-common="layer,layer-selection"></template>
512
+ <template data-action="addSelection" data-common="layer,layer-selection"></template>
513
+ <template data-action="removeSelection" data-common="layer,layer-selection"></template>
514
+
515
+ <template id="common-layer-selection">
516
+ <div>
517
+ <label for="values">List of Object IDs *</label>
518
+ <textarea name="values" id="values" rows="5" required></textarea>
519
+ <small>
520
+ <p>A JSON value like <code>["object1","object2"]</code></p>
521
+ </small>
522
+ </div>
523
+ </template>
524
+
525
+ <template id="common-layer">
526
+ <div>
527
+ <label for="layer">Layer *</label>
528
+ <input name="layer" id="layer" required>
529
+ <small>
530
+ <p>
531
+ A JSON value like <code>"{layerPrintName}"</code> or
532
+ <code>["{layerGroupPrintName}","{layerPrintName}"]</code>
533
+ </p>
534
+ </small>
535
+ </div>
536
+ </template>
537
+
385
538
  <template data-action="downloadData" data-common="data">
386
539
  <div>
387
540
  <label for="embeddingTargetId">Embedding target ID *</label>
@@ -400,5 +553,18 @@
400
553
  </div>
401
554
  </template>
402
555
 
556
+ <template data-action="getData">
557
+ <div>
558
+ <label for="dataType">Data type</label>
559
+ <select name="dataType" id="dataType" disabled>
560
+ <option>png</option>
561
+ </select>
562
+ <input type="hidden" name="dataType" value="png">
563
+ <small>
564
+ <p>Currently, only <code>dataType=png</code> is supported to get the image of the currently shown workbook map view.</p>
565
+ </small>
566
+ </div>
567
+ </template>
568
+
403
569
  </body>
404
570
  </html>