@abi-software/map-utilities 1.0.0-beta.1 → 1.0.1-beta.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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@abi-software/map-utilities",
3
- "version": "1.0.0-beta.1",
3
+ "version": "1.0.1-beta.0",
4
4
  "files": [
5
5
  "dist/*",
6
6
  "src/*",
@@ -29,7 +29,6 @@
29
29
  "./src/*": "./src/*"
30
30
  },
31
31
  "dependencies": {
32
- "@abi-software/gallery": "^1.1.0",
33
32
  "@abi-software/svg-sprite": "^1.0.0",
34
33
  "@element-plus/icons-vue": "^2.3.1",
35
34
  "element-plus": "^2.7.3",
package/src/App.vue CHANGED
@@ -124,19 +124,19 @@ function onActionClick(value) {
124
124
  /**
125
125
  * Tooltip
126
126
  */
127
- const tooltipType = ref("");
128
- const provenanceEntry = ref({});
127
+ const tooltipDisplay = ref(false);
128
+ const tooltipEntry = ref({});
129
129
  const featuresAlert = ref(undefined);
130
+ const annotationDisplay = ref(false);
130
131
  const annotationEntry = ref({});
131
- const imageEntry = ref([]);
132
132
 
133
133
  provide(/* key */ "getFeaturesAlert", /* value */ () => featuresAlert.value);
134
134
  provide(/* key */ "$annotator", /* value */ undefined);
135
135
  provide(/* key */ "userApiKey", /* value */ undefined);
136
136
 
137
- function addProvenanceEntry() {
138
- tooltipType.value = "provenance";
139
- provenanceEntry.value = {
137
+ function addTooltipEntry() {
138
+ tooltipDisplay.value = true;
139
+ tooltipEntry.value = {
140
140
  destinations: [null],
141
141
  origins: [null],
142
142
  components: ["pudendal nerve"],
@@ -160,12 +160,13 @@ function addProvenanceEntry() {
160
160
  provenanceTaxonomyLabel: ["Homo sapiens"],
161
161
  };
162
162
  }
163
- function removeProvenanceEntry() {
164
- tooltipType.value = "";
165
- provenanceEntry.value = {};
163
+ function removeTooltipEntry() {
164
+ tooltipDisplay.value = false;
165
+ tooltipEntry.value = {};
166
166
  }
167
167
  function addAnnotationEntry() {
168
- tooltipType.value = "annotation";
168
+ tooltipDisplay.value = true;
169
+ annotationDisplay.value = true;
169
170
  annotationEntry.value = {
170
171
  id: "digestive_8-1",
171
172
  featureId: 4958,
@@ -178,97 +179,13 @@ function addAnnotationEntry() {
178
179
  };
179
180
  }
180
181
  function removeAnnotationEntry() {
181
- tooltipType.value = "";
182
+ tooltipDisplay.value = false;
183
+ annotationDisplay.value = false;
182
184
  annotationEntry.value = {};
183
185
  }
184
186
  function commitAnnotationEvent(value) {
185
187
  console.log("🚀 ~ commitAnnotationEvent ~ value:", value);
186
188
  }
187
- function addImageEntry() {
188
- tooltipType.value = "image";
189
- imageEntry.value = [
190
- {
191
- anatomy: [
192
- {
193
- curie: "",
194
- matchingStatus: "Exact Match",
195
- name: "stomach",
196
- },
197
- ],
198
- datasetId: "22",
199
- datasetVersion: "2",
200
- link: "https://sparc.biolucida.net/image?c=Mzg3Ny1jb2wtMTUw",
201
- resource: {
202
- share_link: "https://sparc.biolucida.net/image?c=Mzg3Ny1jb2wtMTUw",
203
- },
204
- s3uri: "s3://prd-sparc-discover50-use1/22/",
205
- species: [
206
- {
207
- species: {
208
- curie: "NCBITaxon:9825",
209
- matchingStatus: "approved",
210
- name: "Pig",
211
- originalName: "Domestic Pig",
212
- parents: [
213
- {
214
- curie: "ilx:0739765",
215
- name: "Pig",
216
- },
217
- ],
218
- },
219
- strain: {
220
- name: "Large White / Landrace crossbred pig",
221
- },
222
- },
223
- ],
224
- thumbnail: "https://sparc.biolucida.net/api/v1/thumbnail/3877",
225
- title: "SPARC Image 1",
226
- type: "image",
227
- },
228
- {
229
- anatomy: [
230
- {
231
- curie: "",
232
- matchingStatus: "Exact Match",
233
- name: "stomach",
234
- },
235
- ],
236
- datasetId: "22",
237
- datasetVersion: "2",
238
- link: "https://sparc.biolucida.net/image?c=Mzg3Ny1jb2wtMTUw",
239
- resource: {
240
- share_link: "https://sparc.biolucida.net/image?c=Mzg3Ny1jb2wtMTUw",
241
- },
242
- s3uri: "s3://prd-sparc-discover50-use1/22/",
243
- species: [
244
- {
245
- species: {
246
- curie: "NCBITaxon:9825",
247
- matchingStatus: "approved",
248
- name: "Pig",
249
- originalName: "Domestic Pig",
250
- parents: [
251
- {
252
- curie: "ilx:0739765",
253
- name: "Pig",
254
- },
255
- ],
256
- },
257
- strain: {
258
- name: "Large White / Landrace crossbred pig",
259
- },
260
- },
261
- ],
262
- thumbnail: "https://sparc.biolucida.net/api/v1/thumbnail/3877",
263
- title: "SPARC Image 2",
264
- type: "image",
265
- },
266
- ];
267
- }
268
- function removeImageEntry() {
269
- tooltipType.value = "";
270
- imageEntry.value = [];
271
- }
272
189
  /**
273
190
  * TreeControls
274
191
  */
@@ -312,7 +229,7 @@ function setColourField(treeData, nodeData, activeColour) {
312
229
  function setColour(nodeData, value) {
313
230
  if (nodeData && nodeData.isPrimitives) {
314
231
  const activeColour = value ? value : nodeData.defaultColour;
315
- setColourField(treeDataEntry.value, nodeData, activeColour);
232
+ setColourField(treeDataEntry.value, nodeData, activeColour)
316
233
  }
317
234
  }
318
235
  function checkAll(value) {
@@ -463,29 +380,21 @@ function changeHover(value) {
463
380
  </el-col>
464
381
  <el-col>
465
382
  <el-button
466
- v-show="
467
- tooltipType === '' ||
468
- (tooltipType === 'provenance' &&
469
- Object.keys(provenanceEntry).length === 0)
470
- "
471
- @click="addProvenanceEntry"
383
+ v-show="!annotationDisplay"
384
+ @click="addTooltipEntry"
472
385
  size="small"
473
386
  >
474
- Add Provenance Entry
387
+ Add Tooltip Entry
475
388
  </el-button>
476
389
  <el-button
477
- v-show="Object.keys(provenanceEntry).length > 0"
478
- @click="removeProvenanceEntry"
390
+ v-show="Object.keys(tooltipEntry).length > 0"
391
+ @click="removeTooltipEntry"
479
392
  size="small"
480
393
  >
481
- Remove Provenance Entry
394
+ Remove Tooltip Entry
482
395
  </el-button>
483
396
  <el-button
484
- v-show="
485
- tooltipType === '' ||
486
- (tooltipType === 'annotation' &&
487
- Object.keys(annotationEntry).length === 0)
488
- "
397
+ v-show="!Object.keys(tooltipEntry).length > 0"
489
398
  @click="addAnnotationEntry"
490
399
  size="small"
491
400
  >
@@ -498,23 +407,6 @@ function changeHover(value) {
498
407
  >
499
408
  Remove Annotation Entry
500
409
  </el-button>
501
- <el-button
502
- v-show="
503
- tooltipType === '' ||
504
- (tooltipType === 'image' && Object.keys(imageEntry).length === 0)
505
- "
506
- @click="addImageEntry"
507
- size="small"
508
- >
509
- Add Image Entry
510
- </el-button>
511
- <el-button
512
- v-show="Object.keys(imageEntry).length > 0"
513
- @click="removeImageEntry"
514
- size="small"
515
- >
516
- Remove Image Entry
517
- </el-button>
518
410
  </el-col>
519
411
  </el-row>
520
412
  <el-row>
@@ -522,18 +414,10 @@ function changeHover(value) {
522
414
  <h3>TreeControls - {{ mapType }}</h3>
523
415
  </el-col>
524
416
  <el-col>
525
- <el-button
526
- v-show="mapType === 'scaffold'"
527
- @click="switchTreeEntry('flatmap')"
528
- size="small"
529
- >
417
+ <el-button v-show="mapType==='scaffold'" @click="switchTreeEntry('flatmap')" size="small">
530
418
  Display Flatmap Tree
531
419
  </el-button>
532
- <el-button
533
- v-show="mapType === 'flatmap'"
534
- @click="switchTreeEntry('scaffold')"
535
- size="small"
536
- >
420
+ <el-button v-show="mapType==='flatmap'" @click="switchTreeEntry('scaffold')" size="small">
537
421
  Display Scaffold Tree
538
422
  </el-button>
539
423
  </el-col>
@@ -575,12 +459,11 @@ function changeHover(value) {
575
459
  @finish-help-mode="onFinishHelpMode"
576
460
  />
577
461
  <Tooltip
578
- v-show="tooltipType"
462
+ v-show="tooltipDisplay"
579
463
  class="tooltip"
580
- :tooltipType="tooltipType"
581
- :provenanceEntry="provenanceEntry"
464
+ :tooltipEntry="tooltipEntry"
465
+ :annotationDisplay="annotationDisplay"
582
466
  :annotationEntry="annotationEntry"
583
- :imageEntry="imageEntry"
584
467
  @annotation="commitAnnotationEvent"
585
468
  @onActionClick="onActionClick"
586
469
  />
@@ -615,12 +498,10 @@ function changeHover(value) {
615
498
  .options-container {
616
499
  text-align: center;
617
500
  }
618
-
619
501
  .help-mode-dialog {
620
502
  position: absolute;
621
503
  top: 50%;
622
504
  }
623
-
624
505
  .tooltip {
625
506
  width: 400px;
626
507
  position: absolute;
@@ -0,0 +1,146 @@
1
+ <template>
2
+ <el-tooltip
3
+ :content="textLabel"
4
+ placement="bottom"
5
+ :hide-after="autoHideTimeout"
6
+ effect="clipboard-tooltip"
7
+ @hide="resetSettings"
8
+ >
9
+ <el-button
10
+ class="copy-clipboard-button"
11
+ :class="theme"
12
+ size="small"
13
+ @click="copyToClipboard"
14
+ >
15
+ <el-icon :color="iconColor">
16
+ <el-icon-copy-document />
17
+ </el-icon>
18
+ <span class="visually-hidden">{{ textLabel }}</span>
19
+ </el-button>
20
+ </el-tooltip>
21
+ </template>
22
+
23
+ <script>
24
+ const labelBefore = 'Copy to clipboard';
25
+ const labelAfter = 'Copied!';
26
+ const appPrimaryColor = '#8300bf';
27
+
28
+ export default {
29
+ name: 'CopyToClipboard',
30
+ props: {
31
+ content: {
32
+ type: String,
33
+ default: '',
34
+ },
35
+ /**
36
+ * Theme 'primary' or 'dark' or any name not 'light'
37
+ * will show primary button color.
38
+ */
39
+ theme: {
40
+ type: String,
41
+ default: 'light',
42
+ },
43
+ },
44
+ data: function () {
45
+ return {
46
+ textLabel: labelBefore,
47
+ autoHideTimeout: 0,
48
+ iconColor: appPrimaryColor,
49
+ };
50
+ },
51
+ mounted: function () {
52
+ if (this.theme !== 'light') {
53
+ this.iconColor = 'white';
54
+ }
55
+ },
56
+ methods: {
57
+ copyToClipboard: async function () {
58
+ let copiedSuccessfully = true;
59
+ this.autoHideTimeout = 600;
60
+
61
+ try {
62
+ await navigator.clipboard.writeText(this.content);
63
+ } catch (err) {
64
+ console.error(
65
+ "Error when trying to use navigator.clipboard.writeText()",
66
+ err
67
+ );
68
+ copiedSuccessfully = false;
69
+ }
70
+
71
+ if (copiedSuccessfully) {
72
+ this.textLabel = labelAfter;
73
+ } else {
74
+ this.textLabel = 'Error trying to copy to clipboard!';
75
+ }
76
+ },
77
+ resetSettings: function () {
78
+ this.autoHideTimeout = 0;
79
+ this.textLabel = labelBefore;
80
+ },
81
+ }
82
+ }
83
+ </script>
84
+
85
+ <style lang="scss" scoped>
86
+ .copy-clipboard-button {
87
+ margin-left: 0px !important;
88
+ margin-top: 0px !important;
89
+ padding: 0.25rem;
90
+ font-size: 14px !important;
91
+ transition: all 0.25s ease;
92
+
93
+ &,
94
+ &:focus,
95
+ &:active {
96
+ color: #fff !important;
97
+ background: $app-primary-color;
98
+ border-color: $app-primary-color !important;
99
+ }
100
+
101
+ &:hover {
102
+ background: #ac76c5 !important;
103
+ border-color: #ac76c5 !important;
104
+ }
105
+
106
+ &.light {
107
+ &,
108
+ &:focus,
109
+ &:active {
110
+ color: $app-primary-color !important;
111
+ background: transparent;
112
+ border-color: transparent !important;
113
+ }
114
+
115
+ &:hover {
116
+ background: #f3e6f9 !important;
117
+ border-color: #f3e6f9 !important;
118
+ }
119
+ }
120
+ }
121
+
122
+ .visually-hidden {
123
+ clip: rect(0 0 0 0);
124
+ clip-path: inset(50%);
125
+ height: 1px;
126
+ overflow: hidden;
127
+ position: absolute;
128
+ white-space: nowrap;
129
+ width: 1px;
130
+ }
131
+ </style>
132
+
133
+ <style lang="scss">
134
+ .el-popper.is-clipboard-tooltip {
135
+ padding: 4px 10px;
136
+ font-family: Asap;
137
+ background: #f3ecf6 !important;
138
+ border: 1px solid $app-primary-color;
139
+
140
+ & .el-popper__arrow::before {
141
+ border: 1px solid;
142
+ border-color: $app-primary-color;
143
+ background: #f3ecf6;
144
+ }
145
+ }
146
+ </style>
@@ -1,11 +1,11 @@
1
1
  <template>
2
- <div v-if="provenanceEntry" class="main" v-loading="loading">
3
- <div class="block" v-if="provenanceEntry.title">
4
- <div class="title">{{ capitalise(provenanceEntry.title) }}</div>
2
+ <div v-if="tooltipEntry" class="main" v-loading="loading">
3
+ <div class="block" v-if="tooltipEntry.title">
4
+ <div class="title">{{ capitalise(tooltipEntry.title) }}</div>
5
5
  <div
6
6
  v-if="
7
- provenanceEntry.provenanceTaxonomyLabel &&
8
- provenanceEntry.provenanceTaxonomyLabel.length > 0
7
+ tooltipEntry.provenanceTaxonomyLabel &&
8
+ tooltipEntry.provenanceTaxonomyLabel.length > 0
9
9
  "
10
10
  class="subtitle"
11
11
  >
@@ -13,7 +13,7 @@
13
13
  </div>
14
14
  </div>
15
15
  <div class="block" v-else>
16
- <div class="title">{{ provenanceEntry.featureId }}</div>
16
+ <div class="title">{{ tooltipEntry.featureId }}</div>
17
17
  </div>
18
18
  <div v-if="featuresAlert" class="attribute-title-container">
19
19
  <span class="attribute-title">Alert</span>
@@ -51,8 +51,8 @@
51
51
  </div>
52
52
  <transition name="slide-fade">
53
53
  <div v-show="showDetails" class="content-container scrollbar">
54
- {{ provenanceEntry.paths }}
55
- <div v-if="provenanceEntry.origins && provenanceEntry.origins.length > 0" class="block">
54
+ {{ tooltipEntry.paths }}
55
+ <div v-if="tooltipEntry.origins && tooltipEntry.origins.length > 0" class="block">
56
56
  <div class="attribute-title-container">
57
57
  <span class="attribute-title">Origin</span>
58
58
  <el-popover
@@ -70,17 +70,17 @@
70
70
  </el-popover>
71
71
  </div>
72
72
  <div
73
- v-for="(origin, i) in provenanceEntry.origins"
73
+ v-for="(origin, i) in tooltipEntry.origins"
74
74
  class="attribute-content"
75
75
  :origin-item-label="origin"
76
76
  :key="origin"
77
77
  >
78
78
  {{ capitalise(origin) }}
79
- <div v-if="i != provenanceEntry.origins.length - 1" class="separator"></div>
79
+ <div v-if="i != tooltipEntry.origins.length - 1" class="separator"></div>
80
80
  </div>
81
81
  <el-button
82
82
  v-show="
83
- provenanceEntry.originsWithDatasets && provenanceEntry.originsWithDatasets.length > 0
83
+ tooltipEntry.originsWithDatasets && tooltipEntry.originsWithDatasets.length > 0
84
84
  "
85
85
  class="button"
86
86
  id="open-dendrites-button"
@@ -90,27 +90,27 @@
90
90
  </el-button>
91
91
  </div>
92
92
  <div
93
- v-if="provenanceEntry.components && provenanceEntry.components.length > 0"
93
+ v-if="tooltipEntry.components && tooltipEntry.components.length > 0"
94
94
  class="block"
95
95
  >
96
96
  <div class="attribute-title-container">
97
97
  <div class="attribute-title">Components</div>
98
98
  </div>
99
99
  <div
100
- v-for="(component, i) in provenanceEntry.components"
100
+ v-for="(component, i) in tooltipEntry.components"
101
101
  class="attribute-content"
102
102
  :component-item-label="component"
103
103
  :key="component"
104
104
  >
105
105
  {{ capitalise(component) }}
106
106
  <div
107
- v-if="i != provenanceEntry.components.length - 1"
107
+ v-if="i != tooltipEntry.components.length - 1"
108
108
  class="separator"
109
109
  ></div>
110
110
  </div>
111
111
  </div>
112
112
  <div
113
- v-if="provenanceEntry.destinations && provenanceEntry.destinations.length > 0"
113
+ v-if="tooltipEntry.destinations && tooltipEntry.destinations.length > 0"
114
114
  class="block"
115
115
  >
116
116
  <div class="attribute-title-container">
@@ -130,21 +130,21 @@
130
130
  </el-popover>
131
131
  </div>
132
132
  <div
133
- v-for="(destination, i) in provenanceEntry.destinations"
133
+ v-for="(destination, i) in tooltipEntry.destinations"
134
134
  class="attribute-content"
135
135
  :destination-item-label="destination"
136
136
  :key="destination"
137
137
  >
138
138
  {{ capitalise(destination) }}
139
139
  <div
140
- v-if="i != provenanceEntry.destinations.length - 1"
140
+ v-if="i != tooltipEntry.destinations.length - 1"
141
141
  class="separator"
142
142
  ></div>
143
143
  </div>
144
144
  <el-button
145
145
  v-show="
146
- provenanceEntry.destinationsWithDatasets &&
147
- provenanceEntry.destinationsWithDatasets.length > 0
146
+ tooltipEntry.destinationsWithDatasets &&
147
+ tooltipEntry.destinationsWithDatasets.length > 0
148
148
  "
149
149
  class="button"
150
150
  @click="openAxons"
@@ -155,8 +155,8 @@
155
155
 
156
156
  <el-button
157
157
  v-show="
158
- provenanceEntry.componentsWithDatasets &&
159
- provenanceEntry.componentsWithDatasets.length > 0
158
+ tooltipEntry.componentsWithDatasets &&
159
+ tooltipEntry.componentsWithDatasets.length > 0
160
160
  "
161
161
  class="button"
162
162
  @click="openAll"
@@ -187,7 +187,7 @@ const capitalise = function (str) {
187
187
  export default {
188
188
  name: "ProvenancePopup",
189
189
  props: {
190
- provenanceEntry: {
190
+ tooltipEntry: {
191
191
  type: Object,
192
192
  default: () => ({
193
193
  destinations: [],
@@ -200,7 +200,7 @@ export default {
200
200
  }),
201
201
  },
202
202
  },
203
- // inject: ["getFeaturesAlert"],
203
+ inject: ["getFeaturesAlert"],
204
204
  data: function () {
205
205
  return {
206
206
  controller: undefined,
@@ -219,21 +219,20 @@ export default {
219
219
  },
220
220
  computed: {
221
221
  featuresAlert() {
222
- // return this.getFeaturesAlert();
223
- return ""
222
+ return this.getFeaturesAlert();
224
223
  },
225
224
  resources: function () {
226
225
  let resources = [];
227
- if (this.provenanceEntry && this.provenanceEntry.hyperlinks) {
228
- resources = this.provenanceEntry.hyperlinks;
226
+ if (this.tooltipEntry && this.tooltipEntry.hyperlinks) {
227
+ resources = this.tooltipEntry.hyperlinks;
229
228
  }
230
229
  return resources;
231
230
  },
232
231
  originDescription: function () {
233
232
  if (
234
- this.provenanceEntry &&
235
- this.provenanceEntry.title &&
236
- this.provenanceEntry.title.toLowerCase().includes("motor")
233
+ this.tooltipEntry &&
234
+ this.tooltipEntry.title &&
235
+ this.tooltipEntry.title.toLowerCase().includes("motor")
237
236
  ) {
238
237
  return this.originDescriptions.motor;
239
238
  } else {
@@ -242,7 +241,7 @@ export default {
242
241
  },
243
242
  provSpeciesDescription: function () {
244
243
  let text = "Studied in";
245
- this.provenanceEntry.provenanceTaxonomyLabel.forEach((label) => {
244
+ this.tooltipEntry.provenanceTaxonomyLabel.forEach((label) => {
246
245
  text += ` ${label},`;
247
246
  });
248
247
  text = text.slice(0, -1); // remove last comma
@@ -263,19 +262,19 @@ export default {
263
262
  openAll: function () {
264
263
  EventBus.emit("onActionClick", {
265
264
  type: "Facets",
266
- labels: this.provenanceEntry.componentsWithDatasets.map((a) => a.name),
265
+ labels: this.tooltipEntry.componentsWithDatasets.map((a) => a.name),
267
266
  });
268
267
  },
269
268
  openAxons: function () {
270
269
  EventBus.emit("onActionClick", {
271
270
  type: "Facets",
272
- labels: this.provenanceEntry.destinationsWithDatasets.map((a) => a.name),
271
+ labels: this.tooltipEntry.destinationsWithDatasets.map((a) => a.name),
273
272
  });
274
273
  },
275
274
  openDendrites: function () {
276
275
  EventBus.emit("onActionClick", {
277
276
  type: "Facets",
278
- labels: this.provenanceEntry.originsWithDatasets.map((a) => a.name),
277
+ labels: this.tooltipEntry.originsWithDatasets.map((a) => a.name),
279
278
  });
280
279
  },
281
280
  pubmedSearchUrlUpdate: function (val) {
@@ -1,44 +1,35 @@
1
1
  <template>
2
2
  <div class="tooltip-container" id="tooltip-container">
3
- <template v-if="tooltipType === 'annotation'">
3
+ <template v-if="annotationDisplay">
4
4
  <annotation-popup
5
5
  :annotationEntry="annotationEntry"
6
6
  @annotation="$emit('annotation', $event)"
7
7
  />
8
8
  </template>
9
- <template v-if="tooltipType === 'provenance'">
10
- <provenance-popup :provenanceEntry="provenanceEntry" />
11
- </template>
12
- <template v-if="tooltipType === 'image'">
13
- <image-gallery-popup :imageEntry="imageEntry" />
9
+ <template v-else>
10
+ <provenance-popup :tooltipEntry="tooltipEntry" />
14
11
  </template>
15
12
  </div>
16
13
  </template>
17
14
 
18
15
  <script>
19
- import EventBus from "../EventBus.js";
16
+ import EventBus from '../EventBus.js';
20
17
 
21
18
  export default {
22
19
  name: "Tooltip",
23
20
  props: {
24
- tooltipType: {
25
- type: String,
26
- default: "",
27
- },
28
- provenanceEntry: {
21
+ tooltipEntry: {
29
22
  type: Object,
30
- default: {},
23
+ },
24
+ annotationDisplay: {
25
+ type: Boolean,
26
+ default: false,
31
27
  },
32
28
  annotationEntry: {
33
29
  type: Object,
34
- default: {},
35
- },
36
- imageEntry: {
37
- type: Array,
38
- default: [],
39
30
  },
40
31
  },
41
- mounted: function () {
32
+ mounted: function() {
42
33
  // Emit events from child components
43
34
  EventBus.on("onActionClick", (data) => {
44
35
  this.$emit("onActionClick", data);
@@ -2,5 +2,6 @@ import DrawToolbar from "./DrawToolbar/DrawToolbar.vue";
2
2
  import HelpModeDialog from "./HelpModeDialog/HelpModeDialog.vue";
3
3
  import Tooltip from "./Tooltip/Tooltip.vue";
4
4
  import TreeControls from "./TreeControls/TreeControls.vue";
5
+ import CopyToClipboard from "./CopyToClipboard/CopyToClipboard.vue";
5
6
 
6
- export { DrawToolbar, HelpModeDialog, Tooltip, TreeControls };
7
+ export { DrawToolbar, HelpModeDialog, Tooltip, TreeControls, CopyToClipboard };