@abi-software/map-side-bar 1.2.2 → 1.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.
@@ -1,404 +1,324 @@
1
- <template>
2
- <div class="dataset-card-container" ref="container">
3
- <div v-bind:class=" expanded ? 'dataset-card-expanded' : 'dataset-card'" ref="card">
4
- <div v-if="entry.id !== 0" class="seperator-path"></div>
5
- <div v-loading="loading" class="card" >
6
- <span class="card-left">
7
- <img svg-inline class="banner-img" :src="thumbnail" @click="openDataset"/>
8
- </span>
9
- <div class="card-right" >
10
- <div class="title" @click="cardClicked">{{entry.name}}</div>
11
- <div class="details">{{contributors}} {{entry.publishDate ? `(${publishYear})` : ''}}</div>
12
- <div class="details">{{samples}}</div>
13
- <div class="details">id: {{discoverId}}</div>
14
- <div>
15
- <el-button v-if="!entry.simulation" @click="openDataset" size="mini" class="button" icon="el-icon-coin">View dataset</el-button>
16
- </div>
17
- <div>
18
- <el-button v-if="entry.scaffolds" @click="openScaffold" size="mini" class="button" icon="el-icon-view">View scaffold</el-button>
19
- </div>
20
- <div>
21
- <el-button v-if="hasCSVFile" @click="openPlot" size="mini" class="button" icon="el-icon-view">View plot</el-button>
22
- </div>
23
- <div>
24
- <el-button v-if="entry.simulation" @click="openRepository" size="mini" class="button" icon="el-icon-view">View repository</el-button>
25
- </div>
26
- <div>
27
- <el-button v-if="entry.simulation" @click="openSimulation" size="mini" class="button" icon="el-icon-view">View simulation</el-button>
28
- </div>
29
- </div>
30
-
31
- </div>
32
- <p v-if="(cardOverflow && !expanded)" class="read-more"><el-button @click="expand" class="read-more-button">Read more...</el-button></p>
33
- </div>
34
- </div>
35
- </template>
36
-
37
-
38
- <script>
39
- /* eslint-disable no-alert, no-console */
40
- import Vue from "vue";
41
- import { Button, Icon } from "element-ui";
42
- import lang from "element-ui/lib/locale/lang/en";
43
- import locale from "element-ui/lib/locale";
44
- import EventBus from "./EventBus"
45
- import speciesMap from "./species-map";
46
- import hardcoded_info from './hardcoded-context-info'
47
-
48
- locale.use(lang);
49
- Vue.use(Button);
50
- Vue.use(Icon);
51
-
52
-
53
- const capitalise = function(string){
54
- return string.replace(/\b\w/g, v => v.toUpperCase());
55
- }
56
-
57
- export default {
58
- name: "DatasetCard",
59
- props: {
60
- /**
61
- * Object containing information for
62
- * the required viewing.
63
- */
64
- entry: {
65
- type: Object,
66
- default: () => {}
67
- },
68
- envVars: {
69
- type: Object,
70
- default: () => {}
71
- },
72
- },
73
- data: function () {
74
- return {
75
- thumbnail: require('@/../assets/missing-image.svg'),
76
- dataLocation: this.entry.doi,
77
- discoverId: undefined,
78
- cardOverflow: false,
79
- expanded: false,
80
- loading: false,
81
- lastDoi: undefined,
82
- };
83
- },
84
- computed: {
85
- hasCSVFile: function(){
86
- return ( this.entry.csvFiles && this.entry.csvFiles.length !== 0 )
87
- },
88
- contributors: function() {
89
- let text = "";
90
- if (this.entry.contributors) {
91
- if (this.entry.contributors.length === 1) {
92
- text = this.lastName(this.entry.contributors[0].name);
93
- } else if (this.entry.contributors.length === 2) {
94
- text = this.lastName(this.entry.contributors[0].name) + " & " + this.lastName(this.entry.contributors[1].name);
95
- } else if (this.entry.contributors.length > 2) {
96
- text = this.lastName(this.entry.contributors[0].name) + " et al.";
97
- }
98
- }
99
- return text;
100
- },
101
- samples: function() {
102
- let text = "";
103
- if (this.entry.species) {
104
- if (speciesMap[this.entry.species[0].toLowerCase()]){
105
- text = `${speciesMap[this.entry.species[0].toLowerCase()]}`;
106
- } else {
107
- text = `${this.entry.species}`;
108
- }
109
- }
110
- if (this.entry.numberSamples > 0) {
111
- text += " (";
112
- if (this.entry.numberSamples === 1) {
113
- text += `${this.entry.numberSamples} sample`;
114
- } else if (this.entry.numberSamples > 1) {
115
- text += `${this.entry.numberSamples} samples`;
116
- }
117
- if (this.entry.numberSubjects === 1) {
118
- text += ` from ${this.entry.numberSubjects} subject`;
119
- } else if (this.entry.numberSamples > 1) {
120
- text += ` from ${this.entry.numberSubjects} subjects`;
121
- }
122
- text += ")";
123
- }
124
-
125
- return text;
126
- },
127
- label: function(){
128
- return this.entry.organs ? this.entry.organs[0] : this.entry.name
129
- },
130
- publishYear: function() {
131
- return this.entry.publishDate.split('-')[0]
132
- }
133
- },
134
- methods: {
135
- cardClicked: function(){
136
- if(this.entry.scaffolds){
137
- this.openScaffold()
138
- }else{
139
- this.openDataset()
140
- }
141
- },
142
- openScaffold: function(){
143
- let action = {
144
- label: capitalise(this.label),
145
- resource: this.getScaffoldPath(this.discoverId, this.version, this.entry.scaffolds[0].dataset.path),
146
- title: "View 3D scaffold",
147
- type: "Scaffold",
148
- discoverId: this.discoverId,
149
- apiLocation: this.envVars.API_LOCATION,
150
- version: this.version,
151
- contextCardUrl: this.entry.contextualInformation ? this.getFileFromPath(this.discoverId, this.version,this.entry.contextualInformation) : undefined,
152
- banner: this.thumbnail
153
- }
154
- if (hardcoded_info[this.discoverId]){
155
- action.contextCardUrl = true
156
- }
157
- this.propogateCardAction(action)
158
- },
159
- openPlot: function(){
160
- let action = {
161
- label: capitalise(this.label),
162
- resource: this.getFileFromPath(this.discoverId, this.version, this.entry.csvFiles[0].dataset.path),
163
- title: "View plot",
164
- type: "Plot",
165
- discoverId: this.discoverId,
166
- apiLocation: this.envVars.API_LOCATION,
167
- version: this.version,
168
- contextCardUrl: this.entry.contextualInformation ? this.getFileFromPath(this.discoverId, this.version,this.entry.contextualInformation) : undefined,
169
- banner: this.thumbnail
170
- }
171
- this.propogateCardAction(action)
172
- },
173
- openDataset: function(){
174
- window.open(this.dataLocation,'_blank');
175
- },
176
- openRepository: function() {
177
- let apiLocation = this.envVars.API_LOCATION;
178
- this.entry.additionalLinks.forEach(function(el) {
179
- if (el.description == "Repository") {
180
- let xmlhttp = new XMLHttpRequest();
181
- xmlhttp.open("POST", apiLocation + "/pmr_latest_exposure", true);
182
- xmlhttp.setRequestHeader("Content-type", "application/json");
183
- xmlhttp.onreadystatechange = () => {
184
- if (xmlhttp.readyState === 4) {
185
- let url = "";
186
- if (xmlhttp.status === 200) {
187
- url = JSON.parse(xmlhttp.responseText)["url"];
188
- }
189
- if (url === "") {
190
- url = el.uri;
191
- }
192
- window.open(url,'_blank');
193
- }
194
- };
195
- xmlhttp.send(JSON.stringify({workspace_url: el.uri}));
196
- }
197
- });
198
- },
199
- openSimulation: function() {
200
- let isSedmlResource = false;
201
- let resource = undefined;
202
- this.entry.additionalLinks.forEach(function(el) {
203
- if (el.description == "SED-ML file") {
204
- isSedmlResource = true;
205
- resource = el.uri;
206
- } else if (!isSedmlResource && (el.description == "CellML file")) {
207
- resource = el.uri;
208
- }
209
- });
210
- let action = {
211
- label: undefined,
212
- resource: resource,
213
- dataset: this.dataLocation,
214
- apiLocation: this.envVars.API_LOCATION,
215
- version: this.version,
216
- discoverId: this.discoverId,
217
- contextCardUrl: this.entry.contextualInformation ? this.getFileFromPath(this.discoverId, this.version,this.entry.contextualInformation) : undefined,
218
- banner: this.thumbnail,
219
- title: "View simulation",
220
- name: this.entry.name,
221
- description: this.entry.description,
222
- type: "Simulation"
223
- }
224
- this.propogateCardAction(action)
225
- },
226
- propogateCardAction: function(action){
227
- EventBus.$emit("PopoverActionClick", action)
228
- this.$emit('contextUpdate', action)
229
- },
230
- getScaffoldPath: function(discoverId, version, scaffoldPath){
231
- let id = discoverId
232
- let path = `${this.envVars.API_LOCATION}s3-resource/${id}/${version}/files/${scaffoldPath}`
233
- return path
234
- },
235
- getFileFromPath: function(discoverId, version, path){
236
- return `${this.envVars.API_LOCATION}s3-resource/${discoverId}/${version}/files/${path}`
237
- },
238
- isOverflown: function(el){
239
- return el.clientHeight < el.scrollHeight
240
- },
241
- expand: function() {
242
- this.expanded = true
243
- },
244
- splitDOI: function(doi){
245
- return [doi.split('/')[doi.split('/').length-2], doi.split('/')[doi.split('/').length-1]]
246
- },
247
- getBanner: function () {
248
- // Only load banner if card has changed
249
- if (this.lastDoi !== this.entry.doi) {
250
- this.lastDoi = this.entry.doi
251
- this.loading = true
252
- let doi = this.splitDOI(this.entry.doi)
253
- fetch(`https://api.pennsieve.io/discover/datasets/doi/${doi[0]}/${doi[1]}`)
254
- .then((response) =>{
255
- if (!response.ok){
256
- throw Error(response.statusText)
257
- } else {
258
- return response.json()
259
- }
260
- })
261
- .then((data) => {
262
- this.thumbnail = data.banner
263
- this.discoverId = data.id
264
- this.version = data.version
265
- this.dataLocation = `https://sparc.science/datasets/${data.id}?type=dataset`
266
- this.loading = false
267
- })
268
- .catch(() => {
269
- //set defaults if we hit an error
270
- this.thumbnail = require('@/../assets/missing-image.svg')
271
- this.discoverId = undefined
272
- this.loading = false
273
- });
274
- }
275
-
276
- },
277
- lastName: function(fullName){
278
- return fullName.split(',')[0]
279
- },
280
- },
281
- mounted: function(){
282
- this.getBanner()
283
- this.cardOverflow = this.isOverflown(this.$refs.card)
284
- },
285
- updated: function () {
286
- },
287
- watch: {
288
- // currently not using card overflow
289
- 'entry.description': function() { // watch it
290
- this.cardOverflow = false
291
- this.expanded = false
292
- this.cardOverflow = this.isOverflown(this.$refs.card)
293
- }
294
- },
295
- };
296
- </script>
297
-
298
- <!-- Add "scoped" attribute to limit CSS to this component only -->
299
- <style scoped>
300
- .dataset-card {
301
- padding-left: 16px;
302
- position: relative;
303
- }
304
- .seperator-path {
305
- width: 486px;
306
- height: 0px;
307
- border: solid 1px #e4e7ed;
308
- background-color: #e4e7ed;
309
- }
310
- .title {
311
- padding-bottom: 5px;
312
- font-family: Asap;
313
- font-size: 14px;
314
- font-weight: bold;
315
- font-stretch: normal;
316
- font-style: normal;
317
- line-height: 1.5;
318
- letter-spacing: 1.05px;
319
- color: #484848;
320
- cursor: pointer;
321
- }
322
- .card {
323
- padding-top: 18px;
324
- position: relative;
325
- display: flex;
326
- }
327
-
328
- .card-left{
329
- flex: 1
330
- }
331
-
332
- .card-right {
333
- flex: 1.3;
334
- padding-left: 6px;
335
- }
336
-
337
- .dataset-card .read-more {
338
- position: absolute;
339
- z-index: 9;
340
- bottom: 0;
341
- left: 0;
342
- width: 100%;
343
- height: 20px;
344
- margin: 0; padding: 20px 66px;
345
- /* "transparent" only works here because == rgba(0,0,0,0) */
346
- background-image: linear-gradient(to bottom, transparent, white);
347
- pointer-events: none;
348
- }
349
-
350
- .read-more-button{
351
- width: 85px;
352
- height: 20px;
353
- font-family: Asap;
354
- font-size: 14px;
355
- font-weight: normal;
356
- font-stretch: normal;
357
- font-style: normal;
358
- line-height: normal;
359
- letter-spacing: normal;
360
- color: #8300bf;
361
- padding: 0px;
362
- pointer-events: all;
363
- cursor: pointer;
364
- }
365
-
366
- .button{
367
- z-index: 10;
368
- font-family: Asap;
369
- font-size: 14px;
370
- font-weight: normal;
371
- font-stretch: normal;
372
- font-style: normal;
373
- line-height: normal;
374
- letter-spacing: normal;
375
- background-color: #8300bf;
376
- border: #8300bf;
377
- color: white;
378
- cursor: pointer;
379
- margin-top: 8px;
380
- }
381
-
382
- .button:hover {
383
- background-color: #8300bf;
384
- color: white;
385
- }
386
-
387
- .banner-img {
388
- width: 128px;
389
- height: 128px;
390
- box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.25);
391
- background-color: #ffffff;
392
- cursor: pointer;
393
- }
394
- .details{
395
- font-family: Asap;
396
- font-size: 14px;
397
- font-weight: normal;
398
- font-stretch: normal;
399
- font-style: normal;
400
- line-height: 1.5;
401
- letter-spacing: 1.05px;
402
- color: #484848;
403
- }
404
- </style>
1
+ <template>
2
+ <div class="dataset-card-container" ref="container">
3
+ <div class="dataset-card" ref="card">
4
+ <div class="seperator-path"></div>
5
+ <div v-loading="loading" class="card" >
6
+ <span class="card-left">
7
+ <image-gallery v-if="!loading && discoverId"
8
+ :datasetId="discoverId"
9
+ :datasetVersion="version"
10
+ :entry="entry"
11
+ :envVars="envVars"
12
+ :label="label"
13
+ :datasetThumbnail="thumbnail"
14
+ :dataset-biolucida="biolucidaData"
15
+ :category="currentCategory"
16
+ @card-clicked="galleryClicked"
17
+ />
18
+ </span>
19
+ <div class="card-right" >
20
+ <div class="title" @click="cardClicked">{{entry.name}}</div>
21
+ <div class="details">{{contributors}} {{entry.publishDate ? `(${publishYear})` : ''}}</div>
22
+ <div class="details">{{samples}}</div>
23
+ <div v-if="!entry.detailsReady" class="details loading-icon" v-loading="!entry.detailsReady"></div>
24
+ <div>
25
+ <el-button v-if="entry.simulation" @click="openRepository" size="mini" class="button" icon="el-icon-view">View repository</el-button>
26
+ </div>
27
+ <div class="badges-container">
28
+ <badges-group
29
+ :entry="entry"
30
+ :dataset-biolucida="biolucidaData"
31
+ @categoryChanged="categoryChanged"
32
+ />
33
+ </div>
34
+ </div>
35
+ </div>
36
+ </div>
37
+ </div>
38
+ </template>
39
+
40
+
41
+ <script>
42
+ /* eslint-disable no-alert, no-console */
43
+ import Vue from "vue";
44
+ import BadgesGroup from "./BadgesGroup.vue";
45
+ import { Button, Icon } from "element-ui";
46
+ import lang from "element-ui/lib/locale/lang/en";
47
+ import locale from "element-ui/lib/locale";
48
+ import EventBus from "./EventBus"
49
+ import speciesMap from "./species-map";
50
+ import ImageGallery from "./ImageGallery.vue";
51
+
52
+ locale.use(lang);
53
+ Vue.use(Button);
54
+ Vue.use(Icon);
55
+
56
+ export default {
57
+ name: "DatasetCard",
58
+ components: { BadgesGroup, ImageGallery },
59
+ props: {
60
+ /**
61
+ * Object containing information for
62
+ * the required viewing.
63
+ */
64
+ entry: {
65
+ type: Object,
66
+ default: () => {}
67
+ },
68
+ envVars: {
69
+ type: Object,
70
+ default: () => {}
71
+ },
72
+ },
73
+ data: function () {
74
+ return {
75
+ thumbnail: require('@/../assets/missing-image.svg'),
76
+ dataLocation: this.entry.doi,
77
+ discoverId: undefined,
78
+ loading: true,
79
+ version: 1,
80
+ lastDoi: undefined,
81
+ biolucidaData: undefined,
82
+ currentCategory: "All"
83
+ };
84
+ },
85
+ computed: {
86
+ contributors: function() {
87
+ let text = "";
88
+ if (this.entry.contributors) {
89
+ if (this.entry.contributors.length === 1) {
90
+ text = this.lastName(this.entry.contributors[0].name);
91
+ } else if (this.entry.contributors.length === 2) {
92
+ text = this.lastName(this.entry.contributors[0].name) + " & " + this.lastName(this.entry.contributors[1].name);
93
+ } else if (this.entry.contributors.length > 2) {
94
+ text = this.lastName(this.entry.contributors[0].name) + " et al.";
95
+ }
96
+ }
97
+ return text;
98
+ },
99
+ samples: function() {
100
+ let text = "";
101
+ if (this.entry.species) {
102
+ if (speciesMap[this.entry.species[0].toLowerCase()]){
103
+ text = `${speciesMap[this.entry.species[0].toLowerCase()]}`;
104
+ } else {
105
+ text = `${this.entry.species}`;
106
+ }
107
+ }
108
+ if (this.entry.numberSamples > 0) {
109
+ text += " (";
110
+ if (this.entry.numberSamples === 1) {
111
+ text += `${this.entry.numberSamples} sample`;
112
+ } else if (this.entry.numberSamples > 1) {
113
+ text += `${this.entry.numberSamples} samples`;
114
+ }
115
+ if (this.entry.numberSubjects === 1) {
116
+ text += ` from ${this.entry.numberSubjects} subject`;
117
+ } else if (this.entry.numberSamples > 1) {
118
+ text += ` from ${this.entry.numberSubjects} subjects`;
119
+ }
120
+ text += ")";
121
+ }
122
+
123
+ return text;
124
+ },
125
+ label: function(){
126
+ return this.entry.organs ? this.entry.organs[0] : this.entry.name
127
+ },
128
+ publishYear: function() {
129
+ return this.entry.publishDate.split('-')[0]
130
+ }
131
+ },
132
+ methods: {
133
+ cardClicked: function(){
134
+ this.openDataset()
135
+ },
136
+ categoryChanged: function(name) {
137
+ this.currentCategory = name;
138
+ },
139
+ galleryClicked: function(payload) {
140
+ this.propogateCardAction(payload)
141
+ },
142
+ openDataset: function(){
143
+ window.open(this.dataLocation,'_blank');
144
+ },
145
+ openRepository: function() {
146
+ let apiLocation = this.envVars.API_LOCATION;
147
+ this.entry.additionalLinks.forEach(function(el) {
148
+ if (el.description == "Repository") {
149
+ let xmlhttp = new XMLHttpRequest();
150
+ xmlhttp.open("POST", apiLocation + "/pmr_latest_exposure", true);
151
+ xmlhttp.setRequestHeader("Content-type", "application/json");
152
+ xmlhttp.onreadystatechange = () => {
153
+ if (xmlhttp.readyState === 4) {
154
+ let url = "";
155
+ if (xmlhttp.status === 200) {
156
+ url = JSON.parse(xmlhttp.responseText)["url"];
157
+ }
158
+ if (url === "") {
159
+ url = el.uri;
160
+ }
161
+ window.open(url,'_blank');
162
+ }
163
+ };
164
+ xmlhttp.send(JSON.stringify({workspace_url: el.uri}));
165
+ }
166
+ });
167
+ },
168
+ propogateCardAction: function(action){
169
+ EventBus.$emit("PopoverActionClick", action)
170
+ this.$emit('contextUpdate', action)
171
+ },
172
+ splitDOI: function(doi){
173
+ return [doi.split('/')[doi.split('/').length-2], doi.split('/')[doi.split('/').length-1]]
174
+ },
175
+ getBanner: function () {
176
+ // Only load banner if card has changed
177
+ if (this.lastDoi !== this.entry.doi) {
178
+ this.lastDoi = this.entry.doi
179
+ this.loading = true
180
+ let doi = this.splitDOI(this.entry.doi)
181
+ fetch(`${this.envVars.PENNSIEVE_API_LOCATION}/discover/datasets/doi/${doi[0]}/${doi[1]}`)
182
+ .then((response) =>{
183
+ if (!response.ok){
184
+ throw Error(response.statusText)
185
+ } else {
186
+ return response.json()
187
+ }
188
+ })
189
+ .then((data) => {
190
+ this.thumbnail = data.banner
191
+ this.discoverId = data.id
192
+ this.version = data.version
193
+ this.dataLocation = `https://sparc.science/datasets/${data.id}?type=dataset`
194
+ this.getBiolucidaInfo(this.discoverId)
195
+ this.loading = false
196
+ })
197
+ .catch(() => {
198
+ //set defaults if we hit an error
199
+ this.thumbnail = require('@/../assets/missing-image.svg')
200
+ this.discoverId = Number(this.entry.datasetId)
201
+ this.loading = false
202
+ });
203
+ }
204
+
205
+ },
206
+ lastName: function(fullName){
207
+ return fullName.split(',')[0]
208
+ },
209
+ getBiolucidaInfo: function(id) {
210
+ let apiLocation = this.envVars.API_LOCATION;
211
+ let endpoint = apiLocation + "image_search/" + id;
212
+ // Add parameters if we are sent them
213
+ fetch(endpoint)
214
+ .then(response => response.json())
215
+ .then(data => {
216
+ if (data.status == "success")
217
+ this.biolucidaData = data;
218
+ });
219
+ }
220
+ },
221
+ created: function() {
222
+ this.getBanner()
223
+ },
224
+ watch: {
225
+ // currently not using card overflow
226
+ 'entry.description': function() { // watch it
227
+ this.getBanner()
228
+ }
229
+ },
230
+ };
231
+ </script>
232
+
233
+ <!-- Add "scoped" attribute to limit CSS to this component only -->
234
+ <style scoped>
235
+ .dataset-card {
236
+ padding-left: 16px;
237
+ position: relative;
238
+ }
239
+
240
+ .title {
241
+ padding-bottom: 0.75rem;
242
+ font-family: Asap;
243
+ font-size: 14px;
244
+ font-weight: bold;
245
+ font-stretch: normal;
246
+ font-style: normal;
247
+ line-height: 1.5;
248
+ letter-spacing: 1.05px;
249
+ color: #484848;
250
+ cursor: pointer;
251
+ }
252
+ .card {
253
+ padding-top: 18px;
254
+ position: relative;
255
+ display: flex;
256
+ }
257
+
258
+ .card-left{
259
+ flex: 1
260
+ }
261
+
262
+ .card-right {
263
+ flex: 1.3;
264
+ padding-left: 6px;
265
+ }
266
+
267
+ .button{
268
+ z-index: 10;
269
+ font-family: Asap;
270
+ font-size: 14px;
271
+ font-weight: normal;
272
+ font-stretch: normal;
273
+ font-style: normal;
274
+ line-height: normal;
275
+ letter-spacing: normal;
276
+ background-color: #8300bf;
277
+ border: #8300bf;
278
+ color: white;
279
+ cursor: pointer;
280
+ margin-top: 8px;
281
+ }
282
+
283
+ .button:hover {
284
+ background-color: #8300bf;
285
+ color: white;
286
+ }
287
+
288
+ .banner-img {
289
+ width: 128px;
290
+ height: 128px;
291
+ box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.25);
292
+ background-color: #ffffff;
293
+ cursor: pointer;
294
+ }
295
+ .details{
296
+ font-family: Asap;
297
+ font-size: 14px;
298
+ font-weight: normal;
299
+ font-stretch: normal;
300
+ font-style: normal;
301
+ line-height: 1.5;
302
+ letter-spacing: 1.05px;
303
+ color: #484848;
304
+ }
305
+
306
+ .badges-container {
307
+ margin-top:0.75rem;
308
+ }
309
+
310
+ .loading-icon {
311
+ z-index: 20;
312
+ width: 40px;
313
+ height: 40px;
314
+ left: 80px;
315
+ }
316
+
317
+ .loading-icon >>> .el-loading-mask {
318
+ background-color: rgba(117, 190, 218, 0.0) !important;
319
+ }
320
+
321
+ .loading-icon >>> .el-loading-spinner .path {
322
+ stroke: #8300bf;
323
+ }
324
+ </style>