@papaemmelab/isabl-web 0.3.9 → 0.3.12

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.
@@ -1943,7 +1943,7 @@ exports = module.exports = __webpack_require__("2350")(false);
1943
1943
 
1944
1944
 
1945
1945
  // module
1946
- exports.push([module.i, ".node-tooltip{background:rgba(0,0,0,.8)}.individual-tree-div{overflow-x:scroll;margin:auto}.individual-tree-div .node{stroke-width:3px}.individual-tree-div .node text{font-size:14px;font-weight:300;fill:#000!important;cursor:pointer}.individual-tree-div .node text.collapse-text{font-size:20px;font-weight:200;cursor:default}.individual-tree-div .node.experiment text{cursor:default}.individual-tree-div .link{fill:none;stroke-width:1.5px;stroke:#aaa}", ""]);
1946
+ exports.push([module.i, ".tree-tooltip.v-tooltip__content{color:#fff;padding:20px;opacity:1;font-size:12px;overflow:hidden}.node-tooltip{background:rgba(0,0,0,.8)}.individual-tree-div{overflow-x:scroll;margin:auto}.individual-tree-div .node{stroke-width:3px}.individual-tree-div .node text{font-size:14px;font-weight:300;fill:#000!important;cursor:pointer}.individual-tree-div .node text.collapse-text{font-size:20px;font-weight:200;cursor:default}.individual-tree-div .node.experiment text{cursor:default}.individual-tree-div .link{fill:none;stroke-width:1.5px;stroke:#aaa}", ""]);
1947
1947
 
1948
1948
  // exports
1949
1949
 
@@ -91168,7 +91168,7 @@ module.exports = overArg;
91168
91168
  /***/ "9224":
91169
91169
  /***/ (function(module) {
91170
91170
 
91171
- module.exports = JSON.parse("{\"name\":\"@papaemmelab/isabl-web\",\"version\":\"0.3.9\",\"scripts\":{\"serve\":\"vue-cli-service serve\",\"lint\":\"vue-cli-service lint\",\"build-lib\":\"vue-cli-service build --target lib --name isabl-web ./src/main.js\",\"build-wc\":\"vue-cli-service build --target wc --name isabl-web ./src/components/*.vue\",\"build-wc-async\":\"vue-cli-service build --target wc-async --name isabl-web ./src/components/*.vue\",\"publish-app\":\"yarn version --patch && yarn build-lib && yarn publish --access public\",\"dev\":\"yarn build-lib --watch\",\"test:unit\":\"vue-cli-service test:unit\",\"test:e2e\":\"vue-cli-service test:e2e\",\"test:travis\":\"yarn test:e2e --headless\",\"test:submissions\":\"node tests/utils/create_test_submission.js\",\"test:report-coverage\":\"nyc report --reporter=text-lcov > coverage.lcov && codecov -t $CODECOV_TOKEN\",\"demo\":\"nodemon demo/demo-app.js\"},\"dependencies\":{\"@mdi/font\":\"^7.0.96\",\"ansi_up\":\"^5\",\"axios\":\"^0.21.1\",\"crossfilter\":\"^1.3.12\",\"crossfilter2\":\"^1.4.7\",\"d3-tip\":\"^0.9.1\",\"dc\":\"3.1.2\",\"detect-csv\":\"^1.1.0\",\"js-md5\":\"^0.7.3\",\"minify-css-string\":\"^1.0.0\",\"moment\":\"^2.22.2\",\"register-service-worker\":\"^1.5.2\",\"v-hotkey\":\"^0.6.0\",\"vue\":\"^2.5.16\",\"vue-clipboard2\":\"^0.2.1\",\"vue-gallery\":\"^1.4.0\",\"vue-highlightjs\":\"^1.3.3\",\"vue-json-excel\":\"^0.2.5\",\"vue-observe-visibility\":\"^0.4.6\",\"vue-router\":\"^3.0.1\",\"vue-upload-component\":\"^2.8.11\",\"vuetify\":\"2.6.10\",\"vuex\":\"^3.0.1\",\"vuex-router-sync\":\"^5.0.0\"},\"devDependencies\":{\"@cypress/code-coverage\":\"^1.10.1\",\"@vue/cli-plugin-babel\":\"^3.3.0\",\"@vue/cli-plugin-e2e-cypress\":\"^3.3.0\",\"@vue/cli-plugin-eslint\":\"^3.3.0\",\"@vue/cli-plugin-pwa\":\"^3.3.0\",\"@vue/cli-plugin-unit-jest\":\"^3.3.0\",\"@vue/cli-service\":\"^3.3.0\",\"@vue/eslint-config-prettier\":\"^3.0.5\",\"@vue/test-utils\":\"^1.0.0-beta.20\",\"axios-mock-adapter\":\"^1.15.0\",\"babel-core\":\"7.0.0-bridge.0\",\"babel-jest\":\"^23.0.1\",\"babel-plugin-istanbul\":\"^5.2.0\",\"codecov\":\"^3.6.1\",\"eslint-plugin-vuetify\":\"^1.1.0\",\"express\":\"^4.16.3\",\"html-webpack-plugin\":\"^3.2.0\",\"istanbul-lib-coverage\":\"^2.0.5\",\"mini-css-extract-plugin\":\"^0.4.2\",\"nyc\":\"^14.1.1\",\"sass\":\"^1.55.0\",\"sass-loader\":\"^7.0.1\",\"vue-template-compiler\":\"^2.5.16\",\"xlsx-populate\":\"^1.19.1\"},\"browserslist\":[\"> 1%\",\"last 2 versions\",\"not ie <= 8\"],\"main\":\"./dist/isabl-web.umd.min.js\",\"license\":\"MIT\",\"files\":[\"dist/isabl-web*.js\"],\"author\":\"Juan S. Medina - Juan E. Arango\",\"description\":\"Isabl Frontend of the MSK Academic License.\",\"bugs\":{\"url\":\"https://github.com/papaemmelab/isabl_web/issues\"},\"homepage\":\"https://github.com/papaemmelab/isabl_web#readme\"}");
91171
+ module.exports = JSON.parse("{\"name\":\"@papaemmelab/isabl-web\",\"version\":\"0.3.12\",\"scripts\":{\"serve\":\"vue-cli-service serve\",\"lint\":\"vue-cli-service lint\",\"build-lib\":\"vue-cli-service build --target lib --name isabl-web ./src/main.js\",\"build-wc\":\"vue-cli-service build --target wc --name isabl-web ./src/components/*.vue\",\"build-wc-async\":\"vue-cli-service build --target wc-async --name isabl-web ./src/components/*.vue\",\"publish-app\":\"yarn version --patch && yarn build-lib && yarn publish --access public\",\"dev\":\"yarn build-lib --watch\",\"test:unit\":\"vue-cli-service test:unit\",\"test:e2e\":\"vue-cli-service test:e2e\",\"test:travis\":\"yarn test:e2e --headless\",\"test:submissions\":\"node tests/utils/create_test_submission.js\",\"test:report-coverage\":\"nyc report --reporter=text-lcov > coverage.lcov && codecov -t $CODECOV_TOKEN\",\"demo\":\"nodemon demo/demo-app.js\"},\"dependencies\":{\"@mdi/font\":\"^7.0.96\",\"ansi_up\":\"^5\",\"axios\":\"^0.21.1\",\"crossfilter\":\"^1.3.12\",\"crossfilter2\":\"^1.4.7\",\"d3-tip\":\"^0.9.1\",\"dc\":\"3.1.2\",\"detect-csv\":\"^1.1.0\",\"js-md5\":\"^0.7.3\",\"minify-css-string\":\"^1.0.0\",\"moment\":\"^2.22.2\",\"register-service-worker\":\"^1.5.2\",\"v-hotkey\":\"^0.6.0\",\"vue\":\"^2.5.16\",\"vue-clipboard2\":\"^0.2.1\",\"vue-gallery\":\"^1.4.0\",\"vue-highlightjs\":\"^1.3.3\",\"vue-json-excel\":\"^0.2.5\",\"vue-observe-visibility\":\"^0.4.6\",\"vue-router\":\"^3.0.1\",\"vue-upload-component\":\"^2.8.11\",\"vuetify\":\"2.6.10\",\"vuex\":\"^3.0.1\",\"vuex-router-sync\":\"^5.0.0\"},\"devDependencies\":{\"@cypress/code-coverage\":\"^1.10.1\",\"@vue/cli-plugin-babel\":\"^3.3.0\",\"@vue/cli-plugin-e2e-cypress\":\"^3.3.0\",\"@vue/cli-plugin-eslint\":\"^3.3.0\",\"@vue/cli-plugin-pwa\":\"^3.3.0\",\"@vue/cli-plugin-unit-jest\":\"^3.3.0\",\"@vue/cli-service\":\"^3.3.0\",\"@vue/eslint-config-prettier\":\"^3.0.5\",\"@vue/test-utils\":\"^1.0.0-beta.20\",\"axios-mock-adapter\":\"^1.15.0\",\"babel-core\":\"7.0.0-bridge.0\",\"babel-jest\":\"^23.0.1\",\"babel-plugin-istanbul\":\"^5.2.0\",\"codecov\":\"^3.6.1\",\"eslint-plugin-vuetify\":\"^1.1.0\",\"express\":\"^4.16.3\",\"html-webpack-plugin\":\"^3.2.0\",\"istanbul-lib-coverage\":\"^2.0.5\",\"mini-css-extract-plugin\":\"^0.4.2\",\"nyc\":\"^14.1.1\",\"sass\":\"^1.55.0\",\"sass-loader\":\"^7.0.1\",\"vue-template-compiler\":\"^2.5.16\",\"xlsx-populate\":\"^1.19.1\"},\"browserslist\":[\"> 1%\",\"last 2 versions\",\"not ie <= 8\"],\"main\":\"./dist/isabl-web.umd.min.js\",\"license\":\"MIT\",\"files\":[\"dist/isabl-web*.js\"],\"author\":\"Juan S. Medina - Juan E. Arango\",\"description\":\"Isabl Frontend of the MSK Academic License.\",\"bugs\":{\"url\":\"https://github.com/papaemmelab/isabl_web/issues\"},\"homepage\":\"https://github.com/papaemmelab/isabl_web#readme\"}");
91172
91172
 
91173
91173
  /***/ }),
91174
91174
 
@@ -222354,15 +222354,16 @@ var EditProfileModal_component = normalizeComponent(
222354
222354
  )
222355
222355
 
222356
222356
  /* harmony default export */ var EditProfileModal = (EditProfileModal_component.exports);
222357
- // CONCATENATED MODULE: ./node_modules/cache-loader/dist/cjs.js?{"cacheDirectory":"node_modules/.cache/vue-loader","cacheIdentifier":"d220a428-vue-loader-template"}!./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options!./src/components/projects/NewProjectModal.vue?vue&type=template&id=72aeb340&
222358
- var NewProjectModalvue_type_template_id_72aeb340_render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('base-modal',{attrs:{"show-modal":_vm.showModal,"max-width":"800px"},on:{"close-modal":_vm.closeModal},scopedSlots:_vm._u([{key:"title",fn:function(){return [_vm._v("Create Project")]},proxy:true},{key:"content",fn:function(){return [_c('v-container',{staticClass:"pa-0"},[_c('v-row',[_c('v-col',{attrs:{"cols":"16"}},[_c('v-text-field',{ref:"title",staticClass:"pt-6",attrs:{"v-show":_vm.showModal,"rules":[_vm.rules.required],"error-messages":_vm.errorMessages.title,"label":"Project Title","data-test":"new-project-title-input"},on:{"keyup":function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,"enter",13,$event.key,"Enter")){ return null; }return _vm.submit.apply(null, arguments)}},model:{value:(_vm.project.title),callback:function ($$v) {_vm.$set(_vm.project, "title", $$v)},expression:"project.title"}})],1)],1),_c('div',{directives:[{name:"show",rawName:"v-show",value:(_vm.showOptionalFields),expression:"showOptionalFields"}],staticClass:"pa-0"},[_c('v-row',[_c('v-col',{attrs:{"cols":"16"}},[_c('v-text-field',{ref:"shortTitle",attrs:{"rules":[_vm.rules.unicode, _vm.rules.min10],"error-messages":_vm.errorMessages.short_title,"label":"Project Short Title","data-test":"new-project-short-input","counter":"","dense":"","maxlength":"30","hint":"Think of the objective of the project."},model:{value:(_vm.project.shortTitle),callback:function ($$v) {_vm.$set(_vm.project, "shortTitle", $$v)},expression:"project.shortTitle"}})],1)],1),_c('v-row',[_c('v-col',{attrs:{"cols":"16"}},[_c('v-select',{ref:"group",attrs:{"items":_vm.groups,"return-object":"","item-text":"slug","label":"Group","dense":"","data-test":"new-project-groups-input"},model:{value:(_vm.project.group),callback:function ($$v) {_vm.$set(_vm.project, "group", $$v)},expression:"project.group"}})],1)],1),_c('v-row',[_c('v-col',{attrs:{"cols":"16"}},[_c('user-search-input',{ref:"principalInvestigator",attrs:{"model":_vm.project,"rules":[_vm.rules.email],"error-messages":_vm.errorMessages.principal_investigator,"field":"principalInvestigator","label":"Principal Investigator","data-test":"new-project-pi-input","hint":"Laboratory head or principal investigator","dense":""},on:{"update-value":_vm.updateValue}})],1)],1),_c('v-row',[_c('v-col',{attrs:{"cols":"16"}},[_c('user-search-input',{ref:"owner",attrs:{"model":_vm.project,"rules":[_vm.rules.email],"error-messages":_vm.errorMessages.owner,"field":"owner","label":"Project Owner","data-test":"new-project-owner-input","hint":"Who deals with the nitty-gritty of the project","dense":""},on:{"update-value":_vm.updateValue}})],1)],1),_c('v-row',[_c('v-col',{attrs:{"cols":"16"}},[_c('user-search-input',{ref:"coordinator",attrs:{"model":_vm.project,"rules":[_vm.rules.email],"error-messages":_vm.errorMessages.coordinator,"field":"coordinator","label":"Coordinator","data-test":"new-project-coord-input","hint":"Project manager or coordinator","dense":""},on:{"update-value":_vm.updateValue}})],1)],1),_c('v-row',[_c('v-col',{attrs:{"cols":"16"}},[_c('user-search-input',{ref:"analyst",attrs:{"model":_vm.project,"rules":[_vm.rules.email],"error-messages":_vm.errorMessages.analyst,"field":"analyst","label":"Data Analyst","data-test":"new-project-analyst-input","hint":"Person responsible for the data analysis"},on:{"update-value":_vm.updateValue}})],1)],1)],1)],1)]},proxy:true},{key:"footer-actions",fn:function(){return [_c('v-btn',{attrs:{"color":"primary darken-1","data-test":"new-project-optional-btn","text":""},on:{"click":_vm.toggleOptionalFields}},[_vm._v("Optional Fields")]),_c('v-btn',{attrs:{"color":"primary darken-1","data-test":"new-project-create-btn","text":""},on:{"click":_vm.submit}},[_vm._v("Create")])]},proxy:true}])})}
222359
- var NewProjectModalvue_type_template_id_72aeb340_staticRenderFns = []
222357
+ // CONCATENATED MODULE: ./node_modules/cache-loader/dist/cjs.js?{"cacheDirectory":"node_modules/.cache/vue-loader","cacheIdentifier":"d220a428-vue-loader-template"}!./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options!./src/components/projects/NewProjectModal.vue?vue&type=template&id=58c607e8&
222358
+ var NewProjectModalvue_type_template_id_58c607e8_render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('base-modal',{attrs:{"show-modal":_vm.showModal,"max-width":"800px"},on:{"close-modal":_vm.closeModal},scopedSlots:_vm._u([{key:"title",fn:function(){return [_vm._v("Create Project")]},proxy:true},{key:"content",fn:function(){return [_c('v-container',{staticClass:"pa-0"},[_c('v-row',[_c('v-col',{attrs:{"cols":"16"}},[_c('v-text-field',{ref:"title",staticClass:"pt-6",attrs:{"v-show":_vm.showModal,"rules":[_vm.rules.required],"error-messages":_vm.errorMessages.title,"label":"Project Title","data-test":"new-project-title-input"},on:{"keyup":function($event){if(!$event.type.indexOf('key')&&_vm._k($event.keyCode,"enter",13,$event.key,"Enter")){ return null; }return _vm.submit.apply(null, arguments)}},model:{value:(_vm.project.title),callback:function ($$v) {_vm.$set(_vm.project, "title", $$v)},expression:"project.title"}})],1)],1),_c('div',{directives:[{name:"show",rawName:"v-show",value:(_vm.showOptionalFields),expression:"showOptionalFields"}],staticClass:"pa-0"},[_c('v-row',[_c('v-col',{attrs:{"cols":"16"}},[_c('v-text-field',{ref:"shortTitle",attrs:{"rules":[_vm.rules.unicode, _vm.rules.min10],"error-messages":_vm.errorMessages.short_title,"label":"Project Short Title","data-test":"new-project-short-input","counter":"","dense":"","maxlength":"30","hint":"Think of the objective of the project."},model:{value:(_vm.project.shortTitle),callback:function ($$v) {_vm.$set(_vm.project, "shortTitle", $$v)},expression:"project.shortTitle"}})],1)],1),_c('v-row',[_c('v-col',{attrs:{"cols":"16"}},[_c('v-select',{ref:"group",attrs:{"items":_vm.groups,"return-object":"","item-text":"slug","label":"Group","dense":"","data-test":"new-project-groups-input"},model:{value:(_vm.project.group),callback:function ($$v) {_vm.$set(_vm.project, "group", $$v)},expression:"project.group"}})],1)],1),_c('v-row',[_c('v-col',{attrs:{"cols":"16"}},[_c('user-search-input',{ref:"principalInvestigator",attrs:{"model":_vm.project,"rules":[_vm.rules.email],"error-messages":_vm.errorMessages.principal_investigator,"field":"principalInvestigator","label":"Principal Investigator","data-test":"new-project-pi-input","hint":"Laboratory head or principal investigator","dense":""},on:{"update-value":_vm.updateValue}})],1)],1),_c('v-row',[_c('v-col',{attrs:{"cols":"16"}},[_c('user-search-input',{ref:"owner",attrs:{"model":_vm.project,"rules":[_vm.rules.email],"error-messages":_vm.errorMessages.owner,"field":"owner","label":"Project Owner","data-test":"new-project-owner-input","hint":"Who deals with the nitty-gritty of the project","dense":""},on:{"update-value":_vm.updateValue}})],1)],1),_c('v-row',[_c('v-col',{attrs:{"cols":"16"}},[_c('user-search-input',{ref:"coordinator",attrs:{"model":_vm.project,"rules":[_vm.rules.email],"error-messages":_vm.errorMessages.coordinator,"field":"coordinator","label":"Coordinator","data-test":"new-project-coord-input","hint":"Project manager or coordinator","dense":""},on:{"update-value":_vm.updateValue}})],1)],1),_c('v-row',[_c('v-col',{attrs:{"cols":"16"}},[_c('user-search-input',{ref:"analyst",attrs:{"model":_vm.project,"rules":[_vm.rules.email],"error-messages":_vm.errorMessages.analyst,"field":"analyst","label":"Data Analyst","data-test":"new-project-analyst-input","hint":"Person responsible for the data analysis"},on:{"update-value":_vm.updateValue}})],1)],1)],1)],1)]},proxy:true},{key:"footer-actions",fn:function(){return [_c('v-btn',{attrs:{"color":"primary darken-1","data-test":"new-project-optional-btn","text":""},on:{"click":_vm.toggleOptionalFields}},[_vm._v("Optional Fields")]),_c('v-btn',{attrs:{"color":"primary darken-1","data-test":"new-project-create-btn","text":""},on:{"click":_vm.submit}},[_vm._v("Create")])]},proxy:true}])})}
222359
+ var NewProjectModalvue_type_template_id_58c607e8_staticRenderFns = []
222360
222360
 
222361
222361
 
222362
- // CONCATENATED MODULE: ./src/components/projects/NewProjectModal.vue?vue&type=template&id=72aeb340&
222362
+ // CONCATENATED MODULE: ./src/components/projects/NewProjectModal.vue?vue&type=template&id=58c607e8&
222363
222363
 
222364
222364
  // EXTERNAL MODULE: ./node_modules/lodash/has.js
222365
222365
  var has = __webpack_require__("3852");
222366
+ var has_default = /*#__PURE__*/__webpack_require__.n(has);
222366
222367
 
222367
222368
  // CONCATENATED MODULE: ./node_modules/cache-loader/dist/cjs.js?{"cacheDirectory":"node_modules/.cache/vue-loader","cacheIdentifier":"d220a428-vue-loader-template"}!./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options!./src/components/projects/GroupSearchInput.vue?vue&type=template&id=9914fc16&
222368
222369
  var GroupSearchInputvue_type_template_id_9914fc16_render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('v-autocomplete',{ref:"groupSearchInput",attrs:{"value":_vm.value,"rules":_vm.rules,"items":_vm.groups,"loading":_vm.isLoading,"search-input":_vm.groupsQuery,"label":_vm.label,"hint":_vm.hint,"no-filter":"","return-object":"","item-text":"name","item-value":"name"},on:{"update:searchInput":function($event){_vm.groupsQuery=$event},"update:search-input":function($event){_vm.groupsQuery=$event},"input":_vm.updateValue},scopedSlots:_vm._u([{key:"selection",fn:function(ref){
@@ -224521,7 +224522,7 @@ var UserSearchInput_component = normalizeComponent(
224521
224522
  // CONCATENATED MODULE: ./node_modules/cache-loader/dist/cjs.js??ref--12-0!./node_modules/thread-loader/dist/cjs.js!./node_modules/@vue/cli-plugin-babel/node_modules/babel-loader/lib!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options!./src/components/projects/NewProjectModal.vue?vue&type=script&lang=js&
224522
224523
  var cov_41uwsnrpn = function () {
224523
224524
  var path = "/Users/juanes/papaemmelab/isabl_web/src/components/projects/NewProjectModal.vue";
224524
- var hash = "569231b05a1c881d9d6ae5390bffc324ffea102b";
224525
+ var hash = "880a7035d32da713e533258d2460ef2446ff3c8f";
224525
224526
  var global = new Function("return this")();
224526
224527
  var gcv = "__coverage__";
224527
224528
  var coverageData = {
@@ -224553,247 +224554,367 @@ var cov_41uwsnrpn = function () {
224553
224554
  column: 6
224554
224555
  },
224555
224556
  end: {
224556
- line: 212,
224557
+ line: 214,
224557
224558
  column: 7
224558
224559
  }
224559
224560
  },
224560
224561
  "3": {
224561
224562
  start: {
224562
- line: 210,
224563
+ line: 209,
224563
224564
  column: 8
224564
224565
  },
224565
224566
  end: {
224567
+ line: 211,
224568
+ column: 9
224569
+ }
224570
+ },
224571
+ "4": {
224572
+ start: {
224566
224573
  line: 210,
224574
+ column: 10
224575
+ },
224576
+ end: {
224577
+ line: 210,
224578
+ column: 48
224579
+ }
224580
+ },
224581
+ "5": {
224582
+ start: {
224583
+ line: 212,
224584
+ column: 8
224585
+ },
224586
+ end: {
224587
+ line: 212,
224567
224588
  column: 26
224568
224589
  }
224569
224590
  },
224570
- "4": {
224591
+ "6": {
224571
224592
  start: {
224572
- line: 211,
224593
+ line: 213,
224573
224594
  column: 8
224574
224595
  },
224575
224596
  end: {
224576
- line: 211,
224597
+ line: 213,
224577
224598
  column: 24
224578
224599
  }
224579
224600
  },
224580
- "5": {
224601
+ "7": {
224581
224602
  start: {
224582
- line: 229,
224603
+ line: 219,
224604
+ column: 4
224605
+ },
224606
+ end: {
224607
+ line: 227,
224608
+ column: 6
224609
+ }
224610
+ },
224611
+ "8": {
224612
+ start: {
224613
+ line: 220,
224583
224614
  column: 6
224584
224615
  },
224585
224616
  end: {
224586
- line: 232,
224617
+ line: 226,
224587
224618
  column: 7
224588
224619
  }
224589
224620
  },
224590
- "6": {
224621
+ "9": {
224591
224622
  start: {
224592
- line: 230,
224623
+ line: 221,
224624
+ column: 8
224625
+ },
224626
+ end: {
224627
+ line: 221,
224628
+ column: 44
224629
+ }
224630
+ },
224631
+ "10": {
224632
+ start: {
224633
+ line: 222,
224634
+ column: 13
224635
+ },
224636
+ end: {
224637
+ line: 226,
224638
+ column: 7
224639
+ }
224640
+ },
224641
+ "11": {
224642
+ start: {
224643
+ line: 223,
224644
+ column: 8
224645
+ },
224646
+ end: {
224647
+ line: 223,
224648
+ column: 66
224649
+ }
224650
+ },
224651
+ "12": {
224652
+ start: {
224653
+ line: 224,
224654
+ column: 13
224655
+ },
224656
+ end: {
224657
+ line: 226,
224658
+ column: 7
224659
+ }
224660
+ },
224661
+ "13": {
224662
+ start: {
224663
+ line: 225,
224664
+ column: 8
224665
+ },
224666
+ end: {
224667
+ line: 225,
224668
+ column: 67
224669
+ }
224670
+ },
224671
+ "14": {
224672
+ start: {
224673
+ line: 231,
224674
+ column: 6
224675
+ },
224676
+ end: {
224677
+ line: 234,
224678
+ column: 7
224679
+ }
224680
+ },
224681
+ "15": {
224682
+ start: {
224683
+ line: 232,
224593
224684
  column: 25
224594
224685
  },
224595
224686
  end: {
224596
- line: 230,
224687
+ line: 232,
224597
224688
  column: 57
224598
224689
  }
224599
224690
  },
224600
- "7": {
224691
+ "16": {
224601
224692
  start: {
224602
- line: 231,
224693
+ line: 233,
224603
224694
  column: 8
224604
224695
  },
224605
224696
  end: {
224606
- line: 231,
224697
+ line: 233,
224607
224698
  column: 38
224608
224699
  }
224609
224700
  },
224610
- "8": {
224701
+ "17": {
224611
224702
  start: {
224612
- line: 235,
224703
+ line: 237,
224613
224704
  column: 6
224614
224705
  },
224615
224706
  end: {
224616
- line: 235,
224707
+ line: 237,
224617
224708
  column: 56
224618
224709
  }
224619
224710
  },
224620
- "9": {
224711
+ "18": {
224621
224712
  start: {
224622
- line: 236,
224713
+ line: 238,
224623
224714
  column: 6
224624
224715
  },
224625
224716
  end: {
224626
- line: 236,
224717
+ line: 238,
224627
224718
  column: 44
224628
224719
  }
224629
224720
  },
224630
- "10": {
224721
+ "19": {
224631
224722
  start: {
224632
- line: 237,
224723
+ line: 239,
224633
224724
  column: 6
224634
224725
  },
224635
224726
  end: {
224636
- line: 237,
224727
+ line: 239,
224637
224728
  column: 54
224638
224729
  }
224639
224730
  },
224640
- "11": {
224731
+ "20": {
224641
224732
  start: {
224642
- line: 240,
224733
+ line: 242,
224734
+ column: 23
224735
+ },
224736
+ end: {
224737
+ line: 242,
224738
+ column: 27
224739
+ }
224740
+ },
224741
+ "21": {
224742
+ start: {
224743
+ line: 243,
224643
224744
  column: 6
224644
224745
  },
224645
224746
  end: {
224646
- line: 240,
224747
+ line: 243,
224647
224748
  column: 32
224648
224749
  }
224649
224750
  },
224650
- "12": {
224751
+ "22": {
224651
224752
  start: {
224652
- line: 246,
224753
+ line: 244,
224653
224754
  column: 6
224654
224755
  },
224655
224756
  end: {
224656
- line: 246,
224657
- column: 22
224757
+ line: 244,
224758
+ column: 80
224658
224759
  }
224659
224760
  },
224660
- "13": {
224761
+ "23": {
224762
+ start: {
224763
+ line: 244,
224764
+ column: 45
224765
+ },
224766
+ end: {
224767
+ line: 244,
224768
+ column: 79
224769
+ }
224770
+ },
224771
+ "24": {
224661
224772
  start: {
224662
224773
  line: 247,
224663
224774
  column: 6
224664
224775
  },
224665
224776
  end: {
224666
224777
  line: 247,
224778
+ column: 22
224779
+ }
224780
+ },
224781
+ "25": {
224782
+ start: {
224783
+ line: 248,
224784
+ column: 6
224785
+ },
224786
+ end: {
224787
+ line: 248,
224667
224788
  column: 31
224668
224789
  }
224669
224790
  },
224670
- "14": {
224791
+ "26": {
224671
224792
  start: {
224672
- line: 250,
224793
+ line: 251,
224673
224794
  column: 6
224674
224795
  },
224675
224796
  end: {
224676
- line: 253,
224797
+ line: 254,
224677
224798
  column: 7
224678
224799
  }
224679
224800
  },
224680
- "15": {
224801
+ "27": {
224681
224802
  start: {
224682
- line: 256,
224803
+ line: 257,
224683
224804
  column: 6
224684
224805
  },
224685
224806
  end: {
224686
- line: 256,
224807
+ line: 257,
224687
224808
  column: 32
224688
224809
  }
224689
224810
  },
224690
- "16": {
224811
+ "28": {
224691
224812
  start: {
224692
- line: 257,
224813
+ line: 258,
224693
224814
  column: 6
224694
224815
  },
224695
224816
  end: {
224696
- line: 259,
224817
+ line: 260,
224697
224818
  column: 8
224698
224819
  }
224699
224820
  },
224700
- "17": {
224821
+ "29": {
224701
224822
  start: {
224702
- line: 258,
224823
+ line: 259,
224703
224824
  column: 8
224704
224825
  },
224705
224826
  end: {
224706
- line: 258,
224827
+ line: 259,
224707
224828
  column: 39
224708
224829
  }
224709
224830
  },
224710
- "18": {
224831
+ "30": {
224711
224832
  start: {
224712
- line: 260,
224833
+ line: 261,
224713
224834
  column: 6
224714
224835
  },
224715
224836
  end: {
224716
- line: 281,
224837
+ line: 282,
224717
224838
  column: 7
224718
224839
  }
224719
224840
  },
224720
- "19": {
224841
+ "31": {
224721
224842
  start: {
224722
- line: 261,
224843
+ line: 262,
224723
224844
  column: 8
224724
224845
  },
224725
224846
  end: {
224726
- line: 280,
224847
+ line: 281,
224727
224848
  column: 12
224728
224849
  }
224729
224850
  },
224730
- "20": {
224851
+ "32": {
224731
224852
  start: {
224732
- line: 263,
224853
+ line: 264,
224733
224854
  column: 30
224734
224855
  },
224735
224856
  end: {
224736
- line: 263,
224857
+ line: 264,
224737
224858
  column: 59
224738
224859
  }
224739
224860
  },
224740
- "21": {
224861
+ "33": {
224741
224862
  start: {
224742
- line: 264,
224863
+ line: 265,
224743
224864
  column: 12
224744
224865
  },
224745
224866
  end: {
224746
- line: 266,
224867
+ line: 267,
224747
224868
  column: 14
224748
224869
  }
224749
224870
  },
224750
- "22": {
224871
+ "34": {
224751
224872
  start: {
224752
- line: 268,
224873
+ line: 269,
224753
224874
  column: 12
224754
224875
  },
224755
224876
  end: {
224756
- line: 270,
224877
+ line: 271,
224757
224878
  column: 14
224758
224879
  }
224759
224880
  },
224760
- "23": {
224881
+ "35": {
224761
224882
  start: {
224762
- line: 271,
224883
+ line: 272,
224763
224884
  column: 12
224764
224885
  },
224765
224886
  end: {
224766
- line: 271,
224887
+ line: 272,
224767
224888
  column: 29
224768
224889
  }
224769
224890
  },
224770
- "24": {
224891
+ "36": {
224771
224892
  start: {
224772
- line: 274,
224893
+ line: 275,
224773
224894
  column: 12
224774
224895
  },
224775
224896
  end: {
224776
- line: 279,
224897
+ line: 280,
224777
224898
  column: 13
224778
224899
  }
224779
224900
  },
224780
- "25": {
224901
+ "37": {
224781
224902
  start: {
224782
- line: 275,
224903
+ line: 276,
224783
224904
  column: 14
224784
224905
  },
224785
224906
  end: {
224786
- line: 275,
224907
+ line: 276,
224787
224908
  column: 54
224788
224909
  }
224789
224910
  },
224790
- "26": {
224911
+ "38": {
224791
224912
  start: {
224792
- line: 276,
224913
+ line: 277,
224793
224914
  column: 14
224794
224915
  },
224795
224916
  end: {
224796
- line: 278,
224917
+ line: 279,
224797
224918
  column: 16
224798
224919
  }
224799
224920
  }
@@ -224865,7 +224986,7 @@ var cov_41uwsnrpn = function () {
224865
224986
  column: 21
224866
224987
  },
224867
224988
  end: {
224868
- line: 213,
224989
+ line: 215,
224869
224990
  column: 5
224870
224991
  }
224871
224992
  },
@@ -224875,241 +224996,289 @@ var cov_41uwsnrpn = function () {
224875
224996
  name: "(anonymous_3)",
224876
224997
  decl: {
224877
224998
  start: {
224878
- line: 215,
224999
+ line: 217,
224879
225000
  column: 2
224880
225001
  },
224881
225002
  end: {
224882
- line: 215,
225003
+ line: 217,
224883
225004
  column: 3
224884
225005
  }
224885
225006
  },
224886
225007
  loc: {
224887
225008
  start: {
224888
- line: 215,
225009
+ line: 217,
224889
225010
  column: 12
224890
225011
  },
224891
225012
  end: {
224892
- line: 226,
225013
+ line: 228,
224893
225014
  column: 3
224894
225015
  }
224895
225016
  },
224896
- line: 215
225017
+ line: 217
224897
225018
  },
224898
225019
  "4": {
224899
225020
  name: "(anonymous_4)",
224900
225021
  decl: {
224901
225022
  start: {
224902
- line: 228,
224903
- column: 4
225023
+ line: 219,
225024
+ column: 34
224904
225025
  },
224905
225026
  end: {
224906
- line: 228,
224907
- column: 5
225027
+ line: 219,
225028
+ column: 35
224908
225029
  }
224909
225030
  },
224910
225031
  loc: {
224911
225032
  start: {
224912
- line: 228,
224913
- column: 24
225033
+ line: 219,
225034
+ column: 43
224914
225035
  },
224915
225036
  end: {
224916
- line: 233,
225037
+ line: 227,
224917
225038
  column: 5
224918
225039
  }
224919
225040
  },
224920
- line: 228
225041
+ line: 219
224921
225042
  },
224922
225043
  "5": {
224923
225044
  name: "(anonymous_5)",
224924
225045
  decl: {
224925
225046
  start: {
224926
- line: 234,
225047
+ line: 230,
224927
225048
  column: 4
224928
225049
  },
224929
225050
  end: {
224930
- line: 234,
225051
+ line: 230,
224931
225052
  column: 5
224932
225053
  }
224933
225054
  },
224934
225055
  loc: {
224935
225056
  start: {
224936
- line: 234,
224937
- column: 27
225057
+ line: 230,
225058
+ column: 24
224938
225059
  },
224939
225060
  end: {
224940
- line: 238,
225061
+ line: 235,
224941
225062
  column: 5
224942
225063
  }
224943
225064
  },
224944
- line: 234
225065
+ line: 230
224945
225066
  },
224946
225067
  "6": {
224947
225068
  name: "(anonymous_6)",
224948
225069
  decl: {
224949
225070
  start: {
224950
- line: 239,
225071
+ line: 236,
224951
225072
  column: 4
224952
225073
  },
224953
225074
  end: {
224954
- line: 239,
225075
+ line: 236,
224955
225076
  column: 5
224956
225077
  }
224957
225078
  },
224958
225079
  loc: {
224959
225080
  start: {
224960
- line: 239,
224961
- column: 16
225081
+ line: 236,
225082
+ column: 27
224962
225083
  },
224963
225084
  end: {
224964
- line: 244,
225085
+ line: 240,
224965
225086
  column: 5
224966
225087
  }
224967
225088
  },
224968
- line: 239
225089
+ line: 236
224969
225090
  },
224970
225091
  "7": {
224971
225092
  name: "(anonymous_7)",
224972
225093
  decl: {
224973
225094
  start: {
224974
- line: 245,
225095
+ line: 241,
224975
225096
  column: 4
224976
225097
  },
224977
225098
  end: {
224978
- line: 245,
225099
+ line: 241,
224979
225100
  column: 5
224980
225101
  }
224981
225102
  },
224982
225103
  loc: {
224983
225104
  start: {
224984
- line: 245,
224985
- column: 17
225105
+ line: 241,
225106
+ column: 16
224986
225107
  },
224987
225108
  end: {
224988
- line: 248,
225109
+ line: 245,
224989
225110
  column: 5
224990
225111
  }
224991
225112
  },
224992
- line: 245
225113
+ line: 241
224993
225114
  },
224994
225115
  "8": {
224995
225116
  name: "(anonymous_8)",
224996
225117
  decl: {
224997
225118
  start: {
224998
- line: 249,
225119
+ line: 244,
225120
+ column: 36
225121
+ },
225122
+ end: {
225123
+ line: 244,
225124
+ column: 37
225125
+ }
225126
+ },
225127
+ loc: {
225128
+ start: {
225129
+ line: 244,
225130
+ column: 45
225131
+ },
225132
+ end: {
225133
+ line: 244,
225134
+ column: 79
225135
+ }
225136
+ },
225137
+ line: 244
225138
+ },
225139
+ "9": {
225140
+ name: "(anonymous_9)",
225141
+ decl: {
225142
+ start: {
225143
+ line: 246,
224999
225144
  column: 4
225000
225145
  },
225001
225146
  end: {
225002
- line: 249,
225147
+ line: 246,
225003
225148
  column: 5
225004
225149
  }
225005
225150
  },
225006
225151
  loc: {
225007
225152
  start: {
225153
+ line: 246,
225154
+ column: 17
225155
+ },
225156
+ end: {
225008
225157
  line: 249,
225158
+ column: 5
225159
+ }
225160
+ },
225161
+ line: 246
225162
+ },
225163
+ "10": {
225164
+ name: "(anonymous_10)",
225165
+ decl: {
225166
+ start: {
225167
+ line: 250,
225168
+ column: 4
225169
+ },
225170
+ end: {
225171
+ line: 250,
225172
+ column: 5
225173
+ }
225174
+ },
225175
+ loc: {
225176
+ start: {
225177
+ line: 250,
225009
225178
  column: 22
225010
225179
  },
225011
225180
  end: {
225012
- line: 254,
225181
+ line: 255,
225013
225182
  column: 5
225014
225183
  }
225015
225184
  },
225016
- line: 249
225185
+ line: 250
225017
225186
  },
225018
- "9": {
225019
- name: "(anonymous_9)",
225187
+ "11": {
225188
+ name: "(anonymous_11)",
225020
225189
  decl: {
225021
225190
  start: {
225022
- line: 255,
225191
+ line: 256,
225023
225192
  column: 4
225024
225193
  },
225025
225194
  end: {
225026
- line: 255,
225195
+ line: 256,
225027
225196
  column: 5
225028
225197
  }
225029
225198
  },
225030
225199
  loc: {
225031
225200
  start: {
225032
- line: 255,
225201
+ line: 256,
225033
225202
  column: 19
225034
225203
  },
225035
225204
  end: {
225036
- line: 282,
225205
+ line: 283,
225037
225206
  column: 5
225038
225207
  }
225039
225208
  },
225040
- line: 255
225209
+ line: 256
225041
225210
  },
225042
- "10": {
225043
- name: "(anonymous_10)",
225211
+ "12": {
225212
+ name: "(anonymous_12)",
225044
225213
  decl: {
225045
225214
  start: {
225046
- line: 257,
225215
+ line: 258,
225047
225216
  column: 36
225048
225217
  },
225049
225218
  end: {
225050
- line: 257,
225219
+ line: 258,
225051
225220
  column: 37
225052
225221
  }
225053
225222
  },
225054
225223
  loc: {
225055
225224
  start: {
225056
- line: 257,
225225
+ line: 258,
225057
225226
  column: 45
225058
225227
  },
225059
225228
  end: {
225060
- line: 259,
225229
+ line: 260,
225061
225230
  column: 7
225062
225231
  }
225063
225232
  },
225064
- line: 257
225233
+ line: 258
225065
225234
  },
225066
- "11": {
225067
- name: "(anonymous_11)",
225235
+ "13": {
225236
+ name: "(anonymous_13)",
225068
225237
  decl: {
225069
225238
  start: {
225070
- line: 262,
225239
+ line: 263,
225071
225240
  column: 16
225072
225241
  },
225073
225242
  end: {
225074
- line: 262,
225243
+ line: 263,
225075
225244
  column: 17
225076
225245
  }
225077
225246
  },
225078
225247
  loc: {
225079
225248
  start: {
225080
- line: 262,
225249
+ line: 263,
225081
225250
  column: 28
225082
225251
  },
225083
225252
  end: {
225084
- line: 272,
225253
+ line: 273,
225085
225254
  column: 11
225086
225255
  }
225087
225256
  },
225088
- line: 262
225257
+ line: 263
225089
225258
  },
225090
- "12": {
225091
- name: "(anonymous_12)",
225259
+ "14": {
225260
+ name: "(anonymous_14)",
225092
225261
  decl: {
225093
225262
  start: {
225094
- line: 273,
225263
+ line: 274,
225095
225264
  column: 17
225096
225265
  },
225097
225266
  end: {
225098
- line: 273,
225267
+ line: 274,
225099
225268
  column: 18
225100
225269
  }
225101
225270
  },
225102
225271
  loc: {
225103
225272
  start: {
225104
- line: 273,
225273
+ line: 274,
225105
225274
  column: 26
225106
225275
  },
225107
225276
  end: {
225108
- line: 280,
225277
+ line: 281,
225109
225278
  column: 11
225110
225279
  }
225111
225280
  },
225112
- line: 273
225281
+ line: 274
225113
225282
  }
225114
225283
  },
225115
225284
  branchMap: {
@@ -225120,7 +225289,7 @@ var cov_41uwsnrpn = function () {
225120
225289
  column: 6
225121
225290
  },
225122
225291
  end: {
225123
- line: 212,
225292
+ line: 214,
225124
225293
  column: 7
225125
225294
  }
225126
225295
  },
@@ -225131,7 +225300,7 @@ var cov_41uwsnrpn = function () {
225131
225300
  column: 6
225132
225301
  },
225133
225302
  end: {
225134
- line: 212,
225303
+ line: 214,
225135
225304
  column: 7
225136
225305
  }
225137
225306
  }, {
@@ -225140,7 +225309,7 @@ var cov_41uwsnrpn = function () {
225140
225309
  column: 6
225141
225310
  },
225142
225311
  end: {
225143
- line: 212,
225312
+ line: 214,
225144
225313
  column: 7
225145
225314
  }
225146
225315
  }],
@@ -225149,101 +225318,266 @@ var cov_41uwsnrpn = function () {
225149
225318
  "1": {
225150
225319
  loc: {
225151
225320
  start: {
225152
- line: 229,
225321
+ line: 209,
225322
+ column: 8
225323
+ },
225324
+ end: {
225325
+ line: 211,
225326
+ column: 9
225327
+ }
225328
+ },
225329
+ type: "if",
225330
+ locations: [{
225331
+ start: {
225332
+ line: 209,
225333
+ column: 8
225334
+ },
225335
+ end: {
225336
+ line: 211,
225337
+ column: 9
225338
+ }
225339
+ }, {
225340
+ start: {
225341
+ line: 209,
225342
+ column: 8
225343
+ },
225344
+ end: {
225345
+ line: 211,
225346
+ column: 9
225347
+ }
225348
+ }],
225349
+ line: 209
225350
+ },
225351
+ "2": {
225352
+ loc: {
225353
+ start: {
225354
+ line: 220,
225153
225355
  column: 6
225154
225356
  },
225155
225357
  end: {
225156
- line: 232,
225358
+ line: 226,
225157
225359
  column: 7
225158
225360
  }
225159
225361
  },
225160
225362
  type: "if",
225161
225363
  locations: [{
225162
225364
  start: {
225163
- line: 229,
225365
+ line: 220,
225164
225366
  column: 6
225165
225367
  },
225166
225368
  end: {
225167
- line: 232,
225369
+ line: 226,
225168
225370
  column: 7
225169
225371
  }
225170
225372
  }, {
225171
225373
  start: {
225172
- line: 229,
225374
+ line: 220,
225173
225375
  column: 6
225174
225376
  },
225175
225377
  end: {
225176
- line: 232,
225378
+ line: 226,
225177
225379
  column: 7
225178
225380
  }
225179
225381
  }],
225180
- line: 229
225382
+ line: 220
225181
225383
  },
225182
- "2": {
225384
+ "3": {
225183
225385
  loc: {
225184
225386
  start: {
225185
- line: 260,
225387
+ line: 222,
225388
+ column: 13
225389
+ },
225390
+ end: {
225391
+ line: 226,
225392
+ column: 7
225393
+ }
225394
+ },
225395
+ type: "if",
225396
+ locations: [{
225397
+ start: {
225398
+ line: 222,
225399
+ column: 13
225400
+ },
225401
+ end: {
225402
+ line: 226,
225403
+ column: 7
225404
+ }
225405
+ }, {
225406
+ start: {
225407
+ line: 222,
225408
+ column: 13
225409
+ },
225410
+ end: {
225411
+ line: 226,
225412
+ column: 7
225413
+ }
225414
+ }],
225415
+ line: 222
225416
+ },
225417
+ "4": {
225418
+ loc: {
225419
+ start: {
225420
+ line: 224,
225421
+ column: 13
225422
+ },
225423
+ end: {
225424
+ line: 226,
225425
+ column: 7
225426
+ }
225427
+ },
225428
+ type: "if",
225429
+ locations: [{
225430
+ start: {
225431
+ line: 224,
225432
+ column: 13
225433
+ },
225434
+ end: {
225435
+ line: 226,
225436
+ column: 7
225437
+ }
225438
+ }, {
225439
+ start: {
225440
+ line: 224,
225441
+ column: 13
225442
+ },
225443
+ end: {
225444
+ line: 226,
225445
+ column: 7
225446
+ }
225447
+ }],
225448
+ line: 224
225449
+ },
225450
+ "5": {
225451
+ loc: {
225452
+ start: {
225453
+ line: 231,
225186
225454
  column: 6
225187
225455
  },
225188
225456
  end: {
225189
- line: 281,
225457
+ line: 234,
225190
225458
  column: 7
225191
225459
  }
225192
225460
  },
225193
225461
  type: "if",
225194
225462
  locations: [{
225195
225463
  start: {
225196
- line: 260,
225464
+ line: 231,
225197
225465
  column: 6
225198
225466
  },
225199
225467
  end: {
225200
- line: 281,
225468
+ line: 234,
225201
225469
  column: 7
225202
225470
  }
225203
225471
  }, {
225204
225472
  start: {
225205
- line: 260,
225473
+ line: 231,
225206
225474
  column: 6
225207
225475
  },
225208
225476
  end: {
225209
- line: 281,
225477
+ line: 234,
225210
225478
  column: 7
225211
225479
  }
225212
225480
  }],
225213
- line: 260
225481
+ line: 231
225214
225482
  },
225215
- "3": {
225483
+ "6": {
225216
225484
  loc: {
225217
225485
  start: {
225218
- line: 274,
225486
+ line: 244,
225487
+ column: 45
225488
+ },
225489
+ end: {
225490
+ line: 244,
225491
+ column: 79
225492
+ }
225493
+ },
225494
+ type: "binary-expr",
225495
+ locations: [{
225496
+ start: {
225497
+ line: 244,
225498
+ column: 45
225499
+ },
225500
+ end: {
225501
+ line: 244,
225502
+ column: 56
225503
+ }
225504
+ }, {
225505
+ start: {
225506
+ line: 244,
225507
+ column: 60
225508
+ },
225509
+ end: {
225510
+ line: 244,
225511
+ column: 79
225512
+ }
225513
+ }],
225514
+ line: 244
225515
+ },
225516
+ "7": {
225517
+ loc: {
225518
+ start: {
225519
+ line: 261,
225520
+ column: 6
225521
+ },
225522
+ end: {
225523
+ line: 282,
225524
+ column: 7
225525
+ }
225526
+ },
225527
+ type: "if",
225528
+ locations: [{
225529
+ start: {
225530
+ line: 261,
225531
+ column: 6
225532
+ },
225533
+ end: {
225534
+ line: 282,
225535
+ column: 7
225536
+ }
225537
+ }, {
225538
+ start: {
225539
+ line: 261,
225540
+ column: 6
225541
+ },
225542
+ end: {
225543
+ line: 282,
225544
+ column: 7
225545
+ }
225546
+ }],
225547
+ line: 261
225548
+ },
225549
+ "8": {
225550
+ loc: {
225551
+ start: {
225552
+ line: 275,
225219
225553
  column: 12
225220
225554
  },
225221
225555
  end: {
225222
- line: 279,
225556
+ line: 280,
225223
225557
  column: 13
225224
225558
  }
225225
225559
  },
225226
225560
  type: "if",
225227
225561
  locations: [{
225228
225562
  start: {
225229
- line: 274,
225563
+ line: 275,
225230
225564
  column: 12
225231
225565
  },
225232
225566
  end: {
225233
- line: 279,
225567
+ line: 280,
225234
225568
  column: 13
225235
225569
  }
225236
225570
  }, {
225237
225571
  start: {
225238
- line: 274,
225572
+ line: 275,
225239
225573
  column: 12
225240
225574
  },
225241
225575
  end: {
225242
- line: 279,
225576
+ line: 280,
225243
225577
  column: 13
225244
225578
  }
225245
225579
  }],
225246
- line: 274
225580
+ line: 275
225247
225581
  }
225248
225582
  },
225249
225583
  s: {
@@ -225273,7 +225607,19 @@ var cov_41uwsnrpn = function () {
225273
225607
  "23": 0,
225274
225608
  "24": 0,
225275
225609
  "25": 0,
225276
- "26": 0
225610
+ "26": 0,
225611
+ "27": 0,
225612
+ "28": 0,
225613
+ "29": 0,
225614
+ "30": 0,
225615
+ "31": 0,
225616
+ "32": 0,
225617
+ "33": 0,
225618
+ "34": 0,
225619
+ "35": 0,
225620
+ "36": 0,
225621
+ "37": 0,
225622
+ "38": 0
225277
225623
  },
225278
225624
  f: {
225279
225625
  "0": 0,
@@ -225288,25 +225634,32 @@ var cov_41uwsnrpn = function () {
225288
225634
  "9": 0,
225289
225635
  "10": 0,
225290
225636
  "11": 0,
225291
- "12": 0
225637
+ "12": 0,
225638
+ "13": 0,
225639
+ "14": 0
225292
225640
  },
225293
225641
  b: {
225294
225642
  "0": [0, 0],
225295
225643
  "1": [0, 0],
225296
225644
  "2": [0, 0],
225297
- "3": [0, 0]
225645
+ "3": [0, 0],
225646
+ "4": [0, 0],
225647
+ "5": [0, 0],
225648
+ "6": [0, 0],
225649
+ "7": [0, 0],
225650
+ "8": [0, 0]
225298
225651
  },
225299
225652
  inputSourceMap: {
225300
225653
  version: 3,
225301
225654
  sources: ["NewProjectModal.vue"],
225302
225655
  names: [],
225303
- mappings: ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyJA;;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;AACA;AACA",
225656
+ mappings: ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyJA;;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;AACA;AACA",
225304
225657
  file: "NewProjectModal.vue",
225305
225658
  sourceRoot: "src/components/projects",
225306
- sourcesContent: ["<template>\n <base-modal\n :show-modal=\"showModal\"\n max-width=\"800px\"\n @close-modal=\"closeModal\"\n >\n <template v-slot:title>Create Project</template>\n\n <template v-slot:content>\n <v-container\n class=\"pa-0\"\n >\n <v-row>\n <v-col cols=\"16\">\n <v-text-field\n ref=\"title\"\n v-model=\"project.title\"\n :v-show=\"showModal\"\n :rules=\"[rules.required]\"\n :error-messages=\"errorMessages.title\"\n label=\"Project Title\"\n data-test=\"new-project-title-input\"\n class=\"pt-6\"\n @keyup.enter=\"submit\"\n />\n </v-col>\n </v-row>\n\n <div\n v-show=\"showOptionalFields\"\n class=\"pa-0\"\n >\n <v-row>\n <v-col cols=\"16\">\n <v-text-field\n ref=\"shortTitle\"\n v-model=\"project.shortTitle\"\n :rules=\"[rules.unicode, rules.min10]\"\n :error-messages=\"errorMessages.short_title\"\n label=\"Project Short Title\"\n data-test=\"new-project-short-input\"\n counter\n dense\n maxlength=\"30\"\n hint=\"Think of the objective of the project.\"\n />\n </v-col>\n </v-row>\n\n <v-row>\n <v-col cols=\"16\">\n <v-select\n ref=\"group\"\n v-model=\"project.group\"\n :items=\"groups\"\n return-object\n item-text=\"slug\"\n label=\"Group\"\n dense\n data-test=\"new-project-groups-input\"\n />\n </v-col>\n </v-row>\n <v-row>\n <v-col cols=\"16\">\n <user-search-input\n ref=\"principalInvestigator\"\n :model=\"project\"\n :rules=\"[rules.email]\"\n :error-messages=\"errorMessages.principal_investigator\"\n field=\"principalInvestigator\"\n label=\"Principal Investigator\"\n data-test=\"new-project-pi-input\"\n hint=\"Laboratory head or principal investigator\"\n dense\n @update-value=\"updateValue\"\n />\n </v-col>\n </v-row>\n\n <v-row>\n <v-col cols=\"16\">\n <user-search-input\n ref=\"owner\"\n :model=\"project\"\n :rules=\"[rules.email]\"\n :error-messages=\"errorMessages.owner\"\n field=\"owner\"\n label=\"Project Owner\"\n data-test=\"new-project-owner-input\"\n hint=\"Who deals with the nitty-gritty of the project\"\n dense\n @update-value=\"updateValue\"\n />\n </v-col>\n </v-row>\n\n <v-row>\n <v-col cols=\"16\">\n <user-search-input\n ref=\"coordinator\"\n :model=\"project\"\n :rules=\"[rules.email]\"\n :error-messages=\"errorMessages.coordinator\"\n field=\"coordinator\"\n label=\"Coordinator\"\n data-test=\"new-project-coord-input\"\n hint=\"Project manager or coordinator\"\n dense\n @update-value=\"updateValue\"\n />\n </v-col>\n </v-row>\n\n <v-row>\n <v-col cols=\"16\">\n <user-search-input\n ref=\"analyst\"\n :model=\"project\"\n :rules=\"[rules.email]\"\n :error-messages=\"errorMessages.analyst\"\n field=\"analyst\"\n label=\"Data Analyst\"\n data-test=\"new-project-analyst-input\"\n hint=\"Person responsible for the data analysis\"\n @update-value=\"updateValue\"\n />\n </v-col>\n </v-row>\n </div>\n\n </v-container>\n </template>\n\n <template v-slot:footer-actions>\n <v-btn\n color=\"primary darken-1\"\n data-test=\"new-project-optional-btn\"\n text\n @click=\"toggleOptionalFields\"\n >Optional Fields</v-btn>\n\n <v-btn\n color=\"primary darken-1\"\n data-test=\"new-project-create-btn\"\n text\n @click=\"submit\"\n >Create</v-btn>\n </template>\n </base-modal>\n</template>\n\n<script>\nimport has from 'lodash/has'\n\nimport BaseModal from '@/components/base/BaseModal.vue'\nimport GroupSearchInput from '@/components/projects/GroupSearchInput'\nimport UserSearchInput from '@/components/projects/UserSearchInput'\nimport rules from '@/utils/rules'\nimport { createRecord, fetchListRecords } from '@/utils/api'\nimport { SHOW_ALERT } from '@/store/actions/alert'\nimport { SHOW_PANEL } from '@/store/actions/panels'\n\nexport default {\n name: 'NewProjectModal',\n components: {\n BaseModal,\n GroupSearchInput,\n UserSearchInput\n },\n props: {\n showModal: {\n type: Boolean,\n default: false,\n required: true\n },\n projects: {\n type: Array,\n default: () => []\n }\n },\n data() {\n return {\n isLoading: false,\n errorMessages: {},\n formHasErrors: false,\n fieldsToValidate: [\n 'title',\n 'shortTitle',\n 'group',\n 'principalInvestigator',\n 'owner',\n 'coordinator',\n 'analyst'\n ],\n groups: [],\n project: {},\n refs: {},\n rules,\n showOptionalFields: false,\n users: [],\n usersQuery: ''\n }\n },\n watch: {\n showModal(value) {\n if (value) {\n // ensure autofocus: https://github.com/vuetifyjs/vuetify/issues/1587\n // this.$nextTick(this.$refs.title.focus)\n this.fetchGroups()\n this.resetForm()\n }\n }\n },\n mounted() {\n // Map all local and nested inputs to local 'refs'\n // this.fieldsToValidate.forEach(field => {\n // if (has(this.$refs[field], 'reset')) {\n // this.refs[field] = this.$refs[field]\n // } else if (has(this.$refs[field], '$refs.userSearchInput.reset')) {\n // this.refs[field] = this.$refs[field].$refs.userSearchInput\n // } else if (has(this.$refs[field], '$refs.groupSearchInput.reset')) {\n // this.refs[field] = this.$refs[field].$refs.groupSearchInput\n // }\n // })\n },\n methods: {\n async fetchGroups() {\n if (!this.groups.length) {\n const response = await fetchListRecords('groups')\n this.groups = response.results\n }\n },\n toggleOptionalFields() {\n this.showOptionalFields = !this.showOptionalFields\n this.$nextTick(this.$refs.title.focus)\n this.$nextTick(this.$refs.title.resetValidation)\n },\n resetForm() {\n this.formHasErrors = false\n // this.fieldsToValidate.forEach(field => {\n // this.refs[field].reset()\n // })\n },\n closeModal() {\n this.resetForm()\n this.$emit('close-modal')\n },\n updateValue(data) {\n this.project = {\n ...this.project,\n ...data\n }\n },\n async submit() {\n this.formHasErrors = false\n this.fieldsToValidate.forEach(field => {\n this.refs[field].validate(true)\n })\n if (!this.formHasErrors) {\n createRecord('projects', this.project)\n .then(response => {\n const projectId = this.$get(response, 'pk', '')\n this.$store.dispatch(SHOW_ALERT, {\n message: `Project ${projectId} was succesfully created.`\n })\n\n this.$store.dispatch(SHOW_PANEL, {\n project: projectId\n })\n this.closeModal()\n })\n .catch(error => {\n if (error.response) {\n this.errorMessages = error.response.data\n this.$store.dispatch(SHOW_ALERT, {\n error: 'The project could not be created. Please try again.'\n })\n }\n })\n }\n }\n }\n}\n</script>\n\n<style lang=\"scss\">\n.v-expansion-panel__header {\n padding: 5px !important;\n}\n</style>\n"]
225659
+ sourcesContent: ["<template>\n <base-modal\n :show-modal=\"showModal\"\n max-width=\"800px\"\n @close-modal=\"closeModal\"\n >\n <template v-slot:title>Create Project</template>\n\n <template v-slot:content>\n <v-container\n class=\"pa-0\"\n >\n <v-row>\n <v-col cols=\"16\">\n <v-text-field\n ref=\"title\"\n v-model=\"project.title\"\n :v-show=\"showModal\"\n :rules=\"[rules.required]\"\n :error-messages=\"errorMessages.title\"\n label=\"Project Title\"\n data-test=\"new-project-title-input\"\n class=\"pt-6\"\n @keyup.enter=\"submit\"\n />\n </v-col>\n </v-row>\n\n <div\n v-show=\"showOptionalFields\"\n class=\"pa-0\"\n >\n <v-row>\n <v-col cols=\"16\">\n <v-text-field\n ref=\"shortTitle\"\n v-model=\"project.shortTitle\"\n :rules=\"[rules.unicode, rules.min10]\"\n :error-messages=\"errorMessages.short_title\"\n label=\"Project Short Title\"\n data-test=\"new-project-short-input\"\n counter\n dense\n maxlength=\"30\"\n hint=\"Think of the objective of the project.\"\n />\n </v-col>\n </v-row>\n\n <v-row>\n <v-col cols=\"16\">\n <v-select\n ref=\"group\"\n v-model=\"project.group\"\n :items=\"groups\"\n return-object\n item-text=\"slug\"\n label=\"Group\"\n dense\n data-test=\"new-project-groups-input\"\n />\n </v-col>\n </v-row>\n <v-row>\n <v-col cols=\"16\">\n <user-search-input\n ref=\"principalInvestigator\"\n :model=\"project\"\n :rules=\"[rules.email]\"\n :error-messages=\"errorMessages.principal_investigator\"\n field=\"principalInvestigator\"\n label=\"Principal Investigator\"\n data-test=\"new-project-pi-input\"\n hint=\"Laboratory head or principal investigator\"\n dense\n @update-value=\"updateValue\"\n />\n </v-col>\n </v-row>\n\n <v-row>\n <v-col cols=\"16\">\n <user-search-input\n ref=\"owner\"\n :model=\"project\"\n :rules=\"[rules.email]\"\n :error-messages=\"errorMessages.owner\"\n field=\"owner\"\n label=\"Project Owner\"\n data-test=\"new-project-owner-input\"\n hint=\"Who deals with the nitty-gritty of the project\"\n dense\n @update-value=\"updateValue\"\n />\n </v-col>\n </v-row>\n\n <v-row>\n <v-col cols=\"16\">\n <user-search-input\n ref=\"coordinator\"\n :model=\"project\"\n :rules=\"[rules.email]\"\n :error-messages=\"errorMessages.coordinator\"\n field=\"coordinator\"\n label=\"Coordinator\"\n data-test=\"new-project-coord-input\"\n hint=\"Project manager or coordinator\"\n dense\n @update-value=\"updateValue\"\n />\n </v-col>\n </v-row>\n\n <v-row>\n <v-col cols=\"16\">\n <user-search-input\n ref=\"analyst\"\n :model=\"project\"\n :rules=\"[rules.email]\"\n :error-messages=\"errorMessages.analyst\"\n field=\"analyst\"\n label=\"Data Analyst\"\n data-test=\"new-project-analyst-input\"\n hint=\"Person responsible for the data analysis\"\n @update-value=\"updateValue\"\n />\n </v-col>\n </v-row>\n </div>\n\n </v-container>\n </template>\n\n <template v-slot:footer-actions>\n <v-btn\n color=\"primary darken-1\"\n data-test=\"new-project-optional-btn\"\n text\n @click=\"toggleOptionalFields\"\n >Optional Fields</v-btn>\n\n <v-btn\n color=\"primary darken-1\"\n data-test=\"new-project-create-btn\"\n text\n @click=\"submit\"\n >Create</v-btn>\n </template>\n </base-modal>\n</template>\n\n<script>\nimport has from 'lodash/has'\n\nimport BaseModal from '@/components/base/BaseModal.vue'\nimport GroupSearchInput from '@/components/projects/GroupSearchInput'\nimport UserSearchInput from '@/components/projects/UserSearchInput'\nimport rules from '@/utils/rules'\nimport { createRecord, fetchListRecords } from '@/utils/api'\nimport { SHOW_ALERT } from '@/store/actions/alert'\nimport { SHOW_PANEL } from '@/store/actions/panels'\n\nexport default {\n name: 'NewProjectModal',\n components: {\n BaseModal,\n GroupSearchInput,\n UserSearchInput\n },\n props: {\n showModal: {\n type: Boolean,\n default: false,\n required: true\n },\n projects: {\n type: Array,\n default: () => []\n }\n },\n data() {\n return {\n isLoading: false,\n errorMessages: {},\n formHasErrors: false,\n fieldsToValidate: [\n 'title',\n 'shortTitle',\n 'group',\n 'principalInvestigator',\n 'owner',\n 'coordinator',\n 'analyst'\n ],\n groups: [],\n project: {},\n refs: {},\n rules,\n showOptionalFields: false,\n users: [],\n usersQuery: ''\n }\n },\n watch: {\n showModal(value) {\n if (value) {\n // ensure autofocus: https://github.com/vuetifyjs/vuetify/issues/1587\n if (this.$refs.title) {\n this.$nextTick(this.$refs.title.focus)\n }\n this.fetchGroups()\n this.resetForm()\n }\n }\n },\n mounted() {\n // Map all local and nested inputs to local 'refs'\n this.fieldsToValidate.forEach(field => {\n if (has(this.$refs[field], 'reset')) {\n this.refs[field] = this.$refs[field]\n } else if (has(this.$refs[field], '$refs.userSearchInput.reset')) {\n this.refs[field] = this.$refs[field].$refs.userSearchInput\n } else if (has(this.$refs[field], '$refs.groupSearchInput.reset')) {\n this.refs[field] = this.$refs[field].$refs.groupSearchInput\n }\n })\n },\n methods: {\n async fetchGroups() {\n if (!this.groups.length) {\n const response = await fetchListRecords('groups')\n this.groups = response.results\n }\n },\n toggleOptionalFields() {\n this.showOptionalFields = !this.showOptionalFields\n this.$nextTick(this.$refs.title.focus)\n this.$nextTick(this.$refs.title.resetValidation)\n },\n resetForm() {\n const { refs } = this\n this.formHasErrors = false\n this.fieldsToValidate.forEach(field => refs[field] && refs[field].reset())\n },\n closeModal() {\n this.resetForm()\n this.$emit('close-modal')\n },\n updateValue(data) {\n this.project = {\n ...this.project,\n ...data\n }\n },\n async submit() {\n this.formHasErrors = false\n this.fieldsToValidate.forEach(field => {\n this.refs[field].validate(true)\n })\n if (!this.formHasErrors) {\n createRecord('projects', this.project)\n .then(response => {\n const projectId = this.$get(response, 'pk', '')\n this.$store.dispatch(SHOW_ALERT, {\n message: `Project ${projectId} was succesfully created.`\n })\n\n this.$store.dispatch(SHOW_PANEL, {\n project: projectId\n })\n this.closeModal()\n })\n .catch(error => {\n if (error.response) {\n this.errorMessages = error.response.data\n this.$store.dispatch(SHOW_ALERT, {\n error: 'The project could not be created. Please try again.'\n })\n }\n })\n }\n }\n }\n}\n</script>\n\n<style lang=\"scss\">\n.v-expansion-panel__header {\n padding: 5px !important;\n}\n</style>\n"]
225307
225660
  },
225308
225661
  _coverageSchema: "43e27e138ebf9cfc5966b082cf9a028302ed4184",
225309
- hash: "569231b05a1c881d9d6ae5390bffc324ffea102b"
225662
+ hash: "880a7035d32da713e533258d2460ef2446ff3c8f"
225310
225663
  };
225311
225664
  var coverage = global[gcv] || (global[gcv] = {});
225312
225665
 
@@ -225536,28 +225889,61 @@ function NewProjectModalvue_type_script_lang_js_asyncToGenerator(fn) { return fu
225536
225889
  if (value) {
225537
225890
  cov_41uwsnrpn.b[0][0]++;
225538
225891
  cov_41uwsnrpn.s[3]++;
225892
+
225539
225893
  // ensure autofocus: https://github.com/vuetifyjs/vuetify/issues/1587
225540
- // this.$nextTick(this.$refs.title.focus)
225894
+ if (this.$refs.title) {
225895
+ cov_41uwsnrpn.b[1][0]++;
225896
+ cov_41uwsnrpn.s[4]++;
225897
+ this.$nextTick(this.$refs.title.focus);
225898
+ } else {
225899
+ cov_41uwsnrpn.b[1][1]++;
225900
+ }
225901
+
225902
+ cov_41uwsnrpn.s[5]++;
225541
225903
  this.fetchGroups();
225542
- cov_41uwsnrpn.s[4]++;
225904
+ cov_41uwsnrpn.s[6]++;
225543
225905
  this.resetForm();
225544
225906
  } else {
225545
225907
  cov_41uwsnrpn.b[0][1]++;
225546
225908
  }
225547
225909
  }
225548
225910
  },
225549
- mounted: function mounted() {// Map all local and nested inputs to local 'refs'
225550
- // this.fieldsToValidate.forEach(field => {
225551
- // if (has(this.$refs[field], 'reset')) {
225552
- // this.refs[field] = this.$refs[field]
225553
- // } else if (has(this.$refs[field], '$refs.userSearchInput.reset')) {
225554
- // this.refs[field] = this.$refs[field].$refs.userSearchInput
225555
- // } else if (has(this.$refs[field], '$refs.groupSearchInput.reset')) {
225556
- // this.refs[field] = this.$refs[field].$refs.groupSearchInput
225557
- // }
225558
- // })
225911
+ mounted: function mounted() {
225912
+ var _this = this;
225559
225913
 
225560
225914
  cov_41uwsnrpn.f[3]++;
225915
+ cov_41uwsnrpn.s[7]++;
225916
+ // Map all local and nested inputs to local 'refs'
225917
+ this.fieldsToValidate.forEach(function (field) {
225918
+ cov_41uwsnrpn.f[4]++;
225919
+ cov_41uwsnrpn.s[8]++;
225920
+
225921
+ if (has_default()(_this.$refs[field], 'reset')) {
225922
+ cov_41uwsnrpn.b[2][0]++;
225923
+ cov_41uwsnrpn.s[9]++;
225924
+ _this.refs[field] = _this.$refs[field];
225925
+ } else {
225926
+ cov_41uwsnrpn.b[2][1]++;
225927
+ cov_41uwsnrpn.s[10]++;
225928
+
225929
+ if (has_default()(_this.$refs[field], '$refs.userSearchInput.reset')) {
225930
+ cov_41uwsnrpn.b[3][0]++;
225931
+ cov_41uwsnrpn.s[11]++;
225932
+ _this.refs[field] = _this.$refs[field].$refs.userSearchInput;
225933
+ } else {
225934
+ cov_41uwsnrpn.b[3][1]++;
225935
+ cov_41uwsnrpn.s[12]++;
225936
+
225937
+ if (has_default()(_this.$refs[field], '$refs.groupSearchInput.reset')) {
225938
+ cov_41uwsnrpn.b[4][0]++;
225939
+ cov_41uwsnrpn.s[13]++;
225940
+ _this.refs[field] = _this.$refs[field].$refs.groupSearchInput;
225941
+ } else {
225942
+ cov_41uwsnrpn.b[4][1]++;
225943
+ }
225944
+ }
225945
+ }
225946
+ });
225561
225947
  },
225562
225948
  methods: {
225563
225949
  fetchGroups: function () {
@@ -225567,28 +225953,28 @@ function NewProjectModalvue_type_script_lang_js_asyncToGenerator(fn) { return fu
225567
225953
  while (1) {
225568
225954
  switch (_context.prev = _context.next) {
225569
225955
  case 0:
225570
- cov_41uwsnrpn.f[4]++;
225571
- cov_41uwsnrpn.s[5]++;
225956
+ cov_41uwsnrpn.f[5]++;
225957
+ cov_41uwsnrpn.s[14]++;
225572
225958
 
225573
225959
  if (this.groups.length) {
225574
225960
  _context.next = 12;
225575
225961
  break;
225576
225962
  }
225577
225963
 
225578
- cov_41uwsnrpn.b[1][0]++;
225579
- cov_41uwsnrpn.s[6]++;
225964
+ cov_41uwsnrpn.b[5][0]++;
225965
+ cov_41uwsnrpn.s[15]++;
225580
225966
  _context.next = 7;
225581
225967
  return fetchListRecords('groups');
225582
225968
 
225583
225969
  case 7:
225584
225970
  response = _context.sent;
225585
- cov_41uwsnrpn.s[7]++;
225971
+ cov_41uwsnrpn.s[16]++;
225586
225972
  this.groups = response.results;
225587
225973
  _context.next = 13;
225588
225974
  break;
225589
225975
 
225590
225976
  case 12:
225591
- cov_41uwsnrpn.b[1][1]++;
225977
+ cov_41uwsnrpn.b[5][1]++;
225592
225978
 
225593
225979
  case 13:
225594
225980
  case "end":
@@ -225605,93 +225991,101 @@ function NewProjectModalvue_type_script_lang_js_asyncToGenerator(fn) { return fu
225605
225991
  return fetchGroups;
225606
225992
  }(),
225607
225993
  toggleOptionalFields: function toggleOptionalFields() {
225608
- cov_41uwsnrpn.f[5]++;
225609
- cov_41uwsnrpn.s[8]++;
225994
+ cov_41uwsnrpn.f[6]++;
225995
+ cov_41uwsnrpn.s[17]++;
225610
225996
  this.showOptionalFields = !this.showOptionalFields;
225611
- cov_41uwsnrpn.s[9]++;
225997
+ cov_41uwsnrpn.s[18]++;
225612
225998
  this.$nextTick(this.$refs.title.focus);
225613
- cov_41uwsnrpn.s[10]++;
225999
+ cov_41uwsnrpn.s[19]++;
225614
226000
  this.$nextTick(this.$refs.title.resetValidation);
225615
226001
  },
225616
226002
  resetForm: function resetForm() {
225617
- cov_41uwsnrpn.f[6]++;
225618
- cov_41uwsnrpn.s[11]++;
225619
- this.formHasErrors = false; // this.fieldsToValidate.forEach(field => {
225620
- // this.refs[field].reset()
225621
- // })
226003
+ cov_41uwsnrpn.f[7]++;
226004
+
226005
+ var _ref = (cov_41uwsnrpn.s[20]++, this),
226006
+ refs = _ref.refs;
226007
+
226008
+ cov_41uwsnrpn.s[21]++;
226009
+ this.formHasErrors = false;
226010
+ cov_41uwsnrpn.s[22]++;
226011
+ this.fieldsToValidate.forEach(function (field) {
226012
+ cov_41uwsnrpn.f[8]++;
226013
+ cov_41uwsnrpn.s[23]++;
226014
+ return (cov_41uwsnrpn.b[6][0]++, refs[field]) && (cov_41uwsnrpn.b[6][1]++, refs[field].reset());
226015
+ });
225622
226016
  },
225623
226017
  closeModal: function closeModal() {
225624
- cov_41uwsnrpn.f[7]++;
225625
- cov_41uwsnrpn.s[12]++;
226018
+ cov_41uwsnrpn.f[9]++;
226019
+ cov_41uwsnrpn.s[24]++;
225626
226020
  this.resetForm();
225627
- cov_41uwsnrpn.s[13]++;
226021
+ cov_41uwsnrpn.s[25]++;
225628
226022
  this.$emit('close-modal');
225629
226023
  },
225630
226024
  updateValue: function updateValue(data) {
225631
- cov_41uwsnrpn.f[8]++;
225632
- cov_41uwsnrpn.s[14]++;
226025
+ cov_41uwsnrpn.f[10]++;
226026
+ cov_41uwsnrpn.s[26]++;
225633
226027
  this.project = NewProjectModalvue_type_script_lang_js_objectSpread(NewProjectModalvue_type_script_lang_js_objectSpread({}, this.project), data);
225634
226028
  },
225635
226029
  submit: function () {
225636
226030
  var _submit = NewProjectModalvue_type_script_lang_js_asyncToGenerator( /*#__PURE__*/regenerator_default.a.mark(function _callee2() {
225637
- var _this = this;
226031
+ var _this2 = this;
225638
226032
 
225639
226033
  return regenerator_default.a.wrap(function _callee2$(_context2) {
225640
226034
  while (1) {
225641
226035
  switch (_context2.prev = _context2.next) {
225642
226036
  case 0:
225643
- cov_41uwsnrpn.f[9]++;
225644
- cov_41uwsnrpn.s[15]++;
226037
+ cov_41uwsnrpn.f[11]++;
226038
+ cov_41uwsnrpn.s[27]++;
225645
226039
  this.formHasErrors = false;
225646
- cov_41uwsnrpn.s[16]++;
226040
+ cov_41uwsnrpn.s[28]++;
225647
226041
  this.fieldsToValidate.forEach(function (field) {
225648
- cov_41uwsnrpn.f[10]++;
225649
- cov_41uwsnrpn.s[17]++;
226042
+ cov_41uwsnrpn.f[12]++;
226043
+ cov_41uwsnrpn.s[29]++;
225650
226044
 
225651
- _this.refs[field].validate(true);
226045
+ _this2.refs[field].validate(true);
225652
226046
  });
225653
- cov_41uwsnrpn.s[18]++;
226047
+ cov_41uwsnrpn.s[30]++;
225654
226048
 
225655
226049
  if (!this.formHasErrors) {
225656
- cov_41uwsnrpn.b[2][0]++;
225657
- cov_41uwsnrpn.s[19]++;
226050
+ cov_41uwsnrpn.b[7][0]++;
226051
+ cov_41uwsnrpn.s[31]++;
225658
226052
  createRecord('projects', this.project).then(function (response) {
225659
- cov_41uwsnrpn.f[11]++;
225660
- var projectId = (cov_41uwsnrpn.s[20]++, _this.$get(response, 'pk', ''));
225661
- cov_41uwsnrpn.s[21]++;
226053
+ cov_41uwsnrpn.f[13]++;
226054
+ var projectId = (cov_41uwsnrpn.s[32]++, _this2.$get(response, 'pk', ''));
226055
+ cov_41uwsnrpn.s[33]++;
225662
226056
 
225663
- _this.$store.dispatch(SHOW_ALERT, {
226057
+ _this2.$store.dispatch(SHOW_ALERT, {
225664
226058
  message: "Project ".concat(projectId, " was succesfully created.")
225665
226059
  });
225666
226060
 
225667
- cov_41uwsnrpn.s[22]++;
226061
+ cov_41uwsnrpn.s[34]++;
225668
226062
 
225669
- _this.$store.dispatch(SHOW_PANEL, {
226063
+ _this2.$store.dispatch(SHOW_PANEL, {
225670
226064
  project: projectId
225671
226065
  });
225672
226066
 
225673
- cov_41uwsnrpn.s[23]++;
226067
+ cov_41uwsnrpn.s[35]++;
225674
226068
 
225675
- _this.closeModal();
226069
+ _this2.closeModal();
225676
226070
  }).catch(function (error) {
225677
- cov_41uwsnrpn.f[12]++;
225678
- cov_41uwsnrpn.s[24]++;
226071
+ cov_41uwsnrpn.f[14]++;
226072
+ cov_41uwsnrpn.s[36]++;
225679
226073
 
225680
226074
  if (error.response) {
225681
- cov_41uwsnrpn.b[3][0]++;
225682
- cov_41uwsnrpn.s[25]++;
225683
- _this.errorMessages = error.response.data;
225684
- cov_41uwsnrpn.s[26]++;
226075
+ cov_41uwsnrpn.b[8][0]++;
226076
+ cov_41uwsnrpn.s[37]++;
226077
+ _this2.errorMessages = error.response.data;
226078
+ cov_41uwsnrpn.s[38]++;
225685
226079
 
225686
- _this.$store.dispatch(SHOW_ALERT, {
226080
+ _this2.$store.dispatch(SHOW_ALERT, {
225687
226081
  error: 'The project could not be created. Please try again.'
225688
226082
  });
225689
226083
  } else {
225690
- cov_41uwsnrpn.b[3][1]++;
226084
+ cov_41uwsnrpn.b[8][1]++;
225691
226085
  }
225692
226086
  });
225693
226087
  } else {
225694
- cov_41uwsnrpn.b[2][1]++;
226088
+ cov_41uwsnrpn.b[7][1]++;
225695
226089
  }
225696
226090
 
225697
226091
  case 7:
@@ -225726,8 +226120,8 @@ var NewProjectModalvue_type_style_index_0_lang_scss_ = __webpack_require__("9434
225726
226120
 
225727
226121
  var NewProjectModal_component = normalizeComponent(
225728
226122
  projects_NewProjectModalvue_type_script_lang_js_,
225729
- NewProjectModalvue_type_template_id_72aeb340_render,
225730
- NewProjectModalvue_type_template_id_72aeb340_staticRenderFns,
226123
+ NewProjectModalvue_type_template_id_58c607e8_render,
226124
+ NewProjectModalvue_type_template_id_58c607e8_staticRenderFns,
225731
226125
  false,
225732
226126
  null,
225733
226127
  null,
@@ -253214,8 +253608,8 @@ var RerunButton_component = normalizeComponent(
253214
253608
  )
253215
253609
 
253216
253610
  /* harmony default export */ var RerunButton = (RerunButton_component.exports);
253217
- // CONCATENATED MODULE: ./node_modules/cache-loader/dist/cjs.js?{"cacheDirectory":"node_modules/.cache/vue-loader","cacheIdentifier":"d220a428-vue-loader-template"}!./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options!./src/components/analyses/ResultsGallery.vue?vue&type=template&id=6a3b6186&
253218
- var ResultsGalleryvue_type_template_id_6a3b6186_render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return (_vm.showDialog)?_c('v-dialog',{directives:[{name:"hotkey",rawName:"v-hotkey",value:(_vm.keymap),expression:"keymap"}],staticClass:"gallery-dialog",attrs:{"fullscreen":_vm.isResultModalFullScreen,"scrollable":""},model:{value:(_vm.showDialog),callback:function ($$v) {_vm.showDialog=$$v},expression:"showDialog"}},[_c('v-card',{staticClass:"gallery-card",attrs:{"flat":""}},[_c('v-card-title',{staticClass:"pa-2"},[_c('v-row',[_c('v-col',{attrs:{"cols":"6"}},[_c('h3',{staticClass:"font-weight-thin primary--text"},[_vm._v("\n "+_vm._s(_vm.result.verboseName)+"\n ")])]),_c('v-col',{staticClass:"d-flex justify-end align-center panel-slot-actions",attrs:{"cols":"6"}},[(_vm.result.frontendType === 'tsv-file' && _vm.tsvHeaders.length)?_c('v-tooltip',{attrs:{"top":""},scopedSlots:_vm._u([{key:"activator",fn:function(ref){
253611
+ // CONCATENATED MODULE: ./node_modules/cache-loader/dist/cjs.js?{"cacheDirectory":"node_modules/.cache/vue-loader","cacheIdentifier":"d220a428-vue-loader-template"}!./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options!./src/components/analyses/ResultsGallery.vue?vue&type=template&id=185780e8&
253612
+ var ResultsGalleryvue_type_template_id_185780e8_render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return (_vm.showDialog)?_c('v-dialog',{directives:[{name:"hotkey",rawName:"v-hotkey",value:(_vm.keymap),expression:"keymap"}],staticClass:"gallery-dialog",attrs:{"fullscreen":_vm.isResultModalFullScreen,"scrollable":""},model:{value:(_vm.showDialog),callback:function ($$v) {_vm.showDialog=$$v},expression:"showDialog"}},[_c('v-card',{staticClass:"gallery-card",attrs:{"flat":""}},[_c('v-card-title',{staticClass:"pa-2"},[_c('v-row',[_c('v-col',{attrs:{"cols":"6"}},[_c('h3',{staticClass:"font-weight-thin primary--text"},[_vm._v("\n "+_vm._s(_vm.result.verboseName)+"\n ")])]),_c('v-col',{staticClass:"d-flex justify-end align-center panel-slot-actions",attrs:{"cols":"6"}},[(_vm.result.frontendType === 'tsv-file' && _vm.tsvHeaders.length)?_c('v-tooltip',{attrs:{"top":""},scopedSlots:_vm._u([{key:"activator",fn:function(ref){
253219
253613
  var on = ref.on;
253220
253614
  return [_c('v-icon',_vm._g({staticClass:"primary--text ml-4",attrs:{"small":""},on:{"click":function($event){_vm.displayRawText = !_vm.displayRawText}}},on),[_vm._v("\n "+_vm._s(_vm.displayRawText ? 'table_chart' : 'text_fields')+"\n ")])]}}],null,false,578865119)},[_vm._v("\n "+_vm._s(_vm.displayRawText ? 'Display Tabulated Content' : 'Display Raw Content')+"\n ")]):_vm._e(),(_vm.result.download)?_c('v-tooltip',{attrs:{"top":""},scopedSlots:_vm._u([{key:"activator",fn:function(ref){
253221
253615
  var on = ref.on;
@@ -253232,10 +253626,10 @@ var on = ref.on;
253232
253626
  return [_c('v-icon',_vm._g({staticClass:"primary--text ml-4",attrs:{"small":""},on:{"click":_vm.hideDialog}},on),[_vm._v("\n close\n ")])]}}],null,false,804201733)},[_vm._v("\n Close file\n ")])],1)],1)],1),_c('v-row',{staticClass:"pa-0 ma-0 gallery-content",staticStyle:{"height":"85vh"}},[(_vm.loading)?_c('v-progress-linear',{staticClass:"panel-loader",attrs:{"indeterminate":"","height":"2","color":"primary"}}):_vm._e(),(_vm.resultType === 'raw' && _vm.resultKey === 'command_script')?_c('pre',{directives:[{name:"highlightjs",rawName:"v-highlightjs",value:(_vm.content),expression:"content"}],ref:"raw",staticClass:"v-markup pre-wrap"},[_vm._v(" "),_c('code',{staticClass:"bash"}),_vm._v("\n ")]):(_vm.isAnsi)?_c('code',{ref:"raw",staticClass:"v-markup"},[_c('pre',{domProps:{"innerHTML":_vm._s(_vm.content)}})]):(_vm.resultType === 'raw')?_c('code',{ref:"raw",staticClass:"v-markup"},[_c('pre',[_vm._v(" "+_vm._s(_vm.content)+"\n "),(_vm.content && !_vm.streamOptions.end)?_c('span',{staticClass:"stream-message grey--text lighten-2"},[_vm._v("\n ... Loading more rows\n ")]):_vm._e(),_vm._v("\n "),(!_vm.loading && _vm.streamOptions.end)?_c('span',{staticClass:"stream-message grey--text"},[_vm._v("\n *** End of file. ***\n ")]):_vm._e(),_vm._v("\n ")])]):(_vm.resultType === 'table')?_c('div',{ref:"table",staticClass:"tsv-table"},[_c('v-data-table',{attrs:{"headers":_vm.tsvHeaders,"items":_vm.tsvItems,"items-per-page":_vm.tsvItems.length,"hide-default-footer":"","multi-sort":"","fixed-header":"","dense":""},scopedSlots:_vm._u([{key:"body",fn:function(ref){
253233
253627
  var items = ref.items;
253234
253628
  return [_c('tbody',_vm._l((items),function(item){return _c('tr',{key:item.name},_vm._l((_vm.tsvHeaders),function(header,index){return _c('td',{key:index + header.value,class:[header.value === 'index' ? 'line-column text' : ''],domProps:{"innerHTML":_vm._s(_vm.parseTsvCell(_vm.$get(item, header.value)))}})}),0)}),0)]}}],null,false,3434796515)}),_c('div',{staticClass:"text-center stream-message"},[(_vm.content && !_vm.streamOptions.end)?_c('span',[_vm._v("... Loading more rows")]):_vm._e(),(!_vm.loading && _vm.streamOptions.end)?_c('span',[_vm._v("End of file.")]):_vm._e()])],1):(_vm.resultType === 'image')?_c('img',{staticClass:"results-image",attrs:{"src":_vm.$store.getters.getBlobUrl(_vm.result.downloadUrl),"alt":_vm.result.verboseName}}):(['html', 'pdf'].includes(_vm.resultType))?_c('iframe',{staticClass:"results-iframe",staticStyle:{"width":"100%","height":"100%","min-height":"80vh"},attrs:{"src":_vm.$store.getters.getBlobUrl(_vm.result.downloadUrl, ''),"frameborder":"0"}}):(_vm.resultType === 'igv_bam')?_c('iframe',{staticClass:"results-iframe",staticStyle:{"width":"100%","height":"100%","min-height":"80vh"},attrs:{"src":_vm.result.downloadUrl,"frameborder":"0"}}):(_vm.resultType === 'number')?_c('code',{staticClass:"v-markup"},[_c('span',{attrs:{"size":"100px"}},[_vm._v(_vm._s(_vm._f("round")(_vm.result.value,3)))])]):(['string', 'url-link'].includes(_vm.resultType))?_c('code',{staticClass:"v-markup"},[_c('span',{attrs:{"size":"100px"}},[_vm._v(_vm._s(_vm.result.value))])]):_vm._e()],1)],1)],1):_vm._e()}
253235
- var ResultsGalleryvue_type_template_id_6a3b6186_staticRenderFns = []
253629
+ var ResultsGalleryvue_type_template_id_185780e8_staticRenderFns = []
253236
253630
 
253237
253631
 
253238
- // CONCATENATED MODULE: ./src/components/analyses/ResultsGallery.vue?vue&type=template&id=6a3b6186&
253632
+ // CONCATENATED MODULE: ./src/components/analyses/ResultsGallery.vue?vue&type=template&id=185780e8&
253239
253633
 
253240
253634
  // EXTERNAL MODULE: ./node_modules/detect-csv/index.js
253241
253635
  var detect_csv = __webpack_require__("0f34");
@@ -253244,7 +253638,7 @@ var detect_csv_default = /*#__PURE__*/__webpack_require__.n(detect_csv);
253244
253638
  // CONCATENATED MODULE: ./node_modules/cache-loader/dist/cjs.js??ref--12-0!./node_modules/thread-loader/dist/cjs.js!./node_modules/@vue/cli-plugin-babel/node_modules/babel-loader/lib!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options!./src/components/analyses/ResultsGallery.vue?vue&type=script&lang=js&
253245
253639
  var cov_d7x60homs = function () {
253246
253640
  var path = "/Users/juanes/papaemmelab/isabl_web/src/components/analyses/ResultsGallery.vue";
253247
- var hash = "22f2dbdd387a60567b7780d3d04bdf3435e3d749";
253641
+ var hash = "fe09864f43de2d4dae5821f382f528b5c4317436";
253248
253642
  var global = new Function("return this")();
253249
253643
  var gcv = "__coverage__";
253250
253644
  var coverageData = {
@@ -254027,7 +254421,7 @@ var cov_d7x60homs = function () {
254027
254421
  },
254028
254422
  end: {
254029
254423
  line: 491,
254030
- column: 34
254424
+ column: 41
254031
254425
  }
254032
254426
  },
254033
254427
  "78": {
@@ -254037,7 +254431,7 @@ var cov_d7x60homs = function () {
254037
254431
  },
254038
254432
  end: {
254039
254433
  line: 492,
254040
- column: 71
254434
+ column: 77
254041
254435
  }
254042
254436
  },
254043
254437
  "79": {
@@ -254959,7 +255353,7 @@ var cov_d7x60homs = function () {
254959
255353
  },
254960
255354
  end: {
254961
255355
  line: 491,
254962
- column: 34
255356
+ column: 41
254963
255357
  }
254964
255358
  },
254965
255359
  line: 491
@@ -254983,7 +255377,7 @@ var cov_d7x60homs = function () {
254983
255377
  },
254984
255378
  end: {
254985
255379
  line: 492,
254986
- column: 71
255380
+ column: 77
254987
255381
  }
254988
255382
  },
254989
255383
  line: 492
@@ -256233,7 +256627,7 @@ var cov_d7x60homs = function () {
256233
256627
  },
256234
256628
  end: {
256235
256629
  line: 492,
256236
- column: 72
256630
+ column: 78
256237
256631
  }
256238
256632
  }, {
256239
256633
  start: {
@@ -256288,7 +256682,7 @@ var cov_d7x60homs = function () {
256288
256682
  },
256289
256683
  end: {
256290
256684
  line: 492,
256291
- column: 71
256685
+ column: 77
256292
256686
  }
256293
256687
  },
256294
256688
  type: "binary-expr",
@@ -256299,16 +256693,16 @@ var cov_d7x60homs = function () {
256299
256693
  },
256300
256694
  end: {
256301
256695
  line: 492,
256302
- column: 45
256696
+ column: 48
256303
256697
  }
256304
256698
  }, {
256305
256699
  start: {
256306
256700
  line: 492,
256307
- column: 49
256701
+ column: 52
256308
256702
  },
256309
256703
  end: {
256310
256704
  line: 492,
256311
- column: 71
256705
+ column: 77
256312
256706
  }
256313
256707
  }],
256314
256708
  line: 492
@@ -256849,10 +257243,10 @@ var cov_d7x60homs = function () {
256849
257243
  mappings: ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiRA;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",
256850
257244
  file: "ResultsGallery.vue",
256851
257245
  sourceRoot: "src/components/analyses",
256852
- 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 <!-- style=\"transition: 0.3s\" -->\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 <!-- @click=\"(isFullScreen = !isFullScreen)\" -->\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)\n .filter((row) => row[0] !== '#' || row.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"]
257246
+ 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 <!-- style=\"transition: 0.3s\" -->\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 <!-- @click=\"(isFullScreen = !isFullScreen)\" -->\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"]
256853
257247
  },
256854
257248
  _coverageSchema: "43e27e138ebf9cfc5966b082cf9a028302ed4184",
256855
- hash: "22f2dbdd387a60567b7780d3d04bdf3435e3d749"
257249
+ hash: "fe09864f43de2d4dae5821f382f528b5c4317436"
256856
257250
  };
256857
257251
  var coverage = global[gcv] || (global[gcv] = {});
256858
257252
 
@@ -257585,11 +257979,11 @@ function ResultsGalleryvue_type_script_lang_js_defineProperty(obj, key, value) {
257585
257979
  var dataRows = (cov_d7x60homs.s[76]++, (cov_d7x60homs.b[32][0]++, content) && (cov_d7x60homs.b[32][1]++, isTsv) ? (cov_d7x60homs.b[31][0]++, this.csvToArray(content.trim(), detectHandler.delimiter).filter(function (row) {
257586
257980
  cov_d7x60homs.f[22]++;
257587
257981
  cov_d7x60homs.s[77]++;
257588
- return row;
257982
+ return row.length;
257589
257983
  }).filter(function (row) {
257590
257984
  cov_d7x60homs.f[23]++;
257591
257985
  cov_d7x60homs.s[78]++;
257592
- return (cov_d7x60homs.b[33][0]++, row[0] !== '#') || (cov_d7x60homs.b[33][1]++, row.includes('#CHROM'));
257986
+ return (cov_d7x60homs.b[33][0]++, row[0][0] !== '#') || (cov_d7x60homs.b[33][1]++, row[0].includes('#CHROM'));
257593
257987
  })) : (cov_d7x60homs.b[31][1]++, [])); // Headers
257594
257988
 
257595
257989
  cov_d7x60homs.s[79]++;
@@ -257743,8 +258137,8 @@ var ResultsGalleryvue_type_style_index_0_lang_scss_ = __webpack_require__("3942"
257743
258137
 
257744
258138
  var ResultsGallery_component = normalizeComponent(
257745
258139
  analyses_ResultsGalleryvue_type_script_lang_js_,
257746
- ResultsGalleryvue_type_template_id_6a3b6186_render,
257747
- ResultsGalleryvue_type_template_id_6a3b6186_staticRenderFns,
258140
+ ResultsGalleryvue_type_template_id_185780e8_render,
258141
+ ResultsGalleryvue_type_template_id_185780e8_staticRenderFns,
257748
258142
  false,
257749
258143
  null,
257750
258144
  null,
@@ -264731,12 +265125,12 @@ var ProjectPanelvue_type_template_id_7c1bc440_staticRenderFns = []
264731
265125
 
264732
265126
  // CONCATENATED MODULE: ./src/components/projects/ProjectPanel.vue?vue&type=template&id=7c1bc440&
264733
265127
 
264734
- // CONCATENATED MODULE: ./node_modules/cache-loader/dist/cjs.js?{"cacheDirectory":"node_modules/.cache/vue-loader","cacheIdentifier":"d220a428-vue-loader-template"}!./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options!./src/components/dashboard/BaseDashboard.vue?vue&type=template&id=191c4226&
264735
- var BaseDashboardvue_type_template_id_191c4226_render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{ref:"dashboard"},[_c('v-card',{staticClass:"isabl-base-card",attrs:{"flat":""}},[_c('dc-graph',{attrs:{"model":_vm.model,"params":_vm.params,"items":_vm.items,"figures":_vm.figures,"loading":_vm.loading,"max-records":_vm.maxRecords,"total-items":_vm.totalItems,"is-embedded":_vm.isEmbedded},on:{"set-max-records":_vm.setMaxRecords,"set-options":_vm.setOptions}})],1)],1)}
264736
- var BaseDashboardvue_type_template_id_191c4226_staticRenderFns = []
265128
+ // CONCATENATED MODULE: ./node_modules/cache-loader/dist/cjs.js?{"cacheDirectory":"node_modules/.cache/vue-loader","cacheIdentifier":"d220a428-vue-loader-template"}!./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options!./src/components/dashboard/BaseDashboard.vue?vue&type=template&id=2fd2fca6&
265129
+ var BaseDashboardvue_type_template_id_2fd2fca6_render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{ref:"dashboard"},[_c('v-card',{staticClass:"isabl-base-card",attrs:{"flat":""}},[_c('dc-graph',{attrs:{"model":_vm.model,"params":_vm.params,"items":_vm.items,"figures":_vm.figures,"loading":_vm.loading,"max-records":_vm.maxRecords,"total-items":_vm.totalItems,"is-embedded":_vm.isEmbedded},on:{"set-max-records":_vm.setMaxRecords,"set-options":_vm.setOptions}})],1)],1)}
265130
+ var BaseDashboardvue_type_template_id_2fd2fca6_staticRenderFns = []
264737
265131
 
264738
265132
 
264739
- // CONCATENATED MODULE: ./src/components/dashboard/BaseDashboard.vue?vue&type=template&id=191c4226&
265133
+ // CONCATENATED MODULE: ./src/components/dashboard/BaseDashboard.vue?vue&type=template&id=2fd2fca6&
264740
265134
 
264741
265135
  // CONCATENATED MODULE: ./node_modules/cache-loader/dist/cjs.js?{"cacheDirectory":"node_modules/.cache/vue-loader","cacheIdentifier":"d220a428-vue-loader-template"}!./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options!./src/components/dashboard/DcGraph.vue?vue&type=template&id=7d68029b&
264742
265136
  var DcGraphvue_type_template_id_7d68029b_render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{ref:"main",class:['main-dc', !_vm.isEmbedded ? 'px-2' : '']},[_c('div',{directives:[{name:"show",rawName:"v-show",value:(_vm.loading),expression:"loading"}],staticClass:"overlay"},[_c('v-progress-circular',{staticClass:"loading",attrs:{"width":4,"size":40,"indeterminate":"","color":"primary"}}),_c('div',{staticClass:"mt-6"},[_vm._v("loading records...")])],1),_c('transition',{attrs:{"name":"slide-fade"}},[_c('data-table',{directives:[{name:"show",rawName:"v-show",value:(_vm.showPrefilterTable),expression:"showPrefilterTable"}],attrs:{"model":_vm.model,"params":_vm.params,"open-records-in-new-tab":!_vm.isEmbedded,"title":"Import Into dashboard","info-text":"Search and filter the records you may want to import into the interactive dashboard.","card-classes":"elevation-0 pa-0 mb-12"},on:{"fetch-data":_vm.setOptions}})],1),_c('div',{directives:[{name:"observe-visibility",rawName:"v-observe-visibility",value:(_vm.onVisible),expression:"onVisible"}],staticClass:"dashboard-graphs dc-data-count",attrs:{"id":("dc-data-count-" + _vm.uuid)}},[_c('v-container',{attrs:{"fluid":""}},[_c('v-row',{staticClass:"pb-6 justify-space-between"},[_c('v-col',{staticClass:"pa-0",attrs:{"cols":"4"}},[_c('h2',{staticClass:"isabl-section-title text-left"},[_vm._v(_vm._s(_vm._f("capitalize")(_vm.title || 'Interactive Dashboard')))])]),_c('v-col',{staticClass:"text-center pa-0",attrs:{"cols":"4"}},[_c('span',{staticClass:"filter-count primary--text"}),_vm._v(" selected out of\n "),_c('span',{staticClass:"total-count primary--text"}),(_vm.totalItems && _vm.totalItems > _vm.maxRecords)?_c('span',{staticClass:"total-items"},[_vm._v("\n /\n "),_c('span',{staticClass:"primary--text"},[_c('b',[_vm._v(_vm._s(_vm._f("formatNumber")(_vm.totalItems)))])])]):_vm._e(),_vm._v("\n records\n\n "),(_vm.totalItems && _vm.totalItems > _vm.maxRecords)?_c('v-tooltip',{attrs:{"top":""},scopedSlots:_vm._u([{key:"activator",fn:function(ref){
@@ -291366,7 +291760,7 @@ var DcGraph_component = normalizeComponent(
291366
291760
  // CONCATENATED MODULE: ./node_modules/cache-loader/dist/cjs.js??ref--12-0!./node_modules/thread-loader/dist/cjs.js!./node_modules/@vue/cli-plugin-babel/node_modules/babel-loader/lib!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options!./src/components/dashboard/BaseDashboard.vue?vue&type=script&lang=js&
291367
291761
  var cov_21s3whnekh = function () {
291368
291762
  var path = "/Users/juanes/papaemmelab/isabl_web/src/components/dashboard/BaseDashboard.vue";
291369
- var hash = "0b4078169eae16bef6c925f7ea045fdcabd12d44";
291763
+ var hash = "80378eaf505b52746695623a345007e2d0c5f9ea";
291370
291764
  var global = new Function("return this")();
291371
291765
  var gcv = "__coverage__";
291372
291766
  var coverageData = {
@@ -292258,10 +292652,10 @@ var cov_21s3whnekh = function () {
292258
292652
  mappings: ";;;;;;;;;;;;;;;;;;;;AAoBA;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;;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",
292259
292653
  file: "BaseDashboard.vue",
292260
292654
  sourceRoot: "src/components/dashboard",
292261
- sourcesContent: ["<template>\n <div ref=\"dashboard\">\n <v-card flat class=\"isabl-base-card\">\n <dc-graph\n :model=\"model\"\n :params=\"params\"\n :items=\"items\"\n :figures=\"figures\"\n :loading=\"loading\"\n :max-records=\"maxRecords\"\n :total-items=\"totalItems\"\n :is-embedded=\"isEmbedded\"\n @set-max-records=\"setMaxRecords\"\n @set-options=\"setOptions\"\n />\n </v-card>\n </div>\n</template>\n\n<script>\nimport BasePanel from '@/components/base/BasePanel.vue'\nimport BaseSectionTitle from '@/components/base/BaseSectionTitle.vue'\nimport DataTable from '@/components/table/DataTable.vue'\nimport DcGraph from '@/components/dashboard/DcGraph.vue'\nimport { fetchListRecords } from '@/utils/api'\nimport { SHOW_ALERT } from '@/store/actions/alert'\n\nexport default {\n name: 'BaseDashboard',\n components: {\n BasePanel,\n BaseSectionTitle,\n DataTable,\n DcGraph\n },\n props: {\n params: {\n type: Object,\n default: () => ({})\n },\n isEmbedded: {\n type: Boolean,\n default: true\n },\n model: {\n type: String,\n required: true\n },\n figures: {\n type: Array,\n required: true\n },\n requiredFields: {\n type: Array,\n default: () => []\n }\n },\n data() {\n return {\n items: [],\n loading: false,\n maxRecords: 500,\n options: {},\n totalItems: null\n }\n },\n computed: {\n queryFields() {\n const fields = this.figures.map(figure => figure.queryFields)\n // flat and remove duplicates\n return [...new Set(fields.flat())]\n },\n fields() {\n return [\n ...new Set([\n 'pk',\n 'created',\n 'modified',\n 'analytics',\n ...this.requiredFields,\n ...this.queryFields\n ])\n ]\n .filter(i => !!i)\n .map(i => i.replace(/\\./g, '__'))\n }\n },\n created() {\n this.loading = true\n },\n methods: {\n setOptions(options) {\n delete options.offset\n this.options = options\n this.fetchData()\n },\n setMaxRecords(value) {\n if (value !== this.maxRecords) {\n this.maxRecords = value\n this.fetchData()\n }\n },\n fetchData() {\n this.loading = true\n\n const fields = this.fields.map(i => i.replace(/\\./g, '__'))\n fetchListRecords(this.model, {\n ...this.options,\n ...this.params,\n limit: this.maxRecords,\n distinct: true,\n fields,\n 'fields!': ''\n })\n .then(response => {\n this.items = response.results.map(r => {\n const result = {\n ...r,\n ...r.analytics\n }\n delete result.analytics\n return result\n })\n this.totalItems = response.count\n })\n .catch(error => {\n let errorMessage = `Search failed: `\n if (error.response) {\n const errorMessages = Object.values(error.response.data).flat()\n errorMessage += errorMessages.length ? errorMessages[0] : '...'\n }\n this.$store.dispatch(SHOW_ALERT, {\n error: errorMessage\n })\n })\n .finally(() => (this.loading = false))\n }\n }\n}\n</script>\n<style lang=\"scss\">\n.dashboard .panels {\n max-width: 95%;\n max-width: 1800px;\n padding-bottom: 100px;\n}\n</style>\n"]
292655
+ sourcesContent: ["<template>\n <div ref=\"dashboard\">\n <v-card flat class=\"isabl-base-card\">\n <dc-graph\n :model=\"model\"\n :params=\"params\"\n :items=\"items\"\n :figures=\"figures\"\n :loading=\"loading\"\n :max-records=\"maxRecords\"\n :total-items=\"totalItems\"\n :is-embedded=\"isEmbedded\"\n @set-max-records=\"setMaxRecords\"\n @set-options=\"setOptions\"\n />\n </v-card>\n </div>\n</template>\n\n<script>\n import BasePanel from '@/components/base/BasePanel.vue'\n import BaseSectionTitle from '@/components/base/BaseSectionTitle.vue'\n import DataTable from '@/components/table/DataTable.vue'\n import DcGraph from '@/components/dashboard/DcGraph.vue'\n import { fetchListRecords } from '@/utils/api'\n import { SHOW_ALERT } from '@/store/actions/alert'\n\n export default {\n name: 'BaseDashboard',\n components: {\n BasePanel,\n BaseSectionTitle,\n DataTable,\n DcGraph\n },\n props: {\n params: {\n type: Object,\n default: () => ({})\n },\n isEmbedded: {\n type: Boolean,\n default: true\n },\n model: {\n type: String,\n required: true\n },\n figures: {\n type: Array,\n required: true\n },\n requiredFields: {\n type: Array,\n default: () => []\n }\n },\n data() {\n return {\n items: [],\n loading: false,\n maxRecords: 500,\n options: {},\n totalItems: null\n }\n },\n computed: {\n queryFields() {\n const fields = this.figures.map(figure => figure.queryFields)\n // flat and remove duplicates\n return [...new Set(fields.flat())]\n },\n fields() {\n return [\n ...new Set([\n 'pk',\n 'created',\n 'modified',\n 'analytics',\n ...this.requiredFields,\n ...this.queryFields\n ])\n ]\n .filter(i => !!i)\n .map(i => i.replace(/\\./g, '__'))\n }\n },\n created() {\n this.loading = true\n },\n methods: {\n setOptions(options) {\n delete options.offset\n this.options = options\n this.fetchData()\n },\n setMaxRecords(value) {\n if (value !== this.maxRecords) {\n this.maxRecords = value\n this.fetchData()\n }\n },\n fetchData() {\n this.loading = true\n\n const fields = this.fields.map(i => i.replace(/\\./g, '__'))\n fetchListRecords(this.model, {\n ...this.options,\n ...this.params,\n limit: this.maxRecords,\n distinct: true,\n fields,\n 'fields!': ''\n })\n .then(response => {\n this.items = response.results.map(r => {\n const result = {\n ...r,\n ...r.analytics\n }\n delete result.analytics\n return result\n })\n this.totalItems = response.count\n })\n .catch(error => {\n let errorMessage = `Search failed: `\n if (error.response) {\n const errorMessages = Object.values(error.response.data).flat()\n errorMessage += errorMessages.length ? errorMessages[0] : '...'\n }\n this.$store.dispatch(SHOW_ALERT, {\n error: errorMessage\n })\n })\n .finally(() => (this.loading = false))\n }\n }\n }\n</script>\n<style lang=\"scss\">\n.dashboard .panels {\n max-width: 95%;\n max-width: 1800px;\n padding-bottom: 100px;\n}\n</style>\n"]
292262
292656
  },
292263
292657
  _coverageSchema: "43e27e138ebf9cfc5966b082cf9a028302ed4184",
292264
- hash: "0b4078169eae16bef6c925f7ea045fdcabd12d44"
292658
+ hash: "80378eaf505b52746695623a345007e2d0c5f9ea"
292265
292659
  };
292266
292660
  var coverage = global[gcv] || (global[gcv] = {});
292267
292661
 
@@ -292492,8 +292886,8 @@ var BaseDashboardvue_type_style_index_0_lang_scss_ = __webpack_require__("f624")
292492
292886
 
292493
292887
  var BaseDashboard_component = normalizeComponent(
292494
292888
  dashboard_BaseDashboardvue_type_script_lang_js_,
292495
- BaseDashboardvue_type_template_id_191c4226_render,
292496
- BaseDashboardvue_type_template_id_191c4226_staticRenderFns,
292889
+ BaseDashboardvue_type_template_id_2fd2fca6_render,
292890
+ BaseDashboardvue_type_template_id_2fd2fca6_staticRenderFns,
292497
292891
  false,
292498
292892
  null,
292499
292893
  null,
@@ -298468,18 +298862,18 @@ var BioModelPanelvue_type_template_id_b52cff22_staticRenderFns = []
298468
298862
 
298469
298863
  // CONCATENATED MODULE: ./src/components/bioModels/BioModelPanel.vue?vue&type=template&id=b52cff22&
298470
298864
 
298471
- // CONCATENATED MODULE: ./node_modules/cache-loader/dist/cjs.js?{"cacheDirectory":"node_modules/.cache/vue-loader","cacheIdentifier":"d220a428-vue-loader-template"}!./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options!./src/components/bioModels/BioModelTree.vue?vue&type=template&id=8ae628c2&
298472
- var BioModelTreevue_type_template_id_8ae628c2_render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('v-card',{staticClass:"isabl-base-card",attrs:{"flat":"","data-test":"biomodel-tree"}},[_c('base-section-title',{attrs:{"show-more":_vm.showTree},on:{"toggle-show-more":function($event){_vm.showTree = !_vm.showTree}},scopedSlots:_vm._u([{key:"title",fn:function(){return [_vm._v("Samples Tree")]},proxy:true},{key:"actions",fn:function(){return [_c('div',[(_vm.isBigTree)?_c('v-btn',{staticClass:"table-action-btn pull-right ma-0",attrs:{"fab":"","outlined":"","color":"primary"},on:{"click":function($event){_vm.showFullHeight = !_vm.showFullHeight
298865
+ // CONCATENATED MODULE: ./node_modules/cache-loader/dist/cjs.js?{"cacheDirectory":"node_modules/.cache/vue-loader","cacheIdentifier":"d220a428-vue-loader-template"}!./node_modules/vue-loader/lib/loaders/templateLoader.js??vue-loader-options!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options!./src/components/bioModels/BioModelTree.vue?vue&type=template&id=2b110930&
298866
+ var BioModelTreevue_type_template_id_2b110930_render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('v-card',{staticClass:"isabl-base-card",attrs:{"flat":"","data-test":"biomodel-tree"}},[_c('base-section-title',{attrs:{"show-more":_vm.showTree},on:{"toggle-show-more":function($event){_vm.showTree = !_vm.showTree}},scopedSlots:_vm._u([{key:"title",fn:function(){return [_vm._v("Samples Tree")]},proxy:true},{key:"actions",fn:function(){return [_c('div',[(_vm.isBigTree)?_c('v-btn',{staticClass:"table-action-btn pull-right ma-0",attrs:{"fab":"","outlined":"","color":"primary"},on:{"click":function($event){_vm.showFullHeight = !_vm.showFullHeight
298473
298867
  _vm.scrollToCurrentNode()}}},[_c('v-icon',{attrs:{"color":"primary"}},[_vm._v(_vm._s(_vm.showFullHeight ? 'expand_less' : 'expand_more'))])],1):_vm._e()],1)]},proxy:true}])}),_c('v-row',{directives:[{name:"show",rawName:"v-show",value:(_vm.showTree),expression:"showTree"}],staticClass:"individual-tree-div ma-0",style:(_vm.showFullHeight ? '' : 'max-height: 300px;'),attrs:{"id":"tree-div"}},[_c('v-col',{staticClass:"individual-tree text-center pa-0 ma-0"})],1)],1)}
298474
- var BioModelTreevue_type_template_id_8ae628c2_staticRenderFns = []
298868
+ var BioModelTreevue_type_template_id_2b110930_staticRenderFns = []
298475
298869
 
298476
298870
 
298477
- // CONCATENATED MODULE: ./src/components/bioModels/BioModelTree.vue?vue&type=template&id=8ae628c2&
298871
+ // CONCATENATED MODULE: ./src/components/bioModels/BioModelTree.vue?vue&type=template&id=2b110930&
298478
298872
 
298479
298873
  // CONCATENATED MODULE: ./node_modules/cache-loader/dist/cjs.js??ref--12-0!./node_modules/thread-loader/dist/cjs.js!./node_modules/@vue/cli-plugin-babel/node_modules/babel-loader/lib!./node_modules/cache-loader/dist/cjs.js??ref--0-0!./node_modules/vue-loader/lib??vue-loader-options!./src/components/bioModels/BioModelTree.vue?vue&type=script&lang=js&
298480
298874
  var cov_2hmzqbstvs = function () {
298481
298875
  var path = "/Users/juanes/papaemmelab/isabl_web/src/components/bioModels/BioModelTree.vue";
298482
- var hash = "5f37394f4c641e085634b4de8a6e95016123fe5c";
298876
+ var hash = "1e089864fe6792f2d8555180af07f2e5d7f516a5";
298483
298877
  var global = new Function("return this")();
298484
298878
  var gcv = "__coverage__";
298485
298879
  var coverageData = {
@@ -303764,10 +304158,10 @@ var cov_2hmzqbstvs = function () {
303764
304158
  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;;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA",
303765
304159
  file: "BioModelTree.vue",
303766
304160
  sourceRoot: "src/components/bioModels",
303767
- 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 === '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: 150,\n aliquot: 225,\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.$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 mb-1\" 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\" style=\"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.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"]
304161
+ 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 === '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: 150,\n aliquot: 225,\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.$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"]
303768
304162
  },
303769
304163
  _coverageSchema: "43e27e138ebf9cfc5966b082cf9a028302ed4184",
303770
- hash: "5f37394f4c641e085634b4de8a6e95016123fe5c"
304164
+ hash: "1e089864fe6792f2d8555180af07f2e5d7f516a5"
303771
304165
  };
303772
304166
  var coverage = global[gcv] || (global[gcv] = {});
303773
304167
 
@@ -304613,11 +305007,11 @@ function BioModelTreevue_type_script_lang_js_defineProperty(obj, key, value) { i
304613
305007
  cov_2hmzqbstvs.f[50]++;
304614
305008
  var value = (cov_2hmzqbstvs.s[204]++, _this5.$get(d.data, key, null));
304615
305009
  cov_2hmzqbstvs.s[205]++;
304616
- return value === null ? (cov_2hmzqbstvs.b[49][0]++, '') : (cov_2hmzqbstvs.b[49][1]++, "\n <div class=\"layout row mb-1\" style=\"max-width: 100%\"\">\n <div class=\"flex xs5\" style=\"width: 100%\">".concat(verboseName, "</div>\n <div class=\"flex xs7\" style=\"width: 100%\"><b>").concat(value, "</b></div>\n </div>\n "));
305010
+ return value === null ? (cov_2hmzqbstvs.b[49][0]++, '') : (cov_2hmzqbstvs.b[49][1]++, "\n <div class=\"layout row ma-3\" style=\"max-width: 100%\"\">\n <div class=\"flex xs5\" style=\"width: 100%\">".concat(verboseName, "</div>\n <div class=\"flex xs7\" style=\"width: 100%\"><b>").concat(value, "</b></div>\n </div>\n "));
304617
305011
  };
304618
305012
 
304619
305013
  cov_2hmzqbstvs.s[206]++;
304620
- return "\n <div class=\"v-tooltip__content\" style=\"width: 350px;\">\n ".concat(keyValue('experiment.system_id', 'System ID'), "\n ").concat(keyValue('experiment.identifier', 'Experiment ID'), "\n ").concat(keyValue('aliquot_id', 'Aliquot ID'), "\n ").concat(keyValue('sample.identifier', 'Sample ID'), "\n ").concat(keyValue('individual.identifier', 'Individual ID'), "\n ").concat(keyValue('experiment.technique.method', 'Method'), "\n ").concat(keyValue('experiment.technique.name', 'Technique Name'), "\n ").concat(keyValue('sample.disease.acronym', 'Disease'), "\n ").concat(keyValue('individual.species', 'Species'), "\n ").concat(keyValue('individual.center.acronym', 'Center'), "\n </div>\n ");
305014
+ return "\n <div class=\"v-tooltip__content tree-tooltip\" style=\"min-width: 350px;\">\n ".concat(keyValue('experiment.system_id', 'System ID'), "\n ").concat(keyValue('experiment.identifier', 'Experiment ID'), "\n ").concat(keyValue('aliquot_id', 'Aliquot ID'), "\n ").concat(keyValue('sample.identifier', 'Sample ID'), "\n ").concat(keyValue('individual.identifier', 'Individual ID'), "\n ").concat(keyValue('experiment.technique.method', 'Method'), "\n ").concat(keyValue('experiment.technique.name', 'Technique Name'), "\n ").concat(keyValue('sample.disease.acronym', 'Disease'), "\n ").concat(keyValue('individual.species', 'Species'), "\n ").concat(keyValue('individual.center.acronym', 'Center'), "\n </div>\n ");
304621
305015
  }
304622
305016
  }
304623
305017
  });
@@ -304637,8 +305031,8 @@ var BioModelTreevue_type_style_index_0_lang_scss_ = __webpack_require__("34ec");
304637
305031
 
304638
305032
  var BioModelTree_component = normalizeComponent(
304639
305033
  bioModels_BioModelTreevue_type_script_lang_js_,
304640
- BioModelTreevue_type_template_id_8ae628c2_render,
304641
- BioModelTreevue_type_template_id_8ae628c2_staticRenderFns,
305034
+ BioModelTreevue_type_template_id_2b110930_render,
305035
+ BioModelTreevue_type_template_id_2b110930_staticRenderFns,
304642
305036
  false,
304643
305037
  null,
304644
305038
  null,