@abi-software/scaffoldvuer 1.1.0-beta.1 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/scaffoldvuer.js +10584 -10202
- package/dist/scaffoldvuer.umd.cjs +163 -163
- package/dist/style.css +1 -1
- package/package.json +3 -3
- package/src/App.vue +158 -30
- package/src/components/HelpModeDialog.vue +360 -0
- package/src/components/ScaffoldVuer.vue +176 -35
- package/src/components/index.js +3 -1
- package/src/components.d.ts +1 -0
- package/src/scripts/OrgansRenderer.js +1 -2
- package/src/scripts/Utilities.js +0 -2
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@abi-software/scaffoldvuer",
|
|
3
|
-
"version": "1.1.0
|
|
3
|
+
"version": "1.1.0",
|
|
4
4
|
"license": "Apache-2.0",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -41,7 +41,7 @@
|
|
|
41
41
|
"*.js"
|
|
42
42
|
],
|
|
43
43
|
"dependencies": {
|
|
44
|
-
"@abi-software/flatmapvuer": "^1.1.0
|
|
44
|
+
"@abi-software/flatmapvuer": "^1.1.0",
|
|
45
45
|
"@abi-software/sparc-annotation": "^0.3.1",
|
|
46
46
|
"@abi-software/svg-sprite": "^1.0.0",
|
|
47
47
|
"@element-plus/icons-vue": "^2.3.1",
|
|
@@ -55,7 +55,7 @@
|
|
|
55
55
|
"vue": "^3.4.15",
|
|
56
56
|
"vue-router": "^4.2.5",
|
|
57
57
|
"vue3-component-svg-sprite": "^0.0.1",
|
|
58
|
-
"zincjs": "^1.
|
|
58
|
+
"zincjs": "^1.6.0"
|
|
59
59
|
},
|
|
60
60
|
"devDependencies": {
|
|
61
61
|
"@vitejs/plugin-vue": "^4.6.2",
|
package/src/App.vue
CHANGED
|
@@ -2,15 +2,50 @@
|
|
|
2
2
|
<div id="app">
|
|
3
3
|
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Asap:400,400i,500,600,700&display=swap" />
|
|
4
4
|
<drop-zone ref="dropzone" @files-drop="onFilesDrop">
|
|
5
|
-
<ScaffoldVuer
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
:
|
|
10
|
-
|
|
11
|
-
|
|
5
|
+
<ScaffoldVuer
|
|
6
|
+
v-if="url"
|
|
7
|
+
ref="scaffold"
|
|
8
|
+
class="vuer"
|
|
9
|
+
:flatmapAPI="flatmapAPI"
|
|
10
|
+
:display-u-i="displayUI"
|
|
11
|
+
:url="url"
|
|
12
|
+
:help-mode="helpMode"
|
|
13
|
+
:helpModeDialog="useHelpModeDialog"
|
|
14
|
+
:helpModeActiveItem="helpModeActiveItem"
|
|
15
|
+
@help-mode-last-item="onHelpModeLastItem"
|
|
16
|
+
@shown-tooltip="onTooltipShown"
|
|
17
|
+
@shown-map-tooltip="onMapTooltipShown"
|
|
18
|
+
:display-latest-changes="true"
|
|
19
|
+
:display-minimap="displayMinimap"
|
|
20
|
+
:display-markers="displayMarkers"
|
|
21
|
+
:enableOpenMapUI="true"
|
|
22
|
+
:marker-cluster="markerCluster"
|
|
23
|
+
:minimap-settings="minimapSettings"
|
|
24
|
+
:show-colour-picker="showColourPicker"
|
|
25
|
+
:render="render"
|
|
26
|
+
:region="region"
|
|
27
|
+
:view-u-r-l="viewURL"
|
|
28
|
+
:format="format"
|
|
29
|
+
:marker-labels="markerLabels"
|
|
30
|
+
@open-map="openMap"
|
|
31
|
+
@on-ready="onReady"
|
|
32
|
+
@scaffold-selected="onSelected"
|
|
33
|
+
@scaffold-navigated="onNavigated"
|
|
34
|
+
@timeChanged="updateCurrentTime"
|
|
35
|
+
@zinc-object-added="objectAdded"
|
|
36
|
+
@vue:mounted="viewerMounted"
|
|
37
|
+
/>
|
|
12
38
|
</drop-zone>
|
|
13
39
|
|
|
40
|
+
<HelpModeDialog
|
|
41
|
+
v-if="helpMode && useHelpModeDialog"
|
|
42
|
+
ref="scaffoldHelp"
|
|
43
|
+
:scaffoldRef="scaffoldRef"
|
|
44
|
+
:lastItem="helpModeLastItem"
|
|
45
|
+
@show-next="onHelpModeShowNext"
|
|
46
|
+
@finish-help-mode="onFinishHelpMode"
|
|
47
|
+
/>
|
|
48
|
+
|
|
14
49
|
<el-popover popper-class="options-container" placement="bottom" trigger="click" width="500" :teleported="false">
|
|
15
50
|
<div>
|
|
16
51
|
<el-row :gutter="20">
|
|
@@ -22,13 +57,17 @@
|
|
|
22
57
|
</p>
|
|
23
58
|
</el-row>
|
|
24
59
|
<el-row :gutter="20">
|
|
25
|
-
<el-col :span="
|
|
60
|
+
<el-col :span="3" :offset="1">
|
|
26
61
|
<el-switch v-model="displayUI" active-text="UI" />
|
|
27
62
|
</el-col>
|
|
28
|
-
<el-col :span="
|
|
63
|
+
<el-col :span="4" :offset="1">
|
|
29
64
|
<el-switch v-model="displayMarkers" active-text="Markers" active-icon-class="el-icon-location"
|
|
30
65
|
active-color="#8300bf" />
|
|
31
66
|
</el-col>
|
|
67
|
+
<el-col :span="6" :offset="1">
|
|
68
|
+
<el-switch v-model="markerCluster" active-text="Marker Cluster" active-icon-class="el-icon-location"
|
|
69
|
+
active-color="#8300bf" />
|
|
70
|
+
</el-col>
|
|
32
71
|
<el-col :span="4" :offset="1">
|
|
33
72
|
<el-switch v-model="displayMinimap" active-text="Minimap" active-icon-class="el-icon-discover"
|
|
34
73
|
active-color="#8300bf" />
|
|
@@ -180,6 +219,7 @@ import {
|
|
|
180
219
|
ElSwitch as Switch,
|
|
181
220
|
} from "element-plus";
|
|
182
221
|
import { useRoute, useRouter } from 'vue-router'
|
|
222
|
+
import HelpModeDialog from './components/HelpModeDialog.vue';
|
|
183
223
|
|
|
184
224
|
let texture_prefix = undefined;
|
|
185
225
|
|
|
@@ -200,9 +240,12 @@ export default {
|
|
|
200
240
|
DropZone,
|
|
201
241
|
ScaffoldVuer,
|
|
202
242
|
ModelsTable,
|
|
243
|
+
HelpModeDialog,
|
|
203
244
|
},
|
|
204
245
|
data: function () {
|
|
205
246
|
return {
|
|
247
|
+
consoleOn: true,
|
|
248
|
+
createPoints: false,
|
|
206
249
|
url: undefined,
|
|
207
250
|
input: undefined,
|
|
208
251
|
displayUI: true,
|
|
@@ -217,6 +260,7 @@ export default {
|
|
|
217
260
|
tumbleOn: false,
|
|
218
261
|
tumbleDirection: [1.0, 0.0],
|
|
219
262
|
showColourPicker: true,
|
|
263
|
+
markerCluster: false,
|
|
220
264
|
minimapSettings: {
|
|
221
265
|
x_offset: 16,
|
|
222
266
|
y_offset: 50,
|
|
@@ -224,7 +268,57 @@ export default {
|
|
|
224
268
|
height: 128,
|
|
225
269
|
align: "top-right",
|
|
226
270
|
},
|
|
227
|
-
markerLabels: [
|
|
271
|
+
markerLabels: [
|
|
272
|
+
"Spinal cord",
|
|
273
|
+
"urinary bladder",
|
|
274
|
+
"lower urinary tract",
|
|
275
|
+
"Peripheral nervous system",
|
|
276
|
+
"Dorsal root ganglion",
|
|
277
|
+
"cervicothoracic ganglion",
|
|
278
|
+
"stomach",
|
|
279
|
+
"enteric ganglion",
|
|
280
|
+
"myenteric nerve plexus",
|
|
281
|
+
"colon",
|
|
282
|
+
"Enteric Nervous System",
|
|
283
|
+
"pelvic ganglion",
|
|
284
|
+
"celiac ganglion",
|
|
285
|
+
"jugular ganglion",
|
|
286
|
+
"vagus nerve",
|
|
287
|
+
"Brainstem",
|
|
288
|
+
"heart",
|
|
289
|
+
"larynx",
|
|
290
|
+
"inferior vagus X ganglion",
|
|
291
|
+
"mucosa of stomach",
|
|
292
|
+
"lung",
|
|
293
|
+
"pelvic splanchnic nerve",
|
|
294
|
+
"small intestine",
|
|
295
|
+
"type EC enteroendocrine cell",
|
|
296
|
+
"body proper",
|
|
297
|
+
"skin epidermis",
|
|
298
|
+
"Diaphragm",
|
|
299
|
+
"sinus venosus",
|
|
300
|
+
"esophagus",
|
|
301
|
+
"Solitary nucleus",
|
|
302
|
+
"urethra",
|
|
303
|
+
"sympathetic nervous system",
|
|
304
|
+
"superior cervical ganglion",
|
|
305
|
+
"cardiac nerve plexus",
|
|
306
|
+
"ganglion",
|
|
307
|
+
"pancreas",
|
|
308
|
+
"Brain",
|
|
309
|
+
"autonomic nervous system",
|
|
310
|
+
"lower digestive tract",
|
|
311
|
+
"adipose tissue",
|
|
312
|
+
"white adipose tissue",
|
|
313
|
+
"brown adipose tissue",
|
|
314
|
+
"kidney",
|
|
315
|
+
"liver",
|
|
316
|
+
"phrenic nerve",
|
|
317
|
+
"submandibular ganglion",
|
|
318
|
+
"bone tissue",
|
|
319
|
+
"sciatic nerve",
|
|
320
|
+
"glossopharyngeal nerve"
|
|
321
|
+
],
|
|
228
322
|
render: true,
|
|
229
323
|
region: "",
|
|
230
324
|
viewURL: "",
|
|
@@ -239,6 +333,11 @@ export default {
|
|
|
239
333
|
loadTextureVolumeOnReady: false,
|
|
240
334
|
readyCallback: undefined,
|
|
241
335
|
flatmapAPI: "https://mapcore-demo.org/devel/flatmap/v4/",
|
|
336
|
+
helpMode: false,
|
|
337
|
+
helpModeActiveItem: 0,
|
|
338
|
+
helpModeLastItem: false,
|
|
339
|
+
useHelpModeDialog: true,
|
|
340
|
+
scaffoldRef: null,
|
|
242
341
|
route: useRoute(),
|
|
243
342
|
router: useRouter(),
|
|
244
343
|
ElIconSetting: shallowRef(ElIconSetting),
|
|
@@ -261,6 +360,11 @@ export default {
|
|
|
261
360
|
syncMode: function (val) {
|
|
262
361
|
this.$refs.scaffold.toggleSyncControl(val);
|
|
263
362
|
},
|
|
363
|
+
helpMode: function (newVal) {
|
|
364
|
+
if (!newVal) {
|
|
365
|
+
this.helpModeActiveItem = 0;
|
|
366
|
+
}
|
|
367
|
+
},
|
|
264
368
|
},
|
|
265
369
|
mounted: function () {
|
|
266
370
|
this._objects = [];
|
|
@@ -298,8 +402,10 @@ export default {
|
|
|
298
402
|
});
|
|
299
403
|
},
|
|
300
404
|
objectAdded: function (zincObject) {
|
|
301
|
-
|
|
302
|
-
|
|
405
|
+
if (this.consoleOn) {
|
|
406
|
+
console.log(zincObject)
|
|
407
|
+
console.log(this.$refs.scaffold.$module.scene.getBoundingBox())
|
|
408
|
+
}
|
|
303
409
|
if (this._objects.length === 0) {
|
|
304
410
|
zincObject.setMarkerMode("on");
|
|
305
411
|
}
|
|
@@ -309,7 +415,9 @@ export default {
|
|
|
309
415
|
this._objects.push(zincObject);
|
|
310
416
|
},
|
|
311
417
|
openMap: function (map) {
|
|
312
|
-
|
|
418
|
+
if (this.consoleOn) {
|
|
419
|
+
console.log(map);
|
|
420
|
+
}
|
|
313
421
|
},
|
|
314
422
|
featureTextureVolume: async function (overlap) {
|
|
315
423
|
//this.$refs.scaffold.clearScene();
|
|
@@ -401,10 +509,12 @@ export default {
|
|
|
401
509
|
};
|
|
402
510
|
})
|
|
403
511
|
);
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
512
|
+
if (this.consoleOn) {
|
|
513
|
+
console.log(
|
|
514
|
+
"found suggestions",
|
|
515
|
+
this.$refs.scaffold.fetchSuggestions(term)
|
|
516
|
+
);
|
|
517
|
+
}
|
|
408
518
|
},
|
|
409
519
|
autoTumble: function () {
|
|
410
520
|
const flag = this.tumbleOn;
|
|
@@ -430,7 +540,7 @@ export default {
|
|
|
430
540
|
});
|
|
431
541
|
},
|
|
432
542
|
onReady: function () {
|
|
433
|
-
console.log(this.$refs.scaffold)
|
|
543
|
+
if (this.consoleOn) console.log(this.$refs.scaffold)
|
|
434
544
|
if (this.readyCallback) {
|
|
435
545
|
this.readyCallback(this.$refs.scaffold, texture_prefix);
|
|
436
546
|
this.readyCallback = undefined;
|
|
@@ -441,6 +551,7 @@ export default {
|
|
|
441
551
|
testArmSlides(this.$refs.scaffold);
|
|
442
552
|
}
|
|
443
553
|
}
|
|
554
|
+
this.scaffoldRef = this.$refs.scaffold;
|
|
444
555
|
},
|
|
445
556
|
addLines: function (coord) {
|
|
446
557
|
if (this.coordinatesClicked.length === 1) {
|
|
@@ -451,30 +562,23 @@ export default {
|
|
|
451
562
|
0x00ee22,
|
|
452
563
|
);
|
|
453
564
|
this.coordinatesClicked.length = 0;
|
|
454
|
-
console.log(returned);
|
|
565
|
+
if (this.consoleOn) console.log(returned);
|
|
455
566
|
} else {
|
|
456
567
|
this.coordinatesClicked.push(coord);
|
|
457
568
|
}
|
|
458
569
|
},
|
|
459
570
|
onSelected: function (data) {
|
|
460
|
-
|
|
461
571
|
if (data && data.length > 0 && data[0].data.group) {
|
|
462
|
-
console.log(data[0]
|
|
463
|
-
|
|
464
|
-
if (data[0].worldCoords) {
|
|
465
|
-
console.log(data[0].data);
|
|
572
|
+
if (this.consoleOn) console.log(data[0]);
|
|
573
|
+
if (this.createPoints && data[0].extraData.worldCoords) {
|
|
466
574
|
const returned = this.$refs.scaffold.$module.scene.createPoints(
|
|
467
575
|
"test",
|
|
468
576
|
"points",
|
|
469
|
-
[data[0].worldCoords],
|
|
577
|
+
[data[0].extraData.worldCoords],
|
|
470
578
|
undefined,
|
|
471
579
|
0x0022ee,
|
|
472
580
|
);
|
|
473
|
-
|
|
474
|
-
console.log(data[0].worldCoords)
|
|
475
|
-
this.addLines(data[0].worldCoords);
|
|
476
581
|
}
|
|
477
|
-
*/
|
|
478
582
|
delete this.route.query["viewURL"];
|
|
479
583
|
this.$refs.scaffold.showRegionTooltipWithAnnotations(data, false, true);
|
|
480
584
|
if (this.onClickMarkers) this.$refs.scaffold.setMarkerModeForObjectsWithName(data[0].data.group, "on");
|
|
@@ -538,7 +642,31 @@ export default {
|
|
|
538
642
|
this.viewURL = "";
|
|
539
643
|
}
|
|
540
644
|
})
|
|
541
|
-
}
|
|
645
|
+
},
|
|
646
|
+
onHelpModeShowNext: function () {
|
|
647
|
+
this.helpModeActiveItem += 1;
|
|
648
|
+
},
|
|
649
|
+
onHelpModeLastItem: function (isLastItem) {
|
|
650
|
+
if (isLastItem) {
|
|
651
|
+
this.helpModeLastItem = true;
|
|
652
|
+
}
|
|
653
|
+
},
|
|
654
|
+
onFinishHelpMode: function () {
|
|
655
|
+
this.helpMode = false;
|
|
656
|
+
// reset help mode to default values
|
|
657
|
+
this.helpModeActiveItem = 0;
|
|
658
|
+
this.helpModeLastItem = false;
|
|
659
|
+
},
|
|
660
|
+
onTooltipShown: function () {
|
|
661
|
+
if (this.$refs.scaffold && this.$refs.scaffoldHelp) {
|
|
662
|
+
this.$refs.scaffoldHelp.toggleTooltipHighlight();
|
|
663
|
+
}
|
|
664
|
+
},
|
|
665
|
+
onMapTooltipShown: function () {
|
|
666
|
+
if (this.$refs.scaffold && this.$refs.scaffoldHelp) {
|
|
667
|
+
this.$refs.scaffoldHelp.toggleTooltipPinHighlight();
|
|
668
|
+
}
|
|
669
|
+
},
|
|
542
670
|
},
|
|
543
671
|
};
|
|
544
672
|
</script>
|
|
@@ -0,0 +1,360 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<div class="help-mode-dialog" :class="{'finish': lastItem}">
|
|
3
|
+
<h4>Help Mode</h4>
|
|
4
|
+
|
|
5
|
+
<template v-if="lastItem">
|
|
6
|
+
<p>
|
|
7
|
+
All caught up! <br>
|
|
8
|
+
Click 'Help' to restart.
|
|
9
|
+
</p>
|
|
10
|
+
<div>
|
|
11
|
+
<el-button class="button" @click="finishHelpMode">
|
|
12
|
+
Finish
|
|
13
|
+
</el-button>
|
|
14
|
+
</div>
|
|
15
|
+
</template>
|
|
16
|
+
<template v-else>
|
|
17
|
+
<p>Click "Next" to see the next item.</p>
|
|
18
|
+
<div>
|
|
19
|
+
<el-button class="button" @click="showNext">
|
|
20
|
+
Next
|
|
21
|
+
</el-button>
|
|
22
|
+
<el-button class="button secondary" @click="finishHelpMode">
|
|
23
|
+
Exit Help Mode
|
|
24
|
+
</el-button>
|
|
25
|
+
</div>
|
|
26
|
+
</template>
|
|
27
|
+
</div>
|
|
28
|
+
</template>
|
|
29
|
+
|
|
30
|
+
<script>
|
|
31
|
+
import {
|
|
32
|
+
ElButton as Button,
|
|
33
|
+
} from 'element-plus';
|
|
34
|
+
|
|
35
|
+
export default {
|
|
36
|
+
name: 'HelpModeDialog',
|
|
37
|
+
components: {
|
|
38
|
+
Button,
|
|
39
|
+
},
|
|
40
|
+
props: {
|
|
41
|
+
multiflatmapRef: {
|
|
42
|
+
type: Object,
|
|
43
|
+
default: null,
|
|
44
|
+
},
|
|
45
|
+
flatmapRef: {
|
|
46
|
+
type: Object,
|
|
47
|
+
default: null,
|
|
48
|
+
},
|
|
49
|
+
scaffoldRef: {
|
|
50
|
+
type: Object,
|
|
51
|
+
default: null,
|
|
52
|
+
},
|
|
53
|
+
lastItem: {
|
|
54
|
+
type: Boolean,
|
|
55
|
+
default: false,
|
|
56
|
+
required: false,
|
|
57
|
+
}
|
|
58
|
+
},
|
|
59
|
+
mounted: function () {
|
|
60
|
+
this.toggleHelpModeHighlight(true);
|
|
61
|
+
// For tooltips outside of Flatmap
|
|
62
|
+
this.toggleTooltipHighlight();
|
|
63
|
+
},
|
|
64
|
+
unmounted: function () {
|
|
65
|
+
this.toggleHelpModeHighlight(false);
|
|
66
|
+
},
|
|
67
|
+
watch: {
|
|
68
|
+
lastItem: function (isLastItem) {
|
|
69
|
+
if (isLastItem) {
|
|
70
|
+
this.toggleTooltipHighlight();
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
},
|
|
74
|
+
methods: {
|
|
75
|
+
showNext: function () {
|
|
76
|
+
this.$emit('show-next');
|
|
77
|
+
},
|
|
78
|
+
finishHelpMode: function () {
|
|
79
|
+
this.$emit('finish-help-mode');
|
|
80
|
+
},
|
|
81
|
+
/**
|
|
82
|
+
* This function must be called on 'shown-map-tooltip' event.
|
|
83
|
+
*/
|
|
84
|
+
toggleTooltipPinHighlight: function () {
|
|
85
|
+
const currentFlatmapEl = this.getCurrentFlatmap();
|
|
86
|
+
this.resetHighlightedItems();
|
|
87
|
+
|
|
88
|
+
this.$nextTick(() => {
|
|
89
|
+
// Temporary solution to find the position of map marker from popover
|
|
90
|
+
const mapPins = currentFlatmapEl.querySelectorAll('.maplibregl-marker');
|
|
91
|
+
const mapPinPopover = currentFlatmapEl.querySelector('.flatmap-popup-popper');
|
|
92
|
+
const styleVal = mapPinPopover?.style?.transform || '';
|
|
93
|
+
const mapPopoverPosition = this.extractMarkerPosition(styleVal);
|
|
94
|
+
|
|
95
|
+
mapPins.forEach((mapPin) => {
|
|
96
|
+
const mapPinStyleVal = mapPin.style.transform;
|
|
97
|
+
const mapPinPosition = this.extractMarkerPosition(mapPinStyleVal);
|
|
98
|
+
|
|
99
|
+
if (mapPinPosition === mapPopoverPosition) {
|
|
100
|
+
mapPin.classList.add('in-help-highlight');
|
|
101
|
+
}
|
|
102
|
+
});
|
|
103
|
+
});
|
|
104
|
+
},
|
|
105
|
+
/**
|
|
106
|
+
* This function must be called on 'shown-tooltip' event.
|
|
107
|
+
*/
|
|
108
|
+
toggleTooltipHighlight: function () {
|
|
109
|
+
this.resetHighlightedItems();
|
|
110
|
+
|
|
111
|
+
this.$nextTick(() => {
|
|
112
|
+
const activePoppers = document.querySelectorAll('.el-popper:not([style*="none"])');
|
|
113
|
+
|
|
114
|
+
activePoppers.forEach((activePopper) => {
|
|
115
|
+
const multiFlatmapTooltip = activePopper.classList.contains('flatmap-popper');
|
|
116
|
+
const flatmapTooltip = activePopper.classList.contains('el-fade-in-linear-enter-active');
|
|
117
|
+
|
|
118
|
+
if (multiFlatmapTooltip || flatmapTooltip) {
|
|
119
|
+
this.toggleHighlight(activePopper);
|
|
120
|
+
}
|
|
121
|
+
});
|
|
122
|
+
});
|
|
123
|
+
},
|
|
124
|
+
toggleHighlight: function (activePopper) {
|
|
125
|
+
const popperId = activePopper?.id || '';
|
|
126
|
+
const popperTrigger = document.querySelector(`[aria-describedby="${popperId}"]`);
|
|
127
|
+
|
|
128
|
+
if (popperTrigger) {
|
|
129
|
+
popperTrigger.classList.add('in-help-highlight');
|
|
130
|
+
}
|
|
131
|
+
},
|
|
132
|
+
resetHighlightedItems: function () {
|
|
133
|
+
const allHighlightedItems = document.querySelectorAll('.in-help-highlight');
|
|
134
|
+
allHighlightedItems.forEach((el) => {
|
|
135
|
+
el.classList.remove('in-help-highlight');
|
|
136
|
+
});
|
|
137
|
+
},
|
|
138
|
+
getCurrentScaffold: function () {
|
|
139
|
+
const scaffoldEl = this.scaffoldRef?.$el || null;
|
|
140
|
+
return scaffoldEl;
|
|
141
|
+
},
|
|
142
|
+
getCurrentMultiflatmap: function () {
|
|
143
|
+
const multiflatmapEl = this.multiflatmapRef?.$el || null;
|
|
144
|
+
return multiflatmapEl;
|
|
145
|
+
},
|
|
146
|
+
getCurrentFlatmap: function () {
|
|
147
|
+
const flatmap = this.flatmapRef || this.multiflatmapRef?.getCurrentFlatmap();
|
|
148
|
+
const flatmapEl = flatmap?.$el || null;
|
|
149
|
+
return flatmapEl;
|
|
150
|
+
},
|
|
151
|
+
toggleHelpModeHighlight: function (option) {
|
|
152
|
+
const currentMultiflatmapEl = this.getCurrentMultiflatmap();
|
|
153
|
+
const currentFlatmapEl = this.getCurrentFlatmap();
|
|
154
|
+
const currentScaffoldEl = this.getCurrentScaffold();
|
|
155
|
+
const allHighlightedItems = document.querySelectorAll('.in-help-highlight');
|
|
156
|
+
|
|
157
|
+
if (currentMultiflatmapEl) {
|
|
158
|
+
if (option) {
|
|
159
|
+
currentMultiflatmapEl.classList.add('in-help');
|
|
160
|
+
} else {
|
|
161
|
+
currentMultiflatmapEl.classList.remove('in-help');
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
if (currentFlatmapEl) {
|
|
166
|
+
if (option) {
|
|
167
|
+
currentFlatmapEl.classList.add('in-help');
|
|
168
|
+
} else {
|
|
169
|
+
currentFlatmapEl.classList.remove('in-help');
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
if (currentScaffoldEl) {
|
|
174
|
+
if (option) {
|
|
175
|
+
currentScaffoldEl.classList.add('in-help');
|
|
176
|
+
} else {
|
|
177
|
+
currentScaffoldEl.classList.remove('in-help');
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
if (!option) {
|
|
182
|
+
allHighlightedItems.forEach((el) => {
|
|
183
|
+
el.classList.remove('in-help-highlight');
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
},
|
|
187
|
+
/**
|
|
188
|
+
* Temporary solution to find the position of map marker from popover
|
|
189
|
+
*/
|
|
190
|
+
extractMarkerPosition: function (str) {
|
|
191
|
+
const translateRegex = /translate\((.*?)\)/g;
|
|
192
|
+
const matches = str.match(translateRegex);
|
|
193
|
+
if (!matches) {
|
|
194
|
+
return '';
|
|
195
|
+
}
|
|
196
|
+
const lastMatch = matches[matches.length - 1];
|
|
197
|
+
const values = lastMatch.slice(10, -1);
|
|
198
|
+
return values;
|
|
199
|
+
},
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
</script>
|
|
203
|
+
|
|
204
|
+
<style lang="scss" scoped>
|
|
205
|
+
.help-mode-dialog {
|
|
206
|
+
display: flex;
|
|
207
|
+
flex-direction: column;
|
|
208
|
+
align-items: center;
|
|
209
|
+
justify-content: center;
|
|
210
|
+
gap: 1rem;
|
|
211
|
+
width: 300px;
|
|
212
|
+
padding: 1rem;
|
|
213
|
+
font-family: inherit;
|
|
214
|
+
font-size: 14px;
|
|
215
|
+
background: white;
|
|
216
|
+
border-radius: 4px 4px;
|
|
217
|
+
border: 1px solid $app-primary-color;
|
|
218
|
+
box-shadow: 0px 0px 160px 80px rgba(0,0,0,0.5);
|
|
219
|
+
position: absolute;
|
|
220
|
+
top: 0;
|
|
221
|
+
left: 50%;
|
|
222
|
+
transform: translateX(-50%);
|
|
223
|
+
z-index: 2;
|
|
224
|
+
|
|
225
|
+
&.finish {
|
|
226
|
+
animation: shake 0.35s;
|
|
227
|
+
animation-delay: 0.7s;
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
h4 {
|
|
231
|
+
color: $app-primary-color;
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
h4, p {
|
|
235
|
+
margin: 0;
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
p {
|
|
239
|
+
line-height: 1.5;
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
.button {
|
|
243
|
+
color: #fff;
|
|
244
|
+
background-color: $app-primary-color;
|
|
245
|
+
transform: scale(1);
|
|
246
|
+
transform-origin: 50% 50%;
|
|
247
|
+
transition: all var(--el-transition-duration);
|
|
248
|
+
|
|
249
|
+
&:hover {
|
|
250
|
+
color: #fff !important;
|
|
251
|
+
background: #ac76c5 !important;
|
|
252
|
+
border: 1px solid #ac76c5 !important;
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
&:active {
|
|
256
|
+
transform: scale(0.95);
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
&.secondary {
|
|
260
|
+
background: #f3e6f9;
|
|
261
|
+
border-color: $app-primary-color;
|
|
262
|
+
color: $app-primary-color;
|
|
263
|
+
|
|
264
|
+
&:hover {
|
|
265
|
+
color: $app-primary-color !important;
|
|
266
|
+
background: #fff !important;
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
@keyframes shake {
|
|
273
|
+
0% {
|
|
274
|
+
transform: translateX(-50%) rotate(2deg);
|
|
275
|
+
}
|
|
276
|
+
25% {
|
|
277
|
+
transform: translateX(-50%) rotate(-2deg);
|
|
278
|
+
}
|
|
279
|
+
50% {
|
|
280
|
+
transform: translateX(-50%) rotate(2deg);
|
|
281
|
+
}
|
|
282
|
+
75% {
|
|
283
|
+
transform: translateX(-50%) rotate(-2deg);
|
|
284
|
+
}
|
|
285
|
+
100% {
|
|
286
|
+
transform: translateX(-50%) rotate(2deg);
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
// Just for App.vue with options popover on top
|
|
291
|
+
.help-mode-dialog {
|
|
292
|
+
.options-popover + .multi-container + & {
|
|
293
|
+
margin-top: 40px;
|
|
294
|
+
}
|
|
295
|
+
.options-popover:not([style*="display: none"]) + .multi-container + & {
|
|
296
|
+
margin-top: 175px;
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
</style>
|
|
300
|
+
|
|
301
|
+
<style lang="scss">
|
|
302
|
+
.scaffold-container.in-help,
|
|
303
|
+
.flatmap-container.in-help {
|
|
304
|
+
background: rgba(0,0,0,0.3);
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
.scaffold-container.in-help {
|
|
308
|
+
canvas {
|
|
309
|
+
opacity: 0.3;
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
.scaffold-container.in-help,
|
|
314
|
+
.flatmap-container.in-help {
|
|
315
|
+
.el-tooltip__trigger,
|
|
316
|
+
.el-popover {
|
|
317
|
+
opacity: 0.3;
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
.pathway-location:has(.in-help-highlight) {
|
|
321
|
+
opacity: 1;
|
|
322
|
+
|
|
323
|
+
.pathway-container {
|
|
324
|
+
background: transparent;
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
.container,
|
|
328
|
+
.legends-container,
|
|
329
|
+
.selections-container {
|
|
330
|
+
opacity: 0.3;
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
.maplibregl-canvas,
|
|
335
|
+
.maplibregl-ctrl-minimap {
|
|
336
|
+
opacity: 0.3;
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
.maplibregl-map,
|
|
340
|
+
.maplibregl-canvas {
|
|
341
|
+
pointer-events: none;
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
.in-help .el-popper:not([style*="none"]) {
|
|
346
|
+
opacity: 1 !important;
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
.in-help-highlight {
|
|
350
|
+
opacity: 1 !important;
|
|
351
|
+
background: white !important;
|
|
352
|
+
box-shadow: 0px 0px 128px 128px white !important;
|
|
353
|
+
animation: highlight-area 0.1s;
|
|
354
|
+
|
|
355
|
+
&.maplibregl-marker {
|
|
356
|
+
background: none !important;
|
|
357
|
+
box-shadow: 0px 0px 128px 128px rgba(255,255,255,0.5) !important;
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
</style>
|