@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.
- package/dist/isabl-web.common.js +241 -222
- package/dist/isabl-web.umd.js +241 -222
- package/dist/isabl-web.umd.min.js +3 -3
- package/package.json +1 -1
package/dist/isabl-web.umd.js
CHANGED
|
@@ -14689,7 +14689,7 @@ ___CSS_LOADER_EXPORT___.push([module.id, ".matrix-legend[data-v-4c88fa7c]{paddin
|
|
|
14689
14689
|
|
|
14690
14690
|
/***/ }),
|
|
14691
14691
|
|
|
14692
|
-
/***/
|
|
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-
|
|
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
|
-
/***/
|
|
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__(
|
|
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("
|
|
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=
|
|
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 = "
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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: "
|
|
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
|
|
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
|
-
|
|
330938
|
-
display:
|
|
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
|
|
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=
|
|
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 = "
|
|
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:
|
|
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:
|
|
343345
|
+
line: 414,
|
|
343336
343346
|
column: 40
|
|
343337
343347
|
}
|
|
343338
343348
|
},
|
|
343339
|
-
"
|
|
343349
|
+
"141": {
|
|
343340
343350
|
start: {
|
|
343341
|
-
line:
|
|
343351
|
+
line: 415,
|
|
343342
343352
|
column: 6
|
|
343343
343353
|
},
|
|
343344
343354
|
end: {
|
|
343345
|
-
line:
|
|
343355
|
+
line: 417,
|
|
343346
343356
|
column: 7
|
|
343347
343357
|
}
|
|
343348
343358
|
},
|
|
343349
|
-
"
|
|
343359
|
+
"142": {
|
|
343350
343360
|
start: {
|
|
343351
|
-
line:
|
|
343361
|
+
line: 416,
|
|
343352
343362
|
column: 8
|
|
343353
343363
|
},
|
|
343354
343364
|
end: {
|
|
343355
|
-
line:
|
|
343365
|
+
line: 416,
|
|
343356
343366
|
column: 38
|
|
343357
343367
|
}
|
|
343358
343368
|
},
|
|
343359
|
-
"
|
|
343369
|
+
"143": {
|
|
343360
343370
|
start: {
|
|
343361
|
-
line:
|
|
343371
|
+
line: 424,
|
|
343362
343372
|
column: 27
|
|
343363
343373
|
},
|
|
343364
343374
|
end: {
|
|
343365
|
-
line:
|
|
343375
|
+
line: 424,
|
|
343366
343376
|
column: 29
|
|
343367
343377
|
}
|
|
343368
343378
|
},
|
|
343369
|
-
"
|
|
343379
|
+
"144": {
|
|
343370
343380
|
start: {
|
|
343371
|
-
line:
|
|
343381
|
+
line: 425,
|
|
343372
343382
|
column: 6
|
|
343373
343383
|
},
|
|
343374
343384
|
end: {
|
|
343375
|
-
line:
|
|
343385
|
+
line: 427,
|
|
343376
343386
|
column: 8
|
|
343377
343387
|
}
|
|
343378
343388
|
},
|
|
343379
|
-
"
|
|
343389
|
+
"145": {
|
|
343380
343390
|
start: {
|
|
343381
|
-
line:
|
|
343391
|
+
line: 426,
|
|
343382
343392
|
column: 8
|
|
343383
343393
|
},
|
|
343384
343394
|
end: {
|
|
343385
|
-
line:
|
|
343395
|
+
line: 426,
|
|
343386
343396
|
column: 66
|
|
343387
343397
|
}
|
|
343388
343398
|
},
|
|
343389
|
-
"
|
|
343399
|
+
"146": {
|
|
343390
343400
|
start: {
|
|
343391
|
-
line:
|
|
343401
|
+
line: 430,
|
|
343392
343402
|
column: 21
|
|
343393
343403
|
},
|
|
343394
343404
|
end: {
|
|
343395
|
-
line:
|
|
343405
|
+
line: 430,
|
|
343396
343406
|
column: 22
|
|
343397
343407
|
}
|
|
343398
343408
|
},
|
|
343399
|
-
"
|
|
343409
|
+
"147": {
|
|
343400
343410
|
start: {
|
|
343401
|
-
line:
|
|
343411
|
+
line: 431,
|
|
343402
343412
|
column: 30
|
|
343403
343413
|
},
|
|
343404
343414
|
end: {
|
|
343405
|
-
line:
|
|
343415
|
+
line: 431,
|
|
343406
343416
|
column: 41
|
|
343407
343417
|
}
|
|
343408
343418
|
},
|
|
343409
|
-
"
|
|
343419
|
+
"148": {
|
|
343410
343420
|
start: {
|
|
343411
|
-
line:
|
|
343421
|
+
line: 432,
|
|
343412
343422
|
column: 6
|
|
343413
343423
|
},
|
|
343414
343424
|
end: {
|
|
343415
|
-
line:
|
|
343425
|
+
line: 437,
|
|
343416
343426
|
column: 8
|
|
343417
343427
|
}
|
|
343418
343428
|
},
|
|
343419
|
-
"
|
|
343429
|
+
"149": {
|
|
343420
343430
|
start: {
|
|
343421
|
-
line:
|
|
343431
|
+
line: 433,
|
|
343422
343432
|
column: 8
|
|
343423
343433
|
},
|
|
343424
343434
|
end: {
|
|
343425
|
-
line:
|
|
343435
|
+
line: 436,
|
|
343426
343436
|
column: 9
|
|
343427
343437
|
}
|
|
343428
343438
|
},
|
|
343429
|
-
"
|
|
343439
|
+
"150": {
|
|
343430
343440
|
start: {
|
|
343431
|
-
line:
|
|
343441
|
+
line: 434,
|
|
343432
343442
|
column: 10
|
|
343433
343443
|
},
|
|
343434
343444
|
end: {
|
|
343435
|
-
line:
|
|
343445
|
+
line: 434,
|
|
343436
343446
|
column: 26
|
|
343437
343447
|
}
|
|
343438
343448
|
},
|
|
343439
|
-
"
|
|
343449
|
+
"151": {
|
|
343440
343450
|
start: {
|
|
343441
|
-
line:
|
|
343451
|
+
line: 435,
|
|
343442
343452
|
column: 10
|
|
343443
343453
|
},
|
|
343444
343454
|
end: {
|
|
343445
|
-
line:
|
|
343455
|
+
line: 435,
|
|
343446
343456
|
column: 36
|
|
343447
343457
|
}
|
|
343448
343458
|
},
|
|
343449
|
-
"
|
|
343459
|
+
"152": {
|
|
343450
343460
|
start: {
|
|
343451
|
-
line:
|
|
343461
|
+
line: 439,
|
|
343452
343462
|
column: 6
|
|
343453
343463
|
},
|
|
343454
343464
|
end: {
|
|
343455
|
-
line:
|
|
343465
|
+
line: 439,
|
|
343456
343466
|
column: 46
|
|
343457
343467
|
}
|
|
343458
343468
|
},
|
|
343459
|
-
"
|
|
343469
|
+
"153": {
|
|
343460
343470
|
start: {
|
|
343461
|
-
line:
|
|
343471
|
+
line: 443,
|
|
343462
343472
|
column: 6
|
|
343463
343473
|
},
|
|
343464
343474
|
end: {
|
|
343465
|
-
line:
|
|
343475
|
+
line: 443,
|
|
343466
343476
|
column: 31
|
|
343467
343477
|
}
|
|
343468
343478
|
},
|
|
343469
|
-
"
|
|
343479
|
+
"154": {
|
|
343470
343480
|
start: {
|
|
343471
|
-
line:
|
|
343481
|
+
line: 447,
|
|
343472
343482
|
column: 6
|
|
343473
343483
|
},
|
|
343474
343484
|
end: {
|
|
343475
|
-
line:
|
|
343485
|
+
line: 447,
|
|
343476
343486
|
column: 32
|
|
343477
343487
|
}
|
|
343478
343488
|
},
|
|
343479
|
-
"
|
|
343489
|
+
"155": {
|
|
343480
343490
|
start: {
|
|
343481
|
-
line:
|
|
343491
|
+
line: 448,
|
|
343482
343492
|
column: 6
|
|
343483
343493
|
},
|
|
343484
343494
|
end: {
|
|
343485
|
-
line:
|
|
343495
|
+
line: 448,
|
|
343486
343496
|
column: 30
|
|
343487
343497
|
}
|
|
343488
343498
|
},
|
|
343489
|
-
"
|
|
343499
|
+
"156": {
|
|
343490
343500
|
start: {
|
|
343491
|
-
line:
|
|
343501
|
+
line: 452,
|
|
343492
343502
|
column: 22
|
|
343493
343503
|
},
|
|
343494
343504
|
end: {
|
|
343495
|
-
line:
|
|
343505
|
+
line: 452,
|
|
343496
343506
|
column: 40
|
|
343497
343507
|
}
|
|
343498
343508
|
},
|
|
343499
|
-
"
|
|
343509
|
+
"157": {
|
|
343500
343510
|
start: {
|
|
343501
|
-
line:
|
|
343511
|
+
line: 455,
|
|
343502
343512
|
column: 6
|
|
343503
343513
|
},
|
|
343504
343514
|
end: {
|
|
343505
|
-
line:
|
|
343515
|
+
line: 455,
|
|
343506
343516
|
column: 59
|
|
343507
343517
|
}
|
|
343508
343518
|
},
|
|
343509
|
-
"
|
|
343519
|
+
"158": {
|
|
343510
343520
|
start: {
|
|
343511
|
-
line:
|
|
343521
|
+
line: 455,
|
|
343512
343522
|
column: 53
|
|
343513
343523
|
},
|
|
343514
343524
|
end: {
|
|
343515
|
-
line:
|
|
343525
|
+
line: 455,
|
|
343516
343526
|
column: 59
|
|
343517
343527
|
}
|
|
343518
343528
|
},
|
|
343519
|
-
"
|
|
343529
|
+
"159": {
|
|
343520
343530
|
start: {
|
|
343521
|
-
line:
|
|
343531
|
+
line: 458,
|
|
343522
343532
|
column: 6
|
|
343523
343533
|
},
|
|
343524
343534
|
end: {
|
|
343525
|
-
line:
|
|
343535
|
+
line: 458,
|
|
343526
343536
|
column: 67
|
|
343527
343537
|
}
|
|
343528
343538
|
},
|
|
343529
|
-
"
|
|
343539
|
+
"160": {
|
|
343530
343540
|
start: {
|
|
343531
|
-
line:
|
|
343541
|
+
line: 458,
|
|
343532
343542
|
column: 61
|
|
343533
343543
|
},
|
|
343534
343544
|
end: {
|
|
343535
|
-
line:
|
|
343545
|
+
line: 458,
|
|
343536
343546
|
column: 67
|
|
343537
343547
|
}
|
|
343538
343548
|
},
|
|
343539
|
-
"
|
|
343549
|
+
"161": {
|
|
343540
343550
|
start: {
|
|
343541
|
-
line:
|
|
343551
|
+
line: 461,
|
|
343542
343552
|
column: 6
|
|
343543
343553
|
},
|
|
343544
343554
|
end: {
|
|
343545
|
-
line:
|
|
343555
|
+
line: 461,
|
|
343546
343556
|
column: 30
|
|
343547
343557
|
}
|
|
343548
343558
|
},
|
|
343549
|
-
"
|
|
343559
|
+
"162": {
|
|
343550
343560
|
start: {
|
|
343551
|
-
line:
|
|
343561
|
+
line: 465,
|
|
343552
343562
|
column: 30
|
|
343553
343563
|
},
|
|
343554
343564
|
end: {
|
|
343555
|
-
line:
|
|
343565
|
+
line: 465,
|
|
343556
343566
|
column: 56
|
|
343557
343567
|
}
|
|
343558
343568
|
},
|
|
343559
|
-
"
|
|
343569
|
+
"163": {
|
|
343560
343570
|
start: {
|
|
343561
|
-
line:
|
|
343571
|
+
line: 466,
|
|
343562
343572
|
column: 6
|
|
343563
343573
|
},
|
|
343564
343574
|
end: {
|
|
343565
|
-
line:
|
|
343575
|
+
line: 468,
|
|
343566
343576
|
column: 7
|
|
343567
343577
|
}
|
|
343568
343578
|
},
|
|
343569
|
-
"
|
|
343579
|
+
"164": {
|
|
343570
343580
|
start: {
|
|
343571
|
-
line:
|
|
343581
|
+
line: 467,
|
|
343572
343582
|
column: 8
|
|
343573
343583
|
},
|
|
343574
343584
|
end: {
|
|
343575
|
-
line:
|
|
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:
|
|
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:
|
|
344627
|
+
line: 413,
|
|
344618
344628
|
column: 4
|
|
344619
344629
|
},
|
|
344620
344630
|
end: {
|
|
344621
|
-
line:
|
|
344631
|
+
line: 413,
|
|
344622
344632
|
column: 5
|
|
344623
344633
|
}
|
|
344624
344634
|
},
|
|
344625
344635
|
loc: {
|
|
344626
344636
|
start: {
|
|
344627
|
-
line:
|
|
344637
|
+
line: 413,
|
|
344628
344638
|
column: 24
|
|
344629
344639
|
},
|
|
344630
344640
|
end: {
|
|
344631
|
-
line:
|
|
344641
|
+
line: 418,
|
|
344632
344642
|
column: 5
|
|
344633
344643
|
}
|
|
344634
344644
|
},
|
|
344635
|
-
line:
|
|
344645
|
+
line: 413
|
|
344636
344646
|
},
|
|
344637
344647
|
"44": {
|
|
344638
344648
|
name: "(anonymous_44)",
|
|
344639
344649
|
decl: {
|
|
344640
344650
|
start: {
|
|
344641
|
-
line:
|
|
344651
|
+
line: 422,
|
|
344642
344652
|
column: 4
|
|
344643
344653
|
},
|
|
344644
344654
|
end: {
|
|
344645
|
-
line:
|
|
344655
|
+
line: 422,
|
|
344646
344656
|
column: 5
|
|
344647
344657
|
}
|
|
344648
344658
|
},
|
|
344649
344659
|
loc: {
|
|
344650
344660
|
start: {
|
|
344651
|
-
line:
|
|
344661
|
+
line: 422,
|
|
344652
344662
|
column: 34
|
|
344653
344663
|
},
|
|
344654
344664
|
end: {
|
|
344655
|
-
line:
|
|
344665
|
+
line: 440,
|
|
344656
344666
|
column: 5
|
|
344657
344667
|
}
|
|
344658
344668
|
},
|
|
344659
|
-
line:
|
|
344669
|
+
line: 422
|
|
344660
344670
|
},
|
|
344661
344671
|
"45": {
|
|
344662
344672
|
name: "(anonymous_45)",
|
|
344663
344673
|
decl: {
|
|
344664
344674
|
start: {
|
|
344665
|
-
line:
|
|
344675
|
+
line: 425,
|
|
344666
344676
|
column: 23
|
|
344667
344677
|
},
|
|
344668
344678
|
end: {
|
|
344669
|
-
line:
|
|
344679
|
+
line: 425,
|
|
344670
344680
|
column: 24
|
|
344671
344681
|
}
|
|
344672
344682
|
},
|
|
344673
344683
|
loc: {
|
|
344674
344684
|
start: {
|
|
344675
|
-
line:
|
|
344685
|
+
line: 425,
|
|
344676
344686
|
column: 28
|
|
344677
344687
|
},
|
|
344678
344688
|
end: {
|
|
344679
|
-
line:
|
|
344689
|
+
line: 427,
|
|
344680
344690
|
column: 7
|
|
344681
344691
|
}
|
|
344682
344692
|
},
|
|
344683
|
-
line:
|
|
344693
|
+
line: 425
|
|
344684
344694
|
},
|
|
344685
344695
|
"46": {
|
|
344686
344696
|
name: "(anonymous_46)",
|
|
344687
344697
|
decl: {
|
|
344688
344698
|
start: {
|
|
344689
|
-
line:
|
|
344699
|
+
line: 432,
|
|
344690
344700
|
column: 43
|
|
344691
344701
|
},
|
|
344692
344702
|
end: {
|
|
344693
|
-
line:
|
|
344703
|
+
line: 432,
|
|
344694
344704
|
column: 44
|
|
344695
344705
|
}
|
|
344696
344706
|
},
|
|
344697
344707
|
loc: {
|
|
344698
344708
|
start: {
|
|
344699
|
-
line:
|
|
344709
|
+
line: 432,
|
|
344700
344710
|
column: 64
|
|
344701
344711
|
},
|
|
344702
344712
|
end: {
|
|
344703
|
-
line:
|
|
344713
|
+
line: 437,
|
|
344704
344714
|
column: 7
|
|
344705
344715
|
}
|
|
344706
344716
|
},
|
|
344707
|
-
line:
|
|
344717
|
+
line: 432
|
|
344708
344718
|
},
|
|
344709
344719
|
"47": {
|
|
344710
344720
|
name: "(anonymous_47)",
|
|
344711
344721
|
decl: {
|
|
344712
344722
|
start: {
|
|
344713
|
-
line:
|
|
344723
|
+
line: 442,
|
|
344714
344724
|
column: 4
|
|
344715
344725
|
},
|
|
344716
344726
|
end: {
|
|
344717
|
-
line:
|
|
344727
|
+
line: 442,
|
|
344718
344728
|
column: 5
|
|
344719
344729
|
}
|
|
344720
344730
|
},
|
|
344721
344731
|
loc: {
|
|
344722
344732
|
start: {
|
|
344723
|
-
line:
|
|
344733
|
+
line: 442,
|
|
344724
344734
|
column: 25
|
|
344725
344735
|
},
|
|
344726
344736
|
end: {
|
|
344727
|
-
line:
|
|
344737
|
+
line: 444,
|
|
344728
344738
|
column: 5
|
|
344729
344739
|
}
|
|
344730
344740
|
},
|
|
344731
|
-
line:
|
|
344741
|
+
line: 442
|
|
344732
344742
|
},
|
|
344733
344743
|
"48": {
|
|
344734
344744
|
name: "(anonymous_48)",
|
|
344735
344745
|
decl: {
|
|
344736
344746
|
start: {
|
|
344737
|
-
line:
|
|
344747
|
+
line: 446,
|
|
344738
344748
|
column: 4
|
|
344739
344749
|
},
|
|
344740
344750
|
end: {
|
|
344741
|
-
line:
|
|
344751
|
+
line: 446,
|
|
344742
344752
|
column: 5
|
|
344743
344753
|
}
|
|
344744
344754
|
},
|
|
344745
344755
|
loc: {
|
|
344746
344756
|
start: {
|
|
344747
|
-
line:
|
|
344757
|
+
line: 446,
|
|
344748
344758
|
column: 25
|
|
344749
344759
|
},
|
|
344750
344760
|
end: {
|
|
344751
|
-
line:
|
|
344761
|
+
line: 449,
|
|
344752
344762
|
column: 5
|
|
344753
344763
|
}
|
|
344754
344764
|
},
|
|
344755
|
-
line:
|
|
344765
|
+
line: 446
|
|
344756
344766
|
},
|
|
344757
344767
|
"49": {
|
|
344758
344768
|
name: "(anonymous_49)",
|
|
344759
344769
|
decl: {
|
|
344760
344770
|
start: {
|
|
344761
|
-
line:
|
|
344771
|
+
line: 451,
|
|
344762
344772
|
column: 4
|
|
344763
344773
|
},
|
|
344764
344774
|
end: {
|
|
344765
|
-
line:
|
|
344775
|
+
line: 451,
|
|
344766
344776
|
column: 5
|
|
344767
344777
|
}
|
|
344768
344778
|
},
|
|
344769
344779
|
loc: {
|
|
344770
344780
|
start: {
|
|
344771
|
-
line:
|
|
344781
|
+
line: 451,
|
|
344772
344782
|
column: 31
|
|
344773
344783
|
},
|
|
344774
344784
|
end: {
|
|
344775
|
-
line:
|
|
344785
|
+
line: 469,
|
|
344776
344786
|
column: 5
|
|
344777
344787
|
}
|
|
344778
344788
|
},
|
|
344779
|
-
line:
|
|
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:
|
|
346044
|
+
line: 415,
|
|
346035
346045
|
column: 6
|
|
346036
346046
|
},
|
|
346037
346047
|
end: {
|
|
346038
|
-
line:
|
|
346048
|
+
line: 417,
|
|
346039
346049
|
column: 7
|
|
346040
346050
|
}
|
|
346041
346051
|
},
|
|
346042
346052
|
type: "if",
|
|
346043
346053
|
locations: [{
|
|
346044
346054
|
start: {
|
|
346045
|
-
line:
|
|
346055
|
+
line: 415,
|
|
346046
346056
|
column: 6
|
|
346047
346057
|
},
|
|
346048
346058
|
end: {
|
|
346049
|
-
line:
|
|
346059
|
+
line: 417,
|
|
346050
346060
|
column: 7
|
|
346051
346061
|
}
|
|
346052
346062
|
}, {
|
|
346053
346063
|
start: {
|
|
346054
|
-
line:
|
|
346064
|
+
line: 415,
|
|
346055
346065
|
column: 6
|
|
346056
346066
|
},
|
|
346057
346067
|
end: {
|
|
346058
|
-
line:
|
|
346068
|
+
line: 417,
|
|
346059
346069
|
column: 7
|
|
346060
346070
|
}
|
|
346061
346071
|
}],
|
|
346062
|
-
line:
|
|
346072
|
+
line: 415
|
|
346063
346073
|
},
|
|
346064
346074
|
"38": {
|
|
346065
346075
|
loc: {
|
|
346066
346076
|
start: {
|
|
346067
|
-
line:
|
|
346077
|
+
line: 426,
|
|
346068
346078
|
column: 34
|
|
346069
346079
|
},
|
|
346070
346080
|
end: {
|
|
346071
|
-
line:
|
|
346081
|
+
line: 426,
|
|
346072
346082
|
column: 61
|
|
346073
346083
|
}
|
|
346074
346084
|
},
|
|
346075
346085
|
type: "binary-expr",
|
|
346076
346086
|
locations: [{
|
|
346077
346087
|
start: {
|
|
346078
|
-
line:
|
|
346088
|
+
line: 426,
|
|
346079
346089
|
column: 34
|
|
346080
346090
|
},
|
|
346081
346091
|
end: {
|
|
346082
|
-
line:
|
|
346092
|
+
line: 426,
|
|
346083
346093
|
column: 56
|
|
346084
346094
|
}
|
|
346085
346095
|
}, {
|
|
346086
346096
|
start: {
|
|
346087
|
-
line:
|
|
346097
|
+
line: 426,
|
|
346088
346098
|
column: 60
|
|
346089
346099
|
},
|
|
346090
346100
|
end: {
|
|
346091
|
-
line:
|
|
346101
|
+
line: 426,
|
|
346092
346102
|
column: 61
|
|
346093
346103
|
}
|
|
346094
346104
|
}],
|
|
346095
|
-
line:
|
|
346105
|
+
line: 426
|
|
346096
346106
|
},
|
|
346097
346107
|
"39": {
|
|
346098
346108
|
loc: {
|
|
346099
346109
|
start: {
|
|
346100
|
-
line:
|
|
346110
|
+
line: 433,
|
|
346101
346111
|
column: 8
|
|
346102
346112
|
},
|
|
346103
346113
|
end: {
|
|
346104
|
-
line:
|
|
346114
|
+
line: 436,
|
|
346105
346115
|
column: 9
|
|
346106
346116
|
}
|
|
346107
346117
|
},
|
|
346108
346118
|
type: "if",
|
|
346109
346119
|
locations: [{
|
|
346110
346120
|
start: {
|
|
346111
|
-
line:
|
|
346121
|
+
line: 433,
|
|
346112
346122
|
column: 8
|
|
346113
346123
|
},
|
|
346114
346124
|
end: {
|
|
346115
|
-
line:
|
|
346125
|
+
line: 436,
|
|
346116
346126
|
column: 9
|
|
346117
346127
|
}
|
|
346118
346128
|
}, {
|
|
346119
346129
|
start: {
|
|
346120
|
-
line:
|
|
346130
|
+
line: 433,
|
|
346121
346131
|
column: 8
|
|
346122
346132
|
},
|
|
346123
346133
|
end: {
|
|
346124
|
-
line:
|
|
346134
|
+
line: 436,
|
|
346125
346135
|
column: 9
|
|
346126
346136
|
}
|
|
346127
346137
|
}],
|
|
346128
|
-
line:
|
|
346138
|
+
line: 433
|
|
346129
346139
|
},
|
|
346130
346140
|
"40": {
|
|
346131
346141
|
loc: {
|
|
346132
346142
|
start: {
|
|
346133
|
-
line:
|
|
346143
|
+
line: 455,
|
|
346134
346144
|
column: 6
|
|
346135
346145
|
},
|
|
346136
346146
|
end: {
|
|
346137
|
-
line:
|
|
346147
|
+
line: 455,
|
|
346138
346148
|
column: 59
|
|
346139
346149
|
}
|
|
346140
346150
|
},
|
|
346141
346151
|
type: "if",
|
|
346142
346152
|
locations: [{
|
|
346143
346153
|
start: {
|
|
346144
|
-
line:
|
|
346154
|
+
line: 455,
|
|
346145
346155
|
column: 6
|
|
346146
346156
|
},
|
|
346147
346157
|
end: {
|
|
346148
|
-
line:
|
|
346158
|
+
line: 455,
|
|
346149
346159
|
column: 59
|
|
346150
346160
|
}
|
|
346151
346161
|
}, {
|
|
346152
346162
|
start: {
|
|
346153
|
-
line:
|
|
346163
|
+
line: 455,
|
|
346154
346164
|
column: 6
|
|
346155
346165
|
},
|
|
346156
346166
|
end: {
|
|
346157
|
-
line:
|
|
346167
|
+
line: 455,
|
|
346158
346168
|
column: 59
|
|
346159
346169
|
}
|
|
346160
346170
|
}],
|
|
346161
|
-
line:
|
|
346171
|
+
line: 455
|
|
346162
346172
|
},
|
|
346163
346173
|
"41": {
|
|
346164
346174
|
loc: {
|
|
346165
346175
|
start: {
|
|
346166
|
-
line:
|
|
346176
|
+
line: 455,
|
|
346167
346177
|
column: 10
|
|
346168
346178
|
},
|
|
346169
346179
|
end: {
|
|
346170
|
-
line:
|
|
346180
|
+
line: 455,
|
|
346171
346181
|
column: 51
|
|
346172
346182
|
}
|
|
346173
346183
|
},
|
|
346174
346184
|
type: "binary-expr",
|
|
346175
346185
|
locations: [{
|
|
346176
346186
|
start: {
|
|
346177
|
-
line:
|
|
346187
|
+
line: 455,
|
|
346178
346188
|
column: 10
|
|
346179
346189
|
},
|
|
346180
346190
|
end: {
|
|
346181
|
-
line:
|
|
346191
|
+
line: 455,
|
|
346182
346192
|
column: 17
|
|
346183
346193
|
}
|
|
346184
346194
|
}, {
|
|
346185
346195
|
start: {
|
|
346186
|
-
line:
|
|
346196
|
+
line: 455,
|
|
346187
346197
|
column: 21
|
|
346188
346198
|
},
|
|
346189
346199
|
end: {
|
|
346190
|
-
line:
|
|
346200
|
+
line: 455,
|
|
346191
346201
|
column: 51
|
|
346192
346202
|
}
|
|
346193
346203
|
}],
|
|
346194
|
-
line:
|
|
346204
|
+
line: 455
|
|
346195
346205
|
},
|
|
346196
346206
|
"42": {
|
|
346197
346207
|
loc: {
|
|
346198
346208
|
start: {
|
|
346199
|
-
line:
|
|
346209
|
+
line: 458,
|
|
346200
346210
|
column: 6
|
|
346201
346211
|
},
|
|
346202
346212
|
end: {
|
|
346203
|
-
line:
|
|
346213
|
+
line: 458,
|
|
346204
346214
|
column: 67
|
|
346205
346215
|
}
|
|
346206
346216
|
},
|
|
346207
346217
|
type: "if",
|
|
346208
346218
|
locations: [{
|
|
346209
346219
|
start: {
|
|
346210
|
-
line:
|
|
346220
|
+
line: 458,
|
|
346211
346221
|
column: 6
|
|
346212
346222
|
},
|
|
346213
346223
|
end: {
|
|
346214
|
-
line:
|
|
346224
|
+
line: 458,
|
|
346215
346225
|
column: 67
|
|
346216
346226
|
}
|
|
346217
346227
|
}, {
|
|
346218
346228
|
start: {
|
|
346219
|
-
line:
|
|
346229
|
+
line: 458,
|
|
346220
346230
|
column: 6
|
|
346221
346231
|
},
|
|
346222
346232
|
end: {
|
|
346223
|
-
line:
|
|
346233
|
+
line: 458,
|
|
346224
346234
|
column: 67
|
|
346225
346235
|
}
|
|
346226
346236
|
}],
|
|
346227
|
-
line:
|
|
346237
|
+
line: 458
|
|
346228
346238
|
},
|
|
346229
346239
|
"43": {
|
|
346230
346240
|
loc: {
|
|
346231
346241
|
start: {
|
|
346232
|
-
line:
|
|
346242
|
+
line: 466,
|
|
346233
346243
|
column: 6
|
|
346234
346244
|
},
|
|
346235
346245
|
end: {
|
|
346236
|
-
line:
|
|
346246
|
+
line: 468,
|
|
346237
346247
|
column: 7
|
|
346238
346248
|
}
|
|
346239
346249
|
},
|
|
346240
346250
|
type: "if",
|
|
346241
346251
|
locations: [{
|
|
346242
346252
|
start: {
|
|
346243
|
-
line:
|
|
346253
|
+
line: 466,
|
|
346244
346254
|
column: 6
|
|
346245
346255
|
},
|
|
346246
346256
|
end: {
|
|
346247
|
-
line:
|
|
346257
|
+
line: 468,
|
|
346248
346258
|
column: 7
|
|
346249
346259
|
}
|
|
346250
346260
|
}, {
|
|
346251
346261
|
start: {
|
|
346252
|
-
line:
|
|
346262
|
+
line: 466,
|
|
346253
346263
|
column: 6
|
|
346254
346264
|
},
|
|
346255
346265
|
end: {
|
|
346256
|
-
line:
|
|
346266
|
+
line: 468,
|
|
346257
346267
|
column: 7
|
|
346258
346268
|
}
|
|
346259
346269
|
}],
|
|
346260
|
-
line:
|
|
346270
|
+
line: 466
|
|
346261
346271
|
},
|
|
346262
346272
|
"44": {
|
|
346263
346273
|
loc: {
|
|
346264
346274
|
start: {
|
|
346265
|
-
line:
|
|
346275
|
+
line: 466,
|
|
346266
346276
|
column: 10
|
|
346267
346277
|
},
|
|
346268
346278
|
end: {
|
|
346269
|
-
line:
|
|
346279
|
+
line: 466,
|
|
346270
346280
|
column: 67
|
|
346271
346281
|
}
|
|
346272
346282
|
},
|
|
346273
346283
|
type: "binary-expr",
|
|
346274
346284
|
locations: [{
|
|
346275
346285
|
start: {
|
|
346276
|
-
line:
|
|
346286
|
+
line: 466,
|
|
346277
346287
|
column: 10
|
|
346278
346288
|
},
|
|
346279
346289
|
end: {
|
|
346280
|
-
line:
|
|
346290
|
+
line: 466,
|
|
346281
346291
|
column: 25
|
|
346282
346292
|
}
|
|
346283
346293
|
}, {
|
|
346284
346294
|
start: {
|
|
346285
|
-
line:
|
|
346295
|
+
line: 466,
|
|
346286
346296
|
column: 29
|
|
346287
346297
|
},
|
|
346288
346298
|
end: {
|
|
346289
|
-
line:
|
|
346299
|
+
line: 466,
|
|
346290
346300
|
column: 67
|
|
346291
346301
|
}
|
|
346292
346302
|
}],
|
|
346293
|
-
line:
|
|
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: "
|
|
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[
|
|
347248
|
-
ProjectMatrixvue_type_script_lang_js_cov_geimehe8j.s[
|
|
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[
|
|
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[
|
|
347262
|
-
ProjectMatrixvue_type_script_lang_js_cov_geimehe8j.s[
|
|
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[
|
|
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[
|
|
347271
|
-
var predominantStatus = (ProjectMatrixvue_type_script_lang_js_cov_geimehe8j.s[
|
|
347272
|
-
ProjectMatrixvue_type_script_lang_js_cov_geimehe8j.s[
|
|
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[
|
|
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[
|
|
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[
|
|
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[
|
|
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[
|
|
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[
|
|
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[
|
|
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[
|
|
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[
|
|
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[
|
|
347335
|
-
ProjectMatrixvue_type_script_lang_js_cov_geimehe8j.s[
|
|
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[
|
|
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=
|
|
347349
|
-
var
|
|
347350
|
-
;// CONCATENATED MODULE: ./src/components/projects/ProjectMatrix.vue?vue&type=style&index=0&id=
|
|
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
|
-
|
|
347364
|
-
|
|
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
|
-
"
|
|
347386
|
+
"28c10d94",
|
|
347368
347387
|
null
|
|
347369
347388
|
|
|
347370
347389
|
)
|