|
59 | 59 | </template> |
60 | 60 |
|
61 | 61 | <!-- data columns --> |
62 | | - <template #item.signal1.analysis.study.uuid="{item}"><StudyLabel :study="item.signal1.analysis.study.uuid" abbrev/></template> |
63 | | - <template #item.signal1.analysis.trait.uuid="{item}"><TraitLabel :trait="item.signal1.analysis.trait" :key="item.signal1.analysis.trait"/></template> |
64 | | - <template #item.signal1.analysis.analysis_type="{item}">{{ item.signal1.analysis.analysis_type }}</template> |
65 | | - <template #item.signal2.analysis.study.uuid="{item}"><StudyLabel :study="item.signal2.analysis.study.uuid" abbrev/></template> |
66 | | - <template #item.signal2.analysis.trait.uuid="{item}"><TraitLabel :trait="item.signal2.analysis.trait" :key="item.signal2.analysis.trait"/></template> |
67 | | - <template #item.signal2.analysis.trait.biomarker_type="{item}">{{ item.signal2.analysis.trait.biomarker_type.replace("-expression", "") }}</template> |
68 | | - <template #item.signal2.analysis.trait.gene.ens_id="{item}"><EnsgLabel :trait="item.signal2.analysis.trait" /></template> |
69 | | - <template #item.signal2.analysis.tissue="{item}">{{ item.signal2.analysis.tissue }}</template> |
70 | | - <template #item.signal1.lead_variant.vid="{item}"><VariantLabel :variant="item.signal1.lead_variant.vid" :showSplotch="true" /></template> |
71 | | - <template #item.signal2.lead_variant.vid="{item}"><VariantLabel :variant="item.signal2.lead_variant.vid" :showSplotch="true" /></template> |
72 | | - <template #item.signal1.neg_log_p="{item}">{{ (+item.signal1.neg_log_p).toFixed(2) }}</template> |
73 | | - <template #item.signal2.neg_log_p="{item}">{{ (+item.signal2.neg_log_p).toFixed(2) }}</template> |
74 | | - <template #item.coloc_h3="{item}">{{ item.coloc_h3.toFixed(2) }}</template> |
75 | | - <template #item.coloc_h4="{item}">{{ item.coloc_h4.toFixed(2) }}</template> |
76 | | - <template #item.r2="{item}">{{ item.r2.toFixed(2) }}</template> |
| 62 | + <template #item.signal1.analysis.study.uuid="{item}"><StudyLabel :study="item.signal1?.analysis?.study?.uuid ?? ''" abbrev/></template> |
| 63 | + <template #item.signal1.analysis.trait.uuid="{item}"><TraitLabel :trait="item.signal1?.analysis?.trait"/></template> |
| 64 | + <template #item.signal1.analysis.analysis_type="{item}"> |
| 65 | + {{ item.signal1?.analysis?.analysis_type ?? '' }} |
| 66 | + <div v-if="item.signal1?.analysis?.trait?.biomarker_type && item.signal1?.analysis?.trait?.biomarker_type !== 'phenotype'"> |
| 67 | + <span>({{ item.signal1?.analysis?.trait?.biomarker_type.replace("-expression", "") }})</span> |
| 68 | + </div> |
| 69 | + </template> |
| 70 | + <template #item.signal1.analysis.trait.gene.ens_id="{item}"><EnsgLabel :trait="item.signal1?.analysis?.trait ?? ''" /></template> |
| 71 | + <template #item.signal1.analysis.tissue="{item}">{{ item.signal1?.analysis?.tissue ?? '' }}</template> |
| 72 | + <template #item.signal2.analysis.study.uuid="{item}"><StudyLabel :study="item.signal2?.analysis?.study?.uuid ?? ''" abbrev/></template> |
| 73 | + <template #item.signal2.analysis.trait.uuid="{item}"><TraitLabel :trait="item.signal2?.analysis?.trait"/></template> |
| 74 | + <template #item.signal2.analysis.analysis_type="{item}"> |
| 75 | + {{ item.signal2?.analysis?.analysis_type ?? '' }} |
| 76 | + <div v-if="item.signal2?.analysis?.trait?.biomarker_type && item.signal2?.analysis?.trait?.biomarker_type !== 'phenotype'"> |
| 77 | + <span>({{ item.signal2?.analysis?.trait?.biomarker_type.replace("-expression", "") }})</span> |
| 78 | + </div> |
| 79 | + </template> |
| 80 | + <template #item.signal2.analysis.trait.gene.ens_id="{item}"><EnsgLabel :trait="item.signal2?.analysis?.trait ?? ''" /></template> |
| 81 | + <template #item.signal2.analysis.tissue="{item}">{{ item.signal2?.analysis?.tissue ?? '' }}</template> |
| 82 | + <template #item.signal1.lead_variant.vid="{item}"><VariantLabel :variant="item.signal1?.lead_variant?.vid ?? ''" :showSplotch="true" /></template> |
| 83 | + <template #item.signal2.lead_variant.vid="{item}"><VariantLabel :variant="item.signal2?.lead_variant?.vid ?? ''" :showSplotch="true" /></template> |
| 84 | + <template #item.signal1.neg_log_p="{item}">{{ safeToFixed(item.signal1?.neg_log_p, 2) }}</template> |
| 85 | + <template #item.signal2.neg_log_p="{item}">{{ safeToFixed(item.signal2?.neg_log_p, 2) }}</template> |
| 86 | + <template #item.coloc_h3="{item}">{{ safeToFixed(item.coloc_h3, 2) }}</template> |
| 87 | + <template #item.coloc_h4="{item}">{{ safeToFixed(item.coloc_h4, 2) }}</template> |
| 88 | + <template #item.r2="{item}">{{ safeToFixed(item.r2, 2) }}</template> |
77 | 89 | <template #item.n_coloc_between_traits="{item}">{{ item.n_coloc_between_traits }}</template> |
78 | 90 | <template #item.cross_signal.effect="{item}"><ConcordanceLabel :item="item"/></template> |
79 | | - <template #item.signal1.effect_marg="{item}">{{ item.signal1.effect_marg.toFixed(2) }}</template> |
80 | | - <template #item.signal2.effect_marg="{item}">{{ item.signal2.effect_marg.toFixed(2) }}</template> |
81 | | - <template #item.signal1.effect_cond="{item}">{{ item.signal1.effect_cond.toFixed(2) }}</template> |
82 | | - <template #item.signal2.effect_cond="{item}">{{ item.signal2.effect_cond.toFixed(2) }}</template> |
| 91 | + <template #item.signal1.effect_marg="{item}">{{ safeToFixed(item.signal1.effect_marg, 2) }}</template> |
| 92 | + <template #item.signal2.effect_marg="{item}">{{ safeToFixed(item.signal2.effect_marg, 2) }}</template> |
| 93 | + <template #item.signal1.effect_cond="{item}">{{ safeToFixed(item.signal1.effect_cond, 2) }}</template> |
| 94 | + <template #item.signal2.effect_cond="{item}">{{ safeToFixed(item.signal2.effect_cond, 2) }}</template> |
83 | 95 | <template #item.marg_cond_flip="{item}">{{ +item.marg_cond_flip }}</template> |
84 | 96 |
|
85 | 97 | <template #footer.prepend> |
@@ -215,6 +227,12 @@ const onTogglePlot = async (colocID, signal, slot) => { |
215 | 227 | // *** Utility functions ******************************************************* |
216 | 228 | const clearExpandedRow = () => appStore.dataTable.expandedRow.length = 0 |
217 | 229 |
|
| 230 | +const safeToFixed = (val, digits) => { |
| 231 | + val = parseFloat(val) |
| 232 | + if (val == null || Number.isNaN(val)) return '' |
| 233 | + return (val).toFixed(digits) |
| 234 | +} |
| 235 | +
|
218 | 236 | // this works by scheduling a timeout for *after* the current event loop tick |
219 | 237 | const loadDataDebounced = async () => { |
220 | 238 | clearTimeout(debounceTimer) // cancel pending call, if any |
|
0 commit comments