@abi-software/flatmapvuer 0.5.5-beta.1 → 0.5.6
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/CHANGELOG.md +21 -1
- package/dist/flatmapvuer.common.js +5611 -837
- package/dist/flatmapvuer.common.js.map +1 -1
- package/dist/flatmapvuer.css +1 -1
- package/dist/flatmapvuer.umd.js +5611 -837
- package/dist/flatmapvuer.umd.js.map +1 -1
- package/dist/flatmapvuer.umd.min.js +2 -2
- package/dist/flatmapvuer.umd.min.js.map +1 -1
- package/package-lock.json +14 -16
- package/package.json +2 -2
- package/src/App.vue +2 -0
- package/src/components/FlatmapVuer.vue +110 -21
- package/src/components/SelectionsGroup.vue +2 -1
- package/src/components/Tooltip.vue +12 -3
- package/src/components/TreeControls.vue +231 -0
- package/src/components/legends/SvgLegends.vue +1 -1
- package/src/services/flatmapQueries.js +40 -2
package/package-lock.json
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@abi-software/flatmapvuer",
|
|
3
|
-
"version": "0.5.
|
|
3
|
+
"version": "0.5.6",
|
|
4
4
|
"lockfileVersion": 1,
|
|
5
5
|
"requires": true,
|
|
6
6
|
"dependencies": {
|
|
7
7
|
"@abi-software/flatmap-viewer": {
|
|
8
|
-
"version": "2.
|
|
9
|
-
"resolved": "https://registry.npmjs.org/@abi-software/flatmap-viewer/-/flatmap-viewer-2.
|
|
10
|
-
"integrity": "sha512-
|
|
8
|
+
"version": "2.4.1-b.5",
|
|
9
|
+
"resolved": "https://registry.npmjs.org/@abi-software/flatmap-viewer/-/flatmap-viewer-2.4.1-b.5.tgz",
|
|
10
|
+
"integrity": "sha512-ScVaE0s7FB0dInpQ2FLC0eJ9tY1GGGu4aAY2oogQveC6+yfCmBPl5d6BXRuqtxfrlNSQyHRM14BRmE0B0OcjHg==",
|
|
11
11
|
"requires": {
|
|
12
12
|
"@babel/runtime": "^7.10.4",
|
|
13
13
|
"@fortawesome/fontawesome-free": "^6.4.0",
|
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
"bezier-js": "^6.1.0",
|
|
19
19
|
"html-es6cape": "^2.0.2",
|
|
20
20
|
"jspanel4": "^4.16.1",
|
|
21
|
-
"maplibre-gl": ">=
|
|
21
|
+
"maplibre-gl": ">=3.0.0",
|
|
22
22
|
"minisearch": "^2.2.1",
|
|
23
23
|
"polylabel": "^1.1.0"
|
|
24
24
|
}
|
|
@@ -1357,14 +1357,12 @@
|
|
|
1357
1357
|
"integrity": "sha512-Es6WcD0nO5l+2BOQS4uLfNPYQaNDfbot3X1XUoloz+x0mPDS3eeORZJl06HXjwBG1fOGwCRnzK88LMdxKRrd6Q=="
|
|
1358
1358
|
},
|
|
1359
1359
|
"@maplibre/maplibre-gl-style-spec": {
|
|
1360
|
-
"version": "19.
|
|
1361
|
-
"resolved": "https://registry.npmjs.org/@maplibre/maplibre-gl-style-spec/-/maplibre-gl-style-spec-19.
|
|
1362
|
-
"integrity": "sha512-
|
|
1360
|
+
"version": "19.3.0",
|
|
1361
|
+
"resolved": "https://registry.npmjs.org/@maplibre/maplibre-gl-style-spec/-/maplibre-gl-style-spec-19.3.0.tgz",
|
|
1362
|
+
"integrity": "sha512-ZbhX9CTV+Z7vHwkRIasDOwTSzr76e8Q6a55RMsAibjyX6+P0ZNL1qAKNzOjjBDP3+aEfNMl7hHo5knuY6pTAUQ==",
|
|
1363
1363
|
"requires": {
|
|
1364
1364
|
"@mapbox/jsonlint-lines-primitives": "~2.0.2",
|
|
1365
|
-
"@mapbox/point-geometry": "^0.1.0",
|
|
1366
1365
|
"@mapbox/unitbezier": "^0.0.1",
|
|
1367
|
-
"@types/mapbox__point-geometry": "^0.1.2",
|
|
1368
1366
|
"json-stringify-pretty-compact": "^3.0.0",
|
|
1369
1367
|
"minimist": "^1.2.8",
|
|
1370
1368
|
"rw": "^1.3.3",
|
|
@@ -3128,9 +3126,9 @@
|
|
|
3128
3126
|
}
|
|
3129
3127
|
},
|
|
3130
3128
|
"bezier-js": {
|
|
3131
|
-
"version": "6.1.
|
|
3132
|
-
"resolved": "https://registry.npmjs.org/bezier-js/-/bezier-js-6.1.
|
|
3133
|
-
"integrity": "sha512-
|
|
3129
|
+
"version": "6.1.4",
|
|
3130
|
+
"resolved": "https://registry.npmjs.org/bezier-js/-/bezier-js-6.1.4.tgz",
|
|
3131
|
+
"integrity": "sha512-PA0FW9ZpcHbojUCMu28z9Vg/fNkwTj5YhusSAjHHDfHDGLxJ6YUKrAN2vk1fP2MMOxVw4Oko16FMlRGVBGqLKg=="
|
|
3134
3132
|
},
|
|
3135
3133
|
"bfj": {
|
|
3136
3134
|
"version": "6.1.2",
|
|
@@ -8270,9 +8268,9 @@
|
|
|
8270
8268
|
}
|
|
8271
8269
|
},
|
|
8272
8270
|
"maplibre-gl": {
|
|
8273
|
-
"version": "3.0
|
|
8274
|
-
"resolved": "https://registry.npmjs.org/maplibre-gl/-/maplibre-gl-3.0.
|
|
8275
|
-
"integrity": "sha512-
|
|
8271
|
+
"version": "3.2.0",
|
|
8272
|
+
"resolved": "https://registry.npmjs.org/maplibre-gl/-/maplibre-gl-3.2.0.tgz",
|
|
8273
|
+
"integrity": "sha512-TOo/cV9r8Xy3ngbJtY6JUC7rpjpObrsdO5pt14l5OIw4gY1v5XnxWP16VDSe0zRoncFfDCEBDmRwhfEFwtlbvw==",
|
|
8276
8274
|
"requires": {
|
|
8277
8275
|
"@mapbox/geojson-rewind": "^0.5.2",
|
|
8278
8276
|
"@mapbox/jsonlint-lines-primitives": "^2.0.2",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@abi-software/flatmapvuer",
|
|
3
|
-
"version": "0.5.
|
|
3
|
+
"version": "0.5.6",
|
|
4
4
|
"license": "Apache-2.0",
|
|
5
5
|
"main": "./dist/flatmapvuer.common.js",
|
|
6
6
|
"files": [
|
|
@@ -27,7 +27,7 @@
|
|
|
27
27
|
"version": "npm run build-bundle;npm run changelog; git add CHANGELOG.md"
|
|
28
28
|
},
|
|
29
29
|
"dependencies": {
|
|
30
|
-
"@abi-software/flatmap-viewer": "^2.
|
|
30
|
+
"@abi-software/flatmap-viewer": "^2.4.1-b.5",
|
|
31
31
|
"@abi-software/svg-sprite": "^0.3.0",
|
|
32
32
|
"core-js": "^3.3.2",
|
|
33
33
|
"css-element-queries": "^1.2.2",
|
package/src/App.vue
CHANGED
|
@@ -71,6 +71,7 @@ export default {
|
|
|
71
71
|
console.log(component);
|
|
72
72
|
let taxon = component.mapImp.describes;
|
|
73
73
|
let id = component.mapImp.addMarker("UBERON:0000948");
|
|
74
|
+
window.flatmapImp = component.mapImp;
|
|
74
75
|
component.enablePanZoomEvents(true);
|
|
75
76
|
//component.showPathwaysDrawer(false);
|
|
76
77
|
console.log(taxon, id);
|
|
@@ -138,6 +139,7 @@ export default {
|
|
|
138
139
|
//flatmapAPI: "https://mapcore-demo.org/devel/flatmap/v3/"
|
|
139
140
|
//flatmapAPI: "https://mapcore-demo.org/current/flatmap/v3/"
|
|
140
141
|
flatmapAPI: "https://mapcore-demo.org/devel/flatmap/v4/"
|
|
142
|
+
//flatmapAPI: "https://mapcore-demo.org/fccb/flatmap/"
|
|
141
143
|
//flatmapAPI: "https://mapcore-demo.org/staging/flatmap/v1/"
|
|
142
144
|
// flatmapAPI: "https://mapcore-demo.org/devel/flatmap/v1/"
|
|
143
145
|
}
|
|
@@ -178,17 +178,15 @@
|
|
|
178
178
|
v-html="flatmapMarker"
|
|
179
179
|
v-popover:markerPopover
|
|
180
180
|
></div>
|
|
181
|
-
<
|
|
181
|
+
<tree-controls
|
|
182
182
|
v-if="isFC && systems && systems.length > 0"
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
colourStyle="background"
|
|
183
|
+
:active="currentActive"
|
|
184
|
+
:hover="currentHover"
|
|
185
|
+
:tree-data="systems"
|
|
186
|
+
ref="treeControls"
|
|
188
187
|
@changed="systemSelected"
|
|
189
188
|
@checkAll="checkAllSystems"
|
|
190
|
-
|
|
191
|
-
key="systemsSelection"
|
|
189
|
+
@change-active="ftuSelected"
|
|
192
190
|
/>
|
|
193
191
|
<!--
|
|
194
192
|
<selections-group
|
|
@@ -224,6 +222,17 @@
|
|
|
224
222
|
key="layersSelection"
|
|
225
223
|
/>
|
|
226
224
|
-->
|
|
225
|
+
<selections-group
|
|
226
|
+
v-if="!isFC && taxonConnectivity && taxonConnectivity.length > 0"
|
|
227
|
+
title="Observed in"
|
|
228
|
+
labelKey="label"
|
|
229
|
+
identifierKey="taxon"
|
|
230
|
+
:selections="taxonConnectivity"
|
|
231
|
+
@changed="taxonsSelected"
|
|
232
|
+
@checkAll="checkAllTaxons"
|
|
233
|
+
ref="taxonSelection"
|
|
234
|
+
key="taxonSelection"
|
|
235
|
+
/>
|
|
227
236
|
<selections-group
|
|
228
237
|
v-if="pathways && pathways.length > 0"
|
|
229
238
|
title="Pathways"
|
|
@@ -345,7 +354,6 @@
|
|
|
345
354
|
ref="tooltip"
|
|
346
355
|
class="tooltip"
|
|
347
356
|
:entry="tooltipEntry"
|
|
348
|
-
@resource-selected="resourceSelected"
|
|
349
357
|
/>
|
|
350
358
|
</div>
|
|
351
359
|
</div>
|
|
@@ -355,7 +363,8 @@
|
|
|
355
363
|
/* eslint-disable no-alert, no-console */
|
|
356
364
|
import Vue from "vue";
|
|
357
365
|
import Tooltip from "./Tooltip";
|
|
358
|
-
import SelectionsGroup from "./SelectionsGroup
|
|
366
|
+
import SelectionsGroup from "./SelectionsGroup";
|
|
367
|
+
import TreeControls from "./TreeControls";
|
|
359
368
|
import { MapSvgIcon, MapSvgSpriteColor } from "@abi-software/svg-sprite";
|
|
360
369
|
import SvgLegends from "./legends/SvgLegends";
|
|
361
370
|
import {
|
|
@@ -369,7 +378,7 @@ import {
|
|
|
369
378
|
import lang from "element-ui/lib/locale/lang/en";
|
|
370
379
|
import locale from "element-ui/lib/locale";
|
|
371
380
|
import flatmapMarker from "../icons/flatmap-marker";
|
|
372
|
-
import {FlatmapQueries} from "../services/flatmapQueries.js";
|
|
381
|
+
import {FlatmapQueries, findTaxonomyLabel} from "../services/flatmapQueries.js";
|
|
373
382
|
|
|
374
383
|
locale.use(lang);
|
|
375
384
|
Vue.use(Button);
|
|
@@ -380,6 +389,65 @@ Vue.use(RadioGroup);
|
|
|
380
389
|
Vue.use(Row);
|
|
381
390
|
const ResizeSensor = require("css-element-queries/src/ResizeSensor");
|
|
382
391
|
|
|
392
|
+
const processTaxon = (flatmapAPI, taxonIdentifiers) => {
|
|
393
|
+
let processed = [];
|
|
394
|
+
taxonIdentifiers.forEach(taxon => {
|
|
395
|
+
findTaxonomyLabel(flatmapAPI, taxon).then(value => {
|
|
396
|
+
const item = { taxon, label: value};
|
|
397
|
+
processed.push(item);
|
|
398
|
+
});
|
|
399
|
+
});
|
|
400
|
+
|
|
401
|
+
return processed;
|
|
402
|
+
}
|
|
403
|
+
|
|
404
|
+
const processFTUs = (parent, key) => {
|
|
405
|
+
const ftus = [];
|
|
406
|
+
let items = parent.organs ? parent.organs : parent.ftus;
|
|
407
|
+
const children = items ? items.filter(
|
|
408
|
+
(obj, index) =>
|
|
409
|
+
items.findIndex((item) => item.label === obj.label) === index
|
|
410
|
+
) : undefined
|
|
411
|
+
if (children) {
|
|
412
|
+
children.forEach(child => {
|
|
413
|
+
const data = {
|
|
414
|
+
label: child.label,
|
|
415
|
+
models: child.models,
|
|
416
|
+
key: `${key}.${child.label}`,
|
|
417
|
+
};
|
|
418
|
+
const grandChildren = processFTUs(child, data.key);
|
|
419
|
+
if (grandChildren.length > 0) {
|
|
420
|
+
data.children = grandChildren;
|
|
421
|
+
}
|
|
422
|
+
ftus.push(data);
|
|
423
|
+
})
|
|
424
|
+
}
|
|
425
|
+
return ftus;
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
const processSystems = systems => {
|
|
429
|
+
const allSystems = [];
|
|
430
|
+
if (systems && systems.length > 0) {
|
|
431
|
+
const data = { label: "All", key: "All", children: [] };
|
|
432
|
+
systems.forEach(system => {
|
|
433
|
+
const child = {
|
|
434
|
+
colour: system.colour,
|
|
435
|
+
enabled: system.enabled,
|
|
436
|
+
label: system.id,
|
|
437
|
+
key: system.id,
|
|
438
|
+
};
|
|
439
|
+
const children = processFTUs(system, child.key);
|
|
440
|
+
if (children.length > 0)
|
|
441
|
+
child.children = children;
|
|
442
|
+
data.children.push(child);
|
|
443
|
+
});
|
|
444
|
+
|
|
445
|
+
allSystems.push(data);
|
|
446
|
+
}
|
|
447
|
+
|
|
448
|
+
return allSystems;
|
|
449
|
+
}
|
|
450
|
+
|
|
383
451
|
const createUnfilledTooltipData = function (){
|
|
384
452
|
return {
|
|
385
453
|
destinations: [],
|
|
@@ -398,6 +466,7 @@ export default {
|
|
|
398
466
|
MapSvgIcon,
|
|
399
467
|
MapSvgSpriteColor,
|
|
400
468
|
Tooltip,
|
|
469
|
+
TreeControls,
|
|
401
470
|
SelectionsGroup,
|
|
402
471
|
SvgLegends
|
|
403
472
|
},
|
|
@@ -512,11 +581,14 @@ export default {
|
|
|
512
581
|
this.mapImp.enableSystem(payload.key, payload.value);
|
|
513
582
|
}
|
|
514
583
|
},
|
|
515
|
-
checkAllSystems: function(
|
|
584
|
+
checkAllSystems: function(flag) {
|
|
516
585
|
if (this.mapImp) {
|
|
517
|
-
|
|
586
|
+
this.systems[0].children.forEach(key => this.mapImp.enableSystem(key.label, flag));
|
|
518
587
|
}
|
|
519
588
|
},
|
|
589
|
+
ftuSelected: function(models) {
|
|
590
|
+
this.searchAndShowResult(models, true);
|
|
591
|
+
},
|
|
520
592
|
layersSelected: function(payload) {
|
|
521
593
|
if (this.mapImp) {
|
|
522
594
|
this.mapImp.enableLayer(payload.key, payload.value);
|
|
@@ -527,6 +599,16 @@ export default {
|
|
|
527
599
|
payload.keys.forEach(key => this.mapImp.enableLayer(key, payload.value));
|
|
528
600
|
}
|
|
529
601
|
},
|
|
602
|
+
taxonsSelected: function(payload) {
|
|
603
|
+
if (this.mapImp) {
|
|
604
|
+
this.mapImp.enableConnectivityByTaxonIds(payload.key, payload.value);
|
|
605
|
+
}
|
|
606
|
+
},
|
|
607
|
+
checkAllTaxons: function(payload) {
|
|
608
|
+
if (this.mapImp) {
|
|
609
|
+
payload.keys.forEach(key => this.mapImp.enableConnectivityByTaxonIds(key, payload.value));
|
|
610
|
+
}
|
|
611
|
+
},
|
|
530
612
|
pathwaysSelected: function(payload) {
|
|
531
613
|
if (this.mapImp) {
|
|
532
614
|
this.mapImp.enablePath(payload.key, payload.value);
|
|
@@ -555,8 +637,14 @@ export default {
|
|
|
555
637
|
label: label,
|
|
556
638
|
feature: data,
|
|
557
639
|
userData: args,
|
|
558
|
-
eventType: eventType
|
|
640
|
+
eventType: eventType,
|
|
641
|
+
provenanceTaxonomy: data.taxons ? JSON.parse(data.taxons) : undefined
|
|
559
642
|
};
|
|
643
|
+
if (eventType === "click") {
|
|
644
|
+
this.currentActive = data.models ? data.models : "";
|
|
645
|
+
} else if (eventType === "mouseenter") {
|
|
646
|
+
this.currentHover = data.models ? data.models : "";
|
|
647
|
+
}
|
|
560
648
|
if (data && data.type !== "marker" && eventType === "click"){
|
|
561
649
|
this.checkAndCreatePopups(payload);
|
|
562
650
|
}
|
|
@@ -589,11 +677,8 @@ export default {
|
|
|
589
677
|
"block";
|
|
590
678
|
};
|
|
591
679
|
},
|
|
592
|
-
|
|
593
|
-
this
|
|
594
|
-
},
|
|
595
|
-
createTooltipFromNeuronCuration: function(data) {
|
|
596
|
-
this.tooltipEntry = this.flatmapQueries.createTooltipData(data);
|
|
680
|
+
createTooltipFromNeuronCuration: async function(data) {
|
|
681
|
+
this.tooltipEntry = await this.flatmapQueries.createTooltipData(data);
|
|
597
682
|
this.displayTooltip();
|
|
598
683
|
},
|
|
599
684
|
// Keeping this as an API
|
|
@@ -854,7 +939,8 @@ export default {
|
|
|
854
939
|
this.mapImp.enableCentrelines(false);
|
|
855
940
|
//Disable layers for now
|
|
856
941
|
//this.layers = this.mapImp.getLayers();
|
|
857
|
-
this.systems = this.mapImp.getSystems();
|
|
942
|
+
this.systems = processSystems(this.mapImp.getSystems());
|
|
943
|
+
this.taxonConnectivity = processTaxon(this.flatmapAPI, this.mapImp.taxonIdentifiers);
|
|
858
944
|
this.addResizeButtonToMinimap();
|
|
859
945
|
this.loading = false;
|
|
860
946
|
this.computePathControlsMaximumHeight();
|
|
@@ -993,7 +1079,7 @@ export default {
|
|
|
993
1079
|
},
|
|
994
1080
|
latestChangesMessage: {
|
|
995
1081
|
type: String,
|
|
996
|
-
default: "
|
|
1082
|
+
default: "'Observed In' controls and information are now included in AC maps. System control with FTU information has been added to the FC map.",
|
|
997
1083
|
},
|
|
998
1084
|
/**
|
|
999
1085
|
* State containing state of the flatmap.
|
|
@@ -1038,6 +1124,7 @@ export default {
|
|
|
1038
1124
|
}
|
|
1039
1125
|
],
|
|
1040
1126
|
systems: [],
|
|
1127
|
+
taxonConnectivity: [],
|
|
1041
1128
|
pathwaysMaxHeight: 1000,
|
|
1042
1129
|
hoverVisibilities: [
|
|
1043
1130
|
{ value: false },
|
|
@@ -1064,6 +1151,8 @@ export default {
|
|
|
1064
1151
|
outlinesRadio: true,
|
|
1065
1152
|
minimapResizeShow: false,
|
|
1066
1153
|
minimapSmall: false,
|
|
1154
|
+
currentActive: "",
|
|
1155
|
+
currentHover: "",
|
|
1067
1156
|
};
|
|
1068
1157
|
},
|
|
1069
1158
|
watch: {
|
|
@@ -33,7 +33,7 @@
|
|
|
33
33
|
<div class="path-visual" :style="getLineStyles(item)"></div>
|
|
34
34
|
</el-col>
|
|
35
35
|
<el-col :span="20">
|
|
36
|
-
<div
|
|
36
|
+
<div :style="getBackgroundStyles(item)">
|
|
37
37
|
{{item[labelKey]}}
|
|
38
38
|
</div>
|
|
39
39
|
</el-col>
|
|
@@ -188,6 +188,7 @@ export default {
|
|
|
188
188
|
font-weight: normal;
|
|
189
189
|
line-height: 20px;
|
|
190
190
|
margin-left: 8px;
|
|
191
|
+
white-space: nowrap;
|
|
191
192
|
}
|
|
192
193
|
|
|
193
194
|
.all-checkbox {
|
|
@@ -3,6 +3,9 @@
|
|
|
3
3
|
<el-main v-if="entry" class="main" v-loading="loading">
|
|
4
4
|
<div class="block" v-if="entry.title">
|
|
5
5
|
<span class="title">{{capitalise(entry.title)}}</span>
|
|
6
|
+
<div v-if="entry.provenanceTaxonomyLabel && entry.provenanceTaxonomyLabel.length > 0" class="subtitle">
|
|
7
|
+
{{provSpeciesDescription}}
|
|
8
|
+
</div>
|
|
6
9
|
</div>
|
|
7
10
|
<div class="block" v-else>
|
|
8
11
|
<span class="title">{{entry.featureId}}</span>
|
|
@@ -163,12 +166,18 @@ export default {
|
|
|
163
166
|
} else {
|
|
164
167
|
return this.originDescriptions.sensory
|
|
165
168
|
}
|
|
169
|
+
},
|
|
170
|
+
provSpeciesDescription: function(){
|
|
171
|
+
let text = "Observed in"
|
|
172
|
+
this.entry.provenanceTaxonomyLabel.forEach(label => {
|
|
173
|
+
text += ` ${label},`
|
|
174
|
+
});
|
|
175
|
+
text = text.slice(0,-1) // remove last comma
|
|
176
|
+
text += " species"
|
|
177
|
+
return text
|
|
166
178
|
}
|
|
167
179
|
},
|
|
168
180
|
methods: {
|
|
169
|
-
resourceSelected: function(action) {
|
|
170
|
-
this.$emit("resource-selected", action);
|
|
171
|
-
},
|
|
172
181
|
titleCase: function(title){
|
|
173
182
|
return titleCase(title)
|
|
174
183
|
},
|
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<div class="container">
|
|
3
|
+
<el-row>
|
|
4
|
+
<el-col :span="12">
|
|
5
|
+
<div class="title-text">
|
|
6
|
+
Systems
|
|
7
|
+
</div>
|
|
8
|
+
</el-col>
|
|
9
|
+
</el-row>
|
|
10
|
+
<div class="tree-container">
|
|
11
|
+
<el-tree
|
|
12
|
+
ref="tree"
|
|
13
|
+
node-key="key"
|
|
14
|
+
show-checkbox
|
|
15
|
+
:check-strictly="false"
|
|
16
|
+
:data="treeData"
|
|
17
|
+
:render-after-expand="false"
|
|
18
|
+
:default-expanded-keys="defaultExpandedKeys"
|
|
19
|
+
@check="checkChanged"
|
|
20
|
+
>
|
|
21
|
+
<span
|
|
22
|
+
slot-scope="{ node, data }"
|
|
23
|
+
class="region-tree-node"
|
|
24
|
+
:class="{
|
|
25
|
+
activeItem: nodeIsActive(data),
|
|
26
|
+
hoverItem: nodeIsHover(data),
|
|
27
|
+
}"
|
|
28
|
+
@click="changeActiveByNode(data)"
|
|
29
|
+
@mouseover="changeHoverByNode(data)"
|
|
30
|
+
>
|
|
31
|
+
<div :style="getBackgroundStyles(data)">
|
|
32
|
+
{{ node.label }}
|
|
33
|
+
</div>
|
|
34
|
+
</span>
|
|
35
|
+
</el-tree>
|
|
36
|
+
</div>
|
|
37
|
+
</div>
|
|
38
|
+
</template>
|
|
39
|
+
|
|
40
|
+
<script>
|
|
41
|
+
/* eslint-disable no-alert, no-console */
|
|
42
|
+
import Vue from "vue";
|
|
43
|
+
import { Checkbox, CheckboxGroup, ColorPicker, Row, Tree } from "element-ui";
|
|
44
|
+
import lang from "element-ui/lib/locale/lang/en";
|
|
45
|
+
import locale from "element-ui/lib/locale";
|
|
46
|
+
locale.use(lang);
|
|
47
|
+
Vue.use(Checkbox);
|
|
48
|
+
Vue.use(CheckboxGroup);
|
|
49
|
+
Vue.use(ColorPicker);
|
|
50
|
+
Vue.use(Row);
|
|
51
|
+
Vue.use(Tree);
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* A vue component for toggling visibility of various regions.
|
|
55
|
+
*/
|
|
56
|
+
export default {
|
|
57
|
+
name: "TreeControls",
|
|
58
|
+
props: {
|
|
59
|
+
treeData: {
|
|
60
|
+
type: Array,
|
|
61
|
+
default: function () {
|
|
62
|
+
return [];
|
|
63
|
+
}
|
|
64
|
+
},
|
|
65
|
+
active: {
|
|
66
|
+
type: String,
|
|
67
|
+
default: ""
|
|
68
|
+
},
|
|
69
|
+
hover: {
|
|
70
|
+
type: String,
|
|
71
|
+
default: ""
|
|
72
|
+
}
|
|
73
|
+
},
|
|
74
|
+
data: function () {
|
|
75
|
+
return {
|
|
76
|
+
defaultExpandedKeys: ["All"],
|
|
77
|
+
};
|
|
78
|
+
},
|
|
79
|
+
destroyed: function () {
|
|
80
|
+
this.sortedPrimitiveGroups = undefined;
|
|
81
|
+
},
|
|
82
|
+
methods: {
|
|
83
|
+
nodeIsActive: function(data) {
|
|
84
|
+
return this.active === data.models;
|
|
85
|
+
},
|
|
86
|
+
nodeIsHover: function(data) {
|
|
87
|
+
return this.hover === data.models;
|
|
88
|
+
},
|
|
89
|
+
changeActiveByNode: function(data) {
|
|
90
|
+
if (data.models) {
|
|
91
|
+
this.$emit("change-active", data.models);
|
|
92
|
+
}
|
|
93
|
+
},
|
|
94
|
+
changeHoverByNode: function() {
|
|
95
|
+
//if (data.models) {
|
|
96
|
+
// this.$emit("change-active", data.models);
|
|
97
|
+
//}
|
|
98
|
+
},
|
|
99
|
+
checkChanged: function (node, data) {
|
|
100
|
+
const isChecked = data.checkedKeys.includes(node.key);
|
|
101
|
+
if (node.key === "All") {
|
|
102
|
+
this.$emit("checkAll", isChecked);
|
|
103
|
+
} else {
|
|
104
|
+
this.$emit("changed", {key: node.key, value: isChecked});
|
|
105
|
+
}
|
|
106
|
+
},
|
|
107
|
+
getBackgroundStyles: function(node) {
|
|
108
|
+
if ('colour' in node) {
|
|
109
|
+
return { background: node.colour };
|
|
110
|
+
}
|
|
111
|
+
return {};
|
|
112
|
+
},
|
|
113
|
+
},
|
|
114
|
+
};
|
|
115
|
+
</script>
|
|
116
|
+
|
|
117
|
+
<!-- Add "scoped" attribute to limit CSS to this component only -->
|
|
118
|
+
<style scoped lang="scss">
|
|
119
|
+
@import "~element-ui/packages/theme-chalk/src/checkbox";
|
|
120
|
+
@import "~element-ui/packages/theme-chalk/src/row";
|
|
121
|
+
@import "~element-ui/packages/theme-chalk/src/tree";
|
|
122
|
+
|
|
123
|
+
.checkbox-container {
|
|
124
|
+
display: flex;
|
|
125
|
+
cursor: pointer;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
.tree-controls {
|
|
129
|
+
position: absolute;
|
|
130
|
+
bottom: 0px;
|
|
131
|
+
transition: all 1s ease;
|
|
132
|
+
|
|
133
|
+
&:focus {
|
|
134
|
+
outline: none;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
.container {
|
|
139
|
+
text-align: left;
|
|
140
|
+
overflow: none;
|
|
141
|
+
padding-top: 7px;
|
|
142
|
+
padding-bottom: 16px;
|
|
143
|
+
background: #ffffff;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
.title-text {
|
|
147
|
+
width: 59px;
|
|
148
|
+
height: 20px;
|
|
149
|
+
color: rgb(48, 49, 51);
|
|
150
|
+
font-size: 14px;
|
|
151
|
+
font-weight: normal;
|
|
152
|
+
line-height: 20px;
|
|
153
|
+
margin-left: 8px;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
.all-checkbox {
|
|
157
|
+
float: right;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
.tree-container {
|
|
161
|
+
width: 260px;
|
|
162
|
+
border: 1px solid rgb(144, 147, 153);
|
|
163
|
+
border-radius: 4px;
|
|
164
|
+
background: #ffffff;
|
|
165
|
+
margin-top: 6px;
|
|
166
|
+
scrollbar-width: thin;
|
|
167
|
+
|
|
168
|
+
::v-deep .el-tree {
|
|
169
|
+
max-height: 240px;
|
|
170
|
+
min-height: 130px;
|
|
171
|
+
overflow: auto;
|
|
172
|
+
&::-webkit-scrollbar {
|
|
173
|
+
width: 4px;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
&::-webkit-scrollbar-thumb {
|
|
177
|
+
border-radius: 10px;
|
|
178
|
+
box-shadow: inset 0 0 6px #c0c4cc;
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
::v-deep .el-tree-node__content {
|
|
183
|
+
height: 22px;
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
::v-deep .el-checkbox__input {
|
|
188
|
+
&.is-indeterminate,
|
|
189
|
+
&.is-checked {
|
|
190
|
+
.el-checkbox__inner {
|
|
191
|
+
background-color: $app-primary-color;
|
|
192
|
+
border-color: $app-primary-color;
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
::v-deep .el-tree-node__children .el-tree-node__children .el-tree-node__content > label.el-checkbox {
|
|
198
|
+
display: none;
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
::v-deep .el-checkbox__label {
|
|
202
|
+
padding-left: 5px;
|
|
203
|
+
color: $app-primary-color !important;
|
|
204
|
+
font-size: 12px;
|
|
205
|
+
font-weight: 500;
|
|
206
|
+
letter-spacing: 0px;
|
|
207
|
+
line-height: 14px;
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
.activeItem {
|
|
211
|
+
background-color: #bbb !important;
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
.region-tree-node {
|
|
215
|
+
flex: 1;
|
|
216
|
+
color: $app-primary-color !important;
|
|
217
|
+
display: flex;
|
|
218
|
+
font-size: 12px;
|
|
219
|
+
line-height: 14px;
|
|
220
|
+
padding-left: 0px;
|
|
221
|
+
background-color: #fff;
|
|
222
|
+
width: 100%;
|
|
223
|
+
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
.hoverItem {
|
|
227
|
+
background-color: #eee !important;
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
</style>
|
|
231
|
+
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
<text transform="matrix(0.9908 0 0 1 117.5474 171.7975)" class="st3 st4 st5" style="white-space: pre;">Specific anatomical structure</text>
|
|
16
16
|
-->
|
|
17
17
|
<text transform="matrix(0.9908 0 0 1 118.0903 345.5266)" class="st3 st4 st5" style="white-space: pre;">Ganglia</text>
|
|
18
|
-
<text transform="matrix(0.9908 0 0 1 118.0903 433.1613)" class="st3 st4 st5" style="white-space: pre;">
|
|
18
|
+
<text transform="matrix(0.9908 0 0 1 118.0903 433.1613)" class="st3 st4 st5" style="white-space: pre;">Ganglionated nerve plexus</text>
|
|
19
19
|
</svg>
|
|
20
20
|
</div>
|
|
21
21
|
</template>
|