@abi-software/simulationvuer 2.0.7 → 2.0.9
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/simulationvuer.js +3559 -3538
- package/dist/simulationvuer.umd.cjs +31 -31
- package/dist/style.css +1 -1
- package/package.json +1 -1
- package/src/App.vue +112 -18
- package/src/components/SimulationVuer.vue +150 -80
- package/src/components/SimulationVuerInput.vue +32 -16
- package/src/components/common.js +1 -1
- package/vuese-generator.js +0 -1
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
<template>
|
|
2
2
|
<div class="simulation-vuer" v-loading="showUserMessage" :element-loading-text="userMessage">
|
|
3
|
-
<p v-if="!hasValidSimulationUiInfo && !showUserMessage" class="default error"><span class="error">Error:</span>
|
|
3
|
+
<p v-if="!hasValidSimulationUiInfo && !showUserMessage" class="default error"><span class="error">Error:</span> {{ errorMessage }}.</p>
|
|
4
4
|
<div class="main" v-if="hasValidSimulationUiInfo">
|
|
5
5
|
<div class="main-left">
|
|
6
|
-
<p class="default name" v-if="!libopencorSet">{{name}}</p>
|
|
6
|
+
<p class="default name" v-if="!libopencorSet">{{ name }}</p>
|
|
7
7
|
<el-divider v-if="!libopencorSet"></el-divider>
|
|
8
8
|
<p class="default input-parameters">Input parameters</p>
|
|
9
9
|
<div class="input scrollbar">
|
|
@@ -33,10 +33,10 @@
|
|
|
33
33
|
<p class="default note" v-if="uuid">Additional parameters are available on oSPARC</p>
|
|
34
34
|
</div>
|
|
35
35
|
<div class="main-right" ref="output" v-show="isSimulationValid">
|
|
36
|
-
<PlotVuer v-for="(
|
|
36
|
+
<PlotVuer v-for="(_outputPlot, index) in simulationUiInfo.output.plots"
|
|
37
37
|
:key="`output-${index}`"
|
|
38
38
|
:metadata="plotMetadata(index)"
|
|
39
|
-
:data-source="{data: simulationResults[index]}"
|
|
39
|
+
:data-source="{ data: simulationResults[index] }"
|
|
40
40
|
:plotLayout="layout[index]"
|
|
41
41
|
:plotType="'plotly-only'"
|
|
42
42
|
:selectorUi="false"
|
|
@@ -82,7 +82,7 @@ export default {
|
|
|
82
82
|
},
|
|
83
83
|
props: {
|
|
84
84
|
/**
|
|
85
|
-
* The
|
|
85
|
+
* The URL to the API location.
|
|
86
86
|
*/
|
|
87
87
|
apiLocation: {
|
|
88
88
|
required: true,
|
|
@@ -93,10 +93,19 @@ export default {
|
|
|
93
93
|
* to a PMR file, if it is a string.
|
|
94
94
|
*/
|
|
95
95
|
id: {
|
|
96
|
-
required:
|
|
96
|
+
required: false,
|
|
97
|
+
default: 0,
|
|
98
|
+
},
|
|
99
|
+
/**
|
|
100
|
+
* A COMBINE archive that was passed directly.
|
|
101
|
+
*/
|
|
102
|
+
combineArchive: {
|
|
103
|
+
required: false,
|
|
104
|
+
type: Uint8Array,
|
|
105
|
+
default: undefined,
|
|
97
106
|
},
|
|
98
107
|
},
|
|
99
|
-
data: function() {
|
|
108
|
+
data: function () {
|
|
100
109
|
// Retrieve some information about the dataset.
|
|
101
110
|
|
|
102
111
|
if (this.id > 0) {
|
|
@@ -109,7 +118,7 @@ export default {
|
|
|
109
118
|
const datasetInfo = JSON.parse(xmlhttp.responseText);
|
|
110
119
|
|
|
111
120
|
this.name = datasetInfo.name;
|
|
112
|
-
this.uuid = (datasetInfo.study !== undefined)?datasetInfo.study.uuid:undefined;
|
|
121
|
+
this.uuid = (datasetInfo.study !== undefined) ? datasetInfo.study.uuid : undefined;
|
|
113
122
|
}
|
|
114
123
|
}
|
|
115
124
|
};
|
|
@@ -159,29 +168,6 @@ export default {
|
|
|
159
168
|
},
|
|
160
169
|
};
|
|
161
170
|
},
|
|
162
|
-
/**
|
|
163
|
-
* @public
|
|
164
|
-
* Download the PMR file associated with the given `url`.
|
|
165
|
-
* @arg `url`
|
|
166
|
-
*/
|
|
167
|
-
downloadPmrFile(url) {
|
|
168
|
-
return new Promise((resolve, reject) => {
|
|
169
|
-
const xmlhttp = new XMLHttpRequest();
|
|
170
|
-
|
|
171
|
-
xmlhttp.open("POST", this.apiLocation + "/pmr_file");
|
|
172
|
-
xmlhttp.setRequestHeader("Content-type", "application/json");
|
|
173
|
-
xmlhttp.onreadystatechange = () => {
|
|
174
|
-
if (xmlhttp.readyState === 4) {
|
|
175
|
-
if (xmlhttp.status === 200) {
|
|
176
|
-
resolve(Uint8Array.from(atob(xmlhttp.response), (c) => c.charCodeAt(0)));
|
|
177
|
-
}
|
|
178
|
-
|
|
179
|
-
reject();
|
|
180
|
-
}
|
|
181
|
-
};
|
|
182
|
-
xmlhttp.send(JSON.stringify({path: url.replace(PMR_URL, "")}));
|
|
183
|
-
});
|
|
184
|
-
},
|
|
185
171
|
/**
|
|
186
172
|
* @public
|
|
187
173
|
* Manage the file associated with the given `url` and `fileContents`.
|
|
@@ -235,10 +221,16 @@ export default {
|
|
|
235
221
|
|
|
236
222
|
const res = {};
|
|
237
223
|
const instanceTask = this.instance.tasks().get(0);
|
|
224
|
+
let foundAllOutputs = true;
|
|
225
|
+
let foundOutput;
|
|
238
226
|
|
|
239
227
|
for (const output of this.outputData()) {
|
|
228
|
+
foundOutput = false;
|
|
229
|
+
|
|
240
230
|
if (output === instanceTask.voiName()) {
|
|
241
231
|
res[output] = instanceTask.voiAsArray();
|
|
232
|
+
|
|
233
|
+
foundOutput = true;
|
|
242
234
|
}
|
|
243
235
|
|
|
244
236
|
if (res[output] === undefined) {
|
|
@@ -246,23 +238,38 @@ export default {
|
|
|
246
238
|
if (output === instanceTask.stateName(i)) {
|
|
247
239
|
res[output] = instanceTask.stateAsArray(i);
|
|
248
240
|
|
|
241
|
+
foundOutput = true;
|
|
242
|
+
|
|
249
243
|
break;
|
|
250
244
|
}
|
|
251
245
|
}
|
|
252
246
|
}
|
|
253
247
|
|
|
254
248
|
if (res[output] === undefined) {
|
|
255
|
-
for (let i = 0; instanceTask.variableCount(); ++i) {
|
|
249
|
+
for (let i = 0; i < instanceTask.variableCount(); ++i) {
|
|
256
250
|
if (output === instanceTask.variableName(i)) {
|
|
257
251
|
res[output] = instanceTask.variableAsArray(i);
|
|
258
252
|
|
|
253
|
+
foundOutput = true;
|
|
254
|
+
|
|
259
255
|
break;
|
|
260
256
|
}
|
|
261
257
|
}
|
|
262
258
|
}
|
|
259
|
+
|
|
260
|
+
if (!foundOutput) {
|
|
261
|
+
console.warn("SIMULATION: output '" + output + "' could not be found.");
|
|
262
|
+
|
|
263
|
+
foundAllOutputs = false;
|
|
264
|
+
}
|
|
263
265
|
}
|
|
264
266
|
|
|
265
|
-
|
|
267
|
+
if (foundAllOutputs) {
|
|
268
|
+
this.processSimulationResults(res);
|
|
269
|
+
} else {
|
|
270
|
+
this.hasValidSimulationUiInfo = false;
|
|
271
|
+
this.errorMessage = "some outputs could not be found";
|
|
272
|
+
}
|
|
266
273
|
|
|
267
274
|
this.showUserMessage = false;
|
|
268
275
|
},
|
|
@@ -281,6 +288,8 @@ export default {
|
|
|
281
288
|
this.hasValidSimulationUiInfo = validJson(this.simulationUiInfo, this.libopencor === undefined);
|
|
282
289
|
|
|
283
290
|
if (!this.hasValidSimulationUiInfo) {
|
|
291
|
+
this.errorMessage = "the simulation.json file is malformed";
|
|
292
|
+
|
|
284
293
|
return;
|
|
285
294
|
}
|
|
286
295
|
|
|
@@ -295,7 +304,8 @@ export default {
|
|
|
295
304
|
});
|
|
296
305
|
|
|
297
306
|
if (this.solver === undefined) {
|
|
298
|
-
|
|
307
|
+
this.hasValidSimulationUiInfo = false;
|
|
308
|
+
this.errorMessage = "no solver name and/or solver version specified";
|
|
299
309
|
|
|
300
310
|
return;
|
|
301
311
|
}
|
|
@@ -303,17 +313,6 @@ export default {
|
|
|
303
313
|
this.opencorBasedSimulation = this.solver.name === OPENCOR_SOLVER_NAME;
|
|
304
314
|
}
|
|
305
315
|
|
|
306
|
-
// Run the model if we are dealing with a PMR-based COMBINE archive.
|
|
307
|
-
|
|
308
|
-
if (this.libopencor !== undefined) {
|
|
309
|
-
this.userMessage = "Running the model...";
|
|
310
|
-
this.showUserMessage = true;
|
|
311
|
-
|
|
312
|
-
this.$nextTick(() => {
|
|
313
|
-
this.runSimulation();
|
|
314
|
-
});
|
|
315
|
-
}
|
|
316
|
-
|
|
317
316
|
// Initialise our UI.
|
|
318
317
|
|
|
319
318
|
this.simulationUiInfo.output.data.forEach((data) => {
|
|
@@ -370,6 +369,40 @@ export default {
|
|
|
370
369
|
finaliseUi(this);
|
|
371
370
|
});
|
|
372
371
|
},
|
|
372
|
+
/**
|
|
373
|
+
* @public
|
|
374
|
+
* Extract the simulation UI JSON file from the given file contents and build the simulation UI.
|
|
375
|
+
* @arg `libopencor`
|
|
376
|
+
* @arg `fileContents`
|
|
377
|
+
*/
|
|
378
|
+
extractAndBuildSimulationUi(libopencor, fileContents) {
|
|
379
|
+
this.libopencor = markRaw(libopencor);
|
|
380
|
+
this.libopencorSet = true;
|
|
381
|
+
this.fileManager = markRaw(this.libopencor.FileManager.instance());
|
|
382
|
+
|
|
383
|
+
const file = this.manageFile(PMR_URL + this.id, fileContents);
|
|
384
|
+
|
|
385
|
+
if (file.type().value !== libopencor.File.Type.COMBINE_ARCHIVE.value) {
|
|
386
|
+
this.showUserMessage = false;
|
|
387
|
+
} else {
|
|
388
|
+
const decoder = new TextDecoder();
|
|
389
|
+
const simulationJson = file.childFile("simulation.json");
|
|
390
|
+
|
|
391
|
+
if (simulationJson === null) {
|
|
392
|
+
this.errorMessage = "no simulation JSON file could be found";
|
|
393
|
+
|
|
394
|
+
this.showUserMessage = false;
|
|
395
|
+
} else {
|
|
396
|
+
const simulationUiInfo = JSON.parse(decoder.decode(simulationJson.contents()));
|
|
397
|
+
|
|
398
|
+
this.showUserMessage = false;
|
|
399
|
+
|
|
400
|
+
this.$nextTick(() => {
|
|
401
|
+
this.buildSimulationUi(simulationUiInfo);
|
|
402
|
+
});
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
},
|
|
373
406
|
/**
|
|
374
407
|
* @public
|
|
375
408
|
* Run the simulation-based dataset directly on oSPARC. Not all simulation-based datasets can be run directly on
|
|
@@ -414,9 +447,9 @@ export default {
|
|
|
414
447
|
* @public
|
|
415
448
|
* Data needed to specify the model output.
|
|
416
449
|
*/
|
|
417
|
-
|
|
450
|
+
outputData() {
|
|
418
451
|
if (this.output === undefined) {
|
|
419
|
-
if (this.simulationUiInfo.output.data !== undefined)
|
|
452
|
+
if (this.simulationUiInfo.output.data !== undefined) {
|
|
420
453
|
this.output = [];
|
|
421
454
|
|
|
422
455
|
this.simulationUiInfo.output.data.forEach((output) => {
|
|
@@ -442,8 +475,8 @@ export default {
|
|
|
442
475
|
json_config: {},
|
|
443
476
|
};
|
|
444
477
|
|
|
445
|
-
if (
|
|
446
|
-
|
|
478
|
+
if ((this.simulationUiInfo.simulation.opencor.endingPoint !== undefined)
|
|
479
|
+
&& (this.simulationUiInfo.simulation.opencor.pointInterval !== undefined)) {
|
|
447
480
|
request.opencor.json_config.simulation = {
|
|
448
481
|
"Ending point": this.simulationUiInfo.simulation.opencor.endingPoint,
|
|
449
482
|
"Point interval": this.simulationUiInfo.simulation.opencor.pointInterval,
|
|
@@ -475,7 +508,7 @@ export default {
|
|
|
475
508
|
// Convert, if needed, the results to a JSON format that is compatible
|
|
476
509
|
// with our OpenCOR results.
|
|
477
510
|
|
|
478
|
-
if (typeof(results) === "string") {
|
|
511
|
+
if (typeof (results) === "string") {
|
|
479
512
|
const SPACES = /[ \t]+/g;
|
|
480
513
|
const lines = results.trim().split("\n");
|
|
481
514
|
const iMax = lines[0].trim().split(SPACES).length;
|
|
@@ -564,7 +597,7 @@ export default {
|
|
|
564
597
|
|
|
565
598
|
let that = this;
|
|
566
599
|
|
|
567
|
-
setTimeout(function() {
|
|
600
|
+
setTimeout(function () {
|
|
568
601
|
that.checkSimulation(data);
|
|
569
602
|
}, 1000);
|
|
570
603
|
}
|
|
@@ -609,7 +642,7 @@ export default {
|
|
|
609
642
|
this.checkSimulation(response.data);
|
|
610
643
|
} else {
|
|
611
644
|
this.showUserMessage = false;
|
|
612
|
-
this.errorMessage = response.description
|
|
645
|
+
this.errorMessage = response.description;
|
|
613
646
|
}
|
|
614
647
|
} else {
|
|
615
648
|
this.showHttpIssue(xmlhttp);
|
|
@@ -620,7 +653,7 @@ export default {
|
|
|
620
653
|
});
|
|
621
654
|
},
|
|
622
655
|
},
|
|
623
|
-
created: function() {
|
|
656
|
+
created: function () {
|
|
624
657
|
// Try to retrieve the UI information.
|
|
625
658
|
|
|
626
659
|
if (this.id > 0) {
|
|
@@ -641,6 +674,8 @@ export default {
|
|
|
641
674
|
this.$nextTick(() => {
|
|
642
675
|
this.buildSimulationUi(JSON.parse(xmlhttp.responseText));
|
|
643
676
|
});
|
|
677
|
+
} else {
|
|
678
|
+
this.errorMessage = "the simulation dataset could not be retrieved";
|
|
644
679
|
}
|
|
645
680
|
}
|
|
646
681
|
};
|
|
@@ -650,8 +685,8 @@ export default {
|
|
|
650
685
|
this.userMessage = "Retrieving COMBINE archive from PMR...";
|
|
651
686
|
this.showUserMessage = true;
|
|
652
687
|
|
|
653
|
-
// Retrieve the
|
|
654
|
-
// then build the simulation UI.
|
|
688
|
+
// Retrieve the COMBINE archive, extract the simulation UI JSON file from
|
|
689
|
+
// it and then build the simulation UI.
|
|
655
690
|
|
|
656
691
|
this.$nextTick(() => {
|
|
657
692
|
const xmlhttp = new XMLHttpRequest();
|
|
@@ -662,32 +697,33 @@ export default {
|
|
|
662
697
|
if (xmlhttp.readyState === 4) {
|
|
663
698
|
if (xmlhttp.status === 200) {
|
|
664
699
|
libOpenCOR().then((libopencor) => {
|
|
665
|
-
this.libopencor
|
|
666
|
-
this.libopencorSet = true;
|
|
667
|
-
this.fileManager = markRaw(this.libopencor.FileManager.instance());
|
|
668
|
-
|
|
669
|
-
const fileContents = Uint8Array.from(atob(xmlhttp.response), (c) => c.charCodeAt(0));
|
|
670
|
-
const file = this.manageFile(PMR_URL + this.id, fileContents);
|
|
671
|
-
|
|
672
|
-
const decoder = new TextDecoder();
|
|
673
|
-
const simulationUiInfo = JSON.parse(decoder.decode(file.childFile("simulation.json").contents()));
|
|
674
|
-
|
|
675
|
-
this.showUserMessage = false;
|
|
676
|
-
|
|
677
|
-
this.$nextTick(() => {
|
|
678
|
-
this.buildSimulationUi(simulationUiInfo);
|
|
679
|
-
});
|
|
700
|
+
this.extractAndBuildSimulationUi(libopencor, Uint8Array.from(atob(xmlhttp.response), (c) => c.charCodeAt(0)));
|
|
680
701
|
});
|
|
681
702
|
} else {
|
|
703
|
+
this.errorMessage = "the COMBINE archive chould not be retrieved";
|
|
682
704
|
this.showUserMessage = false;
|
|
683
705
|
}
|
|
684
706
|
}
|
|
685
707
|
};
|
|
686
|
-
xmlhttp.send(JSON.stringify({path: this.id}));
|
|
708
|
+
xmlhttp.send(JSON.stringify({ path: this.id }));
|
|
687
709
|
});
|
|
710
|
+
} else if (this.combineArchive !== undefined) {
|
|
711
|
+
// Extract the simulation UI JSON file from the COMBINE archive and build
|
|
712
|
+
// the simulation UI.
|
|
713
|
+
|
|
714
|
+
this.userMessage = "Retrieving COMBINE archive...";
|
|
715
|
+
this.showUserMessage = true;
|
|
716
|
+
|
|
717
|
+
this.$nextTick(() => {
|
|
718
|
+
libOpenCOR().then((libopencor) => {
|
|
719
|
+
this.extractAndBuildSimulationUi(libopencor, this.combineArchive);
|
|
720
|
+
});
|
|
721
|
+
});
|
|
722
|
+
} else {
|
|
723
|
+
this.errorMessage = "an non-simulation dataset was provided";
|
|
688
724
|
}
|
|
689
725
|
},
|
|
690
|
-
mounted: function() {
|
|
726
|
+
mounted: function () {
|
|
691
727
|
// Finalise our UI.
|
|
692
728
|
// Note: we try both here and in the created() function since we have no
|
|
693
729
|
// idea how long it's going to take to retrieve the simulation UI
|
|
@@ -702,7 +738,6 @@ export default {
|
|
|
702
738
|
|
|
703
739
|
<!-- Add "scoped" attribute to limit CSS to this component only -->
|
|
704
740
|
<style scoped lang="scss">
|
|
705
|
-
|
|
706
741
|
.simulation-vuer {
|
|
707
742
|
--el-color-primary: #8300BF;
|
|
708
743
|
--el-color-primary-light-7: #DAB3EC;
|
|
@@ -710,80 +745,101 @@ export default {
|
|
|
710
745
|
--el-color-primary-light-9: #F3E6F9;
|
|
711
746
|
}
|
|
712
747
|
|
|
713
|
-
:deep(
|
|
748
|
+
:deep(.el-button:hover) {
|
|
714
749
|
box-shadow: -3px 2px 4px #00000040;
|
|
715
750
|
}
|
|
716
|
-
|
|
751
|
+
|
|
752
|
+
:deep(.el-divider) {
|
|
717
753
|
margin: -8px 0 8px 0 !important;
|
|
718
754
|
width: 210px;
|
|
719
755
|
}
|
|
720
|
-
|
|
756
|
+
|
|
757
|
+
:deep(.el-loading-spinner) {
|
|
721
758
|
.path {
|
|
722
759
|
stroke: #8300BF;
|
|
723
760
|
}
|
|
724
|
-
|
|
761
|
+
|
|
762
|
+
i,
|
|
763
|
+
.el-loading-text {
|
|
725
764
|
color: #8300BF;
|
|
726
765
|
}
|
|
727
766
|
}
|
|
767
|
+
|
|
728
768
|
div.input {
|
|
729
769
|
border: 1px solid #dcdfe6;
|
|
730
770
|
padding: 4px;
|
|
731
771
|
height: 300px;
|
|
732
772
|
}
|
|
773
|
+
|
|
733
774
|
div.main {
|
|
734
775
|
display: grid;
|
|
735
776
|
--mainLeftWidth: 243px;
|
|
736
777
|
grid-template-columns: var(--mainLeftWidth) calc(100% - var(--mainLeftWidth));
|
|
737
778
|
height: 100%;
|
|
738
779
|
}
|
|
780
|
+
|
|
739
781
|
div.main-left {
|
|
740
782
|
border-right: 1px solid #dcdfe6;
|
|
741
783
|
padding: 12px 20px 12px 12px;
|
|
742
784
|
height: 100%;
|
|
743
785
|
overflow: auto;
|
|
744
786
|
}
|
|
787
|
+
|
|
745
788
|
div.main-right.x1 {
|
|
746
789
|
height: 100%;
|
|
747
790
|
}
|
|
791
|
+
|
|
748
792
|
div.main-right.x2 {
|
|
749
793
|
height: 50%;
|
|
750
794
|
}
|
|
795
|
+
|
|
751
796
|
div.main-right.x3 {
|
|
752
797
|
height: 33.333%;
|
|
753
798
|
}
|
|
799
|
+
|
|
754
800
|
div.main-right.x4 {
|
|
755
801
|
height: 25%;
|
|
756
802
|
}
|
|
803
|
+
|
|
757
804
|
div.main-right.x5 {
|
|
758
805
|
height: 20%;
|
|
759
806
|
}
|
|
807
|
+
|
|
760
808
|
div.main-right.x6 {
|
|
761
809
|
height: 16.667%;
|
|
762
810
|
}
|
|
811
|
+
|
|
763
812
|
div.main-right.x7 {
|
|
764
813
|
height: 14.286%;
|
|
765
814
|
}
|
|
815
|
+
|
|
766
816
|
div.main-right.x8 {
|
|
767
817
|
height: 12.5%;
|
|
768
818
|
}
|
|
819
|
+
|
|
769
820
|
div.main-right.x9 {
|
|
770
821
|
height: 11.111%;
|
|
771
822
|
}
|
|
772
|
-
|
|
823
|
+
|
|
824
|
+
:deep(div.main-right div.controls) {
|
|
773
825
|
height: 0;
|
|
774
826
|
}
|
|
827
|
+
|
|
775
828
|
div.primary-button,
|
|
776
829
|
div.secondary-button {
|
|
777
830
|
display: flex;
|
|
778
831
|
justify-content: flex-end;
|
|
779
832
|
width: 210px;
|
|
780
833
|
}
|
|
834
|
+
|
|
781
835
|
div.primary-button {
|
|
782
836
|
margin-top: 14px;
|
|
783
837
|
}
|
|
838
|
+
|
|
784
839
|
div.secondary-button {
|
|
785
840
|
margin-top: 8px;
|
|
786
841
|
}
|
|
842
|
+
|
|
787
843
|
div.primary-button .el-button,
|
|
788
844
|
div.secondary-button .el-button,
|
|
789
845
|
div.primary-button .el-button:hover,
|
|
@@ -791,61 +847,75 @@ div.secondary-button .el-button:hover {
|
|
|
791
847
|
width: 121px;
|
|
792
848
|
border-color: #8300bf;
|
|
793
849
|
}
|
|
850
|
+
|
|
794
851
|
div.primary-button .el-button,
|
|
795
852
|
div.primary-button .el-button:hover {
|
|
796
853
|
background-color: #8300bf;
|
|
797
854
|
}
|
|
855
|
+
|
|
798
856
|
div.secondary-button .el-button,
|
|
799
857
|
div.secondary-button .el-button:hover {
|
|
800
858
|
background-color: #f9f2fc;
|
|
801
859
|
color: #8300bf;
|
|
802
860
|
}
|
|
861
|
+
|
|
803
862
|
div.scrollbar {
|
|
804
863
|
overflow-y: scroll;
|
|
805
864
|
scrollbar-width: thin;
|
|
806
865
|
}
|
|
866
|
+
|
|
807
867
|
div.scrollbar::-webkit-scrollbar {
|
|
808
868
|
width: 8px;
|
|
809
869
|
right: -8px;
|
|
810
870
|
background-color: #f5f5f5;
|
|
811
871
|
}
|
|
872
|
+
|
|
812
873
|
div.scrollbar::-webkit-scrollbar-thumb {
|
|
813
874
|
border-radius: 4px;
|
|
814
875
|
box-shadow: 0 2px 4px 0 rgba(0, 0, 0, 0.06);
|
|
815
876
|
background-color: #979797;
|
|
816
877
|
}
|
|
878
|
+
|
|
817
879
|
div.scrollbar::-webkit-scrollbar-track {
|
|
818
880
|
border-radius: 10px;
|
|
819
881
|
background-color: #f5f5f5;
|
|
820
882
|
}
|
|
883
|
+
|
|
821
884
|
div.simulation-vuer {
|
|
822
885
|
height: 100%;
|
|
823
886
|
}
|
|
887
|
+
|
|
824
888
|
p.default {
|
|
825
889
|
font-family: Asap, sans-serif;
|
|
826
890
|
letter-spacing: 0;
|
|
827
891
|
margin: 16px 0;
|
|
828
892
|
text-align: start;
|
|
829
893
|
}
|
|
894
|
+
|
|
830
895
|
p.error {
|
|
831
896
|
margin-left: 16px;
|
|
832
897
|
}
|
|
898
|
+
|
|
833
899
|
p.input-parameters {
|
|
834
900
|
margin-bottom: 8px;
|
|
835
901
|
}
|
|
902
|
+
|
|
836
903
|
p.name,
|
|
837
904
|
p.input-parameters {
|
|
838
905
|
margin-top: 0;
|
|
839
|
-
font-weight:
|
|
906
|
+
font-weight: bold;
|
|
840
907
|
}
|
|
908
|
+
|
|
841
909
|
p.name {
|
|
842
910
|
line-height: 20px;
|
|
843
911
|
}
|
|
912
|
+
|
|
844
913
|
p.note {
|
|
845
914
|
font-size: 12px;
|
|
846
915
|
line-height: 16px;
|
|
847
916
|
}
|
|
917
|
+
|
|
848
918
|
span.error {
|
|
849
|
-
font-weight:
|
|
919
|
+
font-weight: bold;
|
|
850
920
|
}
|
|
851
921
|
</style>
|
|
@@ -45,16 +45,16 @@ export default {
|
|
|
45
45
|
type: Number,
|
|
46
46
|
},
|
|
47
47
|
},
|
|
48
|
-
data: function() {
|
|
48
|
+
data: function () {
|
|
49
49
|
return {
|
|
50
50
|
isDiscrete: this.possibleValues !== undefined,
|
|
51
|
-
labelClasses: "default " + ((this.possibleValues !== undefined)?"discrete":"scalar"),
|
|
51
|
+
labelClasses: "default " + ((this.possibleValues !== undefined) ? "discrete" : "scalar"),
|
|
52
52
|
visible: true,
|
|
53
53
|
vModel: this.defaultValue,
|
|
54
54
|
};
|
|
55
55
|
},
|
|
56
56
|
methods: {
|
|
57
|
-
updateUi: function() {
|
|
57
|
+
updateUi: function () {
|
|
58
58
|
updateUi(this.$parent);
|
|
59
59
|
},
|
|
60
60
|
},
|
|
@@ -63,63 +63,76 @@ export default {
|
|
|
63
63
|
|
|
64
64
|
<!-- Add "scoped" attribute to limit CSS to this component only -->
|
|
65
65
|
<style scoped lang="scss">
|
|
66
|
-
|
|
67
|
-
:deep( .el-input-number.scalar ){
|
|
66
|
+
:deep(.el-input-number.scalar) {
|
|
68
67
|
margin-top: -8px;
|
|
69
68
|
width: 45px;
|
|
70
69
|
}
|
|
71
|
-
|
|
70
|
+
|
|
71
|
+
:deep(.el-input-number.scalar .el-input) {
|
|
72
72
|
width: 60px;
|
|
73
73
|
}
|
|
74
|
-
|
|
74
|
+
|
|
75
|
+
:deep(.el-input-number.scalar .el-input__inner:focus) {
|
|
75
76
|
border-color: #8300bf;
|
|
76
77
|
}
|
|
77
|
-
|
|
78
|
+
|
|
79
|
+
:deep(.el-select.discrete) {
|
|
78
80
|
margin-bottom: 16px;
|
|
79
81
|
}
|
|
80
|
-
|
|
82
|
+
|
|
83
|
+
:deep(.el-slider) {
|
|
81
84
|
width: 108px;
|
|
82
85
|
margin-top: -12px;
|
|
83
86
|
margin-left: 8px;
|
|
84
87
|
}
|
|
85
|
-
|
|
88
|
+
|
|
89
|
+
:deep(.el-slider__bar) {
|
|
86
90
|
background-color: #8300bf;
|
|
87
91
|
}
|
|
88
|
-
|
|
92
|
+
|
|
93
|
+
:deep(.el-slider__button) {
|
|
89
94
|
border-color: #8300bf;
|
|
90
95
|
}
|
|
96
|
+
|
|
91
97
|
.discrete {
|
|
92
98
|
margin-left: 8px;
|
|
93
99
|
width: 160px;
|
|
94
100
|
}
|
|
101
|
+
|
|
95
102
|
.discrete {
|
|
96
|
-
:deep(
|
|
103
|
+
:deep(.el-input__inner) {
|
|
97
104
|
font-family: Asap, sans-serif;
|
|
98
105
|
font-size: 16px;
|
|
99
106
|
}
|
|
100
107
|
}
|
|
101
|
-
|
|
102
|
-
.discrete :deep(
|
|
108
|
+
|
|
109
|
+
.discrete :deep(.el-input__inner:focus),
|
|
110
|
+
.discrete :deep(.el-input.is-focus .el-input__inner) {
|
|
103
111
|
border-color: #8300bf;
|
|
104
112
|
}
|
|
113
|
+
|
|
105
114
|
.discrete-popper .el-select-dropdown__item {
|
|
106
115
|
font-family: Asap, sans-serif;
|
|
107
116
|
}
|
|
117
|
+
|
|
108
118
|
.discrete-popper .el-select-dropdown__item.is-selected {
|
|
109
119
|
font-weight: normal;
|
|
110
120
|
color: #8300bf;
|
|
111
121
|
}
|
|
112
|
-
|
|
122
|
+
|
|
123
|
+
.scalar :deep(.el-input__inner) {
|
|
113
124
|
text-align: center;
|
|
114
125
|
}
|
|
115
126
|
|
|
116
|
-
.scalar :deep(.el-input__wrapper){
|
|
127
|
+
.scalar :deep(.el-input__wrapper) {
|
|
117
128
|
padding-left: 4px;
|
|
118
129
|
padding-right: 4px;
|
|
119
130
|
}
|
|
131
|
+
|
|
120
132
|
div.simulation-vuer {
|
|
121
133
|
height: 100%;
|
|
122
134
|
}
|
|
135
|
+
|
|
123
136
|
div.sliders-and-fields {
|
|
124
137
|
display: grid;
|
|
125
138
|
grid-template-columns: 132px auto;
|
|
@@ -127,16 +140,19 @@ div.sliders-and-fields {
|
|
|
127
140
|
height: 26px;
|
|
128
141
|
margin-bottom: 4px;
|
|
129
142
|
}
|
|
143
|
+
|
|
130
144
|
p.default {
|
|
131
145
|
font-family: Asap, sans-serif;
|
|
132
146
|
letter-spacing: 0;
|
|
133
147
|
margin: 16px 0;
|
|
134
148
|
text-align: start;
|
|
135
149
|
}
|
|
150
|
+
|
|
136
151
|
p.discrete {
|
|
137
152
|
margin-top: 0;
|
|
138
153
|
margin-bottom: 4px;
|
|
139
154
|
}
|
|
155
|
+
|
|
140
156
|
p.scalar {
|
|
141
157
|
grid-column-start: 1;
|
|
142
158
|
grid-column-end: 3;
|
package/src/components/common.js
CHANGED