@papaemmelab/isabl-web 0.3.45-beta.1 → 0.3.45-beta.2

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.
@@ -14689,7 +14689,7 @@ ___CSS_LOADER_EXPORT___.push([module.id, ".matrix-legend[data-v-4c88fa7c]{paddin
14689
14689
 
14690
14690
  /***/ }),
14691
14691
 
14692
- /***/ 58066:
14692
+ /***/ 8510:
14693
14693
  /***/ (function(module, __webpack_exports__, __webpack_require__) {
14694
14694
 
14695
14695
  "use strict";
@@ -14703,7 +14703,7 @@ __webpack_require__.r(__webpack_exports__);
14703
14703
 
14704
14704
  var ___CSS_LOADER_EXPORT___ = _node_modules_css_loader_dist_runtime_api_js__WEBPACK_IMPORTED_MODULE_1___default()((_node_modules_css_loader_dist_runtime_noSourceMaps_js__WEBPACK_IMPORTED_MODULE_0___default()));
14705
14705
  // Module
14706
- ___CSS_LOADER_EXPORT___.push([module.id, ".project-matrix[data-v-2742f691]{height:100%;min-height:400px}.loading-container[data-v-2742f691],.project-matrix[data-v-2742f691]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.loading-container[data-v-2742f691]{-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;min-height:300px}.filter-spacer[data-v-2742f691]{height:16px;background:#fff}.matrix-scroll-container[data-v-2742f691]{-webkit-box-flex:1;-ms-flex:1;flex:1;overflow:auto;max-height:calc(80vh - 180px)}.no-matches-message[data-v-2742f691]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;padding:24px;color:#666;font-size:13px}.matrix-table[data-v-2742f691]{border-collapse:separate;border-spacing:0;table-layout:fixed}.header-row[data-v-2742f691]{display:grid;grid-template-columns:200px repeat(var(--col-count),50px);position:sticky;top:0;z-index:10;background:#fff;min-width:-webkit-fit-content;min-width:-moz-fit-content;min-width:fit-content}.corner-cell[data-v-2742f691]{position:sticky;left:0;z-index:11;border-right:2px solid #5b5dff;width:200px;-webkit-box-sizing:border-box;box-sizing:border-box}.corner-cell[data-v-2742f691],.header-cell[data-v-2742f691]{background:#fff;border-bottom:2px solid #5b5dff;height:130px}.header-cell[data-v-2742f691]{position:relative;width:50px;overflow:visible;cursor:pointer}.header-cell:hover .header-text[data-v-2742f691]{background:#fff6db;border-radius:2px}.header-cell.column-highlighted .header-text[data-v-2742f691]{background:#fff0d9;border-radius:2px;font-weight:700;color:#000}.header-text[data-v-2742f691]{position:absolute;bottom:8px;left:50%;-webkit-transform:rotate(-45deg);transform:rotate(-45deg);-webkit-transform-origin:bottom left;transform-origin:bottom left;white-space:nowrap;font-size:11px;font-weight:500;color:#333;z-index:1}td.row-header[data-v-2742f691]{position:sticky;left:0;z-index:1;background:#fff;border-right:2px solid #5b5dff;padding:0 8px;width:200px;min-width:200px;max-width:200px;height:24px;border-bottom:1px solid #e0e0e0;cursor:pointer;vertical-align:middle;-webkit-box-sizing:border-box;box-sizing:border-box}.row-header.row-highlighted[data-v-2742f691]{background:#ffe8c5!important}.row-header.row-highlighted .system-id[data-v-2742f691]{font-weight:700;color:#000}.system-id[data-v-2742f691]{font-size:11px;font-family:monospace;color:#333;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.row-header[data-v-2742f691]:hover{background:#fff0d9}.row-header:hover .system-id[data-v-2742f691]{font-weight:600}td.matrix-cell[data-v-2742f691]{width:50px;min-width:50px;max-width:50px;height:24px;border-right:1px solid #e0e0e0;border-bottom:1px solid #e0e0e0;cursor:default;background:#fafafa;padding:0;vertical-align:middle;-webkit-box-sizing:border-box;box-sizing:border-box}.matrix-cell.has-analyses[data-v-2742f691]{cursor:pointer;background:#fff}.matrix-cell.cell-selected[data-v-2742f691],.matrix-cell.has-analyses[data-v-2742f691]:hover{border-right-color:#5b5dff;border-bottom-color:#5b5dff;background:#f0f0ff}.matrix-cell.cell-highlighted[data-v-2742f691]{background:#ffe8c5}.cell-stripes[data-v-2742f691]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:stretch;-ms-flex-align:stretch;align-items:stretch;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;gap:1px;height:100%;width:100%;padding:2px 4px}.stripe[data-v-2742f691]{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:3px;min-width:2px;max-width:5px;border-radius:1px}.cell-count-badge[data-v-2742f691]{width:100%;color:#fff;font-weight:600;text-shadow:0 0 2px rgba(0,0,0,.3)}.cell-count-badge[data-v-2742f691],.empty-cell[data-v-2742f691]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;height:100%;font-size:10px}.empty-cell[data-v-2742f691]{color:#ccc}.native-tooltip[data-v-2742f691]{position:fixed;-webkit-transform:translateX(-50%) translateY(-100%);transform:translateX(-50%) translateY(-100%);z-index:9999;background:#fff;border-radius:4px;-webkit-box-shadow:0 2px 8px rgba(0,0,0,.2);box-shadow:0 2px 8px rgba(0,0,0,.2);min-width:280px;max-width:350px;max-height:300px;overflow-y:auto}.native-tooltip[data-v-2742f691] .tooltip-header{padding:8px 12px;background:#f5f5f5;font-weight:500;font-size:13px;border-bottom:1px solid #e0e0e0}.native-tooltip[data-v-2742f691] .tooltip-list{padding:4px 0}.native-tooltip[data-v-2742f691] .tooltip-item{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;padding:6px 12px;cursor:pointer;font-size:12px}.native-tooltip[data-v-2742f691] .tooltip-item:hover{background:#e3f2fd}.native-tooltip[data-v-2742f691] .tooltip-item .status-dot{width:8px;height:8px;border-radius:50%;margin-right:8px;-ms-flex-negative:0;flex-shrink:0}.native-tooltip[data-v-2742f691] .tooltip-item .analysis-pk{color:#1976d2;font-weight:500}.native-tooltip[data-v-2742f691] .tooltip-item .sep{margin:0 6px;color:#999}.native-tooltip[data-v-2742f691] .tooltip-item .version{color:#666}.native-tooltip[data-v-2742f691] .tooltip-item .assembly{color:#999}.native-tooltip[data-v-2742f691] .tooltip-item .status-chip{margin-left:auto;padding:2px 6px;border-radius:3px;color:#fff;font-size:10px;font-weight:500}.native-tooltip[data-v-2742f691] .experiment-group-header{padding:6px 12px 4px;font-size:11px;font-weight:600;color:#1976d2;background:#f8f9fa;border-top:1px solid #e0e0e0;font-family:monospace}.native-tooltip[data-v-2742f691] .experiment-group-header:first-child{border-top:none}", ""]);
14706
+ ___CSS_LOADER_EXPORT___.push([module.id, ".project-matrix[data-v-28c10d94]{height:100%;min-height:400px}.loading-container[data-v-28c10d94],.project-matrix[data-v-28c10d94]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.loading-container[data-v-28c10d94]{-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;min-height:300px}.filter-spacer[data-v-28c10d94]{height:16px;background:#fff}.matrix-scroll-container[data-v-28c10d94]{-webkit-box-flex:1;-ms-flex:1;flex:1;overflow:auto;max-height:calc(80vh - 180px)}.no-matches-message[data-v-28c10d94]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;padding:24px;color:#666;font-size:13px}.matrix-table[data-v-28c10d94]{border-collapse:separate;border-spacing:0;table-layout:fixed}.header-row[data-v-28c10d94]{display:grid;grid-template-columns:200px repeat(var(--col-count),50px);position:sticky;top:0;z-index:10;background:#fff;min-width:-webkit-fit-content;min-width:-moz-fit-content;min-width:fit-content}.corner-cell[data-v-28c10d94]{position:sticky;left:0;z-index:11;border-right:2px solid #5b5dff;width:200px;-webkit-box-sizing:border-box;box-sizing:border-box}.corner-cell[data-v-28c10d94],.header-cell[data-v-28c10d94]{background:#fff;border-bottom:2px solid #5b5dff;height:130px}.header-cell[data-v-28c10d94]{position:relative;width:50px;overflow:visible;cursor:pointer}.header-cell:hover .header-text[data-v-28c10d94]{background:#fff6db;border-radius:2px}.header-cell.column-highlighted .header-text[data-v-28c10d94]{background:#fff0d9;border-radius:2px;font-weight:700;color:#000}.header-text[data-v-28c10d94]{position:absolute;bottom:8px;left:50%;-webkit-transform:rotate(-45deg);transform:rotate(-45deg);-webkit-transform-origin:bottom left;transform-origin:bottom left;white-space:nowrap;font-size:11px;font-weight:500;color:#333;z-index:1}td.row-header[data-v-28c10d94]{position:sticky;left:0;z-index:1;background:#fff;border-right:2px solid #5b5dff;padding:0 8px;width:200px;min-width:200px;max-width:200px;height:24px;border-bottom:1px solid #e0e0e0;cursor:pointer;vertical-align:middle;-webkit-box-sizing:border-box;box-sizing:border-box}.row-header.row-highlighted[data-v-28c10d94]{background:#ffe8c5!important}.row-header.row-highlighted .system-id[data-v-28c10d94]{font-weight:700;color:#000}.system-id[data-v-28c10d94]{font-size:11px;font-family:monospace;color:#333;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.row-header[data-v-28c10d94]:hover{background:#fff0d9}.row-header:hover .system-id[data-v-28c10d94]{font-weight:600}td.matrix-cell[data-v-28c10d94]{width:50px;min-width:50px;max-width:50px;height:24px;border-right:1px solid #e0e0e0;border-bottom:1px solid #e0e0e0;cursor:default;background:#fafafa;padding:0;vertical-align:middle;-webkit-box-sizing:border-box;box-sizing:border-box}.matrix-cell.has-analyses[data-v-28c10d94]{cursor:pointer;background:#fff}.matrix-cell.cell-selected[data-v-28c10d94],.matrix-cell.has-analyses[data-v-28c10d94]:hover{border-right-color:#5b5dff;border-bottom-color:#5b5dff;background:#f0f0ff}.matrix-cell.cell-highlighted[data-v-28c10d94]{background:#ffe8c5}.cell-stripes[data-v-28c10d94]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:stretch;-ms-flex-align:stretch;align-items:stretch;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;gap:1px;height:100%;width:100%;padding:2px 4px}.stripe[data-v-28c10d94]{-webkit-box-flex:0;-ms-flex:0 0 auto;flex:0 0 auto;width:3px;min-width:2px;max-width:5px;border-radius:1px}.cell-count-badge[data-v-28c10d94]{width:100%;color:#fff;font-weight:600;text-shadow:0 0 2px rgba(0,0,0,.3)}.cell-count-badge[data-v-28c10d94],.empty-cell[data-v-28c10d94]{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;height:100%;font-size:10px}.empty-cell[data-v-28c10d94]{color:#ccc}.native-tooltip[data-v-28c10d94]{position:fixed;-webkit-transform:translateX(-50%) translateY(-100%);transform:translateX(-50%) translateY(-100%);z-index:9999;background:#fff;border-radius:4px;-webkit-box-shadow:0 2px 8px rgba(0,0,0,.2);box-shadow:0 2px 8px rgba(0,0,0,.2);min-width:280px;max-width:350px;max-height:300px;overflow-y:auto}.native-tooltip[data-v-28c10d94] .tooltip-header{padding:8px 12px;background:#f5f5f5;font-weight:500;font-size:13px;border-bottom:1px solid #e0e0e0}.native-tooltip[data-v-28c10d94] .tooltip-list{padding:4px 0}.native-tooltip[data-v-28c10d94] .tooltip-item{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;padding:6px 12px;cursor:pointer;font-size:12px}.native-tooltip[data-v-28c10d94] .tooltip-item:hover{background:#e3f2fd}.native-tooltip[data-v-28c10d94] .tooltip-item .status-dot{width:8px;height:8px;border-radius:50%;margin-right:8px;-ms-flex-negative:0;flex-shrink:0}.native-tooltip[data-v-28c10d94] .tooltip-item .analysis-pk{color:#1976d2;font-weight:500}.native-tooltip[data-v-28c10d94] .tooltip-item .sep{margin:0 6px;color:#999}.native-tooltip[data-v-28c10d94] .tooltip-item .version{color:#666}.native-tooltip[data-v-28c10d94] .tooltip-item .assembly{color:#999}.native-tooltip[data-v-28c10d94] .tooltip-item .status-chip{margin-left:auto;padding:2px 6px;border-radius:3px;color:#fff;font-size:10px;font-weight:500}.native-tooltip[data-v-28c10d94] .experiment-group-header{padding:6px 12px 4px;font-size:11px;font-weight:600;color:#1976d2;background:#f8f9fa;border-top:1px solid #e0e0e0;font-family:monospace}.native-tooltip[data-v-28c10d94] .experiment-group-header:first-child{border-top:none}", ""]);
14707
14707
  // Exports
14708
14708
  /* harmony default export */ __webpack_exports__["default"] = (___CSS_LOADER_EXPORT___);
14709
14709
 
@@ -97326,19 +97326,19 @@ var update = add("f6fdb1b6", content, true, {"sourceMap":false,"shadowMode":fals
97326
97326
 
97327
97327
  /***/ }),
97328
97328
 
97329
- /***/ 99570:
97329
+ /***/ 82588:
97330
97330
  /***/ (function(module, __unused_webpack_exports, __webpack_require__) {
97331
97331
 
97332
97332
  // style-loader: Adds some css to the DOM by adding a <style> tag
97333
97333
 
97334
97334
  // load the styles
97335
- var content = __webpack_require__(58066);
97335
+ var content = __webpack_require__(8510);
97336
97336
  if(content.__esModule) content = content.default;
97337
97337
  if(typeof content === 'string') content = [[module.id, content, '']];
97338
97338
  if(content.locals) module.exports = content.locals;
97339
97339
  // add the styles to the DOM
97340
97340
  var add = (__webpack_require__(54402)/* ["default"] */ .Z)
97341
- var update = add("310bbf82", content, true, {"sourceMap":false,"shadowMode":false});
97341
+ var update = add("79f306ea", content, true, {"sourceMap":false,"shadowMode":false});
97342
97342
 
97343
97343
  /***/ }),
97344
97344
 
@@ -329939,10 +329939,10 @@ var ProjectMatrixModalvue_type_template_id_6865373b_scoped_true_staticRenderFns
329939
329939
 
329940
329940
  ;// CONCATENATED MODULE: ./src/components/projects/ProjectMatrixModal.vue?vue&type=template&id=6865373b&scoped=true&
329941
329941
 
329942
- ;// CONCATENATED MODULE: ./node_modules/babel-loader/lib/index.js??clonedRuleSet-82.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/templateLoader.js??ruleSet[1].rules[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/projects/ProjectMatrix.vue?vue&type=template&id=2742f691&scoped=true&
329942
+ ;// CONCATENATED MODULE: ./node_modules/babel-loader/lib/index.js??clonedRuleSet-82.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/templateLoader.js??ruleSet[1].rules[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/projects/ProjectMatrix.vue?vue&type=template&id=28c10d94&scoped=true&
329943
329943
  var cov_geimehe8j = function () {
329944
329944
  var path = "/Users/havasove/Desktop/repos/isabl_matrix/isabl_web/src/components/projects/ProjectMatrix.vue";
329945
- var hash = "6d5e6f72d2678492dbab470e36f9338523984f43";
329945
+ var hash = "a3c9c45073d167ae3a2510ad116feca13f8b05f9";
329946
329946
  var global = new Function("return this")();
329947
329947
  var gcv = "__coverage__";
329948
329948
  var coverageData = {
@@ -329985,7 +329985,7 @@ var cov_geimehe8j = function () {
329985
329985
  },
329986
329986
  end: {
329987
329987
  line: 5,
329988
- column: 1128
329988
+ column: 1131
329989
329989
  }
329990
329990
  },
329991
329991
  "4": {
@@ -330306,7 +330306,7 @@ var cov_geimehe8j = function () {
330306
330306
  },
330307
330307
  end: {
330308
330308
  line: 5,
330309
- column: 1124
330309
+ column: 1127
330310
330310
  }
330311
330311
  },
330312
330312
  type: "cond-expr",
@@ -330326,7 +330326,7 @@ var cov_geimehe8j = function () {
330326
330326
  },
330327
330327
  end: {
330328
330328
  line: 5,
330329
- column: 1124
330329
+ column: 1127
330330
330330
  }
330331
330331
  }],
330332
330332
  line: 1
@@ -330339,7 +330339,7 @@ var cov_geimehe8j = function () {
330339
330339
  },
330340
330340
  end: {
330341
330341
  line: 5,
330342
- column: 1124
330342
+ column: 1127
330343
330343
  }
330344
330344
  },
330345
330345
  type: "cond-expr",
@@ -330359,7 +330359,7 @@ var cov_geimehe8j = function () {
330359
330359
  },
330360
330360
  end: {
330361
330361
  line: 5,
330362
- column: 1124
330362
+ column: 1127
330363
330363
  }
330364
330364
  }],
330365
330365
  line: 1
@@ -330372,7 +330372,7 @@ var cov_geimehe8j = function () {
330372
330372
  },
330373
330373
  end: {
330374
330374
  line: 5,
330375
- column: 1124
330375
+ column: 1127
330376
330376
  }
330377
330377
  },
330378
330378
  type: "cond-expr",
@@ -330392,7 +330392,7 @@ var cov_geimehe8j = function () {
330392
330392
  },
330393
330393
  end: {
330394
330394
  line: 5,
330395
- column: 1124
330395
+ column: 1127
330396
330396
  }
330397
330397
  }],
330398
330398
  line: 1
@@ -330745,7 +330745,7 @@ var cov_geimehe8j = function () {
330745
330745
  "11": [0, 0]
330746
330746
  },
330747
330747
  _coverageSchema: "43e27e138ebf9cfc5966b082cf9a028302ed4184",
330748
- hash: "6d5e6f72d2678492dbab470e36f9338523984f43"
330748
+ hash: "a3c9c45073d167ae3a2510ad116feca13f8b05f9"
330749
330749
  };
330750
330750
  var coverage = global[gcv] || (global[gcv] = {});
330751
330751
  if (coverage[path] && coverage[path].hash === hash) {
@@ -330754,7 +330754,7 @@ var cov_geimehe8j = function () {
330754
330754
  return coverage[path] = coverageData;
330755
330755
  }();
330756
330756
  cov_geimehe8j.s[0]++;
330757
- var ProjectMatrixvue_type_template_id_2742f691_scoped_true_render = function render() {
330757
+ var ProjectMatrixvue_type_template_id_28c10d94_scoped_true_render = function render() {
330758
330758
  cov_geimehe8j.f[0]++;
330759
330759
  var _vm = (cov_geimehe8j.s[1]++, this),
330760
330760
  _c = (cov_geimehe8j.s[2]++, _vm._self._c);
@@ -330934,8 +330934,8 @@ var ProjectMatrixvue_type_template_id_2742f691_scoped_true_render = function ren
330934
330934
  }), _c('div', {
330935
330935
  ref: "tooltip",
330936
330936
  staticClass: "native-tooltip",
330937
- style: {
330938
- display: 'none'
330937
+ staticStyle: {
330938
+ "display": "none"
330939
330939
  },
330940
330940
  on: {
330941
330941
  "mouseenter": _vm.handleTooltipEnter,
@@ -330946,9 +330946,9 @@ var ProjectMatrixvue_type_template_id_2742f691_scoped_true_render = function ren
330946
330946
  staticClass: "tooltip-content"
330947
330947
  })])])))], 2);
330948
330948
  };
330949
- var ProjectMatrixvue_type_template_id_2742f691_scoped_true_staticRenderFns = (cov_geimehe8j.s[12]++, []);
330949
+ var ProjectMatrixvue_type_template_id_28c10d94_scoped_true_staticRenderFns = (cov_geimehe8j.s[12]++, []);
330950
330950
 
330951
- ;// CONCATENATED MODULE: ./src/components/projects/ProjectMatrix.vue?vue&type=template&id=2742f691&scoped=true&
330951
+ ;// CONCATENATED MODULE: ./src/components/projects/ProjectMatrix.vue?vue&type=template&id=28c10d94&scoped=true&
330952
330952
 
330953
330953
  ;// CONCATENATED MODULE: ./src/utils/matrixHelpers.js
330954
330954
  var cov_17wz1apxpu = function () {
@@ -341930,7 +341930,7 @@ var MatrixLegend_component = normalizeComponent(
341930
341930
  function ProjectMatrixvue_type_script_lang_js_typeof(obj) { "@babel/helpers - typeof"; return ProjectMatrixvue_type_script_lang_js_typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, ProjectMatrixvue_type_script_lang_js_typeof(obj); }
341931
341931
  var ProjectMatrixvue_type_script_lang_js_cov_geimehe8j = function () {
341932
341932
  var path = "/Users/havasove/Desktop/repos/isabl_matrix/isabl_web/src/components/projects/ProjectMatrix.vue";
341933
- var hash = "4d6068187e3b09b0395493ca183ae0ed262ae00e";
341933
+ var hash = "a0c0d0bf4b1dd7c7c1e69ed5b9fb98baf888abe6";
341934
341934
  var global = new Function("return this")();
341935
341935
  var gcv = "__coverage__";
341936
341936
  var coverageData = {
@@ -343328,251 +343328,261 @@ var ProjectMatrixvue_type_script_lang_js_cov_geimehe8j = function () {
343328
343328
  },
343329
343329
  "139": {
343330
343330
  start: {
343331
- line: 407,
343331
+ line: 404,
343332
+ column: 6
343333
+ },
343334
+ end: {
343335
+ line: 410,
343336
+ column: 8
343337
+ }
343338
+ },
343339
+ "140": {
343340
+ start: {
343341
+ line: 414,
343332
343342
  column: 22
343333
343343
  },
343334
343344
  end: {
343335
- line: 407,
343345
+ line: 414,
343336
343346
  column: 40
343337
343347
  }
343338
343348
  },
343339
- "140": {
343349
+ "141": {
343340
343350
  start: {
343341
- line: 408,
343351
+ line: 415,
343342
343352
  column: 6
343343
343353
  },
343344
343354
  end: {
343345
- line: 410,
343355
+ line: 417,
343346
343356
  column: 7
343347
343357
  }
343348
343358
  },
343349
- "141": {
343359
+ "142": {
343350
343360
  start: {
343351
- line: 409,
343361
+ line: 416,
343352
343362
  column: 8
343353
343363
  },
343354
343364
  end: {
343355
- line: 409,
343365
+ line: 416,
343356
343366
  column: 38
343357
343367
  }
343358
343368
  },
343359
- "142": {
343369
+ "143": {
343360
343370
  start: {
343361
- line: 417,
343371
+ line: 424,
343362
343372
  column: 27
343363
343373
  },
343364
343374
  end: {
343365
- line: 417,
343375
+ line: 424,
343366
343376
  column: 29
343367
343377
  }
343368
343378
  },
343369
- "143": {
343379
+ "144": {
343370
343380
  start: {
343371
- line: 418,
343381
+ line: 425,
343372
343382
  column: 6
343373
343383
  },
343374
343384
  end: {
343375
- line: 420,
343385
+ line: 427,
343376
343386
  column: 8
343377
343387
  }
343378
343388
  },
343379
- "144": {
343389
+ "145": {
343380
343390
  start: {
343381
- line: 419,
343391
+ line: 426,
343382
343392
  column: 8
343383
343393
  },
343384
343394
  end: {
343385
- line: 419,
343395
+ line: 426,
343386
343396
  column: 66
343387
343397
  }
343388
343398
  },
343389
- "145": {
343399
+ "146": {
343390
343400
  start: {
343391
- line: 423,
343401
+ line: 430,
343392
343402
  column: 21
343393
343403
  },
343394
343404
  end: {
343395
- line: 423,
343405
+ line: 430,
343396
343406
  column: 22
343397
343407
  }
343398
343408
  },
343399
- "146": {
343409
+ "147": {
343400
343410
  start: {
343401
- line: 424,
343411
+ line: 431,
343402
343412
  column: 30
343403
343413
  },
343404
343414
  end: {
343405
- line: 424,
343415
+ line: 431,
343406
343416
  column: 41
343407
343417
  }
343408
343418
  },
343409
- "147": {
343419
+ "148": {
343410
343420
  start: {
343411
- line: 425,
343421
+ line: 432,
343412
343422
  column: 6
343413
343423
  },
343414
343424
  end: {
343415
- line: 430,
343425
+ line: 437,
343416
343426
  column: 8
343417
343427
  }
343418
343428
  },
343419
- "148": {
343429
+ "149": {
343420
343430
  start: {
343421
- line: 426,
343431
+ line: 433,
343422
343432
  column: 8
343423
343433
  },
343424
343434
  end: {
343425
- line: 429,
343435
+ line: 436,
343426
343436
  column: 9
343427
343437
  }
343428
343438
  },
343429
- "149": {
343439
+ "150": {
343430
343440
  start: {
343431
- line: 427,
343441
+ line: 434,
343432
343442
  column: 10
343433
343443
  },
343434
343444
  end: {
343435
- line: 427,
343445
+ line: 434,
343436
343446
  column: 26
343437
343447
  }
343438
343448
  },
343439
- "150": {
343449
+ "151": {
343440
343450
  start: {
343441
- line: 428,
343451
+ line: 435,
343442
343452
  column: 10
343443
343453
  },
343444
343454
  end: {
343445
- line: 428,
343455
+ line: 435,
343446
343456
  column: 36
343447
343457
  }
343448
343458
  },
343449
- "151": {
343459
+ "152": {
343450
343460
  start: {
343451
- line: 432,
343461
+ line: 439,
343452
343462
  column: 6
343453
343463
  },
343454
343464
  end: {
343455
- line: 432,
343465
+ line: 439,
343456
343466
  column: 46
343457
343467
  }
343458
343468
  },
343459
- "152": {
343469
+ "153": {
343460
343470
  start: {
343461
- line: 436,
343471
+ line: 443,
343462
343472
  column: 6
343463
343473
  },
343464
343474
  end: {
343465
- line: 436,
343475
+ line: 443,
343466
343476
  column: 31
343467
343477
  }
343468
343478
  },
343469
- "153": {
343479
+ "154": {
343470
343480
  start: {
343471
- line: 440,
343481
+ line: 447,
343472
343482
  column: 6
343473
343483
  },
343474
343484
  end: {
343475
- line: 440,
343485
+ line: 447,
343476
343486
  column: 32
343477
343487
  }
343478
343488
  },
343479
- "154": {
343489
+ "155": {
343480
343490
  start: {
343481
- line: 441,
343491
+ line: 448,
343482
343492
  column: 6
343483
343493
  },
343484
343494
  end: {
343485
- line: 441,
343495
+ line: 448,
343486
343496
  column: 30
343487
343497
  }
343488
343498
  },
343489
- "155": {
343499
+ "156": {
343490
343500
  start: {
343491
- line: 445,
343501
+ line: 452,
343492
343502
  column: 22
343493
343503
  },
343494
343504
  end: {
343495
- line: 445,
343505
+ line: 452,
343496
343506
  column: 40
343497
343507
  }
343498
343508
  },
343499
- "156": {
343509
+ "157": {
343500
343510
  start: {
343501
- line: 448,
343511
+ line: 455,
343502
343512
  column: 6
343503
343513
  },
343504
343514
  end: {
343505
- line: 448,
343515
+ line: 455,
343506
343516
  column: 59
343507
343517
  }
343508
343518
  },
343509
- "157": {
343519
+ "158": {
343510
343520
  start: {
343511
- line: 448,
343521
+ line: 455,
343512
343522
  column: 53
343513
343523
  },
343514
343524
  end: {
343515
- line: 448,
343525
+ line: 455,
343516
343526
  column: 59
343517
343527
  }
343518
343528
  },
343519
- "158": {
343529
+ "159": {
343520
343530
  start: {
343521
- line: 451,
343531
+ line: 458,
343522
343532
  column: 6
343523
343533
  },
343524
343534
  end: {
343525
- line: 451,
343535
+ line: 458,
343526
343536
  column: 67
343527
343537
  }
343528
343538
  },
343529
- "159": {
343539
+ "160": {
343530
343540
  start: {
343531
- line: 451,
343541
+ line: 458,
343532
343542
  column: 61
343533
343543
  },
343534
343544
  end: {
343535
- line: 451,
343545
+ line: 458,
343536
343546
  column: 67
343537
343547
  }
343538
343548
  },
343539
- "160": {
343549
+ "161": {
343540
343550
  start: {
343541
- line: 454,
343551
+ line: 461,
343542
343552
  column: 6
343543
343553
  },
343544
343554
  end: {
343545
- line: 454,
343555
+ line: 461,
343546
343556
  column: 30
343547
343557
  }
343548
343558
  },
343549
- "161": {
343559
+ "162": {
343550
343560
  start: {
343551
- line: 458,
343561
+ line: 465,
343552
343562
  column: 30
343553
343563
  },
343554
343564
  end: {
343555
- line: 458,
343565
+ line: 465,
343556
343566
  column: 56
343557
343567
  }
343558
343568
  },
343559
- "162": {
343569
+ "163": {
343560
343570
  start: {
343561
- line: 459,
343571
+ line: 466,
343562
343572
  column: 6
343563
343573
  },
343564
343574
  end: {
343565
- line: 461,
343575
+ line: 468,
343566
343576
  column: 7
343567
343577
  }
343568
343578
  },
343569
- "163": {
343579
+ "164": {
343570
343580
  start: {
343571
- line: 460,
343581
+ line: 467,
343572
343582
  column: 8
343573
343583
  },
343574
343584
  end: {
343575
- line: 460,
343585
+ line: 467,
343576
343586
  column: 32
343577
343587
  }
343578
343588
  }
@@ -344460,7 +344470,7 @@ var ProjectMatrixvue_type_script_lang_js_cov_geimehe8j = function () {
344460
344470
  column: 37
344461
344471
  },
344462
344472
  end: {
344463
- line: 404,
344473
+ line: 411,
344464
344474
  column: 5
344465
344475
  }
344466
344476
  },
@@ -344614,169 +344624,169 @@ var ProjectMatrixvue_type_script_lang_js_cov_geimehe8j = function () {
344614
344624
  name: "(anonymous_43)",
344615
344625
  decl: {
344616
344626
  start: {
344617
- line: 406,
344627
+ line: 413,
344618
344628
  column: 4
344619
344629
  },
344620
344630
  end: {
344621
- line: 406,
344631
+ line: 413,
344622
344632
  column: 5
344623
344633
  }
344624
344634
  },
344625
344635
  loc: {
344626
344636
  start: {
344627
- line: 406,
344637
+ line: 413,
344628
344638
  column: 24
344629
344639
  },
344630
344640
  end: {
344631
- line: 411,
344641
+ line: 418,
344632
344642
  column: 5
344633
344643
  }
344634
344644
  },
344635
- line: 406
344645
+ line: 413
344636
344646
  },
344637
344647
  "44": {
344638
344648
  name: "(anonymous_44)",
344639
344649
  decl: {
344640
344650
  start: {
344641
- line: 415,
344651
+ line: 422,
344642
344652
  column: 4
344643
344653
  },
344644
344654
  end: {
344645
- line: 415,
344655
+ line: 422,
344646
344656
  column: 5
344647
344657
  }
344648
344658
  },
344649
344659
  loc: {
344650
344660
  start: {
344651
- line: 415,
344661
+ line: 422,
344652
344662
  column: 34
344653
344663
  },
344654
344664
  end: {
344655
- line: 433,
344665
+ line: 440,
344656
344666
  column: 5
344657
344667
  }
344658
344668
  },
344659
- line: 415
344669
+ line: 422
344660
344670
  },
344661
344671
  "45": {
344662
344672
  name: "(anonymous_45)",
344663
344673
  decl: {
344664
344674
  start: {
344665
- line: 418,
344675
+ line: 425,
344666
344676
  column: 23
344667
344677
  },
344668
344678
  end: {
344669
- line: 418,
344679
+ line: 425,
344670
344680
  column: 24
344671
344681
  }
344672
344682
  },
344673
344683
  loc: {
344674
344684
  start: {
344675
- line: 418,
344685
+ line: 425,
344676
344686
  column: 28
344677
344687
  },
344678
344688
  end: {
344679
- line: 420,
344689
+ line: 427,
344680
344690
  column: 7
344681
344691
  }
344682
344692
  },
344683
- line: 418
344693
+ line: 425
344684
344694
  },
344685
344695
  "46": {
344686
344696
  name: "(anonymous_46)",
344687
344697
  decl: {
344688
344698
  start: {
344689
- line: 425,
344699
+ line: 432,
344690
344700
  column: 43
344691
344701
  },
344692
344702
  end: {
344693
- line: 425,
344703
+ line: 432,
344694
344704
  column: 44
344695
344705
  }
344696
344706
  },
344697
344707
  loc: {
344698
344708
  start: {
344699
- line: 425,
344709
+ line: 432,
344700
344710
  column: 64
344701
344711
  },
344702
344712
  end: {
344703
- line: 430,
344713
+ line: 437,
344704
344714
  column: 7
344705
344715
  }
344706
344716
  },
344707
- line: 425
344717
+ line: 432
344708
344718
  },
344709
344719
  "47": {
344710
344720
  name: "(anonymous_47)",
344711
344721
  decl: {
344712
344722
  start: {
344713
- line: 435,
344723
+ line: 442,
344714
344724
  column: 4
344715
344725
  },
344716
344726
  end: {
344717
- line: 435,
344727
+ line: 442,
344718
344728
  column: 5
344719
344729
  }
344720
344730
  },
344721
344731
  loc: {
344722
344732
  start: {
344723
- line: 435,
344733
+ line: 442,
344724
344734
  column: 25
344725
344735
  },
344726
344736
  end: {
344727
- line: 437,
344737
+ line: 444,
344728
344738
  column: 5
344729
344739
  }
344730
344740
  },
344731
- line: 435
344741
+ line: 442
344732
344742
  },
344733
344743
  "48": {
344734
344744
  name: "(anonymous_48)",
344735
344745
  decl: {
344736
344746
  start: {
344737
- line: 439,
344747
+ line: 446,
344738
344748
  column: 4
344739
344749
  },
344740
344750
  end: {
344741
- line: 439,
344751
+ line: 446,
344742
344752
  column: 5
344743
344753
  }
344744
344754
  },
344745
344755
  loc: {
344746
344756
  start: {
344747
- line: 439,
344757
+ line: 446,
344748
344758
  column: 25
344749
344759
  },
344750
344760
  end: {
344751
- line: 442,
344761
+ line: 449,
344752
344762
  column: 5
344753
344763
  }
344754
344764
  },
344755
- line: 439
344765
+ line: 446
344756
344766
  },
344757
344767
  "49": {
344758
344768
  name: "(anonymous_49)",
344759
344769
  decl: {
344760
344770
  start: {
344761
- line: 444,
344771
+ line: 451,
344762
344772
  column: 4
344763
344773
  },
344764
344774
  end: {
344765
- line: 444,
344775
+ line: 451,
344766
344776
  column: 5
344767
344777
  }
344768
344778
  },
344769
344779
  loc: {
344770
344780
  start: {
344771
- line: 444,
344781
+ line: 451,
344772
344782
  column: 31
344773
344783
  },
344774
344784
  end: {
344775
- line: 462,
344785
+ line: 469,
344776
344786
  column: 5
344777
344787
  }
344778
344788
  },
344779
- line: 444
344789
+ line: 451
344780
344790
  }
344781
344791
  },
344782
344792
  branchMap: {
@@ -346031,266 +346041,266 @@ var ProjectMatrixvue_type_script_lang_js_cov_geimehe8j = function () {
346031
346041
  "37": {
346032
346042
  loc: {
346033
346043
  start: {
346034
- line: 408,
346044
+ line: 415,
346035
346045
  column: 6
346036
346046
  },
346037
346047
  end: {
346038
- line: 410,
346048
+ line: 417,
346039
346049
  column: 7
346040
346050
  }
346041
346051
  },
346042
346052
  type: "if",
346043
346053
  locations: [{
346044
346054
  start: {
346045
- line: 408,
346055
+ line: 415,
346046
346056
  column: 6
346047
346057
  },
346048
346058
  end: {
346049
- line: 410,
346059
+ line: 417,
346050
346060
  column: 7
346051
346061
  }
346052
346062
  }, {
346053
346063
  start: {
346054
- line: 408,
346064
+ line: 415,
346055
346065
  column: 6
346056
346066
  },
346057
346067
  end: {
346058
- line: 410,
346068
+ line: 417,
346059
346069
  column: 7
346060
346070
  }
346061
346071
  }],
346062
- line: 408
346072
+ line: 415
346063
346073
  },
346064
346074
  "38": {
346065
346075
  loc: {
346066
346076
  start: {
346067
- line: 419,
346077
+ line: 426,
346068
346078
  column: 34
346069
346079
  },
346070
346080
  end: {
346071
- line: 419,
346081
+ line: 426,
346072
346082
  column: 61
346073
346083
  }
346074
346084
  },
346075
346085
  type: "binary-expr",
346076
346086
  locations: [{
346077
346087
  start: {
346078
- line: 419,
346088
+ line: 426,
346079
346089
  column: 34
346080
346090
  },
346081
346091
  end: {
346082
- line: 419,
346092
+ line: 426,
346083
346093
  column: 56
346084
346094
  }
346085
346095
  }, {
346086
346096
  start: {
346087
- line: 419,
346097
+ line: 426,
346088
346098
  column: 60
346089
346099
  },
346090
346100
  end: {
346091
- line: 419,
346101
+ line: 426,
346092
346102
  column: 61
346093
346103
  }
346094
346104
  }],
346095
- line: 419
346105
+ line: 426
346096
346106
  },
346097
346107
  "39": {
346098
346108
  loc: {
346099
346109
  start: {
346100
- line: 426,
346110
+ line: 433,
346101
346111
  column: 8
346102
346112
  },
346103
346113
  end: {
346104
- line: 429,
346114
+ line: 436,
346105
346115
  column: 9
346106
346116
  }
346107
346117
  },
346108
346118
  type: "if",
346109
346119
  locations: [{
346110
346120
  start: {
346111
- line: 426,
346121
+ line: 433,
346112
346122
  column: 8
346113
346123
  },
346114
346124
  end: {
346115
- line: 429,
346125
+ line: 436,
346116
346126
  column: 9
346117
346127
  }
346118
346128
  }, {
346119
346129
  start: {
346120
- line: 426,
346130
+ line: 433,
346121
346131
  column: 8
346122
346132
  },
346123
346133
  end: {
346124
- line: 429,
346134
+ line: 436,
346125
346135
  column: 9
346126
346136
  }
346127
346137
  }],
346128
- line: 426
346138
+ line: 433
346129
346139
  },
346130
346140
  "40": {
346131
346141
  loc: {
346132
346142
  start: {
346133
- line: 448,
346143
+ line: 455,
346134
346144
  column: 6
346135
346145
  },
346136
346146
  end: {
346137
- line: 448,
346147
+ line: 455,
346138
346148
  column: 59
346139
346149
  }
346140
346150
  },
346141
346151
  type: "if",
346142
346152
  locations: [{
346143
346153
  start: {
346144
- line: 448,
346154
+ line: 455,
346145
346155
  column: 6
346146
346156
  },
346147
346157
  end: {
346148
- line: 448,
346158
+ line: 455,
346149
346159
  column: 59
346150
346160
  }
346151
346161
  }, {
346152
346162
  start: {
346153
- line: 448,
346163
+ line: 455,
346154
346164
  column: 6
346155
346165
  },
346156
346166
  end: {
346157
- line: 448,
346167
+ line: 455,
346158
346168
  column: 59
346159
346169
  }
346160
346170
  }],
346161
- line: 448
346171
+ line: 455
346162
346172
  },
346163
346173
  "41": {
346164
346174
  loc: {
346165
346175
  start: {
346166
- line: 448,
346176
+ line: 455,
346167
346177
  column: 10
346168
346178
  },
346169
346179
  end: {
346170
- line: 448,
346180
+ line: 455,
346171
346181
  column: 51
346172
346182
  }
346173
346183
  },
346174
346184
  type: "binary-expr",
346175
346185
  locations: [{
346176
346186
  start: {
346177
- line: 448,
346187
+ line: 455,
346178
346188
  column: 10
346179
346189
  },
346180
346190
  end: {
346181
- line: 448,
346191
+ line: 455,
346182
346192
  column: 17
346183
346193
  }
346184
346194
  }, {
346185
346195
  start: {
346186
- line: 448,
346196
+ line: 455,
346187
346197
  column: 21
346188
346198
  },
346189
346199
  end: {
346190
- line: 448,
346200
+ line: 455,
346191
346201
  column: 51
346192
346202
  }
346193
346203
  }],
346194
- line: 448
346204
+ line: 455
346195
346205
  },
346196
346206
  "42": {
346197
346207
  loc: {
346198
346208
  start: {
346199
- line: 451,
346209
+ line: 458,
346200
346210
  column: 6
346201
346211
  },
346202
346212
  end: {
346203
- line: 451,
346213
+ line: 458,
346204
346214
  column: 67
346205
346215
  }
346206
346216
  },
346207
346217
  type: "if",
346208
346218
  locations: [{
346209
346219
  start: {
346210
- line: 451,
346220
+ line: 458,
346211
346221
  column: 6
346212
346222
  },
346213
346223
  end: {
346214
- line: 451,
346224
+ line: 458,
346215
346225
  column: 67
346216
346226
  }
346217
346227
  }, {
346218
346228
  start: {
346219
- line: 451,
346229
+ line: 458,
346220
346230
  column: 6
346221
346231
  },
346222
346232
  end: {
346223
- line: 451,
346233
+ line: 458,
346224
346234
  column: 67
346225
346235
  }
346226
346236
  }],
346227
- line: 451
346237
+ line: 458
346228
346238
  },
346229
346239
  "43": {
346230
346240
  loc: {
346231
346241
  start: {
346232
- line: 459,
346242
+ line: 466,
346233
346243
  column: 6
346234
346244
  },
346235
346245
  end: {
346236
- line: 461,
346246
+ line: 468,
346237
346247
  column: 7
346238
346248
  }
346239
346249
  },
346240
346250
  type: "if",
346241
346251
  locations: [{
346242
346252
  start: {
346243
- line: 459,
346253
+ line: 466,
346244
346254
  column: 6
346245
346255
  },
346246
346256
  end: {
346247
- line: 461,
346257
+ line: 468,
346248
346258
  column: 7
346249
346259
  }
346250
346260
  }, {
346251
346261
  start: {
346252
- line: 459,
346262
+ line: 466,
346253
346263
  column: 6
346254
346264
  },
346255
346265
  end: {
346256
- line: 461,
346266
+ line: 468,
346257
346267
  column: 7
346258
346268
  }
346259
346269
  }],
346260
- line: 459
346270
+ line: 466
346261
346271
  },
346262
346272
  "44": {
346263
346273
  loc: {
346264
346274
  start: {
346265
- line: 459,
346275
+ line: 466,
346266
346276
  column: 10
346267
346277
  },
346268
346278
  end: {
346269
- line: 459,
346279
+ line: 466,
346270
346280
  column: 67
346271
346281
  }
346272
346282
  },
346273
346283
  type: "binary-expr",
346274
346284
  locations: [{
346275
346285
  start: {
346276
- line: 459,
346286
+ line: 466,
346277
346287
  column: 10
346278
346288
  },
346279
346289
  end: {
346280
- line: 459,
346290
+ line: 466,
346281
346291
  column: 25
346282
346292
  }
346283
346293
  }, {
346284
346294
  start: {
346285
- line: 459,
346295
+ line: 466,
346286
346296
  column: 29
346287
346297
  },
346288
346298
  end: {
346289
- line: 459,
346299
+ line: 466,
346290
346300
  column: 67
346291
346301
  }
346292
346302
  }],
346293
- line: 459
346303
+ line: 466
346294
346304
  }
346295
346305
  },
346296
346306
  s: {
@@ -346457,7 +346467,8 @@ var ProjectMatrixvue_type_script_lang_js_cov_geimehe8j = function () {
346457
346467
  "160": 0,
346458
346468
  "161": 0,
346459
346469
  "162": 0,
346460
- "163": 0
346470
+ "163": 0,
346471
+ "164": 0
346461
346472
  },
346462
346473
  f: {
346463
346474
  "0": 0,
@@ -346562,13 +346573,13 @@ var ProjectMatrixvue_type_script_lang_js_cov_geimehe8j = function () {
346562
346573
  version: 3,
346563
346574
  sources: ["ProjectMatrix.vue"],
346564
346575
  names: [],
346565
- mappings: ";AAmJA;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;;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;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;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;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA",
346576
+ mappings: ";AAmJA;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;;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;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;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;;AAEA;AACA;;AAEA;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;;AAEA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA",
346566
346577
  file: "ProjectMatrix.vue",
346567
346578
  sourceRoot: "src/components/projects",
346568
- sourcesContent: ["<template>\n <div class=\"project-matrix\">\n <!-- Loading State -->\n <div v-if=\"loading\" class=\"loading-container\">\n <v-progress-circular indeterminate color=\"primary\" size=\"48\" />\n <div class=\"text-body-2 grey--text mt-3\">Loading matrix data...</div>\n </div>\n\n <!-- Error State -->\n <v-alert v-else-if=\"error\" type=\"error\" class=\"ma-4\">\n {{ error }}\n </v-alert>\n\n <!-- Empty State (only when no data at all, not due to filters) -->\n <v-alert v-else-if=\"!loading && matrixData.rows.length === 0\" type=\"info\" class=\"ma-4\">\n No {{ viewMode === 'individual' ? 'individuals' : 'experiments' }} or analyses found for this project.\n </v-alert>\n\n <!-- Matrix Content (always show when we have data) -->\n <template v-else>\n <!-- Filters -->\n <matrix-filters\n :view-mode=\"viewMode\"\n :statuses=\"filters.statuses\"\n :selected-columns=\"filters.selectedColumns\"\n :experiment-search=\"filters.experimentSearch\"\n :assemblies=\"filters.assemblies\"\n :techniques=\"filters.techniques\"\n :identifier-list=\"filters.identifierList\"\n :matched-identifier-count=\"matchedIdentifierCount\"\n :available-statuses=\"availableStatuses\"\n :available-columns=\"matrixData.columns\"\n :available-assemblies=\"availableAssemblies\"\n :available-techniques=\"availableTechniques\"\n :available-rows=\"matrixData.rows\"\n :hide-empty-rows=\"hideEmptyRows\"\n :has-active-filters=\"hasActiveFilters\"\n :has-highlights=\"hasHighlights\"\n :is-refreshing=\"refreshing\"\n @update:viewMode=\"handleViewModeChange\"\n @update:filters=\"updateFilters\"\n @update:hideEmptyRows=\"hideEmptyRows = $event\"\n @update-identifier-list=\"updateIdentifierList\"\n @clear-identifier-list=\"clearIdentifierList\"\n @clear-filters=\"clearFilters\"\n @clear-highlights=\"clearHighlights\"\n @refresh=\"refreshData\"\n />\n\n <!-- Spacer for visual separation -->\n <div class=\"filter-spacer\"></div>\n\n <!-- Matrix Grid -->\n <div\n class=\"matrix-scroll-container\"\n ref=\"scrollContainer\"\n >\n <!-- No matches message (inline, when filters exclude all results) -->\n <div v-if=\"filteredData.rows.length === 0 && hasActiveFilters\" class=\"no-matches-message\">\n <v-icon small color=\"grey\" class=\"mr-1\">mdi-filter-off</v-icon>\n No results match your filters\n </div>\n\n <template v-else>\n <!-- Header Row (CSS Grid for proper overflow of angled text) -->\n <div class=\"header-row\" :style=\"{ '--col-count': filteredData.columns.length }\">\n <div class=\"corner-cell\"></div>\n <div\n v-for=\"col in filteredData.columns\"\n :key=\"`header-${col}`\"\n class=\"header-cell\"\n :class=\"{ 'column-highlighted': highlightedColumnsMap[col] }\"\n @click=\"toggleColumnHighlight(col)\"\n >\n <span class=\"header-text\" :title=\"col\">{{ col }}</span>\n </div>\n </div>\n\n <!-- Data Table (same column widths as header) -->\n <table class=\"matrix-table\">\n <tbody>\n <tr v-for=\"row in filteredData.rows\" :key=\"row\">\n <td\n class=\"row-header\"\n :class=\"{ 'row-highlighted': highlightedRowsMap[row] }\"\n @click=\"toggleRowHighlight(row)\"\n >\n <span class=\"system-id\" :title=\"row\">{{ row }}</span>\n </td>\n <td\n v-for=\"col in filteredData.columns\"\n :key=\"col\"\n class=\"matrix-cell\"\n :class=\"{\n 'has-analyses': filteredData.cells[row]?.[col]?.length > 0,\n 'cell-highlighted': highlightedRowsMap[row] || highlightedColumnsMap[col],\n 'cell-selected': selectedCell && selectedCell.row === row && selectedCell.col === col\n }\"\n :data-row=\"row\"\n :data-col=\"col\"\n @click=\"handleCellClick($event, row, col)\"\n >\n <template v-if=\"filteredData.cells[row]?.[col]?.length\">\n <!-- Show stripes for small counts (\u2264 8) -->\n <div v-if=\"filteredData.cells[row][col].length <= 8\" class=\"cell-stripes\">\n <div\n v-for=\"(analysis, index) in filteredData.cells[row][col]\"\n :key=\"`${analysis.pk}-${analysis.experimentSystemId || ''}-${index}`\"\n class=\"stripe\"\n :style=\"{ backgroundColor: getStatusColor(analysis.status) }\"\n />\n </div>\n <!-- Show count badge for large counts (> 8) -->\n <div v-else class=\"cell-count-badge\" :style=\"{ backgroundColor: getPredominantColor(filteredData.cells[row][col]) }\">\n {{ filteredData.cells[row][col].length }}\n </div>\n </template>\n <span v-else class=\"empty-cell\">-</span>\n </td>\n </tr>\n </tbody>\n </table>\n </template>\n </div>\n\n <!-- Legend -->\n <matrix-legend\n :active-statuses=\"availableStatuses\"\n :view-mode=\"viewMode\"\n :stats=\"matrixStats\"\n />\n\n <!-- Native DOM Tooltip (bypasses Vue reactivity) -->\n <div\n ref=\"tooltip\"\n class=\"native-tooltip\"\n :style=\"{ display: 'none' }\"\n @mouseenter=\"handleTooltipEnter\"\n @mouseleave=\"handleTooltipLeave\"\n >\n <div class=\"tooltip-content\" ref=\"tooltipContent\"></div>\n </div>\n </template>\n </div>\n</template>\n\n<script>\nimport { fetchAllRecords } from '@/utils/api'\nimport {\n buildMatrixData,\n filterMatrixData,\n getStatusColor\n} from '@/utils/matrixHelpers'\nimport MatrixFilters from './MatrixFilters.vue'\nimport MatrixLegend from './MatrixLegend.vue'\n\nexport default {\n name: 'ProjectMatrix',\n components: {\n MatrixFilters,\n MatrixLegend\n },\n props: {\n projectId: {\n type: [String, Number],\n required: true\n }\n },\n data() {\n return {\n loading: false,\n refreshing: false,\n filtering: false,\n error: null,\n experiments: [],\n analyses: [],\n viewMode: 'experiment', // 'experiment' | 'individual'\n lockedProjectId: this.projectId, // Lock to initial project ID to prevent changes while modal is open\n matrixData: {\n rows: [],\n columns: [],\n cells: {},\n appVersions: {},\n viewMode: 'experiment',\n stats: {\n totalRows: 0,\n totalApps: 0,\n totalAnalyses: 0,\n byStatus: {},\n uniqueStatuses: [],\n uniqueAssemblies: [],\n uniqueTechniques: []\n }\n },\n filteredData: {\n rows: [],\n columns: [],\n cells: {},\n appVersions: {}\n },\n filters: {\n statuses: [],\n selectedColumns: [],\n experimentSearch: '',\n assemblies: [],\n techniques: [],\n identifierList: []\n },\n hideEmptyRows: false,\n highlightedRows: new Set(),\n highlightedColumns: new Set(),\n // Tooltip state (for native DOM tooltip)\n isOverTooltip: false,\n // Selected cell state\n selectedCell: null // { row, col }\n }\n },\n computed: {\n availableStatuses() {\n // Use pre-calculated stats from matrixData (avoids expensive iteration)\n return this.matrixData.stats?.uniqueStatuses || []\n },\n availableAssemblies() {\n // Use pre-calculated stats from matrixData\n return this.matrixData.stats?.uniqueAssemblies || []\n },\n availableTechniques() {\n // Use pre-calculated stats from matrixData\n return this.matrixData.stats?.uniqueTechniques || []\n },\n matrixStats() {\n // Use pre-calculated stats from matrixData (avoids expensive iteration on filter changes)\n // Note: Shows total stats, not filtered stats (for performance)\n const stats = this.matrixData.stats || {}\n return {\n totalRows: stats.totalRows || 0,\n totalApps: stats.totalApps || 0,\n totalAnalyses: stats.totalAnalyses || 0\n }\n },\n hasActiveFilters() {\n const columnsFiltered = this.filters.selectedColumns.length > 0 &&\n this.filters.selectedColumns.length < this.matrixData.columns.length\n return (\n this.filters.statuses.length > 0 ||\n columnsFiltered ||\n this.filters.experimentSearch ||\n this.filters.assemblies.length > 0 ||\n this.filters.techniques.length > 0 ||\n this.filters.identifierList.length > 0\n )\n },\n // Memoized highlight maps for O(1) lookup\n highlightedRowsMap() {\n const map = {}\n this.highlightedRows.forEach(r => { map[r] = true })\n return map\n },\n highlightedColumnsMap() {\n const map = {}\n this.highlightedColumns.forEach(c => { map[c] = true })\n return map\n },\n hasHighlights() {\n return this.highlightedRows.size > 0 || this.highlightedColumns.size > 0\n },\n // Count how many identifiers from the list actually exist in the data\n matchedIdentifierCount() {\n if (this.filters.identifierList.length === 0) return 0\n\n // Build case-insensitive set of all row IDs in the matrix\n const rowSet = new Set(\n this.matrixData.rows.map(row => row.toLowerCase())\n )\n\n // Count how many identifiers from the list exist in the data\n return this.filters.identifierList.filter(id =>\n rowSet.has(id.toLowerCase())\n ).length\n }\n },\n watch: {\n projectId: {\n immediate: true,\n handler(newId, oldId) {\n // Only fetch data on initial load (when oldId is undefined)\n // Ignore subsequent changes to keep matrix locked to original project\n if (oldId === undefined) {\n this.fetchData()\n }\n }\n },\n filters: {\n deep: true,\n handler() {\n this.applyFilters()\n }\n },\n hideEmptyRows() {\n this.applyFilters()\n },\n matrixData() {\n this.applyFilters()\n },\n 'filteredData.rows'() {\n // Reset scroll when data changes\n if (this.$refs.scrollContainer) {\n this.$refs.scrollContainer.scrollTop = 0\n }\n }\n },\n mounted() {\n // Close tooltip when clicking outside\n document.addEventListener('click', this.handleDocumentClick)\n },\n beforeDestroy() {\n document.removeEventListener('click', this.handleDocumentClick)\n },\n methods: {\n async fetchData(isRefresh = false) {\n // Set appropriate loading state\n if (isRefresh) {\n this.refreshing = true\n } else {\n this.loading = true\n }\n this.error = null\n\n // Store current filters before fetch (for refresh)\n const currentFilters = isRefresh ? { ...this.filters } : null\n\n try {\n // Fetch all experiments and analyses (with pagination)\n // Use lockedProjectId to prevent refetching if prop changes while modal is open\n const [experimentsRes, analysesRes] = await Promise.all([\n fetchAllRecords('experiments', {\n projects__pk: this.lockedProjectId,\n 'fields!': 'results,analytics,raw_data,bam_files'\n }),\n fetchAllRecords('analyses', {\n targets__projects__pk: this.lockedProjectId,\n 'fields!': 'targets,references,analytics,results'\n })\n ])\n\n this.experiments = experimentsRes.results || []\n this.analyses = analysesRes.results || []\n\n // Build matrix data and freeze it to prevent Vue reactivity overhead\n this.rebuildMatrixData()\n\n // Initialize selected columns to all columns (show all by default on initial load)\n // On refresh, restore previous filters\n if (isRefresh && currentFilters) {\n // Restore filters but ensure selectedColumns are still valid\n this.filters = {\n ...currentFilters,\n // Keep only columns that still exist after refresh\n selectedColumns: currentFilters.selectedColumns.filter(col =>\n this.matrixData.columns.includes(col)\n )\n }\n // If all selected columns were removed, default to all\n if (this.filters.selectedColumns.length === 0) {\n this.filters.selectedColumns = [...this.matrixData.columns]\n }\n } else {\n this.filters.selectedColumns = [...this.matrixData.columns]\n }\n } catch (err) {\n this.error = `Failed to load data: ${err.message}`\n console.error('Error loading matrix data:', err)\n } finally {\n if (isRefresh) {\n this.refreshing = false\n } else {\n this.loading = false\n }\n }\n },\n\n async refreshData() {\n await this.fetchData(true)\n },\n\n async applyFilters() {\n // Use requestAnimationFrame to yield to browser and prevent UI blocking\n await new Promise(resolve => requestAnimationFrame(resolve))\n\n // Filter matrix data (already frozen internally)\n // Include hideEmptyRows from component state\n this.filteredData = filterMatrixData(this.matrixData, {\n ...this.filters,\n hideEmptyRows: this.hideEmptyRows\n })\n },\n\n updateFilters(newFilters) {\n this.filters = { ...newFilters }\n },\n\n updateIdentifierList(identifiers) {\n this.filters.identifierList = identifiers\n },\n\n clearIdentifierList() {\n this.filters.identifierList = []\n },\n\n handleViewModeChange(newMode) {\n this.viewMode = newMode\n // Clear highlights and selection when switching views\n this.highlightedRows = new Set()\n this.highlightedColumns = new Set()\n this.selectedCell = null\n this.hideTooltipNative()\n // Rebuild matrix data with new view mode\n this.rebuildMatrixData()\n },\n\n rebuildMatrixData() {\n // buildMatrixData already freezes everything internally for performance\n this.matrixData = buildMatrixData(this.experiments, this.analyses, this.viewMode)\n // The watcher on matrixData will automatically call applyFilters()\n },\n\n handleOpenAnalysis(analysisId) {\n this.hideTooltipNative()\n this.$emit('open-analysis', analysisId)\n },\n\n toggleRowHighlight(row) {\n const newSet = new Set(this.highlightedRows)\n if (newSet.has(row)) {\n newSet.delete(row)\n } else {\n newSet.add(row)\n }\n this.highlightedRows = newSet\n },\n\n toggleColumnHighlight(col) {\n const newSet = new Set(this.highlightedColumns)\n if (newSet.has(col)) {\n newSet.delete(col)\n } else {\n newSet.add(col)\n }\n this.highlightedColumns = newSet\n },\n\n clearHighlights() {\n this.highlightedRows = new Set()\n this.highlightedColumns = new Set()\n },\n\n clearFilters() {\n this.filters = {\n statuses: [],\n selectedColumns: [],\n experimentSearch: '',\n assemblies: [],\n techniques: [],\n identifierList: []\n }\n },\n\n // Cell click handler - uses native DOM to avoid Vue re-renders\n handleCellClick(event, row, col) {\n console.log('handleCellClick called:', { row, col })\n const analyses = this.filteredData.cells[row]?.[col] || []\n console.log('analyses:', analyses.length)\n if (analyses.length === 0) return\n\n // Set selected cell\n this.selectedCell = { row, col }\n\n const rect = event.currentTarget.getBoundingClientRect()\n const tooltip = this.$refs.tooltip\n const content = this.$refs.tooltipContent\n\n console.log('tooltip ref:', !!tooltip, 'content ref:', !!content)\n if (!tooltip || !content) return\n\n // Store analyses for later use\n this._currentAnalyses = analyses\n\n // Build tooltip HTML directly (no Vue reactivity)\n const appName = analyses[0]?.application?.name || 'Unknown'\n let html = `<div class=\"tooltip-header\">${appName} - ${analyses.length} analysis${analyses.length !== 1 ? 'es' : ''}</div>`\n html += '<div class=\"tooltip-list\">'\n\n if (this.viewMode === 'individual') {\n // Group analyses by experiment for individual view\n const byExperiment = {}\n analyses.forEach(a => {\n const expId = a.experimentSystemId || 'Unknown'\n if (!byExperiment[expId]) {\n byExperiment[expId] = []\n }\n byExperiment[expId].push(a)\n })\n\n // Render grouped by experiment\n Object.entries(byExperiment).forEach(([expId, expAnalyses]) => {\n html += `<div class=\"experiment-group-header\">${expId}</div>`\n expAnalyses.forEach(a => {\n const color = this.getStatusColor(a.status)\n html += `<div class=\"tooltip-item\" data-pk=\"${a.pk}\">`\n html += `<span class=\"status-dot\" style=\"background:${color}\"></span>`\n html += `<span class=\"analysis-pk\">${a.pk}</span>`\n html += `<span class=\"sep\">|</span>`\n html += `<span class=\"version\">v${a.version || 'N/A'}</span>`\n if (a.assembly) html += `<span class=\"assembly\"> \xB7 ${a.assembly}</span>`\n html += `<span class=\"status-chip\" style=\"background:${color}\">${a.status}</span>`\n html += '</div>'\n })\n })\n } else {\n // Flat list for experiment view\n analyses.forEach(a => {\n const color = this.getStatusColor(a.status)\n html += `<div class=\"tooltip-item\" data-pk=\"${a.pk}\">`\n html += `<span class=\"status-dot\" style=\"background:${color}\"></span>`\n html += `<span class=\"analysis-pk\">${a.pk}</span>`\n html += `<span class=\"sep\">|</span>`\n html += `<span class=\"version\">v${a.version || 'N/A'}</span>`\n if (a.assembly) html += `<span class=\"assembly\"> \xB7 ${a.assembly}</span>`\n html += `<span class=\"status-chip\" style=\"background:${color}\">${a.status}</span>`\n html += '</div>'\n })\n }\n\n html += '</div>'\n content.innerHTML = html\n\n // Add click handlers to items\n content.querySelectorAll('.tooltip-item').forEach(item => {\n item.onclick = () => {\n const pk = parseInt(item.dataset.pk)\n this.hideTooltipNative()\n this.handleOpenAnalysis(pk)\n }\n })\n\n // Position and show tooltip\n tooltip.style.display = 'block'\n tooltip.style.left = `${rect.left + rect.width / 2}px`\n tooltip.style.top = `${rect.top - 8}px`\n },\n\n hideTooltipNative() {\n const tooltip = this.$refs.tooltip\n if (tooltip) {\n tooltip.style.display = 'none'\n }\n },\n\n getStatusColor,\n\n getPredominantColor(analyses) {\n // Count occurrences of each status\n const statusCounts = {}\n analyses.forEach(a => {\n statusCounts[a.status] = (statusCounts[a.status] || 0) + 1\n })\n\n // Find the most common status\n let maxCount = 0\n let predominantStatus = 'SUCCEEDED' // default\n Object.entries(statusCounts).forEach(([status, count]) => {\n if (count > maxCount) {\n maxCount = count\n predominantStatus = status\n }\n })\n\n return getStatusColor(predominantStatus)\n },\n\n handleTooltipEnter() {\n this.isOverTooltip = true\n },\n\n handleTooltipLeave() {\n this.isOverTooltip = false\n this.hideTooltipNative()\n },\n\n handleDocumentClick(event) {\n const tooltip = this.$refs.tooltip\n\n // Check if click was inside tooltip\n if (tooltip && tooltip.contains(event.target)) return\n\n // Check if click was on a matrix cell (this opens tooltip, don't close it)\n if (event.target.closest('.matrix-cell.has-analyses')) return\n\n // Hide tooltip if visible\n this.hideTooltipNative()\n\n // Only clear selection if clicking inside the matrix scroll container\n // (not when clicking tabs, filters, etc.)\n const scrollContainer = this.$refs.scrollContainer\n if (scrollContainer && scrollContainer.contains(event.target)) {\n this.selectedCell = null\n }\n }\n }\n}\n</script>\n\n<style scoped>\n.project-matrix {\n display: flex;\n flex-direction: column;\n height: 100%;\n min-height: 400px;\n}\n\n.loading-container {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n min-height: 300px;\n}\n\n.filter-spacer {\n height: 16px;\n background: white;\n}\n\n.matrix-scroll-container {\n flex: 1;\n overflow: auto;\n max-height: calc(80vh - 180px);\n}\n\n.no-matches-message {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 24px;\n color: #666;\n font-size: 13px;\n}\n\n.matrix-table {\n border-collapse: separate;\n border-spacing: 0;\n table-layout: fixed;\n}\n\n/* Header row - CSS Grid for proper text overflow */\n.header-row {\n display: grid;\n grid-template-columns: 200px repeat(var(--col-count), 50px);\n position: sticky;\n top: 0;\n z-index: 10;\n background: white;\n min-width: fit-content;\n}\n\n/* Corner cell - top-left */\n.corner-cell {\n position: sticky;\n left: 0;\n z-index: 11;\n background: white;\n border-bottom: 2px solid #5b5dff;\n border-right: 2px solid #5b5dff;\n height: 130px;\n width: 200px;\n box-sizing: border-box;\n}\n\n/* Column headers - angled text */\n.header-cell {\n position: relative;\n height: 130px;\n width: 50px;\n border-bottom: 2px solid #5b5dff;\n background: white;\n overflow: visible;\n cursor: pointer;\n}\n\n.header-cell:hover .header-text {\n background: #FFF6DB;\n border-radius: 2px;\n}\n\n.header-cell.column-highlighted .header-text {\n background: #FFF0D9;\n border-radius: 2px;\n font-weight: 700;\n color: #000;\n}\n\n.header-text {\n position: absolute;\n bottom: 8px;\n left: 50%;\n transform: rotate(-45deg);\n transform-origin: bottom left;\n white-space: nowrap;\n font-size: 11px;\n font-weight: 500;\n color: #333;\n z-index: 1;\n}\n\n/* Row headers - width must match corner-cell (200px) */\ntd.row-header {\n position: sticky;\n left: 0;\n z-index: 1;\n background: white;\n border-right: 2px solid #5b5dff;\n padding: 0 8px;\n width: 200px;\n min-width: 200px;\n max-width: 200px;\n height: 24px;\n border-bottom: 1px solid #e0e0e0;\n cursor: pointer;\n vertical-align: middle;\n box-sizing: border-box;\n}\n\n.row-header.row-highlighted {\n background: #FFE8C5 !important;\n}\n\n.row-header.row-highlighted .system-id {\n font-weight: 700;\n color: #000;\n}\n\n.system-id {\n font-size: 11px;\n font-family: monospace;\n color: #333;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n/* Hover highlight for row header */\n.row-header:hover {\n background: #FFF0D9;\n}\n\n.row-header:hover .system-id {\n font-weight: 600;\n}\n\n/* Table cell styles - width must match header-cell (50px) */\ntd.matrix-cell {\n width: 50px;\n min-width: 50px;\n max-width: 50px;\n height: 24px;\n border-right: 1px solid #e0e0e0;\n border-bottom: 1px solid #e0e0e0;\n cursor: default;\n background: #fafafa;\n padding: 0;\n vertical-align: middle;\n box-sizing: border-box;\n}\n\n.matrix-cell.has-analyses {\n cursor: pointer;\n background: white;\n}\n\n.matrix-cell.has-analyses:hover,\n.matrix-cell.cell-selected {\n border-right-color: #5b5dff;\n border-bottom-color: #5b5dff;\n background: #f0f0ff;\n}\n\n.matrix-cell.cell-highlighted {\n background: #FFE8C5;\n}\n\n.cell-stripes {\n display: flex;\n align-items: stretch;\n justify-content: center;\n gap: 1px;\n height: 100%;\n width: 100%;\n padding: 2px 4px;\n}\n\n.stripe {\n flex: 0 0 auto;\n width: 3px;\n min-width: 2px;\n max-width: 5px;\n border-radius: 1px;\n}\n\n.cell-count-badge {\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n width: 100%;\n color: white;\n font-size: 10px;\n font-weight: 600;\n text-shadow: 0 0 2px rgba(0, 0, 0, 0.3);\n}\n\n.empty-cell {\n display: flex;\n align-items: center;\n justify-content: center;\n color: #ccc;\n font-size: 10px;\n height: 100%;\n}\n\n/* Native tooltip styles - use ::v-deep for dynamically generated content */\n.native-tooltip {\n position: fixed;\n transform: translateX(-50%) translateY(-100%);\n z-index: 9999;\n background: white;\n border-radius: 4px;\n box-shadow: 0 2px 8px rgba(0,0,0,0.2);\n min-width: 280px;\n max-width: 350px;\n max-height: 300px;\n overflow-y: auto;\n}\n\n.native-tooltip ::v-deep .tooltip-header {\n padding: 8px 12px;\n background: #f5f5f5;\n font-weight: 500;\n font-size: 13px;\n border-bottom: 1px solid #e0e0e0;\n}\n\n.native-tooltip ::v-deep .tooltip-list {\n padding: 4px 0;\n}\n\n.native-tooltip ::v-deep .tooltip-item {\n display: flex;\n align-items: center;\n padding: 6px 12px;\n cursor: pointer;\n font-size: 12px;\n}\n\n.native-tooltip ::v-deep .tooltip-item:hover {\n background: #e3f2fd;\n}\n\n.native-tooltip ::v-deep .tooltip-item .status-dot {\n width: 8px;\n height: 8px;\n border-radius: 50%;\n margin-right: 8px;\n flex-shrink: 0;\n}\n\n.native-tooltip ::v-deep .tooltip-item .analysis-pk {\n color: #1976d2;\n font-weight: 500;\n}\n\n.native-tooltip ::v-deep .tooltip-item .sep {\n margin: 0 6px;\n color: #999;\n}\n\n.native-tooltip ::v-deep .tooltip-item .version {\n color: #666;\n}\n\n.native-tooltip ::v-deep .tooltip-item .assembly {\n color: #999;\n}\n\n.native-tooltip ::v-deep .tooltip-item .status-chip {\n margin-left: auto;\n padding: 2px 6px;\n border-radius: 3px;\n color: white;\n font-size: 10px;\n font-weight: 500;\n}\n\n.native-tooltip ::v-deep .experiment-group-header {\n padding: 6px 12px 4px;\n font-size: 11px;\n font-weight: 600;\n color: #1976d2;\n background: #f8f9fa;\n border-top: 1px solid #e0e0e0;\n font-family: monospace;\n}\n\n.native-tooltip ::v-deep .experiment-group-header:first-child {\n border-top: none;\n}\n</style>\n"]
346579
+ sourcesContent: ["<template>\n <div class=\"project-matrix\">\n <!-- Loading State -->\n <div v-if=\"loading\" class=\"loading-container\">\n <v-progress-circular indeterminate color=\"primary\" size=\"48\" />\n <div class=\"text-body-2 grey--text mt-3\">Loading matrix data...</div>\n </div>\n\n <!-- Error State -->\n <v-alert v-else-if=\"error\" type=\"error\" class=\"ma-4\">\n {{ error }}\n </v-alert>\n\n <!-- Empty State (only when no data at all, not due to filters) -->\n <v-alert v-else-if=\"!loading && matrixData.rows.length === 0\" type=\"info\" class=\"ma-4\">\n No {{ viewMode === 'individual' ? 'individuals' : 'experiments' }} or analyses found for this project.\n </v-alert>\n\n <!-- Matrix Content (always show when we have data) -->\n <template v-else>\n <!-- Filters -->\n <matrix-filters\n :view-mode=\"viewMode\"\n :statuses=\"filters.statuses\"\n :selected-columns=\"filters.selectedColumns\"\n :experiment-search=\"filters.experimentSearch\"\n :assemblies=\"filters.assemblies\"\n :techniques=\"filters.techniques\"\n :identifier-list=\"filters.identifierList\"\n :matched-identifier-count=\"matchedIdentifierCount\"\n :available-statuses=\"availableStatuses\"\n :available-columns=\"matrixData.columns\"\n :available-assemblies=\"availableAssemblies\"\n :available-techniques=\"availableTechniques\"\n :available-rows=\"matrixData.rows\"\n :hide-empty-rows=\"hideEmptyRows\"\n :has-active-filters=\"hasActiveFilters\"\n :has-highlights=\"hasHighlights\"\n :is-refreshing=\"refreshing\"\n @update:viewMode=\"handleViewModeChange\"\n @update:filters=\"updateFilters\"\n @update:hideEmptyRows=\"hideEmptyRows = $event\"\n @update-identifier-list=\"updateIdentifierList\"\n @clear-identifier-list=\"clearIdentifierList\"\n @clear-filters=\"clearFilters\"\n @clear-highlights=\"clearHighlights\"\n @refresh=\"refreshData\"\n />\n\n <!-- Spacer for visual separation -->\n <div class=\"filter-spacer\"></div>\n\n <!-- Matrix Grid -->\n <div\n class=\"matrix-scroll-container\"\n ref=\"scrollContainer\"\n >\n <!-- No matches message (inline, when filters exclude all results) -->\n <div v-if=\"filteredData.rows.length === 0 && hasActiveFilters\" class=\"no-matches-message\">\n <v-icon small color=\"grey\" class=\"mr-1\">mdi-filter-off</v-icon>\n No results match your filters\n </div>\n\n <template v-else>\n <!-- Header Row (CSS Grid for proper overflow of angled text) -->\n <div class=\"header-row\" :style=\"{ '--col-count': filteredData.columns.length }\">\n <div class=\"corner-cell\"></div>\n <div\n v-for=\"col in filteredData.columns\"\n :key=\"`header-${col}`\"\n class=\"header-cell\"\n :class=\"{ 'column-highlighted': highlightedColumnsMap[col] }\"\n @click=\"toggleColumnHighlight(col)\"\n >\n <span class=\"header-text\" :title=\"col\">{{ col }}</span>\n </div>\n </div>\n\n <!-- Data Table (same column widths as header) -->\n <table class=\"matrix-table\">\n <tbody>\n <tr v-for=\"row in filteredData.rows\" :key=\"row\">\n <td\n class=\"row-header\"\n :class=\"{ 'row-highlighted': highlightedRowsMap[row] }\"\n @click=\"toggleRowHighlight(row)\"\n >\n <span class=\"system-id\" :title=\"row\">{{ row }}</span>\n </td>\n <td\n v-for=\"col in filteredData.columns\"\n :key=\"col\"\n class=\"matrix-cell\"\n :class=\"{\n 'has-analyses': filteredData.cells[row]?.[col]?.length > 0,\n 'cell-highlighted': highlightedRowsMap[row] || highlightedColumnsMap[col],\n 'cell-selected': selectedCell && selectedCell.row === row && selectedCell.col === col\n }\"\n :data-row=\"row\"\n :data-col=\"col\"\n @click=\"handleCellClick($event, row, col)\"\n >\n <template v-if=\"filteredData.cells[row]?.[col]?.length\">\n <!-- Show stripes for small counts (\u2264 8) -->\n <div v-if=\"filteredData.cells[row][col].length <= 8\" class=\"cell-stripes\">\n <div\n v-for=\"(analysis, index) in filteredData.cells[row][col]\"\n :key=\"`${analysis.pk}-${analysis.experimentSystemId || ''}-${index}`\"\n class=\"stripe\"\n :style=\"{ backgroundColor: getStatusColor(analysis.status) }\"\n />\n </div>\n <!-- Show count badge for large counts (> 8) -->\n <div v-else class=\"cell-count-badge\" :style=\"{ backgroundColor: getPredominantColor(filteredData.cells[row][col]) }\">\n {{ filteredData.cells[row][col].length }}\n </div>\n </template>\n <span v-else class=\"empty-cell\">-</span>\n </td>\n </tr>\n </tbody>\n </table>\n </template>\n </div>\n\n <!-- Legend -->\n <matrix-legend\n :active-statuses=\"availableStatuses\"\n :view-mode=\"viewMode\"\n :stats=\"matrixStats\"\n />\n\n <!-- Native DOM Tooltip (bypasses Vue reactivity) -->\n <div\n ref=\"tooltip\"\n class=\"native-tooltip\"\n style=\"display: none;\"\n @mouseenter=\"handleTooltipEnter\"\n @mouseleave=\"handleTooltipLeave\"\n >\n <div class=\"tooltip-content\" ref=\"tooltipContent\"></div>\n </div>\n </template>\n </div>\n</template>\n\n<script>\nimport { fetchAllRecords } from '@/utils/api'\nimport {\n buildMatrixData,\n filterMatrixData,\n getStatusColor\n} from '@/utils/matrixHelpers'\nimport MatrixFilters from './MatrixFilters.vue'\nimport MatrixLegend from './MatrixLegend.vue'\n\nexport default {\n name: 'ProjectMatrix',\n components: {\n MatrixFilters,\n MatrixLegend\n },\n props: {\n projectId: {\n type: [String, Number],\n required: true\n }\n },\n data() {\n return {\n loading: false,\n refreshing: false,\n filtering: false,\n error: null,\n experiments: [],\n analyses: [],\n viewMode: 'experiment', // 'experiment' | 'individual'\n lockedProjectId: this.projectId, // Lock to initial project ID to prevent changes while modal is open\n matrixData: {\n rows: [],\n columns: [],\n cells: {},\n appVersions: {},\n viewMode: 'experiment',\n stats: {\n totalRows: 0,\n totalApps: 0,\n totalAnalyses: 0,\n byStatus: {},\n uniqueStatuses: [],\n uniqueAssemblies: [],\n uniqueTechniques: []\n }\n },\n filteredData: {\n rows: [],\n columns: [],\n cells: {},\n appVersions: {}\n },\n filters: {\n statuses: [],\n selectedColumns: [],\n experimentSearch: '',\n assemblies: [],\n techniques: [],\n identifierList: []\n },\n hideEmptyRows: false,\n highlightedRows: new Set(),\n highlightedColumns: new Set(),\n // Tooltip state (for native DOM tooltip)\n isOverTooltip: false,\n // Selected cell state\n selectedCell: null // { row, col }\n }\n },\n computed: {\n availableStatuses() {\n // Use pre-calculated stats from matrixData (avoids expensive iteration)\n return this.matrixData.stats?.uniqueStatuses || []\n },\n availableAssemblies() {\n // Use pre-calculated stats from matrixData\n return this.matrixData.stats?.uniqueAssemblies || []\n },\n availableTechniques() {\n // Use pre-calculated stats from matrixData\n return this.matrixData.stats?.uniqueTechniques || []\n },\n matrixStats() {\n // Use pre-calculated stats from matrixData (avoids expensive iteration on filter changes)\n // Note: Shows total stats, not filtered stats (for performance)\n const stats = this.matrixData.stats || {}\n return {\n totalRows: stats.totalRows || 0,\n totalApps: stats.totalApps || 0,\n totalAnalyses: stats.totalAnalyses || 0\n }\n },\n hasActiveFilters() {\n const columnsFiltered = this.filters.selectedColumns.length > 0 &&\n this.filters.selectedColumns.length < this.matrixData.columns.length\n return (\n this.filters.statuses.length > 0 ||\n columnsFiltered ||\n this.filters.experimentSearch ||\n this.filters.assemblies.length > 0 ||\n this.filters.techniques.length > 0 ||\n this.filters.identifierList.length > 0\n )\n },\n // Memoized highlight maps for O(1) lookup\n highlightedRowsMap() {\n const map = {}\n this.highlightedRows.forEach(r => { map[r] = true })\n return map\n },\n highlightedColumnsMap() {\n const map = {}\n this.highlightedColumns.forEach(c => { map[c] = true })\n return map\n },\n hasHighlights() {\n return this.highlightedRows.size > 0 || this.highlightedColumns.size > 0\n },\n // Count how many identifiers from the list actually exist in the data\n matchedIdentifierCount() {\n if (this.filters.identifierList.length === 0) return 0\n\n // Build case-insensitive set of all row IDs in the matrix\n const rowSet = new Set(\n this.matrixData.rows.map(row => row.toLowerCase())\n )\n\n // Count how many identifiers from the list exist in the data\n return this.filters.identifierList.filter(id =>\n rowSet.has(id.toLowerCase())\n ).length\n }\n },\n watch: {\n projectId: {\n immediate: true,\n handler(newId, oldId) {\n // Only fetch data on initial load (when oldId is undefined)\n // Ignore subsequent changes to keep matrix locked to original project\n if (oldId === undefined) {\n this.fetchData()\n }\n }\n },\n filters: {\n deep: true,\n handler() {\n this.applyFilters()\n }\n },\n hideEmptyRows() {\n this.applyFilters()\n },\n matrixData() {\n this.applyFilters()\n },\n 'filteredData.rows'() {\n // Reset scroll when data changes\n if (this.$refs.scrollContainer) {\n this.$refs.scrollContainer.scrollTop = 0\n }\n }\n },\n mounted() {\n // Close tooltip when clicking outside\n document.addEventListener('click', this.handleDocumentClick)\n },\n beforeDestroy() {\n document.removeEventListener('click', this.handleDocumentClick)\n },\n methods: {\n async fetchData(isRefresh = false) {\n // Set appropriate loading state\n if (isRefresh) {\n this.refreshing = true\n } else {\n this.loading = true\n }\n this.error = null\n\n // Store current filters before fetch (for refresh)\n const currentFilters = isRefresh ? { ...this.filters } : null\n\n try {\n // Fetch all experiments and analyses (with pagination)\n // Use lockedProjectId to prevent refetching if prop changes while modal is open\n const [experimentsRes, analysesRes] = await Promise.all([\n fetchAllRecords('experiments', {\n projects__pk: this.lockedProjectId,\n 'fields!': 'results,analytics,raw_data,bam_files'\n }),\n fetchAllRecords('analyses', {\n targets__projects__pk: this.lockedProjectId,\n 'fields!': 'targets,references,analytics,results'\n })\n ])\n\n this.experiments = experimentsRes.results || []\n this.analyses = analysesRes.results || []\n\n // Build matrix data and freeze it to prevent Vue reactivity overhead\n this.rebuildMatrixData()\n\n // Initialize selected columns to all columns (show all by default on initial load)\n // On refresh, restore previous filters\n if (isRefresh && currentFilters) {\n // Restore filters but ensure selectedColumns are still valid\n this.filters = {\n ...currentFilters,\n // Keep only columns that still exist after refresh\n selectedColumns: currentFilters.selectedColumns.filter(col =>\n this.matrixData.columns.includes(col)\n )\n }\n // If all selected columns were removed, default to all\n if (this.filters.selectedColumns.length === 0) {\n this.filters.selectedColumns = [...this.matrixData.columns]\n }\n } else {\n this.filters.selectedColumns = [...this.matrixData.columns]\n }\n } catch (err) {\n this.error = `Failed to load data: ${err.message}`\n console.error('Error loading matrix data:', err)\n } finally {\n if (isRefresh) {\n this.refreshing = false\n } else {\n this.loading = false\n }\n }\n },\n\n async refreshData() {\n await this.fetchData(true)\n },\n\n async applyFilters() {\n // Use requestAnimationFrame to yield to browser and prevent UI blocking\n await new Promise(resolve => requestAnimationFrame(resolve))\n\n // Filter matrix data (already frozen internally)\n // Include hideEmptyRows from component state\n this.filteredData = filterMatrixData(this.matrixData, {\n ...this.filters,\n hideEmptyRows: this.hideEmptyRows\n })\n },\n\n updateFilters(newFilters) {\n this.filters = { ...newFilters }\n },\n\n updateIdentifierList(identifiers) {\n this.filters.identifierList = identifiers\n },\n\n clearIdentifierList() {\n this.filters.identifierList = []\n },\n\n handleViewModeChange(newMode) {\n this.viewMode = newMode\n // Clear highlights and selection when switching views\n this.highlightedRows = new Set()\n this.highlightedColumns = new Set()\n this.selectedCell = null\n this.hideTooltipNative()\n // Rebuild matrix data with new view mode\n this.rebuildMatrixData()\n },\n\n rebuildMatrixData() {\n // buildMatrixData already freezes everything internally for performance\n this.matrixData = buildMatrixData(this.experiments, this.analyses, this.viewMode)\n // The watcher on matrixData will automatically call applyFilters()\n },\n\n handleOpenAnalysis(analysisId) {\n this.hideTooltipNative()\n this.$emit('open-analysis', analysisId)\n },\n\n toggleRowHighlight(row) {\n const newSet = new Set(this.highlightedRows)\n if (newSet.has(row)) {\n newSet.delete(row)\n } else {\n newSet.add(row)\n }\n this.highlightedRows = newSet\n },\n\n toggleColumnHighlight(col) {\n const newSet = new Set(this.highlightedColumns)\n if (newSet.has(col)) {\n newSet.delete(col)\n } else {\n newSet.add(col)\n }\n this.highlightedColumns = newSet\n },\n\n clearHighlights() {\n this.highlightedRows = new Set()\n this.highlightedColumns = new Set()\n },\n\n clearFilters() {\n this.filters = {\n statuses: [],\n selectedColumns: [],\n experimentSearch: '',\n assemblies: [],\n techniques: [],\n identifierList: []\n }\n },\n\n // Cell click handler - uses native DOM to avoid Vue re-renders\n handleCellClick(event, row, col) {\n console.log('handleCellClick called:', { row, col })\n const analyses = this.filteredData.cells[row]?.[col] || []\n console.log('analyses:', analyses.length)\n if (analyses.length === 0) return\n\n // Set selected cell\n this.selectedCell = { row, col }\n\n const rect = event.currentTarget.getBoundingClientRect()\n const tooltip = this.$refs.tooltip\n const content = this.$refs.tooltipContent\n\n console.log('tooltip ref:', !!tooltip, 'content ref:', !!content)\n if (!tooltip || !content) return\n\n // Store analyses for later use\n this._currentAnalyses = analyses\n\n // Build tooltip HTML directly (no Vue reactivity)\n const appName = analyses[0]?.application?.name || 'Unknown'\n let html = `<div class=\"tooltip-header\">${appName} - ${analyses.length} analysis${analyses.length !== 1 ? 'es' : ''}</div>`\n html += '<div class=\"tooltip-list\">'\n\n if (this.viewMode === 'individual') {\n // Group analyses by experiment for individual view\n const byExperiment = {}\n analyses.forEach(a => {\n const expId = a.experimentSystemId || 'Unknown'\n if (!byExperiment[expId]) {\n byExperiment[expId] = []\n }\n byExperiment[expId].push(a)\n })\n\n // Render grouped by experiment\n Object.entries(byExperiment).forEach(([expId, expAnalyses]) => {\n html += `<div class=\"experiment-group-header\">${expId}</div>`\n expAnalyses.forEach(a => {\n const color = this.getStatusColor(a.status)\n html += `<div class=\"tooltip-item\" data-pk=\"${a.pk}\">`\n html += `<span class=\"status-dot\" style=\"background:${color}\"></span>`\n html += `<span class=\"analysis-pk\">${a.pk}</span>`\n html += `<span class=\"sep\">|</span>`\n html += `<span class=\"version\">v${a.version || 'N/A'}</span>`\n if (a.assembly) html += `<span class=\"assembly\"> \xB7 ${a.assembly}</span>`\n html += `<span class=\"status-chip\" style=\"background:${color}\">${a.status}</span>`\n html += '</div>'\n })\n })\n } else {\n // Flat list for experiment view\n analyses.forEach(a => {\n const color = this.getStatusColor(a.status)\n html += `<div class=\"tooltip-item\" data-pk=\"${a.pk}\">`\n html += `<span class=\"status-dot\" style=\"background:${color}\"></span>`\n html += `<span class=\"analysis-pk\">${a.pk}</span>`\n html += `<span class=\"sep\">|</span>`\n html += `<span class=\"version\">v${a.version || 'N/A'}</span>`\n if (a.assembly) html += `<span class=\"assembly\"> \xB7 ${a.assembly}</span>`\n html += `<span class=\"status-chip\" style=\"background:${color}\">${a.status}</span>`\n html += '</div>'\n })\n }\n\n html += '</div>'\n content.innerHTML = html\n\n // Add click handlers to items\n content.querySelectorAll('.tooltip-item').forEach(item => {\n item.onclick = () => {\n const pk = parseInt(item.dataset.pk)\n this.hideTooltipNative()\n this.handleOpenAnalysis(pk)\n }\n })\n\n // Position and show tooltip\n tooltip.style.display = 'block'\n tooltip.style.left = `${rect.left + rect.width / 2}px`\n tooltip.style.top = `${rect.top - 8}px`\n console.log('tooltip positioned at:', {\n left: tooltip.style.left,\n top: tooltip.style.top,\n rectTop: rect.top,\n rectLeft: rect.left,\n display: tooltip.style.display\n })\n },\n\n hideTooltipNative() {\n const tooltip = this.$refs.tooltip\n if (tooltip) {\n tooltip.style.display = 'none'\n }\n },\n\n getStatusColor,\n\n getPredominantColor(analyses) {\n // Count occurrences of each status\n const statusCounts = {}\n analyses.forEach(a => {\n statusCounts[a.status] = (statusCounts[a.status] || 0) + 1\n })\n\n // Find the most common status\n let maxCount = 0\n let predominantStatus = 'SUCCEEDED' // default\n Object.entries(statusCounts).forEach(([status, count]) => {\n if (count > maxCount) {\n maxCount = count\n predominantStatus = status\n }\n })\n\n return getStatusColor(predominantStatus)\n },\n\n handleTooltipEnter() {\n this.isOverTooltip = true\n },\n\n handleTooltipLeave() {\n this.isOverTooltip = false\n this.hideTooltipNative()\n },\n\n handleDocumentClick(event) {\n const tooltip = this.$refs.tooltip\n\n // Check if click was inside tooltip\n if (tooltip && tooltip.contains(event.target)) return\n\n // Check if click was on a matrix cell (this opens tooltip, don't close it)\n if (event.target.closest('.matrix-cell.has-analyses')) return\n\n // Hide tooltip if visible\n this.hideTooltipNative()\n\n // Only clear selection if clicking inside the matrix scroll container\n // (not when clicking tabs, filters, etc.)\n const scrollContainer = this.$refs.scrollContainer\n if (scrollContainer && scrollContainer.contains(event.target)) {\n this.selectedCell = null\n }\n }\n }\n}\n</script>\n\n<style scoped>\n.project-matrix {\n display: flex;\n flex-direction: column;\n height: 100%;\n min-height: 400px;\n}\n\n.loading-container {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n min-height: 300px;\n}\n\n.filter-spacer {\n height: 16px;\n background: white;\n}\n\n.matrix-scroll-container {\n flex: 1;\n overflow: auto;\n max-height: calc(80vh - 180px);\n}\n\n.no-matches-message {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 24px;\n color: #666;\n font-size: 13px;\n}\n\n.matrix-table {\n border-collapse: separate;\n border-spacing: 0;\n table-layout: fixed;\n}\n\n/* Header row - CSS Grid for proper text overflow */\n.header-row {\n display: grid;\n grid-template-columns: 200px repeat(var(--col-count), 50px);\n position: sticky;\n top: 0;\n z-index: 10;\n background: white;\n min-width: fit-content;\n}\n\n/* Corner cell - top-left */\n.corner-cell {\n position: sticky;\n left: 0;\n z-index: 11;\n background: white;\n border-bottom: 2px solid #5b5dff;\n border-right: 2px solid #5b5dff;\n height: 130px;\n width: 200px;\n box-sizing: border-box;\n}\n\n/* Column headers - angled text */\n.header-cell {\n position: relative;\n height: 130px;\n width: 50px;\n border-bottom: 2px solid #5b5dff;\n background: white;\n overflow: visible;\n cursor: pointer;\n}\n\n.header-cell:hover .header-text {\n background: #FFF6DB;\n border-radius: 2px;\n}\n\n.header-cell.column-highlighted .header-text {\n background: #FFF0D9;\n border-radius: 2px;\n font-weight: 700;\n color: #000;\n}\n\n.header-text {\n position: absolute;\n bottom: 8px;\n left: 50%;\n transform: rotate(-45deg);\n transform-origin: bottom left;\n white-space: nowrap;\n font-size: 11px;\n font-weight: 500;\n color: #333;\n z-index: 1;\n}\n\n/* Row headers - width must match corner-cell (200px) */\ntd.row-header {\n position: sticky;\n left: 0;\n z-index: 1;\n background: white;\n border-right: 2px solid #5b5dff;\n padding: 0 8px;\n width: 200px;\n min-width: 200px;\n max-width: 200px;\n height: 24px;\n border-bottom: 1px solid #e0e0e0;\n cursor: pointer;\n vertical-align: middle;\n box-sizing: border-box;\n}\n\n.row-header.row-highlighted {\n background: #FFE8C5 !important;\n}\n\n.row-header.row-highlighted .system-id {\n font-weight: 700;\n color: #000;\n}\n\n.system-id {\n font-size: 11px;\n font-family: monospace;\n color: #333;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n\n/* Hover highlight for row header */\n.row-header:hover {\n background: #FFF0D9;\n}\n\n.row-header:hover .system-id {\n font-weight: 600;\n}\n\n/* Table cell styles - width must match header-cell (50px) */\ntd.matrix-cell {\n width: 50px;\n min-width: 50px;\n max-width: 50px;\n height: 24px;\n border-right: 1px solid #e0e0e0;\n border-bottom: 1px solid #e0e0e0;\n cursor: default;\n background: #fafafa;\n padding: 0;\n vertical-align: middle;\n box-sizing: border-box;\n}\n\n.matrix-cell.has-analyses {\n cursor: pointer;\n background: white;\n}\n\n.matrix-cell.has-analyses:hover,\n.matrix-cell.cell-selected {\n border-right-color: #5b5dff;\n border-bottom-color: #5b5dff;\n background: #f0f0ff;\n}\n\n.matrix-cell.cell-highlighted {\n background: #FFE8C5;\n}\n\n.cell-stripes {\n display: flex;\n align-items: stretch;\n justify-content: center;\n gap: 1px;\n height: 100%;\n width: 100%;\n padding: 2px 4px;\n}\n\n.stripe {\n flex: 0 0 auto;\n width: 3px;\n min-width: 2px;\n max-width: 5px;\n border-radius: 1px;\n}\n\n.cell-count-badge {\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n width: 100%;\n color: white;\n font-size: 10px;\n font-weight: 600;\n text-shadow: 0 0 2px rgba(0, 0, 0, 0.3);\n}\n\n.empty-cell {\n display: flex;\n align-items: center;\n justify-content: center;\n color: #ccc;\n font-size: 10px;\n height: 100%;\n}\n\n/* Native tooltip styles - use ::v-deep for dynamically generated content */\n.native-tooltip {\n position: fixed;\n transform: translateX(-50%) translateY(-100%);\n z-index: 9999;\n background: white;\n border-radius: 4px;\n box-shadow: 0 2px 8px rgba(0,0,0,0.2);\n min-width: 280px;\n max-width: 350px;\n max-height: 300px;\n overflow-y: auto;\n}\n\n.native-tooltip ::v-deep .tooltip-header {\n padding: 8px 12px;\n background: #f5f5f5;\n font-weight: 500;\n font-size: 13px;\n border-bottom: 1px solid #e0e0e0;\n}\n\n.native-tooltip ::v-deep .tooltip-list {\n padding: 4px 0;\n}\n\n.native-tooltip ::v-deep .tooltip-item {\n display: flex;\n align-items: center;\n padding: 6px 12px;\n cursor: pointer;\n font-size: 12px;\n}\n\n.native-tooltip ::v-deep .tooltip-item:hover {\n background: #e3f2fd;\n}\n\n.native-tooltip ::v-deep .tooltip-item .status-dot {\n width: 8px;\n height: 8px;\n border-radius: 50%;\n margin-right: 8px;\n flex-shrink: 0;\n}\n\n.native-tooltip ::v-deep .tooltip-item .analysis-pk {\n color: #1976d2;\n font-weight: 500;\n}\n\n.native-tooltip ::v-deep .tooltip-item .sep {\n margin: 0 6px;\n color: #999;\n}\n\n.native-tooltip ::v-deep .tooltip-item .version {\n color: #666;\n}\n\n.native-tooltip ::v-deep .tooltip-item .assembly {\n color: #999;\n}\n\n.native-tooltip ::v-deep .tooltip-item .status-chip {\n margin-left: auto;\n padding: 2px 6px;\n border-radius: 3px;\n color: white;\n font-size: 10px;\n font-weight: 500;\n}\n\n.native-tooltip ::v-deep .experiment-group-header {\n padding: 6px 12px 4px;\n font-size: 11px;\n font-weight: 600;\n color: #1976d2;\n background: #f8f9fa;\n border-top: 1px solid #e0e0e0;\n font-family: monospace;\n}\n\n.native-tooltip ::v-deep .experiment-group-header:first-child {\n border-top: none;\n}\n</style>\n"]
346569
346580
  },
346570
346581
  _coverageSchema: "43e27e138ebf9cfc5966b082cf9a028302ed4184",
346571
- hash: "4d6068187e3b09b0395493ca183ae0ed262ae00e"
346582
+ hash: "a0c0d0bf4b1dd7c7c1e69ed5b9fb98baf888abe6"
346572
346583
  };
346573
346584
  var coverage = global[gcv] || (global[gcv] = {});
346574
346585
  if (coverage[path] && coverage[path].hash === hash) {
@@ -347241,14 +347252,22 @@ function ProjectMatrixvue_type_script_lang_js_asyncToGenerator(fn) { return func
347241
347252
  tooltip.style.left = "".concat(rect.left + rect.width / 2, "px");
347242
347253
  ProjectMatrixvue_type_script_lang_js_cov_geimehe8j.s[138]++;
347243
347254
  tooltip.style.top = "".concat(rect.top - 8, "px");
347255
+ ProjectMatrixvue_type_script_lang_js_cov_geimehe8j.s[139]++;
347256
+ console.log('tooltip positioned at:', {
347257
+ left: tooltip.style.left,
347258
+ top: tooltip.style.top,
347259
+ rectTop: rect.top,
347260
+ rectLeft: rect.left,
347261
+ display: tooltip.style.display
347262
+ });
347244
347263
  },
347245
347264
  hideTooltipNative: function hideTooltipNative() {
347246
347265
  ProjectMatrixvue_type_script_lang_js_cov_geimehe8j.f[43]++;
347247
- var tooltip = (ProjectMatrixvue_type_script_lang_js_cov_geimehe8j.s[139]++, this.$refs.tooltip);
347248
- ProjectMatrixvue_type_script_lang_js_cov_geimehe8j.s[140]++;
347266
+ var tooltip = (ProjectMatrixvue_type_script_lang_js_cov_geimehe8j.s[140]++, this.$refs.tooltip);
347267
+ ProjectMatrixvue_type_script_lang_js_cov_geimehe8j.s[141]++;
347249
347268
  if (tooltip) {
347250
347269
  ProjectMatrixvue_type_script_lang_js_cov_geimehe8j.b[37][0]++;
347251
- ProjectMatrixvue_type_script_lang_js_cov_geimehe8j.s[141]++;
347270
+ ProjectMatrixvue_type_script_lang_js_cov_geimehe8j.s[142]++;
347252
347271
  tooltip.style.display = 'none';
347253
347272
  } else {
347254
347273
  ProjectMatrixvue_type_script_lang_js_cov_geimehe8j.b[37][1]++;
@@ -347258,84 +347277,84 @@ function ProjectMatrixvue_type_script_lang_js_asyncToGenerator(fn) { return func
347258
347277
  getPredominantColor: function getPredominantColor(analyses) {
347259
347278
  ProjectMatrixvue_type_script_lang_js_cov_geimehe8j.f[44]++;
347260
347279
  // Count occurrences of each status
347261
- var statusCounts = (ProjectMatrixvue_type_script_lang_js_cov_geimehe8j.s[142]++, {});
347262
- ProjectMatrixvue_type_script_lang_js_cov_geimehe8j.s[143]++;
347280
+ var statusCounts = (ProjectMatrixvue_type_script_lang_js_cov_geimehe8j.s[143]++, {});
347281
+ ProjectMatrixvue_type_script_lang_js_cov_geimehe8j.s[144]++;
347263
347282
  analyses.forEach(function (a) {
347264
347283
  ProjectMatrixvue_type_script_lang_js_cov_geimehe8j.f[45]++;
347265
- ProjectMatrixvue_type_script_lang_js_cov_geimehe8j.s[144]++;
347284
+ ProjectMatrixvue_type_script_lang_js_cov_geimehe8j.s[145]++;
347266
347285
  statusCounts[a.status] = ((ProjectMatrixvue_type_script_lang_js_cov_geimehe8j.b[38][0]++, statusCounts[a.status]) || (ProjectMatrixvue_type_script_lang_js_cov_geimehe8j.b[38][1]++, 0)) + 1;
347267
347286
  });
347268
347287
 
347269
347288
  // Find the most common status
347270
- var maxCount = (ProjectMatrixvue_type_script_lang_js_cov_geimehe8j.s[145]++, 0);
347271
- var predominantStatus = (ProjectMatrixvue_type_script_lang_js_cov_geimehe8j.s[146]++, 'SUCCEEDED'); // default
347272
- ProjectMatrixvue_type_script_lang_js_cov_geimehe8j.s[147]++;
347289
+ var maxCount = (ProjectMatrixvue_type_script_lang_js_cov_geimehe8j.s[146]++, 0);
347290
+ var predominantStatus = (ProjectMatrixvue_type_script_lang_js_cov_geimehe8j.s[147]++, 'SUCCEEDED'); // default
347291
+ ProjectMatrixvue_type_script_lang_js_cov_geimehe8j.s[148]++;
347273
347292
  Object.entries(statusCounts).forEach(function (_ref5) {
347274
347293
  var _ref6 = ProjectMatrixvue_type_script_lang_js_slicedToArray(_ref5, 2),
347275
347294
  status = _ref6[0],
347276
347295
  count = _ref6[1];
347277
347296
  ProjectMatrixvue_type_script_lang_js_cov_geimehe8j.f[46]++;
347278
- ProjectMatrixvue_type_script_lang_js_cov_geimehe8j.s[148]++;
347297
+ ProjectMatrixvue_type_script_lang_js_cov_geimehe8j.s[149]++;
347279
347298
  if (count > maxCount) {
347280
347299
  ProjectMatrixvue_type_script_lang_js_cov_geimehe8j.b[39][0]++;
347281
- ProjectMatrixvue_type_script_lang_js_cov_geimehe8j.s[149]++;
347282
- maxCount = count;
347283
347300
  ProjectMatrixvue_type_script_lang_js_cov_geimehe8j.s[150]++;
347301
+ maxCount = count;
347302
+ ProjectMatrixvue_type_script_lang_js_cov_geimehe8j.s[151]++;
347284
347303
  predominantStatus = status;
347285
347304
  } else {
347286
347305
  ProjectMatrixvue_type_script_lang_js_cov_geimehe8j.b[39][1]++;
347287
347306
  }
347288
347307
  });
347289
- ProjectMatrixvue_type_script_lang_js_cov_geimehe8j.s[151]++;
347308
+ ProjectMatrixvue_type_script_lang_js_cov_geimehe8j.s[152]++;
347290
347309
  return getStatusColor(predominantStatus);
347291
347310
  },
347292
347311
  handleTooltipEnter: function handleTooltipEnter() {
347293
347312
  ProjectMatrixvue_type_script_lang_js_cov_geimehe8j.f[47]++;
347294
- ProjectMatrixvue_type_script_lang_js_cov_geimehe8j.s[152]++;
347313
+ ProjectMatrixvue_type_script_lang_js_cov_geimehe8j.s[153]++;
347295
347314
  this.isOverTooltip = true;
347296
347315
  },
347297
347316
  handleTooltipLeave: function handleTooltipLeave() {
347298
347317
  ProjectMatrixvue_type_script_lang_js_cov_geimehe8j.f[48]++;
347299
- ProjectMatrixvue_type_script_lang_js_cov_geimehe8j.s[153]++;
347300
- this.isOverTooltip = false;
347301
347318
  ProjectMatrixvue_type_script_lang_js_cov_geimehe8j.s[154]++;
347319
+ this.isOverTooltip = false;
347320
+ ProjectMatrixvue_type_script_lang_js_cov_geimehe8j.s[155]++;
347302
347321
  this.hideTooltipNative();
347303
347322
  },
347304
347323
  handleDocumentClick: function handleDocumentClick(event) {
347305
347324
  ProjectMatrixvue_type_script_lang_js_cov_geimehe8j.f[49]++;
347306
- var tooltip = (ProjectMatrixvue_type_script_lang_js_cov_geimehe8j.s[155]++, this.$refs.tooltip);
347325
+ var tooltip = (ProjectMatrixvue_type_script_lang_js_cov_geimehe8j.s[156]++, this.$refs.tooltip);
347307
347326
 
347308
347327
  // Check if click was inside tooltip
347309
- ProjectMatrixvue_type_script_lang_js_cov_geimehe8j.s[156]++;
347328
+ ProjectMatrixvue_type_script_lang_js_cov_geimehe8j.s[157]++;
347310
347329
  if ((ProjectMatrixvue_type_script_lang_js_cov_geimehe8j.b[41][0]++, tooltip) && (ProjectMatrixvue_type_script_lang_js_cov_geimehe8j.b[41][1]++, tooltip.contains(event.target))) {
347311
347330
  ProjectMatrixvue_type_script_lang_js_cov_geimehe8j.b[40][0]++;
347312
- ProjectMatrixvue_type_script_lang_js_cov_geimehe8j.s[157]++;
347331
+ ProjectMatrixvue_type_script_lang_js_cov_geimehe8j.s[158]++;
347313
347332
  return;
347314
347333
  } else {
347315
347334
  ProjectMatrixvue_type_script_lang_js_cov_geimehe8j.b[40][1]++;
347316
347335
  }
347317
347336
 
347318
347337
  // Check if click was on a matrix cell (this opens tooltip, don't close it)
347319
- ProjectMatrixvue_type_script_lang_js_cov_geimehe8j.s[158]++;
347338
+ ProjectMatrixvue_type_script_lang_js_cov_geimehe8j.s[159]++;
347320
347339
  if (event.target.closest('.matrix-cell.has-analyses')) {
347321
347340
  ProjectMatrixvue_type_script_lang_js_cov_geimehe8j.b[42][0]++;
347322
- ProjectMatrixvue_type_script_lang_js_cov_geimehe8j.s[159]++;
347341
+ ProjectMatrixvue_type_script_lang_js_cov_geimehe8j.s[160]++;
347323
347342
  return;
347324
347343
  } else {
347325
347344
  ProjectMatrixvue_type_script_lang_js_cov_geimehe8j.b[42][1]++;
347326
347345
  }
347327
347346
 
347328
347347
  // Hide tooltip if visible
347329
- ProjectMatrixvue_type_script_lang_js_cov_geimehe8j.s[160]++;
347348
+ ProjectMatrixvue_type_script_lang_js_cov_geimehe8j.s[161]++;
347330
347349
  this.hideTooltipNative();
347331
347350
 
347332
347351
  // Only clear selection if clicking inside the matrix scroll container
347333
347352
  // (not when clicking tabs, filters, etc.)
347334
- var scrollContainer = (ProjectMatrixvue_type_script_lang_js_cov_geimehe8j.s[161]++, this.$refs.scrollContainer);
347335
- ProjectMatrixvue_type_script_lang_js_cov_geimehe8j.s[162]++;
347353
+ var scrollContainer = (ProjectMatrixvue_type_script_lang_js_cov_geimehe8j.s[162]++, this.$refs.scrollContainer);
347354
+ ProjectMatrixvue_type_script_lang_js_cov_geimehe8j.s[163]++;
347336
347355
  if ((ProjectMatrixvue_type_script_lang_js_cov_geimehe8j.b[44][0]++, scrollContainer) && (ProjectMatrixvue_type_script_lang_js_cov_geimehe8j.b[44][1]++, scrollContainer.contains(event.target))) {
347337
347356
  ProjectMatrixvue_type_script_lang_js_cov_geimehe8j.b[43][0]++;
347338
- ProjectMatrixvue_type_script_lang_js_cov_geimehe8j.s[163]++;
347357
+ ProjectMatrixvue_type_script_lang_js_cov_geimehe8j.s[164]++;
347339
347358
  this.selectedCell = null;
347340
347359
  } else {
347341
347360
  ProjectMatrixvue_type_script_lang_js_cov_geimehe8j.b[43][1]++;
@@ -347345,9 +347364,9 @@ function ProjectMatrixvue_type_script_lang_js_asyncToGenerator(fn) { return func
347345
347364
  });
347346
347365
  ;// CONCATENATED MODULE: ./src/components/projects/ProjectMatrix.vue?vue&type=script&lang=js&
347347
347366
  /* harmony default export */ var projects_ProjectMatrixvue_type_script_lang_js_ = (ProjectMatrixvue_type_script_lang_js_);
347348
- // EXTERNAL MODULE: ./node_modules/vue-style-loader/index.js??clonedRuleSet-54.use[0]!./node_modules/css-loader/dist/cjs.js??clonedRuleSet-54.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/stylePostLoader.js!./node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-54.use[2]!./node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-54.use[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/projects/ProjectMatrix.vue?vue&type=style&index=0&id=2742f691&prod&scoped=true&lang=css&
347349
- var ProjectMatrixvue_type_style_index_0_id_2742f691_prod_scoped_true_lang_css_ = __webpack_require__(99570);
347350
- ;// CONCATENATED MODULE: ./src/components/projects/ProjectMatrix.vue?vue&type=style&index=0&id=2742f691&prod&scoped=true&lang=css&
347367
+ // EXTERNAL MODULE: ./node_modules/vue-style-loader/index.js??clonedRuleSet-54.use[0]!./node_modules/css-loader/dist/cjs.js??clonedRuleSet-54.use[1]!./node_modules/@vue/vue-loader-v15/lib/loaders/stylePostLoader.js!./node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-54.use[2]!./node_modules/postcss-loader/dist/cjs.js??clonedRuleSet-54.use[3]!./node_modules/@vue/vue-loader-v15/lib/index.js??vue-loader-options!./src/components/projects/ProjectMatrix.vue?vue&type=style&index=0&id=28c10d94&prod&scoped=true&lang=css&
347368
+ var ProjectMatrixvue_type_style_index_0_id_28c10d94_prod_scoped_true_lang_css_ = __webpack_require__(82588);
347369
+ ;// CONCATENATED MODULE: ./src/components/projects/ProjectMatrix.vue?vue&type=style&index=0&id=28c10d94&prod&scoped=true&lang=css&
347351
347370
 
347352
347371
  ;// CONCATENATED MODULE: ./src/components/projects/ProjectMatrix.vue
347353
347372
 
@@ -347360,11 +347379,11 @@ var ProjectMatrixvue_type_style_index_0_id_2742f691_prod_scoped_true_lang_css_ =
347360
347379
 
347361
347380
  var ProjectMatrix_component = normalizeComponent(
347362
347381
  projects_ProjectMatrixvue_type_script_lang_js_,
347363
- ProjectMatrixvue_type_template_id_2742f691_scoped_true_render,
347364
- ProjectMatrixvue_type_template_id_2742f691_scoped_true_staticRenderFns,
347382
+ ProjectMatrixvue_type_template_id_28c10d94_scoped_true_render,
347383
+ ProjectMatrixvue_type_template_id_28c10d94_scoped_true_staticRenderFns,
347365
347384
  false,
347366
347385
  null,
347367
- "2742f691",
347386
+ "28c10d94",
347368
347387
  null
347369
347388
 
347370
347389
  )