@papaemmelab/isabl-web 0.3.25 → 0.3.26

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.
@@ -14742,7 +14742,7 @@ ___CSS_LOADER_EXPORT___.push([module.id, ".link-chip{text-decoration:none}.link-
14742
14742
 
14743
14743
  /***/ }),
14744
14744
 
14745
- /***/ 74884:
14745
+ /***/ 7754:
14746
14746
  /***/ (function(module, __webpack_exports__, __webpack_require__) {
14747
14747
 
14748
14748
  "use strict";
@@ -14931,7 +14931,7 @@ ___CSS_LOADER_EXPORT___.push([module.id, ".individual-tag{background-color:#e7f5
14931
14931
 
14932
14932
  /***/ }),
14933
14933
 
14934
- /***/ 90978:
14934
+ /***/ 7987:
14935
14935
  /***/ (function(module, __webpack_exports__, __webpack_require__) {
14936
14936
 
14937
14937
  "use strict";
@@ -97199,19 +97199,19 @@ var update = add("1da0882b", content, true, {"sourceMap":false,"shadowMode":fals
97199
97199
 
97200
97200
  /***/ }),
97201
97201
 
97202
- /***/ 611:
97202
+ /***/ 57993:
97203
97203
  /***/ (function(module, __unused_webpack_exports, __webpack_require__) {
97204
97204
 
97205
97205
  // style-loader: Adds some css to the DOM by adding a <style> tag
97206
97206
 
97207
97207
  // load the styles
97208
- var content = __webpack_require__(74884);
97208
+ var content = __webpack_require__(7754);
97209
97209
  if(content.__esModule) content = content.default;
97210
97210
  if(typeof content === 'string') content = [[module.id, content, '']];
97211
97211
  if(content.locals) module.exports = content.locals;
97212
97212
  // add the styles to the DOM
97213
97213
  var add = (__webpack_require__(54402)/* ["default"] */ .Z)
97214
- var update = add("5d4c4d51", content, true, {"sourceMap":false,"shadowMode":false});
97214
+ var update = add("0bbe3012", content, true, {"sourceMap":false,"shadowMode":false});
97215
97215
 
97216
97216
  /***/ }),
97217
97217
 
@@ -97343,19 +97343,19 @@ var update = add("4d420025", content, true, {"sourceMap":false,"shadowMode":fals
97343
97343
 
97344
97344
  /***/ }),
97345
97345
 
97346
- /***/ 82811:
97346
+ /***/ 82380:
97347
97347
  /***/ (function(module, __unused_webpack_exports, __webpack_require__) {
97348
97348
 
97349
97349
  // style-loader: Adds some css to the DOM by adding a <style> tag
97350
97350
 
97351
97351
  // load the styles
97352
- var content = __webpack_require__(90978);
97352
+ var content = __webpack_require__(7987);
97353
97353
  if(content.__esModule) content = content.default;
97354
97354
  if(typeof content === 'string') content = [[module.id, content, '']];
97355
97355
  if(content.locals) module.exports = content.locals;
97356
97356
  // add the styles to the DOM
97357
97357
  var add = (__webpack_require__(54402)/* ["default"] */ .Z)
97358
- var update = add("0e3e9ba8", content, true, {"sourceMap":false,"shadowMode":false});
97358
+ var update = add("63297040", content, true, {"sourceMap":false,"shadowMode":false});
97359
97359
 
97360
97360
  /***/ }),
97361
97361
 
@@ -211020,7 +211020,7 @@ var MainSearchvue_type_template_id_2cb26e73_staticRenderFns = (cov_16wbf36ey0.s[
211020
211020
  ;// CONCATENATED MODULE: ./src/components/search/MainSearch.vue?vue&type=template&id=2cb26e73&
211021
211021
 
211022
211022
  ;// CONCATENATED MODULE: ./package.json
211023
- var package_namespaceObject = {"i8":"0.3.25"};
211023
+ var package_namespaceObject = {"i8":"0.3.26"};
211024
211024
  ;// CONCATENATED MODULE: ./src/utils/settings.js
211025
211025
  var cov_1sxapcxhz3 = function () {
211026
211026
  var path = "/Users/arangooj/papaemme/isabl_web/src/utils/settings.js";
@@ -214158,7 +214158,7 @@ var axios_default = /*#__PURE__*/__webpack_require__.n(axios);
214158
214158
  function api_typeof(obj) { "@babel/helpers - typeof"; return api_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, api_typeof(obj); }
214159
214159
  var cov_mm8t9pmbx = function () {
214160
214160
  var path = "/Users/arangooj/papaemme/isabl_web/src/utils/api.js";
214161
- var hash = "a46b194059b1db0d104b2c37ef142480558c6022";
214161
+ var hash = "0a4d47f54a6c3a0ebfb1b9447a02463908071fc9";
214162
214162
  var global = new Function("return this")();
214163
214163
  var gcv = "__coverage__";
214164
214164
  var coverageData = {
@@ -215440,7 +215440,7 @@ var cov_mm8t9pmbx = function () {
215440
215440
  column: 35
215441
215441
  },
215442
215442
  end: {
215443
- line: 259,
215443
+ line: 258,
215444
215444
  column: 1
215445
215445
  }
215446
215446
  },
@@ -215456,11 +215456,11 @@ var cov_mm8t9pmbx = function () {
215456
215456
  },
215457
215457
  "129": {
215458
215458
  start: {
215459
- line: 258,
215459
+ line: 257,
215460
215460
  column: 2
215461
215461
  },
215462
215462
  end: {
215463
- line: 258,
215463
+ line: 257,
215464
215464
  column: 68
215465
215465
  }
215466
215466
  }
@@ -216372,7 +216372,7 @@ var cov_mm8t9pmbx = function () {
216372
216372
  column: 60
216373
216373
  },
216374
216374
  end: {
216375
- line: 259,
216375
+ line: 258,
216376
216376
  column: 1
216377
216377
  }
216378
216378
  },
@@ -217023,7 +217023,7 @@ var cov_mm8t9pmbx = function () {
217023
217023
  "13": [0, 0]
217024
217024
  },
217025
217025
  _coverageSchema: "43e27e138ebf9cfc5966b082cf9a028302ed4184",
217026
- hash: "a46b194059b1db0d104b2c37ef142480558c6022"
217026
+ hash: "0a4d47f54a6c3a0ebfb1b9447a02463908071fc9"
217027
217027
  };
217028
217028
  var coverage = global[gcv] || (global[gcv] = {});
217029
217029
  if (coverage[path] && coverage[path].hash === hash) {
@@ -217453,7 +217453,6 @@ cov_mm8t9pmbx.s[127]++;
217453
217453
  var getExperimentIGVURL = function getExperimentIGVURL(system_id, assembly) {
217454
217454
  cov_mm8t9pmbx.f[37]++;
217455
217455
  var endpoint = (cov_mm8t9pmbx.s[128]++, api_endpoints['experiments']);
217456
- // const endpoint = "http://localhost:8000/api/v1/experiments"
217457
217456
  cov_mm8t9pmbx.s[129]++;
217458
217457
  return "".concat(endpoint, "/igv/").concat(system_id, "?").concat(queryParams({
217459
217458
  assembly: assembly
@@ -273579,10 +273578,10 @@ var RerunButton_component = normalizeComponent(
273579
273578
  )
273580
273579
 
273581
273580
  /* harmony default export */ var RerunButton = (RerunButton_component.exports);
273582
- ;// CONCATENATED MODULE: ./node_modules/babel-loader/lib/index.js??clonedRuleSet-82.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/templateLoader.js??ruleSet[1].rules[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/analyses/ResultsGallery.vue?vue&type=template&id=1140a7e3&
273581
+ ;// CONCATENATED MODULE: ./node_modules/babel-loader/lib/index.js??clonedRuleSet-82.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/templateLoader.js??ruleSet[1].rules[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/analyses/ResultsGallery.vue?vue&type=template&id=b464b2ba&
273583
273582
  var cov_lsyw1a7bv = function () {
273584
273583
  var path = "/Users/arangooj/papaemme/isabl_web/src/components/analyses/ResultsGallery.vue";
273585
- var hash = "e4e1bd496ed983e86b8d8d401807e8e88dfe4b40";
273584
+ var hash = "37a0c8e228cc957542f8e940af9fe406703c987c";
273586
273585
  var global = new Function("return this")();
273587
273586
  var gcv = "__coverage__";
273588
273587
  var coverageData = {
@@ -273625,7 +273624,7 @@ var cov_lsyw1a7bv = function () {
273625
273624
  },
273626
273625
  end: {
273627
273626
  line: 1,
273628
- column: 6491
273627
+ column: 6622
273629
273628
  }
273630
273629
  },
273631
273630
  "4": {
@@ -273721,31 +273720,31 @@ var cov_lsyw1a7bv = function () {
273721
273720
  "13": {
273722
273721
  start: {
273723
273722
  line: 1,
273724
- column: 4958
273723
+ column: 5085
273725
273724
  },
273726
273725
  end: {
273727
273726
  line: 1,
273728
- column: 5275
273727
+ column: 5402
273729
273728
  }
273730
273729
  },
273731
273730
  "14": {
273732
273731
  start: {
273733
273732
  line: 1,
273734
- column: 5007
273733
+ column: 5134
273735
273734
  },
273736
273735
  end: {
273737
273736
  line: 1,
273738
- column: 5269
273737
+ column: 5396
273739
273738
  }
273740
273739
  },
273741
273740
  "15": {
273742
273741
  start: {
273743
273742
  line: 1,
273744
- column: 5085
273743
+ column: 5212
273745
273744
  },
273746
273745
  end: {
273747
273746
  line: 1,
273748
- column: 5264
273747
+ column: 5391
273749
273748
  }
273750
273749
  },
273751
273750
  "16": {
@@ -274005,21 +274004,21 @@ var cov_lsyw1a7bv = function () {
274005
274004
  decl: {
274006
274005
  start: {
274007
274006
  line: 1,
274008
- column: 4938
274007
+ column: 5065
274009
274008
  },
274010
274009
  end: {
274011
274010
  line: 1,
274012
- column: 4939
274011
+ column: 5066
274013
274012
  }
274014
274013
  },
274015
274014
  loc: {
274016
274015
  start: {
274017
274016
  line: 1,
274018
- column: 4957
274017
+ column: 5084
274019
274018
  },
274020
274019
  end: {
274021
274020
  line: 1,
274022
- column: 5276
274021
+ column: 5403
274023
274022
  }
274024
274023
  },
274025
274024
  line: 1
@@ -274029,21 +274028,21 @@ var cov_lsyw1a7bv = function () {
274029
274028
  decl: {
274030
274029
  start: {
274031
274030
  line: 1,
274032
- column: 4992
274031
+ column: 5119
274033
274032
  },
274034
274033
  end: {
274035
274034
  line: 1,
274036
- column: 4993
274035
+ column: 5120
274037
274036
  }
274038
274037
  },
274039
274038
  loc: {
274040
274039
  start: {
274041
274040
  line: 1,
274042
- column: 5006
274041
+ column: 5133
274043
274042
  },
274044
274043
  end: {
274045
274044
  line: 1,
274046
- column: 5270
274045
+ column: 5397
274047
274046
  }
274048
274047
  },
274049
274048
  line: 1
@@ -274053,21 +274052,21 @@ var cov_lsyw1a7bv = function () {
274053
274052
  decl: {
274054
274053
  start: {
274055
274054
  line: 1,
274056
- column: 5062
274055
+ column: 5189
274057
274056
  },
274058
274057
  end: {
274059
274058
  line: 1,
274060
- column: 5063
274059
+ column: 5190
274061
274060
  }
274062
274061
  },
274063
274062
  loc: {
274064
274063
  start: {
274065
274064
  line: 1,
274066
- column: 5084
274065
+ column: 5211
274067
274066
  },
274068
274067
  end: {
274069
274068
  line: 1,
274070
- column: 5265
274069
+ column: 5392
274071
274070
  }
274072
274071
  },
274073
274072
  line: 1
@@ -274082,7 +274081,7 @@ var cov_lsyw1a7bv = function () {
274082
274081
  },
274083
274082
  end: {
274084
274083
  line: 1,
274085
- column: 6491
274084
+ column: 6622
274086
274085
  }
274087
274086
  },
274088
274087
  type: "cond-expr",
@@ -274093,16 +274092,16 @@ var cov_lsyw1a7bv = function () {
274093
274092
  },
274094
274093
  end: {
274095
274094
  line: 1,
274096
- column: 6482
274095
+ column: 6613
274097
274096
  }
274098
274097
  }, {
274099
274098
  start: {
274100
274099
  line: 1,
274101
- column: 6483
274100
+ column: 6614
274102
274101
  },
274103
274102
  end: {
274104
274103
  line: 1,
274105
- column: 6491
274104
+ column: 6622
274106
274105
  }
274107
274106
  }],
274108
274107
  line: 1
@@ -274544,7 +274543,7 @@ var cov_lsyw1a7bv = function () {
274544
274543
  },
274545
274544
  end: {
274546
274545
  line: 1,
274547
- column: 6470
274546
+ column: 6601
274548
274547
  }
274549
274548
  },
274550
274549
  type: "cond-expr",
@@ -274564,7 +274563,7 @@ var cov_lsyw1a7bv = function () {
274564
274563
  },
274565
274564
  end: {
274566
274565
  line: 1,
274567
- column: 6470
274566
+ column: 6601
274568
274567
  }
274569
274568
  }],
274570
274569
  line: 1
@@ -274610,7 +274609,7 @@ var cov_lsyw1a7bv = function () {
274610
274609
  },
274611
274610
  end: {
274612
274611
  line: 1,
274613
- column: 6470
274612
+ column: 6601
274614
274613
  }
274615
274614
  },
274616
274615
  type: "cond-expr",
@@ -274630,7 +274629,7 @@ var cov_lsyw1a7bv = function () {
274630
274629
  },
274631
274630
  end: {
274632
274631
  line: 1,
274633
- column: 6470
274632
+ column: 6601
274634
274633
  }
274635
274634
  }],
274636
274635
  line: 1
@@ -274643,7 +274642,7 @@ var cov_lsyw1a7bv = function () {
274643
274642
  },
274644
274643
  end: {
274645
274644
  line: 1,
274646
- column: 6470
274645
+ column: 6601
274647
274646
  }
274648
274647
  },
274649
274648
  type: "cond-expr",
@@ -274654,16 +274653,16 @@ var cov_lsyw1a7bv = function () {
274654
274653
  },
274655
274654
  end: {
274656
274655
  line: 1,
274657
- column: 4645
274656
+ column: 4772
274658
274657
  }
274659
274658
  }, {
274660
274659
  start: {
274661
274660
  line: 1,
274662
- column: 4646
274661
+ column: 4773
274663
274662
  },
274664
274663
  end: {
274665
274664
  line: 1,
274666
- column: 6470
274665
+ column: 6601
274667
274666
  }
274668
274667
  }],
274669
274668
  line: 1
@@ -274672,31 +274671,31 @@ var cov_lsyw1a7bv = function () {
274672
274671
  loc: {
274673
274672
  start: {
274674
274673
  line: 1,
274675
- column: 4265
274674
+ column: 4288
274676
274675
  },
274677
274676
  end: {
274678
274677
  line: 1,
274679
- column: 4436
274678
+ column: 4747
274680
274679
  }
274681
274680
  },
274682
274681
  type: "cond-expr",
274683
274682
  locations: [{
274684
274683
  start: {
274685
274684
  line: 1,
274686
- column: 4305
274685
+ column: 4343
274687
274686
  },
274688
274687
  end: {
274689
274688
  line: 1,
274690
- column: 4427
274689
+ column: 4738
274691
274690
  }
274692
274691
  }, {
274693
274692
  start: {
274694
274693
  line: 1,
274695
- column: 4428
274694
+ column: 4739
274696
274695
  },
274697
274696
  end: {
274698
274697
  line: 1,
274699
- column: 4436
274698
+ column: 4747
274700
274699
  }
274701
274700
  }],
274702
274701
  line: 1
@@ -274705,31 +274704,31 @@ var cov_lsyw1a7bv = function () {
274705
274704
  loc: {
274706
274705
  start: {
274707
274706
  line: 1,
274708
- column: 4266
274707
+ column: 4289
274709
274708
  },
274710
274709
  end: {
274711
274710
  line: 1,
274712
- column: 4303
274711
+ column: 4341
274713
274712
  }
274714
274713
  },
274715
274714
  type: "binary-expr",
274716
274715
  locations: [{
274717
274716
  start: {
274718
274717
  line: 1,
274719
- column: 4266
274718
+ column: 4289
274720
274719
  },
274721
274720
  end: {
274722
274721
  line: 1,
274723
- column: 4277
274722
+ column: 4300
274724
274723
  }
274725
274724
  }, {
274726
274725
  start: {
274727
274726
  line: 1,
274728
- column: 4281
274727
+ column: 4304
274729
274728
  },
274730
274729
  end: {
274731
274730
  line: 1,
274732
- column: 4303
274731
+ column: 4341
274733
274732
  }
274734
274733
  }],
274735
274734
  line: 1
@@ -274738,31 +274737,31 @@ var cov_lsyw1a7bv = function () {
274738
274737
  loc: {
274739
274738
  start: {
274740
274739
  line: 1,
274741
- column: 4460
274740
+ column: 4379
274742
274741
  },
274743
274742
  end: {
274744
274743
  line: 1,
274745
- column: 4620
274744
+ column: 4539
274746
274745
  }
274747
274746
  },
274748
274747
  type: "cond-expr",
274749
274748
  locations: [{
274750
274749
  start: {
274751
274750
  line: 1,
274752
- column: 4500
274751
+ column: 4404
274753
274752
  },
274754
274753
  end: {
274755
274754
  line: 1,
274756
- column: 4611
274755
+ column: 4530
274757
274756
  }
274758
274757
  }, {
274759
274758
  start: {
274760
274759
  line: 1,
274761
- column: 4612
274760
+ column: 4531
274762
274761
  },
274763
274762
  end: {
274764
274763
  line: 1,
274765
- column: 4620
274764
+ column: 4539
274766
274765
  }
274767
274766
  }],
274768
274767
  line: 1
@@ -274771,31 +274770,31 @@ var cov_lsyw1a7bv = function () {
274771
274770
  loc: {
274772
274771
  start: {
274773
274772
  line: 1,
274774
- column: 4461
274773
+ column: 4565
274775
274774
  },
274776
274775
  end: {
274777
274776
  line: 1,
274778
- column: 4498
274777
+ column: 4713
274779
274778
  }
274780
274779
  },
274781
- type: "binary-expr",
274780
+ type: "cond-expr",
274782
274781
  locations: [{
274783
274782
  start: {
274784
274783
  line: 1,
274785
- column: 4461
274784
+ column: 4589
274786
274785
  },
274787
274786
  end: {
274788
274787
  line: 1,
274789
- column: 4473
274788
+ column: 4704
274790
274789
  }
274791
274790
  }, {
274792
274791
  start: {
274793
274792
  line: 1,
274794
- column: 4477
274793
+ column: 4705
274795
274794
  },
274796
274795
  end: {
274797
274796
  line: 1,
274798
- column: 4498
274797
+ column: 4713
274799
274798
  }
274800
274799
  }],
274801
274800
  line: 1
@@ -274804,31 +274803,31 @@ var cov_lsyw1a7bv = function () {
274804
274803
  loc: {
274805
274804
  start: {
274806
274805
  line: 1,
274807
- column: 4646
274806
+ column: 4773
274808
274807
  },
274809
274808
  end: {
274810
274809
  line: 1,
274811
- column: 6470
274810
+ column: 6601
274812
274811
  }
274813
274812
  },
274814
274813
  type: "cond-expr",
274815
274814
  locations: [{
274816
274815
  start: {
274817
274816
  line: 1,
274818
- column: 4675
274817
+ column: 4802
274819
274818
  },
274820
274819
  end: {
274821
274820
  line: 1,
274822
- column: 5541
274821
+ column: 5672
274823
274822
  }
274824
274823
  }, {
274825
274824
  start: {
274826
274825
  line: 1,
274827
- column: 5542
274826
+ column: 5673
274828
274827
  },
274829
274828
  end: {
274830
274829
  line: 1,
274831
- column: 6470
274830
+ column: 6601
274832
274831
  }
274833
274832
  }],
274834
274833
  line: 1
@@ -274837,31 +274836,31 @@ var cov_lsyw1a7bv = function () {
274837
274836
  loc: {
274838
274837
  start: {
274839
274838
  line: 1,
274840
- column: 5133
274839
+ column: 5260
274841
274840
  },
274842
274841
  end: {
274843
274842
  line: 1,
274844
- column: 5183
274843
+ column: 5310
274845
274844
  }
274846
274845
  },
274847
274846
  type: "cond-expr",
274848
274847
  locations: [{
274849
274848
  start: {
274850
274849
  line: 1,
274851
- column: 5160
274850
+ column: 5287
274852
274851
  },
274853
274852
  end: {
274854
274853
  line: 1,
274855
- column: 5178
274854
+ column: 5305
274856
274855
  }
274857
274856
  }, {
274858
274857
  start: {
274859
274858
  line: 1,
274860
- column: 5181
274859
+ column: 5308
274861
274860
  },
274862
274861
  end: {
274863
274862
  line: 1,
274864
- column: 5183
274863
+ column: 5310
274865
274864
  }
274866
274865
  }],
274867
274866
  line: 1
@@ -274870,31 +274869,31 @@ var cov_lsyw1a7bv = function () {
274870
274869
  loc: {
274871
274870
  start: {
274872
274871
  line: 1,
274873
- column: 5357
274872
+ column: 5484
274874
274873
  },
274875
274874
  end: {
274876
274875
  line: 1,
274877
- column: 5450
274876
+ column: 5666
274878
274877
  }
274879
274878
  },
274880
274879
  type: "cond-expr",
274881
274880
  locations: [{
274882
274881
  start: {
274883
274882
  line: 1,
274884
- column: 5397
274883
+ column: 5539
274885
274884
  },
274886
274885
  end: {
274887
274886
  line: 1,
274888
- column: 5441
274887
+ column: 5657
274889
274888
  }
274890
274889
  }, {
274891
274890
  start: {
274892
274891
  line: 1,
274893
- column: 5442
274892
+ column: 5658
274894
274893
  },
274895
274894
  end: {
274896
274895
  line: 1,
274897
- column: 5450
274896
+ column: 5666
274898
274897
  }
274899
274898
  }],
274900
274899
  line: 1
@@ -274903,31 +274902,31 @@ var cov_lsyw1a7bv = function () {
274903
274902
  loc: {
274904
274903
  start: {
274905
274904
  line: 1,
274906
- column: 5358
274905
+ column: 5485
274907
274906
  },
274908
274907
  end: {
274909
274908
  line: 1,
274910
- column: 5395
274909
+ column: 5537
274911
274910
  }
274912
274911
  },
274913
274912
  type: "binary-expr",
274914
274913
  locations: [{
274915
274914
  start: {
274916
274915
  line: 1,
274917
- column: 5358
274916
+ column: 5485
274918
274917
  },
274919
274918
  end: {
274920
274919
  line: 1,
274921
- column: 5369
274920
+ column: 5496
274922
274921
  }
274923
274922
  }, {
274924
274923
  start: {
274925
274924
  line: 1,
274926
- column: 5373
274925
+ column: 5500
274927
274926
  },
274928
274927
  end: {
274929
274928
  line: 1,
274930
- column: 5395
274929
+ column: 5537
274931
274930
  }
274932
274931
  }],
274933
274932
  line: 1
@@ -274936,31 +274935,31 @@ var cov_lsyw1a7bv = function () {
274936
274935
  loc: {
274937
274936
  start: {
274938
274937
  line: 1,
274939
- column: 5451
274938
+ column: 5550
274940
274939
  },
274941
274940
  end: {
274942
274941
  line: 1,
274943
- column: 5535
274942
+ column: 5655
274944
274943
  }
274945
274944
  },
274946
274945
  type: "cond-expr",
274947
274946
  locations: [{
274948
274947
  start: {
274949
274948
  line: 1,
274950
- column: 5491
274949
+ column: 5575
274951
274950
  },
274952
274951
  end: {
274953
274952
  line: 1,
274954
- column: 5526
274953
+ column: 5619
274955
274954
  }
274956
274955
  }, {
274957
274956
  start: {
274958
274957
  line: 1,
274959
- column: 5527
274958
+ column: 5620
274960
274959
  },
274961
274960
  end: {
274962
274961
  line: 1,
274963
- column: 5535
274962
+ column: 5655
274964
274963
  }
274965
274964
  }],
274966
274965
  line: 1
@@ -274969,31 +274968,31 @@ var cov_lsyw1a7bv = function () {
274969
274968
  loc: {
274970
274969
  start: {
274971
274970
  line: 1,
274972
- column: 5452
274971
+ column: 5673
274973
274972
  },
274974
274973
  end: {
274975
274974
  line: 1,
274976
- column: 5489
274975
+ column: 6601
274977
274976
  }
274978
274977
  },
274979
- type: "binary-expr",
274978
+ type: "cond-expr",
274980
274979
  locations: [{
274981
274980
  start: {
274982
274981
  line: 1,
274983
- column: 5452
274982
+ column: 5702
274984
274983
  },
274985
274984
  end: {
274986
274985
  line: 1,
274987
- column: 5464
274986
+ column: 5838
274988
274987
  }
274989
274988
  }, {
274990
274989
  start: {
274991
274990
  line: 1,
274992
- column: 5468
274991
+ column: 5839
274993
274992
  },
274994
274993
  end: {
274995
274994
  line: 1,
274996
- column: 5489
274995
+ column: 6601
274997
274996
  }
274998
274997
  }],
274999
274998
  line: 1
@@ -275002,31 +275001,31 @@ var cov_lsyw1a7bv = function () {
275002
275001
  loc: {
275003
275002
  start: {
275004
275003
  line: 1,
275005
- column: 5542
275004
+ column: 5839
275006
275005
  },
275007
275006
  end: {
275008
275007
  line: 1,
275009
- column: 6470
275008
+ column: 6601
275010
275009
  }
275011
275010
  },
275012
275011
  type: "cond-expr",
275013
275012
  locations: [{
275014
275013
  start: {
275015
275014
  line: 1,
275016
- column: 5571
275015
+ column: 5882
275017
275016
  },
275018
275017
  end: {
275019
275018
  line: 1,
275020
- column: 5707
275019
+ column: 6080
275021
275020
  }
275022
275021
  }, {
275023
275022
  start: {
275024
275023
  line: 1,
275025
- column: 5708
275024
+ column: 6081
275026
275025
  },
275027
275026
  end: {
275028
275027
  line: 1,
275029
- column: 6470
275028
+ column: 6601
275030
275029
  }
275031
275030
  }],
275032
275031
  line: 1
@@ -275035,31 +275034,31 @@ var cov_lsyw1a7bv = function () {
275035
275034
  loc: {
275036
275035
  start: {
275037
275036
  line: 1,
275038
- column: 5708
275037
+ column: 6081
275039
275038
  },
275040
275039
  end: {
275041
275040
  line: 1,
275042
- column: 6470
275041
+ column: 6601
275043
275042
  }
275044
275043
  },
275045
275044
  type: "cond-expr",
275046
275045
  locations: [{
275047
275046
  start: {
275048
275047
  line: 1,
275049
- column: 5751
275048
+ column: 6112
275050
275049
  },
275051
275050
  end: {
275052
275051
  line: 1,
275053
- column: 5949
275052
+ column: 6275
275054
275053
  }
275055
275054
  }, {
275056
275055
  start: {
275057
275056
  line: 1,
275058
- column: 5950
275057
+ column: 6276
275059
275058
  },
275060
275059
  end: {
275061
275060
  line: 1,
275062
- column: 6470
275061
+ column: 6601
275063
275062
  }
275064
275063
  }],
275065
275064
  line: 1
@@ -275068,31 +275067,31 @@ var cov_lsyw1a7bv = function () {
275068
275067
  loc: {
275069
275068
  start: {
275070
275069
  line: 1,
275071
- column: 5950
275070
+ column: 6276
275072
275071
  },
275073
275072
  end: {
275074
275073
  line: 1,
275075
- column: 6470
275074
+ column: 6601
275076
275075
  }
275077
275076
  },
275078
275077
  type: "cond-expr",
275079
275078
  locations: [{
275080
275079
  start: {
275081
275080
  line: 1,
275082
- column: 5981
275081
+ column: 6306
275083
275082
  },
275084
275083
  end: {
275085
275084
  line: 1,
275086
- column: 6144
275085
+ column: 6433
275087
275086
  }
275088
275087
  }, {
275089
275088
  start: {
275090
275089
  line: 1,
275091
- column: 6145
275090
+ column: 6434
275092
275091
  },
275093
275092
  end: {
275094
275093
  line: 1,
275095
- column: 6470
275094
+ column: 6601
275096
275095
  }
275097
275096
  }],
275098
275097
  line: 1
@@ -275101,64 +275100,31 @@ var cov_lsyw1a7bv = function () {
275101
275100
  loc: {
275102
275101
  start: {
275103
275102
  line: 1,
275104
- column: 6145
275103
+ column: 6434
275105
275104
  },
275106
275105
  end: {
275107
275106
  line: 1,
275108
- column: 6470
275107
+ column: 6601
275109
275108
  }
275110
275109
  },
275111
275110
  type: "cond-expr",
275112
275111
  locations: [{
275113
275112
  start: {
275114
275113
  line: 1,
275115
- column: 6175
275114
+ column: 6484
275116
275115
  },
275117
275116
  end: {
275118
275117
  line: 1,
275119
- column: 6302
275118
+ column: 6592
275120
275119
  }
275121
275120
  }, {
275122
275121
  start: {
275123
275122
  line: 1,
275124
- column: 6303
275123
+ column: 6593
275125
275124
  },
275126
275125
  end: {
275127
275126
  line: 1,
275128
- column: 6470
275129
- }
275130
- }],
275131
- line: 1
275132
- },
275133
- "32": {
275134
- loc: {
275135
- start: {
275136
- line: 1,
275137
- column: 6303
275138
- },
275139
- end: {
275140
- line: 1,
275141
- column: 6470
275142
- }
275143
- },
275144
- type: "cond-expr",
275145
- locations: [{
275146
- start: {
275147
- line: 1,
275148
- column: 6353
275149
- },
275150
- end: {
275151
- line: 1,
275152
- column: 6461
275153
- }
275154
- }, {
275155
- start: {
275156
- line: 1,
275157
- column: 6462
275158
- },
275159
- end: {
275160
- line: 1,
275161
- column: 6470
275127
+ column: 6601
275162
275128
  }
275163
275129
  }],
275164
275130
  line: 1
@@ -275230,11 +275196,10 @@ var cov_lsyw1a7bv = function () {
275230
275196
  "28": [0, 0],
275231
275197
  "29": [0, 0],
275232
275198
  "30": [0, 0],
275233
- "31": [0, 0],
275234
- "32": [0, 0]
275199
+ "31": [0, 0]
275235
275200
  },
275236
275201
  _coverageSchema: "43e27e138ebf9cfc5966b082cf9a028302ed4184",
275237
- hash: "e4e1bd496ed983e86b8d8d401807e8e88dfe4b40"
275202
+ hash: "37a0c8e228cc957542f8e940af9fe406703c987c"
275238
275203
  };
275239
275204
  var coverage = global[gcv] || (global[gcv] = {});
275240
275205
  if (coverage[path] && coverage[path].hash === hash) {
@@ -275243,7 +275208,7 @@ var cov_lsyw1a7bv = function () {
275243
275208
  return coverage[path] = coverageData;
275244
275209
  }();
275245
275210
  cov_lsyw1a7bv.s[0]++;
275246
- var ResultsGalleryvue_type_template_id_1140a7e3_render = function render() {
275211
+ var ResultsGalleryvue_type_template_id_b464b2ba_render = function render() {
275247
275212
  cov_lsyw1a7bv.f[0]++;
275248
275213
  var _vm = (cov_lsyw1a7bv.s[1]++, this),
275249
275214
  _c = (cov_lsyw1a7bv.s[2]++, _vm._self._c);
@@ -275471,11 +275436,11 @@ var ResultsGalleryvue_type_template_id_1140a7e3_render = function render() {
275471
275436
  })])) : (cov_lsyw1a7bv.b[16][1]++, _vm.resultType === 'raw' ? (cov_lsyw1a7bv.b[17][0]++, _c('code', {
275472
275437
  ref: "raw",
275473
275438
  staticClass: "v-markup"
275474
- }, [_c('pre', [_vm._v(" " + _vm._s(_vm.content) + "\n "), (cov_lsyw1a7bv.b[19][0]++, _vm.content) && (cov_lsyw1a7bv.b[19][1]++, !_vm.streamOptions.end) ? (cov_lsyw1a7bv.b[18][0]++, _c('span', {
275439
+ }, [_c('pre', [_vm._v(" " + _vm._s(_vm.content) + "\n "), _vm._v("\n "), (cov_lsyw1a7bv.b[19][0]++, _vm.content) && (cov_lsyw1a7bv.b[19][1]++, _vm.content.split('\n').length >= 200) ? (cov_lsyw1a7bv.b[18][0]++, _c('span', [_vm._v("\n "), !_vm.streamOptions.end ? (cov_lsyw1a7bv.b[20][0]++, _c('span', {
275475
275440
  staticClass: "stream-message grey--text lighten-2"
275476
- }, [_vm._v("\n ... Loading more rows\n ")])) : (cov_lsyw1a7bv.b[18][1]++, _vm._e()), _vm._v("\n "), (cov_lsyw1a7bv.b[21][0]++, !_vm.loading) && (cov_lsyw1a7bv.b[21][1]++, _vm.streamOptions.end) ? (cov_lsyw1a7bv.b[20][0]++, _c('span', {
275441
+ }, [_vm._v("\n ... Loading more rows\n ")])) : (cov_lsyw1a7bv.b[20][1]++, _vm._e()), _vm._v("\n "), _vm.streamOptions.end ? (cov_lsyw1a7bv.b[21][0]++, _c('span', {
275477
275442
  staticClass: "stream-message grey--text"
275478
- }, [_vm._v("\n *** End of file. ***\n ")])) : (cov_lsyw1a7bv.b[20][1]++, _vm._e()), _vm._v("\n ")])])) : (cov_lsyw1a7bv.b[17][1]++, _vm.resultType === 'table' ? (cov_lsyw1a7bv.b[22][0]++, _c('div', {
275443
+ }, [_vm._v("\n *** End of file. ***\n ")])) : (cov_lsyw1a7bv.b[21][1]++, _vm._e()), _vm._v("\n ")])) : (cov_lsyw1a7bv.b[18][1]++, _vm._e()), _vm._v("\n ")])])) : (cov_lsyw1a7bv.b[17][1]++, _vm.resultType === 'table' ? (cov_lsyw1a7bv.b[22][0]++, _c('div', {
275479
275444
  ref: "table",
275480
275445
  staticClass: "tsv-table"
275481
275446
  }, [_c('v-data-table', {
@@ -275515,13 +275480,13 @@ var ResultsGalleryvue_type_template_id_1140a7e3_render = function render() {
275515
275480
  }], null, false, 3434796515)
275516
275481
  }), _c('div', {
275517
275482
  staticClass: "text-center stream-message"
275518
- }, [(cov_lsyw1a7bv.b[25][0]++, _vm.content) && (cov_lsyw1a7bv.b[25][1]++, !_vm.streamOptions.end) ? (cov_lsyw1a7bv.b[24][0]++, _c('span', [_vm._v("... Loading more rows")])) : (cov_lsyw1a7bv.b[24][1]++, _vm._e()), (cov_lsyw1a7bv.b[27][0]++, !_vm.loading) && (cov_lsyw1a7bv.b[27][1]++, _vm.streamOptions.end) ? (cov_lsyw1a7bv.b[26][0]++, _c('span', [_vm._v("End of file.")])) : (cov_lsyw1a7bv.b[26][1]++, _vm._e())])], 1)) : (cov_lsyw1a7bv.b[22][1]++, _vm.resultType === 'image' ? (cov_lsyw1a7bv.b[28][0]++, _c('img', {
275483
+ }, [(cov_lsyw1a7bv.b[25][0]++, _vm.content) && (cov_lsyw1a7bv.b[25][1]++, _vm.content.split('\n').length >= 200) ? (cov_lsyw1a7bv.b[24][0]++, _c('span', [!_vm.streamOptions.end ? (cov_lsyw1a7bv.b[26][0]++, _c('span', [_vm._v("... Loading more rows")])) : (cov_lsyw1a7bv.b[26][1]++, _c('span', [_vm._v("End of file.")]))])) : (cov_lsyw1a7bv.b[24][1]++, _vm._e())])], 1)) : (cov_lsyw1a7bv.b[22][1]++, _vm.resultType === 'image' ? (cov_lsyw1a7bv.b[27][0]++, _c('img', {
275519
275484
  staticClass: "results-image",
275520
275485
  attrs: {
275521
275486
  "src": _vm.$store.getters.getBlobUrl(_vm.result.downloadUrl),
275522
275487
  "alt": _vm.result.verboseName
275523
275488
  }
275524
- })) : (cov_lsyw1a7bv.b[28][1]++, ['html', 'pdf'].includes(_vm.resultType) ? (cov_lsyw1a7bv.b[29][0]++, _c('iframe', {
275489
+ })) : (cov_lsyw1a7bv.b[27][1]++, ['html', 'pdf'].includes(_vm.resultType) ? (cov_lsyw1a7bv.b[28][0]++, _c('iframe', {
275525
275490
  staticClass: "results-iframe",
275526
275491
  staticStyle: {
275527
275492
  "width": "100%",
@@ -275532,7 +275497,7 @@ var ResultsGalleryvue_type_template_id_1140a7e3_render = function render() {
275532
275497
  "src": _vm.$store.getters.getBlobUrl(_vm.result.downloadUrl, ''),
275533
275498
  "frameborder": "0"
275534
275499
  }
275535
- })) : (cov_lsyw1a7bv.b[29][1]++, _vm.resultType === 'igv_bam' ? (cov_lsyw1a7bv.b[30][0]++, _c('iframe', {
275500
+ })) : (cov_lsyw1a7bv.b[28][1]++, _vm.resultType === 'igv_bam' ? (cov_lsyw1a7bv.b[29][0]++, _c('iframe', {
275536
275501
  staticClass: "results-iframe",
275537
275502
  staticStyle: {
275538
275503
  "width": "100%",
@@ -275543,23 +275508,23 @@ var ResultsGalleryvue_type_template_id_1140a7e3_render = function render() {
275543
275508
  "src": _vm.result.downloadUrl,
275544
275509
  "frameborder": "0"
275545
275510
  }
275546
- })) : (cov_lsyw1a7bv.b[30][1]++, _vm.resultType === 'number' ? (cov_lsyw1a7bv.b[31][0]++, _c('code', {
275511
+ })) : (cov_lsyw1a7bv.b[29][1]++, _vm.resultType === 'number' ? (cov_lsyw1a7bv.b[30][0]++, _c('code', {
275547
275512
  staticClass: "v-markup"
275548
275513
  }, [_c('span', {
275549
275514
  attrs: {
275550
275515
  "size": "100px"
275551
275516
  }
275552
- }, [_vm._v(_vm._s(_vm._f("round")(_vm.result.value, 3)))])])) : (cov_lsyw1a7bv.b[31][1]++, ['string', 'url-link'].includes(_vm.resultType) ? (cov_lsyw1a7bv.b[32][0]++, _c('code', {
275517
+ }, [_vm._v(_vm._s(_vm._f("round")(_vm.result.value, 3)))])])) : (cov_lsyw1a7bv.b[30][1]++, ['string', 'url-link'].includes(_vm.resultType) ? (cov_lsyw1a7bv.b[31][0]++, _c('code', {
275553
275518
  staticClass: "v-markup"
275554
275519
  }, [_c('span', {
275555
275520
  attrs: {
275556
275521
  "size": "100px"
275557
275522
  }
275558
- }, [_vm._v(_vm._s(_vm.result.value))])])) : (cov_lsyw1a7bv.b[32][1]++, _vm._e())))))))))], 1)], 1)], 1)) : (cov_lsyw1a7bv.b[0][1]++, _vm._e());
275523
+ }, [_vm._v(_vm._s(_vm.result.value))])])) : (cov_lsyw1a7bv.b[31][1]++, _vm._e())))))))))], 1)], 1)], 1)) : (cov_lsyw1a7bv.b[0][1]++, _vm._e());
275559
275524
  };
275560
- var ResultsGalleryvue_type_template_id_1140a7e3_staticRenderFns = (cov_lsyw1a7bv.s[16]++, []);
275525
+ var ResultsGalleryvue_type_template_id_b464b2ba_staticRenderFns = (cov_lsyw1a7bv.s[16]++, []);
275561
275526
 
275562
- ;// CONCATENATED MODULE: ./src/components/analyses/ResultsGallery.vue?vue&type=template&id=1140a7e3&
275527
+ ;// CONCATENATED MODULE: ./src/components/analyses/ResultsGallery.vue?vue&type=template&id=b464b2ba&
275563
275528
 
275564
275529
  // EXTERNAL MODULE: ./node_modules/detect-csv/index.js
275565
275530
  var detect_csv = __webpack_require__(99935);
@@ -275567,7 +275532,7 @@ var detect_csv_default = /*#__PURE__*/__webpack_require__.n(detect_csv);
275567
275532
  ;// CONCATENATED MODULE: ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-82.use[1]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/analyses/ResultsGallery.vue?vue&type=script&lang=js&
275568
275533
  var ResultsGalleryvue_type_script_lang_js_cov_lsyw1a7bv = function () {
275569
275534
  var path = "/Users/arangooj/papaemme/isabl_web/src/components/analyses/ResultsGallery.vue";
275570
- var hash = "68d228565d6b6c5100fcb14e924652ac345880c1";
275535
+ var hash = "5d444039a2a8e9894579cef12c5354c23ba58df6";
275571
275536
  var global = new Function("return this")();
275572
275537
  var gcv = "__coverage__";
275573
275538
  var coverageData = {
@@ -279169,13 +279134,13 @@ var ResultsGalleryvue_type_script_lang_js_cov_lsyw1a7bv = function () {
279169
279134
  version: 3,
279170
279135
  sources: ["ResultsGallery.vue"],
279171
279136
  names: [],
279172
- mappings: ";AA+QA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA",
279137
+ mappings: ";AAqRA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA",
279173
279138
  file: "ResultsGallery.vue",
279174
279139
  sourceRoot: "src/components/analyses",
279175
- sourcesContent: ["<template>\n <v-dialog\n v-hotkey=\"keymap\"\n v-if=\"showDialog\"\n v-model=\"showDialog\"\n :fullscreen=\"isResultModalFullScreen\"\n scrollable\n class=\"gallery-dialog\"\n >\n <v-card flat class=\"gallery-card\">\n <v-card-title class=\"pa-2\">\n <v-row>\n <v-col cols=\"6\">\n <h3 class=\"font-weight-thin primary--text\">\n {{ result.verboseName }}\n </h3>\n </v-col>\n\n <v-col cols=\"6\" class=\"d-flex justify-end align-center panel-slot-actions\">\n\n <!-- toggle raw text -->\n <v-tooltip\n v-if=\"result.frontendType === 'tsv-file' && tsvHeaders.length\"\n top\n >\n <template v-slot:activator=\"{ on }\">\n <v-icon\n class=\"primary--text ml-4\"\n small\n @click=\"displayRawText = !displayRawText\"\n v-on=\"on\"\n >\n {{ displayRawText ? 'table_chart' : 'text_fields' }}\n </v-icon>\n </template>\n {{ displayRawText ? 'Display Tabulated Content' : 'Display Raw Content' }}\n </v-tooltip>\n\n <!-- download result -->\n <v-tooltip\n v-if=\"result.download\"\n top\n >\n <template v-slot:activator=\"{ on }\">\n <v-icon\n class=\"primary--text ml-4\"\n small\n @click=\"result.download\"\n v-on=\"on\"\n >\n {{ result.downloadIcon }}\n </v-icon>\n </template>\n {{ result.downloadIcon === 'open_in_new' ? 'Open in new tab' : 'Download Result' }}\n </v-tooltip>\n\n <!-- copy to clipboard -->\n <v-tooltip\n v-if=\"result.copyToClipBoard\"\n top\n >\n <template v-slot:activator=\"{ on }\">\n <v-icon\n class=\"primary--text ml-4\"\n small\n @click=\"result.copyToClipBoard\"\n v-on=\"on\"\n >\n file_copy\n </v-icon>\n </template>\n Copy to clipboard!\n </v-tooltip>\n\n <!-- external link -->\n <v-tooltip\n v-if=\"result.openExternalLink\"\n top\n >\n <template v-slot:activator=\"{ on }\">\n <v-icon\n class=\"primary--text ml-4\"\n small\n @click=\"result.openExternalLink\"\n v-on=\"on\"\n >\n info\n </v-icon>\n </template>\n Learn more!\n </v-tooltip>\n\n <!-- show from bottom -->\n <v-tooltip\n v-if=\"['raw'].includes(resultType)\"\n top\n >\n <template v-slot:activator=\"{ on }\">\n <v-icon\n class=\"primary--text ml-4\"\n small\n @click=\"reverseContent\"\n v-on=\"on\"\n >\n {{ streamOptions.reverse ? 'vertical_align_bottom' : 'vertical_align_top'}}\n </v-icon>\n </template>\n <span>\n Show content from {{ streamOptions.reverse ? 'top' : 'bottom' }}\n </span>\n </v-tooltip>\n\n <!-- show fullscreen -->\n <v-tooltip\n top\n >\n <template v-slot:activator=\"{ on }\">\n <v-icon\n class=\"primary--text ml-4\"\n small\n @click=\"toggleFullScreen\"\n v-on=\"on\"\n >\n {{ isResultModalFullScreen ? 'fullscreen_exit' : 'fullscreen'}}\n </v-icon>\n </template>\n <span>\n Toggle Full Screen\n </span>\n </v-tooltip>\n\n <!-- close dialog -->\n <v-tooltip top>\n <template v-slot:activator=\"{ on }\">\n <v-icon\n class=\"primary--text ml-4\"\n small\n @click=\"hideDialog\"\n v-on=\"on\"\n >\n close\n </v-icon>\n </template>\n Close file\n </v-tooltip>\n </v-col>\n </v-row>\n </v-card-title>\n\n <v-row class=\"pa-0 ma-0 gallery-content\" style=\"height: 85vh\">\n <v-progress-linear\n v-if=\"loading\"\n class=\"panel-loader\"\n indeterminate\n height=\"2\"\n color=\"primary\"\n />\n\n <pre\n v-highlightjs=\"content\"\n v-if=\"resultType === 'raw' && resultKey === 'command_script'\"\n ref=\"raw\"\n class=\"v-markup pre-wrap\"\n >\n <code class=\"bash\" />\n </pre>\n\n <code\n v-else-if=\"isAnsi\"\n ref=\"raw\"\n class=\"v-markup\"\n >\n <pre v-html=\"content\" />\n </code>\n\n <code\n v-else-if=\"resultType === 'raw'\"\n ref=\"raw\"\n class=\"v-markup\"\n >\n <pre>\n {{ content }}\n <span v-if=\"content && !streamOptions.end\" class=\"stream-message grey--text lighten-2\">\n ... Loading more rows\n </span>\n <span v-if=\"!loading && streamOptions.end\" class=\"stream-message grey--text\">\n *** End of file. ***\n </span>\n </pre>\n </code>\n\n <div\n v-else-if=\"resultType === 'table'\"\n ref=\"table\"\n class=\"tsv-table\"\n >\n <v-data-table\n :headers=\"tsvHeaders\"\n :items=\"tsvItems\"\n :items-per-page=\"tsvItems.length\"\n hide-default-footer\n multi-sort\n fixed-header\n dense\n >\n <template v-slot:body=\"{ items }\">\n <tbody>\n <tr\n v-for=\"item in items\"\n :key=\"item.name\"\n >\n <td\n v-for=\"(header, index) in tsvHeaders\"\n :key=\"index + header.value\"\n :class=\"[header.value === 'index' ? 'line-column text' : '']\"\n v-html=\"parseTsvCell($get(item, header.value))\"\n />\n </tr>\n </tbody>\n </template>\n </v-data-table>\n\n <div class=\"text-center stream-message\">\n <span v-if=\"content && !streamOptions.end\">... Loading more rows</span>\n <span v-if=\"!loading && streamOptions.end\">End of file.</span>\n </div>\n </div>\n\n <img\n v-else-if=\"resultType === 'image'\"\n :src=\"$store.getters.getBlobUrl(result.downloadUrl)\"\n :alt=\"result.verboseName\"\n class=\"results-image\"\n >\n\n <iframe\n v-else-if=\"['html', 'pdf'].includes(resultType)\"\n :src=\"$store.getters.getBlobUrl(result.downloadUrl, '')\"\n frameborder=\"0\"\n class=\"results-iframe\"\n style=\"width: 100%; height: 100%; min-height: 80vh;\"\n />\n\n <iframe\n v-else-if=\"resultType === 'igv_bam'\"\n :src=\"result.downloadUrl\"\n frameborder=\"0\"\n class=\"results-iframe\"\n style=\"width: 100%; height: 100%; min-height: 80vh;\"\n />\n\n <code\n v-else-if=\"resultType === 'number'\"\n class=\"v-markup\"\n >\n <span size=\"100px\">{{ result.value | round(3) }}</span>\n </code>\n\n <code\n v-else-if=\"['string', 'url-link'].includes(resultType)\"\n class=\"v-markup\"\n >\n <span size=\"100px\">{{ result.value }}</span>\n </code>\n </v-row>\n\n </v-card>\n </v-dialog>\n</template>\n\n<script>\nimport { loadResult } from '@/utils/api'\nimport { HIDE_PANEL, SHOW_PANEL } from '@/store/actions/panels'\nimport { TOGGLE_RESULT_FULLSCREEN } from '@/store/actions/user'\nimport { GET_FILE } from '@/store/actions/files'\nimport { mapGetters } from 'vuex'\nimport detect from 'detect-csv'\n\nexport default {\n name: 'ResultsGallery',\n props: {\n resultIndex: {\n type: Number,\n },\n results: {\n type: Array,\n },\n },\n data() {\n return {\n content: '',\n displayRawText: false,\n isBottomScrolled: false,\n loading: false,\n showDialog: false,\n tsvItems: [],\n tsvHeaders: [],\n streamOptions: {\n lines: 200,\n offset: 0,\n reverse: false,\n previous: '',\n end: false,\n },\n }\n },\n computed: {\n ...mapGetters(['resultKey', 'isResultModalFullScreen']),\n keymap() {\n return {\n right: this.increaseIndex,\n left: this.decreaseIndex,\n esc: this.hideDialog,\n }\n },\n result() {\n return this.results[this.resultIndex] || {}\n },\n isAnsi() {\n return this.result && this.result.frontendType === 'ansi'\n },\n resultType() {\n if (this.result.frontendType === 'ansi') {\n return 'raw'\n } else if (this.result.frontendType === 'text-file') {\n return 'raw'\n } else if (this.result.frontendType === 'tsv-file') {\n if (\n !this.displayRawText &&\n this.tsvItems.length &&\n this.tsvHeaders.length\n ) {\n return 'table'\n } else {\n return 'raw'\n }\n } else {\n return this.result.frontendType\n }\n },\n },\n watch: {\n showDialog(value) {\n if (!value) {\n this.$store.dispatch(HIDE_PANEL, 'result')\n this.$emit('display-result', null)\n }\n },\n resultIndex(value) {\n this.showDialog = Number.isInteger(value) && value < this.results.length\n if (this.showDialog && ['raw', 'table'].includes(this.resultType)) {\n this.resetStreamEvents()\n this.loadFileContents()\n }\n },\n resultKey: {\n handler() {\n this.updateResultIndex()\n },\n immediate: true,\n },\n result(value) {\n if (value && value.resultKey) {\n this.$store.dispatch(SHOW_PANEL, {\n result: value.resultKey,\n })\n if (['html', 'pdf'].includes(value.frontendType)) {\n this.$store.dispatch(GET_FILE, value.downloadUrl)\n }\n // Track result viewed\n window.analytics.track('Result Previewed', value.analytics)\n }\n this.updateResultIndex()\n },\n isBottomScrolled(value) {\n if (value) {\n this.loadFileContents()\n }\n },\n displayRawText() {\n this.addScrollListener()\n },\n },\n methods: {\n resetStreamEvents() {\n // Reset content\n this.content = ''\n this.streamOptions = {\n lines: 200,\n offset: 0,\n reverse: false,\n previous: '',\n end: false,\n }\n // Remove listeners\n this.$nextTick(() => {\n if (this.$refs.raw) {\n this.$refs.raw.removeEventListener('scroll', this.isBottomVisible)\n }\n if (this.$refs.table) {\n this.$refs.table.removeEventListener('scroll', this.isBottomVisible)\n }\n })\n },\n addScrollListener() {\n this.$nextTick(() => {\n this.isBottomVisible()\n if (!this.isBottomScrolled) {\n if (this.$refs.raw) {\n this.$refs.raw.addEventListener('scroll', this.isBottomVisible)\n }\n if (this.$refs.table) {\n this.$refs.table.addEventListener('scroll', this.isBottomVisible)\n }\n }\n })\n },\n updateResultIndex() {\n if (this.resultKey !== this.result.resultKey) {\n this.results.forEach((result, index) => {\n if (result.resultKey === this.resultKey) {\n this.showDialog = true\n this.$emit('display-result', index)\n }\n })\n }\n },\n hideDialog() {\n if (this.showDialog) {\n this.showDialog = false\n }\n },\n increaseIndex() {\n if (this.showDialog) {\n if (this.resultIndex < this.results.length - 1) {\n this.$emit('display-result', this.resultIndex + 1)\n this.content = ''\n } else {\n this.$emit('display-result', 0)\n this.content = ''\n }\n }\n },\n decreaseIndex() {\n if (this.showDialog) {\n if (this.resultIndex > 0) {\n this.$emit('display-result', this.resultIndex - 1)\n } else {\n this.$emit('display-result', this.results.length - 1)\n }\n }\n },\n async loadFileContents() {\n const { lines, offset, reverse, end, previous } = this.streamOptions\n if (!end) {\n this.loading = true\n let content = await loadResult(\n this.result.analysis.pk,\n this.result.resultKey,\n lines,\n offset,\n reverse\n )\n this.loading = false\n\n if (content && previous !== content) {\n this.streamOptions.previous = content\n this.streamOptions.offset += lines\n this.content += content\n this.setTsvItems(this.content)\n this.addScrollListener()\n } else {\n this.streamOptions.end = true\n this.setTsvItems(this.content)\n }\n\n }\n },\n setTsvItems(content) {\n const isTsv = this.result.frontendType === 'tsv-file'\n const detectHandler = (\n detect(content.slice(0, 1000)) || { newline: '\\n', delimiter: '\\t'}\n )\n\n // csv to list of lists\n const dataRows =\n content && isTsv\n ? this.csvToArray(content.trim(), detectHandler.delimiter)\n .filter((row) => row.length)\n .filter((row) => row[0][0] !== '#' || row[0].includes('#CHROM'))\n : []\n\n // Headers\n this.tsvHeaders = dataRows.length\n ? dataRows[0].map((header, index) => {\n return {\n text: header,\n value: `index${index}`,\n sortable: this.streamOptions.end,\n }\n })\n : []\n\n this.tsvHeaders.unshift({\n text: 1,\n value: 'index',\n sortable: false,\n align: 'end',\n class: 'line-column text'\n })\n\n // Content rows\n this.tsvItems = dataRows.length\n ? dataRows.slice(1)\n .map((row, index) => {\n let dictRow = { index: index + 2 }\n row.forEach((value, index) => {\n dictRow[`index${index}`] = value\n })\n return dictRow\n })\n : []\n\n if (!isTsv || (isTsv && !this.tsvHeaders.length)) {\n this.displayRawText = true\n }\n },\n reverseContent() {\n const reverse = this.streamOptions.reverse\n this.resetStreamEvents()\n this.streamOptions.reverse = !reverse\n this.loadFileContents()\n },\n isBottomVisible() {\n const divElement = this.$refs[this.resultType]\n const scrollTop = divElement.scrollTop\n const visible = divElement.clientHeight\n const pageHeight = divElement.scrollHeight\n const bottomOfPage = visible + scrollTop >= pageHeight\n this.isBottomScrolled = bottomOfPage || pageHeight < visible\n },\n toggleFullScreen() {\n this.$store.dispatch(TOGGLE_RESULT_FULLSCREEN, {\n value: !this.isResultModalFullScreen\n })\n },\n parseTsvCell(value) {\n let pattern = /^((http|https|ftp):\\/\\/)/\n if (pattern.test(value)) {\n return `<a href=\"${value}\" target=\"_blank\">Open link</a>`\n } else {\n return value\n }\n },\n\n csvToArray(strData, strDelimiter=\",\") {\n // See: https://stackoverflow.com/a/1293163/3949081\n const objPattern = new RegExp(\n (\n // Delimiters.\n \"(\\\\\" + strDelimiter + \"|\\\\r?\\\\n|\\\\r|^)\" +\n // Quoted fields.\n \"(?:\\\"([^\\\"]*(?:\\\"\\\"[^\\\"]*)*)\\\"|\" +\n // Standard fields.\n \"([^\\\"\\\\\" + strDelimiter + \"\\\\r\\\\n]*))\"\n ),\n \"gi\"\n )\n const arrData = [[]]\n let arrMatches = null\n\n while (arrMatches = objPattern.exec(strData)) {\n // If not delimiter, an end of row has been reached\n const strMatchedDelimiter = arrMatches[1]\n if (\n strMatchedDelimiter.length &&\n strMatchedDelimiter !== strDelimiter\n ){\n arrData.push([])\n }\n\n let strMatchedValue\n if (arrMatches[2]){\n // Quoted value, Unescape any double quotes.\n strMatchedValue = arrMatches[2].replace(\n new RegExp( \"\\\"\\\"\", \"g\" ),\n \"\\\"\"\n )\n } else {\n // Non-quoted value.\n strMatchedValue = arrMatches[3]\n }\n arrData[arrData.length - 1].push(strMatchedValue)\n }\n return arrData\n }\n },\n}\n</script>\n\n<style lang=\"scss\">\n.tsv-table {\n max-width: 100%;\n max-height: 100%;\n margin: 0px auto;\n overflow: auto;\n}\n.v-dialog {\n overflow-y: visible !important; // truly important for iframe performance, dont remove!\n &:not(.v-dialog--fullscreen) {\n max-height: 100% !important;\n max-width: calc(100% - 48px);\n }\n iframe.results-iframe {\n height: 100% !important;\n }\n &.gallery-dialog {\n height: calc(100vh - 60px);\n }\n}\n.results-image {\n max-width: 100%;\n max-height: 85vh;\n margin: auto;\n max-height: 100%;\n width: auto;\n}\n.gallery-card {\n ::-webkit-scrollbar {\n width: 0px;\n height: 0px;\n }\n}\n.v-application .gallery-card {\n .gallery-content {\n background: var(--v-background-base);\n }\n\n pre {\n white-space: pre-line;\n &.pre-wrap {\n white-space: pre-wrap;\n }\n code {\n font-size: 12px;\n font-weight: 600;\n }\n }\n\n &.theme--dark code {\n background-color: rgba(0,0,0,.05);\n }\n\n code.v-markup,\n pre.v-markup {\n padding: 10px;\n width: 100%;\n height: 100%;\n text-align: start;\n box-shadow: none;\n text-shadow: none;\n display: flex;\n position: relative;\n overflow-x: auto;\n overflow-y: auto;\n margin: 0px;\n top: 0px;\n color: rgb(255, 255, 255);\n border-radius: 0px;\n background: rgb(0, 0, 0);\n font-size: 12px;\n font-weight: 600;\n\n code.hljs {\n font-size: 12px;\n padding: 0px;\n\n .hljs-string,\n .hljs-bullet,\n .hljs-subst,\n .hljs-title,\n .hljs-section,\n .hljs-emphasis,\n .hljs-type,\n .hljs-built_in,\n .hljs-builtin-name,\n .hljs-selector-attr,\n .hljs-selector-pseudo,\n .hljs-addition,\n .hljs-variable,\n .hljs-template-tag,\n .hljs-template-variable {\n color: var(--v-warning-base);\n }\n }\n }\n\n .tsv-table {\n border: thin solid rgba(0,0,0,.12);\n margin-left: 0;\n\n .theme--dark {\n thead tr th {\n background: var(--v-surface-darken1);\n span {\n color: #9e9e9e;\n }\n }\n tbody tr td {\n background: var(--v-background-base);\n span {\n color: #9e9e9e;\n }\n }\n }\n\n thead tr {\n th {\n background: var(--v-background-base);\n max-width: 250px;\n white-space: nowrap;\n span {\n font-size: 12px;\n font-family: Roboto;\n color: #333333;\n }\n }\n }\n tbody tr {\n td {\n font-size: 12px;\n font-family: Roboto;\n overflow-x: auto;\n white-space: nowrap;\n max-width: 250px;\n }\n }\n\n thead tr th, tbody tr td {\n &.line-column {\n background: var(--v-surface-darken1);\n width: 50px;\n text-align: right;\n font-weight: normal;\n // Make line-column sticky\n position: sticky !important;\n left: 0;\n z-index: 9998;\n }\n }\n\n thead tr th .line-column {\n z-index: 9999;\n }\n }\n\n\n .stream-message {\n font-size: 12px;\n font-style: italic;\n margin: 20px 0px;\n }\n}\n</style>\n"]
279140
+ sourcesContent: ["<template>\n <v-dialog\n v-hotkey=\"keymap\"\n v-if=\"showDialog\"\n v-model=\"showDialog\"\n :fullscreen=\"isResultModalFullScreen\"\n scrollable\n class=\"gallery-dialog\"\n >\n <v-card flat class=\"gallery-card\">\n <v-card-title class=\"pa-2\">\n <v-row>\n <v-col cols=\"6\">\n <h3 class=\"font-weight-thin primary--text\">\n {{ result.verboseName }}\n </h3>\n </v-col>\n\n <v-col cols=\"6\" class=\"d-flex justify-end align-center panel-slot-actions\">\n\n <!-- toggle raw text -->\n <v-tooltip\n v-if=\"result.frontendType === 'tsv-file' && tsvHeaders.length\"\n top\n >\n <template v-slot:activator=\"{ on }\">\n <v-icon\n class=\"primary--text ml-4\"\n small\n @click=\"displayRawText = !displayRawText\"\n v-on=\"on\"\n >\n {{ displayRawText ? 'table_chart' : 'text_fields' }}\n </v-icon>\n </template>\n {{ displayRawText ? 'Display Tabulated Content' : 'Display Raw Content' }}\n </v-tooltip>\n\n <!-- download result -->\n <v-tooltip\n v-if=\"result.download\"\n top\n >\n <template v-slot:activator=\"{ on }\">\n <v-icon\n class=\"primary--text ml-4\"\n small\n @click=\"result.download\"\n v-on=\"on\"\n >\n {{ result.downloadIcon }}\n </v-icon>\n </template>\n {{ result.downloadIcon === 'open_in_new' ? 'Open in new tab' : 'Download Result' }}\n </v-tooltip>\n\n <!-- copy to clipboard -->\n <v-tooltip\n v-if=\"result.copyToClipBoard\"\n top\n >\n <template v-slot:activator=\"{ on }\">\n <v-icon\n class=\"primary--text ml-4\"\n small\n @click=\"result.copyToClipBoard\"\n v-on=\"on\"\n >\n file_copy\n </v-icon>\n </template>\n Copy to clipboard!\n </v-tooltip>\n\n <!-- external link -->\n <v-tooltip\n v-if=\"result.openExternalLink\"\n top\n >\n <template v-slot:activator=\"{ on }\">\n <v-icon\n class=\"primary--text ml-4\"\n small\n @click=\"result.openExternalLink\"\n v-on=\"on\"\n >\n info\n </v-icon>\n </template>\n Learn more!\n </v-tooltip>\n\n <!-- show from bottom -->\n <v-tooltip\n v-if=\"['raw'].includes(resultType)\"\n top\n >\n <template v-slot:activator=\"{ on }\">\n <v-icon\n class=\"primary--text ml-4\"\n small\n @click=\"reverseContent\"\n v-on=\"on\"\n >\n {{ streamOptions.reverse ? 'vertical_align_bottom' : 'vertical_align_top'}}\n </v-icon>\n </template>\n <span>\n Show content from {{ streamOptions.reverse ? 'top' : 'bottom' }}\n </span>\n </v-tooltip>\n\n <!-- show fullscreen -->\n <v-tooltip\n top\n >\n <template v-slot:activator=\"{ on }\">\n <v-icon\n class=\"primary--text ml-4\"\n small\n @click=\"toggleFullScreen\"\n v-on=\"on\"\n >\n {{ isResultModalFullScreen ? 'fullscreen_exit' : 'fullscreen'}}\n </v-icon>\n </template>\n <span>\n Toggle Full Screen\n </span>\n </v-tooltip>\n\n <!-- close dialog -->\n <v-tooltip top>\n <template v-slot:activator=\"{ on }\">\n <v-icon\n class=\"primary--text ml-4\"\n small\n @click=\"hideDialog\"\n v-on=\"on\"\n >\n close\n </v-icon>\n </template>\n Close file\n </v-tooltip>\n </v-col>\n </v-row>\n </v-card-title>\n\n <v-row class=\"pa-0 ma-0 gallery-content\" style=\"height: 85vh\">\n <v-progress-linear\n v-if=\"loading\"\n class=\"panel-loader\"\n indeterminate\n height=\"2\"\n color=\"primary\"\n />\n\n <pre\n v-highlightjs=\"content\"\n v-if=\"resultType === 'raw' && resultKey === 'command_script'\"\n ref=\"raw\"\n class=\"v-markup pre-wrap\"\n >\n <code class=\"bash\" />\n </pre>\n\n <code\n v-else-if=\"isAnsi\"\n ref=\"raw\"\n class=\"v-markup\"\n >\n <pre v-html=\"content\" />\n </code>\n\n <code\n v-else-if=\"resultType === 'raw'\"\n ref=\"raw\"\n class=\"v-markup\"\n >\n <pre>\n {{ content }}\n <!-- Footer showing if more content can be loaded -->\n <span v-if=\"content && content.split('\\n').length >= 200\">\n <span v-if=\"!streamOptions.end\" class=\"stream-message grey--text lighten-2\">\n ... Loading more rows\n </span>\n <span v-if=\"streamOptions.end\" class=\"stream-message grey--text\">\n *** End of file. ***\n </span>\n </span>\n </pre>\n </code>\n\n <div\n v-else-if=\"resultType === 'table'\"\n ref=\"table\"\n class=\"tsv-table\"\n >\n <v-data-table\n :headers=\"tsvHeaders\"\n :items=\"tsvItems\"\n :items-per-page=\"tsvItems.length\"\n hide-default-footer\n multi-sort\n fixed-header\n dense\n >\n <template v-slot:body=\"{ items }\">\n <tbody>\n <tr\n v-for=\"item in items\"\n :key=\"item.name\"\n >\n <td\n v-for=\"(header, index) in tsvHeaders\"\n :key=\"index + header.value\"\n :class=\"[header.value === 'index' ? 'line-column text' : '']\"\n v-html=\"parseTsvCell($get(item, header.value))\"\n />\n </tr>\n </tbody>\n </template>\n </v-data-table>\n\n <div class=\"text-center stream-message\">\n <!-- Footer showing if more content can be loaded -->\n <span v-if=\"content && content.split('\\n').length >= 200\">\n <span v-if=\"!streamOptions.end\">... Loading more rows</span>\n <span v-else>End of file.</span>\n </span>\n </div>\n </div>\n\n <img\n v-else-if=\"resultType === 'image'\"\n :src=\"$store.getters.getBlobUrl(result.downloadUrl)\"\n :alt=\"result.verboseName\"\n class=\"results-image\"\n >\n\n <iframe\n v-else-if=\"['html', 'pdf'].includes(resultType)\"\n :src=\"$store.getters.getBlobUrl(result.downloadUrl, '')\"\n frameborder=\"0\"\n class=\"results-iframe\"\n style=\"width: 100%; height: 100%; min-height: 80vh;\"\n />\n\n <iframe\n v-else-if=\"resultType === 'igv_bam'\"\n :src=\"result.downloadUrl\"\n frameborder=\"0\"\n class=\"results-iframe\"\n style=\"width: 100%; height: 100%; min-height: 80vh;\"\n />\n\n <code\n v-else-if=\"resultType === 'number'\"\n class=\"v-markup\"\n >\n <span size=\"100px\">{{ result.value | round(3) }}</span>\n </code>\n\n <code\n v-else-if=\"['string', 'url-link'].includes(resultType)\"\n class=\"v-markup\"\n >\n <span size=\"100px\">{{ result.value }}</span>\n </code>\n </v-row>\n\n </v-card>\n </v-dialog>\n</template>\n\n<script>\nimport { loadResult } from '@/utils/api'\nimport { HIDE_PANEL, SHOW_PANEL } from '@/store/actions/panels'\nimport { TOGGLE_RESULT_FULLSCREEN } from '@/store/actions/user'\nimport { GET_FILE } from '@/store/actions/files'\nimport { mapGetters } from 'vuex'\nimport detect from 'detect-csv'\n\nexport default {\n name: 'ResultsGallery',\n props: {\n resultIndex: {\n type: Number,\n },\n results: {\n type: Array,\n },\n },\n data() {\n return {\n content: '',\n displayRawText: false,\n isBottomScrolled: false,\n loading: false,\n showDialog: false,\n tsvItems: [],\n tsvHeaders: [],\n streamOptions: {\n lines: 200,\n offset: 0,\n reverse: false,\n previous: '',\n end: false,\n },\n }\n },\n computed: {\n ...mapGetters(['resultKey', 'isResultModalFullScreen']),\n keymap() {\n return {\n right: this.increaseIndex,\n left: this.decreaseIndex,\n esc: this.hideDialog,\n }\n },\n result() {\n return this.results[this.resultIndex] || {}\n },\n isAnsi() {\n return this.result && this.result.frontendType === 'ansi'\n },\n resultType() {\n if (this.result.frontendType === 'ansi') {\n return 'raw'\n } else if (this.result.frontendType === 'text-file') {\n return 'raw'\n } else if (this.result.frontendType === 'tsv-file') {\n if (\n !this.displayRawText &&\n this.tsvItems.length &&\n this.tsvHeaders.length\n ) {\n return 'table'\n } else {\n return 'raw'\n }\n } else {\n return this.result.frontendType\n }\n },\n },\n watch: {\n showDialog(value) {\n if (!value) {\n this.$store.dispatch(HIDE_PANEL, 'result')\n this.$emit('display-result', null)\n }\n },\n resultIndex(value) {\n this.showDialog = Number.isInteger(value) && value < this.results.length\n if (this.showDialog && ['raw', 'table'].includes(this.resultType)) {\n this.resetStreamEvents()\n this.loadFileContents()\n }\n },\n resultKey: {\n handler() {\n this.updateResultIndex()\n },\n immediate: true,\n },\n result(value) {\n if (value && value.resultKey) {\n this.$store.dispatch(SHOW_PANEL, {\n result: value.resultKey,\n })\n if (['html', 'pdf'].includes(value.frontendType)) {\n this.$store.dispatch(GET_FILE, value.downloadUrl)\n }\n // Track result viewed\n window.analytics.track('Result Previewed', value.analytics)\n }\n this.updateResultIndex()\n },\n isBottomScrolled(value) {\n if (value) {\n this.loadFileContents()\n }\n },\n displayRawText() {\n this.addScrollListener()\n },\n },\n methods: {\n resetStreamEvents() {\n // Reset content\n this.content = ''\n this.streamOptions = {\n lines: 200,\n offset: 0,\n reverse: false,\n previous: '',\n end: false,\n }\n // Remove listeners\n this.$nextTick(() => {\n if (this.$refs.raw) {\n this.$refs.raw.removeEventListener('scroll', this.isBottomVisible)\n }\n if (this.$refs.table) {\n this.$refs.table.removeEventListener('scroll', this.isBottomVisible)\n }\n })\n },\n addScrollListener() {\n this.$nextTick(() => {\n this.isBottomVisible()\n if (!this.isBottomScrolled) {\n if (this.$refs.raw) {\n this.$refs.raw.addEventListener('scroll', this.isBottomVisible)\n }\n if (this.$refs.table) {\n this.$refs.table.addEventListener('scroll', this.isBottomVisible)\n }\n }\n })\n },\n updateResultIndex() {\n if (this.resultKey !== this.result.resultKey) {\n this.results.forEach((result, index) => {\n if (result.resultKey === this.resultKey) {\n this.showDialog = true\n this.$emit('display-result', index)\n }\n })\n }\n },\n hideDialog() {\n if (this.showDialog) {\n this.showDialog = false\n }\n },\n increaseIndex() {\n if (this.showDialog) {\n if (this.resultIndex < this.results.length - 1) {\n this.$emit('display-result', this.resultIndex + 1)\n this.content = ''\n } else {\n this.$emit('display-result', 0)\n this.content = ''\n }\n }\n },\n decreaseIndex() {\n if (this.showDialog) {\n if (this.resultIndex > 0) {\n this.$emit('display-result', this.resultIndex - 1)\n } else {\n this.$emit('display-result', this.results.length - 1)\n }\n }\n },\n async loadFileContents() {\n const { lines, offset, reverse, end, previous } = this.streamOptions\n if (!end) {\n this.loading = true\n let content = await loadResult(\n this.result.analysis.pk,\n this.result.resultKey,\n lines,\n offset,\n reverse\n )\n this.loading = false\n\n if (content && previous !== content) {\n this.streamOptions.previous = content\n this.streamOptions.offset += lines\n this.content += content\n this.setTsvItems(this.content)\n this.addScrollListener()\n } else {\n this.streamOptions.end = true\n this.setTsvItems(this.content)\n }\n\n }\n },\n setTsvItems(content) {\n const isTsv = this.result.frontendType === 'tsv-file'\n const detectHandler = (\n detect(content.slice(0, 1000)) || { newline: '\\n', delimiter: '\\t'}\n )\n\n // csv to list of lists\n const dataRows =\n content && isTsv\n ? this.csvToArray(content.trim(), detectHandler.delimiter)\n .filter((row) => row.length)\n .filter((row) => row[0][0] !== '#' || row[0].includes('#CHROM'))\n : []\n\n // Headers\n this.tsvHeaders = dataRows.length\n ? dataRows[0].map((header, index) => {\n return {\n text: header,\n value: `index${index}`,\n sortable: this.streamOptions.end,\n }\n })\n : []\n\n this.tsvHeaders.unshift({\n text: 1,\n value: 'index',\n sortable: false,\n align: 'end',\n class: 'line-column text'\n })\n\n // Content rows\n this.tsvItems = dataRows.length\n ? dataRows.slice(1)\n .map((row, index) => {\n let dictRow = { index: index + 2 }\n row.forEach((value, index) => {\n dictRow[`index${index}`] = value\n })\n return dictRow\n })\n : []\n\n if (!isTsv || (isTsv && !this.tsvHeaders.length)) {\n this.displayRawText = true\n }\n },\n reverseContent() {\n const reverse = this.streamOptions.reverse\n this.resetStreamEvents()\n this.streamOptions.reverse = !reverse\n this.loadFileContents()\n },\n isBottomVisible() {\n const divElement = this.$refs[this.resultType]\n const scrollTop = divElement.scrollTop\n const visible = divElement.clientHeight\n const pageHeight = divElement.scrollHeight\n const bottomOfPage = visible + scrollTop >= pageHeight\n this.isBottomScrolled = bottomOfPage || pageHeight < visible\n },\n toggleFullScreen() {\n this.$store.dispatch(TOGGLE_RESULT_FULLSCREEN, {\n value: !this.isResultModalFullScreen\n })\n },\n parseTsvCell(value) {\n let pattern = /^((http|https|ftp):\\/\\/)/\n if (pattern.test(value)) {\n return `<a href=\"${value}\" target=\"_blank\">Open link</a>`\n } else {\n return value\n }\n },\n\n csvToArray(strData, strDelimiter=\",\") {\n // See: https://stackoverflow.com/a/1293163/3949081\n const objPattern = new RegExp(\n (\n // Delimiters.\n \"(\\\\\" + strDelimiter + \"|\\\\r?\\\\n|\\\\r|^)\" +\n // Quoted fields.\n \"(?:\\\"([^\\\"]*(?:\\\"\\\"[^\\\"]*)*)\\\"|\" +\n // Standard fields.\n \"([^\\\"\\\\\" + strDelimiter + \"\\\\r\\\\n]*))\"\n ),\n \"gi\"\n )\n const arrData = [[]]\n let arrMatches = null\n\n while (arrMatches = objPattern.exec(strData)) {\n // If not delimiter, an end of row has been reached\n const strMatchedDelimiter = arrMatches[1]\n if (\n strMatchedDelimiter.length &&\n strMatchedDelimiter !== strDelimiter\n ){\n arrData.push([])\n }\n\n let strMatchedValue\n if (arrMatches[2]){\n // Quoted value, Unescape any double quotes.\n strMatchedValue = arrMatches[2].replace(\n new RegExp( \"\\\"\\\"\", \"g\" ),\n \"\\\"\"\n )\n } else {\n // Non-quoted value.\n strMatchedValue = arrMatches[3]\n }\n arrData[arrData.length - 1].push(strMatchedValue)\n }\n return arrData\n }\n },\n}\n</script>\n\n<style lang=\"scss\">\n.tsv-table {\n max-width: 100%;\n max-height: 100%;\n margin: 0px auto;\n overflow: auto;\n}\n.v-dialog {\n overflow-y: visible !important; // truly important for iframe performance, dont remove!\n &:not(.v-dialog--fullscreen) {\n max-height: 100% !important;\n max-width: calc(100% - 48px);\n }\n iframe.results-iframe {\n height: 100% !important;\n }\n &.gallery-dialog {\n height: calc(100vh - 60px);\n }\n}\n.results-image {\n max-width: 100%;\n max-height: 85vh;\n margin: auto;\n max-height: 100%;\n width: auto;\n}\n.gallery-card {\n ::-webkit-scrollbar {\n width: 0px;\n height: 0px;\n }\n}\n.v-application .gallery-card {\n .gallery-content {\n background: var(--v-background-base);\n }\n\n pre {\n white-space: pre-line;\n &.pre-wrap {\n white-space: pre-wrap;\n }\n code {\n font-size: 12px;\n font-weight: 600;\n }\n }\n\n &.theme--dark code {\n background-color: rgba(0,0,0,.05);\n }\n\n code.v-markup,\n pre.v-markup {\n padding: 10px;\n width: 100%;\n height: 100%;\n text-align: start;\n box-shadow: none;\n text-shadow: none;\n display: flex;\n position: relative;\n overflow-x: auto;\n overflow-y: auto;\n margin: 0px;\n top: 0px;\n color: rgb(255, 255, 255);\n border-radius: 0px;\n background: rgb(0, 0, 0);\n font-size: 12px;\n font-weight: 600;\n\n code.hljs {\n font-size: 12px;\n padding: 0px;\n\n .hljs-string,\n .hljs-bullet,\n .hljs-subst,\n .hljs-title,\n .hljs-section,\n .hljs-emphasis,\n .hljs-type,\n .hljs-built_in,\n .hljs-builtin-name,\n .hljs-selector-attr,\n .hljs-selector-pseudo,\n .hljs-addition,\n .hljs-variable,\n .hljs-template-tag,\n .hljs-template-variable {\n color: var(--v-warning-base);\n }\n }\n }\n\n .tsv-table {\n border: thin solid rgba(0,0,0,.12);\n margin-left: 0;\n\n .theme--dark {\n thead tr th {\n background: var(--v-surface-darken1);\n span {\n color: #9e9e9e;\n }\n }\n tbody tr td {\n background: var(--v-background-base);\n span {\n color: #9e9e9e;\n }\n }\n }\n\n thead tr {\n th {\n background: var(--v-background-base);\n max-width: 250px;\n white-space: nowrap;\n span {\n font-size: 12px;\n font-family: Roboto;\n color: #333333;\n }\n }\n }\n tbody tr {\n td {\n font-size: 12px;\n font-family: Roboto;\n overflow-x: auto;\n white-space: nowrap;\n max-width: 250px;\n }\n }\n\n thead tr th, tbody tr td {\n &.line-column {\n background: var(--v-surface-darken1);\n width: 50px;\n text-align: right;\n font-weight: normal;\n // Make line-column sticky\n position: sticky !important;\n left: 0;\n z-index: 9998;\n }\n }\n\n thead tr th .line-column {\n z-index: 9999;\n }\n }\n\n\n .stream-message {\n font-size: 12px;\n font-style: italic;\n margin: 20px 0px;\n }\n}\n</style>\n"]
279176
279141
  },
279177
279142
  _coverageSchema: "43e27e138ebf9cfc5966b082cf9a028302ed4184",
279178
- hash: "68d228565d6b6c5100fcb14e924652ac345880c1"
279143
+ hash: "5d444039a2a8e9894579cef12c5354c23ba58df6"
279179
279144
  };
279180
279145
  var coverage = global[gcv] || (global[gcv] = {});
279181
279146
  if (coverage[path] && coverage[path].hash === hash) {
@@ -279721,9 +279686,9 @@ function ResultsGalleryvue_type_script_lang_js_toPrimitive(input, hint) { if (Re
279721
279686
  });
279722
279687
  ;// CONCATENATED MODULE: ./src/components/analyses/ResultsGallery.vue?vue&type=script&lang=js&
279723
279688
  /* harmony default export */ var analyses_ResultsGalleryvue_type_script_lang_js_ = (ResultsGalleryvue_type_script_lang_js_);
279724
- // EXTERNAL MODULE: ./node_modules/vue-style-loader/index.js??clonedRuleSet-64.use[0]!./node_modules/css-loader/dist/cjs.js??clonedRuleSet-64.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/stylePostLoader.js!./node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-64.use[2]!./node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-64.use[3]!./node_modules/sass-loader/dist/cjs.js??clonedRuleSet-64.use[4]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/analyses/ResultsGallery.vue?vue&type=style&index=0&id=1140a7e3&prod&lang=scss&
279725
- var ResultsGalleryvue_type_style_index_0_id_1140a7e3_prod_lang_scss_ = __webpack_require__(611);
279726
- ;// CONCATENATED MODULE: ./src/components/analyses/ResultsGallery.vue?vue&type=style&index=0&id=1140a7e3&prod&lang=scss&
279689
+ // EXTERNAL MODULE: ./node_modules/vue-style-loader/index.js??clonedRuleSet-64.use[0]!./node_modules/css-loader/dist/cjs.js??clonedRuleSet-64.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/stylePostLoader.js!./node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-64.use[2]!./node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-64.use[3]!./node_modules/sass-loader/dist/cjs.js??clonedRuleSet-64.use[4]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/analyses/ResultsGallery.vue?vue&type=style&index=0&id=b464b2ba&prod&lang=scss&
279690
+ var ResultsGalleryvue_type_style_index_0_id_b464b2ba_prod_lang_scss_ = __webpack_require__(57993);
279691
+ ;// CONCATENATED MODULE: ./src/components/analyses/ResultsGallery.vue?vue&type=style&index=0&id=b464b2ba&prod&lang=scss&
279727
279692
 
279728
279693
  ;// CONCATENATED MODULE: ./src/components/analyses/ResultsGallery.vue
279729
279694
 
@@ -279736,8 +279701,8 @@ var ResultsGalleryvue_type_style_index_0_id_1140a7e3_prod_lang_scss_ = __webpack
279736
279701
 
279737
279702
  var ResultsGallery_component = normalizeComponent(
279738
279703
  analyses_ResultsGalleryvue_type_script_lang_js_,
279739
- ResultsGalleryvue_type_template_id_1140a7e3_render,
279740
- ResultsGalleryvue_type_template_id_1140a7e3_staticRenderFns,
279704
+ ResultsGalleryvue_type_template_id_b464b2ba_render,
279705
+ ResultsGalleryvue_type_template_id_b464b2ba_staticRenderFns,
279741
279706
  false,
279742
279707
  null,
279743
279708
  null,
@@ -328977,7 +328942,7 @@ var BioModelPanelvue_type_template_id_3ac4385c_staticRenderFns = (cov_1tpnym9o7k
328977
328942
 
328978
328943
  ;// CONCATENATED MODULE: ./src/components/bioModels/BioModelPanel.vue?vue&type=template&id=3ac4385c&
328979
328944
 
328980
- ;// CONCATENATED MODULE: ./node_modules/babel-loader/lib/index.js??clonedRuleSet-82.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/templateLoader.js??ruleSet[1].rules[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/bioModels/BioModelTree.vue?vue&type=template&id=2e68a456&
328945
+ ;// CONCATENATED MODULE: ./node_modules/babel-loader/lib/index.js??clonedRuleSet-82.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/templateLoader.js??ruleSet[1].rules[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/bioModels/BioModelTree.vue?vue&type=template&id=337f42f6&
328981
328946
  var cov_2f0u9tmiep = function () {
328982
328947
  var path = "/Users/arangooj/papaemme/isabl_web/src/components/bioModels/BioModelTree.vue";
328983
328948
  var hash = "f7765366ebb3c7a640aaf82703057afe08ae5056";
@@ -329344,7 +329309,7 @@ var cov_2f0u9tmiep = function () {
329344
329309
  return coverage[path] = coverageData;
329345
329310
  }();
329346
329311
  cov_2f0u9tmiep.s[0]++;
329347
- var BioModelTreevue_type_template_id_2e68a456_render = function render() {
329312
+ var BioModelTreevue_type_template_id_337f42f6_render = function render() {
329348
329313
  cov_2f0u9tmiep.f[0]++;
329349
329314
  var _vm = (cov_2f0u9tmiep.s[1]++, this),
329350
329315
  _c = (cov_2f0u9tmiep.s[2]++, _vm._self._c);
@@ -329419,14 +329384,14 @@ var BioModelTreevue_type_template_id_2e68a456_render = function render() {
329419
329384
  staticClass: "individual-tree text-center pa-0 ma-0"
329420
329385
  })], 1)], 1);
329421
329386
  };
329422
- var BioModelTreevue_type_template_id_2e68a456_staticRenderFns = (cov_2f0u9tmiep.s[9]++, []);
329387
+ var BioModelTreevue_type_template_id_337f42f6_staticRenderFns = (cov_2f0u9tmiep.s[9]++, []);
329423
329388
 
329424
- ;// CONCATENATED MODULE: ./src/components/bioModels/BioModelTree.vue?vue&type=template&id=2e68a456&
329389
+ ;// CONCATENATED MODULE: ./src/components/bioModels/BioModelTree.vue?vue&type=template&id=337f42f6&
329425
329390
 
329426
329391
  ;// CONCATENATED MODULE: ./node_modules/thread-loader/dist/cjs.js!./node_modules/babel-loader/lib/index.js??clonedRuleSet-82.use[1]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/bioModels/BioModelTree.vue?vue&type=script&lang=js&
329427
329392
  var BioModelTreevue_type_script_lang_js_cov_2f0u9tmiep = function () {
329428
329393
  var path = "/Users/arangooj/papaemme/isabl_web/src/components/bioModels/BioModelTree.vue";
329429
- var hash = "59e08d1c64c25cb454a3e5dffce258dc15f4d5b9";
329394
+ var hash = "be336c38506a643b71832f44cd825ff3c922878c";
329430
329395
  var global = new Function("return this")();
329431
329396
  var gcv = "__coverage__";
329432
329397
  var coverageData = {
@@ -334946,10 +334911,10 @@ var BioModelTreevue_type_script_lang_js_cov_2f0u9tmiep = function () {
334946
334911
  mappings: ";AA4CA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA",
334947
334912
  file: "BioModelTree.vue",
334948
334913
  sourceRoot: "src/components/bioModels",
334949
- sourcesContent: ["<template>\n <v-card\n flat\n class=\"isabl-base-card\"\n data-test=\"biomodel-tree\"\n >\n <base-section-title\n :show-more=\"showTree\"\n @toggle-show-more=\"showTree = !showTree\"\n >\n <template v-slot:title>Samples Tree</template>\n <template v-slot:actions>\n <div>\n <v-btn\n v-if=\"isBigTree\"\n class=\"table-action-btn pull-right ma-0\"\n fab\n outlined\n color=\"primary\"\n @click=\"\n showFullHeight = !showFullHeight\n scrollToCurrentNode()\n \"\n >\n <v-icon color=\"primary\">{{ showFullHeight ? 'expand_less' : 'expand_more' }}</v-icon>\n </v-btn>\n </div>\n </template>\n </base-section-title>\n\n <!-- Graph -->\n <v-row\n v-show=\"showTree\"\n id=\"tree-div\"\n :style=\"showFullHeight ? '' : 'max-height: 300px;'\"\n class=\"individual-tree-div ma-0\"\n >\n <v-col class=\"individual-tree text-center pa-0 ma-0\" />\n </v-row>\n\n </v-card>\n</template>\n\n<script>\n/*\n Vue implementation of D3 Tree from:\n https://beta.observablehq.com/@asktree/interactive-tree-diagram-d3v4-v5\n*/\n\nimport { fetchIndividualTree } from '@/utils/api'\nimport { mapGetters } from 'vuex'\nimport { SHOW_ALERT } from '@/store/actions/alert'\nimport { SHOW_PANEL } from '@/store/actions/panels'\nimport BasePanel from '@/components/base/BasePanel.vue'\nimport BaseSectionTitle from '@/components/base/BaseSectionTitle'\nimport {\n tree as d3Tree,\n event as d3Event,\n select as d3Select,\n hierarchy as d3Hierarchy,\n linkHorizontal as d3linkHorizontal\n} from 'd3'\n\nexport default {\n name: 'BioModelTree',\n components: {\n BasePanel,\n BaseSectionTitle\n },\n data() {\n const { treeIcons } = this.$settings\n return {\n loading: false,\n duration: 0,\n data: null,\n root: null,\n tree: null,\n graph: null,\n species: null,\n dataNodes: null,\n showTree: true,\n isBigTree: false,\n showFullHeight: true,\n skipToScrollNode: false,\n currentNode: null,\n nodeSize: Object.keys(treeIcons).length ? 15 : 5,\n margin: { top: 20, bottom: 20, right: 0, left: 105 },\n diagonal: d3linkHorizontal()\n .x(d => d.y)\n .y(d => d.x),\n treeIcons\n }\n },\n computed: {\n ...mapGetters({\n currentModel: 'bioModelId',\n individual: 'individualId'\n })\n },\n watch: {\n individual(value, oldValue) {\n if (value !== oldValue) {\n this.fetchData()\n }\n },\n currentModel() {\n this.data && this.update(this.data)\n }\n },\n mounted() {\n this.fetchData()\n },\n methods: {\n buildTree() {\n let dx = Object.keys(this.treeIcons).length ? this.nodeSize + 4 : 18\n let dy = 0\n let iconSize = this.nodeSize\n\n // set width\n this.width = 540 - this.margin.right - this.margin.left\n this.tree = d3Tree()\n .nodeSize([dx, dy])\n .separation((a, b) => (a.parent == b.parent ? 1.75 : 2.5))\n\n // clear div\n let div = d3Select(this.$el).select('.individual-tree')\n div.selectAll('svg').remove()\n\n // create svg\n this.svg = div\n .append('svg')\n .attr('width', this.width)\n .attr('height', dx)\n .attr('viewBox', [-this.margin.left, -this.margin.top, this.width, dx])\n .style('font', '10px sans-serif')\n .style('user-select', 'none')\n\n // create filters\n this.svg\n .append('svg:filter')\n .attr('id', 'invertColor')\n .append('feColorMatrix')\n .attr('in', 'SourceGraphic')\n .attr('type', 'matrix')\n .attr('values', '-1 0 0 0 1 0 -1 0 0 1 0 0 -1 0 1 0 0 0 1 0')\n\n // create image definitions\n const defs = this.svg.append('svg:defs')\n Object.keys(this.treeIcons).forEach(model => {\n const pattern = defs\n .append('svg:pattern')\n .attr('id', `icon-${model}`)\n .attr('width', iconSize)\n .attr('height', iconSize)\n .attr('patternUnits', 'objectBoundingBox')\n\n pattern\n .append('rect')\n .attr('width', '100%')\n .attr('height', '100%')\n .attr('fill', 'var(--v-primary-base)')\n\n pattern\n .append('svg:image')\n .attr('xlink:href', this.treeIcons[model])\n .attr('width', iconSize)\n .attr('height', iconSize)\n .attr('x', iconSize / 2)\n .attr('y', iconSize / 2)\n .attr('filter', 'url(#invertColor)')\n })\n\n // create links\n this.gLink = this.svg\n .append('g')\n .attr('fill', 'none')\n .attr('stroke', '#555')\n .attr('stroke-opacity', 0.4)\n .attr('stroke-width', 1.5)\n\n // create tooltip\n this.tooltip = d3Select('body')\n .append('div')\n .style('position', 'absolute')\n .style('z-index', '9999')\n .style('visibility', 'hidden')\n\n // create nodes\n this.gNode = this.svg.append('g')\n\n // build root\n this.root = d3Hierarchy(this.data, d => d.children)\n this.root.x0 = dy\n this.root.y0 = 0\n this.root.descendants().forEach((d, i) => {\n d.id = i\n d.collapsed = false\n d._children = d.children\n\n // collapse samples with too many experiments\n if (d.depth !== 0 && d.children ? d.children.length > 10 : false) {\n d.children = null\n d.collapsed = true\n }\n\n // by default hide tree if too many samples\n if (d.depth === 0 && d.children && d.children.length > 10) {\n this.showFullHeight = false\n this.isBigTree = true\n }\n })\n\n this.update(this.root)\n },\n async fetchData() {\n if (this.individual) {\n this.loading = true\n let individual = await fetchIndividualTree(this.individual)\n this.species = individual.species\n\n // Format Individual Tree\n let individualNode = {}\n individualNode.id = individual.system_id\n individualNode.uuid = individual.uuid\n individualNode.name = individual.system_id\n individualNode.parent = null\n individualNode.individual = individual\n individualNode.class = 'individual'\n if (individual.species === 'MOUSE') {\n individualNode.img = 'mouse'\n } else if (individual.species === 'HUMAN') {\n if (individual.gender === 'FEMALE') {\n individualNode.img = 'female'\n } else {\n individualNode.img = 'male'\n }\n } else {\n individualNode.img = 'alien'\n }\n individualNode.children = individual.sample_set.map(sample => {\n // Samples Children\n let sampleNode = {}\n sampleNode.id = sample.system_id\n sampleNode.uuid = sample.uuid\n sampleNode.name = sample.system_id.split('_')\n sampleNode.name = sampleNode.name[sampleNode.name.length - 1]\n sampleNode.parent = individual.system_id\n sampleNode.sample = sample\n sampleNode.individual = individual\n sampleNode.class = 'sample'\n\n if (sample.category === 'TUMOR') {\n sampleNode.img = 'tumor'\n } else {\n sampleNode.img = 'normal'\n }\n\n let aliquots_ids = [\n ...new Set(sample.experiment_set.map(e => e.aliquot_id))\n ]\n\n sampleNode.children = aliquots_ids\n .map(aliquot_id => {\n // Aliquot children\n let aliquotNode = {}\n aliquotNode.aliquot_id = aliquot_id\n aliquotNode.name = ''\n aliquotNode.parent = sample.system_id\n aliquotNode.sample = sample\n aliquotNode.sampleNode = sampleNode\n aliquotNode.individual = individual\n aliquotNode.class = 'aliquot'\n aliquotNode.img = 'aliquot'\n aliquotNode.children = []\n\n sample.experiment_set.map(experiment => {\n // Experiment Children\n if (experiment.aliquot_id === aliquot_id) {\n let experimentNode = {}\n experimentNode.parent = sample.system_id\n experimentNode.sample = sample\n experimentNode.individual = individual\n experimentNode.aliquot_id = experiment.aliquot_id\n experimentNode.id = experiment.system_id\n experimentNode.uuid = experiment.uuid\n experimentNode.class = 'experiment'\n experimentNode.experiment = experiment\n\n let name = experiment.system_id.split('_')\n experimentNode.name = name[name.length - 1]\n\n if (experiment.custom_fields.is_pdx) {\n experimentNode.img = 'mouse'\n } else {\n if (experiment.technique.category === 'IMG') {\n experimentNode.img = 'image'\n } else if (experiment.technique.category === 'TISSUE') {\n experimentNode.img = 'tissue'\n if (experiment.technique.method === 'CG') {\n experimentNode.img = 'chromosome'\n }\n if (experiment.technique.method === 'HP') {\n experimentNode.img = 'tissue'\n }\n if (experiment.technique.method === 'FC') {\n experimentNode.img = 'cells'\n }\n } else if (experiment.technique.category === 'RNA') {\n experimentNode.img = 'rna'\n } else if (experiment.technique.category === 'DNA') {\n experimentNode.img = 'dna'\n } else {\n experimentNode.img = 'dna'\n }\n }\n\n // legacy leukgen ID\n if (experiment.system_id.split('-').length === 7) {\n aliquotNode.name = experiment.system_id.split('-')[4]\n experimentNode.name = experiment.system_id\n .split('-')\n .slice(5, 7)\n .join('-')\n } else {\n aliquotNode.name = experiment.system_id.split('_')\n aliquotNode.name = parseInt(\n aliquotNode.name[aliquotNode.name.length - 2]\n )\n }\n aliquotNode.children.push(experimentNode)\n }\n })\n return aliquotNode\n })\n .sort((a, b) => a.name - b.name)\n return sampleNode\n })\n\n this.data = individualNode\n this.dataNodes = individualNode.children.reduce(\n (totalNodes, nodeInChildren) => {\n return totalNodes + nodeInChildren.children.length\n },\n 0\n )\n\n this.buildTree()\n this.loading = false\n }\n },\n update(source) {\n const duration = d3Event && d3Event.altKey ? 2500 : 250\n const nodes = this.root.descendants().reverse()\n const links = this.root.links()\n\n // Compute the new tree layout.\n this.tree(this.root)\n\n let left = this.root\n let right = this.root\n this.root.eachBefore(node => {\n if (node.x < left.x) left = node\n if (node.x > right.x) right = node\n })\n\n const height = right.x - left.x + this.margin.top + this.margin.bottom\n\n this.svg\n .transition()\n .duration(duration)\n .attr('height', height)\n .attr('viewBox', [\n -this.margin.left,\n left.x - this.margin.top,\n this.width,\n height\n ])\n .tween(\n 'resize',\n window.ResizeObserver ? null : () => () => this.svg.dispatch('toggle')\n )\n\n // Normalize for fixed-depth.\n nodes.forEach(d => {\n d.y = {\n individual: 0,\n sample: 135,\n aliquot: 200,\n experiment: 300\n }[d.data.class]\n })\n\n // ****************** Nodes section ***************************\n\n // Update the nodes...\n let node = this.gNode.selectAll('g').data(nodes, d => d.id)\n\n // Enter any new modes at the parent's previous position.\n let nodeEnter = node\n .enter()\n .append('g')\n .attr('class', d => `node ${d.data.class}`)\n .attr('transform', () => `translate(${source.y0},${source.x0})`)\n\n const circles = nodeEnter\n .append('circle')\n .attr('cursor', d => (d.data.class !== 'aliquot' ? 'pointer' : null))\n .attr('class', 'node shades--text')\n\n circles.style('fill', d =>\n this.treeIcons[d.data.img] ? `url(#icon-${d.data.img})` : ''\n )\n\n nodeEnter\n .on('click', this.changeModel)\n // tooltip, see https://stackoverflow.com/questions/10805184\n .on('mouseover', d => {\n if (d.data.class === 'aliquot' && d.parent.children.length < 2) return\n\n let leftPaddings = { experiment: 300, individual: 120, sample: 200 }\n this.tooltip\n .html(this.getTooltip(d))\n .style('visibility', 'visible')\n .attr('transform', `translate(${d.y},${d.x})`)\n .style('top', `${d3Event.pageY + 20}px`)\n .style('left', `${d3Event.pageX - leftPaddings[d.data.class]}px`)\n })\n .on('mouseout', () => this.tooltip.style('visibility', 'hidden'))\n\n // Add labels for the nodes\n nodeEnter\n .append('text')\n .on('click', this.onTextClick)\n .attr('dy', '.35em')\n .attr('x', -13)\n .attr('text-anchor', d => (d.children || d._children ? 'end' : 'end'))\n .text(d =>\n d.data.class === 'aliquot' && d.parent.children.length < 2\n ? ''\n : d.data.name\n )\n\n // Add collapse text to indicate node can be opened\n nodeEnter\n .append('text')\n .attr('dy', 0)\n .attr('x', 26)\n .text('...')\n .attr('class', 'collapse-text')\n\n // UPDATE\n let nodeUpdate = nodeEnter.merge(node)\n\n // Transition to the proper position for the node\n nodeUpdate\n .transition()\n .duration(this.duration)\n .attr('transform', d => `translate(${d.y},${d.x})`)\n\n // Update the node attributes and style\n nodeUpdate\n .select('.node')\n .attr('r', d => (d.data.class !== 'aliquot' ? this.nodeSize : 5))\n .attr('cx', this.nodeSize / 2)\n .attr('cy', 0)\n .attr('data-intercom-target', d => `tree-node-circle-${d.data.id}`)\n .attr('fill', d =>\n d._children && !d.children ? 'gray' : 'var(--v-primary-base)'\n )\n .attr('opacity', d =>\n d.data.class === 'aliquot' && d.parent.children.length < 2 ? 0 : 1\n )\n .style('stroke', d => {\n if (\n d.data.id === this.currentModel ||\n d.data.uuid === this.currentModel\n ) {\n this.currentNode = d\n if (!this.skipToScrollNode) {\n this.scrollToCurrentNode()\n }\n this.skipToScrollNode = false\n return 'var(--v-secondary-base)'\n }\n return 'transparent'\n })\n\n // Only show dots for collapsed and collapsible nodes\n nodeUpdate\n .select('text.collapse-text')\n .attr('visibility', d =>\n d.collapsed && d._children ? 'visible' : 'hidden'\n )\n\n // Remove any exiting nodes\n let nodeExit = node\n .exit()\n .transition()\n .duration(this.duration)\n .attr('transform', `translate(${source.y},${source.x})`)\n .remove()\n\n // On exit reduce the node circles size to 0\n nodeExit.select('.node').attr('r', 1e-6)\n\n // On exit reduce the opacity of text labels\n nodeExit.select('text').style('fill-opacity', 1e-6)\n\n // ================ links section ================\n\n // Update the links\n let link = this.gLink.selectAll('path.link').data(links, d => d.id)\n\n // Enter any new links at the parent's previous position.\n let linkEnter = link\n .enter()\n .insert('path', 'g')\n .attr('class', 'link')\n\n // UPDATE\n let linkUpdate = linkEnter.merge(link)\n\n // Transition back to the parent element position\n linkUpdate\n .transition()\n .duration(this.duration)\n .attr('d', this.diagonal)\n\n // Remove any exiting links\n link\n .exit()\n .transition()\n .duration(this.duration)\n .remove()\n\n // Store the old positions for transition.\n nodes.forEach(d => {\n d.x0 = d.x\n d.y0 = d.y\n })\n\n this.$emit('update-size')\n },\n onTextClick(d) {\n this.collapseBranch(d)\n if (!d._children && d.data.id) {\n this.$copyText(d.data.id).then(\n () => {\n this.$store.dispatch(SHOW_ALERT, {\n message: 'Copied System ID to clipboard!'\n })\n },\n () => {\n this.$store.dispatch(SHOW_ALERT, {\n error: 'System ID could not be copied to clipboard'\n })\n }\n )\n }\n },\n collapseBranch(d) {\n d.children = d.children ? null : d._children\n d.collapsed = !d.collapsed\n this.update(d)\n },\n changeModel(d) {\n if (d.data.id) {\n this.skipToScrollNode = true // don't scroll to node when click\n\n // Track individual tree usage\n window.analytics.track('Browsed Individual Tree', {\n model: d.data.class,\n record: d.data.id\n })\n\n this.tooltip.style('visibility', 'hidden')\n\n this.$store.dispatch(SHOW_PANEL, {\n bioModel: d.data.id\n })\n }\n },\n scrollToCurrentNode() {\n this.$nextTick(() => {\n if (!this.showFullHeight)\n setTimeout(() => {\n document.getElementById('tree-div').scrollTop =\n this.currentNode.x0 + 395 // 395 is a function of the max height\n }, 100) // this delay was determined kind of experimentally\n })\n },\n getTooltip(d) {\n const keyValue = (key, verboseName) => {\n let value = this.$get(d.data, key, null)\n return value === null\n ? ''\n : `\n <div class=\"layout row ma-3\" style=\"max-width: 100%\"\">\n <div class=\"flex xs5\" style=\"width: 100%\">${verboseName}</div>\n <div class=\"flex xs7\" style=\"width: 100%\"><b>${value}</b></div>\n </div>\n `\n }\n return `\n <div class=\"v-tooltip__content tree-tooltip\" style=\"min-width: 350px;\">\n ${keyValue('experiment.system_id', 'System ID')}\n ${keyValue('experiment.identifier', 'Experiment ID')}\n ${keyValue('aliquot_id', 'Aliquot ID')}\n ${keyValue('sample.identifier', 'Sample ID')}\n ${keyValue('individual.identifier', 'Individual ID')}\n ${keyValue('experiment.technique.method', 'Method')}\n ${keyValue('experiment.technique.name', 'Technique Name')}\n ${keyValue('sample.disease.acronym', 'Disease')}\n ${keyValue('individual.species', 'Species')}\n ${keyValue('individual.center.acronym', 'Center')}\n </div>\n `\n }\n }\n}\n</script>\n\n<style lang=\"scss\">\n.tree-tooltip.v-tooltip__content {\n color: white;\n padding: 20px;\n opacity: 1;\n font-size: 12px;\n overflow: hidden;\n}\n.node-tooltip {\n background: rgba($color: #000000, $alpha: 0.8);\n}\n.individual-tree-div {\n overflow-x: scroll;\n margin: auto;\n .node {\n stroke-width: 3px;\n text {\n font-size: 14px;\n font-weight: 300;\n fill: black !important;\n cursor: pointer;\n &.collapse-text {\n font-size: 20px;\n font-weight: 200;\n cursor: default;\n }\n }\n &.experiment text {\n cursor: default;\n }\n }\n .link {\n fill: none;\n stroke-width: 1.5px;\n stroke: #aaa;\n }\n}\n</style>\n"]
334914
+ sourcesContent: ["<template>\n <v-card\n flat\n class=\"isabl-base-card\"\n data-test=\"biomodel-tree\"\n >\n <base-section-title\n :show-more=\"showTree\"\n @toggle-show-more=\"showTree = !showTree\"\n >\n <template v-slot:title>Samples Tree</template>\n <template v-slot:actions>\n <div>\n <v-btn\n v-if=\"isBigTree\"\n class=\"table-action-btn pull-right ma-0\"\n fab\n outlined\n color=\"primary\"\n @click=\"\n showFullHeight = !showFullHeight\n scrollToCurrentNode()\n \"\n >\n <v-icon color=\"primary\">{{ showFullHeight ? 'expand_less' : 'expand_more' }}</v-icon>\n </v-btn>\n </div>\n </template>\n </base-section-title>\n\n <!-- Graph -->\n <v-row\n v-show=\"showTree\"\n id=\"tree-div\"\n :style=\"showFullHeight ? '' : 'max-height: 300px;'\"\n class=\"individual-tree-div ma-0\"\n >\n <v-col class=\"individual-tree text-center pa-0 ma-0\" />\n </v-row>\n\n </v-card>\n</template>\n\n<script>\n/*\n Vue implementation of D3 Tree from:\n https://beta.observablehq.com/@asktree/interactive-tree-diagram-d3v4-v5\n*/\n\nimport { fetchIndividualTree } from '@/utils/api'\nimport { mapGetters } from 'vuex'\nimport { SHOW_ALERT } from '@/store/actions/alert'\nimport { SHOW_PANEL } from '@/store/actions/panels'\nimport BasePanel from '@/components/base/BasePanel.vue'\nimport BaseSectionTitle from '@/components/base/BaseSectionTitle'\nimport {\n tree as d3Tree,\n event as d3Event,\n select as d3Select,\n hierarchy as d3Hierarchy,\n linkHorizontal as d3linkHorizontal\n} from 'd3'\n\nexport default {\n name: 'BioModelTree',\n components: {\n BasePanel,\n BaseSectionTitle\n },\n data() {\n const { treeIcons } = this.$settings\n return {\n loading: false,\n duration: 0,\n data: null,\n root: null,\n tree: null,\n graph: null,\n species: null,\n dataNodes: null,\n showTree: true,\n isBigTree: false,\n showFullHeight: true,\n skipToScrollNode: false,\n currentNode: null,\n nodeSize: Object.keys(treeIcons).length ? 15 : 5,\n margin: { top: 20, bottom: 20, right: 0, left: 105 },\n diagonal: d3linkHorizontal()\n .x(d => d.y)\n .y(d => d.x),\n treeIcons\n }\n },\n computed: {\n ...mapGetters({\n currentModel: 'bioModelId',\n individual: 'individualId'\n })\n },\n watch: {\n individual(value, oldValue) {\n if (value !== oldValue) {\n this.fetchData()\n }\n },\n currentModel() {\n this.data && this.update(this.data)\n }\n },\n mounted() {\n this.fetchData()\n },\n methods: {\n buildTree() {\n let dx = Object.keys(this.treeIcons).length ? this.nodeSize + 4 : 18\n let dy = 0\n let iconSize = this.nodeSize\n\n // set width\n this.width = 600 - this.margin.right - this.margin.left\n this.tree = d3Tree()\n .nodeSize([dx, dy])\n .separation((a, b) => (a.parent == b.parent ? 1.75 : 2.5))\n\n // clear div\n let div = d3Select(this.$el).select('.individual-tree')\n div.selectAll('svg').remove()\n\n // create svg\n this.svg = div\n .append('svg')\n .attr('width', this.width)\n .attr('height', dx)\n .attr('viewBox', [-this.margin.left, -this.margin.top, this.width, dx])\n .style('font', '10px sans-serif')\n .style('user-select', 'none')\n\n // create filters\n this.svg\n .append('svg:filter')\n .attr('id', 'invertColor')\n .append('feColorMatrix')\n .attr('in', 'SourceGraphic')\n .attr('type', 'matrix')\n .attr('values', '-1 0 0 0 1 0 -1 0 0 1 0 0 -1 0 1 0 0 0 1 0')\n\n // create image definitions\n const defs = this.svg.append('svg:defs')\n Object.keys(this.treeIcons).forEach(model => {\n const pattern = defs\n .append('svg:pattern')\n .attr('id', `icon-${model}`)\n .attr('width', iconSize)\n .attr('height', iconSize)\n .attr('patternUnits', 'objectBoundingBox')\n\n pattern\n .append('rect')\n .attr('width', '100%')\n .attr('height', '100%')\n .attr('fill', 'var(--v-primary-base)')\n\n pattern\n .append('svg:image')\n .attr('xlink:href', this.treeIcons[model])\n .attr('width', iconSize)\n .attr('height', iconSize)\n .attr('x', iconSize / 2)\n .attr('y', iconSize / 2)\n .attr('filter', 'url(#invertColor)')\n })\n\n // create links\n this.gLink = this.svg\n .append('g')\n .attr('fill', 'none')\n .attr('stroke', '#555')\n .attr('stroke-opacity', 0.4)\n .attr('stroke-width', 1.5)\n\n // create tooltip\n this.tooltip = d3Select('body')\n .append('div')\n .style('position', 'absolute')\n .style('z-index', '9999')\n .style('visibility', 'hidden')\n\n // create nodes\n this.gNode = this.svg.append('g')\n\n // build root\n this.root = d3Hierarchy(this.data, d => d.children)\n this.root.x0 = dy\n this.root.y0 = 0\n this.root.descendants().forEach((d, i) => {\n d.id = i\n d.collapsed = false\n d._children = d.children\n\n // collapse samples with too many experiments\n if (d.depth !== 0 && d.children ? d.children.length > 10 : false) {\n d.children = null\n d.collapsed = true\n }\n\n // by default hide tree if too many samples\n if (d.depth === 0 && d.children && d.children.length > 10) {\n this.showFullHeight = false\n this.isBigTree = true\n }\n })\n\n this.update(this.root)\n },\n async fetchData() {\n if (this.individual) {\n this.loading = true\n let individual = await fetchIndividualTree(this.individual)\n this.species = individual.species\n\n // Format Individual Tree\n let individualNode = {}\n individualNode.id = individual.system_id\n individualNode.uuid = individual.uuid\n individualNode.name = individual.system_id\n individualNode.parent = null\n individualNode.individual = individual\n individualNode.class = 'individual'\n if (individual.species === 'MOUSE') {\n individualNode.img = 'mouse'\n } else if (individual.species === 'HUMAN') {\n if (individual.gender === 'FEMALE') {\n individualNode.img = 'female'\n } else {\n individualNode.img = 'male'\n }\n } else {\n individualNode.img = 'alien'\n }\n individualNode.children = individual.sample_set.map(sample => {\n // Samples Children\n let sampleNode = {}\n sampleNode.id = sample.system_id\n sampleNode.uuid = sample.uuid\n sampleNode.name = sample.system_id.split('_')\n sampleNode.name = sampleNode.name[sampleNode.name.length - 1]\n sampleNode.parent = individual.system_id\n sampleNode.sample = sample\n sampleNode.individual = individual\n sampleNode.class = 'sample'\n\n if (sample.category === 'TUMOR') {\n sampleNode.img = 'tumor'\n } else {\n sampleNode.img = 'normal'\n }\n\n let aliquots_ids = [\n ...new Set(sample.experiment_set.map(e => e.aliquot_id))\n ]\n\n sampleNode.children = aliquots_ids\n .map(aliquot_id => {\n // Aliquot children\n let aliquotNode = {}\n aliquotNode.aliquot_id = aliquot_id\n aliquotNode.name = ''\n aliquotNode.parent = sample.system_id\n aliquotNode.sample = sample\n aliquotNode.sampleNode = sampleNode\n aliquotNode.individual = individual\n aliquotNode.class = 'aliquot'\n aliquotNode.img = 'aliquot'\n aliquotNode.children = []\n\n sample.experiment_set.map(experiment => {\n // Experiment Children\n if (experiment.aliquot_id === aliquot_id) {\n let experimentNode = {}\n experimentNode.parent = sample.system_id\n experimentNode.sample = sample\n experimentNode.individual = individual\n experimentNode.aliquot_id = experiment.aliquot_id\n experimentNode.id = experiment.system_id\n experimentNode.uuid = experiment.uuid\n experimentNode.class = 'experiment'\n experimentNode.experiment = experiment\n\n let name = experiment.system_id.split('_')\n experimentNode.name = name[name.length - 1]\n\n if (experiment.custom_fields.is_pdx) {\n experimentNode.img = 'mouse'\n } else {\n if (experiment.technique.category === 'IMG') {\n experimentNode.img = 'image'\n } else if (experiment.technique.category === 'TISSUE') {\n experimentNode.img = 'tissue'\n if (experiment.technique.method === 'CG') {\n experimentNode.img = 'chromosome'\n }\n if (experiment.technique.method === 'HP') {\n experimentNode.img = 'tissue'\n }\n if (experiment.technique.method === 'FC') {\n experimentNode.img = 'cells'\n }\n } else if (experiment.technique.category === 'RNA') {\n experimentNode.img = 'rna'\n } else if (experiment.technique.category === 'DNA') {\n experimentNode.img = 'dna'\n } else {\n experimentNode.img = 'dna'\n }\n }\n\n // legacy leukgen ID\n if (experiment.system_id.split('-').length === 7) {\n aliquotNode.name = experiment.system_id.split('-')[4]\n experimentNode.name = experiment.system_id\n .split('-')\n .slice(5, 7)\n .join('-')\n } else {\n aliquotNode.name = experiment.system_id.split('_')\n aliquotNode.name = parseInt(\n aliquotNode.name[aliquotNode.name.length - 2]\n )\n }\n aliquotNode.children.push(experimentNode)\n }\n })\n return aliquotNode\n })\n .sort((a, b) => a.name - b.name)\n return sampleNode\n })\n\n this.data = individualNode\n this.dataNodes = individualNode.children.reduce(\n (totalNodes, nodeInChildren) => {\n return totalNodes + nodeInChildren.children.length\n },\n 0\n )\n\n this.buildTree()\n this.loading = false\n }\n },\n update(source) {\n const duration = d3Event && d3Event.altKey ? 2500 : 250\n const nodes = this.root.descendants().reverse()\n const links = this.root.links()\n\n // Compute the new tree layout.\n this.tree(this.root)\n\n let left = this.root\n let right = this.root\n this.root.eachBefore(node => {\n if (node.x < left.x) left = node\n if (node.x > right.x) right = node\n })\n\n const height = right.x - left.x + this.margin.top + this.margin.bottom\n\n this.svg\n .transition()\n .duration(duration)\n .attr('height', height)\n .attr('viewBox', [\n -this.margin.left,\n left.x - this.margin.top,\n this.width,\n height\n ])\n .tween(\n 'resize',\n window.ResizeObserver ? null : () => () => this.svg.dispatch('toggle')\n )\n\n // Normalize for fixed-depth.\n nodes.forEach(d => {\n d.y = {\n individual: 40,\n sample: 135,\n aliquot: 200,\n experiment: 300\n }[d.data.class]\n })\n\n // ****************** Nodes section ***************************\n\n // Update the nodes...\n let node = this.gNode.selectAll('g').data(nodes, d => d.id)\n\n // Enter any new modes at the parent's previous position.\n let nodeEnter = node\n .enter()\n .append('g')\n .attr('class', d => `node ${d.data.class}`)\n .attr('transform', () => `translate(${source.y0},${source.x0})`)\n\n const circles = nodeEnter\n .append('circle')\n .attr('cursor', d => (d.data.class !== 'aliquot' ? 'pointer' : null))\n .attr('class', 'node shades--text')\n\n circles.style('fill', d =>\n this.treeIcons[d.data.img] ? `url(#icon-${d.data.img})` : ''\n )\n\n nodeEnter\n .on('click', this.changeModel)\n // tooltip, see https://stackoverflow.com/questions/10805184\n .on('mouseover', d => {\n if (d.data.class === 'aliquot' && d.parent.children.length < 2) return\n\n let leftPaddings = { experiment: 300, individual: 120, sample: 200 }\n this.tooltip\n .html(this.getTooltip(d))\n .style('visibility', 'visible')\n .attr('transform', `translate(${d.y},${d.x})`)\n .style('top', `${d3Event.pageY + 20}px`)\n .style('left', `${d3Event.pageX - leftPaddings[d.data.class]}px`)\n })\n .on('mouseout', () => this.tooltip.style('visibility', 'hidden'))\n\n // Add labels for the nodes\n nodeEnter\n .append('text')\n .on('click', this.onTextClick)\n .attr('dy', '.35em')\n .attr('x', -13)\n .attr('text-anchor', d => (d.children || d._children ? 'end' : 'end'))\n .text(d =>\n d.data.class === 'aliquot' && d.parent.children.length < 2\n ? ''\n : d.data.name\n )\n\n // Add collapse text to indicate node can be opened\n nodeEnter\n .append('text')\n .attr('dy', 0)\n .attr('x', 26)\n .text('...')\n .attr('class', 'collapse-text')\n\n // UPDATE\n let nodeUpdate = nodeEnter.merge(node)\n\n // Transition to the proper position for the node\n nodeUpdate\n .transition()\n .duration(this.duration)\n .attr('transform', d => `translate(${d.y},${d.x})`)\n\n // Update the node attributes and style\n nodeUpdate\n .select('.node')\n .attr('r', d => (d.data.class !== 'aliquot' ? this.nodeSize : 5))\n .attr('cx', this.nodeSize / 2)\n .attr('cy', 0)\n .attr('data-intercom-target', d => `tree-node-circle-${d.data.id}`)\n .attr('fill', d =>\n d._children && !d.children ? 'gray' : 'var(--v-primary-base)'\n )\n .attr('opacity', d =>\n d.data.class === 'aliquot' && d.parent.children.length < 2 ? 0 : 1\n )\n .style('stroke', d => {\n if (\n d.data.id === this.currentModel ||\n d.data.uuid === this.currentModel\n ) {\n this.currentNode = d\n if (!this.skipToScrollNode) {\n this.scrollToCurrentNode()\n }\n this.skipToScrollNode = false\n return 'var(--v-secondary-base)'\n }\n return 'transparent'\n })\n\n // Only show dots for collapsed and collapsible nodes\n nodeUpdate\n .select('text.collapse-text')\n .attr('visibility', d =>\n d.collapsed && d._children ? 'visible' : 'hidden'\n )\n\n // Remove any exiting nodes\n let nodeExit = node\n .exit()\n .transition()\n .duration(this.duration)\n .attr('transform', `translate(${source.y},${source.x})`)\n .remove()\n\n // On exit reduce the node circles size to 0\n nodeExit.select('.node').attr('r', 1e-6)\n\n // On exit reduce the opacity of text labels\n nodeExit.select('text').style('fill-opacity', 1e-6)\n\n // ================ links section ================\n\n // Update the links\n let link = this.gLink.selectAll('path.link').data(links, d => d.id)\n\n // Enter any new links at the parent's previous position.\n let linkEnter = link\n .enter()\n .insert('path', 'g')\n .attr('class', 'link')\n\n // UPDATE\n let linkUpdate = linkEnter.merge(link)\n\n // Transition back to the parent element position\n linkUpdate\n .transition()\n .duration(this.duration)\n .attr('d', this.diagonal)\n\n // Remove any exiting links\n link\n .exit()\n .transition()\n .duration(this.duration)\n .remove()\n\n // Store the old positions for transition.\n nodes.forEach(d => {\n d.x0 = d.x\n d.y0 = d.y\n })\n\n this.$emit('update-size')\n },\n onTextClick(d) {\n this.collapseBranch(d)\n if (!d._children && d.data.id) {\n this.$copyText(d.data.id).then(\n () => {\n this.$store.dispatch(SHOW_ALERT, {\n message: 'Copied System ID to clipboard!'\n })\n },\n () => {\n this.$store.dispatch(SHOW_ALERT, {\n error: 'System ID could not be copied to clipboard'\n })\n }\n )\n }\n },\n collapseBranch(d) {\n d.children = d.children ? null : d._children\n d.collapsed = !d.collapsed\n this.update(d)\n },\n changeModel(d) {\n if (d.data.id) {\n this.skipToScrollNode = true // don't scroll to node when click\n\n // Track individual tree usage\n window.analytics.track('Browsed Individual Tree', {\n model: d.data.class,\n record: d.data.id\n })\n\n this.tooltip.style('visibility', 'hidden')\n\n this.$store.dispatch(SHOW_PANEL, {\n bioModel: d.data.id\n })\n }\n },\n scrollToCurrentNode() {\n this.$nextTick(() => {\n if (!this.showFullHeight)\n setTimeout(() => {\n document.getElementById('tree-div').scrollTop =\n this.currentNode.x0 + 395 // 395 is a function of the max height\n }, 100) // this delay was determined kind of experimentally\n })\n },\n getTooltip(d) {\n const keyValue = (key, verboseName) => {\n let value = this.$get(d.data, key, null)\n return value === null\n ? ''\n : `\n <div class=\"layout row ma-3\" style=\"max-width: 100%\"\">\n <div class=\"flex xs5\" style=\"width: 100%\">${verboseName}</div>\n <div class=\"flex xs7\" style=\"width: 100%\"><b>${value}</b></div>\n </div>\n `\n }\n return `\n <div class=\"v-tooltip__content tree-tooltip\" style=\"min-width: 350px;\">\n ${keyValue('experiment.system_id', 'System ID')}\n ${keyValue('experiment.identifier', 'Experiment ID')}\n ${keyValue('aliquot_id', 'Aliquot ID')}\n ${keyValue('sample.identifier', 'Sample ID')}\n ${keyValue('individual.identifier', 'Individual ID')}\n ${keyValue('experiment.technique.method', 'Method')}\n ${keyValue('experiment.technique.name', 'Technique Name')}\n ${keyValue('sample.disease.acronym', 'Disease')}\n ${keyValue('individual.species', 'Species')}\n ${keyValue('individual.center.acronym', 'Center')}\n </div>\n `\n }\n }\n}\n</script>\n\n<style lang=\"scss\">\n.tree-tooltip.v-tooltip__content {\n color: white;\n padding: 20px;\n opacity: 1;\n font-size: 12px;\n overflow: hidden;\n}\n.node-tooltip {\n background: rgba($color: #000000, $alpha: 0.8);\n}\n.individual-tree-div {\n overflow-x: scroll;\n margin: auto;\n .node {\n stroke-width: 3px;\n text {\n font-size: 14px;\n font-weight: 300;\n fill: black !important;\n cursor: pointer;\n &.collapse-text {\n font-size: 20px;\n font-weight: 200;\n cursor: default;\n }\n }\n &.experiment text {\n cursor: default;\n }\n }\n .link {\n fill: none;\n stroke-width: 1.5px;\n stroke: #aaa;\n }\n}\n</style>\n"]
334950
334915
  },
334951
334916
  _coverageSchema: "43e27e138ebf9cfc5966b082cf9a028302ed4184",
334952
- hash: "59e08d1c64c25cb454a3e5dffce258dc15f4d5b9"
334917
+ hash: "be336c38506a643b71832f44cd825ff3c922878c"
334953
334918
  };
334954
334919
  var coverage = global[gcv] || (global[gcv] = {});
334955
334920
  if (coverage[path] && coverage[path].hash === hash) {
@@ -335065,7 +335030,7 @@ function BioModelTreevue_type_script_lang_js_toPrimitive(input, hint) { if (BioM
335065
335030
 
335066
335031
  // set width
335067
335032
  BioModelTreevue_type_script_lang_js_cov_2f0u9tmiep.s[11]++;
335068
- this.width = 540 - this.margin.right - this.margin.left;
335033
+ this.width = 600 - this.margin.right - this.margin.left;
335069
335034
  BioModelTreevue_type_script_lang_js_cov_2f0u9tmiep.s[12]++;
335070
335035
  this.tree = (0,d3.tree)().nodeSize([dx, dy]).separation(function (a, b) {
335071
335036
  BioModelTreevue_type_script_lang_js_cov_2f0u9tmiep.f[7]++;
@@ -335479,7 +335444,7 @@ function BioModelTreevue_type_script_lang_js_toPrimitive(input, hint) { if (BioM
335479
335444
  BioModelTreevue_type_script_lang_js_cov_2f0u9tmiep.f[22]++;
335480
335445
  BioModelTreevue_type_script_lang_js_cov_2f0u9tmiep.s[145]++;
335481
335446
  d.y = {
335482
- individual: 0,
335447
+ individual: 40,
335483
335448
  sample: 135,
335484
335449
  aliquot: 200,
335485
335450
  experiment: 300
@@ -335763,9 +335728,9 @@ function BioModelTreevue_type_script_lang_js_toPrimitive(input, hint) { if (BioM
335763
335728
  });
335764
335729
  ;// CONCATENATED MODULE: ./src/components/bioModels/BioModelTree.vue?vue&type=script&lang=js&
335765
335730
  /* harmony default export */ var bioModels_BioModelTreevue_type_script_lang_js_ = (BioModelTreevue_type_script_lang_js_);
335766
- // EXTERNAL MODULE: ./node_modules/vue-style-loader/index.js??clonedRuleSet-64.use[0]!./node_modules/css-loader/dist/cjs.js??clonedRuleSet-64.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/stylePostLoader.js!./node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-64.use[2]!./node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-64.use[3]!./node_modules/sass-loader/dist/cjs.js??clonedRuleSet-64.use[4]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/bioModels/BioModelTree.vue?vue&type=style&index=0&id=2e68a456&prod&lang=scss&
335767
- var BioModelTreevue_type_style_index_0_id_2e68a456_prod_lang_scss_ = __webpack_require__(82811);
335768
- ;// CONCATENATED MODULE: ./src/components/bioModels/BioModelTree.vue?vue&type=style&index=0&id=2e68a456&prod&lang=scss&
335731
+ // EXTERNAL MODULE: ./node_modules/vue-style-loader/index.js??clonedRuleSet-64.use[0]!./node_modules/css-loader/dist/cjs.js??clonedRuleSet-64.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/stylePostLoader.js!./node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-64.use[2]!./node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-64.use[3]!./node_modules/sass-loader/dist/cjs.js??clonedRuleSet-64.use[4]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/bioModels/BioModelTree.vue?vue&type=style&index=0&id=337f42f6&prod&lang=scss&
335732
+ var BioModelTreevue_type_style_index_0_id_337f42f6_prod_lang_scss_ = __webpack_require__(82380);
335733
+ ;// CONCATENATED MODULE: ./src/components/bioModels/BioModelTree.vue?vue&type=style&index=0&id=337f42f6&prod&lang=scss&
335769
335734
 
335770
335735
  ;// CONCATENATED MODULE: ./src/components/bioModels/BioModelTree.vue
335771
335736
 
@@ -335778,8 +335743,8 @@ var BioModelTreevue_type_style_index_0_id_2e68a456_prod_lang_scss_ = __webpack_r
335778
335743
 
335779
335744
  var BioModelTree_component = normalizeComponent(
335780
335745
  bioModels_BioModelTreevue_type_script_lang_js_,
335781
- BioModelTreevue_type_template_id_2e68a456_render,
335782
- BioModelTreevue_type_template_id_2e68a456_staticRenderFns,
335746
+ BioModelTreevue_type_template_id_337f42f6_render,
335747
+ BioModelTreevue_type_template_id_337f42f6_staticRenderFns,
335783
335748
  false,
335784
335749
  null,
335785
335750
  null,